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.
- package/CHANGELOG.md +5 -0
- package/dist/audioProcessing-0z5KlcmO.js +35 -0
- package/dist/audioProcessing-0z5KlcmO.js.map +1 -0
- package/dist/audioProcessing-BpbrdCk-.cjs +34 -0
- package/dist/audioProcessing-BpbrdCk-.cjs.map +1 -0
- package/dist/consumers/audioProcessing.d.ts +8 -0
- package/dist/consumers/audioProcessing.d.ts.map +1 -0
- package/dist/consumers/connectIps.d.ts.map +1 -1
- package/dist/consumers/createSendTransport.d.ts.map +1 -1
- package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts +6 -0
- package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts.map +1 -1
- package/dist/consumers/index.cjs +3 -2
- package/dist/consumers/index.cjs.map +1 -1
- package/dist/consumers/index.js +14 -13
- package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -1
- package/dist/consumers/switchUserAudio.d.ts +3 -1
- package/dist/consumers/switchUserAudio.d.ts.map +1 -1
- package/dist/consumers/transportRecovery.d.ts +8 -0
- package/dist/consumers/transportRecovery.d.ts.map +1 -0
- package/dist/{getParticipantMedia-BH3d_-Q1.cjs → getParticipantMedia-CP4hE5Rg.cjs} +9 -4
- package/dist/getParticipantMedia-CP4hE5Rg.cjs.map +1 -0
- package/dist/{getParticipantMedia-CGqnSb93.js → getParticipantMedia-CvXdDj03.js} +9 -4
- package/dist/getParticipantMedia-CvXdDj03.js.map +1 -0
- package/dist/index.cjs +138 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +205 -92
- package/dist/index.js.map +1 -1
- package/dist/index.native.cjs +8 -7
- package/dist/index.native.cjs.map +1 -1
- package/dist/index.native.js +19 -18
- package/dist/{joinLocalRoom-7ibqv7zZ.js → joinLocalRoom-Cx1y3Ojj.js} +4 -4
- package/dist/{joinLocalRoom-7ibqv7zZ.js.map → joinLocalRoom-Cx1y3Ojj.js.map} +1 -1
- package/dist/{joinLocalRoom-BJBDvTYh.cjs → joinLocalRoom-DNJ2zb8W.cjs} +10 -10
- package/dist/{joinLocalRoom-BJBDvTYh.cjs.map → joinLocalRoom-DNJ2zb8W.cjs.map} +1 -1
- package/dist/{joinRoomOnMediaSFU-y6vJ1OBo.js → joinRoomOnMediaSFU-BnAWLciF.js} +9 -3
- package/dist/joinRoomOnMediaSFU-BnAWLciF.js.map +1 -0
- package/dist/{joinRoomOnMediaSFU-CC8RVJgr.cjs → joinRoomOnMediaSFU-D2C7q1GK.cjs} +9 -3
- package/dist/joinRoomOnMediaSFU-D2C7q1GK.cjs.map +1 -0
- package/dist/methods/index.cjs +3 -3
- package/dist/methods/index.js +3 -3
- package/dist/methods/stream/clickAudio.d.ts +3 -1
- package/dist/methods/stream/clickAudio.d.ts.map +1 -1
- package/dist/methods/stream/switchAudio.d.ts +3 -1
- package/dist/methods/stream/switchAudio.d.ts.map +1 -1
- package/dist/methods/utils/headless/virtualBackground.d.ts +15 -1
- package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts +4 -0
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -1
- package/dist/methods/utils/virtualBackgroundFrameLoop.d.ts +10 -0
- package/dist/methods/utils/virtualBackgroundFrameLoop.d.ts.map +1 -0
- package/dist/sockets/SocketManager.d.ts +0 -27
- package/dist/sockets/SocketManager.d.ts.map +1 -1
- package/dist/{translationConsumerSwitch-C20MfNNq.cjs → translationConsumerSwitch-BAsQUpH6.cjs} +9 -1
- package/dist/translationConsumerSwitch-BAsQUpH6.cjs.map +1 -0
- package/dist/{translationConsumerSwitch-zKuS5wgH.js → translationConsumerSwitch-BUODiT6o.js} +20 -12
- package/dist/translationConsumerSwitch-BUODiT6o.js.map +1 -0
- package/dist/types/index.cjs +3 -3
- package/dist/types/index.js +3 -3
- package/dist/types/shared-base-types.d.ts +12 -0
- package/dist/types/shared-base-types.d.ts.map +1 -1
- package/dist/{updateParticipantAudioDecibels-bZ6R8WHj.cjs → updateParticipantAudioDecibels-BJ2PxJJD.cjs} +287 -58
- package/dist/updateParticipantAudioDecibels-BJ2PxJJD.cjs.map +1 -0
- package/dist/{updateParticipantAudioDecibels-C_MygF6q.js → updateParticipantAudioDecibels-DiJ_LFfH.js} +284 -55
- package/dist/updateParticipantAudioDecibels-DiJ_LFfH.js.map +1 -0
- package/package.json +1 -1
- package/src/consumers/audioProcessing.ts +26 -0
- package/src/consumers/connectIps.ts +46 -7
- package/src/consumers/createSendTransport.ts +5 -20
- package/src/consumers/gridLayout/addVideosGrid.engine.ts +13 -0
- package/src/consumers/signalNewConsumerTransport.ts +7 -25
- package/src/consumers/switchUserAudio.ts +18 -5
- package/src/consumers/transportRecovery.ts +170 -0
- package/src/index.ts +2 -0
- package/src/methods/stream/clickAudio.ts +13 -5
- package/src/methods/stream/switchAudio.ts +10 -1
- package/src/methods/utils/headless/virtualBackground.ts +55 -15
- package/src/methods/utils/virtualBackgroundCompositor.ts +18 -1
- package/src/methods/utils/virtualBackgroundFrameLoop.ts +69 -0
- package/src/sockets/SocketManager.ts +54 -7
- package/src/types/shared-base-types.ts +3 -0
- package/dist/getParticipantMedia-BH3d_-Q1.cjs.map +0 -1
- package/dist/getParticipantMedia-CGqnSb93.js.map +0 -1
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +0 -1
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +0 -1
- package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +0 -1
- package/dist/translationConsumerSwitch-zKuS5wgH.js.map +0 -1
- package/dist/updateParticipantAudioDecibels-C_MygF6q.js.map +0 -1
- package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs.map +0 -1
- package/dist/validateAlphanumeric-DKn5BsUP.cjs +0 -15
- package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +0 -1
- package/dist/validateAlphanumeric-Dk1JB80W.js +0 -16
- 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
|
|
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
|
-
|
|
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
|
-
|
|
824
|
-
|
|
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
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
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
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
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) =>
|
|
1198
|
-
|
|
1199
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
4172
|
-
|
|
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-
|
|
5660
|
+
//# sourceMappingURL=updateParticipantAudioDecibels-BJ2PxJJD.cjs.map
|