


















@@ -68,32 +68,48 @@ describe("TwilioStreamFrameAdapter", () => {
6868});
69697070describe("TelnyxStreamFrameAdapter", () => {
71-it("parses Telnyx start, media, mark, stop with no streamSid", () => {
71+it("parses Telnyx start with top-level stream_id and start.call_control_id", () => {
7272const adapter = new TelnyxStreamFrameAdapter("call-control-id-123");
737374-expect(adapter.parseInbound(JSON.stringify({ event: "start", start: {} }))).toEqual({
75-kind: "start",
76-streamId: "call-control-id-123",
77-providerCallId: "call-control-id-123",
78-});
79-74+// Telnyx start frame: stream_id is top-level, call_control_id lives in start.
8075expect(
8176adapter.parseInbound(
8277JSON.stringify({
8378event: "start",
84-start: { stream_id: "telnyx-stream-7" },
79+sequence_number: "1",
80+stream_id: "telnyx-stream-7",
81+start: {
82+call_control_id: "v3:carrier-call-id",
83+call_session_id: "session-1",
84+media_format: { encoding: "PCMU", sample_rate: 8000, channels: 1 },
85+},
8586}),
8687),
8788).toEqual({
8889kind: "start",
8990streamId: "telnyx-stream-7",
91+providerCallId: "v3:carrier-call-id",
92+});
93+});
94+95+it("falls back to the constructor providerCallId when start fields are absent", () => {
96+const adapter = new TelnyxStreamFrameAdapter("call-control-id-123");
97+98+expect(adapter.parseInbound(JSON.stringify({ event: "start", start: {} }))).toEqual({
99+kind: "start",
100+streamId: "call-control-id-123",
90101providerCallId: "call-control-id-123",
91102});
103+});
104+105+it("parses media, mark, and stop with no streamSid", () => {
106+const adapter = new TelnyxStreamFrameAdapter("call-control-id-123");
9210793108expect(
94109adapter.parseInbound(
95110JSON.stringify({
96111event: "media",
112+stream_id: "telnyx-stream-7",
97113media: { payload: "AAA=", timestamp: 40, track: "inbound_track" },
98114}),
99115),
@@ -111,6 +127,29 @@ describe("TelnyxStreamFrameAdapter", () => {
111127expect(adapter.parseInbound(JSON.stringify({ event: "stop" }))).toEqual({ kind: "stop" });
112128});
113129130+it("surfaces Telnyx WS error frames so failures don't get swallowed", () => {
131+const adapter = new TelnyxStreamFrameAdapter("call-control-id-123");
132+133+expect(
134+adapter.parseInbound(
135+JSON.stringify({
136+event: "error",
137+stream_id: "telnyx-stream-7",
138+payload: {
139+code: 100002,
140+title: "WebSocket error",
141+detail: "Unable to decode payload",
142+},
143+}),
144+),
145+).toEqual({
146+kind: "error",
147+code: "100002",
148+title: "WebSocket error",
149+detail: "Unable to decode payload",
150+});
151+});
152+114153it("serializes outbound frames without streamSid", () => {
115154const adapter = new TelnyxStreamFrameAdapter("call-control-id-123");
116155此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。