Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7082f16

Browse files
committed
temporal functions
Former-commit-id: c759b87 Former-commit-id: 9db1b23db97b33258667eb56dd1b79352a4e2a9b
1 parent e33d0de commit 7082f16

File tree

8 files changed

+78
-21
lines changed

8 files changed

+78
-21
lines changed

examples/twilio/src/functions/openai/answer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ export async function questionAnswer({
3636
runId,
3737
updateName: answerEvent.name,
3838
input: {
39+
streamSid,
40+
trackName: "agent",
3941
gptReply,
4042
interactionCount,
41-
trackName: "agent",
4243
},
4344
});
4445
log.info(`Interaction ${interactionCount}: OpenAI:`, event);

examples/twilio/src/pods.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
transcribe,
66
textToAudio,
77
} from "./functions";
8-
import { websocket, streamQuestion, sendAudio } from "./streams";
8+
import { websocket, streamQuestion, sendAudio, sendEvent } from "./streams";
99

1010
async function main() {
1111
const workflowsPath = require.resolve("./workflows");
@@ -27,7 +27,7 @@ async function main() {
2727
restack.pod({
2828
name: "websocket",
2929
workflowsPath,
30-
functions: { websocket, sendAudio },
30+
functions: { websocket, sendAudio, sendEvent },
3131
}),
3232
restack.pod({
3333
name: "openai",

examples/twilio/src/server.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,18 @@ const wss = new WebSocketServer({ server });
1313
const PORT = process.env.PORT || 4000;
1414
export const websocketAddress = `wss://${process.env.SERVER}/connection`;
1515

16-
app.use(cors());
16+
app.use(
17+
cors({
18+
origin: "*",
19+
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
20+
allowedHeaders: [
21+
"Content-Type",
22+
"Authorization",
23+
"X-Requested-With",
24+
"Accept",
25+
],
26+
})
27+
);
1728
app.use(express.json());
1829

1930
app.post("/start", async (req, res) => {
@@ -117,9 +128,6 @@ wss.on("connection", (ws) => {
117128

118129
if (message.event === "stop") {
119130
console.log(`Twilio -> Media stream ${streamSid} ended.`);
120-
if (runId) {
121-
restack.update({ workflowId, runId, updateName: "streamEnd" });
122-
}
123131
}
124132
});
125133
});

examples/twilio/src/streams/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * from "../functions/deepgram/textToAudio";
33
export * from "../functions/openai/answer";
44
export * from "./websocket";
55
export * from "./sendAudio";
6+
export * from "./sendEvent";

examples/twilio/src/streams/sendAudio.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ export async function sendAudio({
2222
};
2323
ws.send(JSON.stringify(audioEvent));
2424
ws.close();
25+
return true;
2526
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { webSocketConnect } from "./connect";
2+
3+
export async function sendEvent({
4+
streamSid,
5+
eventName,
6+
data,
7+
}: {
8+
streamSid: string;
9+
eventName: string;
10+
data: { text?: string };
11+
}) {
12+
const ws = await webSocketConnect();
13+
14+
const audioEvent = {
15+
streamSid: streamSid,
16+
event: eventName,
17+
data: data,
18+
};
19+
20+
ws.send(JSON.stringify(audioEvent));
21+
ws.close();
22+
return true;
23+
}

examples/twilio/src/streams/websocket.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
log,
55
} from "@restackio/restack-sdk-ts/function";
66
import { webSocketConnect } from "./connect";
7-
import { audioInEvent, TrackName } from "../workflows/twilioStream";
7+
import { audioInEvent, streamEnd, TrackName } from "../workflows/twilioStream";
88
import Restack from "@restackio/restack-sdk-ts";
99

1010
type StreamInput = {
@@ -13,16 +13,15 @@ type StreamInput = {
1313
};
1414

1515
export async function websocket({ streamSid }: StreamInput) {
16-
return new Promise<void>(async (resolve, reject) => {
16+
return new Promise<void>(async (resolve) => {
1717
const ws = await webSocketConnect();
18-
18+
const restack = new Restack();
19+
const { workflowId, runId } = currentWorkflow().workflowExecution;
1920
ws.on("message", (data) => {
2021
const message = JSON.parse(data.toString());
21-
if (message.event === "media") {
22-
if (message.streamSid === streamSid) {
22+
if (message.streamSid === streamSid) {
23+
if (message.event === "media") {
2324
if (message.media.track === "inbound") {
24-
const restack = new Restack();
25-
const { workflowId, runId } = currentWorkflow().workflowExecution;
2625
log.info("send payload", {
2726
streamSid,
2827
payload: message.media.payload.length,
@@ -40,14 +39,11 @@ export async function websocket({ streamSid }: StreamInput) {
4039
}
4140
}
4241
}
43-
if (message.streamSid === streamSid) heartbeat(message.streamSid);
42+
heartbeat(message.streamSid);
4443
if (message.event === "stop") {
44+
restack.update({ workflowId, runId, updateName: streamEnd.name });
4545
resolve();
4646
}
4747
});
48-
49-
ws.on("close", () => {
50-
resolve();
51-
});
5248
});
5349
}

examples/twilio/src/workflows/twilioStream.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const questionEvent = defineUpdate<Question>("question");
4343

4444
export const answerEvent = defineUpdate<Answer>("answer");
4545

46-
const streamEnd = defineUpdate("streamEnd");
46+
export const streamEnd = defineUpdate("streamEnd");
4747

4848
export async function twilioStreamWorkflow() {
4949
let currentstreamSid: string;
@@ -76,9 +76,18 @@ export async function twilioStreamWorkflow() {
7676

7777
await step<typeof streams>({
7878
podName: `websocket`,
79-
scheduleToCloseTimeout: "2 minutes",
79+
scheduleToCloseTimeout: "1 minute",
8080
}).sendAudio({ streamSid, trackName: "agent", audio });
8181

82+
await step<typeof streams>({
83+
podName: `websocket`,
84+
scheduleToCloseTimeout: "2 minutes",
85+
}).sendEvent({
86+
streamSid,
87+
eventName: answerEvent.name,
88+
data: { text: welcomeMessage.partialResponse },
89+
});
90+
8291
currentstreamSid = streamSid;
8392
return { streamSid };
8493
});
@@ -92,6 +101,15 @@ export async function twilioStreamWorkflow() {
92101

93102
interactionCount += 1;
94103

104+
await step<typeof streams>({
105+
podName: `websocket`,
106+
scheduleToCloseTimeout: "1 minute",
107+
}).sendEvent({
108+
streamSid,
109+
eventName: questionEvent.name,
110+
data: { text: finalResult },
111+
});
112+
95113
await step<typeof functions>({
96114
podName: `openai`,
97115
scheduleToCloseTimeout: "2 minutes",
@@ -109,6 +127,15 @@ export async function twilioStreamWorkflow() {
109127
scheduleToCloseTimeout: "2 minutes",
110128
}).textToAudio({ streamSid, trackName, gptReply, interactionCount });
111129

130+
await step<typeof streams>({
131+
podName: `websocket`,
132+
scheduleToCloseTimeout: "1 minute",
133+
}).sendEvent({
134+
streamSid,
135+
eventName: answerEvent.name,
136+
data: { text: gptReply.partialResponse },
137+
});
138+
112139
log.info("audio", { audio: audio?.length });
113140

114141
if (audio) {

0 commit comments

Comments
 (0)