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
@@ -0,0 +1,267 @@
1
+ import type {
2
+ PrepopulateUserMediaParameters,
3
+ ReorderStreamsParameters,
4
+ ReUpdateInterParameters,
5
+ } from '../../types/types';
6
+
7
+ export interface ProducerMediaPausedPrepopulateUserMediaOptions<
8
+ TParameters = unknown,
9
+ > {
10
+ name: string;
11
+ parameters: TParameters;
12
+ }
13
+
14
+ export type ProducerMediaPausedPrepopulateUserMediaType<
15
+ TParameters = unknown,
16
+ > = (
17
+ options: ProducerMediaPausedPrepopulateUserMediaOptions<TParameters>,
18
+ ) => Promise<unknown>;
19
+
20
+ export interface ProducerMediaPausedReorderStreamsOptions<
21
+ TParameters = unknown,
22
+ > {
23
+ add: boolean;
24
+ screenChanged?: boolean;
25
+ parameters: TParameters;
26
+ }
27
+
28
+ export type ProducerMediaPausedReorderStreamsType<TParameters = unknown> = (
29
+ options: ProducerMediaPausedReorderStreamsOptions<TParameters>,
30
+ ) => Promise<unknown>;
31
+
32
+ export interface ProducerMediaPausedReUpdateInterOptions<
33
+ TParameters = unknown,
34
+ > {
35
+ name: string;
36
+ add: boolean;
37
+ force?: boolean;
38
+ parameters: TParameters;
39
+ }
40
+
41
+ export type ProducerMediaPausedReUpdateInterType<TParameters = unknown> = (
42
+ options: ProducerMediaPausedReUpdateInterOptions<TParameters>,
43
+ ) => Promise<unknown>;
44
+
45
+ export interface ProducerMediaPausedParticipantLike {
46
+ name?: string | null;
47
+ muted?: boolean;
48
+ islevel?: string | null;
49
+ videoID?: string | null;
50
+ audioID?: string | null;
51
+ }
52
+
53
+ export interface ProducerMediaPausedParameters<
54
+ TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,
55
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
56
+ TReorderStreamsParameters = ReorderStreamsParameters,
57
+ TReUpdateInterParameters = ReUpdateInterParameters,
58
+ TAllParameters extends TPrepopulateUserMediaParameters &
59
+ TReorderStreamsParameters &
60
+ TReUpdateInterParameters = TPrepopulateUserMediaParameters &
61
+ TReorderStreamsParameters &
62
+ TReUpdateInterParameters,
63
+ >
64
+ {
65
+ activeSounds: string[];
66
+ meetingDisplayType: string;
67
+ meetingVideoOptimized: boolean;
68
+ participants: TParticipant[];
69
+ oldSoundIds: string[];
70
+ shared: boolean;
71
+ shareScreenStarted: boolean;
72
+ updateMainWindow: boolean;
73
+ hostLabel: string;
74
+ islevel: string;
75
+ updateActiveSounds: (activeSounds: string[]) => void;
76
+ updateUpdateMainWindow: (updateMainWindow: boolean) => void;
77
+ reorderStreams: ProducerMediaPausedReorderStreamsType<TReorderStreamsParameters>;
78
+ prepopulateUserMedia: ProducerMediaPausedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;
79
+ reUpdateInter: ProducerMediaPausedReUpdateInterType<TReUpdateInterParameters>;
80
+ getUpdatedAllParams: () =>
81
+ ProducerMediaPausedParameters<
82
+ TParticipant,
83
+ TPrepopulateUserMediaParameters,
84
+ TReorderStreamsParameters,
85
+ TReUpdateInterParameters,
86
+ TAllParameters
87
+ > & TAllParameters;
88
+ [key: string]: any;
89
+ }
90
+
91
+ export interface ProducerMediaPausedOptions<
92
+ TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,
93
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
94
+ TReorderStreamsParameters = ReorderStreamsParameters,
95
+ TReUpdateInterParameters = ReUpdateInterParameters,
96
+ TAllParameters extends TPrepopulateUserMediaParameters &
97
+ TReorderStreamsParameters &
98
+ TReUpdateInterParameters = TPrepopulateUserMediaParameters &
99
+ TReorderStreamsParameters &
100
+ TReUpdateInterParameters,
101
+ > {
102
+ producerId: string;
103
+ kind: 'audio' | 'video' | 'screenshare' | 'screen';
104
+ name: string;
105
+ parameters:
106
+ ProducerMediaPausedParameters<
107
+ TParticipant,
108
+ TPrepopulateUserMediaParameters,
109
+ TReorderStreamsParameters,
110
+ TReUpdateInterParameters,
111
+ TAllParameters
112
+ > & TAllParameters;
113
+ }
114
+
115
+ export type ProducerMediaPausedType<
116
+ TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,
117
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
118
+ TReorderStreamsParameters = ReorderStreamsParameters,
119
+ TReUpdateInterParameters = ReUpdateInterParameters,
120
+ TAllParameters extends TPrepopulateUserMediaParameters &
121
+ TReorderStreamsParameters &
122
+ TReUpdateInterParameters = TPrepopulateUserMediaParameters &
123
+ TReorderStreamsParameters &
124
+ TReUpdateInterParameters,
125
+ > = (
126
+ options: ProducerMediaPausedOptions<
127
+ TParticipant,
128
+ TPrepopulateUserMediaParameters,
129
+ TReorderStreamsParameters,
130
+ TReUpdateInterParameters,
131
+ TAllParameters
132
+ >,
133
+ ) => Promise<void>;
134
+
135
+ /**
136
+ * Reacts to a producer pause event by reconciling waveform state, main-window media, and layout ordering.
137
+ *
138
+ * @param {ProducerMediaPausedOptions} options - Producer identity and shared room/media callbacks.
139
+ * @returns {Promise<void>} Resolves once paused-media side effects are synchronized.
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * await producerMediaPaused({
144
+ * producerId: 'abc123',
145
+ * kind: 'audio',
146
+ * name: 'Participant1',
147
+ * parameters,
148
+ * });
149
+ * ```
150
+ */
151
+ export const producerMediaPaused = async <
152
+ TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,
153
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
154
+ TReorderStreamsParameters = ReorderStreamsParameters,
155
+ TReUpdateInterParameters = ReUpdateInterParameters,
156
+ TAllParameters extends TPrepopulateUserMediaParameters &
157
+ TReorderStreamsParameters &
158
+ TReUpdateInterParameters = TPrepopulateUserMediaParameters &
159
+ TReorderStreamsParameters &
160
+ TReUpdateInterParameters,
161
+ >({
162
+ producerId,
163
+ kind,
164
+ name,
165
+ parameters,
166
+ }: ProducerMediaPausedOptions<
167
+ TParticipant,
168
+ TPrepopulateUserMediaParameters,
169
+ TReorderStreamsParameters,
170
+ TReUpdateInterParameters,
171
+ TAllParameters
172
+ >): Promise<void> => {
173
+ parameters = parameters.getUpdatedAllParams();
174
+
175
+ let {
176
+ activeSounds,
177
+ meetingDisplayType,
178
+ meetingVideoOptimized,
179
+ participants,
180
+ oldSoundIds,
181
+ shared,
182
+ shareScreenStarted,
183
+ updateMainWindow,
184
+ hostLabel,
185
+ islevel,
186
+ updateActiveSounds,
187
+ updateUpdateMainWindow,
188
+ reorderStreams,
189
+ prepopulateUserMedia,
190
+ reUpdateInter,
191
+ } = parameters;
192
+
193
+ await Promise.all(
194
+ participants.map(async (participant) => {
195
+ if (participant.muted) {
196
+ try {
197
+ if (
198
+ participant.islevel === '2' &&
199
+ !participant.videoID &&
200
+ !shared &&
201
+ !shareScreenStarted &&
202
+ islevel !== '2'
203
+ ) {
204
+ updateMainWindow = true;
205
+ updateUpdateMainWindow(updateMainWindow);
206
+ await prepopulateUserMedia({ name: hostLabel, parameters });
207
+ updateMainWindow = false;
208
+ updateUpdateMainWindow(updateMainWindow);
209
+ }
210
+ } catch {
211
+ // no-op
212
+ }
213
+
214
+ if (shareScreenStarted || shared) {
215
+ if (participant.name && activeSounds.includes(participant.name)) {
216
+ activeSounds = activeSounds.filter(
217
+ (audioStream) => audioStream !== participant.name,
218
+ );
219
+ updateActiveSounds(activeSounds);
220
+ }
221
+
222
+ reUpdateInter({
223
+ name: participant.name!,
224
+ add: false,
225
+ force: true,
226
+ parameters,
227
+ });
228
+ }
229
+ }
230
+ }),
231
+ );
232
+
233
+ if (
234
+ meetingDisplayType === 'media' ||
235
+ (meetingDisplayType === 'video' && !meetingVideoOptimized)
236
+ ) {
237
+ const participant = participants.find((item) => item.name === name);
238
+ const hasVideo = participant?.videoID !== null && participant?.videoID !== '';
239
+
240
+ if (!hasVideo && !(shareScreenStarted || shared)) {
241
+ await reorderStreams({ add: false, screenChanged: true, parameters });
242
+ }
243
+ }
244
+
245
+ if (kind === 'audio') {
246
+ try {
247
+ const participant =
248
+ participants.find((item) => item.audioID === producerId) ||
249
+ participants.find((item) => item.name === name);
250
+
251
+ if (
252
+ participant &&
253
+ ((participant.name && oldSoundIds.includes(participant.name)) ||
254
+ (name && oldSoundIds.includes(name)))
255
+ ) {
256
+ reUpdateInter({
257
+ name: participant.name!,
258
+ add: false,
259
+ force: true,
260
+ parameters,
261
+ });
262
+ }
263
+ } catch {
264
+ // no-op
265
+ }
266
+ }
267
+ };
@@ -0,0 +1,157 @@
1
+ import type {
2
+ PrepopulateUserMediaParameters,
3
+ ReorderStreamsParameters,
4
+ } from '../../types/types';
5
+
6
+ export interface ProducerMediaResumedPrepopulateUserMediaOptions<
7
+ TParameters = unknown,
8
+ > {
9
+ name: string;
10
+ parameters: TParameters;
11
+ }
12
+
13
+ export type ProducerMediaResumedPrepopulateUserMediaType<
14
+ TParameters = unknown,
15
+ > = (
16
+ options: ProducerMediaResumedPrepopulateUserMediaOptions<TParameters>,
17
+ ) => Promise<unknown>;
18
+
19
+ export interface ProducerMediaResumedReorderStreamsOptions<
20
+ TParameters = unknown,
21
+ > {
22
+ add: boolean;
23
+ screenChanged?: boolean;
24
+ parameters: TParameters;
25
+ }
26
+
27
+ export type ProducerMediaResumedReorderStreamsType<TParameters = unknown> = (
28
+ options: ProducerMediaResumedReorderStreamsOptions<TParameters>,
29
+ ) => Promise<unknown>;
30
+
31
+ export interface ProducerMediaResumedParticipantLike {
32
+ name?: string | null;
33
+ islevel?: string | null;
34
+ videoID?: string | null;
35
+ }
36
+
37
+ export interface ProducerMediaResumedParameters<
38
+ TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,
39
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
40
+ TReorderStreamsParameters = ReorderStreamsParameters,
41
+ TAllParameters extends TPrepopulateUserMediaParameters &
42
+ TReorderStreamsParameters = TPrepopulateUserMediaParameters &
43
+ TReorderStreamsParameters,
44
+ > {
45
+ meetingDisplayType: string;
46
+ participants: TParticipant[];
47
+ shared: boolean;
48
+ shareScreenStarted: boolean;
49
+ mainScreenFilled: boolean;
50
+ hostLabel: string;
51
+ updateUpdateMainWindow: (updateMainWindow: boolean) => void;
52
+ reorderStreams: ProducerMediaResumedReorderStreamsType<TReorderStreamsParameters>;
53
+ prepopulateUserMedia: ProducerMediaResumedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;
54
+ getUpdatedAllParams: () =>
55
+ ProducerMediaResumedParameters<
56
+ TParticipant,
57
+ TPrepopulateUserMediaParameters,
58
+ TReorderStreamsParameters,
59
+ TAllParameters
60
+ > & TAllParameters;
61
+ [key: string]: any;
62
+ }
63
+
64
+ export interface ProducerMediaResumedOptions<
65
+ TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,
66
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
67
+ TReorderStreamsParameters = ReorderStreamsParameters,
68
+ TAllParameters extends TPrepopulateUserMediaParameters &
69
+ TReorderStreamsParameters = TPrepopulateUserMediaParameters &
70
+ TReorderStreamsParameters,
71
+ > {
72
+ name: string;
73
+ kind: 'audio';
74
+ parameters:
75
+ ProducerMediaResumedParameters<
76
+ TParticipant,
77
+ TPrepopulateUserMediaParameters,
78
+ TReorderStreamsParameters,
79
+ TAllParameters
80
+ > & TAllParameters;
81
+ }
82
+
83
+ export type ProducerMediaResumedType<
84
+ TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,
85
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
86
+ TReorderStreamsParameters = ReorderStreamsParameters,
87
+ TAllParameters extends TPrepopulateUserMediaParameters &
88
+ TReorderStreamsParameters = TPrepopulateUserMediaParameters &
89
+ TReorderStreamsParameters,
90
+ > = (
91
+ options: ProducerMediaResumedOptions<
92
+ TParticipant,
93
+ TPrepopulateUserMediaParameters,
94
+ TReorderStreamsParameters,
95
+ TAllParameters
96
+ >,
97
+ ) => Promise<void>;
98
+
99
+ /**
100
+ * Restores paused producer media state and refills the main window when needed.
101
+ *
102
+ * @param {ProducerMediaResumedOptions} options - Producer identity and shared room/media callbacks.
103
+ * @returns {Promise<void>} Resolves once the resumed-media UI state is synchronized.
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * await producerMediaResumed({
108
+ * name: 'John Doe',
109
+ * kind: 'audio',
110
+ * parameters,
111
+ * });
112
+ * ```
113
+ */
114
+ export const producerMediaResumed = async <
115
+ TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,
116
+ TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
117
+ TReorderStreamsParameters = ReorderStreamsParameters,
118
+ TAllParameters extends TPrepopulateUserMediaParameters &
119
+ TReorderStreamsParameters = TPrepopulateUserMediaParameters &
120
+ TReorderStreamsParameters,
121
+ >({
122
+ name,
123
+ parameters,
124
+ }: ProducerMediaResumedOptions<
125
+ TParticipant,
126
+ TPrepopulateUserMediaParameters,
127
+ TReorderStreamsParameters,
128
+ TAllParameters
129
+ >): Promise<void> => {
130
+ const {
131
+ meetingDisplayType,
132
+ participants,
133
+ shared,
134
+ shareScreenStarted,
135
+ mainScreenFilled,
136
+ hostLabel,
137
+ updateUpdateMainWindow,
138
+ reorderStreams,
139
+ prepopulateUserMedia,
140
+ } = parameters;
141
+
142
+ const participant = participants.find((item) => item.name === name);
143
+
144
+ if (participant && !mainScreenFilled && participant.islevel === '2') {
145
+ updateUpdateMainWindow(true);
146
+ await prepopulateUserMedia({ name: hostLabel, parameters });
147
+ updateUpdateMainWindow(false);
148
+ }
149
+
150
+ if (meetingDisplayType === 'media' && participant) {
151
+ const hasVideo = participant.videoID !== null && participant.videoID !== '';
152
+
153
+ if (!hasVideo && !(shareScreenStarted || shared)) {
154
+ await reorderStreams({ add: false, screenChanged: true, parameters });
155
+ }
156
+ }
157
+ };
@@ -0,0 +1,53 @@
1
+ export interface ReInitiateRecordingSocketLike {
2
+ emit: (
3
+ event: string,
4
+ payload: { roomName: string; member: string },
5
+ callback?: (response: { success: boolean }) => void,
6
+ ) => void;
7
+ }
8
+
9
+ export interface ReInitiateRecordingOptions {
10
+ roomName: string;
11
+ member: string;
12
+ socket: ReInitiateRecordingSocketLike;
13
+ adminRestrictSetting: boolean;
14
+ }
15
+
16
+ export type ReInitiateRecordingType = (
17
+ options: ReInitiateRecordingOptions,
18
+ ) => Promise<void>;
19
+
20
+ /**
21
+ * Re-requests recording startup when host controls allow it.
22
+ *
23
+ * @param {ReInitiateRecordingOptions} options - Room identity, socket, and admin restriction state.
24
+ * @returns {Promise<void>} Resolves after the emit request is sent or skipped.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * await reInitiateRecording({
29
+ * roomName: 'exampleRoom',
30
+ * member: 'adminUser',
31
+ * socket,
32
+ * adminRestrictSetting: false,
33
+ * });
34
+ * ```
35
+ */
36
+ export const reInitiateRecording = async ({
37
+ roomName,
38
+ member,
39
+ socket,
40
+ adminRestrictSetting,
41
+ }: ReInitiateRecordingOptions): Promise<void> => {
42
+ if (!adminRestrictSetting) {
43
+ socket.emit(
44
+ 'startRecordIng',
45
+ { roomName, member },
46
+ ({ success }: { success: boolean }) => {
47
+ if (!success) {
48
+ // no-op: caller-controlled UX
49
+ }
50
+ },
51
+ );
52
+ }
53
+ };
@@ -0,0 +1,117 @@
1
+ import type { EventType, Message, Participant } from '../../types/types';
2
+
3
+ export interface ReceiveMessageOptions {
4
+ message: Message;
5
+ messages: Message[];
6
+ participantsAll: Participant[];
7
+ member: string;
8
+ eventType: EventType;
9
+ islevel: string;
10
+ coHost: string;
11
+ updateMessages: (messages: Message[]) => void;
12
+ updateShowMessagesBadge: (showBadge: boolean) => void;
13
+ }
14
+
15
+ export type ReceiveMessageType = (options: ReceiveMessageOptions) => Promise<void>;
16
+
17
+ /**
18
+ * Appends an inbound chat message, filters banned senders, and updates unread badge state.
19
+ *
20
+ * @param {ReceiveMessageOptions} options - Message payload, participant state, and update callbacks.
21
+ * @returns {Promise<void>} Resolves after message state is reconciled.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * await receiveMessage({
26
+ * message,
27
+ * messages,
28
+ * participantsAll,
29
+ * member: 'Ada',
30
+ * eventType: 'conference',
31
+ * islevel: '1',
32
+ * coHost: '',
33
+ * updateMessages: setMessages,
34
+ * updateShowMessagesBadge: setShowMessagesBadge,
35
+ * });
36
+ * ```
37
+ */
38
+ export const receiveMessage = async ({
39
+ message,
40
+ messages,
41
+ participantsAll,
42
+ member,
43
+ eventType,
44
+ islevel,
45
+ coHost,
46
+ updateMessages,
47
+ updateShowMessagesBadge,
48
+ }: ReceiveMessageOptions): Promise<void> => {
49
+ const { sender, receivers, message: content, timestamp, group } = message;
50
+ const oldMessages = messages;
51
+ messages = [...messages, { sender, receivers, message: content, timestamp, group }];
52
+
53
+ if (eventType !== 'broadcast' && eventType !== 'chat') {
54
+ messages = messages.filter((msg) =>
55
+ participantsAll.some(
56
+ (participant) => participant.name === msg.sender && !participant.isBanned,
57
+ ),
58
+ );
59
+ } else {
60
+ messages = messages.filter((msg) => {
61
+ const participant = participantsAll.find((p) => p.name === msg.sender);
62
+ return !participant || !participant.isBanned;
63
+ });
64
+ }
65
+
66
+ updateMessages(messages);
67
+
68
+ const oldGroupMessages = oldMessages.filter((msg) => msg.group);
69
+ const oldDirectMessages = oldMessages.filter((msg) => !msg.group);
70
+ const groupMessages = messages.filter((msg) => msg.group);
71
+ const directMessages = messages.filter((msg) => !msg.group);
72
+
73
+ if (eventType !== 'broadcast' && eventType !== 'chat') {
74
+ if (oldGroupMessages.length !== groupMessages.length) {
75
+ const newGroupMessages = groupMessages.filter(
76
+ (msg) => !oldGroupMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp),
77
+ );
78
+ const relevantGroupMessages = newGroupMessages.filter(
79
+ (msg) => msg.sender === member || msg.receivers.includes(member),
80
+ );
81
+ const selfSentGroupMessages = relevantGroupMessages.filter(
82
+ (msg) => msg.sender === member,
83
+ );
84
+
85
+ if (
86
+ newGroupMessages.length > 0 &&
87
+ relevantGroupMessages.length > selfSentGroupMessages.length
88
+ ) {
89
+ updateShowMessagesBadge(true);
90
+ }
91
+ }
92
+
93
+ if (oldDirectMessages.length !== directMessages.length) {
94
+ const newDirectMessages = directMessages.filter(
95
+ (msg) => !oldDirectMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp),
96
+ );
97
+ const relevantDirectMessages = newDirectMessages.filter(
98
+ (msg) => msg.sender === member || msg.receivers.includes(member),
99
+ );
100
+ const selfSentDirectMessages = relevantDirectMessages.filter(
101
+ (msg) => msg.sender === member,
102
+ );
103
+
104
+ const isPrivileged = islevel === '2' || coHost === member;
105
+ const hasRelevantDirectMessages = isPrivileged
106
+ ? newDirectMessages.length > 0
107
+ : relevantDirectMessages.length > 0;
108
+
109
+ if (
110
+ hasRelevantDirectMessages &&
111
+ newDirectMessages.length > selfSentDirectMessages.length
112
+ ) {
113
+ updateShowMessagesBadge(true);
114
+ }
115
+ }
116
+ }
117
+ };