@voicethere/client 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.0 — 2026-06-17
4
+
5
+ ### Added
6
+
7
+ - `@voicethere/client/node` — headless E2E runtime (`createNodeWebRtcRuntime`) using `ws` + `@node-webrtc-rust/sdk`
8
+ - Injectable `WebRtcRuntime` on `connectBrowserVoiceSession` for Node test harnesses
9
+ - `waitForConnected`, `onControlMessage` on browser voice sessions
10
+
11
+ ## 0.4.0 — 2026-06-16
12
+
13
+ ### Added
14
+
15
+ - `BrowserVoiceSession.sendBinary` / `sendSyncBinary` — send `ArrayBuffer`/`Uint8Array` on control or sync data channels.
16
+ - `onBinaryMessage` callback for inbound binary frames.
17
+ - Export `VOICE_SYNC_CHANNEL_LABEL` (matches helpers / agent sync channel).
18
+
3
19
  ## 0.3.0 — 2026-06-15
4
20
 
5
21
  ### Added
package/README.md CHANGED
@@ -6,8 +6,8 @@ Browser and Node client for VoiceThere voice sessions.
6
6
 
7
7
  | Mode | When | Signaling URL |
8
8
  |------|------|---------------|
9
- | **local** | M1 dev — runner on localhost | `ws://127.0.0.1:8080/ws` |
10
- | **cloud** | M4 platform session mint | `wss://signaling…/ws?token=<joinToken>` |
9
+ | **local** | Local dev — agent runner on localhost | `ws://127.0.0.1:8080/ws` |
10
+ | **cloud** | Hosted VoiceThere sessions | `wss://signaling…/ws?token=<joinToken>` |
11
11
 
12
12
  Wire protocol: [`@node-webrtc-rust/signaling`](https://www.npmjs.com/package/@node-webrtc-rust/signaling).
13
13
 
@@ -25,12 +25,12 @@ const client = await connectVoiceSession({
25
25
  client.on("peer-joined", (peerId) => console.log("peer", peerId));
26
26
  ```
27
27
 
28
- ## Cloud (platform + gateway)
28
+ ## Cloud (hosted VoiceThere)
29
29
 
30
30
  ```typescript
31
31
  // Use a **client** API key (prefix vthc_) — safe to embed in web/mobile apps.
32
32
  // Create one in the dashboard (/api-keys) or: voicethere api-keys create --kind client --project-id <uuid> --name "Web app"
33
- const res = await fetch("https://app.voicethere.dev/api/v1/sessions", {
33
+ const res = await fetch("https://sessions.voicethere.dev/v1/sessions", {
34
34
  method: "POST",
35
35
  headers: {
36
36
  Authorization: "Bearer vthc_…",
@@ -55,7 +55,7 @@ const client = await connectVoiceSession({
55
55
 
56
56
  ## Local stack verify
57
57
 
58
- From workspace root (after M4 smoke infra is up):
58
+ With the VoiceThere API and session stack running locally:
59
59
 
60
60
  ```bash
61
61
  cd client && npm run demo:cloud
@@ -14,10 +14,12 @@ export type BrowserSession = BrowserVoiceSession & {
14
14
  };
15
15
  export declare function connectBrowserSession(options: ConnectBrowserSessionOptions): Promise<BrowserSession>;
16
16
  export { connectBrowserChatSession } from "./browser-chat-session.js";
17
- export { connectBrowserVoiceSession } from "./browser-voice-session.js";
17
+ export { connectBrowserVoiceSession, VOICE_SYNC_CHANNEL_LABEL, VOICE_CONTROL_CHANNEL_LABEL, type BinaryMessageHandler, type DataChannelKind, type BrowserVoiceSession, type BrowserVoiceSessionOptions, } from "./browser-voice-session.js";
18
18
  export { startSession } from "./session-provision.js";
19
19
  export { attachAudioVisualizer } from "./audio-visualizer.js";
20
20
  export { createDebugConsole } from "./debug-console.js";
21
21
  export type { SessionCredentials, SessionStatusResponse, StartSessionOptions, StartSessionResult, } from "./session-provision.js";
22
22
  export type { DebugConsole, DebugEvent } from "./debug-console.js";
23
+ export type { WebRtcRuntime } from "./webrtc-runtime.js";
24
+ export { getDefaultBrowserRuntime } from "./webrtc-runtime.js";
23
25
  //# sourceMappingURL=browser-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,IAAI,EAAE,kBAAkB,CAAC;CAC1B,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,cAAc,CAAC,CAWzB;AAED,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,IAAI,EAAE,kBAAkB,CAAC;CAC1B,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,cAAc,CAAC,CAWzB;AAED,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,GAChC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -11,8 +11,9 @@ export async function connectBrowserSession(options) {
11
11
  return { ...session, mode: options.mode };
12
12
  }
13
13
  export { connectBrowserChatSession } from "./browser-chat-session.js";
14
- export { connectBrowserVoiceSession } from "./browser-voice-session.js";
14
+ export { connectBrowserVoiceSession, VOICE_SYNC_CHANNEL_LABEL, VOICE_CONTROL_CHANNEL_LABEL, } from "./browser-voice-session.js";
15
15
  export { startSession } from "./session-provision.js";
16
16
  export { attachAudioVisualizer } from "./audio-visualizer.js";
17
17
  export { createDebugConsole } from "./debug-console.js";
18
+ export { getDefaultBrowserRuntime } from "./webrtc-runtime.js";
18
19
  //# sourceMappingURL=browser-session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,0BAA0B,GAE3B,MAAM,4BAA4B,CAAC;AAgBpC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAqC;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,0BAA0B,CAAC;QAC/C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU;QACV,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,0BAA0B,GAE3B,MAAM,4BAA4B,CAAC;AAgBpC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAqC;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,0BAA0B,CAAC;QAC/C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU;QACV,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,GAK5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAWxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,20 +1,40 @@
1
1
  import type { SessionCredentials } from "./session-provision.js";
2
2
  import type { DebugConsole } from "./debug-console.js";
3
+ import { type WebRtcRuntime } from "./webrtc-runtime.js";
3
4
  export declare const VOICE_AGENT_SERVER_PEER_ID = "voice-agent-server";
4
5
  export declare const VOICE_CONTROL_CHANNEL_LABEL = "voice-control";
6
+ /** High-frequency binary sync channel (matches `@node-webrtc-rust/sdk/voice`). */
7
+ export declare const VOICE_SYNC_CHANNEL_LABEL = "voicethere-sync";
8
+ export type DataChannelKind = "control" | "sync";
9
+ export type BinaryMessageHandler = (data: ArrayBuffer, channel: DataChannelKind) => void;
5
10
  export type BrowserVoiceSessionOptions = {
6
11
  credentials: SessionCredentials;
7
12
  peerId?: string;
8
13
  requestMic?: boolean;
9
14
  audioElement?: HTMLAudioElement;
10
15
  onDebugEvent?: DebugConsole;
16
+ /** Injectable WebRTC runtime (default: browser globals). */
17
+ runtime?: WebRtcRuntime;
18
+ /** Fired for JSON messages on voice-control (e.g. speech_event). */
19
+ onControlMessage?: (payload: Record<string, unknown>) => void;
20
+ /** Fired for binary frames on voice-control or voicethere-sync. */
21
+ onBinaryMessage?: BinaryMessageHandler;
11
22
  };
12
23
  export type BrowserVoiceSession = {
13
24
  peerId: string;
14
25
  disconnect: () => void;
15
26
  sendSpeak: (text: string) => void;
16
27
  sendChat: (text: string) => void;
28
+ /** JSON on voice-control (same as sendChat for `{ type: 'chat' }`). */
29
+ sendToAgent: (payload: Record<string, unknown>) => void;
30
+ /** Binary on voice-control data channel. */
31
+ sendBinary: (data: ArrayBuffer | Uint8Array) => void;
32
+ /** Binary on voicethere-sync data channel (throws if channel not open). */
33
+ sendSyncBinary: (data: ArrayBuffer | Uint8Array) => void;
17
34
  getMicStream: () => MediaStream | null;
35
+ /** Resolves when peer connection reaches `connected` (or rejects on timeout/failure). */
36
+ waitForConnected: (timeoutMs?: number) => Promise<void>;
37
+ getConnectionState: () => RTCPeerConnectionState | "new";
18
38
  };
19
39
  export declare function connectBrowserVoiceSession(options: BrowserVoiceSessionOptions): Promise<BrowserVoiceSession>;
20
40
  //# sourceMappingURL=browser-voice-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-voice-session.d.ts","sourceRoot":"","sources":["../../src/browser/browser-voice-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,0BAA0B,uBAAuB,CAAC;AAC/D,eAAO,MAAM,2BAA2B,kBAAkB,CAAC;AAE3D,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;CACxC,CAAC;AAMF,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAkM9B"}
1
+ {"version":3,"file":"browser-voice-session.d.ts","sourceRoot":"","sources":["../../src/browser/browser-voice-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,0BAA0B,uBAAuB,CAAC;AAC/D,eAAO,MAAM,2BAA2B,kBAAkB,CAAC;AAC3D,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjD,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,eAAe,KACrB,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,mEAAmE;IACnE,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,uEAAuE;IACvE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACxD,4CAA4C;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,KAAK,IAAI,CAAC;IACrD,2EAA2E;IAC3E,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,KAAK,IAAI,CAAC;IACzD,YAAY,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACvC,yFAAyF;IACzF,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,kBAAkB,EAAE,MAAM,sBAAsB,GAAG,KAAK,CAAC;CAC1D,CAAC;AAcF,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAiU9B"}
@@ -1,11 +1,20 @@
1
1
  import { appendJoinToken } from "../resolve-connection.js";
2
+ import { getDefaultBrowserRuntime, } from "./webrtc-runtime.js";
2
3
  export const VOICE_AGENT_SERVER_PEER_ID = "voice-agent-server";
3
4
  export const VOICE_CONTROL_CHANNEL_LABEL = "voice-control";
5
+ /** High-frequency binary sync channel (matches `@node-webrtc-rust/sdk/voice`). */
6
+ export const VOICE_SYNC_CHANNEL_LABEL = "voicethere-sync";
4
7
  function defaultPeerId() {
5
8
  return `client-${Math.random().toString(36).slice(2, 10)}`;
6
9
  }
10
+ function toArrayBuffer(data) {
11
+ if (data instanceof ArrayBuffer)
12
+ return data;
13
+ return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
14
+ }
7
15
  export async function connectBrowserVoiceSession(options) {
8
16
  const debug = options.onDebugEvent;
17
+ const runtime = options.runtime ?? getDefaultBrowserRuntime();
9
18
  const peerId = options.peerId ?? defaultPeerId();
10
19
  const roomId = options.credentials.room_id;
11
20
  const signalingUrl = appendJoinToken(options.credentials.signaling_url, options.credentials.join_token);
@@ -15,24 +24,82 @@ export async function connectBrowserVoiceSession(options) {
15
24
  let ws = null;
16
25
  let pc = null;
17
26
  let controlChannel = null;
27
+ let syncChannel = null;
18
28
  let micStream = null;
19
29
  const pendingIce = [];
30
+ let connectionState = "new";
31
+ let resolveConnected = null;
32
+ let rejectConnected = null;
33
+ let connectedPromise = null;
34
+ const ensureConnectedPromise = () => {
35
+ if (!connectedPromise) {
36
+ connectedPromise = new Promise((resolve, reject) => {
37
+ resolveConnected = resolve;
38
+ rejectConnected = reject;
39
+ });
40
+ }
41
+ return connectedPromise;
42
+ };
20
43
  const sendSignal = (message) => {
21
- if (ws?.readyState === WebSocket.OPEN) {
44
+ if (ws?.readyState === runtime.WebSocket.OPEN) {
22
45
  ws.send(JSON.stringify(message));
23
46
  }
24
47
  };
25
48
  const sendToServer = (payload) => {
26
49
  sendSignal({ room: roomId, peerId, ...payload });
27
50
  };
51
+ const dispatchBinary = (data, channel) => {
52
+ debug?.debug("dc", "binary", `${channel}:${data.byteLength}b`);
53
+ options.onBinaryMessage?.(data, channel);
54
+ };
55
+ const handleControlJson = (raw) => {
56
+ debug?.debug("dc", "message", raw);
57
+ try {
58
+ const message = JSON.parse(raw);
59
+ options.onControlMessage?.(message);
60
+ if (message.type === "speech_event") {
61
+ debug?.info("speech", message.event ?? "event", message.text);
62
+ }
63
+ else {
64
+ debug?.info("dc", message.type ?? "json", message.text);
65
+ }
66
+ }
67
+ catch {
68
+ debug?.warn("dc", "malformed", raw);
69
+ }
70
+ };
71
+ const wireBinaryChannel = (channel, kind) => {
72
+ channel.binaryType = "arraybuffer";
73
+ channel.onmessage = (event) => {
74
+ if (typeof event.data === "string") {
75
+ if (kind === "control") {
76
+ handleControlJson(String(event.data));
77
+ }
78
+ return;
79
+ }
80
+ const buf = event.data instanceof ArrayBuffer
81
+ ? event.data
82
+ : (() => {
83
+ const view = event.data;
84
+ const copy = new ArrayBuffer(view.byteLength);
85
+ new Uint8Array(copy).set(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
86
+ return copy;
87
+ })();
88
+ dispatchBinary(buf, kind);
89
+ };
90
+ };
28
91
  if (options.requestMic !== false) {
29
- micStream = await navigator.mediaDevices.getUserMedia({
92
+ const getUserMedia = runtime.getUserMedia;
93
+ if (!getUserMedia) {
94
+ throw new Error("runtime.getUserMedia is required when requestMic is true");
95
+ }
96
+ micStream = await getUserMedia({
30
97
  audio: true,
31
98
  video: false,
32
99
  });
33
100
  debug?.info("voice", "mic_granted");
34
101
  }
35
- ws = new WebSocket(signalingUrl);
102
+ ws = new runtime.WebSocket(signalingUrl);
36
103
  await new Promise((resolve, reject) => {
37
104
  if (!ws)
38
105
  return reject(new Error("WebSocket missing"));
@@ -50,29 +117,31 @@ export async function connectBrowserVoiceSession(options) {
50
117
  debug?.info("dc", "close", VOICE_CONTROL_CHANNEL_LABEL);
51
118
  controlChannel = null;
52
119
  };
53
- channel.onmessage = (event) => {
54
- debug?.debug("dc", "message", String(event.data));
55
- try {
56
- const message = JSON.parse(String(event.data));
57
- if (message.type === "speech_event") {
58
- debug?.info("speech", message.event ?? "event", message.text);
59
- }
60
- else {
61
- debug?.info("dc", message.type ?? "json", message.text);
62
- }
63
- }
64
- catch {
65
- debug?.warn("dc", "malformed", String(event.data));
66
- }
120
+ wireBinaryChannel(channel, "control");
121
+ };
122
+ const wireSync = (channel) => {
123
+ syncChannel = channel;
124
+ channel.onopen = () => debug?.info("dc", "open", VOICE_SYNC_CHANNEL_LABEL);
125
+ channel.onclose = () => {
126
+ debug?.info("dc", "close", VOICE_SYNC_CHANNEL_LABEL);
127
+ syncChannel = null;
67
128
  };
129
+ wireBinaryChannel(channel, "sync");
68
130
  };
69
131
  const onServerOffer = async (sdp) => {
70
132
  if (pc) {
71
133
  pc.close();
72
134
  pc = null;
73
135
  pendingIce.length = 0;
136
+ controlChannel = null;
137
+ syncChannel = null;
138
+ connectionState = "new";
139
+ connectedPromise = null;
140
+ resolveConnected = null;
141
+ rejectConnected = null;
74
142
  }
75
- pc = new RTCPeerConnection({ iceServers });
143
+ ensureConnectedPromise();
144
+ pc = new runtime.RTCPeerConnection({ iceServers });
76
145
  pc.ontrack = (event) => {
77
146
  if (event.track.kind !== "audio")
78
147
  return;
@@ -87,6 +156,9 @@ export async function connectBrowserVoiceSession(options) {
87
156
  if (event.channel.label === VOICE_CONTROL_CHANNEL_LABEL) {
88
157
  wireControl(event.channel);
89
158
  }
159
+ else if (event.channel.label === VOICE_SYNC_CHANNEL_LABEL) {
160
+ wireSync(event.channel);
161
+ }
90
162
  };
91
163
  pc.onicecandidate = (event) => {
92
164
  if (event.candidate) {
@@ -98,7 +170,15 @@ export async function connectBrowserVoiceSession(options) {
98
170
  }
99
171
  };
100
172
  pc.onconnectionstatechange = () => {
101
- debug?.info("webrtc", "connection_state", pc?.connectionState);
173
+ connectionState = pc?.connectionState ?? "new";
174
+ debug?.info("webrtc", "connection_state", connectionState);
175
+ if (connectionState === "connected") {
176
+ resolveConnected?.();
177
+ }
178
+ else if (connectionState === "failed" ||
179
+ connectionState === "closed") {
180
+ rejectConnected?.(new Error(`peer connection ${connectionState}`));
181
+ }
102
182
  };
103
183
  await pc.setRemoteDescription(sdp);
104
184
  for (const candidate of pendingIce.splice(0)) {
@@ -143,27 +223,59 @@ export async function connectBrowserVoiceSession(options) {
143
223
  break;
144
224
  }
145
225
  };
226
+ const requireOpenControl = () => {
227
+ if (!controlChannel || controlChannel.readyState !== "open") {
228
+ debug?.error("dc", "control_not_open");
229
+ throw new Error("voice-control data channel is not open");
230
+ }
231
+ return controlChannel;
232
+ };
233
+ const requireOpenSync = () => {
234
+ if (!syncChannel || syncChannel.readyState !== "open") {
235
+ debug?.error("dc", "sync_not_open");
236
+ throw new Error("voicethere-sync data channel is not open");
237
+ }
238
+ return syncChannel;
239
+ };
240
+ const waitForConnected = async (timeoutMs = 60_000) => {
241
+ if (connectionState === "connected")
242
+ return;
243
+ ensureConnectedPromise();
244
+ await Promise.race([
245
+ connectedPromise,
246
+ new Promise((_, reject) => {
247
+ setTimeout(() => reject(new Error(`WebRTC connect timeout after ${timeoutMs}ms`)), timeoutMs);
248
+ }),
249
+ ]);
250
+ };
146
251
  return {
147
252
  peerId,
148
253
  getMicStream: () => micStream,
254
+ getConnectionState: () => connectionState,
255
+ waitForConnected,
149
256
  sendSpeak: (text) => {
150
- if (!controlChannel || controlChannel.readyState !== "open") {
151
- debug?.error("dc", "speak_failed", "control channel not open");
152
- return;
153
- }
154
- controlChannel.send(JSON.stringify({ type: "speak", text }));
257
+ requireOpenControl().send(JSON.stringify({ type: "speak", text }));
155
258
  debug?.info("dc", "speak", text);
156
259
  },
157
260
  sendChat: (text) => {
158
- if (!controlChannel || controlChannel.readyState !== "open") {
159
- debug?.error("dc", "chat_failed", "control channel not open");
160
- return;
161
- }
162
- controlChannel.send(JSON.stringify({ type: "chat", text }));
261
+ requireOpenControl().send(JSON.stringify({ type: "chat", text }));
163
262
  debug?.info("dc", "chat", text);
164
263
  },
264
+ sendToAgent: (payload) => {
265
+ requireOpenControl().send(JSON.stringify(payload));
266
+ debug?.info("dc", "json", String(payload.type ?? "payload"));
267
+ },
268
+ sendBinary: (data) => {
269
+ requireOpenControl().send(toArrayBuffer(data));
270
+ debug?.debug("dc", "binary_send", `control:${data.byteLength}b`);
271
+ },
272
+ sendSyncBinary: (data) => {
273
+ requireOpenSync().send(toArrayBuffer(data));
274
+ debug?.debug("dc", "binary_send", `sync:${data.byteLength}b`);
275
+ },
165
276
  disconnect: () => {
166
277
  controlChannel?.close();
278
+ syncChannel?.close();
167
279
  pc?.close();
168
280
  micStream?.getTracks().forEach((track) => track.stop());
169
281
  ws?.close();
@@ -1 +1 @@
1
- {"version":3,"file":"browser-voice-session.js","sourceRoot":"","sources":["../../src/browser/browser-voice-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,MAAM,CAAC,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAC/D,MAAM,CAAC,MAAM,2BAA2B,GAAG,eAAe,CAAC;AAkB3D,SAAS,aAAa;IACpB,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAmC;IAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;IAC3C,MAAM,YAAY,GAAG,eAAe,CAClC,OAAO,CAAC,WAAW,CAAC,aAAa,EACjC,OAAO,CAAC,WAAW,CAAC,UAAU,CAC/B,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM;QACxD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW;QACjC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,CAAC;IAE/C,IAAI,EAAE,GAAqB,IAAI,CAAC;IAChC,IAAI,EAAE,GAA6B,IAAI,CAAC;IACxC,IAAI,cAAc,GAA0B,IAAI,CAAC;IACjD,IAAI,SAAS,GAAuB,IAAI,CAAC;IACzC,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,MAAM,UAAU,GAAG,CAAC,OAAgC,EAAE,EAAE;QACtD,IAAI,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,OAAgC,EAAE,EAAE;QACxD,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACjC,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;YACpD,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACtC,CAAC;IAED,EAAE,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,IAAI,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvD,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;YACf,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACnD,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,CAAC,OAAuB,EAAE,EAAE;QAC9C,cAAc,GAAG,OAAO,CAAC;QACzB,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CACpB,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAC;QACzD,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,2BAA2B,CAAC,CAAC;YACxD,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC;QACF,OAAO,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YAC5B,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAI5C,CAAC;gBACF,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACpC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,GAA8B,EAAE,EAAE;QAC7D,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,EAAE,GAAG,IAAI,CAAC;YACV,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAE3C,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YACrB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAClE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,OAAO,CAAC,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxC,KAAK,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1D,CAAC;YACD,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,EAAE,CAAC,aAAa,GAAG,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,2BAA2B,EAAE,CAAC;gBACxD,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,EAAE,CAAC,cAAc,GAAG,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,YAAY,CAAC;oBACX,IAAI,EAAE,eAAe;oBACrB,YAAY,EAAE,0BAA0B;oBACxC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,EAAE,CAAC,uBAAuB,GAAG,GAAG,EAAE;YAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,MAAM,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACnC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC/C,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,YAAY,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,0BAA0B;YACxC,GAAG,EAAE,EAAE,CAAC,gBAAgB;SACzB,CAAC,CAAC;QACH,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAK5C,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO;gBACV,IAAI,OAAO,CAAC,MAAM,KAAK,0BAA0B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBACjE,KAAK,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM;YACR,KAAK,eAAe;gBAClB,IACE,OAAO,CAAC,MAAM,KAAK,0BAA0B;oBAC7C,OAAO,CAAC,SAAS;oBACjB,EAAE,EACF,CAAC;oBACD,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC;wBAC1B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACrC,CAAC;yBAAM,CAAC;wBACN,KAAK,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBACD,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;QAC7B,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;YAC1B,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC5D,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,0BAA0B,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7D,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE;YACzB,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC5D,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,0BAA0B,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YACD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,UAAU,EAAE,GAAG,EAAE;YACf,cAAc,EAAE,KAAK,EAAE,CAAC;YACxB,EAAE,EAAE,KAAK,EAAE,CAAC;YACZ,SAAS,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,EAAE,EAAE,KAAK,EAAE,CAAC;YACZ,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"browser-voice-session.js","sourceRoot":"","sources":["../../src/browser/browser-voice-session.ts"],"names":[],"mappings":"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"}
@@ -46,7 +46,8 @@ export type StartSessionResult = {
46
46
  message: string;
47
47
  };
48
48
  /**
49
- * POST /api/v1/sessions with async=true and poll GET until ready or failed.
49
+ * POST /v1/sessions with async=true and poll GET until ready or failed.
50
+ * `apiBase` should point at the session-service root, e.g. https://sessions.voicethere.dev/v1
50
51
  */
51
52
  export declare function startSession(options: StartSessionOptions): Promise<StartSessionResult>;
52
53
  //# sourceMappingURL=session-provision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-provision.d.ts","sourceRoot":"","sources":["../../src/browser/session-provision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,SAAS,CAAC;AAEd,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACnD,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5D;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA4DN;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA2D7B"}
1
+ {"version":3,"file":"session-provision.d.ts","sourceRoot":"","sources":["../../src/browser/session-provision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,SAAS,CAAC;AAEd,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACnD,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5D;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA4DN;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA2D7B"}
@@ -3,7 +3,7 @@ function sleep(ms) {
3
3
  }
4
4
  async function pollSessionStatus(input) {
5
5
  const started = Date.now();
6
- const url = `${input.apiBase.replace(/\/$/, "")}/api/v1/sessions/${input.jobId}`;
6
+ const url = `${input.apiBase.replace(/\/$/, "")}/sessions/${input.jobId}`;
7
7
  while (Date.now() - started < input.pollTimeoutMs) {
8
8
  const res = await fetch(url, { headers: input.headers });
9
9
  if (!res.ok) {
@@ -36,7 +36,8 @@ async function pollSessionStatus(input) {
36
36
  };
37
37
  }
38
38
  /**
39
- * POST /api/v1/sessions with async=true and poll GET until ready or failed.
39
+ * POST /v1/sessions with async=true and poll GET until ready or failed.
40
+ * `apiBase` should point at the session-service root, e.g. https://sessions.voicethere.dev/v1
40
41
  */
41
42
  export async function startSession(options) {
42
43
  const apiBase = options.apiBase.replace(/\/$/, "");
@@ -50,7 +51,7 @@ export async function startSession(options) {
50
51
  async: options.async ?? true,
51
52
  };
52
53
  options.debug?.info("provision", "post_sessions", JSON.stringify(body));
53
- const res = await fetch(`${apiBase}/api/v1/sessions`, {
54
+ const res = await fetch(`${apiBase}/sessions`, {
54
55
  method: "POST",
55
56
  headers,
56
57
  body: JSON.stringify(body),
@@ -1 +1 @@
1
- {"version":3,"file":"session-provision.js","sourceRoot":"","sources":["../../src/browser/session-provision.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-provision.js","sourceRoot":"","sources":["../../src/browser/session-provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Injectable WebRTC + signaling primitives for browser and Node test runtimes.
3
+ */
4
+ export type WebRtcRuntime = {
5
+ WebSocket: {
6
+ new (url: string, protocols?: string | string[]): WebSocket;
7
+ readonly OPEN: number;
8
+ };
9
+ RTCPeerConnection: {
10
+ new (configuration?: RTCConfiguration): RTCPeerConnection;
11
+ };
12
+ getUserMedia?: (constraints: MediaStreamConstraints) => Promise<MediaStream>;
13
+ };
14
+ export declare function getDefaultBrowserRuntime(): WebRtcRuntime;
15
+ //# sourceMappingURL=webrtc-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-runtime.d.ts","sourceRoot":"","sources":["../../src/browser/webrtc-runtime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE;QACT,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,iBAAiB,EAAE;QACjB,KAAK,aAAa,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;KAC3D,CAAC;IACF,YAAY,CAAC,EAAE,CACb,WAAW,EAAE,sBAAsB,KAChC,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAgB,wBAAwB,IAAI,aAAa,CAsBxD"}
@@ -0,0 +1,19 @@
1
+ export function getDefaultBrowserRuntime() {
2
+ if (typeof globalThis.WebSocket === "undefined") {
3
+ throw new Error("WebSocket is not available; pass runtime (e.g. createNodeWebRtcRuntime from @voicethere/client/node)");
4
+ }
5
+ if (typeof globalThis.RTCPeerConnection === "undefined") {
6
+ throw new Error("RTCPeerConnection is not available; pass runtime from @voicethere/client/node");
7
+ }
8
+ return {
9
+ WebSocket: globalThis.WebSocket,
10
+ RTCPeerConnection: globalThis.RTCPeerConnection,
11
+ getUserMedia: async (constraints) => {
12
+ if (!navigator?.mediaDevices?.getUserMedia) {
13
+ throw new Error("navigator.mediaDevices.getUserMedia is not available");
14
+ }
15
+ return navigator.mediaDevices.getUserMedia(constraints);
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=webrtc-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-runtime.js","sourceRoot":"","sources":["../../src/browser/webrtc-runtime.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,wBAAwB;IACtC,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,iBAAiB,KAAK,WAAW,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YAClC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createNodeWebRtcRuntime } from "./runtime.js";
2
+ export { NodeWebSocketAdapter } from "./node-websocket.js";
3
+ export { connectBrowserSession, connectBrowserVoiceSession, connectBrowserChatSession, startSession, VOICE_CONTROL_CHANNEL_LABEL, VOICE_SYNC_CHANNEL_LABEL, } from "../browser/browser-session.js";
4
+ export type { BrowserSession, BrowserSessionMode, ConnectBrowserSessionOptions, BrowserVoiceSession, BrowserVoiceSessionOptions, SessionCredentials, SessionStatusResponse, StartSessionOptions, StartSessionResult, } from "../browser/browser-session.js";
5
+ export type { WebRtcRuntime } from "../browser/webrtc-runtime.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,YAAY,EACZ,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createNodeWebRtcRuntime } from "./runtime.js";
2
+ export { NodeWebSocketAdapter } from "./node-websocket.js";
3
+ export { connectBrowserSession, connectBrowserVoiceSession, connectBrowserChatSession, startSession, VOICE_CONTROL_CHANNEL_LABEL, VOICE_SYNC_CHANNEL_LABEL, } from "../browser/browser-session.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,YAAY,EACZ,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Minimal WebSocket wrapper matching the browser API used by browser-voice-session.
3
+ */
4
+ export declare class NodeWebSocketAdapter {
5
+ static readonly OPEN: 1;
6
+ readonly OPEN: 1;
7
+ readyState: number;
8
+ onopen: (() => void) | null;
9
+ onerror: (() => void) | null;
10
+ onmessage: ((event: MessageEvent) => void) | null;
11
+ onclose: (() => void) | null;
12
+ private readonly ws;
13
+ constructor(url: string, _protocols?: string | string[]);
14
+ send(data: string): void;
15
+ close(): void;
16
+ }
17
+ //# sourceMappingURL=node-websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-websocket.d.ts","sourceRoot":"","sources":["../../src/node/node-websocket.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAsB;IAE1C,QAAQ,CAAC,IAAI,IAAsB;IAEnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IACnC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IACpC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IACzD,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEpC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgB;gBAEvB,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IA0BvD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,44 @@
1
+ import { WebSocket as NodeWebSocket } from "ws";
2
+ /**
3
+ * Minimal WebSocket wrapper matching the browser API used by browser-voice-session.
4
+ */
5
+ export class NodeWebSocketAdapter {
6
+ static OPEN = NodeWebSocket.OPEN;
7
+ OPEN = NodeWebSocket.OPEN;
8
+ readyState;
9
+ onopen = null;
10
+ onerror = null;
11
+ onmessage = null;
12
+ onclose = null;
13
+ ws;
14
+ constructor(url, _protocols) {
15
+ this.ws = new NodeWebSocket(url);
16
+ this.readyState = this.ws.readyState;
17
+ this.ws.on("open", () => {
18
+ this.readyState = NodeWebSocket.OPEN;
19
+ this.onopen?.();
20
+ });
21
+ this.ws.on("error", () => {
22
+ this.onerror?.();
23
+ });
24
+ this.ws.on("message", (data) => {
25
+ const text = typeof data === "string"
26
+ ? data
27
+ : Buffer.isBuffer(data)
28
+ ? data.toString("utf8")
29
+ : Buffer.from(data).toString("utf8");
30
+ this.onmessage?.({ data: text });
31
+ });
32
+ this.ws.on("close", () => {
33
+ this.readyState = NodeWebSocket.CLOSED;
34
+ this.onclose?.();
35
+ });
36
+ }
37
+ send(data) {
38
+ this.ws.send(data);
39
+ }
40
+ close() {
41
+ this.ws.close();
42
+ }
43
+ }
44
+ //# sourceMappingURL=node-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-websocket.js","sourceRoot":"","sources":["../../src/node/node-websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,IAAI,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAU,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;IAEjC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;IAEnC,UAAU,CAAS;IACnB,MAAM,GAAwB,IAAI,CAAC;IACnC,OAAO,GAAwB,IAAI,CAAC;IACpC,SAAS,GAA2C,IAAI,CAAC;IACzD,OAAO,GAAwB,IAAI,CAAC;IAEnB,EAAE,CAAgB;IAEnC,YAAY,GAAW,EAAE,UAA8B;QACrD,IAAI,CAAC,EAAE,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC;QAErC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,GACR,OAAO,IAAI,KAAK,QAAQ;gBACtB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACrB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACvB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAkB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WebRtcRuntime } from "../browser/webrtc-runtime.js";
2
+ /**
3
+ * Node.js WebRTC runtime for headless E2E tests (uses @node-webrtc-rust/sdk + ws).
4
+ */
5
+ export declare function createNodeWebRtcRuntime(): WebRtcRuntime;
6
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/node/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAKlE;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAYvD"}
@@ -0,0 +1,19 @@
1
+ import { LocalAudioTrack, MediaStream, RTCPeerConnection, } from "@node-webrtc-rust/sdk";
2
+ import { NodeWebSocketAdapter } from "./node-websocket.js";
3
+ const SILENT_KICK_FRAME = new Uint8Array(960);
4
+ /**
5
+ * Node.js WebRTC runtime for headless E2E tests (uses @node-webrtc-rust/sdk + ws).
6
+ */
7
+ export function createNodeWebRtcRuntime() {
8
+ return {
9
+ WebSocket: NodeWebSocketAdapter,
10
+ RTCPeerConnection: RTCPeerConnection,
11
+ getUserMedia: async (_constraints) => {
12
+ const track = new LocalAudioTrack("mic", "mic-stream");
13
+ const stream = new MediaStream([track]);
14
+ await track.writeSample(SILENT_KICK_FRAME, 5);
15
+ return stream;
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/node/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,iBAAiB,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,SAAS,EAAE,oBAA6D;QACxE,iBAAiB,EACf,iBAAkE;QACpE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,MAA2C,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voicethere/client",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "VoiceThere browser/Node client — cloud gateway, browser voice/chat, embed widget",
5
5
  "type": "module",
6
6
  "exports": {
@@ -15,6 +15,10 @@
15
15
  "./embed": {
16
16
  "types": "./dist/embed/index.d.ts",
17
17
  "import": "./dist/embed/index.js"
18
+ },
19
+ "./node": {
20
+ "types": "./dist/node/index.d.ts",
21
+ "import": "./dist/node/index.js"
18
22
  }
19
23
  },
20
24
  "files": [
@@ -58,10 +62,25 @@
58
62
  "@node-webrtc-rust/signaling": "0.5.2"
59
63
  },
60
64
  "devDependencies": {
65
+ "@node-webrtc-rust/sdk": "0.5.2",
61
66
  "@types/node": "^22.10.0",
67
+ "@types/ws": "^8.5.14",
62
68
  "tsx": "^4.19.2",
63
69
  "typescript": "^5.7.0",
64
70
  "vite": "^6.0.3",
65
- "vitest": "^2.1.8"
71
+ "vitest": "^2.1.8",
72
+ "ws": "^8.18.0"
73
+ },
74
+ "peerDependencies": {
75
+ "@node-webrtc-rust/sdk": ">=0.5.2",
76
+ "ws": "^8.0.0"
77
+ },
78
+ "peerDependenciesMeta": {
79
+ "@node-webrtc-rust/sdk": {
80
+ "optional": true
81
+ },
82
+ "ws": {
83
+ "optional": true
84
+ }
66
85
  }
67
86
  }