mediasfu-shared 1.3.0 → 1.3.1
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 +7 -0
- package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -1
- package/dist/consumers/createSendTransport.d.ts +4 -48
- package/dist/consumers/createSendTransport.d.ts.map +1 -1
- package/dist/consumers/index.cjs +1 -1
- package/dist/consumers/index.js +1 -1
- package/dist/consumers/sendTransportGuard.d.ts +30 -0
- package/dist/consumers/sendTransportGuard.d.ts.map +1 -0
- package/dist/{getParticipantMedia-DEJwXXhU.js → getParticipantMedia-CZbsFBth.js} +3 -3
- package/dist/{getParticipantMedia-DEJwXXhU.js.map → getParticipantMedia-CZbsFBth.js.map} +1 -1
- package/dist/{getParticipantMedia-1okyF4H7.cjs → getParticipantMedia-Dli4dOLp.cjs} +3 -3
- package/dist/{getParticipantMedia-1okyF4H7.cjs.map → getParticipantMedia-Dli4dOLp.cjs.map} +1 -1
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -8
- package/dist/index.native.cjs +4 -3
- package/dist/index.native.cjs.map +1 -1
- package/dist/index.native.js +8 -7
- package/dist/{joinLocalRoom-DS6_6lJL.js → joinLocalRoom-BWoS-8wt.js} +2 -2
- package/dist/{joinLocalRoom-DS6_6lJL.js.map → joinLocalRoom-BWoS-8wt.js.map} +1 -1
- package/dist/{joinLocalRoom-Dsn39SwS.cjs → joinLocalRoom-DQvud99t.cjs} +2 -2
- package/dist/{joinLocalRoom-Dsn39SwS.cjs.map → joinLocalRoom-DQvud99t.cjs.map} +1 -1
- package/dist/sockets/SocketManager.d.ts +7 -0
- package/dist/sockets/SocketManager.d.ts.map +1 -1
- package/dist/types/index.cjs +2 -2
- package/dist/types/index.js +2 -2
- package/dist/{updateParticipantAudioDecibels-Dni8i6AY.cjs → updateParticipantAudioDecibels-CbCP1PDs.cjs} +162 -67
- package/dist/updateParticipantAudioDecibels-CbCP1PDs.cjs.map +1 -0
- package/dist/{updateParticipantAudioDecibels-BBfdHWQ0.js → updateParticipantAudioDecibels-xKKq7Zp5.js} +166 -71
- package/dist/updateParticipantAudioDecibels-xKKq7Zp5.js.map +1 -0
- package/package.json +1 -1
- package/src/consumers/connectSendTransportAudio.ts +7 -4
- package/src/consumers/connectSendTransportScreen.ts +6 -4
- package/src/consumers/connectSendTransportVideo.ts +4 -2
- package/src/consumers/createSendTransport.ts +62 -4
- package/src/consumers/sendTransportGuard.ts +65 -0
- package/src/sockets/SocketManager.ts +31 -1
- package/dist/updateParticipantAudioDecibels-BBfdHWQ0.js.map +0 -1
- package/dist/updateParticipantAudioDecibels-Dni8i6AY.cjs.map +0 -1
|
@@ -767,6 +767,24 @@ async function compareScreenStates({
|
|
|
767
767
|
console.log("compareScreenStates error", error);
|
|
768
768
|
}
|
|
769
769
|
}
|
|
770
|
+
function stopReconnectingWhenRefused(socket) {
|
|
771
|
+
const onRejected = (payload) => {
|
|
772
|
+
const refusal = new audioProcessing.MediaSocketConnectError({
|
|
773
|
+
phase: "rejected",
|
|
774
|
+
reason: audioProcessing.normalizeRejectionReason(payload?.reason),
|
|
775
|
+
stage: typeof payload?.stage === "string" ? payload.stage : void 0,
|
|
776
|
+
elapsedMs: 0
|
|
777
|
+
});
|
|
778
|
+
if (refusal.retryable) return;
|
|
779
|
+
socket.off("connection-rejected", onRejected);
|
|
780
|
+
console.warn(`MediaSFU media socket: reconnect refused (${refusal.reason}); not retrying.`);
|
|
781
|
+
try {
|
|
782
|
+
socket.disconnect();
|
|
783
|
+
} catch {
|
|
784
|
+
}
|
|
785
|
+
};
|
|
786
|
+
socket.on("connection-rejected", onRejected);
|
|
787
|
+
}
|
|
770
788
|
async function validateApiKeyToken(value) {
|
|
771
789
|
if (!/^[a-z0-9]{64}$/i.test(value)) {
|
|
772
790
|
throw new Error("Invalid API key or token.");
|
|
@@ -854,7 +872,10 @@ async function connectSocket({ apiUserName, apiKey, apiToken, link }) {
|
|
|
854
872
|
} catch {
|
|
855
873
|
}
|
|
856
874
|
console.log(`Connected to ${conn} socket with ID: ${socketId}`);
|
|
857
|
-
settle(() =>
|
|
875
|
+
settle(() => {
|
|
876
|
+
stopReconnectingWhenRefused(socket);
|
|
877
|
+
resolve(socket);
|
|
878
|
+
});
|
|
858
879
|
};
|
|
859
880
|
const handleConnectError = (error) => {
|
|
860
881
|
settle(() => {
|
|
@@ -1915,6 +1936,36 @@ const connectSendTransport = async ({ option, targetOption = "all", parameters }
|
|
|
1915
1936
|
console.log("connectSendTransport error", error);
|
|
1916
1937
|
}
|
|
1917
1938
|
};
|
|
1939
|
+
const pendingCreations = /* @__PURE__ */ new WeakMap();
|
|
1940
|
+
const pendingSendTransportCreation = (socket) => socket ? pendingCreations.get(socket) : void 0;
|
|
1941
|
+
const trackSendTransportCreation = (socket, create) => {
|
|
1942
|
+
if (!socket) return create();
|
|
1943
|
+
const running = create();
|
|
1944
|
+
pendingCreations.set(socket, running);
|
|
1945
|
+
const release = () => {
|
|
1946
|
+
if (pendingCreations.get(socket) === running) pendingCreations.delete(socket);
|
|
1947
|
+
};
|
|
1948
|
+
running.then(release, release);
|
|
1949
|
+
return running;
|
|
1950
|
+
};
|
|
1951
|
+
const isOpen = (item) => Boolean(item && !item.closed);
|
|
1952
|
+
const pendingProduces = /* @__PURE__ */ new WeakMap();
|
|
1953
|
+
const produceOnce$1 = async (transport, key, produce) => {
|
|
1954
|
+
let byKey = pendingProduces.get(transport);
|
|
1955
|
+
if (!byKey) {
|
|
1956
|
+
byKey = /* @__PURE__ */ new Map();
|
|
1957
|
+
pendingProduces.set(transport, byKey);
|
|
1958
|
+
}
|
|
1959
|
+
const inFlight = byKey.get(key);
|
|
1960
|
+
if (inFlight) return { producer: await inFlight, joined: true };
|
|
1961
|
+
const running = produce();
|
|
1962
|
+
byKey.set(key, running);
|
|
1963
|
+
try {
|
|
1964
|
+
return { producer: await running, joined: false };
|
|
1965
|
+
} finally {
|
|
1966
|
+
if (byKey.get(key) === running) byKey.delete(key);
|
|
1967
|
+
}
|
|
1968
|
+
};
|
|
1918
1969
|
const connectLocalSendTransportAudio = async ({
|
|
1919
1970
|
parameters,
|
|
1920
1971
|
audioParams
|
|
@@ -1927,7 +1978,7 @@ const connectLocalSendTransportAudio = async ({
|
|
|
1927
1978
|
updateLocalProducerTransport
|
|
1928
1979
|
} = parameters;
|
|
1929
1980
|
if (localProducerTransport) {
|
|
1930
|
-
localAudioProducer = await localProducerTransport.produce(audioParams);
|
|
1981
|
+
localAudioProducer = (await produceOnce$1(localProducerTransport, "audio", () => localProducerTransport.produce(audioParams))).producer;
|
|
1931
1982
|
updateLocalAudioProducer?.(localAudioProducer);
|
|
1932
1983
|
updateLocalProducerTransport?.(localProducerTransport);
|
|
1933
1984
|
}
|
|
@@ -1965,8 +2016,9 @@ const connectSendTransportAudio = async ({
|
|
|
1965
2016
|
updateProducerTransport
|
|
1966
2017
|
} = parameters;
|
|
1967
2018
|
if (targetOption === "all" || targetOption === "remote") {
|
|
1968
|
-
|
|
1969
|
-
|
|
2019
|
+
const produced = await produceOnce$1(producerTransport, "audio", () => producerTransport.produce(audioParams));
|
|
2020
|
+
audioProducer = produced.producer;
|
|
2021
|
+
if (!produced.joined) updateMicLevel(audioProducer, parameters.updateAudioLevel);
|
|
1970
2022
|
updateAudioProducer(audioProducer);
|
|
1971
2023
|
updateProducerTransport(producerTransport);
|
|
1972
2024
|
}
|
|
@@ -2004,11 +2056,11 @@ const connectLocalSendTransportScreen = async ({
|
|
|
2004
2056
|
(codec2) => codec2.mimeType.toLowerCase() === "video/vp9"
|
|
2005
2057
|
);
|
|
2006
2058
|
if (localProducerTransport) {
|
|
2007
|
-
localScreenProducer = await localProducerTransport.produce({
|
|
2059
|
+
localScreenProducer = (await produceOnce$1(localProducerTransport, "screen", () => localProducerTransport.produce({
|
|
2008
2060
|
track: stream.getVideoTracks()[0],
|
|
2009
2061
|
codec,
|
|
2010
2062
|
appData: { mediaTag: "screen-video" }
|
|
2011
|
-
});
|
|
2063
|
+
}))).producer;
|
|
2012
2064
|
updateLocalScreenProducer?.(localScreenProducer);
|
|
2013
2065
|
updateLocalProducerTransport?.(localProducerTransport);
|
|
2014
2066
|
}
|
|
@@ -2038,12 +2090,12 @@ const connectSendTransportScreen = async ({
|
|
|
2038
2090
|
(codec2) => codec2.mimeType.toLowerCase() === "video/vp9"
|
|
2039
2091
|
);
|
|
2040
2092
|
if (targetOption === "remote" || targetOption === "all") {
|
|
2041
|
-
screenProducer = await producerTransport.produce({
|
|
2093
|
+
screenProducer = (await produceOnce$1(producerTransport, "screen", () => producerTransport.produce({
|
|
2042
2094
|
track: stream.getVideoTracks()[0],
|
|
2043
2095
|
...params,
|
|
2044
2096
|
codec,
|
|
2045
2097
|
appData: { mediaTag: "screen-video" }
|
|
2046
|
-
});
|
|
2098
|
+
}))).producer;
|
|
2047
2099
|
updateScreenProducer(screenProducer);
|
|
2048
2100
|
updateProducerTransport(producerTransport);
|
|
2049
2101
|
}
|
|
@@ -2071,7 +2123,7 @@ const connectLocalSendTransportVideo = async ({
|
|
|
2071
2123
|
updateLocalProducerTransport
|
|
2072
2124
|
} = parameters;
|
|
2073
2125
|
if (localProducerTransport) {
|
|
2074
|
-
localVideoProducer = await localProducerTransport.produce(videoParams);
|
|
2126
|
+
localVideoProducer = (await produceOnce$1(localProducerTransport, "video", () => localProducerTransport.produce(videoParams))).producer;
|
|
2075
2127
|
updateLocalVideoProducer?.(localVideoProducer);
|
|
2076
2128
|
updateLocalProducerTransport?.(localProducerTransport);
|
|
2077
2129
|
}
|
|
@@ -2096,7 +2148,7 @@ const connectSendTransportVideo = async ({
|
|
|
2096
2148
|
updateUpdateMainWindow
|
|
2097
2149
|
} = parameters;
|
|
2098
2150
|
if (targetOption === "all" || targetOption === "remote") {
|
|
2099
|
-
videoProducer = await producerTransport.produce(videoParams);
|
|
2151
|
+
videoProducer = (await produceOnce$1(producerTransport, "video", () => producerTransport.produce(videoParams))).producer;
|
|
2100
2152
|
if (islevel === "2") {
|
|
2101
2153
|
updateMainWindow = true;
|
|
2102
2154
|
}
|
|
@@ -2216,7 +2268,7 @@ const createLocalSendTransport = async ({
|
|
|
2216
2268
|
console.error("Error creating local send transport:", error);
|
|
2217
2269
|
}
|
|
2218
2270
|
};
|
|
2219
|
-
const
|
|
2271
|
+
const createSendTransportNow = async ({
|
|
2220
2272
|
option,
|
|
2221
2273
|
parameters
|
|
2222
2274
|
}) => {
|
|
@@ -2246,67 +2298,109 @@ const createSendTransport = async ({
|
|
|
2246
2298
|
} catch (error) {
|
|
2247
2299
|
console.log("Error creating local send transport:", error);
|
|
2248
2300
|
}
|
|
2249
|
-
socket.emit(
|
|
2301
|
+
await new Promise((resolve, reject) => socket.emit(
|
|
2250
2302
|
"createWebRtcTransport",
|
|
2251
2303
|
{ consumer: false, islevel },
|
|
2252
2304
|
async ({ params }) => {
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
if (!resolvedDevice) {
|
|
2259
|
-
return;
|
|
2260
|
-
}
|
|
2261
|
-
const createdProducerTransport = await resolvedDevice.createSendTransport(params);
|
|
2262
|
-
updateProducerTransport(createdProducerTransport);
|
|
2263
|
-
createdProducerTransport.on(
|
|
2264
|
-
"connect",
|
|
2265
|
-
async ({ dtlsParameters }, callback, errback) => {
|
|
2266
|
-
try {
|
|
2267
|
-
socket.emit("transport-connect", { dtlsParameters });
|
|
2268
|
-
callback();
|
|
2269
|
-
} catch (error) {
|
|
2270
|
-
errback(error);
|
|
2271
|
-
}
|
|
2272
|
-
}
|
|
2273
|
-
);
|
|
2274
|
-
createdProducerTransport.on(
|
|
2275
|
-
"produce",
|
|
2276
|
-
async (parameters2, callback, errback) => {
|
|
2277
|
-
try {
|
|
2278
|
-
socket.emit(
|
|
2279
|
-
"transport-produce",
|
|
2280
|
-
{
|
|
2281
|
-
kind: parameters2.kind,
|
|
2282
|
-
rtpParameters: parameters2.rtpParameters,
|
|
2283
|
-
appData: parameters2.appData,
|
|
2284
|
-
islevel,
|
|
2285
|
-
name: member
|
|
2286
|
-
},
|
|
2287
|
-
async ({ id }) => {
|
|
2288
|
-
callback({ id });
|
|
2289
|
-
}
|
|
2290
|
-
);
|
|
2291
|
-
} catch (error) {
|
|
2292
|
-
errback(error);
|
|
2293
|
-
}
|
|
2305
|
+
try {
|
|
2306
|
+
if (params && params.error) {
|
|
2307
|
+
console.error("Error in createWebRtcTransport:", params.error);
|
|
2308
|
+
reject(new Error(String(params.error)));
|
|
2309
|
+
return;
|
|
2294
2310
|
}
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
await connectSendTransport2({
|
|
2300
|
-
targetOption: "remote",
|
|
2301
|
-
option,
|
|
2302
|
-
parameters: {
|
|
2303
|
-
...parameters,
|
|
2304
|
-
producerTransport: createdProducerTransport
|
|
2311
|
+
const resolvedDevice = parameters.getCurrentParams ? parameters.getCurrentParams().device : device ?? null;
|
|
2312
|
+
if (!resolvedDevice) {
|
|
2313
|
+
resolve();
|
|
2314
|
+
return;
|
|
2305
2315
|
}
|
|
2306
|
-
|
|
2307
|
-
|
|
2316
|
+
const createdProducerTransport = await resolvedDevice.createSendTransport(params);
|
|
2317
|
+
updateProducerTransport(createdProducerTransport);
|
|
2318
|
+
createdProducerTransport.on(
|
|
2319
|
+
"connect",
|
|
2320
|
+
async ({ dtlsParameters }, callback, errback) => {
|
|
2321
|
+
try {
|
|
2322
|
+
socket.emit("transport-connect", { dtlsParameters });
|
|
2323
|
+
callback();
|
|
2324
|
+
} catch (error) {
|
|
2325
|
+
errback(error);
|
|
2326
|
+
}
|
|
2327
|
+
}
|
|
2328
|
+
);
|
|
2329
|
+
createdProducerTransport.on(
|
|
2330
|
+
"produce",
|
|
2331
|
+
async (parameters2, callback, errback) => {
|
|
2332
|
+
try {
|
|
2333
|
+
socket.emit(
|
|
2334
|
+
"transport-produce",
|
|
2335
|
+
{
|
|
2336
|
+
kind: parameters2.kind,
|
|
2337
|
+
rtpParameters: parameters2.rtpParameters,
|
|
2338
|
+
appData: parameters2.appData,
|
|
2339
|
+
islevel,
|
|
2340
|
+
name: member
|
|
2341
|
+
},
|
|
2342
|
+
async ({ id }) => {
|
|
2343
|
+
callback({ id });
|
|
2344
|
+
}
|
|
2345
|
+
);
|
|
2346
|
+
} catch (error) {
|
|
2347
|
+
errback(error);
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
);
|
|
2351
|
+
attachTransportRecovery(createdProducerTransport, socket, () => clearFailedSendState(parameters, createdProducerTransport));
|
|
2352
|
+
transportCreated = true;
|
|
2353
|
+
parameters = parameters.getCurrentParams?.() ?? parameters;
|
|
2354
|
+
await connectSendTransport2({
|
|
2355
|
+
targetOption: "remote",
|
|
2356
|
+
option,
|
|
2357
|
+
parameters: {
|
|
2358
|
+
...parameters,
|
|
2359
|
+
producerTransport: createdProducerTransport
|
|
2360
|
+
}
|
|
2361
|
+
});
|
|
2362
|
+
updateTransportCreated(transportCreated);
|
|
2363
|
+
resolve();
|
|
2364
|
+
} catch (error) {
|
|
2365
|
+
reject(error);
|
|
2366
|
+
}
|
|
2308
2367
|
}
|
|
2309
|
-
);
|
|
2368
|
+
));
|
|
2369
|
+
} catch (error) {
|
|
2370
|
+
console.log("Error creating send transport:", error);
|
|
2371
|
+
}
|
|
2372
|
+
};
|
|
2373
|
+
const producerFor = (params, option) => {
|
|
2374
|
+
if (option === "audio") return isOpen(params.audioProducer);
|
|
2375
|
+
if (option === "video") return isOpen(params.videoProducer);
|
|
2376
|
+
if (option === "screen") return isOpen(params.screenProducer);
|
|
2377
|
+
return isOpen(params.audioProducer) && isOpen(params.videoProducer);
|
|
2378
|
+
};
|
|
2379
|
+
const createSendTransport = async ({
|
|
2380
|
+
option,
|
|
2381
|
+
parameters
|
|
2382
|
+
}) => {
|
|
2383
|
+
try {
|
|
2384
|
+
const current = parameters.getCurrentParams?.() ?? parameters.getUpdatedAllParams?.() ?? parameters;
|
|
2385
|
+
const socket = current.socket;
|
|
2386
|
+
const pending = pendingSendTransportCreation(socket);
|
|
2387
|
+
if (!pending && !(current.transportCreated && isOpen(current.producerTransport))) {
|
|
2388
|
+
await trackSendTransportCreation(socket, () => createSendTransportNow({ option, parameters }));
|
|
2389
|
+
return;
|
|
2390
|
+
}
|
|
2391
|
+
if (pending) await pending.catch(() => void 0);
|
|
2392
|
+
const latest = parameters.getCurrentParams?.() ?? parameters.getUpdatedAllParams?.() ?? parameters;
|
|
2393
|
+
if (!isOpen(latest.producerTransport)) {
|
|
2394
|
+
await createSendTransport({ option, parameters });
|
|
2395
|
+
return;
|
|
2396
|
+
}
|
|
2397
|
+
if (producerFor(latest, option)) return;
|
|
2398
|
+
const connectSendTransport2 = latest.connectSendTransport ?? parameters.connectSendTransport;
|
|
2399
|
+
await connectSendTransport2({
|
|
2400
|
+
targetOption: "all",
|
|
2401
|
+
option,
|
|
2402
|
+
parameters: { ...latest, producerTransport: latest.producerTransport }
|
|
2403
|
+
});
|
|
2310
2404
|
} catch (error) {
|
|
2311
2405
|
console.log("Error creating send transport:", error);
|
|
2312
2406
|
}
|
|
@@ -5927,6 +6021,7 @@ exports.setScreenAudioVolume = setScreenAudioVolume;
|
|
|
5927
6021
|
exports.shouldShareScreenAudio = shouldShareScreenAudio;
|
|
5928
6022
|
exports.signalNewConsumerTransport = signalNewConsumerTransport;
|
|
5929
6023
|
exports.startShareScreen = startShareScreen;
|
|
6024
|
+
exports.stopReconnectingWhenRefused = stopReconnectingWhenRefused;
|
|
5930
6025
|
exports.stopShareScreen = stopShareScreen;
|
|
5931
6026
|
exports.streamSuccessAudio = streamSuccessAudio;
|
|
5932
6027
|
exports.streamSuccessAudioSwitch = streamSuccessAudioSwitch;
|
|
@@ -5940,4 +6035,4 @@ exports.trigger = trigger;
|
|
|
5940
6035
|
exports.updateMicLevel = updateMicLevel;
|
|
5941
6036
|
exports.updateMiniCardsGrid = updateMiniCardsGrid;
|
|
5942
6037
|
exports.updateParticipantAudioDecibels = updateParticipantAudioDecibels;
|
|
5943
|
-
//# sourceMappingURL=updateParticipantAudioDecibels-
|
|
6038
|
+
//# sourceMappingURL=updateParticipantAudioDecibels-CbCP1PDs.cjs.map
|