@livekit/rtc-node 0.13.2 → 0.13.4

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 (114) hide show
  1. package/dist/data_streams/index.cjs +25 -0
  2. package/dist/data_streams/index.cjs.map +1 -0
  3. package/dist/data_streams/index.d.cts +11 -0
  4. package/dist/data_streams/index.d.ts +11 -0
  5. package/dist/data_streams/index.d.ts.map +1 -0
  6. package/dist/data_streams/index.js +3 -0
  7. package/dist/data_streams/index.js.map +1 -0
  8. package/dist/data_streams/stream_reader.cjs +145 -0
  9. package/dist/data_streams/stream_reader.cjs.map +1 -0
  10. package/dist/data_streams/stream_reader.d.cts +10 -0
  11. package/dist/data_streams/stream_reader.d.ts +10 -0
  12. package/dist/data_streams/stream_reader.d.ts.map +1 -0
  13. package/dist/data_streams/stream_reader.js +120 -0
  14. package/dist/data_streams/stream_reader.js.map +1 -0
  15. package/dist/data_streams/stream_writer.cjs +51 -0
  16. package/dist/data_streams/stream_writer.cjs.map +1 -0
  17. package/dist/data_streams/stream_writer.d.cts +26 -0
  18. package/dist/data_streams/stream_writer.d.ts +26 -0
  19. package/dist/data_streams/stream_writer.d.ts.map +1 -0
  20. package/dist/data_streams/stream_writer.js +26 -0
  21. package/dist/data_streams/stream_writer.js.map +1 -0
  22. package/dist/data_streams/types.cjs +17 -0
  23. package/dist/data_streams/types.cjs.map +1 -0
  24. package/dist/data_streams/types.d.cts +10 -0
  25. package/dist/data_streams/types.d.ts +10 -0
  26. package/dist/data_streams/types.d.ts.map +1 -0
  27. package/dist/data_streams/types.js +1 -0
  28. package/dist/data_streams/types.js.map +1 -0
  29. package/dist/index.cjs +7 -4
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +4 -0
  32. package/dist/index.d.ts +4 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/log.cjs +42 -0
  37. package/dist/log.cjs.map +1 -0
  38. package/dist/log.d.cts +7 -0
  39. package/dist/log.d.ts +7 -0
  40. package/dist/log.d.ts.map +1 -0
  41. package/dist/log.js +18 -0
  42. package/dist/log.js.map +1 -0
  43. package/dist/napi/native.d.cjs.map +1 -1
  44. package/dist/napi/native.d.ts +5 -5
  45. package/dist/native.d.ts +5 -5
  46. package/dist/participant.cjs +260 -16
  47. package/dist/participant.cjs.map +1 -1
  48. package/dist/participant.d.cts +40 -6
  49. package/dist/participant.d.ts +40 -6
  50. package/dist/participant.d.ts.map +1 -1
  51. package/dist/participant.js +263 -5
  52. package/dist/participant.js.map +1 -1
  53. package/dist/proto/ffi_pb.cjs +14 -3
  54. package/dist/proto/ffi_pb.cjs.map +1 -1
  55. package/dist/proto/ffi_pb.d.cts +81 -7
  56. package/dist/proto/ffi_pb.d.ts +81 -7
  57. package/dist/proto/ffi_pb.d.ts.map +1 -1
  58. package/dist/proto/ffi_pb.js +15 -4
  59. package/dist/proto/ffi_pb.js.map +1 -1
  60. package/dist/proto/room_pb.cjs +488 -30
  61. package/dist/proto/room_pb.cjs.map +1 -1
  62. package/dist/proto/room_pb.d.cts +412 -50
  63. package/dist/proto/room_pb.d.ts +412 -50
  64. package/dist/proto/room_pb.d.ts.map +1 -1
  65. package/dist/proto/room_pb.js +471 -29
  66. package/dist/proto/room_pb.js.map +1 -1
  67. package/dist/proto/video_frame_pb.cjs.map +1 -1
  68. package/dist/proto/video_frame_pb.d.cts +3 -0
  69. package/dist/proto/video_frame_pb.d.ts +3 -0
  70. package/dist/proto/video_frame_pb.d.ts.map +1 -1
  71. package/dist/proto/video_frame_pb.js.map +1 -1
  72. package/dist/room.cjs +202 -45
  73. package/dist/room.cjs.map +1 -1
  74. package/dist/room.d.cts +21 -3
  75. package/dist/room.d.ts +21 -3
  76. package/dist/room.d.ts.map +1 -1
  77. package/dist/room.js +203 -45
  78. package/dist/room.js.map +1 -1
  79. package/dist/types-BWsKf9LP.d.cts +93 -0
  80. package/dist/types-Ca3IVRvo.d.ts +93 -0
  81. package/dist/utils.cjs +51 -0
  82. package/dist/utils.cjs.map +1 -0
  83. package/dist/utils.d.cts +7 -0
  84. package/dist/utils.d.ts +7 -0
  85. package/dist/utils.d.ts.map +1 -0
  86. package/dist/utils.js +25 -0
  87. package/dist/utils.js.map +1 -0
  88. package/dist/version.cjs +1 -1
  89. package/dist/version.cjs.map +1 -1
  90. package/dist/version.d.cts +1 -1
  91. package/dist/version.d.ts +1 -1
  92. package/dist/version.js +1 -1
  93. package/dist/version.js.map +1 -1
  94. package/dist/video_frame.cjs +2 -0
  95. package/dist/video_frame.cjs.map +1 -1
  96. package/dist/video_frame.d.ts.map +1 -1
  97. package/dist/video_frame.js +2 -0
  98. package/dist/video_frame.js.map +1 -1
  99. package/package.json +9 -7
  100. package/src/data_streams/index.ts +7 -0
  101. package/src/data_streams/stream_reader.ts +166 -0
  102. package/src/data_streams/stream_writer.ts +36 -0
  103. package/src/data_streams/types.ts +61 -0
  104. package/src/index.ts +1 -0
  105. package/src/log.ts +25 -0
  106. package/src/napi/native.d.ts +5 -5
  107. package/src/participant.ts +351 -29
  108. package/src/proto/ffi_pb.ts +86 -1
  109. package/src/proto/room_pb.ts +788 -68
  110. package/src/proto/video_frame_pb.ts +3 -0
  111. package/src/room.ts +251 -68
  112. package/src/utils.ts +33 -0
  113. package/src/version.ts +1 -1
  114. package/src/video_frame.ts +2 -0
package/dist/room.cjs CHANGED
@@ -36,8 +36,11 @@ __export(room_exports, {
36
36
  });
37
37
  module.exports = __toCommonJS(room_exports);
38
38
  var import_events = __toESM(require("events"), 1);
39
+ var import_web = require("node:stream/web");
40
+ var import_stream_reader = require("./data_streams/stream_reader.cjs");
39
41
  var import_e2ee = require("./e2ee.cjs");
40
42
  var import_ffi_client = require("./ffi_client.cjs");
43
+ var import_log = require("./log.cjs");
41
44
  var import_participant = require("./participant.cjs");
42
45
  var import_e2ee_pb = require("./proto/e2ee_pb.cjs");
43
46
  var import_room_pb = require("./proto/room_pb.cjs");
@@ -45,6 +48,7 @@ var import_room_pb2 = require("./proto/room_pb.cjs");
45
48
  var import_track_pb = require("./proto/track_pb.cjs");
46
49
  var import_track = require("./track.cjs");
47
50
  var import_track_publication = require("./track_publication.cjs");
51
+ var import_utils = require("./utils.cjs");
48
52
  const defaultRtcConfiguration = {
49
53
  iceTransportType: import_room_pb2.IceTransportType.TRANSPORT_ALL,
50
54
  continualGatheringPolicy: import_room_pb2.ContinualGatheringPolicy.GATHER_CONTINUALLY,
@@ -61,11 +65,29 @@ const defaultRoomOptions = new import_room_pb.RoomOptions({
61
65
  class Room extends import_events.default {
62
66
  constructor() {
63
67
  super();
68
+ this.byteStreamControllers = /* @__PURE__ */ new Map();
69
+ this.textStreamControllers = /* @__PURE__ */ new Map();
70
+ this.byteStreamHandlers = /* @__PURE__ */ new Map();
71
+ this.textStreamHandlers = /* @__PURE__ */ new Map();
64
72
  this.connectionState = import_room_pb2.ConnectionState.CONN_DISCONNECTED;
65
73
  this.remoteParticipants = /* @__PURE__ */ new Map();
66
74
  this.onFfiEvent = (ffiEvent) => {
67
- var _a;
68
- if (ffiEvent.message.case != "roomEvent" || ffiEvent.message.value.roomHandle != ((_a = this.ffiHandle) == null ? void 0 : _a.handle)) {
75
+ if (!this.localParticipant || !this.ffiHandle || !this.info) {
76
+ throw TypeError("cannot handle ffi events before connectCallback");
77
+ }
78
+ if (ffiEvent.message.case == "rpcMethodInvocation") {
79
+ if (ffiEvent.message.value.localParticipantHandle == this.localParticipant.ffi_handle.handle) {
80
+ this.localParticipant.handleRpcMethodInvocation(
81
+ ffiEvent.message.value.invocationId,
82
+ ffiEvent.message.value.method,
83
+ ffiEvent.message.value.requestId,
84
+ ffiEvent.message.value.callerIdentity,
85
+ ffiEvent.message.value.payload,
86
+ ffiEvent.message.value.responseTimeoutMs
87
+ );
88
+ }
89
+ return;
90
+ } else if (ffiEvent.message.case != "roomEvent" || ffiEvent.message.value.roomHandle != this.ffiHandle.handle) {
69
91
  return;
70
92
  }
71
93
  const ev = ffiEvent.message.value.message;
@@ -94,46 +116,53 @@ class Room extends import_events.default {
94
116
  participant.trackPublications.set(publication.sid, publication);
95
117
  this.emit("trackPublished" /* TrackPublished */, publication, participant);
96
118
  } else if (ev.case == "trackUnpublished") {
97
- const participant = this.remoteParticipants.get(ev.value.participantIdentity);
119
+ const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
98
120
  const publication = participant.trackPublications.get(ev.value.publicationSid);
99
121
  participant.trackPublications.delete(ev.value.publicationSid);
100
- this.emit("trackUnpublished" /* TrackUnpublished */, publication, participant);
122
+ if (publication) {
123
+ this.emit("trackUnpublished" /* TrackUnpublished */, publication, participant);
124
+ }
101
125
  } else if (ev.case == "trackSubscribed") {
102
126
  const ownedTrack = ev.value.track;
103
- const participant = this.remoteParticipants.get(ev.value.participantIdentity);
104
- const publication = participant.trackPublications.get(ownedTrack.info.sid);
127
+ const trackInfo = ownedTrack.info;
128
+ const { participant, publication } = this.requirePublicationOfRemoteParticipant(
129
+ ev.value.participantIdentity,
130
+ trackInfo.sid
131
+ );
105
132
  publication.subscribed = true;
106
- if (ownedTrack.info.kind == import_track_pb.TrackKind.KIND_VIDEO) {
133
+ if (trackInfo.kind == import_track_pb.TrackKind.KIND_VIDEO) {
107
134
  publication.track = new import_track.RemoteVideoTrack(ownedTrack);
108
- } else if (ownedTrack.info.kind == import_track_pb.TrackKind.KIND_AUDIO) {
135
+ } else if (trackInfo.kind == import_track_pb.TrackKind.KIND_AUDIO) {
109
136
  publication.track = new import_track.RemoteAudioTrack(ownedTrack);
110
137
  }
111
138
  this.emit("trackSubscribed" /* TrackSubscribed */, publication.track, publication, participant);
112
139
  } else if (ev.case == "trackUnsubscribed") {
113
- const participant = this.remoteParticipants.get(ev.value.participantIdentity);
114
- const publication = participant.trackPublications.get(ev.value.trackSid);
140
+ const { participant, publication } = this.requirePublicationOfRemoteParticipant(
141
+ ev.value.participantIdentity,
142
+ ev.value.trackSid
143
+ );
144
+ const track = publication.track;
115
145
  publication.track = void 0;
116
146
  publication.subscribed = false;
117
- this.emit("trackUnsubscribed" /* TrackUnsubscribed */, publication.track, publication, participant);
147
+ this.emit("trackUnsubscribed" /* TrackUnsubscribed */, track, publication, participant);
118
148
  } else if (ev.case == "trackSubscriptionFailed") {
119
- const participant = this.remoteParticipants.get(ev.value.participantIdentity);
120
- this.emit(
121
- "trackSubscriptionFailed" /* TrackSubscriptionFailed */,
122
- ev.value.trackSid,
123
- participant,
124
- ev.value.error
125
- );
149
+ const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
150
+ this.emit("trackSubscriptionFailed" /* TrackSubscriptionFailed */, ev.value.trackSid, participant, ev.value.error);
126
151
  } else if (ev.case == "trackMuted") {
127
- const participant = this.remoteParticipants.get(ev.value.participantIdentity);
128
- const publication = participant.trackPublications.get(ev.value.trackSid);
152
+ const { participant, publication } = this.requirePublicationOfParticipant(
153
+ ev.value.participantIdentity,
154
+ ev.value.trackSid
155
+ );
129
156
  publication.info.muted = true;
130
157
  if (publication.track) {
131
158
  publication.track.info.muted = true;
132
159
  }
133
160
  this.emit("trackMuted" /* TrackMuted */, publication, participant);
134
161
  } else if (ev.case == "trackUnmuted") {
135
- const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
136
- const publication = participant.trackPublications.get(ev.value.trackSid);
162
+ const { participant, publication } = this.requirePublicationOfParticipant(
163
+ ev.value.participantIdentity,
164
+ ev.value.trackSid
165
+ );
137
166
  publication.info.muted = false;
138
167
  if (publication.track) {
139
168
  publication.track.info.muted = false;
@@ -141,47 +170,41 @@ class Room extends import_events.default {
141
170
  this.emit("trackUnmuted" /* TrackUnmuted */, publication, participant);
142
171
  } else if (ev.case == "activeSpeakersChanged") {
143
172
  const activeSpeakers = ev.value.participantIdentities.map(
144
- (identity) => this.retrieveParticipantByIdentity(identity)
145
- );
146
- this.emit(
147
- "activeSpeakersChanged" /* ActiveSpeakersChanged */,
148
- activeSpeakers.map((s) => s)
173
+ (identity) => this.requireParticipantByIdentity(identity)
149
174
  );
175
+ this.emit("activeSpeakersChanged" /* ActiveSpeakersChanged */, activeSpeakers);
150
176
  } else if (ev.case == "roomMetadataChanged") {
151
177
  this.info.metadata = ev.value.metadata;
152
178
  this.emit("roomMetadataChanged" /* RoomMetadataChanged */, this.info.metadata);
153
179
  } else if (ev.case == "participantMetadataChanged") {
154
- const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
180
+ const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
155
181
  participant.info.metadata = ev.value.metadata;
156
182
  this.emit("participantMetadataChanged" /* ParticipantMetadataChanged */, participant.metadata, participant);
157
183
  } else if (ev.case == "participantNameChanged") {
158
- const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
184
+ const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
159
185
  participant.info.name = ev.value.name;
160
186
  this.emit("participantNameChanged" /* ParticipantNameChanged */, participant.name, participant);
161
187
  } else if (ev.case == "participantAttributesChanged") {
162
- const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
188
+ const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
163
189
  participant.info.attributes = ev.value.attributes.reduce(
164
- (obj, item) => {
165
- obj[item.key] = item.value;
166
- return obj;
190
+ (acc, value) => {
191
+ acc[value.key] = value.value;
192
+ return acc;
167
193
  },
168
194
  {}
169
195
  );
170
196
  if (Object.keys(ev.value.changedAttributes).length > 0) {
171
- this.emit(
172
- "participantAttributesChanged" /* ParticipantAttributesChanged */,
173
- ev.value.changedAttributes.reduce(
174
- (obj, item) => {
175
- obj[item.key] = item.value;
176
- return obj;
177
- },
178
- {}
179
- ),
180
- participant
197
+ const changedAttributes = ev.value.changedAttributes.reduce(
198
+ (acc, value) => {
199
+ acc[value.key] = value.value;
200
+ return acc;
201
+ },
202
+ {}
181
203
  );
204
+ this.emit("participantAttributesChanged" /* ParticipantAttributesChanged */, changedAttributes, participant);
182
205
  }
183
206
  } else if (ev.case == "connectionQualityChanged") {
184
- const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
207
+ const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
185
208
  this.emit("connectionQualityChanged" /* ConnectionQualityChanged */, ev.value.quality, participant);
186
209
  } else if (ev.case == "chatMessage") {
187
210
  const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
@@ -232,6 +255,14 @@ class Room extends import_events.default {
232
255
  this.emit("reconnecting" /* Reconnecting */);
233
256
  } else if (ev.case == "reconnected") {
234
257
  this.emit("reconnected" /* Reconnected */);
258
+ } else if (ev.case == "roomSidChanged") {
259
+ this.emit("roomSidChanged" /* RoomSidChanged */, ev.value.sid);
260
+ } else if (ev.case === "streamHeaderReceived" && ev.value.header) {
261
+ this.handleStreamHeader(ev.value.header, ev.value.participantIdentity);
262
+ } else if (ev.case === "streamChunkReceived" && ev.value.chunk) {
263
+ this.handleStreamChunk(ev.value.chunk);
264
+ } else if (ev.case === "streamTrailerReceived" && ev.value.trailer) {
265
+ this.handleStreamTrailer(ev.value.trailer);
235
266
  }
236
267
  };
237
268
  }
@@ -248,7 +279,25 @@ class Room extends import_events.default {
248
279
  }
249
280
  async getSid() {
250
281
  var _a;
251
- return (_a = this.info) == null ? void 0 : _a.sid;
282
+ if (!this.isConnected) {
283
+ return "";
284
+ }
285
+ if (((_a = this.info) == null ? void 0 : _a.sid) && this.info.sid !== "") {
286
+ return this.info.sid;
287
+ }
288
+ return new Promise((resolve, reject) => {
289
+ const handleRoomUpdate = (sid) => {
290
+ if (sid !== "") {
291
+ this.off("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
292
+ resolve(sid);
293
+ }
294
+ };
295
+ this.on("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
296
+ this.once("disconnected" /* Disconnected */, () => {
297
+ this.off("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
298
+ reject("Room disconnected before room server id was available");
299
+ });
300
+ });
252
301
  }
253
302
  async connect(url, token, opts) {
254
303
  const options = { ...defaultRoomOptions, ...opts };
@@ -304,6 +353,24 @@ class Room extends import_events.default {
304
353
  import_ffi_client.FfiClient.instance.removeListener(import_ffi_client.FfiClientEvent.FfiEvent, this.onFfiEvent);
305
354
  this.removeAllListeners();
306
355
  }
356
+ registerTextStreamHandler(topic, callback) {
357
+ if (this.textStreamHandlers.has(topic)) {
358
+ throw new Error(`A text stream handler for topic "${topic}" has already been set.`);
359
+ }
360
+ this.textStreamHandlers.set(topic, callback);
361
+ }
362
+ unregisterTextStreamHandler(topic) {
363
+ this.textStreamHandlers.delete(topic);
364
+ }
365
+ registerByteStreamHandler(topic, callback) {
366
+ if (this.byteStreamHandlers.has(topic)) {
367
+ throw new Error(`A byte stream handler for topic "${topic}" has already been set.`);
368
+ }
369
+ this.byteStreamHandlers.set(topic, callback);
370
+ }
371
+ unregisterByteStreamHandler(topic) {
372
+ this.byteStreamHandlers.delete(topic);
373
+ }
307
374
  retrieveParticipantByIdentity(identity) {
308
375
  var _a;
309
376
  if (((_a = this.localParticipant) == null ? void 0 : _a.identity) === identity) {
@@ -353,6 +420,95 @@ class Room extends import_events.default {
353
420
  this.remoteParticipants.set(ownedInfo.info.identity, participant);
354
421
  return participant;
355
422
  }
423
+ handleStreamHeader(streamHeader, participantIdentity) {
424
+ if (streamHeader.contentHeader.case === "byteHeader") {
425
+ const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic ?? "");
426
+ if (!streamHandlerCallback) {
427
+ import_log.log.debug("ignoring incoming byte stream due to no handler for topic", streamHeader.topic);
428
+ return;
429
+ }
430
+ let streamController;
431
+ const stream = new import_web.ReadableStream({
432
+ start: (controller) => {
433
+ streamController = controller;
434
+ this.byteStreamControllers.set(streamHeader.streamId, {
435
+ header: streamHeader,
436
+ controller: streamController,
437
+ startTime: Date.now()
438
+ });
439
+ }
440
+ });
441
+ const info = {
442
+ streamId: streamHeader.streamId,
443
+ name: streamHeader.contentHeader.value.name ?? "unknown",
444
+ mimeType: streamHeader.mimeType,
445
+ totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : void 0,
446
+ topic: streamHeader.topic,
447
+ timestamp: (0, import_utils.bigIntToNumber)(streamHeader.timestamp),
448
+ attributes: streamHeader.attributes
449
+ };
450
+ streamHandlerCallback(
451
+ new import_stream_reader.ByteStreamReader(info, stream, (0, import_utils.bigIntToNumber)(streamHeader.totalLength)),
452
+ { identity: participantIdentity }
453
+ );
454
+ } else if (streamHeader.contentHeader.case === "textHeader") {
455
+ const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic ?? "");
456
+ if (!streamHandlerCallback) {
457
+ import_log.log.debug("ignoring incoming text stream due to no handler for topic", streamHeader.topic);
458
+ return;
459
+ }
460
+ let streamController;
461
+ const stream = new import_web.ReadableStream({
462
+ start: (controller) => {
463
+ streamController = controller;
464
+ this.textStreamControllers.set(streamHeader.streamId, {
465
+ header: streamHeader,
466
+ controller: streamController,
467
+ startTime: Date.now()
468
+ });
469
+ }
470
+ });
471
+ const info = {
472
+ streamId: streamHeader.streamId,
473
+ mimeType: streamHeader.mimeType,
474
+ totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : void 0,
475
+ topic: streamHeader.topic,
476
+ timestamp: Number(streamHeader.timestamp),
477
+ attributes: streamHeader.attributes
478
+ };
479
+ streamHandlerCallback(
480
+ new import_stream_reader.TextStreamReader(info, stream, (0, import_utils.bigIntToNumber)(streamHeader.totalLength)),
481
+ { identity: participantIdentity }
482
+ );
483
+ }
484
+ }
485
+ handleStreamChunk(chunk) {
486
+ const fileBuffer = this.byteStreamControllers.get(chunk.streamId);
487
+ if (fileBuffer) {
488
+ if (chunk.content.length > 0) {
489
+ fileBuffer.controller.enqueue(chunk);
490
+ }
491
+ }
492
+ const textBuffer = this.textStreamControllers.get(chunk.streamId);
493
+ if (textBuffer) {
494
+ if (chunk.content.length > 0) {
495
+ textBuffer.controller.enqueue(chunk);
496
+ }
497
+ }
498
+ }
499
+ handleStreamTrailer(trailer) {
500
+ const streamId = trailer.streamId;
501
+ const fileBuffer = this.byteStreamControllers.get(streamId);
502
+ if (fileBuffer) {
503
+ fileBuffer.controller.close();
504
+ this.byteStreamControllers.delete(streamId);
505
+ }
506
+ const textBuffer = this.textStreamControllers.get(streamId);
507
+ if (textBuffer) {
508
+ textBuffer.controller.close();
509
+ this.byteStreamControllers.delete(streamId);
510
+ }
511
+ }
356
512
  }
357
513
  class ConnectError extends Error {
358
514
  constructor(message) {
@@ -374,6 +530,7 @@ var RoomEvent = /* @__PURE__ */ ((RoomEvent2) => {
374
530
  RoomEvent2["TrackUnmuted"] = "trackUnmuted";
375
531
  RoomEvent2["ActiveSpeakersChanged"] = "activeSpeakersChanged";
376
532
  RoomEvent2["RoomMetadataChanged"] = "roomMetadataChanged";
533
+ RoomEvent2["RoomSidChanged"] = "roomSidChanged";
377
534
  RoomEvent2["ParticipantMetadataChanged"] = "participantMetadataChanged";
378
535
  RoomEvent2["ParticipantNameChanged"] = "participantNameChanged";
379
536
  RoomEvent2["ParticipantAttributesChanged"] = "participantAttributesChanged";
package/dist/room.cjs.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 type { E2EEOptions } from './e2ee.js';\nimport { E2EEManager, defaultE2EEOptions } from './e2ee.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.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 {\n type ConnectCallback,\n type ConnectResponse,\n type ConnectionQuality,\n type DataPacketKind,\n type DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n type IceServer,\n type RoomInfo,\n} from './proto/room_pb.js';\nimport {\n ConnectRequest,\n ConnectionState,\n ContinualGatheringPolicy,\n IceTransportType,\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';\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 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 | undefined> {\n return this.info?.sid; // TODO update this to handle async room updates once rust protocol has been updated\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 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 private onFfiEvent = (ffiEvent: FfiEvent) => {\n 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 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.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.publicationSid!);\n participant!.trackPublications.delete(ev.value.publicationSid!);\n this.emit(RoomEvent.TrackUnpublished, publication!, participant!);\n } else if (ev.case == 'trackSubscribed') {\n const ownedTrack = ev.value.track;\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ownedTrack!.info!.sid!);\n publication!.subscribed = true;\n if (ownedTrack!.info!.kind == TrackKind.KIND_VIDEO) {\n publication!.track = new RemoteVideoTrack(ownedTrack!);\n } else if (ownedTrack!.info!.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 = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.trackSid!);\n publication!.track = undefined;\n publication!.subscribed = false;\n this.emit(RoomEvent.TrackUnsubscribed, publication!.track!, publication!, participant!);\n } else if (ev.case == 'trackSubscriptionFailed') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n this.emit(\n RoomEvent.TrackSubscriptionFailed,\n ev.value.trackSid!,\n participant!,\n ev.value.error,\n );\n } else if (ev.case == 'trackMuted') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.trackSid!);\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 = this.retrieveParticipantByIdentity(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.trackSid!);\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.retrieveParticipantByIdentity(identity),\n );\n this.emit(\n RoomEvent.ActiveSpeakersChanged,\n activeSpeakers.map((s) => s!),\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 const participant = this.retrieveParticipantByIdentity(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.retrieveParticipantByIdentity(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.retrieveParticipantByIdentity(ev.value.participantIdentity!);\n participant!.info!.attributes = ev.value.attributes.reduce(\n (obj, item) => {\n obj[item.key!] = item.value!;\n return obj;\n },\n {} as Record<string, string>,\n );\n if (Object.keys(ev.value.changedAttributes).length > 0) {\n this.emit(\n RoomEvent.ParticipantAttributesChanged,\n ev.value.changedAttributes.reduce(\n (obj, item) => {\n obj[item.key!] = item.value!;\n return obj;\n },\n {} as Record<string, string>,\n ),\n participant!,\n );\n }\n } else if (ev.case == 'connectionQualityChanged') {\n const participant = this.retrieveParticipantByIdentity(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 }\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\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 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};\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 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":["import_room_pb","FfiRoomOptions","EventEmitter","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 { 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 {\n type ConnectCallback,\n type ConnectResponse,\n type ConnectionQuality,\n type DataPacketKind,\n type DataStream_Chunk,\n type DataStream_Header,\n DataStream_Trailer,\n type DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n type IceServer,\n type RoomInfo,\n} from './proto/room_pb.js';\nimport {\n ConnectRequest,\n ConnectionState,\n ContinualGatheringPolicy,\n IceTransportType,\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 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 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":["import_room_pb","FfiRoomOptions","EventEmitter","RoomEvent"]}
package/dist/room.d.cts CHANGED
@@ -1,13 +1,17 @@
1
1
  import { TypedEventEmitter } from '@livekit/typed-emitter';
2
- import { E2EEOptions, E2EEManager } from './e2ee.cjs';
2
+ import { h as TextStreamHandler, g as ByteStreamHandler } from './types-BWsKf9LP.cjs';
3
+ import { E2EEManager, E2EEOptions } from './e2ee.cjs';
3
4
  import { RemoteParticipant, LocalParticipant, Participant } from './participant.cjs';
4
5
  import { DisconnectReason } from './proto/participant_pb.cjs';
5
- import { IceTransportType, ContinualGatheringPolicy, IceServer, RoomOptions as RoomOptions$1, ConnectionState, ConnectionQuality, DataPacketKind } from './proto/room_pb.cjs';
6
+ import { RoomInfo, ConnectionQuality, DataPacketKind, ConnectionState, IceTransportType, ContinualGatheringPolicy, IceServer, RoomOptions as RoomOptions$1 } from './proto/room_pb.cjs';
6
7
  import { LocalTrack, RemoteTrack } from './track.cjs';
7
8
  import { LocalTrackPublication, RemoteTrackPublication, TrackPublication } from './track_publication.cjs';
8
9
  import { ChatMessage } from './types.cjs';
10
+ import 'node:stream/web';
9
11
  import './proto/e2ee_pb.cjs';
10
12
  import '@bufbuild/protobuf';
13
+ import 'node:fs';
14
+ import './data_streams/stream_writer.cjs';
11
15
  import './napi/native.d.cjs';
12
16
  import './rpc.cjs';
13
17
  import './proto/rpc_pb.cjs';
@@ -39,6 +43,10 @@ declare const Room_base: new () => TypedEventEmitter<RoomCallbacks>;
39
43
  declare class Room extends Room_base {
40
44
  private info?;
41
45
  private ffiHandle?;
46
+ private byteStreamControllers;
47
+ private textStreamControllers;
48
+ private byteStreamHandlers;
49
+ private textStreamHandlers;
42
50
  e2eeManager?: E2EEManager;
43
51
  connectionState: ConnectionState;
44
52
  remoteParticipants: Map<string, RemoteParticipant>;
@@ -47,9 +55,13 @@ declare class Room extends Room_base {
47
55
  get name(): string | undefined;
48
56
  get metadata(): string | undefined;
49
57
  get isConnected(): boolean;
50
- getSid(): Promise<string | undefined>;
58
+ getSid(): Promise<string>;
51
59
  connect(url: string, token: string, opts?: RoomOptions): Promise<void>;
52
60
  disconnect(): Promise<void>;
61
+ registerTextStreamHandler(topic: string, callback: TextStreamHandler): void;
62
+ unregisterTextStreamHandler(topic: string): void;
63
+ registerByteStreamHandler(topic: string, callback: ByteStreamHandler): void;
64
+ unregisterByteStreamHandler(topic: string): void;
53
65
  private onFfiEvent;
54
66
  private retrieveParticipantByIdentity;
55
67
  private requireParticipantByIdentity;
@@ -57,6 +69,9 @@ declare class Room extends Room_base {
57
69
  private requirePublicationOfParticipant;
58
70
  private requirePublicationOfRemoteParticipant;
59
71
  private createRemoteParticipant;
72
+ private handleStreamHeader;
73
+ private handleStreamChunk;
74
+ private handleStreamTrailer;
60
75
  }
61
76
  declare class ConnectError extends Error {
62
77
  constructor(message: string);
@@ -76,6 +91,7 @@ type RoomCallbacks = {
76
91
  trackUnmuted: (publication: TrackPublication, participant: Participant) => void;
77
92
  activeSpeakersChanged: (speakers: Participant[]) => void;
78
93
  roomMetadataChanged: (metadata: string) => void;
94
+ roomInfoUpdated: (info: RoomInfo) => void;
79
95
  participantMetadataChanged: (metadata: string | undefined, participant: Participant) => void;
80
96
  participantNameChanged: (name: string, participant: Participant) => void;
81
97
  participantAttributesChanged: (changedAttributes: Record<string, string>, participant: Participant) => void;
@@ -89,6 +105,7 @@ type RoomCallbacks = {
89
105
  disconnected: (reason: DisconnectReason) => void;
90
106
  reconnecting: () => void;
91
107
  reconnected: () => void;
108
+ roomSidChanged: (sid: string) => void;
92
109
  };
93
110
  declare enum RoomEvent {
94
111
  ParticipantConnected = "participantConnected",
@@ -105,6 +122,7 @@ declare enum RoomEvent {
105
122
  TrackUnmuted = "trackUnmuted",
106
123
  ActiveSpeakersChanged = "activeSpeakersChanged",
107
124
  RoomMetadataChanged = "roomMetadataChanged",
125
+ RoomSidChanged = "roomSidChanged",
108
126
  ParticipantMetadataChanged = "participantMetadataChanged",
109
127
  ParticipantNameChanged = "participantNameChanged",
110
128
  ParticipantAttributesChanged = "participantAttributesChanged",