mediasfu-shared 1.2.2 → 1.2.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 (94) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/audioProcessing-0z5KlcmO.js +35 -0
  3. package/dist/audioProcessing-0z5KlcmO.js.map +1 -0
  4. package/dist/audioProcessing-BpbrdCk-.cjs +34 -0
  5. package/dist/audioProcessing-BpbrdCk-.cjs.map +1 -0
  6. package/dist/consumers/audioProcessing.d.ts +8 -0
  7. package/dist/consumers/audioProcessing.d.ts.map +1 -0
  8. package/dist/consumers/connectIps.d.ts.map +1 -1
  9. package/dist/consumers/createSendTransport.d.ts.map +1 -1
  10. package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts +6 -0
  11. package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts.map +1 -1
  12. package/dist/consumers/index.cjs +3 -2
  13. package/dist/consumers/index.cjs.map +1 -1
  14. package/dist/consumers/index.js +14 -13
  15. package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -1
  16. package/dist/consumers/switchUserAudio.d.ts +3 -1
  17. package/dist/consumers/switchUserAudio.d.ts.map +1 -1
  18. package/dist/consumers/transportRecovery.d.ts +8 -0
  19. package/dist/consumers/transportRecovery.d.ts.map +1 -0
  20. package/dist/{getParticipantMedia-BH3d_-Q1.cjs → getParticipantMedia-CP4hE5Rg.cjs} +9 -4
  21. package/dist/getParticipantMedia-CP4hE5Rg.cjs.map +1 -0
  22. package/dist/{getParticipantMedia-CGqnSb93.js → getParticipantMedia-CvXdDj03.js} +9 -4
  23. package/dist/getParticipantMedia-CvXdDj03.js.map +1 -0
  24. package/dist/index.cjs +138 -25
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +205 -92
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.native.cjs +8 -7
  31. package/dist/index.native.cjs.map +1 -1
  32. package/dist/index.native.js +19 -18
  33. package/dist/{joinLocalRoom-7ibqv7zZ.js → joinLocalRoom-Cx1y3Ojj.js} +4 -4
  34. package/dist/{joinLocalRoom-7ibqv7zZ.js.map → joinLocalRoom-Cx1y3Ojj.js.map} +1 -1
  35. package/dist/{joinLocalRoom-BJBDvTYh.cjs → joinLocalRoom-DNJ2zb8W.cjs} +10 -10
  36. package/dist/{joinLocalRoom-BJBDvTYh.cjs.map → joinLocalRoom-DNJ2zb8W.cjs.map} +1 -1
  37. package/dist/{joinRoomOnMediaSFU-y6vJ1OBo.js → joinRoomOnMediaSFU-BnAWLciF.js} +9 -3
  38. package/dist/joinRoomOnMediaSFU-BnAWLciF.js.map +1 -0
  39. package/dist/{joinRoomOnMediaSFU-CC8RVJgr.cjs → joinRoomOnMediaSFU-D2C7q1GK.cjs} +9 -3
  40. package/dist/joinRoomOnMediaSFU-D2C7q1GK.cjs.map +1 -0
  41. package/dist/methods/index.cjs +3 -3
  42. package/dist/methods/index.js +3 -3
  43. package/dist/methods/stream/clickAudio.d.ts +3 -1
  44. package/dist/methods/stream/clickAudio.d.ts.map +1 -1
  45. package/dist/methods/stream/switchAudio.d.ts +3 -1
  46. package/dist/methods/stream/switchAudio.d.ts.map +1 -1
  47. package/dist/methods/utils/headless/virtualBackground.d.ts +15 -1
  48. package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
  49. package/dist/methods/utils/virtualBackgroundCompositor.d.ts +4 -0
  50. package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -1
  51. package/dist/methods/utils/virtualBackgroundFrameLoop.d.ts +10 -0
  52. package/dist/methods/utils/virtualBackgroundFrameLoop.d.ts.map +1 -0
  53. package/dist/sockets/SocketManager.d.ts +0 -27
  54. package/dist/sockets/SocketManager.d.ts.map +1 -1
  55. package/dist/{translationConsumerSwitch-C20MfNNq.cjs → translationConsumerSwitch-BAsQUpH6.cjs} +9 -1
  56. package/dist/translationConsumerSwitch-BAsQUpH6.cjs.map +1 -0
  57. package/dist/{translationConsumerSwitch-zKuS5wgH.js → translationConsumerSwitch-BUODiT6o.js} +20 -12
  58. package/dist/translationConsumerSwitch-BUODiT6o.js.map +1 -0
  59. package/dist/types/index.cjs +3 -3
  60. package/dist/types/index.js +3 -3
  61. package/dist/types/shared-base-types.d.ts +12 -0
  62. package/dist/types/shared-base-types.d.ts.map +1 -1
  63. package/dist/{updateParticipantAudioDecibels-bZ6R8WHj.cjs → updateParticipantAudioDecibels-BJ2PxJJD.cjs} +287 -58
  64. package/dist/updateParticipantAudioDecibels-BJ2PxJJD.cjs.map +1 -0
  65. package/dist/{updateParticipantAudioDecibels-C_MygF6q.js → updateParticipantAudioDecibels-DiJ_LFfH.js} +284 -55
  66. package/dist/updateParticipantAudioDecibels-DiJ_LFfH.js.map +1 -0
  67. package/package.json +1 -1
  68. package/src/consumers/audioProcessing.ts +26 -0
  69. package/src/consumers/connectIps.ts +46 -7
  70. package/src/consumers/createSendTransport.ts +5 -20
  71. package/src/consumers/gridLayout/addVideosGrid.engine.ts +13 -0
  72. package/src/consumers/signalNewConsumerTransport.ts +7 -25
  73. package/src/consumers/switchUserAudio.ts +18 -5
  74. package/src/consumers/transportRecovery.ts +170 -0
  75. package/src/index.ts +2 -0
  76. package/src/methods/stream/clickAudio.ts +13 -5
  77. package/src/methods/stream/switchAudio.ts +10 -1
  78. package/src/methods/utils/headless/virtualBackground.ts +55 -15
  79. package/src/methods/utils/virtualBackgroundCompositor.ts +18 -1
  80. package/src/methods/utils/virtualBackgroundFrameLoop.ts +69 -0
  81. package/src/sockets/SocketManager.ts +54 -7
  82. package/src/types/shared-base-types.ts +3 -0
  83. package/dist/getParticipantMedia-BH3d_-Q1.cjs.map +0 -1
  84. package/dist/getParticipantMedia-CGqnSb93.js.map +0 -1
  85. package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +0 -1
  86. package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +0 -1
  87. package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +0 -1
  88. package/dist/translationConsumerSwitch-zKuS5wgH.js.map +0 -1
  89. package/dist/updateParticipantAudioDecibels-C_MygF6q.js.map +0 -1
  90. package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs.map +0 -1
  91. package/dist/validateAlphanumeric-DKn5BsUP.cjs +0 -15
  92. package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +0 -1
  93. package/dist/validateAlphanumeric-Dk1JB80W.js +0 -16
  94. package/dist/validateAlphanumeric-Dk1JB80W.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const io = require("socket.io-client");
3
- const validateAlphanumeric = require("./validateAlphanumeric-DKn5BsUP.cjs");
3
+ const audioProcessing = require("./audioProcessing-BpbrdCk-.cjs");
4
4
  const createFrameworkConsumerContractError = (consumerName) => {
5
5
  return new Error(
6
6
  `${consumerName} is a render-coupled consumer helper and has no shared runtime implementation. Inject the framework-specific ${consumerName} implementation instead of calling the shared fallback export.`
@@ -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 }) {
@@ -848,6 +887,184 @@ async function disconnectSocket({ socket }) {
848
887
  }
849
888
  return true;
850
889
  }
890
+ function attachTransportRecovery(transport, socket, onFailure) {
891
+ let timer;
892
+ let disposed = false;
893
+ let recovering = false;
894
+ let attempts = 0;
895
+ const socketId = socket.id;
896
+ const listeners = [];
897
+ const report = (state) => {
898
+ transport.appData = { ...transport.appData, recoveryState: state };
899
+ transport.observer?.emit("recoverychange", state);
900
+ };
901
+ const clearTimer = () => {
902
+ if (timer) clearTimeout(timer);
903
+ timer = void 0;
904
+ };
905
+ const current = () => !disposed && !transport.closed && socket.connected !== false && socket.id === socketId;
906
+ const dispose = () => {
907
+ disposed = true;
908
+ clearTimer();
909
+ listeners.splice(0).forEach((cancel) => cancel());
910
+ socket.off?.("disconnect", dispose);
911
+ transport.off?.("connectionstatechange", changed);
912
+ transport.observer?.off?.("close", dispose);
913
+ };
914
+ const failed = () => {
915
+ if (disposed) return;
916
+ report("failed");
917
+ try {
918
+ onFailure();
919
+ } catch (_) {
920
+ }
921
+ try {
922
+ transport.close();
923
+ } finally {
924
+ dispose();
925
+ }
926
+ };
927
+ const waitConnected = () => new Promise((resolve, reject) => {
928
+ let settled = false;
929
+ const finish = (error) => {
930
+ if (settled) return;
931
+ settled = true;
932
+ clearTimeout(deadline);
933
+ transport.off?.("connectionstatechange", connected);
934
+ const i = listeners.indexOf(cancel);
935
+ if (i >= 0) listeners.splice(i, 1);
936
+ error ? reject(error) : resolve();
937
+ };
938
+ const connected = (state) => {
939
+ if (state === "connected") finish();
940
+ };
941
+ const cancel = () => finish(new Error("Recovery cancelled"));
942
+ const deadline = setTimeout(() => finish(new Error("ICE recovery timed out")), 1e4);
943
+ listeners.push(cancel);
944
+ transport.on("connectionstatechange", connected);
945
+ if (transport.connectionState === "connected") finish();
946
+ });
947
+ const restart = async () => {
948
+ if (!current() || recovering) return;
949
+ recovering = true;
950
+ report("recovering");
951
+ try {
952
+ while (current() && attempts < 2) {
953
+ attempts++;
954
+ try {
955
+ const iceParameters = await new Promise((resolve, reject) => {
956
+ let settled = false;
957
+ const finish = (error, value) => {
958
+ if (settled) return;
959
+ settled = true;
960
+ clearTimeout(deadline);
961
+ const i = listeners.indexOf(cancel);
962
+ if (i >= 0) listeners.splice(i, 1);
963
+ error ? reject(error) : resolve(value);
964
+ };
965
+ const cancel = () => finish(new Error("Recovery cancelled"));
966
+ const deadline = setTimeout(() => finish(new Error("ICE restart acknowledgement timed out")), 8e3);
967
+ listeners.push(cancel);
968
+ socket.emit("transport-restart-ice", { transportId: transport.id }, (response) => {
969
+ if (!response?.iceParameters || response.error) finish(new Error(response?.error || "Invalid ICE response"));
970
+ else finish(void 0, response.iceParameters);
971
+ });
972
+ });
973
+ if (!current()) return;
974
+ await new Promise((resolve, reject) => {
975
+ let settled = false;
976
+ const finish = (error) => {
977
+ if (settled) return;
978
+ settled = true;
979
+ clearTimeout(deadline);
980
+ const i = listeners.indexOf(cancel);
981
+ if (i >= 0) listeners.splice(i, 1);
982
+ error ? reject(error) : resolve();
983
+ };
984
+ const cancel = () => finish(new Error("Recovery cancelled"));
985
+ const deadline = setTimeout(() => finish(new Error("Local ICE restart timed out")), 8e3);
986
+ listeners.push(cancel);
987
+ Promise.resolve().then(() => {
988
+ if (!current()) throw new Error("Recovery cancelled");
989
+ return transport.restartIce({ iceParameters });
990
+ }).then(() => finish(), (error) => finish(error));
991
+ });
992
+ if (!current()) return;
993
+ await waitConnected();
994
+ if (!current()) return;
995
+ attempts = 0;
996
+ report("connected");
997
+ return;
998
+ } catch (_) {
999
+ if (!current()) return;
1000
+ if (transport.connectionState === "connected") {
1001
+ attempts = 0;
1002
+ report("connected");
1003
+ return;
1004
+ }
1005
+ if (attempts < 2) {
1006
+ await new Promise((resolve) => {
1007
+ const cancel = () => {
1008
+ clearTimeout(delay);
1009
+ const i = listeners.indexOf(cancel);
1010
+ if (i >= 0) listeners.splice(i, 1);
1011
+ resolve();
1012
+ };
1013
+ const delay = setTimeout(cancel, 2100);
1014
+ listeners.push(cancel);
1015
+ });
1016
+ }
1017
+ }
1018
+ }
1019
+ if (current()) failed();
1020
+ } finally {
1021
+ recovering = false;
1022
+ }
1023
+ };
1024
+ const changed = (state) => {
1025
+ if (disposed) return;
1026
+ if (state === "connected") {
1027
+ clearTimer();
1028
+ if (!recovering) {
1029
+ attempts = 0;
1030
+ report("connected");
1031
+ }
1032
+ } else if (state === "disconnected") {
1033
+ if (recovering || timer) return;
1034
+ report("waiting");
1035
+ timer = setTimeout(() => {
1036
+ timer = void 0;
1037
+ void restart();
1038
+ }, 3e3);
1039
+ } else if (state === "failed") {
1040
+ clearTimer();
1041
+ void restart();
1042
+ } else if (state === "closed") dispose();
1043
+ };
1044
+ socket.on?.("disconnect", dispose);
1045
+ transport.on("connectionstatechange", changed);
1046
+ transport.observer?.once("close", dispose);
1047
+ return dispose;
1048
+ }
1049
+ function clearFailedSendState(parameters, transport, local = false) {
1050
+ const live = parameters.getCurrentParams?.() ?? parameters.getUpdatedAllParams?.() ?? parameters;
1051
+ if ((local ? live.localProducerTransport : live.producerTransport) !== transport) return;
1052
+ if (local) {
1053
+ live.updateLocalProducerTransport?.(null);
1054
+ live.updateLocalTransportCreated?.(false);
1055
+ return;
1056
+ }
1057
+ for (const kind of ["Audio", "Video", "Screen"]) {
1058
+ const key = kind.toLowerCase();
1059
+ live["update" + kind + "Producer"]?.(null);
1060
+ live["updateTransportCreated" + kind]?.(false);
1061
+ live["update" + kind + "AlreadyOn"]?.(false);
1062
+ live.socket?.emit("pauseProducerMedia", { mediaTag: key, roomName: live.roomName });
1063
+ }
1064
+ live.updateProducerTransport?.(null);
1065
+ live.updateTransportCreated?.(false);
1066
+ live.showAlert?.({ message: "Media connection could not recover. Rejoin the room to restore audio and video.", type: "danger", duration: 1e4 });
1067
+ }
851
1068
  const signalNewConsumerTransport = async ({
852
1069
  remoteProducerId,
853
1070
  islevel,
@@ -894,23 +1111,13 @@ const signalNewConsumerTransport = async ({
894
1111
  }
895
1112
  }
896
1113
  );
897
- consumerTransport.on("connectionstatechange", async (state) => {
898
- switch (state) {
899
- case "connecting":
900
- break;
901
- case "connected":
902
- break;
903
- case "failed":
904
- consumerTransport.close();
905
- if (lock_screen) {
906
- await reorderStreams2({ add: true, parameters });
907
- } else {
908
- await reorderStreams2({ add: false, parameters });
909
- }
910
- break;
911
- default:
912
- break;
913
- }
1114
+ attachTransportRecovery(consumerTransport, nsock, () => {
1115
+ const live = parameters.getCurrentParams?.() ?? parameters.getUpdatedAllParams?.() ?? parameters;
1116
+ live.updateConsumingTransports?.((live.consumingTransports || []).filter((id) => id !== remoteProducerId));
1117
+ live.updateConsumerTransports?.((live.consumerTransports || []).filter((entry) => entry.consumerTransport !== consumerTransport));
1118
+ live.showAlert?.({ message: "A remote media connection could not recover. Rejoin to restore it.", type: "danger", duration: 1e4 });
1119
+ void Promise.resolve(reorderStreams2({ add: Boolean(lock_screen), parameters })).catch(() => {
1120
+ });
914
1121
  });
915
1122
  await connectRecvTransport2({
916
1123
  consumerTransport,
@@ -1091,9 +1298,9 @@ async function joinConRoom({ socket, roomName, islevel, member, sec, apiUserName
1091
1298
  return;
1092
1299
  }
1093
1300
  try {
1094
- validateAlphanumeric.validateAlphanumeric({ str: roomName });
1095
- validateAlphanumeric.validateAlphanumeric({ str: apiUserName });
1096
- validateAlphanumeric.validateAlphanumeric({ str: member });
1301
+ audioProcessing.validateAlphanumeric({ str: roomName });
1302
+ audioProcessing.validateAlphanumeric({ str: apiUserName });
1303
+ audioProcessing.validateAlphanumeric({ str: member });
1097
1304
  } catch {
1098
1305
  const validationError = {
1099
1306
  success: false,
@@ -1194,10 +1401,19 @@ const joinConsumeRoom = async ({
1194
1401
  };
1195
1402
  const pendingConsumeConnections = /* @__PURE__ */ new WeakMap();
1196
1403
  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
- });
1404
+ const hasConsumeEndpoint = (consumeSockets, endpoint) => {
1405
+ for (let index = consumeSockets.length - 1; index >= 0; index -= 1) {
1406
+ const socketObj = consumeSockets[index];
1407
+ const ip = Object.keys(socketObj)[0];
1408
+ if (!ip || normalizeConsumeEndpoint(ip) !== endpoint) continue;
1409
+ const socket = socketObj[ip];
1410
+ if (socket?.connected && socket.id) return true;
1411
+ socket?.removeAllListeners?.();
1412
+ socket?.disconnect?.();
1413
+ consumeSockets.splice(index, 1);
1414
+ }
1415
+ return false;
1416
+ };
1201
1417
  async function reserveConsumeEndpoint(consumeSockets, ip, reservationOwner = consumeSockets) {
1202
1418
  const endpoint = normalizeConsumeEndpoint(ip);
1203
1419
  if (!endpoint || endpoint === "none") return null;
@@ -1221,6 +1437,9 @@ async function reserveConsumeEndpoint(consumeSockets, ip, reservationOwner = con
1221
1437
  return (didConnect = false) => {
1222
1438
  if (pendingForSockets?.get(endpoint) === reservation) {
1223
1439
  pendingForSockets.delete(endpoint);
1440
+ if (pendingForSockets.size === 0) {
1441
+ pendingConsumeConnections.delete(reservationOwner);
1442
+ }
1224
1443
  }
1225
1444
  resolvePending(didConnect === true);
1226
1445
  };
@@ -1257,8 +1476,9 @@ const connectIps = async ({
1257
1476
  );
1258
1477
  if (!releaseReservation) continue;
1259
1478
  let connected = false;
1479
+ let remote_sock = null;
1260
1480
  try {
1261
- const remote_sock = await connectSocket({ apiUserName, apiKey, apiToken, link: `https://${ip}.mediasfu.com` });
1481
+ remote_sock = await connectSocket({ apiUserName, apiKey, apiToken, link: `https://${ip}.mediasfu.com` });
1262
1482
  if (remote_sock.id) {
1263
1483
  if (!roomRecvIPs.includes(ip)) {
1264
1484
  roomRecvIPs.push(ip);
@@ -1289,16 +1509,36 @@ const connectIps = async ({
1289
1509
  parameters
1290
1510
  });
1291
1511
  if (!data.rtpCapabilities) {
1292
- return [consume_sockets, roomRecvIPs];
1512
+ throw new Error(`Consume room ${ip} did not return RTP capabilities.`);
1293
1513
  }
1294
1514
  }
1295
1515
  consume_sockets.push({ [ip]: remote_sock });
1296
1516
  updateConsume_sockets(consume_sockets);
1297
1517
  connected = true;
1518
+ remote_sock.on("disconnect", () => {
1519
+ const socketIndex = consume_sockets.findIndex(
1520
+ (socketObj) => socketObj[ip] === remote_sock
1521
+ );
1522
+ if (socketIndex >= 0) {
1523
+ consume_sockets.splice(socketIndex, 1);
1524
+ updateConsume_sockets(consume_sockets);
1525
+ }
1526
+ const recvIndex = roomRecvIPs.indexOf(ip);
1527
+ if (recvIndex >= 0) {
1528
+ roomRecvIPs.splice(recvIndex, 1);
1529
+ updateRoomRecvIPs(roomRecvIPs);
1530
+ }
1531
+ remote_sock?.removeAllListeners?.();
1532
+ remote_sock?.disconnect();
1533
+ });
1298
1534
  }
1299
1535
  } catch (error) {
1300
1536
  console.log("connectIps error", error);
1301
1537
  } finally {
1538
+ if (!connected && remote_sock) {
1539
+ remote_sock.removeAllListeners?.();
1540
+ remote_sock.disconnect();
1541
+ }
1302
1542
  releaseReservation(connected);
1303
1543
  }
1304
1544
  }
@@ -1814,12 +2054,7 @@ const createLocalSendTransport = async ({
1814
2054
  }
1815
2055
  }
1816
2056
  );
1817
- createdLocalTransport.on("connectionstatechange", (state) => {
1818
- if (state === "failed") {
1819
- console.error("Local transport connection failed.");
1820
- createdLocalTransport.close();
1821
- }
1822
- });
2057
+ attachTransportRecovery(createdLocalTransport, localSocket, () => clearFailedSendState(parameters, createdLocalTransport, true));
1823
2058
  localTransportCreated = true;
1824
2059
  updateLocalTransportCreated?.(localTransportCreated);
1825
2060
  await connectSendTransport2({
@@ -1910,20 +2145,7 @@ const createSendTransport = async ({
1910
2145
  }
1911
2146
  }
1912
2147
  );
1913
- createdProducerTransport.on("connectionstatechange", async (state) => {
1914
- switch (state) {
1915
- case "connecting":
1916
- break;
1917
- case "connected":
1918
- break;
1919
- case "failed":
1920
- console.log("Transport connection failed.");
1921
- createdProducerTransport.close();
1922
- break;
1923
- default:
1924
- break;
1925
- }
1926
- });
2148
+ attachTransportRecovery(createdProducerTransport, socket, () => clearFailedSendState(parameters, createdProducerTransport));
1927
2149
  transportCreated = true;
1928
2150
  parameters = parameters.getCurrentParams?.() ?? parameters;
1929
2151
  await connectSendTransport2({
@@ -4139,7 +4361,7 @@ const streamSuccessVideo = async ({
4139
4361
  }
4140
4362
  }
4141
4363
  };
4142
- async function switchUserAudio({ audioPreference, parameters }) {
4364
+ async function switchUserAudio({ audioPreference, parameters, audioProcessing: audioProcessing$1 }) {
4143
4365
  const {
4144
4366
  mediaDevices,
4145
4367
  prevAudioInputDevice,
@@ -4165,12 +4387,19 @@ async function switchUserAudio({ audioPreference, parameters }) {
4165
4387
  }
4166
4388
  }
4167
4389
  }
4390
+ const track = parameters.localStreamAudio?.getAudioTracks?.()[0] ?? parameters.localStream?.getAudioTracks?.()[0] ?? parameters.audioProducer?.track;
4391
+ const previousConstraints = track?.getConstraints?.() ?? {};
4392
+ const previousSettings = track?.getSettings?.() ?? {};
4393
+ const processing = {};
4394
+ for (const key of ["echoCancellation", "noiseSuppression", "autoGainControl"]) {
4395
+ const value = previousConstraints[key] ?? previousSettings[key];
4396
+ if (value !== void 0) processing[key] = value;
4397
+ }
4168
4398
  const mediaConstraints = {
4169
4399
  audio: {
4170
4400
  deviceId: { exact: audioPreference },
4171
- echoCancellation: false,
4172
- noiseSuppression: false,
4173
- autoGainControl: false
4401
+ ...processing,
4402
+ ...audioProcessing.audioProcessingConstraints(audioProcessing$1)
4174
4403
  },
4175
4404
  video: false
4176
4405
  };
@@ -5428,4 +5657,4 @@ exports.trigger = trigger;
5428
5657
  exports.updateMicLevel = updateMicLevel;
5429
5658
  exports.updateMiniCardsGrid = updateMiniCardsGrid;
5430
5659
  exports.updateParticipantAudioDecibels = updateParticipantAudioDecibels;
5431
- //# sourceMappingURL=updateParticipantAudioDecibels-bZ6R8WHj.cjs.map
5660
+ //# sourceMappingURL=updateParticipantAudioDecibels-BJ2PxJJD.cjs.map