diff --git a/CHANGELOG.md b/CHANGELOG.md index 2133f97..322ebae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,24 @@ Format loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). --- +## [0.5.3] — 2026-06-15 + +**Compare:** [`release/0.5.2…release/0.5.3`](https://github.com/akirilyuk/node-webrtc-rust/compare/release/0.5.2...release/0.5.3) + +DataChannel hooks for dashboard chat and echo-dc agents. + +### Added + +- **`VoiceSessionHandler.onDataChannelMessage`** — handle inbound DataChannel JSON from the browser tab. +- **`VoiceSessionContext.sendToClient`** — send arbitrary JSON payloads to the connected client over DataChannel. +- Speech-event bridge forwards non-`speak` DataChannel payloads into the voice host pipeline. + +### Fixed + +- **`broadcastSpeak`** — pass the per-session control channel into `createSessionContext` so `sendToClient` works during broadcast. + +--- + ## [0.5.2] — 2026-06-03 **Compare:** [`release/0.5.1…release/0.5.2`](https://github.com/akirilyuk/node-webrtc-rust/compare/release/0.5.1...release/0.5.2) diff --git a/examples/audio-cosine/package.json b/examples/audio-cosine/package.json index e972e86..32968d5 100644 --- a/examples/audio-cosine/package.json +++ b/examples/audio-cosine/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-audio-cosine", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Stream a generated cosine tone over a WebRTC audio track", "type": "module", "scripts": { @@ -10,9 +10,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/browser-cosine-chat/package.json b/examples/browser-cosine-chat/package.json index 5745238..feae324 100644 --- a/examples/browser-cosine-chat/package.json +++ b/examples/browser-cosine-chat/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-browser-cosine-chat", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Browser clients receive a cosine tone from Node and chat via WebRTC data channels", "type": "module", "scripts": { @@ -10,8 +10,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/conference-room-manual-signaling/package.json b/examples/conference-room-manual-signaling/package.json index 993032e..1f21395 100644 --- a/examples/conference-room-manual-signaling/package.json +++ b/examples/conference-room-manual-signaling/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-conference-room-manual-signaling", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Conference room with hand-rolled WebSocket signaling (no @node-webrtc-rust/signaling)", "type": "module", "scripts": { @@ -9,7 +9,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", + "@node-webrtc-rust/sdk": "0.5.3", "ws": "^8.18.0" }, "devDependencies": { diff --git a/examples/conference-room/package.json b/examples/conference-room/package.json index b70ccd0..a14087b 100644 --- a/examples/conference-room/package.json +++ b/examples/conference-room/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-conference-room", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Browser conference room with Rust-side audio mixing, mute controls, and kick", "type": "module", "scripts": { @@ -9,8 +9,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/peer-connection/package.json b/examples/peer-connection/package.json index 09cdd9c..4ca6d71 100644 --- a/examples/peer-connection/package.json +++ b/examples/peer-connection/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-peer-connection", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Basic two-peer WebRTC connection demo", "type": "module", "scripts": { @@ -10,9 +10,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/voice-agent-browser/package.json b/examples/voice-agent-browser/package.json index 4844f7b..62564ea 100644 --- a/examples/voice-agent-browser/package.json +++ b/examples/voice-agent-browser/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-voice-agent-browser", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Browser WebRTC client + Node VoiceAgent server with DataChannel speech events and TTS control", "type": "module", "scripts": { @@ -16,9 +16,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/voice-agent-local-sherpa-multi-client/package.json b/examples/voice-agent-local-sherpa-multi-client/package.json index 8f783e0..4bbb645 100644 --- a/examples/voice-agent-local-sherpa-multi-client/package.json +++ b/examples/voice-agent-local-sherpa-multi-client/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-voice-agent-local-sherpa-multi-client", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Three browser clients, one room, shared local Sherpa STT/TTS + session budget demo", "type": "module", "scripts": { @@ -15,9 +15,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/voice-agent-local-sherpa/package.json b/examples/voice-agent-local-sherpa/package.json index 634440a..b0bc046 100644 --- a/examples/voice-agent-local-sherpa/package.json +++ b/examples/voice-agent-local-sherpa/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-voice-agent-local-sherpa", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "Browser WebRTC + local Sherpa-ONNX STT/TTS (no cloud keys) with model download helpers and Node roundtrip demo", "type": "module", "scripts": { @@ -42,9 +42,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/voice-agent-multi-session-pod/package.json b/examples/voice-agent-multi-session-pod/package.json index 6f88b91..ced8fa4 100644 --- a/examples/voice-agent-multi-session-pod/package.json +++ b/examples/voice-agent-multi-session-pod/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-voice-agent-multi-session-pod", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "One Node pod: single signaling entry point, many concurrent voice sessions (one VoiceAgent per WebRTC connection)", "type": "module", "scripts": { @@ -10,9 +10,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/examples/voice-agent/package.json b/examples/voice-agent/package.json index d59ee37..bdde212 100644 --- a/examples/voice-agent/package.json +++ b/examples/voice-agent/package.json @@ -1,7 +1,7 @@ { "name": "@node-webrtc-rust/example-voice-agent", "private": true, - "version": "0.5.2", + "version": "0.5.3", "description": "VoiceAgent demo: mock STT/TTS, VAD, barge-in, callback and stream events", "type": "module", "scripts": { @@ -17,9 +17,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/package-lock.json b/package-lock.json index 7c29751..64eaca1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,11 +27,11 @@ }, "examples/audio-cosine": { "name": "@node-webrtc-rust/example-audio-cosine", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -41,10 +41,10 @@ }, "examples/browser-cosine-chat": { "name": "@node-webrtc-rust/example-browser-cosine-chat", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -54,10 +54,10 @@ }, "examples/conference-room": { "name": "@node-webrtc-rust/example-conference-room", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -67,9 +67,9 @@ }, "examples/conference-room-manual-signaling": { "name": "@node-webrtc-rust/example-conference-room-manual-signaling", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", + "@node-webrtc-rust/sdk": "0.5.3", "ws": "^8.18.0" }, "devDependencies": { @@ -81,11 +81,11 @@ }, "examples/peer-connection": { "name": "@node-webrtc-rust/example-peer-connection", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -95,11 +95,11 @@ }, "examples/voice-agent": { "name": "@node-webrtc-rust/example-voice-agent", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -109,11 +109,11 @@ }, "examples/voice-agent-browser": { "name": "@node-webrtc-rust/example-voice-agent-browser", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -123,11 +123,11 @@ }, "examples/voice-agent-local-sherpa": { "name": "@node-webrtc-rust/example-voice-agent-local-sherpa", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -138,11 +138,11 @@ }, "examples/voice-agent-local-sherpa-multi-client": { "name": "@node-webrtc-rust/example-voice-agent-local-sherpa-multi-client", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -153,11 +153,11 @@ }, "examples/voice-agent-multi-session-pod": { "name": "@node-webrtc-rust/example-voice-agent-multi-session-pod", - "version": "0.5.2", + "version": "0.5.3", "dependencies": { - "@node-webrtc-rust/helpers": "0.5.2", - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/helpers": "0.5.3", + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -385,9 +385,9 @@ "link": true }, "node_modules/@node-webrtc-rust/bindings-darwin-arm64": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-darwin-arm64/-/bindings-darwin-arm64-0.5.2.tgz", - "integrity": "sha512-wlp0DA5Lqi/AwQV8DUsH45IowVQWyl0XSmkTYUpDA3ykPplgyrPRbk6fK5Bsda+FAU34XoUi3RG0398DqSmHrQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-darwin-arm64/-/bindings-darwin-arm64-0.5.3.tgz", + "integrity": "sha512-5+SMgr/tuKXYL3+7Q/WS3+Khi/C06XxT6FzIs0n1fvBv+b5Ht6Cic5bIw1zGr5GWRw56uIr1w/uQORjkCnQvbw==", "cpu": [ "arm64" ], @@ -401,9 +401,9 @@ } }, "node_modules/@node-webrtc-rust/bindings-darwin-x64": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-darwin-x64/-/bindings-darwin-x64-0.5.2.tgz", - "integrity": "sha512-LFEIwZLwRW25NgYVhwJTPjMkBB3yJFjenEuKBaqVnK6PBlSBq9MROf+SiLA8cRV4YSkXOE54JXdhibS346L4jQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-darwin-x64/-/bindings-darwin-x64-0.5.3.tgz", + "integrity": "sha512-ouaXWX4tgIfQFGkgNrr4bWIu3HYKrWaGrfFghZqo1O0v09cPuYmE+3Qz9P2GdCqrmHprpHxJ5ZcXEKIWmGQPRw==", "cpu": [ "x64" ], @@ -417,9 +417,9 @@ } }, "node_modules/@node-webrtc-rust/bindings-linux-arm64-gnu": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-linux-arm64-gnu/-/bindings-linux-arm64-gnu-0.5.2.tgz", - "integrity": "sha512-geMFNvXRnOCqVK3VCBH2HMjtmk8HbZB442jtASLzhTP1QxMN1ur0CdfEphjBmEQsY+ZFkaij/AlBDUXaNmXnjA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-linux-arm64-gnu/-/bindings-linux-arm64-gnu-0.5.3.tgz", + "integrity": "sha512-YmedYan8V8XhNrOjE6Cv1CeeZXX7OqXse63zOr58ghJqheLprqLUBGs1qH23Es8gczC6V3JXRxQ/xoqXPcrRLQ==", "cpu": [ "arm64" ], @@ -433,9 +433,9 @@ } }, "node_modules/@node-webrtc-rust/bindings-linux-x64-gnu": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-linux-x64-gnu/-/bindings-linux-x64-gnu-0.5.2.tgz", - "integrity": "sha512-NizmVaA6SKHSl1sZ/GSS3nbO5ZDJ4wcR3EfarQQdP4GDJ3o4bdhIMv72UkCkIY2f3D34XEitRyG4ErqwO1++Eg==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-linux-x64-gnu/-/bindings-linux-x64-gnu-0.5.3.tgz", + "integrity": "sha512-W+SElLqUc7rTdv6Oe2Nzj5TseJA4QsH00Xjh8diouRO6zqP+PBvFt+GzaocGjE5uTLhz3Gl87cCrYo433nFJqQ==", "cpu": [ "x64" ], @@ -449,9 +449,9 @@ } }, "node_modules/@node-webrtc-rust/bindings-linux-x64-musl": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-linux-x64-musl/-/bindings-linux-x64-musl-0.5.2.tgz", - "integrity": "sha512-mBvFBWQ/twGd1FoNQGb02Rkx/SjH/ipySt7UaGp/jh+Fkgis4LQ2BzjWmjyurNS92YJx2y6UDgY++or+/1DDxA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-linux-x64-musl/-/bindings-linux-x64-musl-0.5.3.tgz", + "integrity": "sha512-zxeBylstkY8lcDCwpliI6H4bjkgOE7Tc5q54tUAneiSUaVqyYQMk1Nu2+duyFWUTAD67jKsC9oJNhbsP2TnsiQ==", "cpu": [ "x64" ], @@ -465,9 +465,9 @@ } }, "node_modules/@node-webrtc-rust/bindings-win32-x64-msvc": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-win32-x64-msvc/-/bindings-win32-x64-msvc-0.5.2.tgz", - "integrity": "sha512-O3EAZ0g2KdA3NJzNpoAvahCh764QV+SowCiUgk+cln7TXd4mJn03aF+Qsfs8NHrHTfw6hFVCFGlr94E3+1C+EA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@node-webrtc-rust/bindings-win32-x64-msvc/-/bindings-win32-x64-msvc-0.5.3.tgz", + "integrity": "sha512-fGp85AUwAid0gFgWAnSBc7TBgQJDdUQ0crV8UsJKFxls7F00Wbjqtdsq27b2MJy6vPEh8HQJsxf29KNQBt5kAA==", "cpu": [ "x64" ], @@ -2314,7 +2314,7 @@ }, "packages/bindings": { "name": "@node-webrtc-rust/bindings", - "version": "0.5.2", + "version": "0.5.3", "license": "MIT", "devDependencies": { "@napi-rs/cli": "^2.18.0" @@ -2323,21 +2323,21 @@ "node": ">=18" }, "optionalDependencies": { - "@node-webrtc-rust/bindings-darwin-arm64": "0.5.2", - "@node-webrtc-rust/bindings-darwin-x64": "0.5.2", - "@node-webrtc-rust/bindings-linux-arm64-gnu": "0.5.2", - "@node-webrtc-rust/bindings-linux-x64-gnu": "0.5.2", - "@node-webrtc-rust/bindings-linux-x64-musl": "0.5.2", - "@node-webrtc-rust/bindings-win32-x64-msvc": "0.5.2" + "@node-webrtc-rust/bindings-darwin-arm64": "0.5.3", + "@node-webrtc-rust/bindings-darwin-x64": "0.5.3", + "@node-webrtc-rust/bindings-linux-arm64-gnu": "0.5.3", + "@node-webrtc-rust/bindings-linux-x64-gnu": "0.5.3", + "@node-webrtc-rust/bindings-linux-x64-musl": "0.5.3", + "@node-webrtc-rust/bindings-win32-x64-msvc": "0.5.3" } }, "packages/helpers": { "name": "@node-webrtc-rust/helpers", - "version": "0.5.2", + "version": "0.5.3", "license": "MIT", "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -2350,11 +2350,11 @@ }, "packages/sdk": { "name": "@node-webrtc-rust/sdk", - "version": "0.5.2", + "version": "0.5.3", "license": "MIT", "dependencies": { - "@node-webrtc-rust/bindings": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/bindings": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", @@ -2367,13 +2367,13 @@ }, "packages/signaling": { "name": "@node-webrtc-rust/signaling", - "version": "0.5.2", + "version": "0.5.3", "license": "MIT", "dependencies": { "ws": "^8.18.0" }, "devDependencies": { - "@node-webrtc-rust/sdk": "0.5.2", + "@node-webrtc-rust/sdk": "0.5.3", "@types/node": "^22.10.0", "@types/ws": "^8.5.13", "typescript": "^5.7.0", @@ -2383,7 +2383,7 @@ "node": ">=18" }, "peerDependencies": { - "@node-webrtc-rust/sdk": "^0.5.2" + "@node-webrtc-rust/sdk": "^0.5.3" }, "peerDependenciesMeta": { "@node-webrtc-rust/sdk": { diff --git a/packages/bindings/npm/darwin-arm64/package.json b/packages/bindings/npm/darwin-arm64/package.json index d25d5de..7a5e973 100644 --- a/packages/bindings/npm/darwin-arm64/package.json +++ b/packages/bindings/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings-darwin-arm64", - "version": "0.5.2", + "version": "0.5.3", "description": "node-webrtc-rust native binding for macOS arm64 (Apple Silicon)", "keywords": [ "webrtc", diff --git a/packages/bindings/npm/darwin-x64/package.json b/packages/bindings/npm/darwin-x64/package.json index 4a4095b..8d05bb9 100644 --- a/packages/bindings/npm/darwin-x64/package.json +++ b/packages/bindings/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings-darwin-x64", - "version": "0.5.2", + "version": "0.5.3", "description": "node-webrtc-rust native binding for macOS x64 (Intel)", "keywords": [ "webrtc", diff --git a/packages/bindings/npm/linux-arm64-gnu/package.json b/packages/bindings/npm/linux-arm64-gnu/package.json index 8cc7549..5297031 100644 --- a/packages/bindings/npm/linux-arm64-gnu/package.json +++ b/packages/bindings/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings-linux-arm64-gnu", - "version": "0.5.2", + "version": "0.5.3", "description": "node-webrtc-rust native binding for Linux arm64 (glibc)", "keywords": [ "webrtc", diff --git a/packages/bindings/npm/linux-x64-gnu/package.json b/packages/bindings/npm/linux-x64-gnu/package.json index 9cf7b2b..b2547e3 100644 --- a/packages/bindings/npm/linux-x64-gnu/package.json +++ b/packages/bindings/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings-linux-x64-gnu", - "version": "0.5.2", + "version": "0.5.3", "description": "node-webrtc-rust native binding for Linux x64 (glibc)", "keywords": [ "webrtc", diff --git a/packages/bindings/npm/linux-x64-musl/package.json b/packages/bindings/npm/linux-x64-musl/package.json index e58a9f1..40c9f74 100644 --- a/packages/bindings/npm/linux-x64-musl/package.json +++ b/packages/bindings/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings-linux-x64-musl", - "version": "0.5.2", + "version": "0.5.3", "description": "node-webrtc-rust native binding for Linux x64 (musl / Alpine)", "keywords": [ "webrtc", diff --git a/packages/bindings/npm/win32-x64-msvc/package.json b/packages/bindings/npm/win32-x64-msvc/package.json index 39d2d50..fe85ccc 100644 --- a/packages/bindings/npm/win32-x64-msvc/package.json +++ b/packages/bindings/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings-win32-x64-msvc", - "version": "0.5.2", + "version": "0.5.3", "description": "node-webrtc-rust native binding for Windows x64 (MSVC)", "keywords": [ "webrtc", diff --git a/packages/bindings/package.json b/packages/bindings/package.json index bdce4c3..ab563d9 100644 --- a/packages/bindings/package.json +++ b/packages/bindings/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/bindings", - "version": "0.5.2", + "version": "0.5.3", "description": "NAPI-RS native bindings for node-webrtc-rust — WebRTC peer connections, data channels, and conference audio mixing", "keywords": [ "webrtc", @@ -58,12 +58,12 @@ "@napi-rs/cli": "^2.18.0" }, "optionalDependencies": { - "@node-webrtc-rust/bindings-win32-x64-msvc": "0.5.2", - "@node-webrtc-rust/bindings-darwin-x64": "0.5.2", - "@node-webrtc-rust/bindings-linux-x64-gnu": "0.5.2", - "@node-webrtc-rust/bindings-darwin-arm64": "0.5.2", - "@node-webrtc-rust/bindings-linux-arm64-gnu": "0.5.2", - "@node-webrtc-rust/bindings-linux-x64-musl": "0.5.2" + "@node-webrtc-rust/bindings-win32-x64-msvc": "0.5.3", + "@node-webrtc-rust/bindings-darwin-x64": "0.5.3", + "@node-webrtc-rust/bindings-linux-x64-gnu": "0.5.3", + "@node-webrtc-rust/bindings-darwin-arm64": "0.5.3", + "@node-webrtc-rust/bindings-linux-arm64-gnu": "0.5.3", + "@node-webrtc-rust/bindings-linux-x64-musl": "0.5.3" }, "engines": { "node": ">=18" diff --git a/packages/helpers/package.json b/packages/helpers/package.json index a4f093c..dab25ae 100644 --- a/packages/helpers/package.json +++ b/packages/helpers/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/helpers", - "version": "0.5.2", + "version": "0.5.3", "description": "Reusable server-side helpers for voice agents, session pods, and PCM streaming", "keywords": [ "webrtc", @@ -45,8 +45,8 @@ "test": "vitest run --passWithNoTests" }, "dependencies": { - "@node-webrtc-rust/sdk": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/sdk": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/packages/helpers/src/voice-agent-session-host.ts b/packages/helpers/src/voice-agent-session-host.ts index e8dbb66..c0f9119 100644 --- a/packages/helpers/src/voice-agent-session-host.ts +++ b/packages/helpers/src/voice-agent-session-host.ts @@ -153,7 +153,7 @@ export class VoiceAgentSessionHost { const contexts: VoiceSessionContext[] = [] for (const [peerId, session] of this.sessions) { if (!session.agentStarted) continue - contexts.push(this.createSessionContext(peerId, session.agent)) + contexts.push(this.createSessionContext(peerId, session.agent, session.controlChannel)) } const onBroadcastSpeak = this.options.voiceHandler?.onBroadcastSpeak @@ -281,14 +281,21 @@ export class VoiceAgentSessionHost { controlChannel.onopen = () => { this.log(`[voice ${peerId}] control channel open`) session.unwireControl?.() - const ctx = this.createSessionContext(peerId, agent) - const onSpeakRequest = this.options.voiceHandler?.onSpeakRequest + const ctx = this.createSessionContext(peerId, agent, controlChannel) + const voiceHandler = this.options.voiceHandler + const onSpeakRequest = voiceHandler?.onSpeakRequest + const onDataChannelMessage = voiceHandler?.onDataChannelMessage session.unwireControl = wireVoiceAgentToDataChannel(agent, controlChannel, { onSpeak: onSpeakRequest ? (text) => { void onSpeakRequest(ctx, text) } : undefined, + onDataChannelMessage: onDataChannelMessage + ? (payload) => { + void onDataChannelMessage(ctx, payload) + } + : undefined, }) } @@ -328,11 +335,19 @@ export class VoiceAgentSessionHost { this.log(`[voice ${peerId}] VoiceAgent started — mic → STT, TTS → browser`) } - private createSessionContext(peerId: string, agent: VoiceAgent): VoiceSessionContext { + private createSessionContext( + peerId: string, + agent: VoiceAgent, + controlChannel: RTCDataChannel, + ): VoiceSessionContext { return { peerId, agent, speak: (text: string) => agent.sendTextToTTS(text), + sendToClient: (payload: unknown) => { + if (controlChannel.readyState !== 'open') return + controlChannel.send(JSON.stringify(payload)) + }, } } @@ -345,7 +360,7 @@ export class VoiceAgentSessionHost { return forwardVoiceAgentSpeechToDataChannel(session.agent, session.controlChannel) } - const ctx = this.createSessionContext(peerId, session.agent) + const ctx = this.createSessionContext(peerId, session.agent, session.controlChannel) let active = true void (async () => { diff --git a/packages/helpers/src/voice-session-handler.ts b/packages/helpers/src/voice-session-handler.ts index 5eecb27..13b6123 100644 --- a/packages/helpers/src/voice-session-handler.ts +++ b/packages/helpers/src/voice-session-handler.ts @@ -14,6 +14,8 @@ export interface VoiceSessionContext { agent: VoiceAgent /** Synthesize `text` and stream audio to the browser. */ speak: (text: string) => Promise + /** Send a JSON payload to the browser over the voice-control data channel. */ + sendToClient: (payload: unknown) => void } /** @@ -35,6 +37,15 @@ export interface VoiceSessionHandler { */ onSpeakRequest?: (ctx: VoiceSessionContext, text: string) => void | Promise + /** + * Called for non-speak data channel JSON (e.g. `{ type: 'chat', text }`). + * Raw string is passed when JSON parsing is deferred to the handler. + */ + onDataChannelMessage?: ( + ctx: VoiceSessionContext, + payload: string, + ) => void | Promise + /** * Called only for an explicit broadcast command (e.g. `POST /api/broadcast-speak`). * Use `contexts` to TTS every connected tab — never use this path for STT replies. diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 49fd23f..0bac4b6 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/sdk", - "version": "0.5.2", + "version": "0.5.3", "description": "Browser-compatible WebRTC and conference APIs for Node.js", "keywords": [ "webrtc", @@ -64,8 +64,8 @@ "test": "vitest run" }, "dependencies": { - "@node-webrtc-rust/bindings": "0.5.2", - "@node-webrtc-rust/signaling": "0.5.2" + "@node-webrtc-rust/bindings": "0.5.3", + "@node-webrtc-rust/signaling": "0.5.3" }, "devDependencies": { "@types/node": "^22.10.0", diff --git a/packages/sdk/src/voice/speech-event-bridge.ts b/packages/sdk/src/voice/speech-event-bridge.ts index cf6a66b..2a549d3 100644 --- a/packages/sdk/src/voice/speech-event-bridge.ts +++ b/packages/sdk/src/voice/speech-event-bridge.ts @@ -66,6 +66,8 @@ export function parseVoiceControlClientMessage(raw: string): VoiceControlSpeakMe export interface WireVoiceAgentToDataChannelOptions { /** Called when the client requests TTS via `{ type: 'speak', text }`. */ onSpeak?: (text: string) => void | Promise + /** Called for other JSON payloads on the voice-control channel. */ + onDataChannelMessage?: (payload: string) => void | Promise } function sendSpeechEventToChannel(channel: RTCDataChannel, event: SpeechEvent): void { @@ -125,7 +127,12 @@ export function wireVoiceControlSpeakHandler( : String(event.data) const message = parseVoiceControlClientMessage(payload) - if (!message) return + if (!message) { + if (options?.onDataChannelMessage) { + void options.onDataChannelMessage(payload) + } + return + } if (options?.onSpeak) { void options.onSpeak(message.text) diff --git a/packages/signaling/package.json b/packages/signaling/package.json index e9c83b9..c79d8cd 100644 --- a/packages/signaling/package.json +++ b/packages/signaling/package.json @@ -1,6 +1,6 @@ { "name": "@node-webrtc-rust/signaling", - "version": "0.5.2", + "version": "0.5.3", "description": "TypeScript WebSocket signaling helpers for node-webrtc-rust", "keywords": [ "webrtc", @@ -49,14 +49,14 @@ "ws": "^8.18.0" }, "devDependencies": { - "@node-webrtc-rust/sdk": "0.5.2", + "@node-webrtc-rust/sdk": "0.5.3", "@types/node": "^22.10.0", "@types/ws": "^8.5.13", "typescript": "^5.7.0", "vitest": "^2.1.8" }, "peerDependencies": { - "@node-webrtc-rust/sdk": "^0.5.2" + "@node-webrtc-rust/sdk": "^0.5.3" }, "peerDependenciesMeta": { "@node-webrtc-rust/sdk": {