mediasfu-shared 1.0.5 → 1.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediasfu-shared",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "mediasfu-shared – framework-agnostic WebRTC runtime for MediaSFU. Room helpers, mediasoup signaling, socket management, media state, and TypeScript types for React, Vue, Angular, Svelte, and plain TS.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -34,6 +34,29 @@ export interface CreateSendTransportOptions {
34
34
  // Export the type definition for the function
35
35
  export type CreateSendTransportType = (options: CreateSendTransportOptions) => Promise<void>;
36
36
 
37
+ const waitForReadyDevice = async (
38
+ parameters: CreateSendTransportParameters,
39
+ attempts = 20,
40
+ delayMs = 100,
41
+ ): Promise<Device | null> => {
42
+ let resolvedDevice = parameters.getUpdatedAllParams().device ?? parameters.device;
43
+
44
+ for (let attempt = 0; !resolvedDevice && attempt < attempts; attempt += 1) {
45
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
46
+ resolvedDevice = parameters.getUpdatedAllParams().device ?? parameters.device;
47
+ }
48
+
49
+ return resolvedDevice;
50
+ };
51
+
52
+ const notifyDeviceNotReady = (parameters: CreateSendTransportParameters): void => {
53
+ parameters.showAlert?.({
54
+ message: 'Media device is still initializing. Please try screen sharing again in a moment.',
55
+ type: 'danger',
56
+ duration: 3000,
57
+ });
58
+ };
59
+
37
60
  const createLocalSendTransport = async ({
38
61
  option,
39
62
  parameters,
@@ -53,6 +76,11 @@ const createLocalSendTransport = async ({
53
76
  connectSendTransport,
54
77
  } = parameters;
55
78
 
79
+ const updatedParams = parameters.getUpdatedAllParams();
80
+ device = updatedParams.device ?? device;
81
+ socket = updatedParams.socket ?? socket;
82
+ localSocket = updatedParams.localSocket ?? localSocket;
83
+
56
84
 
57
85
  if (!localSocket || !localSocket.id || socket.id === localSocket.id) {
58
86
  return;
@@ -67,8 +95,14 @@ const createLocalSendTransport = async ({
67
95
  return;
68
96
  }
69
97
 
98
+ const resolvedDevice = (await waitForReadyDevice(parameters)) ?? device;
99
+ if (!resolvedDevice) {
100
+ notifyDeviceNotReady(parameters);
101
+ return;
102
+ }
103
+
70
104
  // Create local send transport
71
- localProducerTransport = await device!.createSendTransport(params);
105
+ localProducerTransport = await resolvedDevice.createSendTransport(params);
72
106
  if (updateLocalProducerTransport) {
73
107
  updateLocalProducerTransport(localProducerTransport);
74
108
  }
@@ -212,6 +246,15 @@ export const createSendTransport: CreateSendTransportType = async ({
212
246
  device = updatedParams.device;
213
247
  socket = updatedParams.socket;
214
248
 
249
+ if (!device) {
250
+ device = await waitForReadyDevice(parameters);
251
+ }
252
+
253
+ if (!device) {
254
+ notifyDeviceNotReady(parameters);
255
+ return;
256
+ }
257
+
215
258
  try {
216
259
  // Handle local transport creation first
217
260
  await createLocalSendTransport({option, parameters});
@@ -230,8 +273,14 @@ export const createSendTransport: CreateSendTransportType = async ({
230
273
  return;
231
274
  }
232
275
 
276
+ const resolvedDevice = (await waitForReadyDevice(parameters)) ?? device;
277
+ if (!resolvedDevice) {
278
+ notifyDeviceNotReady(parameters);
279
+ return;
280
+ }
281
+
233
282
  // Create a WebRTC send transport
234
- producerTransport = await device!.createSendTransport(params);
283
+ producerTransport = await resolvedDevice.createSendTransport(params);
235
284
  updateProducerTransport(producerTransport);
236
285
 
237
286
  // Handle 'connect' event