


























@@ -11,6 +11,58 @@ import {
11111212type BroadcastEvent = { event: string; payload: unknown; connIds: string[] };
131314+function createSttSessionMock(connect: () => Promise<void> = async () => {}) {
15+return {
16+connect: vi.fn(connect),
17+sendAudio: vi.fn(),
18+close: vi.fn(),
19+isConnected: vi.fn(() => true),
20+};
21+}
22+23+function createTranscriptionProvider(
24+sttSession: ReturnType<typeof createSttSessionMock>,
25+onRequest?: (req: RealtimeTranscriptionSessionCreateRequest) => void,
26+): RealtimeTranscriptionProviderPlugin {
27+return {
28+id: "stt-test",
29+label: "STT Test",
30+isConfigured: () => true,
31+createSession: vi.fn((req) => {
32+onRequest?.(req);
33+return sttSession;
34+}),
35+};
36+}
37+38+function createBroadcastContext() {
39+const events: BroadcastEvent[] = [];
40+const context = {
41+getRuntimeConfig: () => ({}),
42+broadcastToConnIds: (event: string, payload: unknown, connIds: ReadonlySet<string>) => {
43+events.push({ event, payload, connIds: [...connIds] });
44+},
45+} as never;
46+return { context, events };
47+}
48+49+async function createStartedRelaySession(
50+sttSession: ReturnType<typeof createSttSessionMock>,
51+providerConfig: Record<string, unknown>,
52+onRequest?: (req: RealtimeTranscriptionSessionCreateRequest) => void,
53+) {
54+const provider = createTranscriptionProvider(sttSession, onRequest);
55+const { context, events } = createBroadcastContext();
56+const session = createTalkTranscriptionRelaySession({
57+ context,
58+connId: "conn-1",
59+ provider,
60+ providerConfig,
61+});
62+await Promise.resolve();
63+return { provider, events, session };
64+}
65+1466function isRecord(value: unknown): value is Record<string, unknown> {
1567return typeof value === "object" && value !== null && !Array.isArray(value);
1668}
@@ -73,40 +125,14 @@ describe("talk transcription gateway relay", () => {
7312574126it("bridges browser audio into a transcription-only Talk event stream", async () => {
75127let sttRequest: RealtimeTranscriptionSessionCreateRequest | undefined;
76-const sttSession = {
77-connect: vi.fn(async () => {
78-sttRequest?.onSpeechStart?.();
79-sttRequest?.onPartial?.("hel");
80-sttRequest?.onTranscript?.("hello world");
81-}),
82-sendAudio: vi.fn(),
83-close: vi.fn(),
84-isConnected: vi.fn(() => true),
85-};
86-const provider: RealtimeTranscriptionProviderPlugin = {
87-id: "stt-test",
88-label: "STT Test",
89-isConfigured: () => true,
90-createSession: (req) => {
91-sttRequest = req;
92-return sttSession;
93-},
94-};
95-const events: Array<{ event: string; payload: unknown; connIds: string[] }> = [];
96-const context = {
97-getRuntimeConfig: () => ({}),
98-broadcastToConnIds: (event: string, payload: unknown, connIds: ReadonlySet<string>) => {
99-events.push({ event, payload, connIds: [...connIds] });
100-},
101-} as never;
102-103-const session = createTalkTranscriptionRelaySession({
104- context,
105-connId: "conn-1",
106- provider,
107-providerConfig: { model: "stt-model" },
128+const sttSession = createSttSessionMock(async () => {
129+sttRequest?.onSpeechStart?.();
130+sttRequest?.onPartial?.("hel");
131+sttRequest?.onTranscript?.("hello world");
132+});
133+const { events, session } = await createStartedRelaySession(sttSession, { model: "stt-model" }, (req) => {
134+sttRequest = req;
108135});
109-await Promise.resolve();
110136111137expectRecordFields(session, "session", {
112138provider: "stt-test",
@@ -202,22 +228,8 @@ describe("talk transcription gateway relay", () => {
202228});
203229204230it("rejects provider configs that do not match relay audio input", () => {
205-const sttSession = {
206-connect: vi.fn(async () => {}),
207-sendAudio: vi.fn(),
208-close: vi.fn(),
209-isConnected: vi.fn(() => true),
210-};
211-const provider: RealtimeTranscriptionProviderPlugin = {
212-id: "stt-test",
213-label: "STT Test",
214-isConfigured: () => true,
215-createSession: vi.fn(() => sttSession),
216-};
217-const context = {
218-getRuntimeConfig: () => ({}),
219-broadcastToConnIds: vi.fn(),
220-} as never;
231+const provider = createTranscriptionProvider(createSttSessionMock());
232+const { context } = createBroadcastContext();
221233222234expect(() =>
223235createTalkTranscriptionRelaySession({
@@ -233,22 +245,8 @@ describe("talk transcription gateway relay", () => {
233245it("rejects session creation when transcription expiry would exceed Date range", () => {
234246vi.useFakeTimers();
235247vi.setSystemTime(new Date(8_640_000_000_000_000));
236-const sttSession = {
237-connect: vi.fn(async () => {}),
238-sendAudio: vi.fn(),
239-close: vi.fn(),
240-isConnected: vi.fn(() => true),
241-};
242-const provider: RealtimeTranscriptionProviderPlugin = {
243-id: "stt-test",
244-label: "STT Test",
245-isConfigured: () => true,
246-createSession: vi.fn(() => sttSession),
247-};
248-const context = {
249-getRuntimeConfig: () => ({}),
250-broadcastToConnIds: vi.fn(),
251-} as never;
248+const provider = createTranscriptionProvider(createSttSessionMock());
249+const { context } = createBroadcastContext();
252250253251expect(() =>
254252createTalkTranscriptionRelaySession({
@@ -263,38 +261,12 @@ describe("talk transcription gateway relay", () => {
263261264262it("cancels an active transcription turn and closes the provider session", async () => {
265263let sttRequest: RealtimeTranscriptionSessionCreateRequest | undefined;
266-const sttSession = {
267-connect: vi.fn(async () => {
268-sttRequest?.onSpeechStart?.();
269-}),
270-sendAudio: vi.fn(),
271-close: vi.fn(),
272-isConnected: vi.fn(() => true),
273-};
274-const provider: RealtimeTranscriptionProviderPlugin = {
275-id: "stt-test",
276-label: "STT Test",
277-isConfigured: () => true,
278-createSession: (req) => {
279-sttRequest = req;
280-return sttSession;
281-},
282-};
283-const events: Array<{ event: string; payload: unknown; connIds: string[] }> = [];
284-const context = {
285-getRuntimeConfig: () => ({}),
286-broadcastToConnIds: (event: string, payload: unknown, connIds: ReadonlySet<string>) => {
287-events.push({ event, payload, connIds: [...connIds] });
288-},
289-} as never;
290-291-const session = createTalkTranscriptionRelaySession({
292- context,
293-connId: "conn-1",
294- provider,
295-providerConfig: {},
264+const sttSession = createSttSessionMock(async () => {
265+sttRequest?.onSpeechStart?.();
266+});
267+const { events, session } = await createStartedRelaySession(sttSession, {}, (req) => {
268+sttRequest = req;
296269});
297-await Promise.resolve();
298270299271cancelTalkTranscriptionRelayTurn({
300272transcriptionSessionId: session.transcriptionSessionId,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。