mediasfu-shared 1.2.1 → 1.2.3

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 (42) hide show
  1. package/CHANGELOG.md +17 -4
  2. package/README.md +145 -131
  3. package/dist/consumers/connectIps.d.ts.map +1 -1
  4. package/dist/consumers/index.cjs +1 -1
  5. package/dist/consumers/index.js +1 -1
  6. package/dist/{getParticipantMedia-DC_Nca8S.cjs → getParticipantMedia-AwwtMCTz.cjs} +4 -4
  7. package/dist/getParticipantMedia-AwwtMCTz.cjs.map +1 -0
  8. package/dist/{getParticipantMedia-Bu_aZlxe.js → getParticipantMedia-CyaOk2oD.js} +4 -4
  9. package/dist/getParticipantMedia-CyaOk2oD.js.map +1 -0
  10. package/dist/index.cjs +36 -7
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +37 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.native.cjs +3 -3
  15. package/dist/index.native.js +3 -3
  16. package/dist/{joinLocalRoom-7ibqv7zZ.js → joinLocalRoom-Bu3gz27d.js} +2 -2
  17. package/dist/{joinLocalRoom-7ibqv7zZ.js.map → joinLocalRoom-Bu3gz27d.js.map} +1 -1
  18. package/dist/{joinLocalRoom-BJBDvTYh.cjs → joinLocalRoom-Cii5D5IG.cjs} +2 -2
  19. package/dist/{joinLocalRoom-BJBDvTYh.cjs.map → joinLocalRoom-Cii5D5IG.cjs.map} +1 -1
  20. package/dist/methods/recording/startRecording.d.ts.map +1 -1
  21. package/dist/methods/utils/headless/virtualBackground.d.ts +13 -1
  22. package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
  23. package/dist/methods/utils/virtualBackgroundCompositor.d.ts +4 -0
  24. package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -1
  25. package/dist/sockets/SocketManager.d.ts +0 -27
  26. package/dist/sockets/SocketManager.d.ts.map +1 -1
  27. package/dist/types/index.cjs +2 -2
  28. package/dist/types/index.js +2 -2
  29. package/dist/{updateParticipantAudioDecibels-C_MygF6q.js → updateParticipantAudioDecibels-CnEXJBmc.js} +85 -13
  30. package/dist/updateParticipantAudioDecibels-CnEXJBmc.js.map +1 -0
  31. package/dist/{updateParticipantAudioDecibels-bZ6R8WHj.cjs → updateParticipantAudioDecibels-QZyahisU.cjs} +85 -13
  32. package/dist/updateParticipantAudioDecibels-QZyahisU.cjs.map +1 -0
  33. package/package.json +1 -1
  34. package/src/consumers/connectIps.ts +46 -7
  35. package/src/methods/recording/startRecording.ts +7 -1
  36. package/src/methods/utils/headless/virtualBackground.ts +34 -2
  37. package/src/methods/utils/virtualBackgroundCompositor.ts +18 -1
  38. package/src/sockets/SocketManager.ts +54 -7
  39. package/dist/getParticipantMedia-Bu_aZlxe.js.map +0 -1
  40. package/dist/getParticipantMedia-DC_Nca8S.cjs.map +0 -1
  41. package/dist/updateParticipantAudioDecibels-C_MygF6q.js.map +0 -1
  42. package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs.map +0 -1
@@ -766,6 +766,7 @@ async function validateApiKeyToken(value) {
766
766
  }
767
767
  return true;
768
768
  }
769
+ const CONNECT_TIMEOUT_MS = 12e3;
769
770
  async function connectSocket({ apiUserName, apiKey, apiToken, link }) {
770
771
  if (!apiUserName) {
771
772
  throw new Error("API username required.");
@@ -809,7 +810,21 @@ async function connectSocket({ apiUserName, apiKey, apiToken, link }) {
809
810
  }
810
811
  });
811
812
  }
812
- socket.on("connection-success", ({ socketId }) => {
813
+ let settled = false;
814
+ let timeoutHandle;
815
+ const cleanupHandshake = () => {
816
+ if (timeoutHandle) clearTimeout(timeoutHandle);
817
+ socket.off("connection-success", handleConnectionSuccess);
818
+ socket.off("connect_error", handleConnectError);
819
+ socket.off("disconnect", handleDisconnectBeforeReady);
820
+ };
821
+ const settle = (action) => {
822
+ if (settled) return;
823
+ settled = true;
824
+ cleanupHandshake();
825
+ action();
826
+ };
827
+ const handleConnectionSuccess = ({ socketId }) => {
813
828
  let conn = "media";
814
829
  try {
815
830
  if (link.includes("mediasfu.com") && (link.match(/c/g)?.length ?? 0) > 1) {
@@ -818,11 +833,35 @@ async function connectSocket({ apiUserName, apiKey, apiToken, link }) {
818
833
  } catch {
819
834
  }
820
835
  console.log(`Connected to ${conn} socket with ID: ${socketId}`);
821
- resolve(socket);
822
- });
823
- socket.on("connect_error", (error) => {
824
- reject(new Error("Error connecting to media socket: " + error.message));
825
- });
836
+ settle(() => resolve(socket));
837
+ };
838
+ const handleConnectError = (error) => {
839
+ settle(() => {
840
+ socket.disconnect();
841
+ reject(new Error("Error connecting to media socket: " + error.message));
842
+ });
843
+ };
844
+ const handleDisconnectBeforeReady = (reason) => {
845
+ settle(
846
+ () => reject(
847
+ new Error(
848
+ "Media socket closed before the room was ready (" + reason + ")."
849
+ )
850
+ )
851
+ );
852
+ };
853
+ socket.on("connection-success", handleConnectionSuccess);
854
+ socket.on("connect_error", handleConnectError);
855
+ socket.on("disconnect", handleDisconnectBeforeReady);
856
+ timeoutHandle = setTimeout(() => {
857
+ settle(() => {
858
+ try {
859
+ socket.disconnect();
860
+ } catch {
861
+ }
862
+ reject(new Error("Timed out connecting to media socket."));
863
+ });
864
+ }, CONNECT_TIMEOUT_MS);
826
865
  });
827
866
  }
828
867
  async function connectLocalSocket({ link }) {
@@ -1194,10 +1233,19 @@ const joinConsumeRoom = async ({
1194
1233
  };
1195
1234
  const pendingConsumeConnections = /* @__PURE__ */ new WeakMap();
1196
1235
  const normalizeConsumeEndpoint = (ip) => ip.trim().toLowerCase().replace(/\.$/, "");
1197
- const hasConsumeEndpoint = (consumeSockets, endpoint) => consumeSockets.some((socketObj) => {
1198
- const ip = Object.keys(socketObj)[0];
1199
- return Boolean(ip) && normalizeConsumeEndpoint(ip) === endpoint;
1200
- });
1236
+ const hasConsumeEndpoint = (consumeSockets, endpoint) => {
1237
+ for (let index = consumeSockets.length - 1; index >= 0; index -= 1) {
1238
+ const socketObj = consumeSockets[index];
1239
+ const ip = Object.keys(socketObj)[0];
1240
+ if (!ip || normalizeConsumeEndpoint(ip) !== endpoint) continue;
1241
+ const socket = socketObj[ip];
1242
+ if (socket?.connected && socket.id) return true;
1243
+ socket?.removeAllListeners?.();
1244
+ socket?.disconnect?.();
1245
+ consumeSockets.splice(index, 1);
1246
+ }
1247
+ return false;
1248
+ };
1201
1249
  async function reserveConsumeEndpoint(consumeSockets, ip, reservationOwner = consumeSockets) {
1202
1250
  const endpoint = normalizeConsumeEndpoint(ip);
1203
1251
  if (!endpoint || endpoint === "none") return null;
@@ -1221,6 +1269,9 @@ async function reserveConsumeEndpoint(consumeSockets, ip, reservationOwner = con
1221
1269
  return (didConnect = false) => {
1222
1270
  if (pendingForSockets?.get(endpoint) === reservation) {
1223
1271
  pendingForSockets.delete(endpoint);
1272
+ if (pendingForSockets.size === 0) {
1273
+ pendingConsumeConnections.delete(reservationOwner);
1274
+ }
1224
1275
  }
1225
1276
  resolvePending(didConnect === true);
1226
1277
  };
@@ -1257,8 +1308,9 @@ const connectIps = async ({
1257
1308
  );
1258
1309
  if (!releaseReservation) continue;
1259
1310
  let connected = false;
1311
+ let remote_sock = null;
1260
1312
  try {
1261
- const remote_sock = await connectSocket({ apiUserName, apiKey, apiToken, link: `https://${ip}.mediasfu.com` });
1313
+ remote_sock = await connectSocket({ apiUserName, apiKey, apiToken, link: `https://${ip}.mediasfu.com` });
1262
1314
  if (remote_sock.id) {
1263
1315
  if (!roomRecvIPs.includes(ip)) {
1264
1316
  roomRecvIPs.push(ip);
@@ -1289,16 +1341,36 @@ const connectIps = async ({
1289
1341
  parameters
1290
1342
  });
1291
1343
  if (!data.rtpCapabilities) {
1292
- return [consume_sockets, roomRecvIPs];
1344
+ throw new Error(`Consume room ${ip} did not return RTP capabilities.`);
1293
1345
  }
1294
1346
  }
1295
1347
  consume_sockets.push({ [ip]: remote_sock });
1296
1348
  updateConsume_sockets(consume_sockets);
1297
1349
  connected = true;
1350
+ remote_sock.on("disconnect", () => {
1351
+ const socketIndex = consume_sockets.findIndex(
1352
+ (socketObj) => socketObj[ip] === remote_sock
1353
+ );
1354
+ if (socketIndex >= 0) {
1355
+ consume_sockets.splice(socketIndex, 1);
1356
+ updateConsume_sockets(consume_sockets);
1357
+ }
1358
+ const recvIndex = roomRecvIPs.indexOf(ip);
1359
+ if (recvIndex >= 0) {
1360
+ roomRecvIPs.splice(recvIndex, 1);
1361
+ updateRoomRecvIPs(roomRecvIPs);
1362
+ }
1363
+ remote_sock?.removeAllListeners?.();
1364
+ remote_sock?.disconnect();
1365
+ });
1298
1366
  }
1299
1367
  } catch (error) {
1300
1368
  console.log("connectIps error", error);
1301
1369
  } finally {
1370
+ if (!connected && remote_sock) {
1371
+ remote_sock.removeAllListeners?.();
1372
+ remote_sock.disconnect();
1373
+ }
1302
1374
  releaseReservation(connected);
1303
1375
  }
1304
1376
  }
@@ -5428,4 +5500,4 @@ exports.trigger = trigger;
5428
5500
  exports.updateMicLevel = updateMicLevel;
5429
5501
  exports.updateMiniCardsGrid = updateMiniCardsGrid;
5430
5502
  exports.updateParticipantAudioDecibels = updateParticipantAudioDecibels;
5431
- //# sourceMappingURL=updateParticipantAudioDecibels-bZ6R8WHj.cjs.map
5503
+ //# sourceMappingURL=updateParticipantAudioDecibels-QZyahisU.cjs.map