mediasfu-shared 1.0.1 → 1.0.2

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 (125) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +103 -222
  3. package/dist/index.cjs +7500 -2163
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.ts +4203 -273
  6. package/dist/index.js +7521 -2184
  7. package/dist/index.js.map +1 -1
  8. package/package.json +85 -78
  9. package/src/ProducerClient/producerClientEmits/joinRoomClient.ts +57 -0
  10. package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +401 -0
  11. package/src/consumers/addVideosGrid.ts +3 -2
  12. package/src/consumers/changeVids.ts +111 -41
  13. package/src/consumers/checkPermission.ts +35 -1
  14. package/src/consumers/connectRecvTransport.ts +42 -1
  15. package/src/consumers/consumerResume.ts +2 -2
  16. package/src/consumers/dispStreams.ts +83 -37
  17. package/src/consumers/frameworkConsumerContract.ts +6 -0
  18. package/src/consumers/generatePageContent.ts +24 -10
  19. package/src/consumers/getPipedProducersAlt.ts +112 -16
  20. package/src/consumers/gridLayout/addVideosGrid.engine.ts +42 -0
  21. package/src/consumers/gridLayout/prepopulateUserMedia.engine.ts +444 -0
  22. package/src/consumers/mixStreams.ts +45 -14
  23. package/src/consumers/onScreenChanges.ts +25 -10
  24. package/src/consumers/prepopulateUserMedia.ts +3 -2
  25. package/src/consumers/processConsumerTransports.ts +68 -23
  26. package/src/consumers/processConsumerTransportsAudio.ts +53 -16
  27. package/src/consumers/reUpdateInter.ts +61 -21
  28. package/src/consumers/readjust.ts +30 -14
  29. package/src/consumers/reorderStreams.ts +76 -42
  30. package/src/consumers/resumePauseAudioStreams.ts +66 -17
  31. package/src/consumers/resumePauseStreams.ts +53 -10
  32. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +8 -0
  33. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +114 -0
  34. package/src/consumers/socketReceiveMethods/producerClosed.ts +13 -0
  35. package/src/consumers/streamSuccessScreen.ts +2 -2
  36. package/src/consumers/streamSuccessVideo.ts +5 -0
  37. package/src/consumers/translationConsumerSwitch.ts +299 -0
  38. package/src/index.ts +85 -1
  39. package/src/methods/coHostMethods/modifyCoHostSettings.ts +9 -9
  40. package/src/methods/displaySettings/modifyDisplaySettings.ts +5 -0
  41. package/src/methods/index.ts +66 -0
  42. package/src/methods/message/sendMessage.ts +12 -29
  43. package/src/methods/panelists/focusPanelists.ts +83 -0
  44. package/src/methods/panelists/index.ts +3 -0
  45. package/src/methods/panelists/launchPanelists.ts +13 -0
  46. package/src/methods/panelists/updatePanelists.ts +135 -0
  47. package/src/methods/permissions/index.ts +3 -0
  48. package/src/methods/permissions/launchPermissions.ts +13 -0
  49. package/src/methods/permissions/updateParticipantPermission.ts +127 -0
  50. package/src/methods/permissions/updatePermissionConfig.ts +52 -0
  51. package/src/methods/polls/pollUpdated.ts +88 -0
  52. package/src/methods/recording/confirmRecording.ts +15 -12
  53. package/src/methods/recording/recordResumeTimer.ts +2 -2
  54. package/src/methods/recording/recordStartTimer.ts +2 -2
  55. package/src/methods/recording/timeLeftRecording.ts +25 -0
  56. package/src/methods/requests/hostRequestResponse.ts +153 -0
  57. package/src/methods/settings/modifySettings.ts +17 -17
  58. package/src/methods/socketReceive/allMembers.ts +450 -0
  59. package/src/methods/socketReceive/allMembersRest.ts +480 -0
  60. package/src/methods/socketReceive/allWaitingRoomMembers.ts +35 -0
  61. package/src/methods/socketReceive/banParticipant.ts +73 -0
  62. package/src/methods/socketReceive/controlMediaHost.ts +280 -0
  63. package/src/methods/socketReceive/disconnect.ts +40 -0
  64. package/src/methods/socketReceive/disconnectUserSelf.ts +56 -0
  65. package/src/methods/socketReceive/getDomains.ts +112 -0
  66. package/src/methods/socketReceive/meetingEnded.ts +49 -0
  67. package/src/methods/socketReceive/meetingStillThere.ts +26 -0
  68. package/src/methods/socketReceive/panelistReceiveMethods.ts +195 -0
  69. package/src/methods/socketReceive/participantRequested.ts +48 -0
  70. package/src/methods/socketReceive/permissionReceiveMethods.ts +59 -0
  71. package/src/methods/socketReceive/personJoined.ts +35 -0
  72. package/src/methods/socketReceive/producerMediaClosed.ts +223 -0
  73. package/src/methods/socketReceive/producerMediaPaused.ts +267 -0
  74. package/src/methods/socketReceive/producerMediaResumed.ts +157 -0
  75. package/src/methods/socketReceive/reInitiateRecording.ts +53 -0
  76. package/src/methods/socketReceive/receiveMessage.ts +117 -0
  77. package/src/methods/socketReceive/recordingNotice.ts +286 -0
  78. package/src/methods/socketReceive/roomRecordParams.ts +122 -0
  79. package/src/methods/socketReceive/screenProducerId.ts +61 -0
  80. package/src/methods/socketReceive/startRecords.ts +46 -0
  81. package/src/methods/socketReceive/stoppedRecording.ts +44 -0
  82. package/src/methods/socketReceive/translationReceiveMethods.ts +581 -0
  83. package/src/methods/socketReceive/updateConsumingDomains.ts +128 -0
  84. package/src/methods/socketReceive/updateMediaSettings.ts +45 -0
  85. package/src/methods/socketReceive/updatedCoHost.ts +75 -0
  86. package/src/methods/socketReceive/userWaiting.ts +45 -0
  87. package/src/methods/stream/clickAudio.ts +380 -0
  88. package/src/methods/stream/clickChat.ts +36 -0
  89. package/src/methods/stream/clickScreenShare.ts +173 -0
  90. package/src/methods/stream/clickVideo.ts +22 -5
  91. package/src/methods/stream/index.ts +1 -0
  92. package/src/methods/utils/SoundPlayer.ts +31 -0
  93. package/src/methods/utils/checkLimitsAndMakeRequest.ts +156 -2
  94. package/src/methods/utils/createResponseJoinRoom.ts +47 -0
  95. package/src/methods/utils/createRoomOnMediaSFU.ts +160 -0
  96. package/src/methods/utils/formatNumber.ts +42 -0
  97. package/src/methods/utils/generateRandomMessages.ts +70 -0
  98. package/src/methods/utils/generateRandomParticipants.ts +100 -0
  99. package/src/methods/utils/generateRandomPolls.ts +43 -0
  100. package/src/methods/utils/generateRandomRequestList.ts +51 -0
  101. package/src/methods/utils/generateRandomWaitingRoomList.ts +17 -0
  102. package/src/methods/utils/getModalPosition.ts +23 -0
  103. package/src/methods/utils/getOverlayPosition.ts +37 -0
  104. package/src/methods/utils/initialValuesState.ts +405 -0
  105. package/src/methods/utils/joinRoomOnMediaSFU.ts +124 -0
  106. package/src/methods/utils/liveSubtitle.ts +107 -0
  107. package/src/methods/utils/meetingTimeRemaining.ts +33 -0
  108. package/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts +72 -0
  109. package/src/methods/utils/producer/aParams.ts +10 -0
  110. package/src/methods/utils/producer/hParams.ts +26 -0
  111. package/src/methods/utils/producer/screenParams.ts +13 -0
  112. package/src/methods/utils/producer/vParams.ts +26 -0
  113. package/src/methods/utils/producer/videoCaptureConstraints.ts +65 -0
  114. package/src/methods/utils/resolveMediaSFURoomApi.ts +16 -0
  115. package/src/methods/utils/sleep.ts +24 -0
  116. package/src/methods/utils/translationLanguages.ts +308 -0
  117. package/src/methods/utils/webrtc.ts +44 -0
  118. package/src/methods/welcome/handleWelcomeRequest.ts +11 -2
  119. package/src/methods/welcome/index.ts +5 -1
  120. package/src/methods/whiteboard/captureCanvasStream.ts +128 -0
  121. package/src/producers/producerEmits/joinConRoom.ts +2 -2
  122. package/src/producers/producerEmits/joinLocalRoom.ts +240 -0
  123. package/src/producers/producerEmits/joinRoom.ts +129 -0
  124. package/src/types/shared-base-types.ts +14 -3
  125. package/src/types/types.ts +255 -0
@@ -1,6 +1,11 @@
1
1
 
2
2
 
3
- import { PrepopulateUserMediaType, PrepopulateUserMediaParameters, EventType } from '../types/types';
3
+ import { PrepopulateUserMediaParameters, PrepopulateUserMediaOptions, EventType } from '../types/types';
4
+
5
+ type PrepopulateUserMediaInvoker = {
6
+ bivarianceHack: (options: PrepopulateUserMediaOptions) => Promise<unknown>;
7
+ }['bivarianceHack'];
8
+
4
9
  export interface ReadjustParameters extends PrepopulateUserMediaParameters {
5
10
  eventType: EventType;
6
11
  shareScreenStarted: boolean;
@@ -13,19 +18,21 @@ export interface ReadjustParameters extends PrepopulateUserMediaParameters {
13
18
  updateMainHeightWidth: (value: number) => void;
14
19
 
15
20
  // mediasfu functions
16
- prepopulateUserMedia: PrepopulateUserMediaType;
21
+ prepopulateUserMedia: PrepopulateUserMediaInvoker;
17
22
  getUpdatedAllParams: () => ReadjustParameters;
18
23
  [key: string]: any;
19
24
  }
20
25
 
21
- export interface ReadjustOptions {
26
+ export interface ReadjustOptions<TParameters extends ReadjustParameters = ReadjustParameters> {
22
27
  n: number;
23
28
  state: number;
24
- parameters: ReadjustParameters;
29
+ parameters: TParameters;
25
30
  }
26
31
 
27
32
  // Export the type definition for the function
28
- export type ReadjustType = (options: ReadjustOptions) => Promise<void>;
33
+ export type ReadjustType = <TParameters extends ReadjustParameters = ReadjustParameters>(
34
+ options: ReadjustOptions<TParameters>
35
+ ) => Promise<void>;
29
36
 
30
37
  /**
31
38
  * Adjusts the layout parameters based on the provided options.
@@ -69,9 +76,13 @@ export type ReadjustType = (options: ReadjustOptions) => Promise<void>;
69
76
  * ```
70
77
  */
71
78
 
72
- export async function readjust({ n, state, parameters }: ReadjustOptions): Promise<void> {
73
- let { getUpdatedAllParams } = parameters;
74
- parameters = getUpdatedAllParams();
79
+ export async function readjust<TParameters extends ReadjustParameters = ReadjustParameters>({
80
+ n,
81
+ state,
82
+ parameters,
83
+ }: ReadjustOptions<TParameters>): Promise<void> {
84
+ const { getUpdatedAllParams } = parameters;
85
+ const updatedParameters = getUpdatedAllParams() as TParameters;
75
86
 
76
87
  try {
77
88
  // Destructure parameters
@@ -79,6 +90,8 @@ export async function readjust({ n, state, parameters }: ReadjustOptions): Promi
79
90
  eventType,
80
91
  shareScreenStarted,
81
92
  shared,
93
+ whiteboardStarted,
94
+ whiteboardEnded,
82
95
  mainHeightWidth,
83
96
  prevMainHeightWidth,
84
97
  hostLabel,
@@ -86,7 +99,8 @@ export async function readjust({ n, state, parameters }: ReadjustOptions): Promi
86
99
  lock_screen,
87
100
  updateMainHeightWidth,
88
101
  prepopulateUserMedia,
89
- } = parameters;
102
+ } = updatedParameters;
103
+ const screenFlowActive = shareScreenStarted || shared || (whiteboardStarted && !whiteboardEnded);
90
104
 
91
105
  if (state === 0) {
92
106
  prevMainHeightWidth = mainHeightWidth;
@@ -107,12 +121,12 @@ export async function readjust({ n, state, parameters }: ReadjustOptions): Promi
107
121
  }
108
122
  } else if (
109
123
  eventType === "chat" ||
110
- (eventType === "conference" && !(shareScreenStarted || shared))
124
+ (eventType === "conference" && !screenFlowActive)
111
125
  ) {
112
126
  val1 = 12;
113
127
  val2 = 12 - val1;
114
128
  } else {
115
- if (shareScreenStarted || shared) {
129
+ if (screenFlowActive) {
116
130
  val2 = 10;
117
131
  val1 = 12 - val2;
118
132
  } else {
@@ -151,13 +165,15 @@ export async function readjust({ n, state, parameters }: ReadjustOptions): Promi
151
165
  cal1 = Math.floor((val1 / 12) * 100);
152
166
  cal2 = 100 - cal1;
153
167
 
154
- updateMainHeightWidth(cal2);
168
+ if (mainHeightWidth !== cal2) {
169
+ updateMainHeightWidth(cal2);
170
+ }
155
171
 
156
172
  if (prevMainHeightWidth !== mainHeightWidth) {
157
173
  if (!lock_screen && !shared) {
158
- await prepopulateUserMedia({ name: hostLabel, parameters });
174
+ await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });
159
175
  } else if (!first_round) {
160
- await prepopulateUserMedia({ name: hostLabel, parameters });
176
+ await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });
161
177
  }
162
178
  }
163
179
  } catch (error) {
@@ -1,42 +1,74 @@
1
1
 
2
- import { Participant, Stream, ChangeVidsParameters, ChangeVidsType } from "../types/types";
2
+ import { Participant, Stream } from "../types/types";
3
3
 
4
- export interface ReorderStreamsParameters extends ChangeVidsParameters {
5
- allVideoStreams: (Stream | Participant)[];
6
- participants: Participant[];
7
- oldAllStreams: (Stream | Participant)[];
4
+ interface ReorderStreamLike {
5
+ producerId?: string | null;
6
+ }
7
+
8
+ interface ReorderParticipantLike {
9
+ name: string;
10
+ islevel?: string | null;
11
+ videoID?: string | null;
12
+ ScreenID?: string | null;
13
+ }
14
+
15
+ type ChangeVidsInvoker = (options: {
16
+ screenChanged?: boolean;
17
+ parameters: any;
18
+ }) => Promise<void>;
19
+
20
+ type StreamCollectionUpdater<TEntry> = {
21
+ bivarianceHack: (streams: TEntry[]) => void;
22
+ }["bivarianceHack"];
23
+
24
+ const getProducerId = (value: unknown): string | null | undefined => {
25
+ return (value as ReorderStreamLike | null | undefined)?.producerId;
26
+ };
27
+
28
+ export interface ReorderStreamsParameters<
29
+ TStream extends ReorderStreamLike = Stream,
30
+ TParticipant extends ReorderParticipantLike = Participant,
31
+ TChangeVidsParameters = unknown,
32
+ > {
33
+ allVideoStreams: (TStream | TParticipant)[];
34
+ participants: TParticipant[];
35
+ oldAllStreams: (TStream | TParticipant)[];
8
36
  screenId?: string;
9
37
  adminVidID?: string;
10
- newLimitedStreams: (Stream | Participant)[];
38
+ newLimitedStreams: (TStream | TParticipant)[];
11
39
  newLimitedStreamsIDs: string[];
12
40
  activeSounds: string[];
13
41
  screenShareIDStream?: string;
14
42
  screenShareNameStream?: string;
15
43
  adminIDStream?: string;
16
44
  adminNameStream?: string;
17
- updateNewLimitedStreams: (streams: (Stream | Participant)[]) => void;
45
+ updateNewLimitedStreams: StreamCollectionUpdater<TStream | TParticipant>;
18
46
  updateNewLimitedStreamsIDs: (ids: string[]) => void;
19
47
  updateActiveSounds: (sounds: string[]) => void;
20
48
  updateScreenShareIDStream: (id: string) => void;
21
49
  updateScreenShareNameStream: (name: string) => void;
22
50
  updateAdminIDStream: (id: string) => void;
23
51
  updateAdminNameStream: (name: string) => void;
24
- updateYouYouStream: (streams: (Stream | Participant)[]) => void;
52
+ updateYouYouStream: StreamCollectionUpdater<TStream | TParticipant>;
25
53
 
26
54
  // mediasfu functions
27
- changeVids: ChangeVidsType;
28
- getUpdatedAllParams: () => ReorderStreamsParameters;
55
+ changeVids: ChangeVidsInvoker;
56
+ getUpdatedAllParams: () => ReorderStreamsParameters<TStream, TParticipant, TChangeVidsParameters>;
29
57
  [key: string]: any;
30
58
  }
31
59
 
32
- export interface ReorderStreamsOptions {
60
+ export interface ReorderStreamsOptions<
61
+ TParameters extends ReorderStreamsParameters<any, any, any> = ReorderStreamsParameters,
62
+ > {
33
63
  add?: boolean;
34
64
  screenChanged?: boolean;
35
- parameters: ReorderStreamsParameters;
65
+ parameters: TParameters;
36
66
  }
37
67
 
38
68
 
39
- export type ReorderStreamsType = (options: ReorderStreamsOptions) => Promise<void>;
69
+ export type ReorderStreamsType = <
70
+ TParameters extends ReorderStreamsParameters<any, any, any> = ReorderStreamsParameters,
71
+ >(options: ReorderStreamsOptions<TParameters>) => Promise<void>;
40
72
 
41
73
  /**
42
74
  * Reorders the video streams based on the provided options and updates the UI accordingly.
@@ -86,13 +118,15 @@ export type ReorderStreamsType = (options: ReorderStreamsOptions) => Promise<voi
86
118
  * ```
87
119
  */
88
120
 
89
- export const reorderStreams = async ({
121
+ export const reorderStreams = async <
122
+ TParameters extends ReorderStreamsParameters<any, any, any> = ReorderStreamsParameters,
123
+ >({
90
124
  add = false,
91
125
  screenChanged = false,
92
126
  parameters,
93
- }: ReorderStreamsOptions): Promise<void> => {
127
+ }: ReorderStreamsOptions<TParameters>): Promise<void> => {
94
128
  const { getUpdatedAllParams } = parameters;
95
- parameters = getUpdatedAllParams();
129
+ const updatedParameters = getUpdatedAllParams() as TParameters;
96
130
 
97
131
  let {
98
132
  allVideoStreams,
@@ -118,7 +152,7 @@ export const reorderStreams = async ({
118
152
 
119
153
  //mediasfu functions
120
154
  changeVids,
121
- } = parameters;
155
+ } = updatedParameters;
122
156
 
123
157
  // function to reorder streams on the ui
124
158
  if (!add) {
@@ -127,27 +161,27 @@ export const reorderStreams = async ({
127
161
  activeSounds = [];
128
162
  }
129
163
 
130
- const youyou = allVideoStreams.filter((stream) => stream.producerId === "youyou");
164
+ const youyou = allVideoStreams.filter((stream) => getProducerId(stream) === "youyou");
131
165
  const admin = participants.filter((participant) => participant.islevel === "2");
132
166
 
133
167
  if (admin.length > 0) {
134
- adminVidID = admin[0].videoID;
168
+ adminVidID = admin[0].videoID ?? undefined;
135
169
  } else {
136
170
  adminVidID = "";
137
171
  }
138
172
 
139
173
  if (adminVidID) {
140
- const adminStream = allVideoStreams.find((stream) => stream.producerId === adminVidID);
174
+ const adminStream = allVideoStreams.find((stream) => getProducerId(stream) === adminVidID);
141
175
 
142
176
  if (!add) {
143
177
  newLimitedStreams = [...newLimitedStreams, ...youyou];
144
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];
178
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? "")];
145
179
  } else {
146
- const youyouStream = newLimitedStreams.find((stream) => stream.producerId === "youyou");
180
+ const youyouStream = newLimitedStreams.find((stream) => getProducerId(stream) === "youyou");
147
181
 
148
182
  if (!youyouStream) {
149
183
  newLimitedStreams = [...newLimitedStreams, ...youyou];
150
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];
184
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? "")];
151
185
  }
152
186
  }
153
187
 
@@ -156,17 +190,17 @@ export const reorderStreams = async ({
156
190
 
157
191
  if (!add) {
158
192
  newLimitedStreams = [...newLimitedStreams, adminStream];
159
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, adminStream.producerId];
193
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(adminStream) ?? ""];
160
194
  } else {
161
- const adminStreamer = newLimitedStreams.find((stream) => stream.producerId === adminVidID);
195
+ const adminStreamer = newLimitedStreams.find((stream) => getProducerId(stream) === adminVidID);
162
196
 
163
197
  if (!adminStreamer) {
164
198
  newLimitedStreams = [...newLimitedStreams, adminStream];
165
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, adminStream.producerId];
199
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(adminStream) ?? ""];
166
200
  }
167
201
  }
168
202
  } else {
169
- const oldAdminStream = oldAllStreams.find((stream) => stream.producerId === adminVidID);
203
+ const oldAdminStream = oldAllStreams.find((stream) => getProducerId(stream) === adminVidID);
170
204
 
171
205
  if (oldAdminStream) {
172
206
  //add it to the allVideoStream
@@ -176,13 +210,13 @@ export const reorderStreams = async ({
176
210
 
177
211
  if (!add) {
178
212
  newLimitedStreams = [...newLimitedStreams, oldAdminStream];
179
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, oldAdminStream.producerId];
213
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(oldAdminStream) ?? ""];
180
214
  } else {
181
- const adminStreamer = newLimitedStreams.find((stream) => stream.producerId === adminVidID);
215
+ const adminStreamer = newLimitedStreams.find((stream) => getProducerId(stream) === adminVidID);
182
216
 
183
217
  if (!adminStreamer) {
184
218
  newLimitedStreams = [...newLimitedStreams, oldAdminStream];
185
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, oldAdminStream.producerId];
219
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(oldAdminStream) ?? ""];
186
220
  }
187
221
  }
188
222
  }
@@ -191,42 +225,42 @@ export const reorderStreams = async ({
191
225
  const screenParticipant = participants.filter((participant) => participant.ScreenID === screenId);
192
226
 
193
227
  if (screenParticipant.length > 0) {
194
- const screenParticipantVidID = screenParticipant[0].videoID;
195
- const screenParticipantVidID_ = newLimitedStreams.filter((stream) => stream.producerId === screenParticipantVidID);
228
+ const screenParticipantVidID = screenParticipant[0].videoID ?? undefined;
229
+ const screenParticipantVidID_ = newLimitedStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);
196
230
 
197
231
  if (screenParticipantVidID_?.length < 1 && screenParticipantVidID) {
198
232
  screenShareIDStream = screenParticipantVidID;
199
233
  screenShareNameStream = screenParticipant[0].name;
200
- const screenParticipantVidID__ = allVideoStreams.filter((stream) => stream.producerId === screenParticipantVidID);
234
+ const screenParticipantVidID__ = allVideoStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);
201
235
  newLimitedStreams = [...newLimitedStreams, ...screenParticipantVidID__];
202
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => stream.producerId)];
236
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => getProducerId(stream) ?? "")];
203
237
  }
204
238
  }
205
239
  } else {
206
240
  if (!add) {
207
241
  newLimitedStreams = [...newLimitedStreams, ...youyou];
208
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];
242
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? "")];
209
243
  } else {
210
- const youyouStream = newLimitedStreams.find((stream) => stream.producerId === "youyou");
244
+ const youyouStream = newLimitedStreams.find((stream) => getProducerId(stream) === "youyou");
211
245
 
212
246
  if (!youyouStream) {
213
247
  newLimitedStreams = [...newLimitedStreams, ...youyou];
214
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];
248
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? "")];
215
249
  }
216
250
  }
217
251
 
218
252
  const screenParticipant = participants.filter((participant) => participant.ScreenID === screenId);
219
253
 
220
254
  if (screenParticipant.length > 0) {
221
- const screenParticipantVidID = screenParticipant[0].videoID;
222
- const screenParticipantVidID_ = newLimitedStreams.filter((stream) => stream.producerId === screenParticipantVidID);
255
+ const screenParticipantVidID = screenParticipant[0].videoID ?? undefined;
256
+ const screenParticipantVidID_ = newLimitedStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);
223
257
 
224
258
  if (screenParticipantVidID_?.length < 1 && screenParticipantVidID) {
225
259
  screenShareIDStream = screenParticipantVidID;
226
260
  screenShareNameStream = screenParticipant[0].name;
227
- const screenParticipantVidID__ = allVideoStreams.filter((stream) => stream.producerId === screenParticipantVidID);
261
+ const screenParticipantVidID__ = allVideoStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);
228
262
  newLimitedStreams = [...newLimitedStreams, ...screenParticipantVidID__];
229
- newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => stream.producerId)];
263
+ newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => getProducerId(stream) ?? "")];
230
264
  }
231
265
  }
232
266
  }
@@ -241,6 +275,6 @@ export const reorderStreams = async ({
241
275
  updateYouYouStream(youyou);
242
276
 
243
277
  //reflect the changes on the ui
244
- await changeVids({ screenChanged, parameters });
278
+ await changeVids({ screenChanged, parameters: updatedParameters });
245
279
  };
246
280
 
@@ -1,28 +1,74 @@
1
- import { Participant, Stream, ProcessConsumerTransportsAudioType, ProcessConsumerTransportsAudioParameters, Transport, BreakoutParticipant, EventType } from '../types/types';
1
+ import { Participant, Stream, ProcessConsumerTransportsAudioParameters, Transport, EventType } from '../types/types';
2
2
 
3
- export interface ResumePauseAudioStreamsParameters extends ProcessConsumerTransportsAudioParameters {
4
- breakoutRooms: BreakoutParticipant[][];
5
- ref_participants: Participant[];
6
- allAudioStreams: (Stream | Participant)[];
7
- participants: Participant[];
3
+ interface BreakoutParticipantLike {
4
+ name: string;
5
+ breakRoom?: number | null;
6
+ }
7
+
8
+ interface ParticipantLike {
9
+ name: string;
10
+ islevel?: string | null;
11
+ audioID?: string | null;
12
+ producerId?: string | null;
13
+ breakRoom?: number | null;
14
+ }
15
+
16
+ interface MediaEntryLike {
17
+ producerId?: string | null;
18
+ audioID?: string | null;
19
+ }
20
+
21
+ interface AudioTransportLike {
22
+ producerId?: string | null;
23
+ consumer?: {
24
+ paused?: boolean;
25
+ kind?: string;
26
+ pause: () => unknown;
27
+ resume: () => unknown;
28
+ };
29
+ socket_: {
30
+ emit: (
31
+ event: string,
32
+ payload: { serverConsumerId: string },
33
+ callback?: ((payload?: { resumed: boolean }) => void | Promise<unknown>)
34
+ ) => void;
35
+ };
36
+ serverConsumerTransportId: string;
37
+ }
38
+
39
+ export interface ResumePauseAudioStreamsParameters<
40
+ TTransport extends AudioTransportLike = Transport,
41
+ TMediaEntry extends MediaEntryLike | ParticipantLike = Stream | Participant,
42
+ > extends ProcessConsumerTransportsAudioParameters {
43
+ breakoutRooms: BreakoutParticipantLike[][];
44
+ ref_participants: ParticipantLike[];
45
+ allAudioStreams: TMediaEntry[];
46
+ participants: ParticipantLike[];
8
47
  islevel: string;
9
48
  eventType: EventType;
10
- consumerTransports: Transport[];
11
- limitedBreakRoom: BreakoutParticipant[];
49
+ consumerTransports: TTransport[];
50
+ limitedBreakRoom: BreakoutParticipantLike[];
12
51
  hostNewRoom: number;
13
52
  member: string;
14
- updateLimitedBreakRoom: (limitedBreakRoom: BreakoutParticipant[]) => void;
53
+ updateLimitedBreakRoom: (limitedBreakRoom: BreakoutParticipantLike[]) => void;
15
54
 
16
55
  // mediasfu functions
17
- processConsumerTransportsAudio: ProcessConsumerTransportsAudioType;
18
- getUpdatedAllParams: () => ResumePauseAudioStreamsParameters;
56
+ processConsumerTransportsAudio: (options: {
57
+ consumerTransports: TTransport[];
58
+ lStreams: TMediaEntry[];
59
+ parameters: ProcessConsumerTransportsAudioParameters;
60
+ }) => Promise<void>;
61
+ getUpdatedAllParams: () => ResumePauseAudioStreamsParameters<TTransport, TMediaEntry>;
19
62
  [key: string]: any;
20
63
  }
21
64
 
22
- export interface ResumePauseAudioStreamsOptions {
65
+ export interface ResumePauseAudioStreamsOptions<
66
+ TTransport extends AudioTransportLike = Transport,
67
+ TMediaEntry extends MediaEntryLike | ParticipantLike = Stream | Participant,
68
+ > {
23
69
  breakRoom?: number;
24
70
  inBreakRoom?: boolean;
25
- parameters: ResumePauseAudioStreamsParameters;
71
+ parameters: ResumePauseAudioStreamsParameters<TTransport, TMediaEntry>;
26
72
  }
27
73
 
28
74
  // Export the type definition for the function
@@ -54,11 +100,14 @@ export type ResumePauseAudioStreamsType = (
54
100
  * ```
55
101
  */
56
102
 
57
- export const resumePauseAudioStreams = async ({
103
+ export const resumePauseAudioStreams = async <
104
+ TTransport extends AudioTransportLike = Transport,
105
+ TMediaEntry extends MediaEntryLike | ParticipantLike = Stream | Participant,
106
+ >({
58
107
  breakRoom = -1,
59
108
  inBreakRoom = false,
60
109
  parameters,
61
- }: ResumePauseAudioStreamsOptions): Promise<void> => {
110
+ }: ResumePauseAudioStreamsOptions<TTransport, TMediaEntry>): Promise<void> => {
62
111
  const { getUpdatedAllParams } = parameters;
63
112
  parameters = getUpdatedAllParams();
64
113
 
@@ -76,8 +125,8 @@ export const resumePauseAudioStreams = async ({
76
125
  processConsumerTransportsAudio,
77
126
  } = parameters;
78
127
 
79
- let room: BreakoutParticipant[] = [];
80
- let currentStreams: (Stream | Participant)[] = [];
128
+ let room: BreakoutParticipantLike[] = [];
129
+ let currentStreams: TMediaEntry[] = [];
81
130
  // Determine the room based on breakout status
82
131
  if (inBreakRoom && breakRoom !== -1) {
83
132
  room = breakoutRooms[breakRoom];
@@ -1,24 +1,62 @@
1
1
  import { Participant, Transport, Stream } from "../types/types";
2
2
 
3
- export interface ResumePauseStreamsParameters {
4
- participants: Participant[];
3
+ interface ParticipantLike {
4
+ name: string;
5
+ islevel?: string | null;
6
+ videoID?: string | null;
7
+ }
8
+
9
+ interface ConsumerLike {
10
+ kind?: string;
11
+ resume: () => unknown;
12
+ }
13
+
14
+ interface SocketLike {
15
+ emit: (
16
+ event: string,
17
+ payload: { serverConsumerId: string },
18
+ callback?: ((payload: { resumed: boolean }) => void | Promise<unknown>)
19
+ ) => void;
20
+ }
21
+
22
+ interface TransportLike {
23
+ producerId?: string | null;
24
+ consumer: ConsumerLike;
25
+ socket_: SocketLike;
26
+ serverConsumerTransportId: string;
27
+ }
28
+
29
+ export interface ResumePauseStreamsParameters<
30
+ TParticipant extends ParticipantLike = Participant,
31
+ TTransport extends TransportLike = Transport,
32
+ TStream = Stream,
33
+ > {
34
+ participants: TParticipant[];
5
35
  dispActiveNames: string[];
6
- remoteScreenStream: Stream[];
7
- consumerTransports: Transport[];
36
+ remoteScreenStream: TStream[];
37
+ consumerTransports: TTransport[];
8
38
  screenId?: string;
9
39
  islevel: string;
10
40
 
11
41
  // mediasfu functions
12
- getUpdatedAllParams: () => ResumePauseStreamsParameters;
42
+ getUpdatedAllParams: () => ResumePauseStreamsParameters<TParticipant, TTransport, TStream>;
13
43
  [key: string]: any;
14
44
  }
15
45
 
16
- export interface ResumePauseStreamsOptions {
17
- parameters: ResumePauseStreamsParameters;
46
+ export interface ResumePauseStreamsOptions<
47
+ TParticipant extends ParticipantLike = Participant,
48
+ TTransport extends TransportLike = Transport,
49
+ TStream = Stream,
50
+ > {
51
+ parameters: ResumePauseStreamsParameters<TParticipant, TTransport, TStream>;
18
52
  }
19
53
 
20
54
  // Export the type definition for the function
21
- export type ResumePauseStreamsType = (options: ResumePauseStreamsOptions) => Promise<void>;
55
+ export type ResumePauseStreamsType = <
56
+ TParticipant extends ParticipantLike = Participant,
57
+ TTransport extends TransportLike = Transport,
58
+ TStream = Stream,
59
+ >(options: ResumePauseStreamsOptions<TParticipant, TTransport, TStream>) => Promise<void>;
22
60
 
23
61
  /**
24
62
  * Resumes or pauses streams based on the provided parameters.
@@ -49,9 +87,13 @@ export type ResumePauseStreamsType = (options: ResumePauseStreamsOptions) => Pro
49
87
  * ```
50
88
  */
51
89
 
52
- export async function resumePauseStreams({
90
+ export async function resumePauseStreams<
91
+ TParticipant extends ParticipantLike = Participant,
92
+ TTransport extends TransportLike = Transport,
93
+ TStream = Stream,
94
+ >({
53
95
  parameters,
54
- }: ResumePauseStreamsOptions): Promise<void> {
96
+ }: ResumePauseStreamsOptions<TParticipant, TTransport, TStream>): Promise<void> {
55
97
  try {
56
98
  // Destructure parameters
57
99
  const { participants, dispActiveNames, consumerTransports, screenId, islevel } = parameters;
@@ -85,6 +127,7 @@ export async function resumePauseStreams({
85
127
  // Get consumer transports with producerId in allVideoIDs
86
128
  const consumerTransportsToResume = consumerTransports.filter(
87
129
  (transport) =>
130
+ transport.producerId &&
88
131
  allVideoIDs.includes(transport.producerId) &&
89
132
  transport.consumer.kind !== "audio"
90
133
  );
@@ -120,6 +120,14 @@ export const joinConsumeRoom = async ({
120
120
 
121
121
  // Receive all piped transports
122
122
  await receiveAllPipedTransports({ nsock: remote_sock, parameters });
123
+
124
+ setTimeout(async () => {
125
+ try {
126
+ await receiveAllPipedTransports({ nsock: remote_sock, parameters });
127
+ } catch (error) {
128
+ console.log('[joinConsumeRoom] Retry receiveAllPipedTransports failed:', error);
129
+ }
130
+ }, 30000);
123
131
  }
124
132
 
125
133
  return data;