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.
Files changed (41) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -1
  3. package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -1
  4. package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -1
  5. package/dist/consumers/createSendTransport.d.ts +4 -48
  6. package/dist/consumers/createSendTransport.d.ts.map +1 -1
  7. package/dist/consumers/index.cjs +1 -1
  8. package/dist/consumers/index.js +1 -1
  9. package/dist/consumers/sendTransportGuard.d.ts +30 -0
  10. package/dist/consumers/sendTransportGuard.d.ts.map +1 -0
  11. package/dist/{getParticipantMedia-DEJwXXhU.js → getParticipantMedia-CZbsFBth.js} +3 -3
  12. package/dist/{getParticipantMedia-DEJwXXhU.js.map → getParticipantMedia-CZbsFBth.js.map} +1 -1
  13. package/dist/{getParticipantMedia-1okyF4H7.cjs → getParticipantMedia-Dli4dOLp.cjs} +3 -3
  14. package/dist/{getParticipantMedia-1okyF4H7.cjs.map → getParticipantMedia-Dli4dOLp.cjs.map} +1 -1
  15. package/dist/index.cjs +4 -3
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.js +9 -8
  18. package/dist/index.native.cjs +4 -3
  19. package/dist/index.native.cjs.map +1 -1
  20. package/dist/index.native.js +8 -7
  21. package/dist/{joinLocalRoom-DS6_6lJL.js → joinLocalRoom-BWoS-8wt.js} +2 -2
  22. package/dist/{joinLocalRoom-DS6_6lJL.js.map → joinLocalRoom-BWoS-8wt.js.map} +1 -1
  23. package/dist/{joinLocalRoom-Dsn39SwS.cjs → joinLocalRoom-DQvud99t.cjs} +2 -2
  24. package/dist/{joinLocalRoom-Dsn39SwS.cjs.map → joinLocalRoom-DQvud99t.cjs.map} +1 -1
  25. package/dist/sockets/SocketManager.d.ts +7 -0
  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-Dni8i6AY.cjs → updateParticipantAudioDecibels-CbCP1PDs.cjs} +162 -67
  30. package/dist/updateParticipantAudioDecibels-CbCP1PDs.cjs.map +1 -0
  31. package/dist/{updateParticipantAudioDecibels-BBfdHWQ0.js → updateParticipantAudioDecibels-xKKq7Zp5.js} +166 -71
  32. package/dist/updateParticipantAudioDecibels-xKKq7Zp5.js.map +1 -0
  33. package/package.json +1 -1
  34. package/src/consumers/connectSendTransportAudio.ts +7 -4
  35. package/src/consumers/connectSendTransportScreen.ts +6 -4
  36. package/src/consumers/connectSendTransportVideo.ts +4 -2
  37. package/src/consumers/createSendTransport.ts +62 -4
  38. package/src/consumers/sendTransportGuard.ts +65 -0
  39. package/src/sockets/SocketManager.ts +31 -1
  40. package/dist/updateParticipantAudioDecibels-BBfdHWQ0.js.map +0 -1
  41. 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(() => resolve(socket));
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
- audioProducer = await producerTransport.produce(audioParams);
1969
- updateMicLevel(audioProducer, parameters.updateAudioLevel);
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 createSendTransport = async ({
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
- if (params && params.error) {
2254
- console.error("Error in createWebRtcTransport:", params.error);
2255
- return;
2256
- }
2257
- const resolvedDevice = parameters.getCurrentParams ? parameters.getCurrentParams().device : device ?? null;
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
- attachTransportRecovery(createdProducerTransport, socket, () => clearFailedSendState(parameters, createdProducerTransport));
2297
- transportCreated = true;
2298
- parameters = parameters.getCurrentParams?.() ?? parameters;
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
- updateTransportCreated(transportCreated);
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-Dni8i6AY.cjs.map
6038
+ //# sourceMappingURL=updateParticipantAudioDecibels-CbCP1PDs.cjs.map