@livekit/rtc-node 0.13.20 → 0.13.21
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/Cargo.toml +6 -3
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/participant.cjs +43 -32
- package/dist/participant.cjs.map +1 -1
- package/dist/participant.d.cts +3 -0
- package/dist/participant.d.ts +3 -0
- package/dist/participant.d.ts.map +1 -1
- package/dist/participant.js +43 -32
- package/dist/participant.js.map +1 -1
- package/dist/proto/data_stream_pb.cjs +91 -2
- package/dist/proto/data_stream_pb.cjs.map +1 -1
- package/dist/proto/data_stream_pb.d.cts +92 -1
- package/dist/proto/data_stream_pb.d.ts +92 -1
- package/dist/proto/data_stream_pb.d.ts.map +1 -1
- package/dist/proto/data_stream_pb.js +88 -2
- package/dist/proto/data_stream_pb.js.map +1 -1
- package/dist/proto/ffi_pb.cjs +6 -3
- package/dist/proto/ffi_pb.cjs.map +1 -1
- package/dist/proto/ffi_pb.d.cts +19 -1
- package/dist/proto/ffi_pb.d.ts +19 -1
- package/dist/proto/ffi_pb.d.ts.map +1 -1
- package/dist/proto/ffi_pb.js +7 -4
- package/dist/proto/ffi_pb.js.map +1 -1
- package/dist/proto/room_pb.cjs +32 -2
- package/dist/proto/room_pb.cjs.map +1 -1
- package/dist/proto/room_pb.d.cts +38 -2
- package/dist/proto/room_pb.d.ts +38 -2
- package/dist/proto/room_pb.d.ts.map +1 -1
- package/dist/proto/room_pb.js +31 -2
- package/dist/proto/room_pb.js.map +1 -1
- package/dist/room.cjs +300 -205
- package/dist/room.cjs.map +1 -1
- package/dist/room.d.cts +16 -3
- package/dist/room.d.ts +16 -3
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +301 -206
- package/dist/room.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/package.json +6 -6
- package/src/participant.ts +48 -30
- package/src/proto/data_stream_pb.ts +159 -0
- package/src/proto/ffi_pb.ts +22 -1
- package/src/proto/room_pb.ts +64 -1
- package/src/room.ts +319 -214
- package/src/version.ts +1 -1
package/dist/room.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/room.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport { ByteStreamReader, TextStreamReader } from './data_streams/stream_reader.js';\nimport type {\n ByteStreamHandler,\n ByteStreamInfo,\n StreamController,\n TextStreamHandler,\n TextStreamInfo,\n} from './data_streams/types.js';\nimport type { E2EEOptions } from './e2ee.js';\nimport { E2EEManager, defaultE2EEOptions } from './e2ee.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport { log } from './log.js';\nimport type { Participant } from './participant.js';\nimport { LocalParticipant, RemoteParticipant } from './participant.js';\nimport { EncryptionState } from './proto/e2ee_pb.js';\nimport type { FfiEvent } from './proto/ffi_pb.js';\nimport type { DisconnectReason, OwnedParticipant } from './proto/participant_pb.js';\nimport type { DataStream_Trailer } from './proto/room_pb.js';\nimport {\n type ConnectCallback,\n ConnectRequest,\n type ConnectResponse,\n type ConnectionQuality,\n ConnectionState,\n ContinualGatheringPolicy,\n type DataPacketKind,\n type DataStream_Chunk,\n type DataStream_Header,\n type DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n type IceServer,\n IceTransportType,\n type RoomInfo,\n} from './proto/room_pb.js';\nimport { TrackKind } from './proto/track_pb.js';\nimport type { LocalTrack, RemoteTrack } from './track.js';\nimport { RemoteAudioTrack, RemoteVideoTrack } from './track.js';\nimport type { LocalTrackPublication, TrackPublication } from './track_publication.js';\nimport { RemoteTrackPublication } from './track_publication.js';\nimport type { ChatMessage } from './types.js';\nimport { bigIntToNumber } from './utils.js';\n\nexport interface RtcConfiguration {\n iceTransportType: IceTransportType;\n continualGatheringPolicy: ContinualGatheringPolicy;\n iceServers: IceServer[];\n}\n\nexport const defaultRtcConfiguration: RtcConfiguration = {\n iceTransportType: IceTransportType.TRANSPORT_ALL,\n continualGatheringPolicy: ContinualGatheringPolicy.GATHER_CONTINUALLY,\n iceServers: [],\n};\n\nexport interface RoomOptions {\n autoSubscribe: boolean;\n dynacast: boolean;\n e2ee?: E2EEOptions;\n rtcConfig?: RtcConfiguration;\n}\n\nexport const defaultRoomOptions = new FfiRoomOptions({\n autoSubscribe: true,\n dynacast: false,\n e2ee: undefined,\n rtcConfig: undefined,\n adaptiveStream: false,\n joinRetries: 1,\n});\n\nexport class Room extends (EventEmitter as new () => TypedEmitter<RoomCallbacks>) {\n private info?: RoomInfo;\n private ffiHandle?: FfiHandle;\n\n private byteStreamControllers = new Map<string, StreamController<DataStream_Chunk>>();\n private textStreamControllers = new Map<string, StreamController<DataStream_Chunk>>();\n private byteStreamHandlers = new Map<string, ByteStreamHandler>();\n private textStreamHandlers = new Map<string, TextStreamHandler>();\n\n private preConnectEvents: FfiEvent[] = [];\n\n e2eeManager?: E2EEManager;\n connectionState: ConnectionState = ConnectionState.CONN_DISCONNECTED;\n\n remoteParticipants: Map<string, RemoteParticipant> = new Map();\n localParticipant?: LocalParticipant;\n\n constructor() {\n super();\n }\n\n get name(): string | undefined {\n return this.info?.name;\n }\n\n get metadata(): string | undefined {\n return this.info?.metadata;\n }\n\n get isConnected(): boolean {\n return this.ffiHandle != undefined && this.connectionState != ConnectionState.CONN_DISCONNECTED;\n }\n\n /**\n * Gets the room's server ID. This ID is assigned by the LiveKit server\n * and is unique for each room session.\n * SID is assigned asynchronously after connection.\n * @returns Promise that resolves to the room's server ID, or empty string if not connected\n */\n async getSid(): Promise<string> {\n if (!this.isConnected) {\n return '';\n }\n if (this.info?.sid && this.info.sid !== '') {\n return this.info.sid;\n }\n return new Promise((resolve, reject) => {\n const handleRoomUpdate = (sid: string) => {\n if (sid !== '') {\n this.off(RoomEvent.RoomSidChanged, handleRoomUpdate);\n resolve(sid);\n }\n };\n this.on(RoomEvent.RoomSidChanged, handleRoomUpdate);\n this.once(RoomEvent.Disconnected, () => {\n this.off(RoomEvent.RoomSidChanged, handleRoomUpdate);\n reject('Room disconnected before room server id was available');\n });\n });\n }\n\n get numParticipants(): number {\n return this.info?.numParticipants ?? 0;\n }\n\n get numPublishers(): number {\n return this.info?.numPublishers ?? 0;\n }\n\n get creationTime(): Date {\n return new Date(Number(this.info?.creationTime ?? 0));\n }\n\n get isRecording(): boolean {\n return this.info?.activeRecording ?? false;\n }\n\n /**\n * The time in seconds after which a room will be closed after the last\n * participant has disconnected.\n */\n get departureTimeout(): number {\n return this.info?.departureTimeout ?? 0;\n }\n\n /**\n * The time in seconds after which an empty room will be automatically closed.\n */\n get emptyTimeout(): number {\n return this.info?.emptyTimeout ?? 0;\n }\n\n /**\n * Connects to a LiveKit room using the provided URL and access token.\n * @param url The WebSocket URL of the LiveKit server\n * @param token A valid LiveKit access token for authentication\n * @param opts Optional room configuration options\n * @throws ConnectError if connection fails\n */\n async connect(url: string, token: string, opts?: RoomOptions) {\n const options = { ...defaultRoomOptions, ...opts };\n const e2eeOptions = { ...defaultE2EEOptions, ...options.e2ee };\n\n const req = new ConnectRequest({\n url: url,\n token: token,\n options,\n });\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent);\n\n const res = FfiClient.instance.request<ConnectResponse>({\n message: {\n case: 'connect',\n value: req,\n },\n });\n\n const cb = await FfiClient.instance.waitFor<ConnectCallback>((ev: FfiEvent) => {\n return ev.message.case == 'connect' && ev.message.value.asyncId == res.asyncId;\n });\n\n log.debug('Connect callback received');\n\n switch (cb.message.case) {\n case 'result':\n this.ffiHandle = new FfiHandle(cb.message.value.room!.handle!.id!);\n this.e2eeManager = options.e2ee && new E2EEManager(this.ffiHandle.handle, e2eeOptions);\n\n this.info = cb.message.value.room!.info;\n this.connectionState = ConnectionState.CONN_CONNECTED;\n this.localParticipant = new LocalParticipant(cb.message.value.localParticipant!);\n\n for (const pt of cb.message.value.participants) {\n const rp = this.createRemoteParticipant(pt.participant!);\n\n for (const pub of pt.publications) {\n const publication = new RemoteTrackPublication(pub);\n rp.trackPublications.set(publication.sid!, publication);\n }\n }\n break;\n case 'error':\n default:\n throw new ConnectError(cb.message.value || '');\n }\n }\n\n /**\n * Disconnects from the room and cleans up all resources.\n * This will stop all tracks and close the connection.\n */\n async disconnect() {\n if (!this.isConnected) {\n return;\n }\n\n FfiClient.instance.request<DisconnectResponse>({\n message: {\n case: 'disconnect',\n value: {\n roomHandle: this.ffiHandle?.handle,\n },\n },\n });\n\n FfiClient.instance.removeListener(FfiClientEvent.FfiEvent, this.onFfiEvent);\n this.removeAllListeners();\n }\n\n /**\n * Registers a handler for incoming text data streams on a specific topic.\n * Text streams are used for receiving structured text data from other participants.\n * @param topic The topic to listen for text streams on\n * @param callback Function to handle incoming text stream data\n * @throws Error if a handler for this topic is already registered\n */\n registerTextStreamHandler(topic: string, callback: TextStreamHandler) {\n if (this.textStreamHandlers.has(topic)) {\n throw new Error(`A text stream handler for topic \"${topic}\" has already been set.`);\n }\n this.textStreamHandlers.set(topic, callback);\n }\n\n unregisterTextStreamHandler(topic: string) {\n this.textStreamHandlers.delete(topic);\n }\n\n /**\n * Registers a handler for incoming byte data streams on a specific topic.\n * Byte streams are used for receiving binary data like files from other participants.\n * @param topic The topic to listen for byte streams on\n * @param callback Function to handle incoming byte stream data\n * @throws Error if a handler for this topic is already registered\n */\n registerByteStreamHandler(topic: string, callback: ByteStreamHandler) {\n if (this.byteStreamHandlers.has(topic)) {\n throw new Error(`A byte stream handler for topic \"${topic}\" has already been set.`);\n }\n this.byteStreamHandlers.set(topic, callback);\n }\n\n unregisterByteStreamHandler(topic: string) {\n this.byteStreamHandlers.delete(topic);\n }\n\n private onFfiEvent = (ffiEvent: FfiEvent) => {\n if (!this.localParticipant || !this.ffiHandle || !this.info) {\n this.preConnectEvents.push(ffiEvent);\n return;\n }\n\n // process preConnectEvents if we received the connectCallback after the events were queued\n for (const ev of this.preConnectEvents) {\n this.processFfiEvent(ev);\n }\n this.preConnectEvents = [];\n\n this.processFfiEvent(ffiEvent);\n };\n\n private processFfiEvent = (ffiEvent: FfiEvent) => {\n if (!this.localParticipant || !this.ffiHandle || !this.info) {\n throw new Error('processFfiEvent called before connect');\n }\n\n if (ffiEvent.message.case == 'rpcMethodInvocation') {\n if (\n ffiEvent.message.value.localParticipantHandle == this.localParticipant.ffi_handle.handle\n ) {\n this.localParticipant.handleRpcMethodInvocation(\n ffiEvent.message.value.invocationId!,\n ffiEvent.message.value.method!,\n ffiEvent.message.value.requestId!,\n ffiEvent.message.value.callerIdentity!,\n ffiEvent.message.value.payload!,\n ffiEvent.message.value.responseTimeoutMs!,\n );\n }\n return;\n } else if (\n ffiEvent.message.case != 'roomEvent' ||\n ffiEvent.message.value.roomHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const ev = ffiEvent.message.value.message;\n if (process.env.LIVEKIT_DEBUG_LOG_ROOM_EVENTS) {\n console.log('Room event:', ev);\n }\n if (ev.case == 'participantConnected') {\n const participant = this.createRemoteParticipant(ev.value.info!);\n this.remoteParticipants.set(participant.identity!, participant);\n this.emit(RoomEvent.ParticipantConnected, participant);\n } else if (ev.case == 'participantDisconnected') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n this.remoteParticipants.delete(participant!.identity);\n participant!.info.disconnectReason = ev.value.disconnectReason;\n this.emit(RoomEvent.ParticipantDisconnected, participant!);\n } else if (ev.case == 'localTrackPublished') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.trackSid!);\n this.emit(RoomEvent.LocalTrackPublished, publication!, this.localParticipant!);\n } else if (ev.case == 'localTrackUnpublished') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.publicationSid!);\n this.localParticipant!.trackPublications.delete(ev.value.publicationSid!);\n this.emit(RoomEvent.LocalTrackUnpublished, publication!, this.localParticipant!);\n } else if (ev.case == 'localTrackSubscribed') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.trackSid!);\n publication!.resolveFirstSubscription();\n this.emit(RoomEvent.LocalTrackSubscribed, publication!.track!);\n } else if (ev.case == 'trackPublished') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = new RemoteTrackPublication(ev.value.publication!);\n participant!.trackPublications.set(publication.sid!, publication);\n this.emit(RoomEvent.TrackPublished, publication, participant!);\n } else if (ev.case == 'trackUnpublished') {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity!);\n const publication = participant.trackPublications.get(ev.value.publicationSid!);\n participant.trackPublications.delete(ev.value.publicationSid!);\n if (publication) {\n this.emit(RoomEvent.TrackUnpublished, publication, participant);\n }\n } else if (ev.case == 'trackSubscribed') {\n const ownedTrack = ev.value.track!;\n const trackInfo = ownedTrack.info!;\n const { participant, publication } = this.requirePublicationOfRemoteParticipant(\n ev.value.participantIdentity!,\n trackInfo.sid!,\n );\n publication.subscribed = true;\n if (trackInfo.kind == TrackKind.KIND_VIDEO) {\n publication.track = new RemoteVideoTrack(ownedTrack);\n } else if (trackInfo.kind == TrackKind.KIND_AUDIO) {\n publication.track = new RemoteAudioTrack(ownedTrack);\n }\n\n this.emit(RoomEvent.TrackSubscribed, publication.track!, publication, participant);\n } else if (ev.case == 'trackUnsubscribed') {\n const { participant, publication } = this.requirePublicationOfRemoteParticipant(\n ev.value.participantIdentity!,\n ev.value.trackSid!,\n );\n const track = publication.track!;\n publication.track = undefined;\n publication.subscribed = false;\n this.emit(RoomEvent.TrackUnsubscribed, track, publication, participant);\n } else if (ev.case == 'trackSubscriptionFailed') {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity!);\n this.emit(RoomEvent.TrackSubscriptionFailed, ev.value.trackSid!, participant, ev.value.error);\n } else if (ev.case == 'trackMuted') {\n const { participant, publication } = this.requirePublicationOfParticipant(\n ev.value.participantIdentity!,\n ev.value.trackSid!,\n );\n publication.info!.muted = true;\n if (publication.track) {\n publication.track.info!.muted = true;\n }\n this.emit(RoomEvent.TrackMuted, publication, participant);\n } else if (ev.case == 'trackUnmuted') {\n const { participant, publication } = this.requirePublicationOfParticipant(\n ev.value.participantIdentity!,\n ev.value.trackSid!,\n );\n publication.info!.muted = false;\n if (publication.track) {\n publication.track.info!.muted = false;\n }\n this.emit(RoomEvent.TrackUnmuted, publication, participant);\n } else if (ev.case == 'activeSpeakersChanged') {\n const activeSpeakers = ev.value.participantIdentities.map((identity) =>\n this.requireParticipantByIdentity(identity),\n );\n this.emit(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n } else if (ev.case == 'roomMetadataChanged') {\n this.info!.metadata = ev.value.metadata;\n this.emit(RoomEvent.RoomMetadataChanged, this.info!.metadata!);\n } else if (ev.case == 'participantMetadataChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n participant.info.metadata = ev.value.metadata;\n this.emit(RoomEvent.ParticipantMetadataChanged, participant.metadata, participant);\n } else if (ev.case == 'participantNameChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n participant.info.name = ev.value.name;\n this.emit(RoomEvent.ParticipantNameChanged, participant.name!, participant);\n } else if (ev.case == 'participantAttributesChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n participant.info.attributes = ev.value.attributes.reduce(\n (acc, value) => {\n acc[value.key!] = value.value!;\n return acc;\n },\n {} as Record<string, string>,\n );\n if (Object.keys(ev.value.changedAttributes).length > 0) {\n const changedAttributes = ev.value.changedAttributes.reduce(\n (acc, value) => {\n acc[value.key!] = value.value!;\n return acc;\n },\n {} as Record<string, string>,\n );\n this.emit(RoomEvent.ParticipantAttributesChanged, changedAttributes, participant);\n }\n } else if (ev.case == 'connectionQualityChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n this.emit(RoomEvent.ConnectionQualityChanged, ev.value.quality!, participant);\n } else if (ev.case == 'chatMessage') {\n const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity!);\n const { id, message: messageText, timestamp, editTimestamp, generated } = ev.value.message!;\n const message: ChatMessage = {\n id: id!,\n message: messageText!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n generated,\n };\n this.emit(RoomEvent.ChatMessage, message, participant);\n } else if (ev.case == 'dataPacketReceived') {\n // Can be undefined if the data is sent from a Server SDK\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const dataPacket = ev.value.value;\n switch (dataPacket.case) {\n case 'user':\n const buffer = FfiClient.instance.copyBuffer(\n dataPacket.value.data!.data!.dataPtr!,\n Number(dataPacket.value.data!.data!.dataLen),\n );\n new FfiHandle(dataPacket.value.data!.handle!.id!).dispose();\n this.emit(\n RoomEvent.DataReceived,\n buffer,\n participant,\n ev.value.kind,\n dataPacket.value.topic,\n );\n break;\n case 'sipDtmf':\n const { code, digit } = dataPacket.value;\n this.emit(RoomEvent.DtmfReceived, code!, digit!, participant!);\n break;\n default:\n break;\n }\n } else if (ev.case == 'e2eeStateChanged') {\n if (ev.value.state == EncryptionState.INTERNAL_ERROR) {\n // throw generic error until Rust SDK is updated to supply the error alongside INTERNAL_ERROR\n this.emit(RoomEvent.EncryptionError, new Error('internal server error'));\n }\n } else if (ev.case == 'connectionStateChanged') {\n this.connectionState = ev.value.state!;\n this.emit(RoomEvent.ConnectionStateChanged, this.connectionState);\n /*} else if (ev.case == 'connected') {\n this.emit(RoomEvent.Connected);*/\n } else if (ev.case == 'disconnected') {\n this.emit(RoomEvent.Disconnected, ev.value.reason!);\n } else if (ev.case == 'reconnecting') {\n this.emit(RoomEvent.Reconnecting);\n } else if (ev.case == 'reconnected') {\n this.emit(RoomEvent.Reconnected);\n } else if (ev.case == 'roomSidChanged') {\n this.emit(RoomEvent.RoomSidChanged, ev.value.sid!);\n } else if (ev.case === 'streamHeaderReceived' && ev.value.header) {\n this.handleStreamHeader(ev.value.header, ev.value.participantIdentity!);\n } else if (ev.case === 'streamChunkReceived' && ev.value.chunk) {\n this.handleStreamChunk(ev.value.chunk);\n } else if (ev.case === 'streamTrailerReceived' && ev.value.trailer) {\n this.handleStreamTrailer(ev.value.trailer);\n } else if (ev.case === 'roomUpdated') {\n this.info = ev.value;\n this.emit(RoomEvent.RoomUpdated);\n } else if (ev.case === 'moved') {\n this.info = ev.value;\n this.emit(RoomEvent.Moved);\n } else if (ev.case === 'participantsUpdated') {\n for (const info of ev.value.participants) {\n const participant = this.retrieveParticipantByIdentity(info.identity!);\n if (participant) {\n participant.info = info;\n }\n }\n }\n };\n\n private retrieveParticipantByIdentity(identity: string): Participant | undefined {\n if (this.localParticipant?.identity === identity) {\n return this.localParticipant;\n } else {\n return this.remoteParticipants.get(identity);\n }\n }\n\n private requireParticipantByIdentity(identity: string): Participant {\n if (this.localParticipant?.identity === identity) {\n return this.localParticipant;\n } else if (this.remoteParticipants.has(identity)) {\n return this.remoteParticipants.get(identity)!;\n } else {\n throw new TypeError(`participant ${identity} not found`);\n }\n }\n\n private requireRemoteParticipant(identity: string) {\n const participant = this.remoteParticipants.get(identity);\n if (!participant) {\n throw new TypeError(`participant ${identity} not found`);\n }\n return participant;\n }\n\n private requirePublicationOfParticipant(identity: string, trackSid: string) {\n const participant = this.requireParticipantByIdentity(identity);\n const publication = participant.trackPublications.get(trackSid);\n if (!publication) {\n throw new TypeError(`publication ${trackSid} not found`);\n }\n return { participant, publication };\n }\n\n private requirePublicationOfRemoteParticipant(identity: string, trackSid: string) {\n const participant = this.requireRemoteParticipant(identity);\n const publication = participant.trackPublications.get(trackSid);\n if (!publication) {\n throw new TypeError(`publication ${trackSid} not found`);\n }\n return { participant, publication };\n }\n\n private createRemoteParticipant(ownedInfo: OwnedParticipant) {\n if (this.remoteParticipants.has(ownedInfo.info!.identity!)) {\n throw new Error('Participant already exists');\n }\n\n const participant = new RemoteParticipant(ownedInfo);\n this.remoteParticipants.set(ownedInfo.info!.identity!, participant);\n return participant;\n }\n\n private handleStreamHeader(streamHeader: DataStream_Header, participantIdentity: string) {\n if (streamHeader.contentHeader.case === 'byteHeader') {\n const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic ?? '');\n\n if (!streamHandlerCallback) {\n log.debug(\n 'ignoring incoming byte stream due to no handler for topic: %s',\n streamHeader.topic ?? 'undefined',\n );\n return;\n }\n let streamController: ReadableStreamDefaultController<DataStream_Chunk>;\n const stream = new ReadableStream({\n start: (controller) => {\n streamController = controller;\n this.byteStreamControllers.set(streamHeader.streamId!, {\n header: streamHeader,\n controller: streamController,\n startTime: Date.now(),\n });\n },\n });\n const info: ByteStreamInfo = {\n streamId: streamHeader.streamId!,\n name: streamHeader.contentHeader.value.name ?? 'unknown',\n mimeType: streamHeader.mimeType!,\n totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic!,\n timestamp: bigIntToNumber(streamHeader.timestamp!),\n attributes: streamHeader.attributes,\n };\n streamHandlerCallback(\n new ByteStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),\n { identity: participantIdentity },\n );\n } else if (streamHeader.contentHeader.case === 'textHeader') {\n const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic ?? '');\n\n if (!streamHandlerCallback) {\n log.debug(\n 'ignoring incoming text stream due to no handler for topic: %s',\n streamHeader.topic ?? 'undefined',\n );\n return;\n }\n let streamController: ReadableStreamDefaultController<DataStream_Chunk>;\n const stream = new ReadableStream<DataStream_Chunk>({\n start: (controller) => {\n streamController = controller;\n this.textStreamControllers.set(streamHeader.streamId!, {\n header: streamHeader,\n controller: streamController,\n startTime: Date.now(),\n });\n },\n });\n const info: TextStreamInfo = {\n streamId: streamHeader.streamId!,\n mimeType: streamHeader.mimeType!,\n totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic!,\n timestamp: Number(streamHeader.timestamp),\n attributes: streamHeader.attributes,\n };\n streamHandlerCallback(\n new TextStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),\n { identity: participantIdentity },\n );\n }\n }\n\n private handleStreamChunk(chunk: DataStream_Chunk) {\n const fileBuffer = this.byteStreamControllers.get(chunk.streamId!);\n if (fileBuffer) {\n if (chunk.content!.length > 0) {\n fileBuffer.controller.enqueue(chunk);\n }\n }\n const textBuffer = this.textStreamControllers.get(chunk.streamId!);\n if (textBuffer) {\n if (chunk.content!.length > 0) {\n textBuffer.controller.enqueue(chunk);\n }\n }\n }\n\n private handleStreamTrailer(trailer: DataStream_Trailer) {\n const streamId = trailer.streamId!;\n const fileBuffer = this.byteStreamControllers.get(streamId);\n if (fileBuffer) {\n fileBuffer.controller.close();\n this.byteStreamControllers.delete(streamId);\n }\n const textBuffer = this.textStreamControllers.get(streamId);\n if (textBuffer) {\n textBuffer.controller.close();\n this.byteStreamControllers.delete(streamId);\n }\n }\n}\n\nexport class ConnectError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport type RoomCallbacks = {\n participantConnected: (participant: RemoteParticipant) => void;\n participantDisconnected: (participant: RemoteParticipant) => void;\n localTrackPublished: (publication: LocalTrackPublication, participant: LocalParticipant) => void;\n localTrackUnpublished: (\n publication: LocalTrackPublication,\n participant: LocalParticipant,\n ) => void;\n localTrackSubscribed: (track: LocalTrack) => void;\n trackPublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void;\n trackUnpublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void;\n trackSubscribed: (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => void;\n trackUnsubscribed: (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => void;\n trackSubscriptionFailed: (\n trackSid: string,\n participant: RemoteParticipant,\n reason?: string,\n ) => void;\n trackMuted: (publication: TrackPublication, participant: Participant) => void;\n trackUnmuted: (publication: TrackPublication, participant: Participant) => void;\n activeSpeakersChanged: (speakers: Participant[]) => void;\n roomMetadataChanged: (metadata: string) => void;\n roomInfoUpdated: (info: RoomInfo) => void;\n participantMetadataChanged: (metadata: string | undefined, participant: Participant) => void;\n participantNameChanged: (name: string, participant: Participant) => void;\n participantAttributesChanged: (\n changedAttributes: Record<string, string>,\n participant: Participant,\n ) => void;\n connectionQualityChanged: (quality: ConnectionQuality, participant: Participant) => void;\n dataReceived: (\n payload: Uint8Array,\n participant?: RemoteParticipant,\n kind?: DataPacketKind,\n topic?: string,\n ) => void;\n chatMessage: (message: ChatMessage, participant?: Participant) => void;\n dtmfReceived: (code: number, digit: string, participant: RemoteParticipant) => void;\n encryptionError: (error: Error) => void;\n connectionStateChanged: (state: ConnectionState) => void;\n connected: () => void;\n disconnected: (reason: DisconnectReason) => void;\n reconnecting: () => void;\n reconnected: () => void;\n roomSidChanged: (sid: string) => void;\n roomUpdated: () => void;\n moved: () => void;\n};\n\nexport enum RoomEvent {\n ParticipantConnected = 'participantConnected',\n ParticipantDisconnected = 'participantDisconnected',\n LocalTrackPublished = 'localTrackPublished',\n LocalTrackUnpublished = 'localTrackUnpublished',\n LocalTrackSubscribed = 'localTrackSubscribed',\n TrackPublished = 'trackPublished',\n TrackUnpublished = 'trackUnpublished',\n TrackSubscribed = 'trackSubscribed',\n TrackUnsubscribed = 'trackUnsubscribed',\n TrackSubscriptionFailed = 'trackSubscriptionFailed',\n TrackMuted = 'trackMuted',\n TrackUnmuted = 'trackUnmuted',\n ActiveSpeakersChanged = 'activeSpeakersChanged',\n RoomMetadataChanged = 'roomMetadataChanged',\n RoomSidChanged = 'roomSidChanged',\n ParticipantMetadataChanged = 'participantMetadataChanged',\n ParticipantNameChanged = 'participantNameChanged',\n ParticipantAttributesChanged = 'participantAttributesChanged',\n ConnectionQualityChanged = 'connectionQualityChanged',\n DataReceived = 'dataReceived',\n ChatMessage = 'chatMessage',\n DtmfReceived = 'dtmfReceived',\n EncryptionError = 'encryptionError',\n ConnectionStateChanged = 'connectionStateChanged',\n Connected = 'connected',\n Disconnected = 'disconnected',\n Reconnecting = 'reconnecting',\n Reconnected = 'reconnected',\n RoomUpdated = 'roomUpdated',\n Moved = 'moved',\n}\n"],"mappings":"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","names":["RoomEvent"]}
|
|
1
|
+
{"version":3,"sources":["../src/room.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport { ByteStreamReader, TextStreamReader } from './data_streams/stream_reader.js';\nimport type {\n ByteStreamHandler,\n ByteStreamInfo,\n StreamController,\n TextStreamHandler,\n TextStreamInfo,\n} from './data_streams/types.js';\nimport type { E2EEOptions } from './e2ee.js';\nimport { E2EEManager, defaultE2EEOptions } from './e2ee.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport { log } from './log.js';\nimport type { Participant } from './participant.js';\nimport { LocalParticipant, RemoteParticipant } from './participant.js';\nimport { EncryptionState, EncryptionType } from './proto/e2ee_pb.js';\nimport type { FfiEvent } from './proto/ffi_pb.js';\nimport type { DisconnectReason, OwnedParticipant } from './proto/participant_pb.js';\nimport type { DataStream_Trailer, DisconnectCallback } from './proto/room_pb.js';\nimport {\n type ConnectCallback,\n ConnectRequest,\n type ConnectResponse,\n type ConnectionQuality,\n ConnectionState,\n ContinualGatheringPolicy,\n type DataPacketKind,\n type DataStream_Chunk,\n type DataStream_Header,\n type DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n type IceServer,\n IceTransportType,\n type RoomInfo,\n} from './proto/room_pb.js';\nimport { TrackKind } from './proto/track_pb.js';\nimport type { LocalTrack, RemoteTrack } from './track.js';\nimport { RemoteAudioTrack, RemoteVideoTrack } from './track.js';\nimport type { LocalTrackPublication, TrackPublication } from './track_publication.js';\nimport { RemoteTrackPublication } from './track_publication.js';\nimport type { ChatMessage } from './types.js';\nimport { bigIntToNumber } from './utils.js';\n\nexport interface RtcConfiguration {\n iceTransportType: IceTransportType;\n continualGatheringPolicy: ContinualGatheringPolicy;\n iceServers: IceServer[];\n}\n\nexport const defaultRtcConfiguration: RtcConfiguration = {\n iceTransportType: IceTransportType.TRANSPORT_ALL,\n continualGatheringPolicy: ContinualGatheringPolicy.GATHER_CONTINUALLY,\n iceServers: [],\n};\n\nexport interface RoomOptions {\n autoSubscribe: boolean;\n dynacast: boolean;\n /**\n * @deprecated Use `encryption` instead. See x for details\n */\n e2ee?: E2EEOptions;\n encryption?: E2EEOptions;\n rtcConfig?: RtcConfiguration;\n}\n\nexport const defaultRoomOptions = new FfiRoomOptions({\n autoSubscribe: true,\n dynacast: false,\n e2ee: undefined,\n encryption: undefined,\n rtcConfig: undefined,\n adaptiveStream: false,\n joinRetries: 1,\n});\n\nexport class Room extends (EventEmitter as new () => TypedEmitter<RoomCallbacks>) {\n private info?: RoomInfo;\n private ffiHandle?: FfiHandle;\n /**\n * used to ensure events are processed sequentially and allow for\n * the local participant to acquire the lock while doing state updates related to FFI events\n * before processing the next events\n */\n private roomEventLock = new Mutex();\n\n private byteStreamControllers = new Map<string, StreamController<DataStream_Chunk>>();\n private textStreamControllers = new Map<string, StreamController<DataStream_Chunk>>();\n private byteStreamHandlers = new Map<string, ByteStreamHandler>();\n private textStreamHandlers = new Map<string, TextStreamHandler>();\n\n private preConnectEvents: FfiEvent[] = [];\n\n e2eeManager?: E2EEManager;\n connectionState: ConnectionState = ConnectionState.CONN_DISCONNECTED;\n\n remoteParticipants: Map<string, RemoteParticipant> = new Map();\n localParticipant?: LocalParticipant;\n\n constructor() {\n super();\n }\n\n get name(): string | undefined {\n return this.info?.name;\n }\n\n get metadata(): string | undefined {\n return this.info?.metadata;\n }\n\n get isConnected(): boolean {\n return this.ffiHandle != undefined && this.connectionState != ConnectionState.CONN_DISCONNECTED;\n }\n\n /**\n * Gets the room's server ID. This ID is assigned by the LiveKit server\n * and is unique for each room session.\n * SID is assigned asynchronously after connection.\n * @returns Promise that resolves to the room's server ID, or empty string if not connected\n */\n async getSid(): Promise<string> {\n if (!this.isConnected) {\n return '';\n }\n if (this.info?.sid && this.info.sid !== '') {\n return this.info.sid;\n }\n return new Promise((resolve, reject) => {\n const handleRoomUpdate = (sid: string) => {\n if (sid !== '') {\n this.off(RoomEvent.RoomSidChanged, handleRoomUpdate);\n resolve(sid);\n }\n };\n this.on(RoomEvent.RoomSidChanged, handleRoomUpdate);\n this.once(RoomEvent.Disconnected, () => {\n this.off(RoomEvent.RoomSidChanged, handleRoomUpdate);\n reject('Room disconnected before room server id was available');\n });\n });\n }\n\n get numParticipants(): number {\n return this.info?.numParticipants ?? 0;\n }\n\n get numPublishers(): number {\n return this.info?.numPublishers ?? 0;\n }\n\n get creationTime(): Date {\n return new Date(Number(this.info?.creationTime ?? 0));\n }\n\n get isRecording(): boolean {\n return this.info?.activeRecording ?? false;\n }\n\n /**\n * The time in seconds after which a room will be closed after the last\n * participant has disconnected.\n */\n get departureTimeout(): number {\n return this.info?.departureTimeout ?? 0;\n }\n\n /**\n * The time in seconds after which an empty room will be automatically closed.\n */\n get emptyTimeout(): number {\n return this.info?.emptyTimeout ?? 0;\n }\n\n /**\n * Connects to a LiveKit room using the provided URL and access token.\n * @param url The WebSocket URL of the LiveKit server\n * @param token A valid LiveKit access token for authentication\n * @param opts Optional room configuration options\n * @throws ConnectError if connection fails\n */\n async connect(url: string, token: string, opts?: RoomOptions) {\n const options = { ...defaultRoomOptions, ...opts };\n const e2eeEnabled = options.encryption || options.e2ee;\n const e2eeOptions = options.encryption\n ? { ...defaultE2EEOptions, ...options.encryption }\n : { ...defaultE2EEOptions, ...options.e2ee };\n\n const req = new ConnectRequest({\n url: url,\n token: token,\n options,\n });\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent);\n\n const res = FfiClient.instance.request<ConnectResponse>({\n message: {\n case: 'connect',\n value: req,\n },\n });\n\n const cb = await FfiClient.instance.waitFor<ConnectCallback>((ev: FfiEvent) => {\n return ev.message.case == 'connect' && ev.message.value.asyncId == res.asyncId;\n });\n\n log.debug('Connect callback received');\n\n switch (cb.message.case) {\n case 'result':\n this.ffiHandle = new FfiHandle(cb.message.value.room!.handle!.id!);\n this.e2eeManager = e2eeEnabled && new E2EEManager(this.ffiHandle.handle, e2eeOptions);\n\n this.info = cb.message.value.room!.info;\n this.connectionState = ConnectionState.CONN_CONNECTED;\n this.localParticipant = new LocalParticipant(\n cb.message.value.localParticipant!,\n this.roomEventLock,\n );\n\n for (const pt of cb.message.value.participants) {\n const rp = this.createRemoteParticipant(pt.participant!);\n\n for (const pub of pt.publications) {\n const publication = new RemoteTrackPublication(pub);\n rp.trackPublications.set(publication.sid!, publication);\n }\n }\n break;\n case 'error':\n default:\n throw new ConnectError(cb.message.value || '');\n }\n }\n\n /**\n * Disconnects from the room and cleans up all resources.\n * This will stop all tracks and close the connection.\n */\n async disconnect() {\n if (!this.isConnected) {\n return;\n }\n\n const res = FfiClient.instance.request<DisconnectResponse>({\n message: {\n case: 'disconnect',\n value: {\n roomHandle: this.ffiHandle?.handle,\n },\n },\n });\n\n await FfiClient.instance.waitFor<DisconnectCallback>((ev: FfiEvent) => {\n return ev.message.case == 'connect' && ev.message.value.asyncId == res.asyncId;\n });\n\n FfiClient.instance.removeListener(FfiClientEvent.FfiEvent, this.onFfiEvent);\n this.removeAllListeners();\n }\n\n /**\n * Registers a handler for incoming text data streams on a specific topic.\n * Text streams are used for receiving structured text data from other participants.\n * @param topic The topic to listen for text streams on\n * @param callback Function to handle incoming text stream data\n * @throws Error if a handler for this topic is already registered\n */\n registerTextStreamHandler(topic: string, callback: TextStreamHandler) {\n if (this.textStreamHandlers.has(topic)) {\n throw new Error(`A text stream handler for topic \"${topic}\" has already been set.`);\n }\n this.textStreamHandlers.set(topic, callback);\n }\n\n unregisterTextStreamHandler(topic: string) {\n this.textStreamHandlers.delete(topic);\n }\n\n /**\n * Registers a handler for incoming byte data streams on a specific topic.\n * Byte streams are used for receiving binary data like files from other participants.\n * @param topic The topic to listen for byte streams on\n * @param callback Function to handle incoming byte stream data\n * @throws Error if a handler for this topic is already registered\n */\n registerByteStreamHandler(topic: string, callback: ByteStreamHandler) {\n if (this.byteStreamHandlers.has(topic)) {\n throw new Error(`A byte stream handler for topic \"${topic}\" has already been set.`);\n }\n this.byteStreamHandlers.set(topic, callback);\n }\n\n unregisterByteStreamHandler(topic: string) {\n this.byteStreamHandlers.delete(topic);\n }\n\n private onFfiEvent = async (ffiEvent: FfiEvent) => {\n if (!this.localParticipant || !this.ffiHandle || !this.info) {\n this.preConnectEvents.push(ffiEvent);\n return;\n }\n\n // process preConnectEvents if we received the connectCallback after the events were queued\n for (const ev of this.preConnectEvents) {\n await this.processFfiEvent(ev);\n }\n this.preConnectEvents = [];\n\n await this.processFfiEvent(ffiEvent);\n };\n\n private processFfiEvent = async (ffiEvent: FfiEvent) => {\n if (!this.localParticipant || !this.ffiHandle || !this.info) {\n throw new Error('processFfiEvent called before connect');\n }\n\n const unlock = await this.roomEventLock.lock();\n\n try {\n if (ffiEvent.message.case == 'rpcMethodInvocation') {\n if (\n ffiEvent.message.value.localParticipantHandle == this.localParticipant.ffi_handle.handle\n ) {\n this.localParticipant.handleRpcMethodInvocation(\n ffiEvent.message.value.invocationId!,\n ffiEvent.message.value.method!,\n ffiEvent.message.value.requestId!,\n ffiEvent.message.value.callerIdentity!,\n ffiEvent.message.value.payload!,\n ffiEvent.message.value.responseTimeoutMs!,\n );\n }\n return;\n } else if (\n ffiEvent.message.case != 'roomEvent' ||\n ffiEvent.message.value.roomHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const ev = ffiEvent.message.value.message;\n if (process.env.LIVEKIT_DEBUG_LOG_ROOM_EVENTS) {\n console.log('Room event:', ev);\n }\n if (ev.case == 'participantConnected') {\n const participant = this.createRemoteParticipant(ev.value.info!);\n this.remoteParticipants.set(participant.identity!, participant);\n this.emit(RoomEvent.ParticipantConnected, participant);\n } else if (ev.case == 'participantDisconnected') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n if (participant) {\n this.remoteParticipants.delete(participant.identity);\n participant.info.disconnectReason = ev.value.disconnectReason;\n this.emit(RoomEvent.ParticipantDisconnected, participant);\n } else {\n console.log(`RoomEvent.ParticipantDisconnected: Could not find participant`);\n }\n } else if (ev.case == 'localTrackPublished') {\n const publication = this.localParticipant.trackPublications.get(ev.value.trackSid!);\n this.emit(RoomEvent.LocalTrackPublished, publication!, this.localParticipant);\n } else if (ev.case == 'localTrackUnpublished') {\n const publication = this.localParticipant.trackPublications.get(ev.value.publicationSid!);\n this.localParticipant.trackPublications.delete(ev.value.publicationSid!);\n this.emit(RoomEvent.LocalTrackUnpublished, publication!, this.localParticipant!);\n } else if (ev.case == 'localTrackSubscribed') {\n const publication = this.localParticipant.trackPublications.get(ev.value.trackSid!);\n if (publication) {\n publication.resolveFirstSubscription();\n this.emit(RoomEvent.LocalTrackSubscribed, publication!.track!);\n } else {\n console.warn(\n `RoomEvent.LocalTrackSubscribed: Publication not found: ${ev.value.trackSid}`,\n );\n }\n } else if (ev.case == 'trackPublished') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = new RemoteTrackPublication(ev.value.publication!);\n if (participant) {\n participant.trackPublications.set(publication.sid!, publication);\n } else {\n console.warn(\n `RoomEvent.TrackPublished: Could not find participant: ${ev.value.participantIdentity}`,\n );\n }\n this.emit(RoomEvent.TrackPublished, publication, participant!);\n } else if (ev.case == 'trackUnpublished') {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity!);\n const publication = participant.trackPublications.get(ev.value.publicationSid!);\n participant.trackPublications.delete(ev.value.publicationSid!);\n if (publication) {\n this.emit(RoomEvent.TrackUnpublished, publication, participant);\n } else {\n console.warn(`RoomEvent.TrackUnpublished: Could not find publication`);\n }\n } else if (ev.case == 'trackSubscribed') {\n const ownedTrack = ev.value.track!;\n const trackInfo = ownedTrack.info!;\n try {\n const { participant, publication } = this.requirePublicationOfRemoteParticipant(\n ev.value.participantIdentity!,\n trackInfo.sid!,\n );\n publication.subscribed = true;\n if (trackInfo.kind == TrackKind.KIND_VIDEO) {\n publication.track = new RemoteVideoTrack(ownedTrack);\n } else if (trackInfo.kind == TrackKind.KIND_AUDIO) {\n publication.track = new RemoteAudioTrack(ownedTrack);\n }\n\n this.emit(RoomEvent.TrackSubscribed, publication.track!, publication, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.TrackSubscribed: ${e.message}`);\n }\n } else if (ev.case == 'trackUnsubscribed') {\n try {\n const { participant, publication } = this.requirePublicationOfRemoteParticipant(\n ev.value.participantIdentity!,\n ev.value.trackSid!,\n );\n const track = publication.track!;\n publication.track = undefined;\n publication.subscribed = false;\n this.emit(RoomEvent.TrackUnsubscribed, track, publication, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.TrackUnsubscribed: ${e.message}`);\n }\n } else if (ev.case == 'trackSubscriptionFailed') {\n try {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity!);\n this.emit(\n RoomEvent.TrackSubscriptionFailed,\n ev.value.trackSid!,\n participant,\n ev.value.error,\n );\n } catch (e: any) {\n console.warn(`RoomEvent.TrackSubscriptionFailed: ${e.message}`);\n }\n } else if (ev.case == 'trackMuted') {\n try {\n const { participant, publication } = this.requirePublicationOfParticipant(\n ev.value.participantIdentity!,\n ev.value.trackSid!,\n );\n publication.info!.muted = true;\n if (publication.track) {\n publication.track.info!.muted = true;\n }\n this.emit(RoomEvent.TrackMuted, publication, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.TrackMuted: ${e.message}`);\n }\n } else if (ev.case == 'trackUnmuted') {\n try {\n const { participant, publication } = this.requirePublicationOfParticipant(\n ev.value.participantIdentity!,\n ev.value.trackSid!,\n );\n publication.info!.muted = false;\n if (publication.track) {\n publication.track.info!.muted = false;\n }\n this.emit(RoomEvent.TrackUnmuted, publication, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.TrackUnmuted: ${e.message}`);\n }\n } else if (ev.case == 'activeSpeakersChanged') {\n try {\n const activeSpeakers = ev.value.participantIdentities.map((identity) =>\n this.requireParticipantByIdentity(identity),\n );\n this.emit(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n } catch (e: any) {\n console.warn(`RoomEvent.ActiveSpeakersChanged: ${e.message}`);\n }\n } else if (ev.case == 'roomMetadataChanged') {\n this.info.metadata = ev.value.metadata ?? '';\n this.emit(RoomEvent.RoomMetadataChanged, this.info.metadata);\n } else if (ev.case == 'participantMetadataChanged') {\n try {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n participant.info.metadata = ev.value.metadata;\n this.emit(RoomEvent.ParticipantMetadataChanged, participant.metadata, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.ParticipantMetadataChanged: ${e.message}`);\n }\n } else if (ev.case == 'participantNameChanged') {\n try {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n participant.info.name = ev.value.name;\n this.emit(RoomEvent.ParticipantNameChanged, participant.name!, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.ParticipantNameChanged: ${e.message}`);\n }\n } else if (ev.case == 'participantAttributesChanged') {\n try {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n participant.info.attributes = ev.value.attributes.reduce(\n (acc, value) => {\n acc[value.key!] = value.value!;\n return acc;\n },\n {} as Record<string, string>,\n );\n if (Object.keys(ev.value.changedAttributes).length > 0) {\n const changedAttributes = ev.value.changedAttributes.reduce(\n (acc, value) => {\n acc[value.key!] = value.value!;\n return acc;\n },\n {} as Record<string, string>,\n );\n this.emit(RoomEvent.ParticipantAttributesChanged, changedAttributes, participant);\n }\n } catch (e: any) {\n console.warn(`RoomEvent.ParticipantAttributesChanged: ${e.message}`);\n }\n } else if (ev.case == 'connectionQualityChanged') {\n try {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n this.emit(RoomEvent.ConnectionQualityChanged, ev.value.quality!, participant);\n } catch (e: any) {\n console.warn(`RoomEvent.ConnectionQualityChanged: ${e.message}`);\n }\n } else if (ev.case == 'chatMessage') {\n const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity!);\n const { id, message: messageText, timestamp, editTimestamp, generated } = ev.value.message!;\n const message: ChatMessage = {\n id: id!,\n message: messageText!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n generated,\n };\n this.emit(RoomEvent.ChatMessage, message, participant);\n } else if (ev.case == 'dataPacketReceived') {\n // Can be undefined if the data is sent from a Server SDK\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const dataPacket = ev.value.value;\n switch (dataPacket.case) {\n case 'user':\n const buffer = FfiClient.instance.copyBuffer(\n dataPacket.value.data!.data!.dataPtr!,\n Number(dataPacket.value.data!.data!.dataLen),\n );\n new FfiHandle(dataPacket.value.data!.handle!.id!).dispose();\n this.emit(\n RoomEvent.DataReceived,\n buffer,\n participant,\n ev.value.kind,\n dataPacket.value.topic,\n );\n break;\n case 'sipDtmf':\n const { code, digit } = dataPacket.value;\n this.emit(RoomEvent.DtmfReceived, code!, digit!, participant!);\n break;\n default:\n break;\n }\n } else if (ev.case == 'e2eeStateChanged') {\n if (ev.value.state == EncryptionState.INTERNAL_ERROR) {\n // throw generic error until Rust SDK is updated to supply the error alongside INTERNAL_ERROR\n this.emit(RoomEvent.EncryptionError, new Error('internal server error'));\n }\n } else if (ev.case == 'connectionStateChanged') {\n this.connectionState = ev.value.state!;\n this.emit(RoomEvent.ConnectionStateChanged, this.connectionState);\n /*} else if (ev.case == 'connected') {\n this.emit(RoomEvent.Connected);*/\n } else if (ev.case == 'disconnected') {\n this.emit(RoomEvent.Disconnected, ev.value.reason!);\n } else if (ev.case == 'reconnecting') {\n this.emit(RoomEvent.Reconnecting);\n } else if (ev.case == 'reconnected') {\n this.emit(RoomEvent.Reconnected);\n } else if (ev.case == 'roomSidChanged') {\n this.emit(RoomEvent.RoomSidChanged, ev.value.sid!);\n } else if (ev.case === 'streamHeaderReceived' && ev.value.header) {\n this.handleStreamHeader(ev.value.header, ev.value.participantIdentity!);\n } else if (ev.case === 'streamChunkReceived' && ev.value.chunk) {\n this.handleStreamChunk(ev.value.chunk);\n } else if (ev.case === 'streamTrailerReceived' && ev.value.trailer) {\n this.handleStreamTrailer(ev.value.trailer);\n } else if (ev.case === 'roomUpdated') {\n this.info = ev.value;\n this.emit(RoomEvent.RoomUpdated);\n } else if (ev.case === 'moved') {\n this.info = ev.value;\n this.emit(RoomEvent.Moved);\n } else if (ev.case === 'participantsUpdated') {\n for (const info of ev.value.participants) {\n const participant = this.retrieveParticipantByIdentity(info.identity!);\n if (participant) {\n participant.info = info;\n }\n }\n } else if (ev.case === 'participantEncryptionStatusChanged') {\n try {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity!);\n this.emit(\n RoomEvent.ParticipantEncryptionStatusChanged,\n !!ev.value.isEncrypted,\n participant,\n );\n } catch (e: any) {\n console.warn(`RoomEvent.ParticipantEncryptionStatusChanged: ${e.message}`);\n }\n }\n } finally {\n unlock();\n }\n };\n\n private retrieveParticipantByIdentity(identity: string): Participant | undefined {\n if (this.localParticipant?.identity === identity) {\n return this.localParticipant;\n } else {\n return this.remoteParticipants.get(identity);\n }\n }\n\n private requireParticipantByIdentity(identity: string): Participant {\n if (this.localParticipant?.identity === identity) {\n return this.localParticipant;\n } else if (this.remoteParticipants.has(identity)) {\n return this.remoteParticipants.get(identity)!;\n } else {\n throw new TypeError(`participant ${identity} not found`);\n }\n }\n\n private requireRemoteParticipant(identity: string) {\n const participant = this.remoteParticipants.get(identity);\n if (!participant) {\n throw new TypeError(`participant ${identity} not found`);\n }\n return participant;\n }\n\n private requirePublicationOfParticipant(identity: string, trackSid: string) {\n const participant = this.requireParticipantByIdentity(identity);\n const publication = participant.trackPublications.get(trackSid);\n if (!publication) {\n throw new TypeError(`publication ${trackSid} not found`);\n }\n return { participant, publication };\n }\n\n private requirePublicationOfRemoteParticipant(identity: string, trackSid: string) {\n const participant = this.requireRemoteParticipant(identity);\n const publication = participant.trackPublications.get(trackSid);\n if (!publication) {\n throw new TypeError(`publication ${trackSid} not found`);\n }\n return { participant, publication };\n }\n\n private createRemoteParticipant(ownedInfo: OwnedParticipant) {\n if (this.remoteParticipants.has(ownedInfo.info!.identity!)) {\n throw new Error('Participant already exists');\n }\n\n const participant = new RemoteParticipant(ownedInfo);\n this.remoteParticipants.set(ownedInfo.info!.identity!, participant);\n return participant;\n }\n\n private handleStreamHeader(streamHeader: DataStream_Header, participantIdentity: string) {\n if (streamHeader.contentHeader.case === 'byteHeader') {\n const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic ?? '');\n\n if (!streamHandlerCallback) {\n log.debug(\n 'ignoring incoming byte stream due to no handler for topic: %s',\n streamHeader.topic ?? 'undefined',\n );\n return;\n }\n let streamController: ReadableStreamDefaultController<DataStream_Chunk>;\n const stream = new ReadableStream({\n start: (controller) => {\n streamController = controller;\n this.byteStreamControllers.set(streamHeader.streamId!, {\n header: streamHeader,\n controller: streamController,\n startTime: Date.now(),\n });\n },\n });\n const info: ByteStreamInfo = {\n streamId: streamHeader.streamId!,\n name: streamHeader.contentHeader.value.name ?? 'unknown',\n mimeType: streamHeader.mimeType!,\n totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic!,\n timestamp: bigIntToNumber(streamHeader.timestamp!),\n attributes: streamHeader.attributes,\n };\n streamHandlerCallback(\n new ByteStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),\n { identity: participantIdentity },\n );\n } else if (streamHeader.contentHeader.case === 'textHeader') {\n const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic ?? '');\n\n if (!streamHandlerCallback) {\n log.debug(\n 'ignoring incoming text stream due to no handler for topic: %s',\n streamHeader.topic ?? 'undefined',\n );\n return;\n }\n let streamController: ReadableStreamDefaultController<DataStream_Chunk>;\n const stream = new ReadableStream<DataStream_Chunk>({\n start: (controller) => {\n streamController = controller;\n this.textStreamControllers.set(streamHeader.streamId!, {\n header: streamHeader,\n controller: streamController,\n startTime: Date.now(),\n });\n },\n });\n const info: TextStreamInfo = {\n streamId: streamHeader.streamId!,\n mimeType: streamHeader.mimeType!,\n totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic!,\n timestamp: Number(streamHeader.timestamp),\n attributes: streamHeader.attributes,\n };\n streamHandlerCallback(\n new TextStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),\n { identity: participantIdentity },\n );\n }\n }\n\n private handleStreamChunk(chunk: DataStream_Chunk) {\n const fileBuffer = this.byteStreamControllers.get(chunk.streamId!);\n if (fileBuffer) {\n if (chunk.content!.length > 0) {\n fileBuffer.controller.enqueue(chunk);\n }\n }\n const textBuffer = this.textStreamControllers.get(chunk.streamId!);\n if (textBuffer) {\n if (chunk.content!.length > 0) {\n textBuffer.controller.enqueue(chunk);\n }\n }\n }\n\n private handleStreamTrailer(trailer: DataStream_Trailer) {\n const streamId = trailer.streamId!;\n const fileBuffer = this.byteStreamControllers.get(streamId);\n if (fileBuffer) {\n fileBuffer.controller.close();\n this.byteStreamControllers.delete(streamId);\n }\n const textBuffer = this.textStreamControllers.get(streamId);\n if (textBuffer) {\n textBuffer.controller.close();\n this.byteStreamControllers.delete(streamId);\n }\n }\n}\n\nexport class ConnectError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport type RoomCallbacks = {\n participantConnected: (participant: RemoteParticipant) => void;\n participantDisconnected: (participant: RemoteParticipant) => void;\n localTrackPublished: (publication: LocalTrackPublication, participant: LocalParticipant) => void;\n localTrackUnpublished: (\n publication: LocalTrackPublication,\n participant: LocalParticipant,\n ) => void;\n localTrackSubscribed: (track: LocalTrack) => void;\n trackPublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void;\n trackUnpublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void;\n trackSubscribed: (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => void;\n trackUnsubscribed: (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => void;\n trackSubscriptionFailed: (\n trackSid: string,\n participant: RemoteParticipant,\n reason?: string,\n ) => void;\n trackMuted: (publication: TrackPublication, participant: Participant) => void;\n trackUnmuted: (publication: TrackPublication, participant: Participant) => void;\n activeSpeakersChanged: (speakers: Participant[]) => void;\n roomMetadataChanged: (metadata: string) => void;\n roomInfoUpdated: (info: RoomInfo) => void;\n participantMetadataChanged: (metadata: string | undefined, participant: Participant) => void;\n participantNameChanged: (name: string, participant: Participant) => void;\n participantAttributesChanged: (\n changedAttributes: Record<string, string>,\n participant: Participant,\n ) => void;\n participantEncryptionStatusChanged: (isEncrypted: boolean, participant: Participant) => void;\n connectionQualityChanged: (quality: ConnectionQuality, participant: Participant) => void;\n dataReceived: (\n payload: Uint8Array,\n participant?: RemoteParticipant,\n kind?: DataPacketKind,\n topic?: string,\n encryptionType?: EncryptionType,\n ) => void;\n chatMessage: (message: ChatMessage, participant?: Participant) => void;\n dtmfReceived: (code: number, digit: string, participant: RemoteParticipant) => void;\n encryptionError: (error: Error) => void;\n connectionStateChanged: (state: ConnectionState) => void;\n connected: () => void;\n disconnected: (reason: DisconnectReason) => void;\n reconnecting: () => void;\n reconnected: () => void;\n roomSidChanged: (sid: string) => void;\n roomUpdated: () => void;\n moved: () => void;\n};\n\nexport enum RoomEvent {\n ParticipantConnected = 'participantConnected',\n ParticipantDisconnected = 'participantDisconnected',\n LocalTrackPublished = 'localTrackPublished',\n LocalTrackUnpublished = 'localTrackUnpublished',\n LocalTrackSubscribed = 'localTrackSubscribed',\n TrackPublished = 'trackPublished',\n TrackUnpublished = 'trackUnpublished',\n TrackSubscribed = 'trackSubscribed',\n TrackUnsubscribed = 'trackUnsubscribed',\n TrackSubscriptionFailed = 'trackSubscriptionFailed',\n TrackMuted = 'trackMuted',\n TrackUnmuted = 'trackUnmuted',\n ActiveSpeakersChanged = 'activeSpeakersChanged',\n RoomMetadataChanged = 'roomMetadataChanged',\n RoomSidChanged = 'roomSidChanged',\n ParticipantMetadataChanged = 'participantMetadataChanged',\n ParticipantNameChanged = 'participantNameChanged',\n ParticipantAttributesChanged = 'participantAttributesChanged',\n ParticipantEncryptionStatusChanged = 'participantEncryptionStatusChanged',\n ConnectionQualityChanged = 'connectionQualityChanged',\n DataReceived = 'dataReceived',\n ChatMessage = 'chatMessage',\n DtmfReceived = 'dtmfReceived',\n EncryptionError = 'encryptionError',\n ConnectionStateChanged = 'connectionStateChanged',\n Connected = 'connected',\n Disconnected = 'disconnected',\n Reconnecting = 'reconnecting',\n Reconnected = 'reconnected',\n RoomUpdated = 'roomUpdated',\n Moved = 'moved',\n}\n"],"mappings":"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","names":["RoomEvent"]}
|
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.21";
|
|
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.21\";\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.21\";\n"],"mappings":"AAAO,MAAM,cAAc;","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.21",
|
|
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.1"
|
|
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.21",
|
|
65
|
+
"@livekit/rtc-node-darwin-x64": "0.13.21",
|
|
66
|
+
"@livekit/rtc-node-linux-arm64-gnu": "0.13.21",
|
|
67
|
+
"@livekit/rtc-node-linux-x64-gnu": "0.13.21",
|
|
68
|
+
"@livekit/rtc-node-win32-x64-msvc": "0.13.21"
|
|
69
69
|
},
|
|
70
70
|
"engines": {
|
|
71
71
|
"node": ">= 18"
|
package/src/participant.ts
CHANGED
|
@@ -155,8 +155,15 @@ export type DataPublishOptions = {
|
|
|
155
155
|
export class LocalParticipant extends Participant {
|
|
156
156
|
private rpcHandlers: Map<string, (data: RpcInvocationData) => Promise<string>> = new Map();
|
|
157
157
|
|
|
158
|
+
private roomEventLock: Mutex;
|
|
159
|
+
|
|
158
160
|
trackPublications: Map<string, LocalTrackPublication> = new Map();
|
|
159
161
|
|
|
162
|
+
constructor(info: OwnedParticipant, roomEventLock: Mutex) {
|
|
163
|
+
super(info);
|
|
164
|
+
this.roomEventLock = roomEventLock;
|
|
165
|
+
}
|
|
166
|
+
|
|
160
167
|
async publishData(data: Uint8Array, options: DataPublishOptions) {
|
|
161
168
|
const req = new PublishDataRequest({
|
|
162
169
|
localParticipantHandle: this.ffi_handle.handle,
|
|
@@ -655,51 +662,62 @@ export class LocalParticipant extends Participant {
|
|
|
655
662
|
options: options,
|
|
656
663
|
});
|
|
657
664
|
|
|
665
|
+
const unlock = await this.roomEventLock.lock();
|
|
666
|
+
|
|
658
667
|
const res = FfiClient.instance.request<PublishTrackResponse>({
|
|
659
668
|
message: { case: 'publishTrack', value: req },
|
|
660
669
|
});
|
|
661
670
|
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
671
|
+
try {
|
|
672
|
+
const cb = await FfiClient.instance.waitFor<PublishTrackCallback>((ev) => {
|
|
673
|
+
return ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId;
|
|
674
|
+
});
|
|
665
675
|
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
676
|
+
switch (cb.message.case) {
|
|
677
|
+
case 'publication':
|
|
678
|
+
const track_publication = new LocalTrackPublication(cb.message.value!);
|
|
679
|
+
track_publication.track = track;
|
|
680
|
+
this.trackPublications.set(track_publication.sid!, track_publication);
|
|
671
681
|
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
682
|
+
return track_publication;
|
|
683
|
+
case 'error':
|
|
684
|
+
default:
|
|
685
|
+
throw new Error(cb.message.value);
|
|
686
|
+
}
|
|
687
|
+
} finally {
|
|
688
|
+
unlock();
|
|
676
689
|
}
|
|
677
690
|
}
|
|
678
691
|
|
|
679
692
|
async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {
|
|
680
|
-
const
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
693
|
+
const unlock = await this.roomEventLock.lock();
|
|
694
|
+
try {
|
|
695
|
+
const req = new UnpublishTrackRequest({
|
|
696
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
697
|
+
trackSid: trackSid,
|
|
698
|
+
stopOnUnpublish: stopOnUnpublish ?? true,
|
|
699
|
+
});
|
|
685
700
|
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
701
|
+
const res = FfiClient.instance.request<UnpublishTrackResponse>({
|
|
702
|
+
message: { case: 'unpublishTrack', value: req },
|
|
703
|
+
});
|
|
689
704
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
705
|
+
const cb = await FfiClient.instance.waitFor<UnpublishTrackCallback>((ev) => {
|
|
706
|
+
return ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId;
|
|
707
|
+
});
|
|
693
708
|
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
709
|
+
if (cb.error) {
|
|
710
|
+
throw new Error(cb.error);
|
|
711
|
+
}
|
|
697
712
|
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
713
|
+
const pub = this.trackPublications.get(trackSid);
|
|
714
|
+
if (pub) {
|
|
715
|
+
pub.track = undefined;
|
|
716
|
+
}
|
|
717
|
+
this.trackPublications.delete(trackSid);
|
|
718
|
+
} finally {
|
|
719
|
+
unlock();
|
|
701
720
|
}
|
|
702
|
-
this.trackPublications.delete(trackSid);
|
|
703
721
|
}
|
|
704
722
|
|
|
705
723
|
/**
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
|
|
21
21
|
import { Message, proto2 } from "@bufbuild/protobuf";
|
|
22
22
|
import { FfiOwnedHandle } from "./handle_pb.js";
|
|
23
|
+
import { EncryptionType } from "./e2ee_pb.js";
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* A reader for an incoming stream.
|
|
@@ -1074,6 +1075,152 @@ export class StreamSendFileCallback extends Message<StreamSendFileCallback> {
|
|
|
1074
1075
|
}
|
|
1075
1076
|
}
|
|
1076
1077
|
|
|
1078
|
+
/**
|
|
1079
|
+
* Sends bytes over a data stream.
|
|
1080
|
+
*
|
|
1081
|
+
* @generated from message livekit.proto.StreamSendBytesRequest
|
|
1082
|
+
*/
|
|
1083
|
+
export class StreamSendBytesRequest extends Message<StreamSendBytesRequest> {
|
|
1084
|
+
/**
|
|
1085
|
+
* @generated from field: required uint64 local_participant_handle = 1;
|
|
1086
|
+
*/
|
|
1087
|
+
localParticipantHandle?: bigint;
|
|
1088
|
+
|
|
1089
|
+
/**
|
|
1090
|
+
* @generated from field: required livekit.proto.StreamByteOptions options = 2;
|
|
1091
|
+
*/
|
|
1092
|
+
options?: StreamByteOptions;
|
|
1093
|
+
|
|
1094
|
+
/**
|
|
1095
|
+
* Bytes to send.
|
|
1096
|
+
*
|
|
1097
|
+
* @generated from field: required bytes bytes = 3;
|
|
1098
|
+
*/
|
|
1099
|
+
bytes?: Uint8Array;
|
|
1100
|
+
|
|
1101
|
+
constructor(data?: PartialMessage<StreamSendBytesRequest>) {
|
|
1102
|
+
super();
|
|
1103
|
+
proto2.util.initPartial(data, this);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
static readonly runtime: typeof proto2 = proto2;
|
|
1107
|
+
static readonly typeName = "livekit.proto.StreamSendBytesRequest";
|
|
1108
|
+
static readonly fields: FieldList = proto2.util.newFieldList(() => [
|
|
1109
|
+
{ no: 1, name: "local_participant_handle", kind: "scalar", T: 4 /* ScalarType.UINT64 */, req: true },
|
|
1110
|
+
{ no: 2, name: "options", kind: "message", T: StreamByteOptions, req: true },
|
|
1111
|
+
{ no: 3, name: "bytes", kind: "scalar", T: 12 /* ScalarType.BYTES */, req: true },
|
|
1112
|
+
]);
|
|
1113
|
+
|
|
1114
|
+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): StreamSendBytesRequest {
|
|
1115
|
+
return new StreamSendBytesRequest().fromBinary(bytes, options);
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): StreamSendBytesRequest {
|
|
1119
|
+
return new StreamSendBytesRequest().fromJson(jsonValue, options);
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): StreamSendBytesRequest {
|
|
1123
|
+
return new StreamSendBytesRequest().fromJsonString(jsonString, options);
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
static equals(a: StreamSendBytesRequest | PlainMessage<StreamSendBytesRequest> | undefined, b: StreamSendBytesRequest | PlainMessage<StreamSendBytesRequest> | undefined): boolean {
|
|
1127
|
+
return proto2.util.equals(StreamSendBytesRequest, a, b);
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
/**
|
|
1132
|
+
* @generated from message livekit.proto.StreamSendBytesResponse
|
|
1133
|
+
*/
|
|
1134
|
+
export class StreamSendBytesResponse extends Message<StreamSendBytesResponse> {
|
|
1135
|
+
/**
|
|
1136
|
+
* @generated from field: required uint64 async_id = 1;
|
|
1137
|
+
*/
|
|
1138
|
+
asyncId?: bigint;
|
|
1139
|
+
|
|
1140
|
+
constructor(data?: PartialMessage<StreamSendBytesResponse>) {
|
|
1141
|
+
super();
|
|
1142
|
+
proto2.util.initPartial(data, this);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
static readonly runtime: typeof proto2 = proto2;
|
|
1146
|
+
static readonly typeName = "livekit.proto.StreamSendBytesResponse";
|
|
1147
|
+
static readonly fields: FieldList = proto2.util.newFieldList(() => [
|
|
1148
|
+
{ no: 1, name: "async_id", kind: "scalar", T: 4 /* ScalarType.UINT64 */, req: true },
|
|
1149
|
+
]);
|
|
1150
|
+
|
|
1151
|
+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): StreamSendBytesResponse {
|
|
1152
|
+
return new StreamSendBytesResponse().fromBinary(bytes, options);
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): StreamSendBytesResponse {
|
|
1156
|
+
return new StreamSendBytesResponse().fromJson(jsonValue, options);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): StreamSendBytesResponse {
|
|
1160
|
+
return new StreamSendBytesResponse().fromJsonString(jsonString, options);
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
static equals(a: StreamSendBytesResponse | PlainMessage<StreamSendBytesResponse> | undefined, b: StreamSendBytesResponse | PlainMessage<StreamSendBytesResponse> | undefined): boolean {
|
|
1164
|
+
return proto2.util.equals(StreamSendBytesResponse, a, b);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
/**
|
|
1169
|
+
* @generated from message livekit.proto.StreamSendBytesCallback
|
|
1170
|
+
*/
|
|
1171
|
+
export class StreamSendBytesCallback extends Message<StreamSendBytesCallback> {
|
|
1172
|
+
/**
|
|
1173
|
+
* @generated from field: required uint64 async_id = 1;
|
|
1174
|
+
*/
|
|
1175
|
+
asyncId?: bigint;
|
|
1176
|
+
|
|
1177
|
+
/**
|
|
1178
|
+
* @generated from oneof livekit.proto.StreamSendBytesCallback.result
|
|
1179
|
+
*/
|
|
1180
|
+
result: {
|
|
1181
|
+
/**
|
|
1182
|
+
* @generated from field: livekit.proto.ByteStreamInfo info = 2;
|
|
1183
|
+
*/
|
|
1184
|
+
value: ByteStreamInfo;
|
|
1185
|
+
case: "info";
|
|
1186
|
+
} | {
|
|
1187
|
+
/**
|
|
1188
|
+
* @generated from field: livekit.proto.StreamError error = 3;
|
|
1189
|
+
*/
|
|
1190
|
+
value: StreamError;
|
|
1191
|
+
case: "error";
|
|
1192
|
+
} | { case: undefined; value?: undefined } = { case: undefined };
|
|
1193
|
+
|
|
1194
|
+
constructor(data?: PartialMessage<StreamSendBytesCallback>) {
|
|
1195
|
+
super();
|
|
1196
|
+
proto2.util.initPartial(data, this);
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
static readonly runtime: typeof proto2 = proto2;
|
|
1200
|
+
static readonly typeName = "livekit.proto.StreamSendBytesCallback";
|
|
1201
|
+
static readonly fields: FieldList = proto2.util.newFieldList(() => [
|
|
1202
|
+
{ no: 1, name: "async_id", kind: "scalar", T: 4 /* ScalarType.UINT64 */, req: true },
|
|
1203
|
+
{ no: 2, name: "info", kind: "message", T: ByteStreamInfo, oneof: "result" },
|
|
1204
|
+
{ no: 3, name: "error", kind: "message", T: StreamError, oneof: "result" },
|
|
1205
|
+
]);
|
|
1206
|
+
|
|
1207
|
+
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): StreamSendBytesCallback {
|
|
1208
|
+
return new StreamSendBytesCallback().fromBinary(bytes, options);
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): StreamSendBytesCallback {
|
|
1212
|
+
return new StreamSendBytesCallback().fromJson(jsonValue, options);
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): StreamSendBytesCallback {
|
|
1216
|
+
return new StreamSendBytesCallback().fromJsonString(jsonString, options);
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
static equals(a: StreamSendBytesCallback | PlainMessage<StreamSendBytesCallback> | undefined, b: StreamSendBytesCallback | PlainMessage<StreamSendBytesCallback> | undefined): boolean {
|
|
1220
|
+
return proto2.util.equals(StreamSendBytesCallback, a, b);
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1077
1224
|
/**
|
|
1078
1225
|
* Sends text over a data stream.
|
|
1079
1226
|
*
|
|
@@ -2163,6 +2310,11 @@ export class TextStreamInfo extends Message<TextStreamInfo> {
|
|
|
2163
2310
|
*/
|
|
2164
2311
|
generated?: boolean;
|
|
2165
2312
|
|
|
2313
|
+
/**
|
|
2314
|
+
* @generated from field: required livekit.proto.EncryptionType encryption_type = 12;
|
|
2315
|
+
*/
|
|
2316
|
+
encryptionType?: EncryptionType;
|
|
2317
|
+
|
|
2166
2318
|
constructor(data?: PartialMessage<TextStreamInfo>) {
|
|
2167
2319
|
super();
|
|
2168
2320
|
proto2.util.initPartial(data, this);
|
|
@@ -2182,6 +2334,7 @@ export class TextStreamInfo extends Message<TextStreamInfo> {
|
|
|
2182
2334
|
{ no: 9, name: "reply_to_stream_id", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true },
|
|
2183
2335
|
{ no: 10, name: "attached_stream_ids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true },
|
|
2184
2336
|
{ no: 11, name: "generated", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true },
|
|
2337
|
+
{ no: 12, name: "encryption_type", kind: "enum", T: proto2.getEnumType(EncryptionType), req: true },
|
|
2185
2338
|
]);
|
|
2186
2339
|
|
|
2187
2340
|
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): TextStreamInfo {
|
|
@@ -2280,6 +2433,11 @@ export class ByteStreamInfo extends Message<ByteStreamInfo> {
|
|
|
2280
2433
|
*/
|
|
2281
2434
|
name?: string;
|
|
2282
2435
|
|
|
2436
|
+
/**
|
|
2437
|
+
* @generated from field: required livekit.proto.EncryptionType encryption_type = 8;
|
|
2438
|
+
*/
|
|
2439
|
+
encryptionType?: EncryptionType;
|
|
2440
|
+
|
|
2283
2441
|
constructor(data?: PartialMessage<ByteStreamInfo>) {
|
|
2284
2442
|
super();
|
|
2285
2443
|
proto2.util.initPartial(data, this);
|
|
@@ -2295,6 +2453,7 @@ export class ByteStreamInfo extends Message<ByteStreamInfo> {
|
|
|
2295
2453
|
{ no: 5, name: "total_length", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true },
|
|
2296
2454
|
{ no: 6, name: "attributes", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} },
|
|
2297
2455
|
{ no: 7, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */, req: true },
|
|
2456
|
+
{ no: 8, name: "encryption_type", kind: "enum", T: proto2.getEnumType(EncryptionType), req: true },
|
|
2298
2457
|
]);
|
|
2299
2458
|
|
|
2300
2459
|
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ByteStreamInfo {
|