diff --git a/extensions/voice-call/index.test.ts b/extensions/voice-call/index.test.ts index fc80b581364..cd17af27fc1 100644 --- a/extensions/voice-call/index.test.ts +++ b/extensions/voice-call/index.test.ts @@ -178,6 +178,32 @@ describe("voice-call plugin", () => { expect(respond).toHaveBeenCalledWith(true, { callId: "call-1", initiated: true }); }); + it("does not block service startup while runtime exposure initializes", async () => { + let resolveRuntime: ((runtime: VoiceCallRuntime) => void) | undefined; + vi.mocked(createVoiceCallRuntime).mockReturnValueOnce( + new Promise((resolve) => { + resolveRuntime = resolve; + }), + ); + const { service, methods } = setup({ provider: "mock" }); + + expect(service).toBeDefined(); + expect(service!.start(createServiceContext())).toBeUndefined(); + expect(createVoiceCallRuntime).toHaveBeenCalledTimes(1); + + resolveRuntime?.(runtimeStub); + const handler = methods.get("voicecall.initiate") as + | ((ctx: { + params: Record; + respond: ReturnType; + }) => Promise) + | undefined; + const respond = vi.fn(); + await handler?.({ params: { message: "Hi" }, respond }); + + expect(respond).toHaveBeenCalledWith(true, { callId: "call-1", initiated: true }); + }); + it("creates a fresh shared runtime after service stop", async () => { const first = setup({ provider: "mock" }); await first.service?.start(createServiceContext()); diff --git a/extensions/voice-call/index.ts b/extensions/voice-call/index.ts index 120310a8af9..025fc0083e3 100644 --- a/extensions/voice-call/index.ts +++ b/extensions/voice-call/index.ts @@ -607,7 +607,7 @@ export default definePluginEntry({ api.registerService({ id: "voicecall", - start: async () => { + start: () => { if (!config.enabled) { return; } @@ -617,11 +617,9 @@ export default definePluginEntry({ ); return; } - try { - await ensureRuntime(); - } catch (err) { + void ensureRuntime().catch((err) => { api.logger.error(`[voice-call] Failed to start runtime: ${formatErrorMessage(err)}`); - } + }); }, stop: async () => { if (runtimeState[VOICE_CALL_RUNTIME_STOP_PROMISE_KEY]) {