@node-webrtc-rust/bindings 0.2.1 → 0.3.2

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.
Files changed (3) hide show
  1. package/index.d.ts +153 -4
  2. package/index.js +33 -5
  3. package/package.json +7 -7
package/index.d.ts CHANGED
@@ -72,6 +72,17 @@ export interface JsRtcConfiguration {
72
72
  iceTransportPolicy?: string
73
73
  debug?: boolean
74
74
  }
75
+ /** Offer options (W3C `RTCOfferOptions` subset). */
76
+ export interface JsRtcOfferOptions {
77
+ iceRestart?: boolean
78
+ voiceActivityDetection?: boolean
79
+ offerToReceiveAudio?: boolean
80
+ offerToReceiveVideo?: boolean
81
+ }
82
+ /** Answer options (W3C `RTCAnswerOptions` subset). */
83
+ export interface JsRtcAnswerOptions {
84
+ voiceActivityDetection?: boolean
85
+ }
75
86
  /** Session description exposed to JavaScript. */
76
87
  export interface JsRtcSessionDescription {
77
88
  type: string
@@ -92,6 +103,91 @@ export interface JsRtcDataChannelInit {
92
103
  protocol?: string
93
104
  negotiated?: number
94
105
  }
106
+ /** Init options for {@link RTCPeerConnection.addTransceiver}. */
107
+ export interface JsRtcRtpTransceiverInit {
108
+ direction?: string
109
+ }
110
+ export const enum JsEventDeliveryMode {
111
+ Callback = 'callback',
112
+ Stream = 'stream',
113
+ Both = 'both'
114
+ }
115
+ export interface JsEventsConfig {
116
+ mode?: JsEventDeliveryMode
117
+ }
118
+ export interface JsBargeInConfig {
119
+ enabled?: boolean
120
+ useVad?: boolean
121
+ flushTts?: boolean
122
+ }
123
+ export const enum JsVadSampleRate {
124
+ Hz8000 = '8000',
125
+ Hz16000 = '16000'
126
+ }
127
+ export interface JsVadConfig {
128
+ enabled?: boolean
129
+ provider?: string
130
+ threshold?: number
131
+ minSpeechDurationMs?: number
132
+ minSilenceDurationMs?: number
133
+ speechPadMs?: number
134
+ sampleRate?: JsVadSampleRate
135
+ bargeIn?: JsBargeInConfig
136
+ gateStt?: boolean
137
+ gateSttOpenOnPending?: boolean
138
+ sttGateHoldMs?: number
139
+ }
140
+ export const enum JsSttVendor {
141
+ Openai = 'openai',
142
+ Deepgram = 'deepgram',
143
+ Google = 'google',
144
+ Assemblyai = 'assemblyai',
145
+ LocalSherpa = 'local-sherpa',
146
+ Mock = 'mock'
147
+ }
148
+ export const enum JsTtsVendor {
149
+ Openai = 'openai',
150
+ Elevenlabs = 'elevenlabs',
151
+ Google = 'google',
152
+ Cartesia = 'cartesia',
153
+ LocalSherpa = 'local-sherpa',
154
+ Mock = 'mock'
155
+ }
156
+ export interface JsSttConfig {
157
+ provider: JsSttVendor
158
+ model?: string
159
+ modelPath?: string
160
+ language?: string
161
+ apiKey?: string
162
+ }
163
+ export interface JsTtsConfig {
164
+ provider: JsTtsVendor
165
+ model?: string
166
+ modelPath?: string
167
+ voice?: string
168
+ apiKey?: string
169
+ }
170
+ export interface JsVoiceAgentConfig {
171
+ vad?: JsVadConfig
172
+ events?: JsEventsConfig
173
+ stt?: JsSttConfig
174
+ tts?: JsTtsConfig
175
+ }
176
+ export const enum JsSpeechEventType {
177
+ UserSpeakingStart = 'user_speaking_start',
178
+ UserSpeakingEnd = 'user_speaking_end',
179
+ UserSpeechPartial = 'user_speech_partial',
180
+ UserSpeechFinal = 'user_speech_final',
181
+ AgentSpeakingStart = 'agent_speaking_start',
182
+ AgentSpeakingEnd = 'agent_speaking_end',
183
+ BargeIn = 'barge_in',
184
+ Error = 'error'
185
+ }
186
+ export interface JsSpeechEvent {
187
+ eventType: JsSpeechEventType
188
+ text?: string
189
+ error?: string
190
+ }
95
191
  export declare function version(): string
96
192
  /** One conference room with participant and mixing controls. */
97
193
  export declare class JsConferenceRoom {
@@ -146,18 +242,22 @@ export declare class JsRtcDataChannel {
146
242
  bufferedAmount(): Promise<number>
147
243
  send(data: string | Buffer): Promise<void>
148
244
  close(): Promise<void>
245
+ setBufferedAmountLowThreshold(threshold: number): void
246
+ setOnBufferedAmountLow(callback: (...args: any[]) => any): void
149
247
  setOnOpen(callback: (...args: any[]) => any): void
150
248
  setOnMessage(callback: (...args: any[]) => any): void
151
249
  setOnClose(callback: (...args: any[]) => any): void
152
250
  setOnError(callback: (...args: any[]) => any): void
153
251
  }
154
- /** Media stream track exposed to JavaScript (stub). */
252
+ /** Media stream track exposed to JavaScript. */
155
253
  export declare class JsMediaStreamTrack {
156
254
  get id(): string
157
255
  get kind(): string
158
256
  get streamId(): string
159
257
  get enabled(): boolean
160
258
  set enabled(enabled: boolean)
259
+ /** Decodes the next inbound Opus RTP packet to stereo PCM (remote audio only). */
260
+ readSample(): Promise<Buffer>
161
261
  }
162
262
  /** Media stream exposed to JavaScript (stub). */
163
263
  export declare class JsMediaStream {
@@ -182,15 +282,24 @@ export declare class JsPeerConnection {
182
282
  get iceConnectionState(): string
183
283
  get iceGatheringState(): string
184
284
  get signalingState(): string
185
- createOffer(): Promise<JsRtcSessionDescription>
186
- createAnswer(): Promise<JsRtcSessionDescription>
285
+ createOffer(options?: JsRtcOfferOptions | undefined | null): Promise<JsRtcSessionDescription>
286
+ createAnswer(options?: JsRtcAnswerOptions | undefined | null): Promise<JsRtcSessionDescription>
187
287
  setLocalDescription(desc: JsRtcSessionDescription): Promise<void>
188
288
  setRemoteDescription(desc: JsRtcSessionDescription): Promise<void>
189
289
  addIceCandidate(candidate: JsRtcIceCandidate): Promise<void>
190
- addTrack(track: JsLocalAudioTrack): Promise<void>
290
+ addTrack(track: JsLocalAudioTrack): Promise<JsRtpSender>
291
+ removeTrack(sender: JsRtpSender): Promise<void>
292
+ addTransceiver(kind?: string | undefined | null, track?: JsLocalAudioTrack | undefined | null, init?: JsRTCRtpTransceiverInit | undefined | null): Promise<JsRtpTransceiver>
293
+ getTransceivers(): Promise<Array<JsRtpTransceiver>>
294
+ getSenders(): Promise<Array<JsRtpSender>>
295
+ getReceivers(): Promise<Array<JsRtpReceiver>>
191
296
  createDataChannel(label: string, options?: JsRtcDataChannelInit | undefined | null): Promise<JsRtcDataChannel>
192
297
  close(): Promise<void>
193
298
  gatheringComplete(): Promise<void>
299
+ setConfiguration(config: JsRtcConfiguration): Promise<void>
300
+ getConfiguration(): Promise<JsRtcConfiguration>
301
+ restartIce(): Promise<void>
302
+ getStats(): Promise<string>
194
303
  localDescription(): Promise<JsRtcSessionDescription | null>
195
304
  remoteDescription(): Promise<JsRtcSessionDescription | null>
196
305
  setOnIceCandidate(callback: (...args: any[]) => any): void
@@ -198,5 +307,45 @@ export declare class JsPeerConnection {
198
307
  setOnDataChannel(callback: (...args: any[]) => any): void
199
308
  setOnConnectionStateChange(callback: (...args: any[]) => any): void
200
309
  setOnIceConnectionStateChange(callback: (...args: any[]) => any): void
310
+ setOnIceGatheringStateChange(callback: (...args: any[]) => any): void
311
+ setOnSignalingStateChange(callback: (...args: any[]) => any): void
201
312
  setOnNegotiationNeeded(callback: (...args: any[]) => any): void
202
313
  }
314
+ /** RTP receiver leg of an {@link RTCRtpTransceiver}. */
315
+ export declare class JsRtpReceiver {
316
+ get id(): string
317
+ get kind(): string
318
+ }
319
+ /** RTP sender returned from {@link RTCPeerConnection.addTrack}. */
320
+ export declare class JsRtpSender {
321
+ get id(): string
322
+ /** Replaces the outbound audio track without renegotiation. */
323
+ replaceTrack(track?: JsLocalAudioTrack | undefined | null): Promise<void>
324
+ }
325
+ /** Unified Plan transceiver (sender + receiver pair). */
326
+ export declare class JsRtpTransceiver {
327
+ get mid(): string | null
328
+ get direction(): string
329
+ get currentDirection(): string | null
330
+ get kind(): string
331
+ get stopped(): boolean
332
+ get sender(): JsRtpSender
333
+ get receiver(): JsRtpReceiver
334
+ setDirection(direction: string): Promise<void>
335
+ stop(): Promise<void>
336
+ }
337
+ /** Voice agent with VAD, STT/TTS orchestration for one peer connection session. */
338
+ export declare class JsVoiceAgent {
339
+ constructor(config?: JsVoiceAgentConfig | undefined | null)
340
+ /** Attaches outbound local audio track for TTS injection. */
341
+ attach(outboundTrack: JsLocalAudioTrack): Promise<void>
342
+ start(): Promise<void>
343
+ stop(): Promise<void>
344
+ sendTextToTts(text: string): Promise<void>
345
+ flushTts(): Promise<void>
346
+ /** Pull the next speech event for async stream consumption. */
347
+ pullSpeechEvent(): Promise<JsSpeechEvent | null>
348
+ setOnSpeechEvent(callback: (...args: any[]) => any): void
349
+ /** Processes one inbound PCM frame (48 kHz stereo) through VAD/STT. */
350
+ processInboundPcm(data: Buffer, durationMs: number): Promise<void>
351
+ }
package/index.js CHANGED
@@ -310,14 +310,42 @@ if (!nativeBinding) {
310
310
  throw new Error(`Failed to load native binding`)
311
311
  }
312
312
 
313
- const { JsConferenceRoom, JsConferenceServer, JsMuteScope, JsRtcDataChannel, JsMediaStreamTrack, JsMediaStream, JsLocalAudioTrack, JsPeerConnection, version } = nativeBinding
313
+ const {
314
+ JsConferenceRoom,
315
+ JsConferenceServer,
316
+ JsEventDeliveryMode,
317
+ JsLocalAudioTrack,
318
+ JsMediaStream,
319
+ JsMediaStreamTrack,
320
+ JsMuteScope,
321
+ JsPeerConnection,
322
+ JsRtcDataChannel,
323
+ JsRtpReceiver,
324
+ JsRtpSender,
325
+ JsRtpTransceiver,
326
+ JsSpeechEventType,
327
+ JsSttVendor,
328
+ JsTtsVendor,
329
+ JsVadSampleRate,
330
+ JsVoiceAgent,
331
+ version,
332
+ } = nativeBinding
314
333
 
315
334
  module.exports.JsConferenceRoom = JsConferenceRoom
316
335
  module.exports.JsConferenceServer = JsConferenceServer
317
- module.exports.JsMuteScope = JsMuteScope
318
- module.exports.JsRtcDataChannel = JsRtcDataChannel
319
- module.exports.JsMediaStreamTrack = JsMediaStreamTrack
320
- module.exports.JsMediaStream = JsMediaStream
336
+ module.exports.JsEventDeliveryMode = JsEventDeliveryMode
321
337
  module.exports.JsLocalAudioTrack = JsLocalAudioTrack
338
+ module.exports.JsMediaStream = JsMediaStream
339
+ module.exports.JsMediaStreamTrack = JsMediaStreamTrack
340
+ module.exports.JsMuteScope = JsMuteScope
322
341
  module.exports.JsPeerConnection = JsPeerConnection
342
+ module.exports.JsRtcDataChannel = JsRtcDataChannel
343
+ module.exports.JsRtpReceiver = JsRtpReceiver
344
+ module.exports.JsRtpSender = JsRtpSender
345
+ module.exports.JsRtpTransceiver = JsRtpTransceiver
346
+ module.exports.JsSpeechEventType = JsSpeechEventType
347
+ module.exports.JsSttVendor = JsSttVendor
348
+ module.exports.JsTtsVendor = JsTtsVendor
349
+ module.exports.JsVadSampleRate = JsVadSampleRate
350
+ module.exports.JsVoiceAgent = JsVoiceAgent
323
351
  module.exports.version = version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-webrtc-rust/bindings",
3
- "version": "0.2.1",
3
+ "version": "0.3.2",
4
4
  "description": "NAPI-RS native bindings for node-webrtc-rust — WebRTC peer connections, data channels, and conference audio mixing",
5
5
  "keywords": [
6
6
  "webrtc",
@@ -58,12 +58,12 @@
58
58
  "@napi-rs/cli": "^2.18.0"
59
59
  },
60
60
  "optionalDependencies": {
61
- "@node-webrtc-rust/bindings-darwin-arm64": "0.2.1",
62
- "@node-webrtc-rust/bindings-darwin-x64": "0.2.1",
63
- "@node-webrtc-rust/bindings-linux-arm64-gnu": "0.2.1",
64
- "@node-webrtc-rust/bindings-linux-x64-gnu": "0.2.1",
65
- "@node-webrtc-rust/bindings-linux-x64-musl": "0.2.1",
66
- "@node-webrtc-rust/bindings-win32-x64-msvc": "0.2.1"
61
+ "@node-webrtc-rust/bindings-win32-x64-msvc": "0.3.2",
62
+ "@node-webrtc-rust/bindings-darwin-x64": "0.3.2",
63
+ "@node-webrtc-rust/bindings-linux-x64-gnu": "0.3.2",
64
+ "@node-webrtc-rust/bindings-darwin-arm64": "0.3.2",
65
+ "@node-webrtc-rust/bindings-linux-arm64-gnu": "0.3.2",
66
+ "@node-webrtc-rust/bindings-linux-x64-musl": "0.3.2"
67
67
  },
68
68
  "engines": {
69
69
  "node": ">=18"