@livekit/rtc-node 0.13.33 → 0.13.35
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/README.md +0 -5
- package/dist/{audio_stream-CnODFAmo.d.cts → audio_stream-BNVaONuH.d.cts} +36 -11
- package/dist/audio_stream.d.cts +2 -2
- package/dist/data_streams/index.d.cts +1 -1
- package/dist/data_streams/stream_reader.cjs +97 -58
- package/dist/data_streams/stream_reader.cjs.map +1 -1
- package/dist/data_streams/stream_reader.d.cts +1 -1
- package/dist/data_streams/stream_reader.d.ts +28 -11
- package/dist/data_streams/stream_reader.d.ts.map +1 -1
- package/dist/data_streams/stream_writer.d.cts +1 -1
- package/dist/data_streams/types.cjs.map +1 -1
- package/dist/data_streams/types.d.cts +1 -1
- package/dist/data_streams/types.d.ts +6 -0
- package/dist/data_streams/types.d.ts.map +1 -1
- package/dist/e2ee.cjs +5 -1
- package/dist/e2ee.cjs.map +1 -1
- package/dist/e2ee.d.cts +3 -1
- package/dist/e2ee.d.ts +3 -1
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/participant.cjs +178 -196
- package/dist/participant.cjs.map +1 -1
- package/dist/participant.d.cts +2 -2
- package/dist/participant.d.ts +22 -5
- package/dist/participant.d.ts.map +1 -1
- package/dist/room.cjs +166 -126
- package/dist/room.cjs.map +1 -1
- package/dist/room.d.cts +3 -3
- package/dist/room.d.ts +16 -8
- package/dist/room.d.ts.map +1 -1
- package/dist/tests/e2e_common.cjs +157 -0
- package/dist/tests/e2e_common.cjs.map +1 -0
- package/dist/tests/e2e_common.d.cts +56 -0
- package/dist/tests/e2e_common.d.ts +37 -0
- package/dist/tests/e2e_common.d.ts.map +1 -0
- package/dist/track.d.cts +2 -2
- package/dist/track_publication.d.cts +2 -2
- package/dist/{types-_PdPVish.d.cts → types-f7wTlFjs.d.cts} +34 -11
- package/dist/utils.cjs +27 -2
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +8 -1
- package/dist/utils.d.ts +6 -0
- package/dist/utils.d.ts.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/video_stream.d.cts +2 -2
- package/package.json +2 -2
- package/src/audio_stream_room_lifecycle.test.ts +4 -1
- package/src/data_streams/stream_reader.ts +132 -82
- package/src/data_streams/types.ts +6 -0
- package/src/e2ee.ts +7 -0
- package/src/participant.ts +251 -228
- package/src/room.ts +233 -144
- package/src/tests/e2e.test.ts +50 -139
- package/src/tests/e2e_common.ts +163 -0
- package/src/tests/e2e_data_streams.test.ts +639 -0
- package/src/utils.ts +30 -0
- package/src/version.ts +1 -1
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 {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n ParticipantKind,\n type ParticipantKindDetail,\n} from '@livekit/rtc-ffi-bindings';\nimport {\n ChatMessage as ChatMessageModel,\n DataStream_ByteHeader,\n DataStream_Chunk,\n DataStream_Header,\n DataStream_OperationType,\n DataStream_TextHeader,\n DataStream_Trailer,\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n type PublishDataCallback,\n PublishDataRequest,\n type PublishDataResponse,\n type PublishSipDtmfCallback,\n PublishSipDtmfRequest,\n type PublishSipDtmfResponse,\n type PublishTrackCallback,\n PublishTrackRequest,\n type PublishTrackResponse,\n type PublishTranscriptionCallback,\n PublishTranscriptionRequest,\n type PublishTranscriptionResponse,\n type SendChatMessageCallback,\n SendChatMessageRequest,\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 SetLocalAttributesRequest,\n type SetLocalAttributesResponse,\n type SetLocalMetadataCallback,\n SetLocalMetadataRequest,\n type SetLocalMetadataResponse,\n type SetLocalNameCallback,\n SetLocalNameRequest,\n type SetLocalNameResponse,\n type TrackPublishOptions,\n type UnpublishTrackCallback,\n UnpublishTrackRequest,\n type UnpublishTrackResponse,\n} from '@livekit/rtc-ffi-bindings';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from '@livekit/rtc-ffi-bindings';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\n} from '@livekit/rtc-ffi-bindings';\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 { 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 kindDetails(): ParticipantKindDetail[] {\n return this.info.kindDetails ?? [];\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 private ffiEventLock: Mutex;\n\n // Signal that fires when the owning Room disconnects, used to cancel\n // pending FfiClient.waitFor() listeners so they don't leak.\n private disconnectSignal: AbortSignal;\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n constructor(info: OwnedParticipant, ffiEventLock: Mutex, disconnectSignal: AbortSignal) {\n super(info);\n this.ffiEventLock = ffiEventLock;\n this.disconnectSignal = disconnectSignal;\n }\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>(\n (ev) => ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 totalSize?: number;\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 totalSize: options?.totalSize,\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 totalLength: numberToBigInt(info.totalSize),\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 // Send a trailer with the error reason so the remote side's stream\n // controller is closed instead of waiting for data that won't arrive.\n async abort(err) {\n log.error(err, 'Sink Error');\n try {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: err instanceof Error ? err.message : String(err ?? ''),\n }),\n });\n await sendTrailer(trailerReq);\n } catch {\n // Best-effort: the connection may already be gone.\n }\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({\n ...options,\n totalSize: new TextEncoder().encode(text).byteLength,\n });\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 // Send a trailer with the error reason so the remote side's stream\n // controller is closed instead of waiting for data that won't arrive.\n async abort(err) {\n log.error(err, 'Sink error');\n try {\n const trailerReq = new SendStreamTrailerRequest({\n senderIdentity,\n localParticipantHandle: localHandle,\n destinationIdentities,\n trailer: new DataStream_Trailer({\n streamId,\n reason: err instanceof Error ? err.message : String(err ?? ''),\n }),\n });\n await sendTrailer(trailerReq);\n } catch {\n // Best-effort: the connection may already be gone.\n }\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();\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>(\n (ev) => ev.message.case == type && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n private sendStreamChunk = async (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>(\n (ev) => ev.message.case == type && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n };\n\n private sendStreamTrailer = async (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>(\n (ev) => ev.message.case == type && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 unlock = await this.ffiEventLock.lock();\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n try {\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>(\n (ev) => ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 // Stamp the server-assigned publication\n // SID onto the track so track.sid == publication.sid. Both\n // Track.pushProcessorMetadataToStream and the localTrackRepublished\n // handler look up the local publication by this SID; without it they\n // depend on createAudioTrack's provisional SID happening to match.\n if (track.info && track_publication.sid) {\n track.info.sid = track_publication.sid;\n }\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 } finally {\n unlock();\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const unlock = await this.ffiEventLock.lock();\n try {\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>(\n (ev) => ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 // Clear the processor's room context here too: this path races the\n // localTrackUnpublished room event, and whichever loses finds the\n // publication already gone and skips its own setRoom(null). Calling it\n // from both paths guarantees the processor is cleared (and the\n // tokenRefreshed listener detached); setRoom(null) is idempotent, so a\n // double-clear when this path wins is safe.\n if (pub.track) {\n pub.track.setRoom(null);\n }\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n } finally {\n unlock();\n }\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>(\n (ev) => ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId,\n { signal: this.disconnectSignal },\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_rtc_ffi_bindings","ProtoTranscriptionSegment","ChatMessageModel"]}
|
|
1
|
+
{"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { type Mutex } from '@livekit/mutex';\nimport {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n ParticipantKind,\n type ParticipantKindDetail,\n} from '@livekit/rtc-ffi-bindings';\nimport {\n type ByteStreamOpenCallback,\n ByteStreamOpenRequest,\n type ByteStreamOpenResponse,\n type ByteStreamWriterCloseCallback,\n ByteStreamWriterCloseRequest,\n type ByteStreamWriterCloseResponse,\n type ByteStreamWriterWriteCallback,\n ByteStreamWriterWriteRequest,\n type ByteStreamWriterWriteResponse,\n ChatMessage as ChatMessageModel,\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n type PublishDataCallback,\n PublishDataRequest,\n type PublishDataResponse,\n type PublishSipDtmfCallback,\n PublishSipDtmfRequest,\n type PublishSipDtmfResponse,\n type PublishTrackCallback,\n PublishTrackRequest,\n type PublishTrackResponse,\n type PublishTranscriptionCallback,\n PublishTranscriptionRequest,\n type PublishTranscriptionResponse,\n type SendChatMessageCallback,\n SendChatMessageRequest,\n type SendChatMessageResponse,\n type SetLocalAttributesCallback,\n SetLocalAttributesRequest,\n type SetLocalAttributesResponse,\n type SetLocalMetadataCallback,\n SetLocalMetadataRequest,\n type SetLocalMetadataResponse,\n type SetLocalNameCallback,\n SetLocalNameRequest,\n type SetLocalNameResponse,\n StreamByteOptions,\n type StreamSendFileCallback,\n StreamSendFileRequest,\n type StreamSendFileResponse,\n type StreamSendTextCallback,\n StreamSendTextRequest,\n type StreamSendTextResponse,\n StreamTextOptions,\n type TextStreamOpenCallback,\n TextStreamOpenRequest,\n type TextStreamOpenResponse,\n type TextStreamWriterCloseCallback,\n TextStreamWriterCloseRequest,\n type TextStreamWriterCloseResponse,\n type TextStreamWriterWriteCallback,\n TextStreamWriterWriteRequest,\n type TextStreamWriterWriteResponse,\n type TrackPublishOptions,\n type UnpublishTrackCallback,\n UnpublishTrackRequest,\n type UnpublishTrackResponse,\n} from '@livekit/rtc-ffi-bindings';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from '@livekit/rtc-ffi-bindings';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\n} from '@livekit/rtc-ffi-bindings';\nimport type { PathLike } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport {\n type ByteStreamOptions,\n ByteStreamWriter,\n TextStreamWriter,\n} from './data_streams/index.js';\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport { log } from './log.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 { byteStreamInfoFromProto, textStreamInfoFromProto } from './utils.js';\nimport { numberToBigInt } from './utils.js';\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 kindDetails(): ParticipantKindDetail[] {\n return this.info.kindDetails ?? [];\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 private ffiEventLock: Mutex;\n\n // Signal that fires when the owning Room disconnects, used to cancel\n // pending FfiClient.waitFor() listeners so they don't leak.\n private disconnectSignal: AbortSignal;\n\n // Handle ids of data stream writers that have been opened but not yet\n // closed. The FFI close request consumes the handle (take_handle), so an\n // entry is removed as soon as a close is sent for it; whatever is left when\n // the room disconnects is dropped by disposeOpenStreamWriters(). Only the\n // ids are kept — wrapping them in FfiHandle would make GC drop a handle the\n // close request already consumed.\n private openStreamWriters = new Set<bigint>();\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n constructor(info: OwnedParticipant, ffiEventLock: Mutex, disconnectSignal: AbortSignal) {\n super(info);\n this.ffiEventLock = ffiEventLock;\n this.disconnectSignal = disconnectSignal;\n }\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>(\n (ev) => ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 req = new TextStreamOpenRequest({\n localParticipantHandle: this.ffi_handle.handle,\n options: new StreamTextOptions({\n topic: options?.topic ?? '',\n attributes: options?.attributes,\n destinationIdentities: options?.destinationIdentities,\n id: options?.streamId,\n senderIdentity: options?.senderIdentity ?? this.identity,\n }),\n });\n\n const res = FfiClient.instance.request<TextStreamOpenResponse>({\n message: { case: 'textStreamOpen', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<TextStreamOpenCallback>(\n (ev) => ev.message.case == 'textStreamOpen' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.result.case !== 'writer') {\n throw new Error(cb.result.case === 'error' ? cb.result.value.description : 'unknown error');\n }\n\n const writerHandle = cb.result.value.handle!.id!;\n const info = textStreamInfoFromProto(cb.result.value.info!);\n this.openStreamWriters.add(writerHandle);\n\n // Sends the close request at most once: it consumes the writer handle on\n // the native side, so a second one would fail and, worse, the handle must\n // no longer be dropped by disconnect cleanup.\n const closeWriter = async (reason?: string) => {\n if (!this.openStreamWriters.delete(writerHandle)) {\n return;\n }\n await this.textStreamWriterClose(new TextStreamWriterCloseRequest({ writerHandle, reason }));\n };\n\n const writableStream = new WritableStream<string>({\n // Implement the sink\n write: async (text) => {\n try {\n await this.textStreamWriterWrite(\n new TextStreamWriterWriteRequest({ writerHandle, text }),\n );\n } catch (err) {\n // A rejected write leaves the writable stream errored, and an errored\n // stream never runs the sink's close()/abort() — a later close() just\n // rejects with this error. Close the native writer here so its handle\n // isn't held for the lifetime of the process and peers get an\n // end-of-stream instead of a stream that never terminates.\n await closeWriter(err instanceof Error ? err.message : String(err ?? '')).catch(() => {\n // Best-effort: the connection may already be gone.\n });\n throw err;\n }\n },\n close: () => closeWriter(),\n // Close the stream with the error reason so the remote side's stream\n // controller is closed instead of waiting for data that won't arrive.\n abort: async (err) => {\n log.error(err, 'Sink Error');\n try {\n await closeWriter(err instanceof Error ? err.message : String(err ?? ''));\n } catch {\n // Best-effort: the connection may already be gone.\n }\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 * Whether the payload may be compressed on the wire. Defaults to true;\n * compression is only applied when it actually reduces the payload size\n * and every recipient supports it.\n */\n compress?: boolean;\n },\n ) {\n const req = new StreamSendTextRequest({\n localParticipantHandle: this.ffi_handle.handle,\n options: new StreamTextOptions({\n topic: options?.topic ?? '',\n attributes: options?.attributes,\n destinationIdentities: options?.destinationIdentities,\n id: options?.streamId,\n senderIdentity: this.identity,\n compress: options?.compress,\n }),\n text,\n });\n\n const res = FfiClient.instance.request<StreamSendTextResponse>({\n message: { case: 'sendText', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<StreamSendTextCallback>(\n (ev) => ev.message.case == 'sendText' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.result.case !== 'info') {\n throw new Error(cb.result.case === 'error' ? cb.result.value.description : 'unknown error');\n }\n\n return textStreamInfoFromProto(cb.result.value);\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 req = new ByteStreamOpenRequest({\n localParticipantHandle: this.ffi_handle.handle,\n options: new StreamByteOptions({\n topic: options?.topic ?? '',\n attributes: options?.attributes,\n destinationIdentities: options?.destinationIdentities,\n id: options?.streamId,\n name: options?.name ?? 'unknown',\n mimeType: options?.mimeType ?? 'application/octet-stream',\n totalLength: numberToBigInt(options?.totalSize),\n senderIdentity: this.identity,\n }),\n });\n\n const res = FfiClient.instance.request<ByteStreamOpenResponse>({\n message: { case: 'byteStreamOpen', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<ByteStreamOpenCallback>(\n (ev) => ev.message.case == 'byteStreamOpen' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.result.case !== 'writer') {\n throw new Error(cb.result.case === 'error' ? cb.result.value.description : 'unknown error');\n }\n\n const writerHandle = cb.result.value.handle!.id!;\n const info = byteStreamInfoFromProto(cb.result.value.info!);\n this.openStreamWriters.add(writerHandle);\n\n // Sends the close request at most once: it consumes the writer handle on\n // the native side, so a second one would fail and, worse, the handle must\n // no longer be dropped by disconnect cleanup.\n const closeWriter = async (reason?: string) => {\n if (!this.openStreamWriters.delete(writerHandle)) {\n return;\n }\n await this.byteStreamWriterClose(new ByteStreamWriterCloseRequest({ writerHandle, reason }));\n };\n\n const writableStream = new WritableStream<Uint8Array>({\n write: async (chunk) => {\n try {\n await this.byteStreamWriterWrite(\n new ByteStreamWriterWriteRequest({ writerHandle, bytes: chunk }),\n );\n } catch (err) {\n // A rejected write leaves the writable stream errored, and an errored\n // stream never runs the sink's close()/abort() — a later close() just\n // rejects with this error. Close the native writer here so its handle\n // isn't held for the lifetime of the process and peers get an\n // end-of-stream instead of a stream that never terminates.\n await closeWriter(err instanceof Error ? err.message : String(err ?? '')).catch(() => {\n // Best-effort: the connection may already be gone.\n });\n throw err;\n }\n },\n close: () => closeWriter(),\n // Close the stream with the error reason so the remote side's stream\n // controller is closed instead of waiting for data that won't arrive.\n abort: async (err) => {\n log.error(err, 'Sink error');\n try {\n await closeWriter(err instanceof Error ? err.message : String(err ?? ''));\n } catch {\n // Best-effort: the connection may already be gone.\n }\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 filePath = path instanceof URL ? fileURLToPath(path) : path.toString();\n\n const req = new StreamSendFileRequest({\n localParticipantHandle: this.ffi_handle.handle,\n options: new StreamByteOptions({\n topic: options?.topic ?? '',\n attributes: options?.attributes,\n destinationIdentities: options?.destinationIdentities,\n name: options?.name ?? 'unknown',\n mimeType: options?.mimeType ?? 'application/octet-stream',\n senderIdentity: this.identity,\n compress: options?.compress,\n }),\n filePath,\n });\n\n const res = FfiClient.instance.request<StreamSendFileResponse>({\n message: { case: 'sendFile', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<StreamSendFileCallback>(\n (ev) => ev.message.case == 'sendFile' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.result.case === 'error') {\n throw new Error(cb.result.value.description);\n }\n }\n\n private textStreamWriterWrite = async (req: TextStreamWriterWriteRequest) => {\n const res = FfiClient.instance.request<TextStreamWriterWriteResponse>({\n message: { case: 'textStreamWrite', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<TextStreamWriterWriteCallback>(\n (ev) => ev.message.case == 'textStreamWriterWrite' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.error) {\n throw new Error(cb.error.description);\n }\n };\n\n private textStreamWriterClose = async (req: TextStreamWriterCloseRequest) => {\n const res = FfiClient.instance.request<TextStreamWriterCloseResponse>({\n message: { case: 'textStreamClose', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<TextStreamWriterCloseCallback>(\n (ev) => ev.message.case == 'textStreamWriterClose' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.error) {\n throw new Error(cb.error.description);\n }\n };\n\n private byteStreamWriterWrite = async (req: ByteStreamWriterWriteRequest) => {\n const res = FfiClient.instance.request<ByteStreamWriterWriteResponse>({\n message: { case: 'byteStreamWrite', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<ByteStreamWriterWriteCallback>(\n (ev) => ev.message.case == 'byteStreamWriterWrite' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.error) {\n throw new Error(cb.error.description);\n }\n };\n\n private byteStreamWriterClose = async (req: ByteStreamWriterCloseRequest) => {\n const res = FfiClient.instance.request<ByteStreamWriterCloseResponse>({\n message: { case: 'byteStreamClose', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<ByteStreamWriterCloseCallback>(\n (ev) => ev.message.case == 'byteStreamWriterClose' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\n );\n\n if (cb.error) {\n throw new Error(cb.error.description);\n }\n };\n\n /**\n * Drops the native writers of any data streams that were opened but never\n * closed — a writer the caller abandoned, or one whose write failed. Their\n * handles would otherwise be held by the FFI server for the lifetime of the\n * process. The room is already gone at this point, so the handles are dropped\n * directly rather than closed: there is no end-of-stream left to deliver.\n *\n * @internal\n */\n disposeOpenStreamWriters() {\n for (const writerHandle of this.openStreamWriters) {\n try {\n new FfiHandle(writerHandle).dispose();\n } catch (err) {\n log.warn('failed to dispose data stream writer handle: %s', err);\n }\n }\n this.openStreamWriters.clear();\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>(\n (ev) => ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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>(\n (ev) => ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 unlock = await this.ffiEventLock.lock();\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n try {\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>(\n (ev) => ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 // Stamp the server-assigned publication\n // SID onto the track so track.sid == publication.sid. Both\n // Track.pushProcessorMetadataToStream and the localTrackRepublished\n // handler look up the local publication by this SID; without it they\n // depend on createAudioTrack's provisional SID happening to match.\n if (track.info && track_publication.sid) {\n track.info.sid = track_publication.sid;\n }\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 } finally {\n unlock();\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const unlock = await this.ffiEventLock.lock();\n try {\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>(\n (ev) => ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId,\n { signal: this.disconnectSignal },\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 // Clear the processor's room context here too: this path races the\n // localTrackUnpublished room event, and whichever loses finds the\n // publication already gone and skips its own setRoom(null). Calling it\n // from both paths guarantees the processor is cleared (and the\n // tokenRefreshed listener detached); setRoom(null) is idempotent, so a\n // double-clear when this path wins is safe.\n if (pub.track) {\n pub.track.setRoom(null);\n }\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n } finally {\n unlock();\n }\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>(\n (ev) => ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId,\n { signal: this.disconnectSignal },\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_rtc_ffi_bindings","import_utils","ProtoTranscriptionSegment","ChatMessageModel"]}
|
package/dist/participant.d.cts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import './types-
|
|
1
|
+
import './types-f7wTlFjs.cjs';
|
|
2
2
|
import '@livekit/mutex';
|
|
3
3
|
import '@livekit/rtc-ffi-bindings';
|
|
4
4
|
import 'node:fs';
|
|
5
5
|
import './data_streams/stream_writer.cjs';
|
|
6
6
|
import './ffi_client.cjs';
|
|
7
7
|
import './rpc.cjs';
|
|
8
|
-
export { D as DataPublishOptions, b as LocalParticipant, P as Participant, f as RemoteParticipant } from './audio_stream-
|
|
8
|
+
export { D as DataPublishOptions, b as LocalParticipant, P as Participant, f as RemoteParticipant } from './audio_stream-BNVaONuH.cjs';
|
|
9
9
|
import './transcription.cjs';
|
|
10
10
|
import './types.cjs';
|
|
11
11
|
import '@livekit/typed-emitter';
|
package/dist/participant.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Mutex } from '@livekit/mutex';
|
|
1
|
+
import { type Mutex } from '@livekit/mutex';
|
|
2
2
|
import { DisconnectReason, type OwnedParticipant, type ParticipantInfo, ParticipantKind, type ParticipantKindDetail } from '@livekit/rtc-ffi-bindings';
|
|
3
3
|
import { type TrackPublishOptions } from '@livekit/rtc-ffi-bindings';
|
|
4
4
|
import type { PathLike } from 'node:fs';
|
|
@@ -45,6 +45,7 @@ export declare class LocalParticipant extends Participant {
|
|
|
45
45
|
private rpcHandlers;
|
|
46
46
|
private ffiEventLock;
|
|
47
47
|
private disconnectSignal;
|
|
48
|
+
private openStreamWriters;
|
|
48
49
|
trackPublications: Map<string, LocalTrackPublication>;
|
|
49
50
|
constructor(info: OwnedParticipant, ffiEventLock: Mutex, disconnectSignal: AbortSignal);
|
|
50
51
|
publishData(data: Uint8Array, options: DataPublishOptions): Promise<void>;
|
|
@@ -61,13 +62,18 @@ export declare class LocalParticipant extends Participant {
|
|
|
61
62
|
destinationIdentities?: Array<string>;
|
|
62
63
|
streamId?: string;
|
|
63
64
|
senderIdentity?: string;
|
|
64
|
-
totalSize?: number;
|
|
65
65
|
}): Promise<TextStreamWriter>;
|
|
66
66
|
sendText(text: string, options?: {
|
|
67
67
|
topic?: string;
|
|
68
68
|
attributes?: Record<string, string>;
|
|
69
69
|
destinationIdentities?: Array<string>;
|
|
70
70
|
streamId?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Whether the payload may be compressed on the wire. Defaults to true;
|
|
73
|
+
* compression is only applied when it actually reduces the payload size
|
|
74
|
+
* and every recipient supports it.
|
|
75
|
+
*/
|
|
76
|
+
compress?: boolean;
|
|
71
77
|
}): Promise<import("./data_streams/types.js").BaseStreamInfo>;
|
|
72
78
|
streamBytes(options?: {
|
|
73
79
|
name?: string;
|
|
@@ -80,9 +86,20 @@ export declare class LocalParticipant extends Participant {
|
|
|
80
86
|
}): Promise<ByteStreamWriter>;
|
|
81
87
|
/** Sends a file provided as PathLike to specified recipients */
|
|
82
88
|
sendFile(path: PathLike, options?: ByteStreamOptions): Promise<void>;
|
|
83
|
-
private
|
|
84
|
-
private
|
|
85
|
-
private
|
|
89
|
+
private textStreamWriterWrite;
|
|
90
|
+
private textStreamWriterClose;
|
|
91
|
+
private byteStreamWriterWrite;
|
|
92
|
+
private byteStreamWriterClose;
|
|
93
|
+
/**
|
|
94
|
+
* Drops the native writers of any data streams that were opened but never
|
|
95
|
+
* closed — a writer the caller abandoned, or one whose write failed. Their
|
|
96
|
+
* handles would otherwise be held by the FFI server for the lifetime of the
|
|
97
|
+
* process. The room is already gone at this point, so the handles are dropped
|
|
98
|
+
* directly rather than closed: there is no end-of-stream left to deliver.
|
|
99
|
+
*
|
|
100
|
+
* @internal
|
|
101
|
+
*/
|
|
102
|
+
disposeOpenStreamWriters(): void;
|
|
86
103
|
/**
|
|
87
104
|
* Sends a chat message to participants in the room
|
|
88
105
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"participant.d.ts","sourceRoot":"","sources":["../src/participant.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"participant.d.ts","sourceRoot":"","sources":["../src/participant.ts"],"names":[],"mappings":"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"}
|