@livekit/rtc-node 0.13.7 → 0.13.9
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/dist/audio_stream.cjs +1 -0
- package/dist/audio_stream.cjs.map +1 -1
- package/dist/audio_stream.d.ts.map +1 -1
- package/dist/audio_stream.js +1 -0
- package/dist/audio_stream.js.map +1 -1
- package/dist/participant.cjs +1 -1
- package/dist/participant.cjs.map +1 -1
- package/dist/participant.d.cts +1 -0
- package/dist/participant.d.ts +1 -0
- package/dist/participant.d.ts.map +1 -1
- package/dist/participant.js +1 -1
- package/dist/participant.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/video_source.cjs +6 -0
- package/dist/video_source.cjs.map +1 -1
- package/dist/video_source.d.cts +2 -0
- package/dist/video_source.d.ts +2 -0
- package/dist/video_source.d.ts.map +1 -1
- package/dist/video_source.js +6 -0
- package/dist/video_source.js.map +1 -1
- package/dist/video_stream.cjs +1 -0
- package/dist/video_stream.cjs.map +1 -1
- package/dist/video_stream.d.ts.map +1 -1
- package/dist/video_stream.js +1 -0
- package/dist/video_stream.js.map +1 -1
- package/package.json +6 -6
- package/src/audio_stream.ts +1 -0
- package/src/nodejs.rs +12 -5
- package/src/participant.ts +2 -1
- package/src/version.ts +1 -1
- package/src/video_source.ts +6 -0
- package/src/video_stream.ts +1 -0
package/dist/audio_stream.cjs
CHANGED
|
@@ -43,6 +43,7 @@ class AudioStream {
|
|
|
43
43
|
const frame = import_audio_frame.AudioFrame.fromOwnedInfo(streamEvent.value.frame);
|
|
44
44
|
if (this.queueResolve) {
|
|
45
45
|
this.queueResolve({ done: false, value: frame });
|
|
46
|
+
this.queueResolve = null;
|
|
46
47
|
} else {
|
|
47
48
|
this.eventQueue.push(frame);
|
|
48
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/audio_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport { AudioFrame } from './audio_frame.js';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type { AudioStreamInfo, NewAudioStreamResponse } from './proto/audio_frame_pb.js';\nimport { AudioStreamType, NewAudioStreamRequest } from './proto/audio_frame_pb.js';\nimport type { Track } from './track.js';\n\nexport class AudioStream implements AsyncIterableIterator<AudioFrame> {\n /** @internal */\n info: AudioStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (AudioFrame | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<AudioFrame>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n sampleRate: number;\n numChannels: number;\n\n constructor(track: Track, sampleRate: number = 48000, numChannels: number = 1) {\n this.track = track;\n this.sampleRate = sampleRate;\n this.numChannels = numChannels;\n\n const req = new NewAudioStreamRequest({\n type: AudioStreamType.AUDIO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n sampleRate: sampleRate,\n numChannels: numChannels,\n });\n\n const res = FfiClient.instance.request<NewAudioStreamResponse>({\n message: {\n case: 'newAudioStream',\n value: req,\n },\n });\n\n this.info = res.stream!.info!;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'audioStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const frame = AudioFrame.fromOwnedInfo(streamEvent.value.frame!);\n if (this.queueResolve) {\n this.queueResolve({ done: false, value: frame });\n } else {\n this.eventQueue.push(frame);\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<AudioFrame>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<AudioFrame>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): AudioStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsB;AACtB,yBAA2B;AAE3B,wBAAqD;AAErD,4BAAuD;AAGhD,MAAM,YAAyD;AAAA,EAgBpE,YAAY,OAAc,aAAqB,MAAO,cAAsB,GAAG;AAV/E;AAAA,sBAAoC,CAAC;AAErC;AAAA,wBAAqE;AAErE;AAAA,iBAAQ,IAAI,mBAAM;AA+BlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,QAAQ,8BAAW,cAAc,YAAY,MAAM,KAAM;AAC/D,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/audio_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport { AudioFrame } from './audio_frame.js';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type { AudioStreamInfo, NewAudioStreamResponse } from './proto/audio_frame_pb.js';\nimport { AudioStreamType, NewAudioStreamRequest } from './proto/audio_frame_pb.js';\nimport type { Track } from './track.js';\n\nexport class AudioStream implements AsyncIterableIterator<AudioFrame> {\n /** @internal */\n info: AudioStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (AudioFrame | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<AudioFrame>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n sampleRate: number;\n numChannels: number;\n\n constructor(track: Track, sampleRate: number = 48000, numChannels: number = 1) {\n this.track = track;\n this.sampleRate = sampleRate;\n this.numChannels = numChannels;\n\n const req = new NewAudioStreamRequest({\n type: AudioStreamType.AUDIO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n sampleRate: sampleRate,\n numChannels: numChannels,\n });\n\n const res = FfiClient.instance.request<NewAudioStreamResponse>({\n message: {\n case: 'newAudioStream',\n value: req,\n },\n });\n\n this.info = res.stream!.info!;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'audioStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const frame = AudioFrame.fromOwnedInfo(streamEvent.value.frame!);\n if (this.queueResolve) {\n this.queueResolve({ done: false, value: frame });\n this.queueResolve = null;\n } else {\n this.eventQueue.push(frame);\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<AudioFrame>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<AudioFrame>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): AudioStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsB;AACtB,yBAA2B;AAE3B,wBAAqD;AAErD,4BAAuD;AAGhD,MAAM,YAAyD;AAAA,EAgBpE,YAAY,OAAc,aAAqB,MAAO,cAAsB,GAAG;AAV/E;AAAA,sBAAoC,CAAC;AAErC;AAAA,wBAAqE;AAErE;AAAA,iBAAQ,IAAI,mBAAM;AA+BlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,QAAQ,8BAAW,cAAc,YAAY,MAAM,KAAM;AAC/D,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC;AAC/C,iBAAK,eAAe;AAAA,UACtB,OAAO;AACL,iBAAK,WAAW,KAAK,KAAK;AAAA,UAC5B;AACA;AAAA,QACF,KAAK;AACH,sCAAU,SAAS,IAAI,iCAAe,UAAU,KAAK,OAAO;AAC5D;AAAA,MACJ;AAAA,IACF;AA/CE,SAAK,QAAQ;AACb,SAAK,aAAa;AAClB,SAAK,cAAc;AAEnB,UAAM,MAAM,IAAI,4CAAsB;AAAA,MACpC,MAAM,sCAAgB;AAAA,MACtB,aAAa,MAAM,WAAW;AAAA,MAC9B;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,MAAM,4BAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,OAAO,IAAI,OAAQ;AACxB,SAAK,YAAY,IAAI,4BAAU,IAAI,OAAQ,OAAQ,EAAG;AAEtD,gCAAU,SAAS,GAAG,iCAAe,UAAU,KAAK,OAAO;AAAA,EAC7D;AAAA,EA2BA,MAAM,OAA4C;AAChD,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AACrC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,aAAO;AACP,YAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,UAAI,OAAO;AACT,eAAO,EAAE,MAAM,OAAO,MAAM;AAAA,MAC9B,OAAO;AACL,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAAA,IACF;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,CAAC,YAAa,KAAK,eAAe;AAAA,IACpC;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,SAAK,WAAW,KAAK,IAAI;AACzB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAiB;AACpC,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio_stream.d.ts","sourceRoot":"","sources":["../src/audio_stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,2BAA2B,CAAC;AAEzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,WAAY,YAAW,qBAAqB,CAAC,UAAU,CAAC;IACnE,gBAAgB;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,UAAU,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAM;IACvC,gBAAgB;IAChB,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC1E,gBAAgB;IAChB,KAAK,QAAe;IAEpB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;gBAER,KAAK,EAAE,KAAK,EAAE,UAAU,GAAE,MAAc,EAAE,WAAW,GAAE,MAAU;IAyB7E,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"audio_stream.d.ts","sourceRoot":"","sources":["../src/audio_stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,2BAA2B,CAAC;AAEzF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,WAAY,YAAW,qBAAqB,CAAC,UAAU,CAAC;IACnE,gBAAgB;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,UAAU,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAM;IACvC,gBAAgB;IAChB,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC1E,gBAAgB;IAChB,KAAK,QAAe;IAEpB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;gBAER,KAAK,EAAE,KAAK,EAAE,UAAU,GAAE,MAAc,EAAE,WAAW,GAAE,MAAU;IAyB7E,OAAO,CAAC,OAAO,CAuBb;IAEI,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAkBjD,KAAK;IAKL,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW;CAGtC"}
|
package/dist/audio_stream.js
CHANGED
package/dist/audio_stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/audio_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport { AudioFrame } from './audio_frame.js';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type { AudioStreamInfo, NewAudioStreamResponse } from './proto/audio_frame_pb.js';\nimport { AudioStreamType, NewAudioStreamRequest } from './proto/audio_frame_pb.js';\nimport type { Track } from './track.js';\n\nexport class AudioStream implements AsyncIterableIterator<AudioFrame> {\n /** @internal */\n info: AudioStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (AudioFrame | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<AudioFrame>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n sampleRate: number;\n numChannels: number;\n\n constructor(track: Track, sampleRate: number = 48000, numChannels: number = 1) {\n this.track = track;\n this.sampleRate = sampleRate;\n this.numChannels = numChannels;\n\n const req = new NewAudioStreamRequest({\n type: AudioStreamType.AUDIO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n sampleRate: sampleRate,\n numChannels: numChannels,\n });\n\n const res = FfiClient.instance.request<NewAudioStreamResponse>({\n message: {\n case: 'newAudioStream',\n value: req,\n },\n });\n\n this.info = res.stream!.info!;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'audioStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const frame = AudioFrame.fromOwnedInfo(streamEvent.value.frame!);\n if (this.queueResolve) {\n this.queueResolve({ done: false, value: frame });\n } else {\n this.eventQueue.push(frame);\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<AudioFrame>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<AudioFrame>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): AudioStream {\n return this;\n }\n}\n"],"mappings":"AAGA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAE3B,SAAS,WAAW,gBAAgB,iBAAiB;AAErD,SAAS,iBAAiB,6BAA6B;AAGhD,MAAM,YAAyD;AAAA,EAgBpE,YAAY,OAAc,aAAqB,MAAO,cAAsB,GAAG;AAV/E;AAAA,sBAAoC,CAAC;AAErC;AAAA,wBAAqE;AAErE;AAAA,iBAAQ,IAAI,MAAM;AA+BlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,QAAQ,WAAW,cAAc,YAAY,MAAM,KAAM;AAC/D,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/audio_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport { AudioFrame } from './audio_frame.js';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type { AudioStreamInfo, NewAudioStreamResponse } from './proto/audio_frame_pb.js';\nimport { AudioStreamType, NewAudioStreamRequest } from './proto/audio_frame_pb.js';\nimport type { Track } from './track.js';\n\nexport class AudioStream implements AsyncIterableIterator<AudioFrame> {\n /** @internal */\n info: AudioStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (AudioFrame | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<AudioFrame>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n sampleRate: number;\n numChannels: number;\n\n constructor(track: Track, sampleRate: number = 48000, numChannels: number = 1) {\n this.track = track;\n this.sampleRate = sampleRate;\n this.numChannels = numChannels;\n\n const req = new NewAudioStreamRequest({\n type: AudioStreamType.AUDIO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n sampleRate: sampleRate,\n numChannels: numChannels,\n });\n\n const res = FfiClient.instance.request<NewAudioStreamResponse>({\n message: {\n case: 'newAudioStream',\n value: req,\n },\n });\n\n this.info = res.stream!.info!;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'audioStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const frame = AudioFrame.fromOwnedInfo(streamEvent.value.frame!);\n if (this.queueResolve) {\n this.queueResolve({ done: false, value: frame });\n this.queueResolve = null;\n } else {\n this.eventQueue.push(frame);\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<AudioFrame>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<AudioFrame>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): AudioStream {\n return this;\n }\n}\n"],"mappings":"AAGA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAE3B,SAAS,WAAW,gBAAgB,iBAAiB;AAErD,SAAS,iBAAiB,6BAA6B;AAGhD,MAAM,YAAyD;AAAA,EAgBpE,YAAY,OAAc,aAAqB,MAAO,cAAsB,GAAG;AAV/E;AAAA,sBAAoC,CAAC;AAErC;AAAA,wBAAqE;AAErE;AAAA,iBAAQ,IAAI,MAAM;AA+BlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,QAAQ,WAAW,cAAc,YAAY,MAAM,KAAM;AAC/D,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC;AAC/C,iBAAK,eAAe;AAAA,UACtB,OAAO;AACL,iBAAK,WAAW,KAAK,KAAK;AAAA,UAC5B;AACA;AAAA,QACF,KAAK;AACH,oBAAU,SAAS,IAAI,eAAe,UAAU,KAAK,OAAO;AAC5D;AAAA,MACJ;AAAA,IACF;AA/CE,SAAK,QAAQ;AACb,SAAK,aAAa;AAClB,SAAK,cAAc;AAEnB,UAAM,MAAM,IAAI,sBAAsB;AAAA,MACpC,MAAM,gBAAgB;AAAA,MACtB,aAAa,MAAM,WAAW;AAAA,MAC9B;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,OAAO,IAAI,OAAQ;AACxB,SAAK,YAAY,IAAI,UAAU,IAAI,OAAQ,OAAQ,EAAG;AAEtD,cAAU,SAAS,GAAG,eAAe,UAAU,KAAK,OAAO;AAAA,EAC7D;AAAA,EA2BA,MAAM,OAA4C;AAChD,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AACrC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,aAAO;AACP,YAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,UAAI,OAAO;AACT,eAAO,EAAE,MAAM,OAAO,MAAM;AAAA,MAC9B,OAAO;AACL,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAAA,IACF;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,CAAC,YAAa,KAAK,eAAe;AAAA,IACpC;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,SAAK,WAAW,KAAK,IAAI;AACzB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAiB;AACpC,WAAO;AAAA,EACT;AACF;","names":[]}
|
package/dist/participant.cjs
CHANGED
|
@@ -152,7 +152,7 @@ class LocalParticipant extends Participant {
|
|
|
152
152
|
* Well suited for TTS and/or streaming LLM output. If you want to simply send a text then use sendText() instead
|
|
153
153
|
*/
|
|
154
154
|
async streamText(options) {
|
|
155
|
-
const senderIdentity = this.identity;
|
|
155
|
+
const senderIdentity = (options == null ? void 0 : options.senderIdentity) ?? this.identity;
|
|
156
156
|
const streamId = (options == null ? void 0 : options.streamId) ?? crypto.randomUUID();
|
|
157
157
|
const destinationIdentities = options == null ? void 0 : options.destinationIdentities;
|
|
158
158
|
const info = {
|
package/dist/participant.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { PathLike } from 'node:fs';\nimport { open, stat } from 'node:fs/promises';\nimport {\n type ByteStreamInfo,\n type ByteStreamOptions,\n ByteStreamWriter,\n type TextStreamInfo,\n TextStreamWriter,\n} from './data_streams/index.js';\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport { log } from './log.js';\nimport {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n ParticipantKind,\n} from './proto/participant_pb.js';\nimport {\n DataStream_ByteHeader,\n DataStream_Chunk,\n DataStream_Header,\n DataStream_OperationType,\n DataStream_TextHeader,\n DataStream_Trailer,\n type PublishDataCallback,\n type PublishDataResponse,\n type PublishSipDtmfCallback,\n type PublishSipDtmfResponse,\n type PublishTrackCallback,\n type PublishTrackResponse,\n type PublishTranscriptionCallback,\n type PublishTranscriptionResponse,\n type SendChatMessageCallback,\n type SendChatMessageResponse,\n type SendStreamChunkCallback,\n SendStreamChunkRequest,\n type SendStreamChunkResponse,\n type SendStreamHeaderCallback,\n SendStreamHeaderRequest,\n type SendStreamHeaderResponse,\n type SendStreamTrailerCallback,\n SendStreamTrailerRequest,\n type SendStreamTrailerResponse,\n type SetLocalAttributesCallback,\n type SetLocalAttributesResponse,\n type SetLocalMetadataCallback,\n type SetLocalMetadataResponse,\n type SetLocalNameCallback,\n type SetLocalNameResponse,\n type TrackPublishOptions,\n type UnpublishTrackCallback,\n type UnpublishTrackResponse,\n} from './proto/room_pb.js';\nimport { ChatMessage as ChatMessageModel } from './proto/room_pb.js';\nimport {\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n PublishDataRequest,\n PublishSipDtmfRequest,\n PublishTrackRequest,\n PublishTranscriptionRequest,\n SendChatMessageRequest,\n SetLocalAttributesRequest,\n SetLocalMetadataRequest,\n SetLocalNameRequest,\n UnpublishTrackRequest,\n} from './proto/room_pb.js';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from './proto/rpc_pb.js';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\n} from './proto/rpc_pb.js';\nimport { type PerformRpcParams, RpcError, type RpcInvocationData } from './rpc.js';\nimport type { LocalTrack } from './track.js';\nimport type { RemoteTrackPublication, TrackPublication } from './track_publication.js';\nimport { LocalTrackPublication } from './track_publication.js';\nimport type { Transcription } from './transcription.js';\nimport type { ChatMessage } from './types.js';\nimport { numberToBigInt, splitUtf8 } from './utils.js';\n\nconst STREAM_CHUNK_SIZE = 15_000;\n\nexport abstract class Participant {\n /** @internal */\n info: ParticipantInfo;\n\n /** @internal */\n ffi_handle: FfiHandle;\n\n trackPublications = new Map<string, TrackPublication>();\n\n constructor(owned_info: OwnedParticipant) {\n this.info = owned_info!.info!;\n this.ffi_handle = new FfiHandle(owned_info.handle!.id!);\n }\n\n get sid(): string | undefined {\n return this.info.sid;\n }\n\n get name(): string | undefined {\n return this.info.name;\n }\n\n get identity(): string {\n return this.info.identity ?? '';\n }\n\n get metadata(): string {\n return this.info.metadata ?? '';\n }\n\n get attributes(): Record<string, string> {\n return this.info.attributes ?? {};\n }\n\n get kind(): ParticipantKind {\n return this.info.kind ?? ParticipantKind.STANDARD;\n }\n\n get disconnectReason(): DisconnectReason | undefined {\n if (this.info.disconnectReason === DisconnectReason.UNKNOWN_REASON) {\n return undefined;\n }\n return this.info.disconnectReason;\n }\n}\n\nexport type DataPublishOptions = {\n /**\n * whether to send this as reliable or lossy.\n * For data that you need delivery guarantee (such as chat messages), use Reliable.\n * For data that should arrive as quickly as possible, but you are ok with dropped\n * packets, use Lossy.\n */\n reliable?: boolean;\n /**\n * the identities of participants who will receive the message, will be sent to every one if empty\n */\n destination_identities?: string[];\n /** the topic under which the message gets published */\n topic?: string;\n};\n\nexport class LocalParticipant extends Participant {\n private rpcHandlers: Map<string, (data: RpcInvocationData) => Promise<string>> = new Map();\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n async publishData(data: Uint8Array, options: DataPublishOptions) {\n const req = new PublishDataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n dataPtr: FfiClient.instance.retrievePtr(data),\n dataLen: BigInt(data.byteLength),\n reliable: options.reliable,\n topic: options.topic,\n destinationIdentities: options.destination_identities,\n });\n\n const res = FfiClient.instance.request<PublishDataResponse>({\n message: { case: 'publishData', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishDataCallback>((ev) => {\n return ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishDtmf(code: number, digit: string) {\n const req = new PublishSipDtmfRequest({\n localParticipantHandle: this.ffi_handle.handle,\n code,\n digit,\n });\n\n const res = FfiClient.instance.request<PublishSipDtmfResponse>({\n message: { case: 'publishSipDtmf', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishSipDtmfCallback>((ev) => {\n return ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishTranscription(transcription: Transcription) {\n const req = new PublishTranscriptionRequest({\n localParticipantHandle: this.ffi_handle.handle,\n participantIdentity: transcription.participantIdentity,\n segments: transcription.segments.map(\n (s) =>\n new ProtoTranscriptionSegment({\n id: s.id,\n text: s.text,\n startTime: s.startTime,\n endTime: s.endTime,\n final: s.final,\n language: s.language,\n }),\n ),\n trackId: transcription.trackSid,\n });\n\n const res = FfiClient.instance.request<PublishTranscriptionResponse>({\n message: { case: 'publishTranscription', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTranscriptionCallback>((ev) => {\n return ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async updateMetadata(metadata: string) {\n const req = new SetLocalMetadataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n metadata: metadata,\n });\n\n const res = FfiClient.instance.request<SetLocalMetadataResponse>({\n message: { case: 'setLocalMetadata', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalMetadataCallback>((ev) => {\n return ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n /**\n * Returns a `StreamWriter` instance that allows to write individual chunks of text to a stream.\n * Well suited for TTS and/or streaming LLM output. If you want to simply send a text then use sendText() instead\n */\n async streamText(options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n }): Promise<TextStreamWriter> {\n const senderIdentity = this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: TextStreamInfo = {\n streamId: streamId,\n mimeType: 'text/plain',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: options?.attributes,\n contentHeader: {\n case: 'textHeader',\n value: new DataStream_TextHeader({\n operationType: DataStream_OperationType.CREATE,\n version: 0,\n replyToStreamId: '',\n generated: false,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let nextChunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n\n const writableStream = new WritableStream<string>({\n // Implement the sink\n async write(text) {\n for (const textByteChunk of splitUtf8(text, STREAM_CHUNK_SIZE)) {\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: textByteChunk,\n streamId,\n chunkIndex: numberToBigInt(nextChunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n nextChunkId += 1;\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const writer = new TextStreamWriter(writableStream, info);\n\n return writer;\n }\n\n async sendText(\n text: string,\n options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n },\n ) {\n const writer = await this.streamText(options);\n await writer.write(text);\n await writer.close();\n return writer.info;\n }\n\n async streamBytes(options?: {\n name?: string;\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n mimeType?: string;\n totalSize?: number;\n }) {\n const senderIdentity = this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: ByteStreamInfo = {\n streamId: streamId,\n mimeType: options?.mimeType ?? 'application/octet-stream',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n attributes: options?.attributes,\n totalSize: options?.totalSize,\n name: options?.name ?? 'unknown',\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: info.attributes,\n totalLength: numberToBigInt(info.totalSize),\n contentHeader: {\n case: 'byteHeader',\n value: new DataStream_ByteHeader({\n name: info.name,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let chunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n const writeMutex = new Mutex();\n\n const writableStream = new WritableStream<Uint8Array>({\n async write(chunk) {\n const unlock = await writeMutex.lock();\n\n let byteOffset = 0;\n try {\n while (byteOffset < chunk.byteLength) {\n const subChunk = chunk.slice(byteOffset, byteOffset + STREAM_CHUNK_SIZE);\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: subChunk,\n streamId,\n chunkIndex: numberToBigInt(chunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n chunkId += 1;\n byteOffset += subChunk.byteLength;\n }\n } finally {\n unlock();\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const byteWriter = new ByteStreamWriter(writableStream, info);\n\n return byteWriter;\n }\n\n /** Sends a file provided as PathLike to specified recipients */\n async sendFile(path: PathLike, options?: ByteStreamOptions) {\n const fileStats = await stat(path);\n const file = await open(path);\n try {\n const stream: ReadableStream<Uint8Array> = file.readableWebStream({ type: 'bytes' });\n const streamId = crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const writer = await this.streamBytes({\n streamId: streamId,\n name: options?.name,\n totalSize: fileStats.size,\n destinationIdentities,\n topic: options?.topic,\n mimeType: options?.mimeType,\n attributes: options?.attributes,\n });\n\n for await (const chunk of stream) {\n await writer.write(chunk);\n }\n await writer.close();\n } finally {\n await file.close();\n }\n }\n\n private async sendStreamHeader(req: SendStreamHeaderRequest) {\n const type = 'sendStreamHeader';\n const res = FfiClient.instance.request<SendStreamHeaderResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamHeaderCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamChunk(req: SendStreamChunkRequest) {\n const type = 'sendStreamChunk';\n const res = FfiClient.instance.request<SendStreamChunkResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamChunkCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamTrailer(req: SendStreamTrailerRequest) {\n const type = 'sendStreamTrailer';\n const res = FfiClient.instance.request<SendStreamTrailerResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamTrailerCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n /**\n * Sends a chat message to participants in the room\n *\n * @param text - The text content of the chat message.\n * @param destinationIdentities - An optional array of recipient identities to whom the message will be sent. If omitted, the message is broadcast to all participants.\n * @param senderIdentity - An optional identity of the sender. If omitted, the default sender identity is used.\n *\n */\n async sendChatMessage(\n text: string,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new SendChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n message: text,\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'sendChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n /**\n * @experimental\n */\n async editChatMessage(\n editText: string,\n originalMessage: ChatMessage,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new EditChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n editText,\n originalMessage: new ChatMessageModel({\n ...originalMessage,\n timestamp: BigInt(originalMessage.timestamp),\n editTimestamp: originalMessage.editTimestamp\n ? BigInt(originalMessage.editTimestamp)\n : undefined,\n }),\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'editChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async updateName(name: string) {\n const req = new SetLocalNameRequest({\n localParticipantHandle: this.ffi_handle.handle,\n name: name,\n });\n\n const res = FfiClient.instance.request<SetLocalNameResponse>({\n message: { case: 'setLocalName', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalNameCallback>((ev) => {\n return ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async setAttributes(attributes: Record<string, string>) {\n const req = new SetLocalAttributesRequest({\n localParticipantHandle: this.ffi_handle.handle,\n attributes: Object.entries(attributes).map(([key, value]) => ({ key, value })),\n });\n\n const res = FfiClient.instance.request<SetLocalAttributesResponse>({\n message: { case: 'setLocalAttributes', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalAttributesCallback>((ev) => {\n return ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async publishTrack(\n track: LocalTrack,\n options: TrackPublishOptions,\n ): Promise<LocalTrackPublication> {\n const req = new PublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackHandle: track.ffi_handle.handle,\n options: options,\n });\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>((ev) => {\n return ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'publication':\n const track_publication = new LocalTrackPublication(cb.message.value!);\n track_publication.track = track;\n this.trackPublications.set(track_publication.sid!, track_publication);\n\n return track_publication;\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const req = new UnpublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackSid: trackSid,\n stopOnUnpublish: stopOnUnpublish ?? true,\n });\n\n const res = FfiClient.instance.request<UnpublishTrackResponse>({\n message: { case: 'unpublishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<UnpublishTrackCallback>((ev) => {\n return ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n\n const pub = this.trackPublications.get(trackSid);\n if (pub) {\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n }\n\n /**\n * Initiate an RPC call to a remote participant.\n * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n * @returns A promise that resolves with the response payload or rejects with an error.\n * @throws Error on failure. Details in `message`.\n */\n async performRpc({\n destinationIdentity,\n method,\n payload,\n responseTimeout,\n }: PerformRpcParams): Promise<string> {\n const req = new PerformRpcRequest({\n localParticipantHandle: this.ffi_handle.handle,\n destinationIdentity,\n method,\n payload,\n responseTimeoutMs: responseTimeout,\n });\n\n const res = FfiClient.instance.request<PerformRpcResponse>({\n message: { case: 'performRpc', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PerformRpcCallback>((ev) => {\n return ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId;\n });\n\n if (cb.error) {\n throw RpcError.fromProto(cb.error);\n }\n\n return cb.payload!;\n }\n\n /**\n * Establishes the participant as a receiver for calls of the specified RPC method.\n * Will overwrite any existing callback for the same method.\n *\n * @param method - The name of the indicated RPC method\n * @param handler - Will be invoked when an RPC request for this method is received\n * @returns A promise that resolves when the method is successfully registered\n *\n * @example\n * ```typescript\n * room.localParticipant?.registerRpcMethod(\n * 'greet',\n * async (data: RpcInvocationData) => {\n * console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n * return `Hello, ${data.callerIdentity}!`;\n * }\n * );\n * ```\n *\n * See {@link RpcInvocationData} for more details on invocation params.\n *\n * The handler should return a Promise that resolves to a string.\n * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n *\n * You may throw errors of type `RpcError` with a string `message` in the handler,\n * and they will be received on the caller's side with the message intact.\n * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n */\n registerRpcMethod(method: string, handler: (data: RpcInvocationData) => Promise<string>) {\n this.rpcHandlers.set(method, handler);\n\n const req = new RegisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<RegisterRpcMethodResponse>({\n message: { case: 'registerRpcMethod', value: req },\n });\n }\n\n /**\n * Unregisters a previously registered RPC method.\n *\n * @param method - The name of the RPC method to unregister\n */\n unregisterRpcMethod(method: string) {\n this.rpcHandlers.delete(method);\n\n const req = new UnregisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<UnregisterRpcMethodResponse>({\n message: { case: 'unregisterRpcMethod', value: req },\n });\n }\n\n /** @internal */\n async handleRpcMethodInvocation(\n invocationId: bigint,\n method: string,\n requestId: string,\n callerIdentity: string,\n payload: string,\n responseTimeout: number,\n ) {\n let responseError: RpcError | null = null;\n let responsePayload: string | null = null;\n\n const handler = this.rpcHandlers.get(method);\n\n if (!handler) {\n responseError = RpcError.builtIn('UNSUPPORTED_METHOD');\n } else {\n try {\n responsePayload = await handler({ requestId, callerIdentity, payload, responseTimeout });\n } catch (error) {\n if (error instanceof RpcError) {\n responseError = error;\n } else {\n console.warn(\n `Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,\n error,\n );\n responseError = RpcError.builtIn('APPLICATION_ERROR');\n }\n }\n }\n\n const req = new RpcMethodInvocationResponseRequest({\n localParticipantHandle: this.ffi_handle.handle,\n invocationId,\n error: responseError ? responseError.toProto() : undefined,\n payload: responsePayload ?? undefined,\n });\n\n const res = FfiClient.instance.request<RpcMethodInvocationResponseResponse>({\n message: { case: 'rpcMethodInvocationResponse', value: req },\n });\n\n if (res.error) {\n console.warn(`error sending rpc method invocation response: ${res.error}`);\n }\n }\n}\n\nexport class RemoteParticipant extends Participant {\n trackPublications: Map<string, RemoteTrackPublication> = new Map();\n\n constructor(owned_info: OwnedParticipant) {\n super(owned_info);\n }\n}\n"],"mappings":"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","names":["import_room_pb","ProtoTranscriptionSegment","ChatMessageModel"]}
|
|
1
|
+
{"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { PathLike } from 'node:fs';\nimport { open, stat } from 'node:fs/promises';\nimport {\n type ByteStreamInfo,\n type ByteStreamOptions,\n ByteStreamWriter,\n type TextStreamInfo,\n TextStreamWriter,\n} from './data_streams/index.js';\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport { log } from './log.js';\nimport {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n ParticipantKind,\n} from './proto/participant_pb.js';\nimport {\n DataStream_ByteHeader,\n DataStream_Chunk,\n DataStream_Header,\n DataStream_OperationType,\n DataStream_TextHeader,\n DataStream_Trailer,\n type PublishDataCallback,\n type PublishDataResponse,\n type PublishSipDtmfCallback,\n type PublishSipDtmfResponse,\n type PublishTrackCallback,\n type PublishTrackResponse,\n type PublishTranscriptionCallback,\n type PublishTranscriptionResponse,\n type SendChatMessageCallback,\n type SendChatMessageResponse,\n type SendStreamChunkCallback,\n SendStreamChunkRequest,\n type SendStreamChunkResponse,\n type SendStreamHeaderCallback,\n SendStreamHeaderRequest,\n type SendStreamHeaderResponse,\n type SendStreamTrailerCallback,\n SendStreamTrailerRequest,\n type SendStreamTrailerResponse,\n type SetLocalAttributesCallback,\n type SetLocalAttributesResponse,\n type SetLocalMetadataCallback,\n type SetLocalMetadataResponse,\n type SetLocalNameCallback,\n type SetLocalNameResponse,\n type TrackPublishOptions,\n type UnpublishTrackCallback,\n type UnpublishTrackResponse,\n} from './proto/room_pb.js';\nimport { ChatMessage as ChatMessageModel } from './proto/room_pb.js';\nimport {\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n PublishDataRequest,\n PublishSipDtmfRequest,\n PublishTrackRequest,\n PublishTranscriptionRequest,\n SendChatMessageRequest,\n SetLocalAttributesRequest,\n SetLocalMetadataRequest,\n SetLocalNameRequest,\n UnpublishTrackRequest,\n} from './proto/room_pb.js';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from './proto/rpc_pb.js';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\n} from './proto/rpc_pb.js';\nimport { type PerformRpcParams, RpcError, type RpcInvocationData } from './rpc.js';\nimport type { LocalTrack } from './track.js';\nimport type { RemoteTrackPublication, TrackPublication } from './track_publication.js';\nimport { LocalTrackPublication } from './track_publication.js';\nimport type { Transcription } from './transcription.js';\nimport type { ChatMessage } from './types.js';\nimport { numberToBigInt, splitUtf8 } from './utils.js';\n\nconst STREAM_CHUNK_SIZE = 15_000;\n\nexport abstract class Participant {\n /** @internal */\n info: ParticipantInfo;\n\n /** @internal */\n ffi_handle: FfiHandle;\n\n trackPublications = new Map<string, TrackPublication>();\n\n constructor(owned_info: OwnedParticipant) {\n this.info = owned_info!.info!;\n this.ffi_handle = new FfiHandle(owned_info.handle!.id!);\n }\n\n get sid(): string | undefined {\n return this.info.sid;\n }\n\n get name(): string | undefined {\n return this.info.name;\n }\n\n get identity(): string {\n return this.info.identity ?? '';\n }\n\n get metadata(): string {\n return this.info.metadata ?? '';\n }\n\n get attributes(): Record<string, string> {\n return this.info.attributes ?? {};\n }\n\n get kind(): ParticipantKind {\n return this.info.kind ?? ParticipantKind.STANDARD;\n }\n\n get disconnectReason(): DisconnectReason | undefined {\n if (this.info.disconnectReason === DisconnectReason.UNKNOWN_REASON) {\n return undefined;\n }\n return this.info.disconnectReason;\n }\n}\n\nexport type DataPublishOptions = {\n /**\n * whether to send this as reliable or lossy.\n * For data that you need delivery guarantee (such as chat messages), use Reliable.\n * For data that should arrive as quickly as possible, but you are ok with dropped\n * packets, use Lossy.\n */\n reliable?: boolean;\n /**\n * the identities of participants who will receive the message, will be sent to every one if empty\n */\n destination_identities?: string[];\n /** the topic under which the message gets published */\n topic?: string;\n};\n\nexport class LocalParticipant extends Participant {\n private rpcHandlers: Map<string, (data: RpcInvocationData) => Promise<string>> = new Map();\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n async publishData(data: Uint8Array, options: DataPublishOptions) {\n const req = new PublishDataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n dataPtr: FfiClient.instance.retrievePtr(data),\n dataLen: BigInt(data.byteLength),\n reliable: options.reliable,\n topic: options.topic,\n destinationIdentities: options.destination_identities,\n });\n\n const res = FfiClient.instance.request<PublishDataResponse>({\n message: { case: 'publishData', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishDataCallback>((ev) => {\n return ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishDtmf(code: number, digit: string) {\n const req = new PublishSipDtmfRequest({\n localParticipantHandle: this.ffi_handle.handle,\n code,\n digit,\n });\n\n const res = FfiClient.instance.request<PublishSipDtmfResponse>({\n message: { case: 'publishSipDtmf', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishSipDtmfCallback>((ev) => {\n return ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishTranscription(transcription: Transcription) {\n const req = new PublishTranscriptionRequest({\n localParticipantHandle: this.ffi_handle.handle,\n participantIdentity: transcription.participantIdentity,\n segments: transcription.segments.map(\n (s) =>\n new ProtoTranscriptionSegment({\n id: s.id,\n text: s.text,\n startTime: s.startTime,\n endTime: s.endTime,\n final: s.final,\n language: s.language,\n }),\n ),\n trackId: transcription.trackSid,\n });\n\n const res = FfiClient.instance.request<PublishTranscriptionResponse>({\n message: { case: 'publishTranscription', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTranscriptionCallback>((ev) => {\n return ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async updateMetadata(metadata: string) {\n const req = new SetLocalMetadataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n metadata: metadata,\n });\n\n const res = FfiClient.instance.request<SetLocalMetadataResponse>({\n message: { case: 'setLocalMetadata', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalMetadataCallback>((ev) => {\n return ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n /**\n * Returns a `StreamWriter` instance that allows to write individual chunks of text to a stream.\n * Well suited for TTS and/or streaming LLM output. If you want to simply send a text then use sendText() instead\n */\n async streamText(options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n senderIdentity?: string;\n }): Promise<TextStreamWriter> {\n const senderIdentity = options?.senderIdentity ?? this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: TextStreamInfo = {\n streamId: streamId,\n mimeType: 'text/plain',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: options?.attributes,\n contentHeader: {\n case: 'textHeader',\n value: new DataStream_TextHeader({\n operationType: DataStream_OperationType.CREATE,\n version: 0,\n replyToStreamId: '',\n generated: false,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let nextChunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n\n const writableStream = new WritableStream<string>({\n // Implement the sink\n async write(text) {\n for (const textByteChunk of splitUtf8(text, STREAM_CHUNK_SIZE)) {\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: textByteChunk,\n streamId,\n chunkIndex: numberToBigInt(nextChunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n nextChunkId += 1;\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const writer = new TextStreamWriter(writableStream, info);\n\n return writer;\n }\n\n async sendText(\n text: string,\n options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n },\n ) {\n const writer = await this.streamText(options);\n await writer.write(text);\n await writer.close();\n return writer.info;\n }\n\n async streamBytes(options?: {\n name?: string;\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n mimeType?: string;\n totalSize?: number;\n }) {\n const senderIdentity = this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: ByteStreamInfo = {\n streamId: streamId,\n mimeType: options?.mimeType ?? 'application/octet-stream',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n attributes: options?.attributes,\n totalSize: options?.totalSize,\n name: options?.name ?? 'unknown',\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: info.attributes,\n totalLength: numberToBigInt(info.totalSize),\n contentHeader: {\n case: 'byteHeader',\n value: new DataStream_ByteHeader({\n name: info.name,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let chunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n const writeMutex = new Mutex();\n\n const writableStream = new WritableStream<Uint8Array>({\n async write(chunk) {\n const unlock = await writeMutex.lock();\n\n let byteOffset = 0;\n try {\n while (byteOffset < chunk.byteLength) {\n const subChunk = chunk.slice(byteOffset, byteOffset + STREAM_CHUNK_SIZE);\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: subChunk,\n streamId,\n chunkIndex: numberToBigInt(chunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n chunkId += 1;\n byteOffset += subChunk.byteLength;\n }\n } finally {\n unlock();\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const byteWriter = new ByteStreamWriter(writableStream, info);\n\n return byteWriter;\n }\n\n /** Sends a file provided as PathLike to specified recipients */\n async sendFile(path: PathLike, options?: ByteStreamOptions) {\n const fileStats = await stat(path);\n const file = await open(path);\n try {\n const stream: ReadableStream<Uint8Array> = file.readableWebStream({ type: 'bytes' });\n const streamId = crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const writer = await this.streamBytes({\n streamId: streamId,\n name: options?.name,\n totalSize: fileStats.size,\n destinationIdentities,\n topic: options?.topic,\n mimeType: options?.mimeType,\n attributes: options?.attributes,\n });\n\n for await (const chunk of stream) {\n await writer.write(chunk);\n }\n await writer.close();\n } finally {\n await file.close();\n }\n }\n\n private async sendStreamHeader(req: SendStreamHeaderRequest) {\n const type = 'sendStreamHeader';\n const res = FfiClient.instance.request<SendStreamHeaderResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamHeaderCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamChunk(req: SendStreamChunkRequest) {\n const type = 'sendStreamChunk';\n const res = FfiClient.instance.request<SendStreamChunkResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamChunkCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamTrailer(req: SendStreamTrailerRequest) {\n const type = 'sendStreamTrailer';\n const res = FfiClient.instance.request<SendStreamTrailerResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamTrailerCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n /**\n * Sends a chat message to participants in the room\n *\n * @param text - The text content of the chat message.\n * @param destinationIdentities - An optional array of recipient identities to whom the message will be sent. If omitted, the message is broadcast to all participants.\n * @param senderIdentity - An optional identity of the sender. If omitted, the default sender identity is used.\n *\n */\n async sendChatMessage(\n text: string,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new SendChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n message: text,\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'sendChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n /**\n * @experimental\n */\n async editChatMessage(\n editText: string,\n originalMessage: ChatMessage,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new EditChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n editText,\n originalMessage: new ChatMessageModel({\n ...originalMessage,\n timestamp: BigInt(originalMessage.timestamp),\n editTimestamp: originalMessage.editTimestamp\n ? BigInt(originalMessage.editTimestamp)\n : undefined,\n }),\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'editChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async updateName(name: string) {\n const req = new SetLocalNameRequest({\n localParticipantHandle: this.ffi_handle.handle,\n name: name,\n });\n\n const res = FfiClient.instance.request<SetLocalNameResponse>({\n message: { case: 'setLocalName', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalNameCallback>((ev) => {\n return ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async setAttributes(attributes: Record<string, string>) {\n const req = new SetLocalAttributesRequest({\n localParticipantHandle: this.ffi_handle.handle,\n attributes: Object.entries(attributes).map(([key, value]) => ({ key, value })),\n });\n\n const res = FfiClient.instance.request<SetLocalAttributesResponse>({\n message: { case: 'setLocalAttributes', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalAttributesCallback>((ev) => {\n return ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async publishTrack(\n track: LocalTrack,\n options: TrackPublishOptions,\n ): Promise<LocalTrackPublication> {\n const req = new PublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackHandle: track.ffi_handle.handle,\n options: options,\n });\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>((ev) => {\n return ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'publication':\n const track_publication = new LocalTrackPublication(cb.message.value!);\n track_publication.track = track;\n this.trackPublications.set(track_publication.sid!, track_publication);\n\n return track_publication;\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const req = new UnpublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackSid: trackSid,\n stopOnUnpublish: stopOnUnpublish ?? true,\n });\n\n const res = FfiClient.instance.request<UnpublishTrackResponse>({\n message: { case: 'unpublishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<UnpublishTrackCallback>((ev) => {\n return ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n\n const pub = this.trackPublications.get(trackSid);\n if (pub) {\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n }\n\n /**\n * Initiate an RPC call to a remote participant.\n * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n * @returns A promise that resolves with the response payload or rejects with an error.\n * @throws Error on failure. Details in `message`.\n */\n async performRpc({\n destinationIdentity,\n method,\n payload,\n responseTimeout,\n }: PerformRpcParams): Promise<string> {\n const req = new PerformRpcRequest({\n localParticipantHandle: this.ffi_handle.handle,\n destinationIdentity,\n method,\n payload,\n responseTimeoutMs: responseTimeout,\n });\n\n const res = FfiClient.instance.request<PerformRpcResponse>({\n message: { case: 'performRpc', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PerformRpcCallback>((ev) => {\n return ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId;\n });\n\n if (cb.error) {\n throw RpcError.fromProto(cb.error);\n }\n\n return cb.payload!;\n }\n\n /**\n * Establishes the participant as a receiver for calls of the specified RPC method.\n * Will overwrite any existing callback for the same method.\n *\n * @param method - The name of the indicated RPC method\n * @param handler - Will be invoked when an RPC request for this method is received\n * @returns A promise that resolves when the method is successfully registered\n *\n * @example\n * ```typescript\n * room.localParticipant?.registerRpcMethod(\n * 'greet',\n * async (data: RpcInvocationData) => {\n * console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n * return `Hello, ${data.callerIdentity}!`;\n * }\n * );\n * ```\n *\n * See {@link RpcInvocationData} for more details on invocation params.\n *\n * The handler should return a Promise that resolves to a string.\n * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n *\n * You may throw errors of type `RpcError` with a string `message` in the handler,\n * and they will be received on the caller's side with the message intact.\n * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n */\n registerRpcMethod(method: string, handler: (data: RpcInvocationData) => Promise<string>) {\n this.rpcHandlers.set(method, handler);\n\n const req = new RegisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<RegisterRpcMethodResponse>({\n message: { case: 'registerRpcMethod', value: req },\n });\n }\n\n /**\n * Unregisters a previously registered RPC method.\n *\n * @param method - The name of the RPC method to unregister\n */\n unregisterRpcMethod(method: string) {\n this.rpcHandlers.delete(method);\n\n const req = new UnregisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<UnregisterRpcMethodResponse>({\n message: { case: 'unregisterRpcMethod', value: req },\n });\n }\n\n /** @internal */\n async handleRpcMethodInvocation(\n invocationId: bigint,\n method: string,\n requestId: string,\n callerIdentity: string,\n payload: string,\n responseTimeout: number,\n ) {\n let responseError: RpcError | null = null;\n let responsePayload: string | null = null;\n\n const handler = this.rpcHandlers.get(method);\n\n if (!handler) {\n responseError = RpcError.builtIn('UNSUPPORTED_METHOD');\n } else {\n try {\n responsePayload = await handler({ requestId, callerIdentity, payload, responseTimeout });\n } catch (error) {\n if (error instanceof RpcError) {\n responseError = error;\n } else {\n console.warn(\n `Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,\n error,\n );\n responseError = RpcError.builtIn('APPLICATION_ERROR');\n }\n }\n }\n\n const req = new RpcMethodInvocationResponseRequest({\n localParticipantHandle: this.ffi_handle.handle,\n invocationId,\n error: responseError ? responseError.toProto() : undefined,\n payload: responsePayload ?? undefined,\n });\n\n const res = FfiClient.instance.request<RpcMethodInvocationResponseResponse>({\n message: { case: 'rpcMethodInvocationResponse', value: req },\n });\n\n if (res.error) {\n console.warn(`error sending rpc method invocation response: ${res.error}`);\n }\n }\n}\n\nexport class RemoteParticipant extends Participant {\n trackPublications: Map<string, RemoteTrackPublication> = new Map();\n\n constructor(owned_info: OwnedParticipant) {\n super(owned_info);\n }\n}\n"],"mappings":"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","names":["import_room_pb","ProtoTranscriptionSegment","ChatMessageModel"]}
|
package/dist/participant.d.cts
CHANGED
|
@@ -69,6 +69,7 @@ declare class LocalParticipant extends Participant {
|
|
|
69
69
|
attributes?: Record<string, string>;
|
|
70
70
|
destinationIdentities?: Array<string>;
|
|
71
71
|
streamId?: string;
|
|
72
|
+
senderIdentity?: string;
|
|
72
73
|
}): Promise<TextStreamWriter>;
|
|
73
74
|
sendText(text: string, options?: {
|
|
74
75
|
topic?: string;
|
package/dist/participant.d.ts
CHANGED
|
@@ -69,6 +69,7 @@ declare class LocalParticipant extends Participant {
|
|
|
69
69
|
attributes?: Record<string, string>;
|
|
70
70
|
destinationIdentities?: Array<string>;
|
|
71
71
|
streamId?: string;
|
|
72
|
+
senderIdentity?: string;
|
|
72
73
|
}): Promise<TextStreamWriter>;
|
|
73
74
|
sendText(text: string, options?: {
|
|
74
75
|
topic?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"participant.d.ts","sourceRoot":"","sources":["../src/participant.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAEL,KAAK,iBAAiB,EACtB,gBAAgB,EAEhB,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EACL,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAgCL,KAAK,mBAAmB,EAGzB,MAAM,oBAAoB,CAAC;AA4B5B,OAAO,EAAE,KAAK,gBAAgB,EAAY,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,8BAAsB,WAAW;IAC/B,gBAAgB;IAChB,IAAI,EAAE,eAAe,CAAC;IAEtB,gBAAgB;IAChB,UAAU,EAAE,SAAS,CAAC;IAEtB,iBAAiB,gCAAuC;gBAE5C,UAAU,EAAE,gBAAgB;IAKxC,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEvC;IAED,IAAI,IAAI,IAAI,eAAe,CAE1B;IAED,IAAI,gBAAgB,IAAI,gBAAgB,GAAG,SAAS,CAKnD;CACF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,WAAW,CAAwE;IAE3F,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAa;IAE5D,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB;IAuBzD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAoBvC,oBAAoB,CAAC,aAAa,EAAE,aAAa;IA+BjD,cAAc,CAAC,QAAQ,EAAE,MAAM;IAerC;;;OAGG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,qBAAqB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"participant.d.ts","sourceRoot":"","sources":["../src/participant.ts"],"names":[],"mappings":"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"}
|
package/dist/participant.js
CHANGED
|
@@ -160,7 +160,7 @@ class LocalParticipant extends Participant {
|
|
|
160
160
|
* Well suited for TTS and/or streaming LLM output. If you want to simply send a text then use sendText() instead
|
|
161
161
|
*/
|
|
162
162
|
async streamText(options) {
|
|
163
|
-
const senderIdentity = this.identity;
|
|
163
|
+
const senderIdentity = (options == null ? void 0 : options.senderIdentity) ?? this.identity;
|
|
164
164
|
const streamId = (options == null ? void 0 : options.streamId) ?? crypto.randomUUID();
|
|
165
165
|
const destinationIdentities = options == null ? void 0 : options.destinationIdentities;
|
|
166
166
|
const info = {
|
package/dist/participant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { PathLike } from 'node:fs';\nimport { open, stat } from 'node:fs/promises';\nimport {\n type ByteStreamInfo,\n type ByteStreamOptions,\n ByteStreamWriter,\n type TextStreamInfo,\n TextStreamWriter,\n} from './data_streams/index.js';\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport { log } from './log.js';\nimport {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n ParticipantKind,\n} from './proto/participant_pb.js';\nimport {\n DataStream_ByteHeader,\n DataStream_Chunk,\n DataStream_Header,\n DataStream_OperationType,\n DataStream_TextHeader,\n DataStream_Trailer,\n type PublishDataCallback,\n type PublishDataResponse,\n type PublishSipDtmfCallback,\n type PublishSipDtmfResponse,\n type PublishTrackCallback,\n type PublishTrackResponse,\n type PublishTranscriptionCallback,\n type PublishTranscriptionResponse,\n type SendChatMessageCallback,\n type SendChatMessageResponse,\n type SendStreamChunkCallback,\n SendStreamChunkRequest,\n type SendStreamChunkResponse,\n type SendStreamHeaderCallback,\n SendStreamHeaderRequest,\n type SendStreamHeaderResponse,\n type SendStreamTrailerCallback,\n SendStreamTrailerRequest,\n type SendStreamTrailerResponse,\n type SetLocalAttributesCallback,\n type SetLocalAttributesResponse,\n type SetLocalMetadataCallback,\n type SetLocalMetadataResponse,\n type SetLocalNameCallback,\n type SetLocalNameResponse,\n type TrackPublishOptions,\n type UnpublishTrackCallback,\n type UnpublishTrackResponse,\n} from './proto/room_pb.js';\nimport { ChatMessage as ChatMessageModel } from './proto/room_pb.js';\nimport {\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n PublishDataRequest,\n PublishSipDtmfRequest,\n PublishTrackRequest,\n PublishTranscriptionRequest,\n SendChatMessageRequest,\n SetLocalAttributesRequest,\n SetLocalMetadataRequest,\n SetLocalNameRequest,\n UnpublishTrackRequest,\n} from './proto/room_pb.js';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from './proto/rpc_pb.js';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\n} from './proto/rpc_pb.js';\nimport { type PerformRpcParams, RpcError, type RpcInvocationData } from './rpc.js';\nimport type { LocalTrack } from './track.js';\nimport type { RemoteTrackPublication, TrackPublication } from './track_publication.js';\nimport { LocalTrackPublication } from './track_publication.js';\nimport type { Transcription } from './transcription.js';\nimport type { ChatMessage } from './types.js';\nimport { numberToBigInt, splitUtf8 } from './utils.js';\n\nconst STREAM_CHUNK_SIZE = 15_000;\n\nexport abstract class Participant {\n /** @internal */\n info: ParticipantInfo;\n\n /** @internal */\n ffi_handle: FfiHandle;\n\n trackPublications = new Map<string, TrackPublication>();\n\n constructor(owned_info: OwnedParticipant) {\n this.info = owned_info!.info!;\n this.ffi_handle = new FfiHandle(owned_info.handle!.id!);\n }\n\n get sid(): string | undefined {\n return this.info.sid;\n }\n\n get name(): string | undefined {\n return this.info.name;\n }\n\n get identity(): string {\n return this.info.identity ?? '';\n }\n\n get metadata(): string {\n return this.info.metadata ?? '';\n }\n\n get attributes(): Record<string, string> {\n return this.info.attributes ?? {};\n }\n\n get kind(): ParticipantKind {\n return this.info.kind ?? ParticipantKind.STANDARD;\n }\n\n get disconnectReason(): DisconnectReason | undefined {\n if (this.info.disconnectReason === DisconnectReason.UNKNOWN_REASON) {\n return undefined;\n }\n return this.info.disconnectReason;\n }\n}\n\nexport type DataPublishOptions = {\n /**\n * whether to send this as reliable or lossy.\n * For data that you need delivery guarantee (such as chat messages), use Reliable.\n * For data that should arrive as quickly as possible, but you are ok with dropped\n * packets, use Lossy.\n */\n reliable?: boolean;\n /**\n * the identities of participants who will receive the message, will be sent to every one if empty\n */\n destination_identities?: string[];\n /** the topic under which the message gets published */\n topic?: string;\n};\n\nexport class LocalParticipant extends Participant {\n private rpcHandlers: Map<string, (data: RpcInvocationData) => Promise<string>> = new Map();\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n async publishData(data: Uint8Array, options: DataPublishOptions) {\n const req = new PublishDataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n dataPtr: FfiClient.instance.retrievePtr(data),\n dataLen: BigInt(data.byteLength),\n reliable: options.reliable,\n topic: options.topic,\n destinationIdentities: options.destination_identities,\n });\n\n const res = FfiClient.instance.request<PublishDataResponse>({\n message: { case: 'publishData', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishDataCallback>((ev) => {\n return ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishDtmf(code: number, digit: string) {\n const req = new PublishSipDtmfRequest({\n localParticipantHandle: this.ffi_handle.handle,\n code,\n digit,\n });\n\n const res = FfiClient.instance.request<PublishSipDtmfResponse>({\n message: { case: 'publishSipDtmf', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishSipDtmfCallback>((ev) => {\n return ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishTranscription(transcription: Transcription) {\n const req = new PublishTranscriptionRequest({\n localParticipantHandle: this.ffi_handle.handle,\n participantIdentity: transcription.participantIdentity,\n segments: transcription.segments.map(\n (s) =>\n new ProtoTranscriptionSegment({\n id: s.id,\n text: s.text,\n startTime: s.startTime,\n endTime: s.endTime,\n final: s.final,\n language: s.language,\n }),\n ),\n trackId: transcription.trackSid,\n });\n\n const res = FfiClient.instance.request<PublishTranscriptionResponse>({\n message: { case: 'publishTranscription', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTranscriptionCallback>((ev) => {\n return ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async updateMetadata(metadata: string) {\n const req = new SetLocalMetadataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n metadata: metadata,\n });\n\n const res = FfiClient.instance.request<SetLocalMetadataResponse>({\n message: { case: 'setLocalMetadata', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalMetadataCallback>((ev) => {\n return ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n /**\n * Returns a `StreamWriter` instance that allows to write individual chunks of text to a stream.\n * Well suited for TTS and/or streaming LLM output. If you want to simply send a text then use sendText() instead\n */\n async streamText(options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n }): Promise<TextStreamWriter> {\n const senderIdentity = this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: TextStreamInfo = {\n streamId: streamId,\n mimeType: 'text/plain',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: options?.attributes,\n contentHeader: {\n case: 'textHeader',\n value: new DataStream_TextHeader({\n operationType: DataStream_OperationType.CREATE,\n version: 0,\n replyToStreamId: '',\n generated: false,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let nextChunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n\n const writableStream = new WritableStream<string>({\n // Implement the sink\n async write(text) {\n for (const textByteChunk of splitUtf8(text, STREAM_CHUNK_SIZE)) {\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: textByteChunk,\n streamId,\n chunkIndex: numberToBigInt(nextChunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n nextChunkId += 1;\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const writer = new TextStreamWriter(writableStream, info);\n\n return writer;\n }\n\n async sendText(\n text: string,\n options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n },\n ) {\n const writer = await this.streamText(options);\n await writer.write(text);\n await writer.close();\n return writer.info;\n }\n\n async streamBytes(options?: {\n name?: string;\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n mimeType?: string;\n totalSize?: number;\n }) {\n const senderIdentity = this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: ByteStreamInfo = {\n streamId: streamId,\n mimeType: options?.mimeType ?? 'application/octet-stream',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n attributes: options?.attributes,\n totalSize: options?.totalSize,\n name: options?.name ?? 'unknown',\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: info.attributes,\n totalLength: numberToBigInt(info.totalSize),\n contentHeader: {\n case: 'byteHeader',\n value: new DataStream_ByteHeader({\n name: info.name,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let chunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n const writeMutex = new Mutex();\n\n const writableStream = new WritableStream<Uint8Array>({\n async write(chunk) {\n const unlock = await writeMutex.lock();\n\n let byteOffset = 0;\n try {\n while (byteOffset < chunk.byteLength) {\n const subChunk = chunk.slice(byteOffset, byteOffset + STREAM_CHUNK_SIZE);\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: subChunk,\n streamId,\n chunkIndex: numberToBigInt(chunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n chunkId += 1;\n byteOffset += subChunk.byteLength;\n }\n } finally {\n unlock();\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const byteWriter = new ByteStreamWriter(writableStream, info);\n\n return byteWriter;\n }\n\n /** Sends a file provided as PathLike to specified recipients */\n async sendFile(path: PathLike, options?: ByteStreamOptions) {\n const fileStats = await stat(path);\n const file = await open(path);\n try {\n const stream: ReadableStream<Uint8Array> = file.readableWebStream({ type: 'bytes' });\n const streamId = crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const writer = await this.streamBytes({\n streamId: streamId,\n name: options?.name,\n totalSize: fileStats.size,\n destinationIdentities,\n topic: options?.topic,\n mimeType: options?.mimeType,\n attributes: options?.attributes,\n });\n\n for await (const chunk of stream) {\n await writer.write(chunk);\n }\n await writer.close();\n } finally {\n await file.close();\n }\n }\n\n private async sendStreamHeader(req: SendStreamHeaderRequest) {\n const type = 'sendStreamHeader';\n const res = FfiClient.instance.request<SendStreamHeaderResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamHeaderCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamChunk(req: SendStreamChunkRequest) {\n const type = 'sendStreamChunk';\n const res = FfiClient.instance.request<SendStreamChunkResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamChunkCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamTrailer(req: SendStreamTrailerRequest) {\n const type = 'sendStreamTrailer';\n const res = FfiClient.instance.request<SendStreamTrailerResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamTrailerCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n /**\n * Sends a chat message to participants in the room\n *\n * @param text - The text content of the chat message.\n * @param destinationIdentities - An optional array of recipient identities to whom the message will be sent. If omitted, the message is broadcast to all participants.\n * @param senderIdentity - An optional identity of the sender. If omitted, the default sender identity is used.\n *\n */\n async sendChatMessage(\n text: string,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new SendChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n message: text,\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'sendChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n /**\n * @experimental\n */\n async editChatMessage(\n editText: string,\n originalMessage: ChatMessage,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new EditChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n editText,\n originalMessage: new ChatMessageModel({\n ...originalMessage,\n timestamp: BigInt(originalMessage.timestamp),\n editTimestamp: originalMessage.editTimestamp\n ? BigInt(originalMessage.editTimestamp)\n : undefined,\n }),\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'editChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async updateName(name: string) {\n const req = new SetLocalNameRequest({\n localParticipantHandle: this.ffi_handle.handle,\n name: name,\n });\n\n const res = FfiClient.instance.request<SetLocalNameResponse>({\n message: { case: 'setLocalName', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalNameCallback>((ev) => {\n return ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async setAttributes(attributes: Record<string, string>) {\n const req = new SetLocalAttributesRequest({\n localParticipantHandle: this.ffi_handle.handle,\n attributes: Object.entries(attributes).map(([key, value]) => ({ key, value })),\n });\n\n const res = FfiClient.instance.request<SetLocalAttributesResponse>({\n message: { case: 'setLocalAttributes', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalAttributesCallback>((ev) => {\n return ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async publishTrack(\n track: LocalTrack,\n options: TrackPublishOptions,\n ): Promise<LocalTrackPublication> {\n const req = new PublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackHandle: track.ffi_handle.handle,\n options: options,\n });\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>((ev) => {\n return ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'publication':\n const track_publication = new LocalTrackPublication(cb.message.value!);\n track_publication.track = track;\n this.trackPublications.set(track_publication.sid!, track_publication);\n\n return track_publication;\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const req = new UnpublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackSid: trackSid,\n stopOnUnpublish: stopOnUnpublish ?? true,\n });\n\n const res = FfiClient.instance.request<UnpublishTrackResponse>({\n message: { case: 'unpublishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<UnpublishTrackCallback>((ev) => {\n return ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n\n const pub = this.trackPublications.get(trackSid);\n if (pub) {\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n }\n\n /**\n * Initiate an RPC call to a remote participant.\n * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n * @returns A promise that resolves with the response payload or rejects with an error.\n * @throws Error on failure. Details in `message`.\n */\n async performRpc({\n destinationIdentity,\n method,\n payload,\n responseTimeout,\n }: PerformRpcParams): Promise<string> {\n const req = new PerformRpcRequest({\n localParticipantHandle: this.ffi_handle.handle,\n destinationIdentity,\n method,\n payload,\n responseTimeoutMs: responseTimeout,\n });\n\n const res = FfiClient.instance.request<PerformRpcResponse>({\n message: { case: 'performRpc', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PerformRpcCallback>((ev) => {\n return ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId;\n });\n\n if (cb.error) {\n throw RpcError.fromProto(cb.error);\n }\n\n return cb.payload!;\n }\n\n /**\n * Establishes the participant as a receiver for calls of the specified RPC method.\n * Will overwrite any existing callback for the same method.\n *\n * @param method - The name of the indicated RPC method\n * @param handler - Will be invoked when an RPC request for this method is received\n * @returns A promise that resolves when the method is successfully registered\n *\n * @example\n * ```typescript\n * room.localParticipant?.registerRpcMethod(\n * 'greet',\n * async (data: RpcInvocationData) => {\n * console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n * return `Hello, ${data.callerIdentity}!`;\n * }\n * );\n * ```\n *\n * See {@link RpcInvocationData} for more details on invocation params.\n *\n * The handler should return a Promise that resolves to a string.\n * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n *\n * You may throw errors of type `RpcError` with a string `message` in the handler,\n * and they will be received on the caller's side with the message intact.\n * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n */\n registerRpcMethod(method: string, handler: (data: RpcInvocationData) => Promise<string>) {\n this.rpcHandlers.set(method, handler);\n\n const req = new RegisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<RegisterRpcMethodResponse>({\n message: { case: 'registerRpcMethod', value: req },\n });\n }\n\n /**\n * Unregisters a previously registered RPC method.\n *\n * @param method - The name of the RPC method to unregister\n */\n unregisterRpcMethod(method: string) {\n this.rpcHandlers.delete(method);\n\n const req = new UnregisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<UnregisterRpcMethodResponse>({\n message: { case: 'unregisterRpcMethod', value: req },\n });\n }\n\n /** @internal */\n async handleRpcMethodInvocation(\n invocationId: bigint,\n method: string,\n requestId: string,\n callerIdentity: string,\n payload: string,\n responseTimeout: number,\n ) {\n let responseError: RpcError | null = null;\n let responsePayload: string | null = null;\n\n const handler = this.rpcHandlers.get(method);\n\n if (!handler) {\n responseError = RpcError.builtIn('UNSUPPORTED_METHOD');\n } else {\n try {\n responsePayload = await handler({ requestId, callerIdentity, payload, responseTimeout });\n } catch (error) {\n if (error instanceof RpcError) {\n responseError = error;\n } else {\n console.warn(\n `Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,\n error,\n );\n responseError = RpcError.builtIn('APPLICATION_ERROR');\n }\n }\n }\n\n const req = new RpcMethodInvocationResponseRequest({\n localParticipantHandle: this.ffi_handle.handle,\n invocationId,\n error: responseError ? responseError.toProto() : undefined,\n payload: responsePayload ?? undefined,\n });\n\n const res = FfiClient.instance.request<RpcMethodInvocationResponseResponse>({\n message: { case: 'rpcMethodInvocationResponse', value: req },\n });\n\n if (res.error) {\n console.warn(`error sending rpc method invocation response: ${res.error}`);\n }\n }\n}\n\nexport class RemoteParticipant extends Participant {\n trackPublications: Map<string, RemoteTrackPublication> = new Map();\n\n constructor(owned_info: OwnedParticipant) {\n super(owned_info);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { PathLike } from 'node:fs';\nimport { open, stat } from 'node:fs/promises';\nimport {\n type ByteStreamInfo,\n type ByteStreamOptions,\n ByteStreamWriter,\n type TextStreamInfo,\n TextStreamWriter,\n} from './data_streams/index.js';\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport { log } from './log.js';\nimport {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n ParticipantKind,\n} from './proto/participant_pb.js';\nimport {\n DataStream_ByteHeader,\n DataStream_Chunk,\n DataStream_Header,\n DataStream_OperationType,\n DataStream_TextHeader,\n DataStream_Trailer,\n type PublishDataCallback,\n type PublishDataResponse,\n type PublishSipDtmfCallback,\n type PublishSipDtmfResponse,\n type PublishTrackCallback,\n type PublishTrackResponse,\n type PublishTranscriptionCallback,\n type PublishTranscriptionResponse,\n type SendChatMessageCallback,\n type SendChatMessageResponse,\n type SendStreamChunkCallback,\n SendStreamChunkRequest,\n type SendStreamChunkResponse,\n type SendStreamHeaderCallback,\n SendStreamHeaderRequest,\n type SendStreamHeaderResponse,\n type SendStreamTrailerCallback,\n SendStreamTrailerRequest,\n type SendStreamTrailerResponse,\n type SetLocalAttributesCallback,\n type SetLocalAttributesResponse,\n type SetLocalMetadataCallback,\n type SetLocalMetadataResponse,\n type SetLocalNameCallback,\n type SetLocalNameResponse,\n type TrackPublishOptions,\n type UnpublishTrackCallback,\n type UnpublishTrackResponse,\n} from './proto/room_pb.js';\nimport { ChatMessage as ChatMessageModel } from './proto/room_pb.js';\nimport {\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n PublishDataRequest,\n PublishSipDtmfRequest,\n PublishTrackRequest,\n PublishTranscriptionRequest,\n SendChatMessageRequest,\n SetLocalAttributesRequest,\n SetLocalMetadataRequest,\n SetLocalNameRequest,\n UnpublishTrackRequest,\n} from './proto/room_pb.js';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from './proto/rpc_pb.js';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\n} from './proto/rpc_pb.js';\nimport { type PerformRpcParams, RpcError, type RpcInvocationData } from './rpc.js';\nimport type { LocalTrack } from './track.js';\nimport type { RemoteTrackPublication, TrackPublication } from './track_publication.js';\nimport { LocalTrackPublication } from './track_publication.js';\nimport type { Transcription } from './transcription.js';\nimport type { ChatMessage } from './types.js';\nimport { numberToBigInt, splitUtf8 } from './utils.js';\n\nconst STREAM_CHUNK_SIZE = 15_000;\n\nexport abstract class Participant {\n /** @internal */\n info: ParticipantInfo;\n\n /** @internal */\n ffi_handle: FfiHandle;\n\n trackPublications = new Map<string, TrackPublication>();\n\n constructor(owned_info: OwnedParticipant) {\n this.info = owned_info!.info!;\n this.ffi_handle = new FfiHandle(owned_info.handle!.id!);\n }\n\n get sid(): string | undefined {\n return this.info.sid;\n }\n\n get name(): string | undefined {\n return this.info.name;\n }\n\n get identity(): string {\n return this.info.identity ?? '';\n }\n\n get metadata(): string {\n return this.info.metadata ?? '';\n }\n\n get attributes(): Record<string, string> {\n return this.info.attributes ?? {};\n }\n\n get kind(): ParticipantKind {\n return this.info.kind ?? ParticipantKind.STANDARD;\n }\n\n get disconnectReason(): DisconnectReason | undefined {\n if (this.info.disconnectReason === DisconnectReason.UNKNOWN_REASON) {\n return undefined;\n }\n return this.info.disconnectReason;\n }\n}\n\nexport type DataPublishOptions = {\n /**\n * whether to send this as reliable or lossy.\n * For data that you need delivery guarantee (such as chat messages), use Reliable.\n * For data that should arrive as quickly as possible, but you are ok with dropped\n * packets, use Lossy.\n */\n reliable?: boolean;\n /**\n * the identities of participants who will receive the message, will be sent to every one if empty\n */\n destination_identities?: string[];\n /** the topic under which the message gets published */\n topic?: string;\n};\n\nexport class LocalParticipant extends Participant {\n private rpcHandlers: Map<string, (data: RpcInvocationData) => Promise<string>> = new Map();\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n async publishData(data: Uint8Array, options: DataPublishOptions) {\n const req = new PublishDataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n dataPtr: FfiClient.instance.retrievePtr(data),\n dataLen: BigInt(data.byteLength),\n reliable: options.reliable,\n topic: options.topic,\n destinationIdentities: options.destination_identities,\n });\n\n const res = FfiClient.instance.request<PublishDataResponse>({\n message: { case: 'publishData', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishDataCallback>((ev) => {\n return ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishDtmf(code: number, digit: string) {\n const req = new PublishSipDtmfRequest({\n localParticipantHandle: this.ffi_handle.handle,\n code,\n digit,\n });\n\n const res = FfiClient.instance.request<PublishSipDtmfResponse>({\n message: { case: 'publishSipDtmf', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishSipDtmfCallback>((ev) => {\n return ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishTranscription(transcription: Transcription) {\n const req = new PublishTranscriptionRequest({\n localParticipantHandle: this.ffi_handle.handle,\n participantIdentity: transcription.participantIdentity,\n segments: transcription.segments.map(\n (s) =>\n new ProtoTranscriptionSegment({\n id: s.id,\n text: s.text,\n startTime: s.startTime,\n endTime: s.endTime,\n final: s.final,\n language: s.language,\n }),\n ),\n trackId: transcription.trackSid,\n });\n\n const res = FfiClient.instance.request<PublishTranscriptionResponse>({\n message: { case: 'publishTranscription', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTranscriptionCallback>((ev) => {\n return ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async updateMetadata(metadata: string) {\n const req = new SetLocalMetadataRequest({\n localParticipantHandle: this.ffi_handle.handle,\n metadata: metadata,\n });\n\n const res = FfiClient.instance.request<SetLocalMetadataResponse>({\n message: { case: 'setLocalMetadata', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalMetadataCallback>((ev) => {\n return ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n /**\n * Returns a `StreamWriter` instance that allows to write individual chunks of text to a stream.\n * Well suited for TTS and/or streaming LLM output. If you want to simply send a text then use sendText() instead\n */\n async streamText(options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n senderIdentity?: string;\n }): Promise<TextStreamWriter> {\n const senderIdentity = options?.senderIdentity ?? this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: TextStreamInfo = {\n streamId: streamId,\n mimeType: 'text/plain',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: options?.attributes,\n contentHeader: {\n case: 'textHeader',\n value: new DataStream_TextHeader({\n operationType: DataStream_OperationType.CREATE,\n version: 0,\n replyToStreamId: '',\n generated: false,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let nextChunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n\n const writableStream = new WritableStream<string>({\n // Implement the sink\n async write(text) {\n for (const textByteChunk of splitUtf8(text, STREAM_CHUNK_SIZE)) {\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: textByteChunk,\n streamId,\n chunkIndex: numberToBigInt(nextChunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n nextChunkId += 1;\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const writer = new TextStreamWriter(writableStream, info);\n\n return writer;\n }\n\n async sendText(\n text: string,\n options?: {\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n },\n ) {\n const writer = await this.streamText(options);\n await writer.write(text);\n await writer.close();\n return writer.info;\n }\n\n async streamBytes(options?: {\n name?: string;\n topic?: string;\n attributes?: Record<string, string>;\n destinationIdentities?: Array<string>;\n streamId?: string;\n mimeType?: string;\n totalSize?: number;\n }) {\n const senderIdentity = this.identity;\n const streamId = options?.streamId ?? crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const info: ByteStreamInfo = {\n streamId: streamId,\n mimeType: options?.mimeType ?? 'application/octet-stream',\n topic: options?.topic ?? '',\n timestamp: Date.now(),\n attributes: options?.attributes,\n totalSize: options?.totalSize,\n name: options?.name ?? 'unknown',\n };\n\n const headerReq = new SendStreamHeaderRequest({\n senderIdentity,\n destinationIdentities,\n localParticipantHandle: this.ffi_handle.handle,\n header: new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n attributes: info.attributes,\n totalLength: numberToBigInt(info.totalSize),\n contentHeader: {\n case: 'byteHeader',\n value: new DataStream_ByteHeader({\n name: info.name,\n }),\n },\n }),\n });\n\n await this.sendStreamHeader(headerReq);\n\n let chunkId = 0;\n const localHandle = this.ffi_handle.handle;\n const sendTrailer = this.sendStreamTrailer;\n const sendChunk = this.sendStreamChunk;\n const writeMutex = new Mutex();\n\n const writableStream = new WritableStream<Uint8Array>({\n async write(chunk) {\n const unlock = await writeMutex.lock();\n\n let byteOffset = 0;\n try {\n while (byteOffset < chunk.byteLength) {\n const subChunk = chunk.slice(byteOffset, byteOffset + STREAM_CHUNK_SIZE);\n const chunkRequest = new SendStreamChunkRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n chunk: new DataStream_Chunk({\n content: subChunk,\n streamId,\n chunkIndex: numberToBigInt(chunkId),\n }),\n });\n\n await sendChunk(chunkRequest);\n chunkId += 1;\n byteOffset += subChunk.byteLength;\n }\n } finally {\n unlock();\n }\n },\n async close() {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: '',\n }),\n });\n await sendTrailer(trailerReq);\n },\n abort(err) {\n log.error('Sink error:', err);\n },\n });\n\n const byteWriter = new ByteStreamWriter(writableStream, info);\n\n return byteWriter;\n }\n\n /** Sends a file provided as PathLike to specified recipients */\n async sendFile(path: PathLike, options?: ByteStreamOptions) {\n const fileStats = await stat(path);\n const file = await open(path);\n try {\n const stream: ReadableStream<Uint8Array> = file.readableWebStream({ type: 'bytes' });\n const streamId = crypto.randomUUID();\n const destinationIdentities = options?.destinationIdentities;\n\n const writer = await this.streamBytes({\n streamId: streamId,\n name: options?.name,\n totalSize: fileStats.size,\n destinationIdentities,\n topic: options?.topic,\n mimeType: options?.mimeType,\n attributes: options?.attributes,\n });\n\n for await (const chunk of stream) {\n await writer.write(chunk);\n }\n await writer.close();\n } finally {\n await file.close();\n }\n }\n\n private async sendStreamHeader(req: SendStreamHeaderRequest) {\n const type = 'sendStreamHeader';\n const res = FfiClient.instance.request<SendStreamHeaderResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamHeaderCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamChunk(req: SendStreamChunkRequest) {\n const type = 'sendStreamChunk';\n const res = FfiClient.instance.request<SendStreamChunkResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamChunkCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private async sendStreamTrailer(req: SendStreamTrailerRequest) {\n const type = 'sendStreamTrailer';\n const res = FfiClient.instance.request<SendStreamTrailerResponse>({\n message: { case: type, value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendStreamTrailerCallback>((ev) => {\n return ev.message.case == type && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n /**\n * Sends a chat message to participants in the room\n *\n * @param text - The text content of the chat message.\n * @param destinationIdentities - An optional array of recipient identities to whom the message will be sent. If omitted, the message is broadcast to all participants.\n * @param senderIdentity - An optional identity of the sender. If omitted, the default sender identity is used.\n *\n */\n async sendChatMessage(\n text: string,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new SendChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n message: text,\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'sendChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n /**\n * @experimental\n */\n async editChatMessage(\n editText: string,\n originalMessage: ChatMessage,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = new EditChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n editText,\n originalMessage: new ChatMessageModel({\n ...originalMessage,\n timestamp: BigInt(originalMessage.timestamp),\n editTimestamp: originalMessage.editTimestamp\n ? BigInt(originalMessage.editTimestamp)\n : undefined,\n }),\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'editChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async updateName(name: string) {\n const req = new SetLocalNameRequest({\n localParticipantHandle: this.ffi_handle.handle,\n name: name,\n });\n\n const res = FfiClient.instance.request<SetLocalNameResponse>({\n message: { case: 'setLocalName', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalNameCallback>((ev) => {\n return ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async setAttributes(attributes: Record<string, string>) {\n const req = new SetLocalAttributesRequest({\n localParticipantHandle: this.ffi_handle.handle,\n attributes: Object.entries(attributes).map(([key, value]) => ({ key, value })),\n });\n\n const res = FfiClient.instance.request<SetLocalAttributesResponse>({\n message: { case: 'setLocalAttributes', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalAttributesCallback>((ev) => {\n return ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async publishTrack(\n track: LocalTrack,\n options: TrackPublishOptions,\n ): Promise<LocalTrackPublication> {\n const req = new PublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackHandle: track.ffi_handle.handle,\n options: options,\n });\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>((ev) => {\n return ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n switch (cb.message.case) {\n case 'publication':\n const track_publication = new LocalTrackPublication(cb.message.value!);\n track_publication.track = track;\n this.trackPublications.set(track_publication.sid!, track_publication);\n\n return track_publication;\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const req = new UnpublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackSid: trackSid,\n stopOnUnpublish: stopOnUnpublish ?? true,\n });\n\n const res = FfiClient.instance.request<UnpublishTrackResponse>({\n message: { case: 'unpublishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<UnpublishTrackCallback>((ev) => {\n return ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n\n const pub = this.trackPublications.get(trackSid);\n if (pub) {\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n }\n\n /**\n * Initiate an RPC call to a remote participant.\n * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n * @returns A promise that resolves with the response payload or rejects with an error.\n * @throws Error on failure. Details in `message`.\n */\n async performRpc({\n destinationIdentity,\n method,\n payload,\n responseTimeout,\n }: PerformRpcParams): Promise<string> {\n const req = new PerformRpcRequest({\n localParticipantHandle: this.ffi_handle.handle,\n destinationIdentity,\n method,\n payload,\n responseTimeoutMs: responseTimeout,\n });\n\n const res = FfiClient.instance.request<PerformRpcResponse>({\n message: { case: 'performRpc', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PerformRpcCallback>((ev) => {\n return ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId;\n });\n\n if (cb.error) {\n throw RpcError.fromProto(cb.error);\n }\n\n return cb.payload!;\n }\n\n /**\n * Establishes the participant as a receiver for calls of the specified RPC method.\n * Will overwrite any existing callback for the same method.\n *\n * @param method - The name of the indicated RPC method\n * @param handler - Will be invoked when an RPC request for this method is received\n * @returns A promise that resolves when the method is successfully registered\n *\n * @example\n * ```typescript\n * room.localParticipant?.registerRpcMethod(\n * 'greet',\n * async (data: RpcInvocationData) => {\n * console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n * return `Hello, ${data.callerIdentity}!`;\n * }\n * );\n * ```\n *\n * See {@link RpcInvocationData} for more details on invocation params.\n *\n * The handler should return a Promise that resolves to a string.\n * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n *\n * You may throw errors of type `RpcError` with a string `message` in the handler,\n * and they will be received on the caller's side with the message intact.\n * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n */\n registerRpcMethod(method: string, handler: (data: RpcInvocationData) => Promise<string>) {\n this.rpcHandlers.set(method, handler);\n\n const req = new RegisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<RegisterRpcMethodResponse>({\n message: { case: 'registerRpcMethod', value: req },\n });\n }\n\n /**\n * Unregisters a previously registered RPC method.\n *\n * @param method - The name of the RPC method to unregister\n */\n unregisterRpcMethod(method: string) {\n this.rpcHandlers.delete(method);\n\n const req = new UnregisterRpcMethodRequest({\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<UnregisterRpcMethodResponse>({\n message: { case: 'unregisterRpcMethod', value: req },\n });\n }\n\n /** @internal */\n async handleRpcMethodInvocation(\n invocationId: bigint,\n method: string,\n requestId: string,\n callerIdentity: string,\n payload: string,\n responseTimeout: number,\n ) {\n let responseError: RpcError | null = null;\n let responsePayload: string | null = null;\n\n const handler = this.rpcHandlers.get(method);\n\n if (!handler) {\n responseError = RpcError.builtIn('UNSUPPORTED_METHOD');\n } else {\n try {\n responsePayload = await handler({ requestId, callerIdentity, payload, responseTimeout });\n } catch (error) {\n if (error instanceof RpcError) {\n responseError = error;\n } else {\n console.warn(\n `Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,\n error,\n );\n responseError = RpcError.builtIn('APPLICATION_ERROR');\n }\n }\n }\n\n const req = new RpcMethodInvocationResponseRequest({\n localParticipantHandle: this.ffi_handle.handle,\n invocationId,\n error: responseError ? responseError.toProto() : undefined,\n payload: responsePayload ?? undefined,\n });\n\n const res = FfiClient.instance.request<RpcMethodInvocationResponseResponse>({\n message: { case: 'rpcMethodInvocationResponse', value: req },\n });\n\n if (res.error) {\n console.warn(`error sending rpc method invocation response: ${res.error}`);\n }\n }\n}\n\nexport class RemoteParticipant extends Participant {\n trackPublications: Map<string, RemoteTrackPublication> = new Map();\n\n constructor(owned_info: OwnedParticipant) {\n super(owned_info);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/version.cjs
CHANGED
|
@@ -21,7 +21,7 @@ __export(version_exports, {
|
|
|
21
21
|
SDK_VERSION: () => SDK_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(version_exports);
|
|
24
|
-
const SDK_VERSION = "0.13.
|
|
24
|
+
const SDK_VERSION = "0.13.9";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
SDK_VERSION
|
package/dist/version.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"0.13.
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"0.13.9\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,cAAc;","names":[]}
|
package/dist/version.d.cts
CHANGED
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"0.13.
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"0.13.9\";\n"],"mappings":"AAAO,MAAM,cAAc;","names":[]}
|
package/dist/video_source.cjs
CHANGED
|
@@ -25,6 +25,8 @@ var import_ffi_client = require("./ffi_client.cjs");
|
|
|
25
25
|
var import_video_frame_pb = require("./proto/video_frame_pb.cjs");
|
|
26
26
|
class VideoSource {
|
|
27
27
|
constructor(width, height) {
|
|
28
|
+
/** @internal */
|
|
29
|
+
this.closed = false;
|
|
28
30
|
var _a;
|
|
29
31
|
this.width = width;
|
|
30
32
|
this.height = height;
|
|
@@ -45,6 +47,9 @@ class VideoSource {
|
|
|
45
47
|
this.ffiHandle = new import_ffi_client.FfiHandle(res.source.handle.id);
|
|
46
48
|
}
|
|
47
49
|
captureFrame(frame, timestampUs = BigInt(0), rotation = import_video_frame_pb.VideoRotation.VIDEO_ROTATION_0) {
|
|
50
|
+
if (this.closed) {
|
|
51
|
+
throw new Error("VideoSource is closed");
|
|
52
|
+
}
|
|
48
53
|
const req = new import_video_frame_pb.CaptureVideoFrameRequest({
|
|
49
54
|
sourceHandle: this.ffiHandle.handle,
|
|
50
55
|
buffer: frame.protoInfo(),
|
|
@@ -57,6 +62,7 @@ class VideoSource {
|
|
|
57
62
|
}
|
|
58
63
|
async close() {
|
|
59
64
|
this.ffiHandle.dispose();
|
|
65
|
+
this.closed = true;
|
|
60
66
|
}
|
|
61
67
|
}
|
|
62
68
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type {\n CaptureVideoFrameResponse,\n NewVideoSourceResponse,\n VideoSourceInfo,\n} from './proto/video_frame_pb.js';\nimport {\n CaptureVideoFrameRequest,\n NewVideoSourceRequest,\n VideoRotation,\n VideoSourceType,\n} from './proto/video_frame_pb.js';\nimport type { VideoFrame } from './video_frame.js';\n\nexport class VideoSource {\n /** @internal */\n info?: VideoSourceInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n\n width: number;\n height: number;\n\n constructor(width: number, height: number) {\n this.width = width;\n this.height = height;\n\n const req = new NewVideoSourceRequest({\n type: VideoSourceType.VIDEO_SOURCE_NATIVE,\n resolution: {\n width: width,\n height: height,\n },\n });\n\n const res = FfiClient.instance.request<NewVideoSourceResponse>({\n message: {\n case: 'newVideoSource',\n value: req,\n },\n });\n\n this.info = res.source?.info;\n this.ffiHandle = new FfiHandle(res.source!.handle!.id!);\n }\n\n captureFrame(\n frame: VideoFrame,\n timestampUs = BigInt(0),\n rotation = VideoRotation.VIDEO_ROTATION_0,\n ) {\n const req = new CaptureVideoFrameRequest({\n sourceHandle: this.ffiHandle.handle,\n buffer: frame.protoInfo(),\n rotation,\n timestampUs,\n });\n\n FfiClient.instance.request<CaptureVideoFrameResponse>({\n message: { case: 'captureVideoFrame', value: req },\n });\n }\n\n async close() {\n this.ffiHandle.dispose();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAAqC;AAMrC,4BAKO;AAGA,MAAM,YAAY;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type {\n CaptureVideoFrameResponse,\n NewVideoSourceResponse,\n VideoSourceInfo,\n} from './proto/video_frame_pb.js';\nimport {\n CaptureVideoFrameRequest,\n NewVideoSourceRequest,\n VideoRotation,\n VideoSourceType,\n} from './proto/video_frame_pb.js';\nimport type { VideoFrame } from './video_frame.js';\n\nexport class VideoSource {\n /** @internal */\n info?: VideoSourceInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n closed = false;\n\n width: number;\n height: number;\n\n constructor(width: number, height: number) {\n this.width = width;\n this.height = height;\n\n const req = new NewVideoSourceRequest({\n type: VideoSourceType.VIDEO_SOURCE_NATIVE,\n resolution: {\n width: width,\n height: height,\n },\n });\n\n const res = FfiClient.instance.request<NewVideoSourceResponse>({\n message: {\n case: 'newVideoSource',\n value: req,\n },\n });\n\n this.info = res.source?.info;\n this.ffiHandle = new FfiHandle(res.source!.handle!.id!);\n }\n\n captureFrame(\n frame: VideoFrame,\n timestampUs = BigInt(0),\n rotation = VideoRotation.VIDEO_ROTATION_0,\n ) {\n if (this.closed) {\n throw new Error('VideoSource is closed');\n }\n const req = new CaptureVideoFrameRequest({\n sourceHandle: this.ffiHandle.handle,\n buffer: frame.protoInfo(),\n rotation,\n timestampUs,\n });\n\n FfiClient.instance.request<CaptureVideoFrameResponse>({\n message: { case: 'captureVideoFrame', value: req },\n });\n }\n\n async close() {\n this.ffiHandle.dispose();\n this.closed = true;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAAqC;AAMrC,4BAKO;AAGA,MAAM,YAAY;AAAA,EAWvB,YAAY,OAAe,QAAgB;AAL3C;AAAA,kBAAS;AAvBX;AA6BI,SAAK,QAAQ;AACb,SAAK,SAAS;AAEd,UAAM,MAAM,IAAI,4CAAsB;AAAA,MACpC,MAAM,sCAAgB;AAAA,MACtB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,MAAM,4BAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,4BAAU,IAAI,OAAQ,OAAQ,EAAG;AAAA,EACxD;AAAA,EAEA,aACE,OACA,cAAc,OAAO,CAAC,GACtB,WAAW,oCAAc,kBACzB;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,MAAM,IAAI,+CAAyB;AAAA,MACvC,cAAc,KAAK,UAAU;AAAA,MAC7B,QAAQ,MAAM,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,IACF,CAAC;AAED,gCAAU,SAAS,QAAmC;AAAA,MACpD,SAAS,EAAE,MAAM,qBAAqB,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ;AACZ,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]}
|
package/dist/video_source.d.cts
CHANGED
package/dist/video_source.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video_source.d.ts","sourceRoot":"","sources":["../src/video_source.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,aAAa,EAEd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,qBAAa,WAAW;IACtB,gBAAgB;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"video_source.d.ts","sourceRoot":"","sources":["../src/video_source.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,aAAa,EAEd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,qBAAa,WAAW;IACtB,gBAAgB;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,MAAM,UAAS;IAEf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;gBAEH,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAuBzC,YAAY,CACV,KAAK,EAAE,UAAU,EACjB,WAAW,SAAY,EACvB,QAAQ,gBAAiC;IAiBrC,KAAK;CAIZ"}
|
package/dist/video_source.js
CHANGED
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
} from "./proto/video_frame_pb.js";
|
|
8
8
|
class VideoSource {
|
|
9
9
|
constructor(width, height) {
|
|
10
|
+
/** @internal */
|
|
11
|
+
this.closed = false;
|
|
10
12
|
var _a;
|
|
11
13
|
this.width = width;
|
|
12
14
|
this.height = height;
|
|
@@ -27,6 +29,9 @@ class VideoSource {
|
|
|
27
29
|
this.ffiHandle = new FfiHandle(res.source.handle.id);
|
|
28
30
|
}
|
|
29
31
|
captureFrame(frame, timestampUs = BigInt(0), rotation = VideoRotation.VIDEO_ROTATION_0) {
|
|
32
|
+
if (this.closed) {
|
|
33
|
+
throw new Error("VideoSource is closed");
|
|
34
|
+
}
|
|
30
35
|
const req = new CaptureVideoFrameRequest({
|
|
31
36
|
sourceHandle: this.ffiHandle.handle,
|
|
32
37
|
buffer: frame.protoInfo(),
|
|
@@ -39,6 +44,7 @@ class VideoSource {
|
|
|
39
44
|
}
|
|
40
45
|
async close() {
|
|
41
46
|
this.ffiHandle.dispose();
|
|
47
|
+
this.closed = true;
|
|
42
48
|
}
|
|
43
49
|
}
|
|
44
50
|
export {
|
package/dist/video_source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type {\n CaptureVideoFrameResponse,\n NewVideoSourceResponse,\n VideoSourceInfo,\n} from './proto/video_frame_pb.js';\nimport {\n CaptureVideoFrameRequest,\n NewVideoSourceRequest,\n VideoRotation,\n VideoSourceType,\n} from './proto/video_frame_pb.js';\nimport type { VideoFrame } from './video_frame.js';\n\nexport class VideoSource {\n /** @internal */\n info?: VideoSourceInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n\n width: number;\n height: number;\n\n constructor(width: number, height: number) {\n this.width = width;\n this.height = height;\n\n const req = new NewVideoSourceRequest({\n type: VideoSourceType.VIDEO_SOURCE_NATIVE,\n resolution: {\n width: width,\n height: height,\n },\n });\n\n const res = FfiClient.instance.request<NewVideoSourceResponse>({\n message: {\n case: 'newVideoSource',\n value: req,\n },\n });\n\n this.info = res.source?.info;\n this.ffiHandle = new FfiHandle(res.source!.handle!.id!);\n }\n\n captureFrame(\n frame: VideoFrame,\n timestampUs = BigInt(0),\n rotation = VideoRotation.VIDEO_ROTATION_0,\n ) {\n const req = new CaptureVideoFrameRequest({\n sourceHandle: this.ffiHandle.handle,\n buffer: frame.protoInfo(),\n rotation,\n timestampUs,\n });\n\n FfiClient.instance.request<CaptureVideoFrameResponse>({\n message: { case: 'captureVideoFrame', value: req },\n });\n }\n\n async close() {\n this.ffiHandle.dispose();\n }\n}\n"],"mappings":"AAGA,SAAS,WAAW,iBAAiB;AAMrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,MAAM,YAAY;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type {\n CaptureVideoFrameResponse,\n NewVideoSourceResponse,\n VideoSourceInfo,\n} from './proto/video_frame_pb.js';\nimport {\n CaptureVideoFrameRequest,\n NewVideoSourceRequest,\n VideoRotation,\n VideoSourceType,\n} from './proto/video_frame_pb.js';\nimport type { VideoFrame } from './video_frame.js';\n\nexport class VideoSource {\n /** @internal */\n info?: VideoSourceInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n closed = false;\n\n width: number;\n height: number;\n\n constructor(width: number, height: number) {\n this.width = width;\n this.height = height;\n\n const req = new NewVideoSourceRequest({\n type: VideoSourceType.VIDEO_SOURCE_NATIVE,\n resolution: {\n width: width,\n height: height,\n },\n });\n\n const res = FfiClient.instance.request<NewVideoSourceResponse>({\n message: {\n case: 'newVideoSource',\n value: req,\n },\n });\n\n this.info = res.source?.info;\n this.ffiHandle = new FfiHandle(res.source!.handle!.id!);\n }\n\n captureFrame(\n frame: VideoFrame,\n timestampUs = BigInt(0),\n rotation = VideoRotation.VIDEO_ROTATION_0,\n ) {\n if (this.closed) {\n throw new Error('VideoSource is closed');\n }\n const req = new CaptureVideoFrameRequest({\n sourceHandle: this.ffiHandle.handle,\n buffer: frame.protoInfo(),\n rotation,\n timestampUs,\n });\n\n FfiClient.instance.request<CaptureVideoFrameResponse>({\n message: { case: 'captureVideoFrame', value: req },\n });\n }\n\n async close() {\n this.ffiHandle.dispose();\n this.closed = true;\n }\n}\n"],"mappings":"AAGA,SAAS,WAAW,iBAAiB;AAMrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,MAAM,YAAY;AAAA,EAWvB,YAAY,OAAe,QAAgB;AAL3C;AAAA,kBAAS;AAvBX;AA6BI,SAAK,QAAQ;AACb,SAAK,SAAS;AAEd,UAAM,MAAM,IAAI,sBAAsB;AAAA,MACpC,MAAM,gBAAgB;AAAA,MACtB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,UAAU,IAAI,OAAQ,OAAQ,EAAG;AAAA,EACxD;AAAA,EAEA,aACE,OACA,cAAc,OAAO,CAAC,GACtB,WAAW,cAAc,kBACzB;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,MAAM,IAAI,yBAAyB;AAAA,MACvC,cAAc,KAAK,UAAU;AAAA,MAC7B,QAAQ,MAAM,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,IACF,CAAC;AAED,cAAU,SAAS,QAAmC;AAAA,MACpD,SAAS,EAAE,MAAM,qBAAqB,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ;AACZ,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS;AAAA,EAChB;AACF;","names":[]}
|
package/dist/video_stream.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type {\n NewVideoStreamResponse,\n VideoRotation,\n VideoStreamInfo,\n} from './proto/video_frame_pb.js';\nimport { NewVideoStreamRequest, VideoStreamType } from './proto/video_frame_pb.js';\nimport type { Track } from './track.js';\nimport { VideoFrame } from './video_frame.js';\n\nexport type VideoFrameEvent = {\n frame: VideoFrame;\n timestampUs: bigint;\n rotation: VideoRotation;\n};\n\nexport class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {\n /** @internal */\n info?: VideoStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (VideoFrameEvent | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<VideoFrameEvent>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n\n constructor(track: Track) {\n this.track = track;\n\n const req = new NewVideoStreamRequest({\n type: VideoStreamType.VIDEO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n });\n\n const res = FfiClient.instance.request<NewVideoStreamResponse>({\n message: {\n case: 'newVideoStream',\n value: req,\n },\n });\n\n this.info = res.stream?.info;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'videoStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const rotation = streamEvent.value.rotation;\n const timestampUs = streamEvent.value.timestampUs;\n const frame = VideoFrame.fromOwnedInfo(streamEvent.value.buffer!);\n const value = { rotation, timestampUs, frame };\n if (this.queueResolve) {\n this.queueResolve({\n done: false,\n value: {\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n },\n });\n } else {\n this.eventQueue.push({\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n });\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<VideoFrameEvent>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<VideoFrameEvent>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): VideoStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsB;AAEtB,wBAAqD;AAMrD,4BAAuD;AAEvD,yBAA2B;AAQpB,MAAM,YAA8D;AAAA,EAczE,YAAY,OAAc;AAR1B;AAAA,sBAAyC,CAAC;AAE1C;AAAA,wBAA0E;AAE1E;AAAA,iBAAQ,IAAI,mBAAM;AAyBlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,WAAW,YAAY,MAAM;AACnC,gBAAM,cAAc,YAAY,MAAM;AACtC,gBAAM,QAAQ,8BAAW,cAAc,YAAY,MAAM,MAAO;AAChE,gBAAM,QAAQ,EAAE,UAAU,aAAa,MAAM;AAC7C,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,OAAO,MAAM;AAAA,gBACb,aAAa,MAAM;AAAA,gBACnB,UAAU,MAAM;AAAA,cAClB;AAAA,YACF,CAAC;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/video_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type {\n NewVideoStreamResponse,\n VideoRotation,\n VideoStreamInfo,\n} from './proto/video_frame_pb.js';\nimport { NewVideoStreamRequest, VideoStreamType } from './proto/video_frame_pb.js';\nimport type { Track } from './track.js';\nimport { VideoFrame } from './video_frame.js';\n\nexport type VideoFrameEvent = {\n frame: VideoFrame;\n timestampUs: bigint;\n rotation: VideoRotation;\n};\n\nexport class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {\n /** @internal */\n info?: VideoStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (VideoFrameEvent | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<VideoFrameEvent>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n\n constructor(track: Track) {\n this.track = track;\n\n const req = new NewVideoStreamRequest({\n type: VideoStreamType.VIDEO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n });\n\n const res = FfiClient.instance.request<NewVideoStreamResponse>({\n message: {\n case: 'newVideoStream',\n value: req,\n },\n });\n\n this.info = res.stream?.info;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'videoStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const rotation = streamEvent.value.rotation;\n const timestampUs = streamEvent.value.timestampUs;\n const frame = VideoFrame.fromOwnedInfo(streamEvent.value.buffer!);\n const value = { rotation, timestampUs, frame };\n if (this.queueResolve) {\n this.queueResolve({\n done: false,\n value: {\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n },\n });\n this.queueResolve = null;\n } else {\n this.eventQueue.push({\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n });\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<VideoFrameEvent>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<VideoFrameEvent>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): VideoStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsB;AAEtB,wBAAqD;AAMrD,4BAAuD;AAEvD,yBAA2B;AAQpB,MAAM,YAA8D;AAAA,EAczE,YAAY,OAAc;AAR1B;AAAA,sBAAyC,CAAC;AAE1C;AAAA,wBAA0E;AAE1E;AAAA,iBAAQ,IAAI,mBAAM;AAyBlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,WAAW,YAAY,MAAM;AACnC,gBAAM,cAAc,YAAY,MAAM;AACtC,gBAAM,QAAQ,8BAAW,cAAc,YAAY,MAAM,MAAO;AAChE,gBAAM,QAAQ,EAAE,UAAU,aAAa,MAAM;AAC7C,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,OAAO,MAAM;AAAA,gBACb,aAAa,MAAM;AAAA,gBACnB,UAAU,MAAM;AAAA,cAClB;AAAA,YACF,CAAC;AACD,iBAAK,eAAe;AAAA,UACtB,OAAO;AACL,iBAAK,WAAW,KAAK;AAAA,cACnB,OAAO,MAAM;AAAA,cACb,aAAa,MAAM;AAAA,cACnB,UAAU,MAAM;AAAA,YAClB,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,sCAAU,SAAS,IAAI,iCAAe,UAAU,KAAK,OAAO;AAC5D;AAAA,MACJ;AAAA,IACF;AA7FF;AAoCI,SAAK,QAAQ;AAEb,UAAM,MAAM,IAAI,4CAAsB;AAAA,MACpC,MAAM,sCAAgB;AAAA,MACtB,aAAa,MAAM,WAAW;AAAA,IAChC,CAAC;AAED,UAAM,MAAM,4BAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,4BAAU,IAAI,OAAQ,OAAQ,EAAG;AAEtD,gCAAU,SAAS,GAAG,iCAAe,UAAU,KAAK,OAAO;AAAA,EAC7D;AAAA,EAyCA,MAAM,OAAiD;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AACrC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,aAAO;AACP,YAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,UAAI,OAAO;AACT,eAAO,EAAE,MAAM,OAAO,MAAM;AAAA,MAC9B,OAAO;AACL,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAAA,IACF;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,CAAC,YAAa,KAAK,eAAe;AAAA,IACpC;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,SAAK,WAAW,KAAK,IAAI;AACzB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAiB;AACpC,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video_stream.d.ts","sourceRoot":"","sources":["../src/video_stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,qBAAa,WAAY,YAAW,qBAAqB,CAAC,eAAe,CAAC;IACxE,gBAAgB;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,UAAU,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAM;IAC5C,gBAAgB;IAChB,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/E,gBAAgB;IAChB,KAAK,QAAe;IAEpB,KAAK,EAAE,KAAK,CAAC;gBAED,KAAK,EAAE,KAAK;IAqBxB,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"video_stream.d.ts","sourceRoot":"","sources":["../src/video_stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,qBAAa,WAAY,YAAW,qBAAqB,CAAC,eAAe,CAAC;IACxE,gBAAgB;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,UAAU,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAM;IAC5C,gBAAgB;IAChB,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/E,gBAAgB;IAChB,KAAK,QAAe;IAEpB,KAAK,EAAE,KAAK,CAAC;gBAED,KAAK,EAAE,KAAK;IAqBxB,OAAO,CAAC,OAAO,CAqCb;IAEI,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAkBtD,KAAK;IAKL,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW;CAGtC"}
|
package/dist/video_stream.js
CHANGED
package/dist/video_stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type {\n NewVideoStreamResponse,\n VideoRotation,\n VideoStreamInfo,\n} from './proto/video_frame_pb.js';\nimport { NewVideoStreamRequest, VideoStreamType } from './proto/video_frame_pb.js';\nimport type { Track } from './track.js';\nimport { VideoFrame } from './video_frame.js';\n\nexport type VideoFrameEvent = {\n frame: VideoFrame;\n timestampUs: bigint;\n rotation: VideoRotation;\n};\n\nexport class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {\n /** @internal */\n info?: VideoStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (VideoFrameEvent | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<VideoFrameEvent>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n\n constructor(track: Track) {\n this.track = track;\n\n const req = new NewVideoStreamRequest({\n type: VideoStreamType.VIDEO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n });\n\n const res = FfiClient.instance.request<NewVideoStreamResponse>({\n message: {\n case: 'newVideoStream',\n value: req,\n },\n });\n\n this.info = res.stream?.info;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'videoStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const rotation = streamEvent.value.rotation;\n const timestampUs = streamEvent.value.timestampUs;\n const frame = VideoFrame.fromOwnedInfo(streamEvent.value.buffer!);\n const value = { rotation, timestampUs, frame };\n if (this.queueResolve) {\n this.queueResolve({\n done: false,\n value: {\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n },\n });\n } else {\n this.eventQueue.push({\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n });\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<VideoFrameEvent>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<VideoFrameEvent>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): VideoStream {\n return this;\n }\n}\n"],"mappings":"AAGA,SAAS,aAAa;AAEtB,SAAS,WAAW,gBAAgB,iBAAiB;AAMrD,SAAS,uBAAuB,uBAAuB;AAEvD,SAAS,kBAAkB;AAQpB,MAAM,YAA8D;AAAA,EAczE,YAAY,OAAc;AAR1B;AAAA,sBAAyC,CAAC;AAE1C;AAAA,wBAA0E;AAE1E;AAAA,iBAAQ,IAAI,MAAM;AAyBlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,WAAW,YAAY,MAAM;AACnC,gBAAM,cAAc,YAAY,MAAM;AACtC,gBAAM,QAAQ,WAAW,cAAc,YAAY,MAAM,MAAO;AAChE,gBAAM,QAAQ,EAAE,UAAU,aAAa,MAAM;AAC7C,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,OAAO,MAAM;AAAA,gBACb,aAAa,MAAM;AAAA,gBACnB,UAAU,MAAM;AAAA,cAClB;AAAA,YACF,CAAC;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/video_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type {\n NewVideoStreamResponse,\n VideoRotation,\n VideoStreamInfo,\n} from './proto/video_frame_pb.js';\nimport { NewVideoStreamRequest, VideoStreamType } from './proto/video_frame_pb.js';\nimport type { Track } from './track.js';\nimport { VideoFrame } from './video_frame.js';\n\nexport type VideoFrameEvent = {\n frame: VideoFrame;\n timestampUs: bigint;\n rotation: VideoRotation;\n};\n\nexport class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {\n /** @internal */\n info?: VideoStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (VideoFrameEvent | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<VideoFrameEvent>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n\n constructor(track: Track) {\n this.track = track;\n\n const req = new NewVideoStreamRequest({\n type: VideoStreamType.VIDEO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n });\n\n const res = FfiClient.instance.request<NewVideoStreamResponse>({\n message: {\n case: 'newVideoStream',\n value: req,\n },\n });\n\n this.info = res.stream?.info;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'videoStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const rotation = streamEvent.value.rotation;\n const timestampUs = streamEvent.value.timestampUs;\n const frame = VideoFrame.fromOwnedInfo(streamEvent.value.buffer!);\n const value = { rotation, timestampUs, frame };\n if (this.queueResolve) {\n this.queueResolve({\n done: false,\n value: {\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n },\n });\n this.queueResolve = null;\n } else {\n this.eventQueue.push({\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n });\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<VideoFrameEvent>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<VideoFrameEvent>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): VideoStream {\n return this;\n }\n}\n"],"mappings":"AAGA,SAAS,aAAa;AAEtB,SAAS,WAAW,gBAAgB,iBAAiB;AAMrD,SAAS,uBAAuB,uBAAuB;AAEvD,SAAS,kBAAkB;AAQpB,MAAM,YAA8D;AAAA,EAczE,YAAY,OAAc;AAR1B;AAAA,sBAAyC,CAAC;AAE1C;AAAA,wBAA0E;AAE1E;AAAA,iBAAQ,IAAI,MAAM;AAyBlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,WAAW,YAAY,MAAM;AACnC,gBAAM,cAAc,YAAY,MAAM;AACtC,gBAAM,QAAQ,WAAW,cAAc,YAAY,MAAM,MAAO;AAChE,gBAAM,QAAQ,EAAE,UAAU,aAAa,MAAM;AAC7C,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,OAAO,MAAM;AAAA,gBACb,aAAa,MAAM;AAAA,gBACnB,UAAU,MAAM;AAAA,cAClB;AAAA,YACF,CAAC;AACD,iBAAK,eAAe;AAAA,UACtB,OAAO;AACL,iBAAK,WAAW,KAAK;AAAA,cACnB,OAAO,MAAM;AAAA,cACb,aAAa,MAAM;AAAA,cACnB,UAAU,MAAM;AAAA,YAClB,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,oBAAU,SAAS,IAAI,eAAe,UAAU,KAAK,OAAO;AAC5D;AAAA,MACJ;AAAA,IACF;AA7FF;AAoCI,SAAK,QAAQ;AAEb,UAAM,MAAM,IAAI,sBAAsB;AAAA,MACpC,MAAM,gBAAgB;AAAA,MACtB,aAAa,MAAM,WAAW;AAAA,IAChC,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,UAAU,IAAI,OAAQ,OAAQ,EAAG;AAEtD,cAAU,SAAS,GAAG,eAAe,UAAU,KAAK,OAAO;AAAA,EAC7D;AAAA,EAyCA,MAAM,OAAiD;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AACrC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,aAAO;AACP,YAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,UAAI,OAAO;AACT,eAAO,EAAE,MAAM,OAAO,MAAM;AAAA,MAC9B,OAAO;AACL,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAAA,IACF;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,CAAC,YAAa,KAAK,eAAe;AAAA,IACpC;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,SAAK,WAAW,KAAK,IAAI;AACzB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAiB;AACpC,WAAO;AAAA,EACT;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "LiveKit RTC Node",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "LiveKit",
|
|
6
|
-
"version": "0.13.
|
|
6
|
+
"version": "0.13.9",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"require": "dist/index.cjs",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
@@ -61,11 +61,11 @@
|
|
|
61
61
|
"@bufbuild/protoc-gen-es": "^1.10.0"
|
|
62
62
|
},
|
|
63
63
|
"optionalDependencies": {
|
|
64
|
-
"@livekit/rtc-node-darwin-arm64": "0.13.
|
|
65
|
-
"@livekit/rtc-node-darwin-x64": "0.13.
|
|
66
|
-
"@livekit/rtc-node-linux-arm64-gnu": "0.13.
|
|
67
|
-
"@livekit/rtc-node-linux-x64-gnu": "0.13.
|
|
68
|
-
"@livekit/rtc-node-win32-x64-msvc": "0.13.
|
|
64
|
+
"@livekit/rtc-node-darwin-arm64": "0.13.9",
|
|
65
|
+
"@livekit/rtc-node-darwin-x64": "0.13.9",
|
|
66
|
+
"@livekit/rtc-node-linux-arm64-gnu": "0.13.9",
|
|
67
|
+
"@livekit/rtc-node-linux-x64-gnu": "0.13.9",
|
|
68
|
+
"@livekit/rtc-node-win32-x64-msvc": "0.13.9"
|
|
69
69
|
},
|
|
70
70
|
"engines": {
|
|
71
71
|
"node": ">= 18"
|
package/src/audio_stream.ts
CHANGED
|
@@ -64,6 +64,7 @@ export class AudioStream implements AsyncIterableIterator<AudioFrame> {
|
|
|
64
64
|
const frame = AudioFrame.fromOwnedInfo(streamEvent.value.frame!);
|
|
65
65
|
if (this.queueResolve) {
|
|
66
66
|
this.queueResolve({ done: false, value: frame });
|
|
67
|
+
this.queueResolve = null;
|
|
67
68
|
} else {
|
|
68
69
|
this.eventQueue.push(frame);
|
|
69
70
|
}
|
package/src/nodejs.rs
CHANGED
|
@@ -40,23 +40,30 @@ fn livekit_initialize(cb: JsFunction, capture_logs: bool, sdk_version: String) {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
#[napi]
|
|
43
|
-
fn livekit_ffi_request(data: Uint8Array) -> Uint8Array {
|
|
43
|
+
fn livekit_ffi_request(data: Uint8Array) -> Result<Uint8Array> {
|
|
44
44
|
let data = data.to_vec();
|
|
45
45
|
let res = match proto::FfiRequest::decode(data.as_slice()) {
|
|
46
46
|
Ok(res) => res,
|
|
47
47
|
Err(err) => {
|
|
48
|
-
|
|
48
|
+
return Err(Error::from_reason(format!(
|
|
49
|
+
"failed to decode request: {}",
|
|
50
|
+
err.to_string()
|
|
51
|
+
)));
|
|
49
52
|
}
|
|
50
53
|
};
|
|
51
54
|
|
|
52
|
-
let res = match server::requests::handle_request(&FFI_SERVER, res) {
|
|
55
|
+
let res = match server::requests::handle_request(&FFI_SERVER, res.clone()) {
|
|
53
56
|
Ok(res) => res,
|
|
54
57
|
Err(err) => {
|
|
55
|
-
|
|
58
|
+
return Err(Error::from_reason(format!(
|
|
59
|
+
"failed to handle request: {} ({:?})",
|
|
60
|
+
err.to_string(),
|
|
61
|
+
res
|
|
62
|
+
)));
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
65
|
.encode_to_vec();
|
|
59
|
-
Uint8Array::new(res)
|
|
66
|
+
Ok(Uint8Array::new(res))
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
// FfiHandle must be used instead
|
package/src/participant.ts
CHANGED
|
@@ -257,8 +257,9 @@ export class LocalParticipant extends Participant {
|
|
|
257
257
|
attributes?: Record<string, string>;
|
|
258
258
|
destinationIdentities?: Array<string>;
|
|
259
259
|
streamId?: string;
|
|
260
|
+
senderIdentity?: string;
|
|
260
261
|
}): Promise<TextStreamWriter> {
|
|
261
|
-
const senderIdentity = this.identity;
|
|
262
|
+
const senderIdentity = options?.senderIdentity ?? this.identity;
|
|
262
263
|
const streamId = options?.streamId ?? crypto.randomUUID();
|
|
263
264
|
const destinationIdentities = options?.destinationIdentities;
|
|
264
265
|
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SDK_VERSION = "0.13.
|
|
1
|
+
export const SDK_VERSION = "0.13.9";
|
package/src/video_source.ts
CHANGED
|
@@ -20,6 +20,8 @@ export class VideoSource {
|
|
|
20
20
|
info?: VideoSourceInfo;
|
|
21
21
|
/** @internal */
|
|
22
22
|
ffiHandle: FfiHandle;
|
|
23
|
+
/** @internal */
|
|
24
|
+
closed = false;
|
|
23
25
|
|
|
24
26
|
width: number;
|
|
25
27
|
height: number;
|
|
@@ -52,6 +54,9 @@ export class VideoSource {
|
|
|
52
54
|
timestampUs = BigInt(0),
|
|
53
55
|
rotation = VideoRotation.VIDEO_ROTATION_0,
|
|
54
56
|
) {
|
|
57
|
+
if (this.closed) {
|
|
58
|
+
throw new Error('VideoSource is closed');
|
|
59
|
+
}
|
|
55
60
|
const req = new CaptureVideoFrameRequest({
|
|
56
61
|
sourceHandle: this.ffiHandle.handle,
|
|
57
62
|
buffer: frame.protoInfo(),
|
|
@@ -66,5 +71,6 @@ export class VideoSource {
|
|
|
66
71
|
|
|
67
72
|
async close() {
|
|
68
73
|
this.ffiHandle.dispose();
|
|
74
|
+
this.closed = true;
|
|
69
75
|
}
|
|
70
76
|
}
|