@livekit/rtc-node 0.13.13 → 0.13.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +3 -0
  2. package/dist/audio_stream.cjs +3 -2
  3. package/dist/audio_stream.cjs.map +1 -1
  4. package/dist/audio_stream.d.cts +10 -2
  5. package/dist/audio_stream.d.ts +10 -2
  6. package/dist/audio_stream.d.ts.map +1 -1
  7. package/dist/audio_stream.js +2 -1
  8. package/dist/audio_stream.js.map +1 -1
  9. package/dist/data_streams/index.d.cts +2 -2
  10. package/dist/data_streams/index.d.ts +2 -2
  11. package/dist/data_streams/stream_reader.cjs.map +1 -1
  12. package/dist/data_streams/stream_reader.d.cts +2 -2
  13. package/dist/data_streams/stream_reader.d.ts +2 -2
  14. package/dist/data_streams/stream_reader.d.ts.map +1 -1
  15. package/dist/data_streams/stream_reader.js.map +1 -1
  16. package/dist/data_streams/stream_writer.cjs.map +1 -1
  17. package/dist/data_streams/stream_writer.d.cts +2 -2
  18. package/dist/data_streams/stream_writer.d.ts +2 -2
  19. package/dist/data_streams/stream_writer.d.ts.map +1 -1
  20. package/dist/data_streams/stream_writer.js.map +1 -1
  21. package/dist/data_streams/types.d.cts +2 -2
  22. package/dist/data_streams/types.d.ts +2 -2
  23. package/dist/ffi_client.cjs +4 -2
  24. package/dist/ffi_client.cjs.map +1 -1
  25. package/dist/ffi_client.d.cts +4 -1
  26. package/dist/ffi_client.d.ts +4 -1
  27. package/dist/ffi_client.d.ts.map +1 -1
  28. package/dist/ffi_client.js +4 -2
  29. package/dist/ffi_client.js.map +1 -1
  30. package/dist/index.d.cts +11 -8
  31. package/dist/index.d.ts +11 -8
  32. package/dist/participant.cjs +13 -15
  33. package/dist/participant.cjs.map +1 -1
  34. package/dist/participant.d.cts +8 -4
  35. package/dist/participant.d.ts +8 -4
  36. package/dist/participant.d.ts.map +1 -1
  37. package/dist/participant.js +5 -7
  38. package/dist/participant.js.map +1 -1
  39. package/dist/proto/audio_frame_pb.cjs +4 -2
  40. package/dist/proto/audio_frame_pb.cjs.map +1 -1
  41. package/dist/proto/audio_frame_pb.d.cts +8 -0
  42. package/dist/proto/audio_frame_pb.d.ts +8 -0
  43. package/dist/proto/audio_frame_pb.d.ts.map +1 -1
  44. package/dist/proto/audio_frame_pb.js +4 -2
  45. package/dist/proto/audio_frame_pb.js.map +1 -1
  46. package/dist/proto/data_stream_pb.cjs +1549 -0
  47. package/dist/proto/data_stream_pb.cjs.map +1 -0
  48. package/dist/proto/data_stream_pb.d.cts +1358 -0
  49. package/dist/proto/data_stream_pb.d.ts +1358 -0
  50. package/dist/proto/data_stream_pb.d.ts.map +1 -0
  51. package/dist/proto/data_stream_pb.js +1473 -0
  52. package/dist/proto/data_stream_pb.js.map +1 -0
  53. package/dist/proto/ffi_pb.cjs +43 -3
  54. package/dist/proto/ffi_pb.cjs.map +1 -1
  55. package/dist/proto/ffi_pb.d.cts +251 -8
  56. package/dist/proto/ffi_pb.d.ts +251 -8
  57. package/dist/proto/ffi_pb.d.ts.map +1 -1
  58. package/dist/proto/ffi_pb.js +43 -3
  59. package/dist/proto/ffi_pb.js.map +1 -1
  60. package/dist/proto/participant_pb.cjs +5 -1
  61. package/dist/proto/participant_pb.cjs.map +1 -1
  62. package/dist/proto/participant_pb.d.cts +9 -1
  63. package/dist/proto/participant_pb.d.ts +9 -1
  64. package/dist/proto/participant_pb.d.ts.map +1 -1
  65. package/dist/proto/participant_pb.js +5 -1
  66. package/dist/proto/participant_pb.js.map +1 -1
  67. package/dist/proto/room_pb.cjs +99 -2
  68. package/dist/proto/room_pb.cjs.map +1 -1
  69. package/dist/proto/room_pb.d.cts +130 -2
  70. package/dist/proto/room_pb.d.ts +130 -2
  71. package/dist/proto/room_pb.d.ts.map +1 -1
  72. package/dist/proto/room_pb.js +97 -3
  73. package/dist/proto/room_pb.js.map +1 -1
  74. package/dist/proto/track_pb.cjs +27 -1
  75. package/dist/proto/track_pb.cjs.map +1 -1
  76. package/dist/proto/track_pb.d.cts +40 -1
  77. package/dist/proto/track_pb.d.ts +40 -1
  78. package/dist/proto/track_pb.d.ts.map +1 -1
  79. package/dist/proto/track_pb.js +26 -1
  80. package/dist/proto/track_pb.js.map +1 -1
  81. package/dist/room.cjs +79 -3
  82. package/dist/room.cjs.map +1 -1
  83. package/dist/room.d.cts +59 -8
  84. package/dist/room.d.ts +59 -8
  85. package/dist/room.d.ts.map +1 -1
  86. package/dist/room.js +77 -1
  87. package/dist/room.js.map +1 -1
  88. package/dist/{stream_reader-a8_oiaOi.d.cts → stream_reader-Ch2zvjU3.d.cts} +0 -1
  89. package/dist/{stream_reader-DWUV4eJB.d.ts → stream_reader-DRyR29vo.d.ts} +0 -1
  90. package/dist/track.cjs +23 -4
  91. package/dist/track.cjs.map +1 -1
  92. package/dist/track.d.cts +17 -4
  93. package/dist/track.d.ts +17 -4
  94. package/dist/track.d.ts.map +1 -1
  95. package/dist/track.js +23 -4
  96. package/dist/track.js.map +1 -1
  97. package/dist/track_publication.d.cts +9 -1
  98. package/dist/track_publication.d.ts +9 -1
  99. package/dist/version.cjs +1 -1
  100. package/dist/version.cjs.map +1 -1
  101. package/dist/version.d.cts +1 -1
  102. package/dist/version.d.ts +1 -1
  103. package/dist/version.js +1 -1
  104. package/dist/version.js.map +1 -1
  105. package/dist/video_source.d.cts +11 -2
  106. package/dist/video_source.d.ts +11 -2
  107. package/dist/video_stream.cjs +1 -2
  108. package/dist/video_stream.cjs.map +1 -1
  109. package/dist/video_stream.d.cts +8 -1
  110. package/dist/video_stream.d.ts +8 -1
  111. package/dist/video_stream.d.ts.map +1 -1
  112. package/dist/video_stream.js +0 -1
  113. package/dist/video_stream.js.map +1 -1
  114. package/package.json +7 -7
  115. package/src/audio_stream.ts +5 -1
  116. package/src/data_streams/stream_reader.ts +0 -1
  117. package/src/data_streams/stream_writer.ts +0 -1
  118. package/src/ffi_client.ts +9 -5
  119. package/src/participant.ts +13 -15
  120. package/src/proto/audio_frame_pb.ts +12 -0
  121. package/src/proto/data_stream_pb.ts +2515 -0
  122. package/src/proto/ffi_pb.ts +283 -1
  123. package/src/proto/participant_pb.ts +12 -0
  124. package/src/proto/room_pb.ts +212 -1
  125. package/src/proto/track_pb.ts +58 -0
  126. package/src/room.ts +79 -1
  127. package/src/track.ts +28 -4
  128. package/src/version.ts +1 -1
  129. package/src/video_stream.ts +1 -1
package/dist/room.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { TypedEventEmitter } from '@livekit/typed-emitter';
2
- import { g as TextStreamHandler, f as ByteStreamHandler } from './stream_reader-a8_oiaOi.cjs';
2
+ import { g as TextStreamHandler, f as ByteStreamHandler } from './stream_reader-Ch2zvjU3.cjs';
3
3
  import { E2EEManager, E2EEOptions } from './e2ee.cjs';
4
4
  import { RemoteParticipant, LocalParticipant, Participant } from './participant.cjs';
5
5
  import { DisconnectReason } from './proto/participant_pb.cjs';
@@ -7,22 +7,25 @@ import { RoomInfo, ConnectionQuality, DataPacketKind, ConnectionState, IceTransp
7
7
  import { LocalTrack, RemoteTrack } from './track.cjs';
8
8
  import { LocalTrackPublication, RemoteTrackPublication, TrackPublication } from './track_publication.cjs';
9
9
  import { ChatMessage } from './types.cjs';
10
- import 'node:stream/web';
11
10
  import './proto/e2ee_pb.cjs';
12
11
  import '@bufbuild/protobuf';
13
12
  import 'node:fs';
14
13
  import './data_streams/stream_writer.cjs';
14
+ import './ffi_client.cjs';
15
15
  import './napi/native.d.cjs';
16
- import './rpc.cjs';
17
- import './proto/rpc_pb.cjs';
18
- import './transcription.cjs';
19
- import './proto/handle_pb.cjs';
16
+ import './proto/ffi_pb.cjs';
20
17
  import './proto/track_pb.cjs';
21
18
  import './proto/stats_pb.cjs';
19
+ import './proto/handle_pb.cjs';
22
20
  import './proto/video_frame_pb.cjs';
21
+ import './proto/audio_frame_pb.cjs';
22
+ import './proto/rpc_pb.cjs';
23
+ import './proto/track_publication_pb.cjs';
24
+ import './proto/data_stream_pb.cjs';
25
+ import './rpc.cjs';
26
+ import './transcription.cjs';
23
27
  import './audio_source.cjs';
24
28
  import './audio_frame.cjs';
25
- import './proto/audio_frame_pb.cjs';
26
29
  import './video_source.cjs';
27
30
  import './video_frame.cjs';
28
31
 
@@ -55,11 +58,55 @@ declare class Room extends Room_base {
55
58
  get name(): string | undefined;
56
59
  get metadata(): string | undefined;
57
60
  get isConnected(): boolean;
61
+ /**
62
+ * Gets the room's server ID. This ID is assigned by the LiveKit server
63
+ * and is unique for each room session.
64
+ * SID is assigned asynchronously after connection.
65
+ * @returns Promise that resolves to the room's server ID, or empty string if not connected
66
+ */
58
67
  getSid(): Promise<string>;
68
+ get numParticipants(): number;
69
+ get numPublishers(): number;
70
+ get creationTime(): Date;
71
+ get isRecording(): boolean;
72
+ /**
73
+ * The time in seconds after which a room will be closed after the last
74
+ * participant has disconnected.
75
+ */
76
+ get departureTimeout(): number;
77
+ /**
78
+ * The time in seconds after which an empty room will be automatically closed.
79
+ */
80
+ get emptyTimeout(): number;
81
+ /**
82
+ * Connects to a LiveKit room using the provided URL and access token.
83
+ * @param url The WebSocket URL of the LiveKit server
84
+ * @param token A valid LiveKit access token for authentication
85
+ * @param opts Optional room configuration options
86
+ * @throws ConnectError if connection fails
87
+ */
59
88
  connect(url: string, token: string, opts?: RoomOptions): Promise<void>;
89
+ /**
90
+ * Disconnects from the room and cleans up all resources.
91
+ * This will stop all tracks and close the connection.
92
+ */
60
93
  disconnect(): Promise<void>;
94
+ /**
95
+ * Registers a handler for incoming text data streams on a specific topic.
96
+ * Text streams are used for receiving structured text data from other participants.
97
+ * @param topic The topic to listen for text streams on
98
+ * @param callback Function to handle incoming text stream data
99
+ * @throws Error if a handler for this topic is already registered
100
+ */
61
101
  registerTextStreamHandler(topic: string, callback: TextStreamHandler): void;
62
102
  unregisterTextStreamHandler(topic: string): void;
103
+ /**
104
+ * Registers a handler for incoming byte data streams on a specific topic.
105
+ * Byte streams are used for receiving binary data like files from other participants.
106
+ * @param topic The topic to listen for byte streams on
107
+ * @param callback Function to handle incoming byte stream data
108
+ * @throws Error if a handler for this topic is already registered
109
+ */
63
110
  registerByteStreamHandler(topic: string, callback: ByteStreamHandler): void;
64
111
  unregisterByteStreamHandler(topic: string): void;
65
112
  private onFfiEvent;
@@ -106,6 +153,8 @@ type RoomCallbacks = {
106
153
  reconnecting: () => void;
107
154
  reconnected: () => void;
108
155
  roomSidChanged: (sid: string) => void;
156
+ roomUpdated: () => void;
157
+ moved: () => void;
109
158
  };
110
159
  declare enum RoomEvent {
111
160
  ParticipantConnected = "participantConnected",
@@ -135,7 +184,9 @@ declare enum RoomEvent {
135
184
  Connected = "connected",
136
185
  Disconnected = "disconnected",
137
186
  Reconnecting = "reconnecting",
138
- Reconnected = "reconnected"
187
+ Reconnected = "reconnected",
188
+ RoomUpdated = "roomUpdated",
189
+ Moved = "moved"
139
190
  }
140
191
 
141
192
  export { ConnectError, Room, type RoomCallbacks, RoomEvent, type RoomOptions, type RtcConfiguration, defaultRoomOptions, defaultRtcConfiguration };
package/dist/room.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { TypedEventEmitter } from '@livekit/typed-emitter';
2
- import { g as TextStreamHandler, f as ByteStreamHandler } from './stream_reader-DWUV4eJB.js';
2
+ import { g as TextStreamHandler, f as ByteStreamHandler } from './stream_reader-DRyR29vo.js';
3
3
  import { E2EEManager, E2EEOptions } from './e2ee.js';
4
4
  import { RemoteParticipant, LocalParticipant, Participant } from './participant.js';
5
5
  import { DisconnectReason } from './proto/participant_pb.js';
@@ -7,22 +7,25 @@ import { RoomInfo, ConnectionQuality, DataPacketKind, ConnectionState, IceTransp
7
7
  import { LocalTrack, RemoteTrack } from './track.js';
8
8
  import { LocalTrackPublication, RemoteTrackPublication, TrackPublication } from './track_publication.js';
9
9
  import { ChatMessage } from './types.js';
10
- import 'node:stream/web';
11
10
  import './proto/e2ee_pb.js';
12
11
  import '@bufbuild/protobuf';
13
12
  import 'node:fs';
14
13
  import './data_streams/stream_writer.js';
14
+ import './ffi_client.js';
15
15
  import './napi/native.d.js';
16
- import './rpc.js';
17
- import './proto/rpc_pb.js';
18
- import './transcription.js';
19
- import './proto/handle_pb.js';
16
+ import './proto/ffi_pb.js';
20
17
  import './proto/track_pb.js';
21
18
  import './proto/stats_pb.js';
19
+ import './proto/handle_pb.js';
22
20
  import './proto/video_frame_pb.js';
21
+ import './proto/audio_frame_pb.js';
22
+ import './proto/rpc_pb.js';
23
+ import './proto/track_publication_pb.js';
24
+ import './proto/data_stream_pb.js';
25
+ import './rpc.js';
26
+ import './transcription.js';
23
27
  import './audio_source.js';
24
28
  import './audio_frame.js';
25
- import './proto/audio_frame_pb.js';
26
29
  import './video_source.js';
27
30
  import './video_frame.js';
28
31
 
@@ -55,11 +58,55 @@ declare class Room extends Room_base {
55
58
  get name(): string | undefined;
56
59
  get metadata(): string | undefined;
57
60
  get isConnected(): boolean;
61
+ /**
62
+ * Gets the room's server ID. This ID is assigned by the LiveKit server
63
+ * and is unique for each room session.
64
+ * SID is assigned asynchronously after connection.
65
+ * @returns Promise that resolves to the room's server ID, or empty string if not connected
66
+ */
58
67
  getSid(): Promise<string>;
68
+ get numParticipants(): number;
69
+ get numPublishers(): number;
70
+ get creationTime(): Date;
71
+ get isRecording(): boolean;
72
+ /**
73
+ * The time in seconds after which a room will be closed after the last
74
+ * participant has disconnected.
75
+ */
76
+ get departureTimeout(): number;
77
+ /**
78
+ * The time in seconds after which an empty room will be automatically closed.
79
+ */
80
+ get emptyTimeout(): number;
81
+ /**
82
+ * Connects to a LiveKit room using the provided URL and access token.
83
+ * @param url The WebSocket URL of the LiveKit server
84
+ * @param token A valid LiveKit access token for authentication
85
+ * @param opts Optional room configuration options
86
+ * @throws ConnectError if connection fails
87
+ */
59
88
  connect(url: string, token: string, opts?: RoomOptions): Promise<void>;
89
+ /**
90
+ * Disconnects from the room and cleans up all resources.
91
+ * This will stop all tracks and close the connection.
92
+ */
60
93
  disconnect(): Promise<void>;
94
+ /**
95
+ * Registers a handler for incoming text data streams on a specific topic.
96
+ * Text streams are used for receiving structured text data from other participants.
97
+ * @param topic The topic to listen for text streams on
98
+ * @param callback Function to handle incoming text stream data
99
+ * @throws Error if a handler for this topic is already registered
100
+ */
61
101
  registerTextStreamHandler(topic: string, callback: TextStreamHandler): void;
62
102
  unregisterTextStreamHandler(topic: string): void;
103
+ /**
104
+ * Registers a handler for incoming byte data streams on a specific topic.
105
+ * Byte streams are used for receiving binary data like files from other participants.
106
+ * @param topic The topic to listen for byte streams on
107
+ * @param callback Function to handle incoming byte stream data
108
+ * @throws Error if a handler for this topic is already registered
109
+ */
63
110
  registerByteStreamHandler(topic: string, callback: ByteStreamHandler): void;
64
111
  unregisterByteStreamHandler(topic: string): void;
65
112
  private onFfiEvent;
@@ -106,6 +153,8 @@ type RoomCallbacks = {
106
153
  reconnecting: () => void;
107
154
  reconnected: () => void;
108
155
  roomSidChanged: (sid: string) => void;
156
+ roomUpdated: () => void;
157
+ moved: () => void;
109
158
  };
110
159
  declare enum RoomEvent {
111
160
  ParticipantConnected = "participantConnected",
@@ -135,7 +184,9 @@ declare enum RoomEvent {
135
184
  Connected = "connected",
136
185
  Disconnected = "disconnected",
137
186
  Reconnecting = "reconnecting",
138
- Reconnected = "reconnected"
187
+ Reconnected = "reconnected",
188
+ RoomUpdated = "roomUpdated",
189
+ Moved = "moved"
139
190
  }
140
191
 
141
192
  export { ConnectError, Room, type RoomCallbacks, RoomEvent, type RoomOptions, type RtcConfiguration, defaultRoomOptions, defaultRtcConfiguration };
@@ -1 +1 @@
1
- {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
package/dist/room.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import EventEmitter from "events";
2
- import { ReadableStream } from "node:stream/web";
3
2
  import { ByteStreamReader, TextStreamReader } from "./data_streams/stream_reader.js";
4
3
  import { E2EEManager, defaultE2EEOptions } from "./e2ee.js";
5
4
  import { FfiClient, FfiClientEvent, FfiHandle } from "./ffi_client.js";
@@ -232,6 +231,19 @@ class Room extends EventEmitter {
232
231
  this.handleStreamChunk(ev.value.chunk);
233
232
  } else if (ev.case === "streamTrailerReceived" && ev.value.trailer) {
234
233
  this.handleStreamTrailer(ev.value.trailer);
234
+ } else if (ev.case === "roomUpdated") {
235
+ this.info = ev.value;
236
+ this.emit("roomUpdated" /* RoomUpdated */);
237
+ } else if (ev.case === "moved") {
238
+ this.info = ev.value;
239
+ this.emit("moved" /* Moved */);
240
+ } else if (ev.case === "participantsUpdated") {
241
+ for (const info of ev.value.participants) {
242
+ const participant = this.retrieveParticipantByIdentity(info.identity);
243
+ if (participant) {
244
+ participant.info = info;
245
+ }
246
+ }
235
247
  }
236
248
  };
237
249
  }
@@ -246,6 +258,12 @@ class Room extends EventEmitter {
246
258
  get isConnected() {
247
259
  return this.ffiHandle != void 0 && this.connectionState != ConnectionState.CONN_DISCONNECTED;
248
260
  }
261
+ /**
262
+ * Gets the room's server ID. This ID is assigned by the LiveKit server
263
+ * and is unique for each room session.
264
+ * SID is assigned asynchronously after connection.
265
+ * @returns Promise that resolves to the room's server ID, or empty string if not connected
266
+ */
249
267
  async getSid() {
250
268
  var _a;
251
269
  if (!this.isConnected) {
@@ -268,6 +286,44 @@ class Room extends EventEmitter {
268
286
  });
269
287
  });
270
288
  }
289
+ get numParticipants() {
290
+ var _a;
291
+ return ((_a = this.info) == null ? void 0 : _a.numParticipants) ?? 0;
292
+ }
293
+ get numPublishers() {
294
+ var _a;
295
+ return ((_a = this.info) == null ? void 0 : _a.numPublishers) ?? 0;
296
+ }
297
+ get creationTime() {
298
+ var _a;
299
+ return new Date(Number(((_a = this.info) == null ? void 0 : _a.creationTime) ?? 0));
300
+ }
301
+ get isRecording() {
302
+ var _a;
303
+ return ((_a = this.info) == null ? void 0 : _a.activeRecording) ?? false;
304
+ }
305
+ /**
306
+ * The time in seconds after which a room will be closed after the last
307
+ * participant has disconnected.
308
+ */
309
+ get departureTimeout() {
310
+ var _a;
311
+ return ((_a = this.info) == null ? void 0 : _a.departureTimeout) ?? 0;
312
+ }
313
+ /**
314
+ * The time in seconds after which an empty room will be automatically closed.
315
+ */
316
+ get emptyTimeout() {
317
+ var _a;
318
+ return ((_a = this.info) == null ? void 0 : _a.emptyTimeout) ?? 0;
319
+ }
320
+ /**
321
+ * Connects to a LiveKit room using the provided URL and access token.
322
+ * @param url The WebSocket URL of the LiveKit server
323
+ * @param token A valid LiveKit access token for authentication
324
+ * @param opts Optional room configuration options
325
+ * @throws ConnectError if connection fails
326
+ */
271
327
  async connect(url, token, opts) {
272
328
  const options = { ...defaultRoomOptions, ...opts };
273
329
  const e2eeOptions = { ...defaultE2EEOptions, ...options.e2ee };
@@ -307,6 +363,10 @@ class Room extends EventEmitter {
307
363
  throw new ConnectError(cb.message.value || "");
308
364
  }
309
365
  }
366
+ /**
367
+ * Disconnects from the room and cleans up all resources.
368
+ * This will stop all tracks and close the connection.
369
+ */
310
370
  async disconnect() {
311
371
  var _a;
312
372
  if (!this.isConnected) {
@@ -323,6 +383,13 @@ class Room extends EventEmitter {
323
383
  FfiClient.instance.removeListener(FfiClientEvent.FfiEvent, this.onFfiEvent);
324
384
  this.removeAllListeners();
325
385
  }
386
+ /**
387
+ * Registers a handler for incoming text data streams on a specific topic.
388
+ * Text streams are used for receiving structured text data from other participants.
389
+ * @param topic The topic to listen for text streams on
390
+ * @param callback Function to handle incoming text stream data
391
+ * @throws Error if a handler for this topic is already registered
392
+ */
326
393
  registerTextStreamHandler(topic, callback) {
327
394
  if (this.textStreamHandlers.has(topic)) {
328
395
  throw new Error(`A text stream handler for topic "${topic}" has already been set.`);
@@ -332,6 +399,13 @@ class Room extends EventEmitter {
332
399
  unregisterTextStreamHandler(topic) {
333
400
  this.textStreamHandlers.delete(topic);
334
401
  }
402
+ /**
403
+ * Registers a handler for incoming byte data streams on a specific topic.
404
+ * Byte streams are used for receiving binary data like files from other participants.
405
+ * @param topic The topic to listen for byte streams on
406
+ * @param callback Function to handle incoming byte stream data
407
+ * @throws Error if a handler for this topic is already registered
408
+ */
335
409
  registerByteStreamHandler(topic, callback) {
336
410
  if (this.byteStreamHandlers.has(topic)) {
337
411
  throw new Error(`A byte stream handler for topic "${topic}" has already been set.`);
@@ -514,6 +588,8 @@ var RoomEvent = /* @__PURE__ */ ((RoomEvent2) => {
514
588
  RoomEvent2["Disconnected"] = "disconnected";
515
589
  RoomEvent2["Reconnecting"] = "reconnecting";
516
590
  RoomEvent2["Reconnected"] = "reconnected";
591
+ RoomEvent2["RoomUpdated"] = "roomUpdated";
592
+ RoomEvent2["Moved"] = "moved";
517
593
  return RoomEvent2;
518
594
  })(RoomEvent || {});
519
595
  export {
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 { ReadableStream } from 'node:stream/web';\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 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 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 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 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\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent);\n break;\n case 'error':\n default:\n throw new ConnectError(cb.message.value || '');\n }\n }\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 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 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 throw TypeError('cannot handle ffi events before connectCallback');\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 (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 }\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('ignoring incoming byte stream due to no handler for topic', streamHeader.topic);\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('ignoring incoming text stream due to no handler for topic', streamHeader.topic);\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};\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}\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 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 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 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\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent);\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 throw TypeError('cannot handle ffi events before connectCallback');\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 (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('ignoring incoming byte stream due to no handler for topic', streamHeader.topic);\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('ignoring incoming text stream due to no handler for topic', streamHeader.topic);\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,4 +1,3 @@
1
- import { ReadableStream } from 'node:stream/web';
2
1
  import { DataStream_Chunk, DataStream_Header } from './proto/room_pb.cjs';
3
2
 
4
3
  interface StreamController<T extends DataStream_Chunk> {
@@ -1,4 +1,3 @@
1
- import { ReadableStream } from 'node:stream/web';
2
1
  import { DataStream_Chunk, DataStream_Header } from './proto/room_pb.js';
3
2
 
4
3
  interface StreamController<T extends DataStream_Chunk> {