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,286 @@
1
+ import type { EventType, UserRecordingParams } from '../../types/types';
2
+ import { SoundPlayer, type SoundPlayerType } from '../utils/SoundPlayer';
3
+
4
+ export interface RecordingNoticeUserRecordingParamsLike {
5
+ mainSpecs: {
6
+ mediaOptions: string;
7
+ audioOptions: string;
8
+ videoOptions: string;
9
+ videoType: string;
10
+ videoOptimized: boolean;
11
+ recordingDisplayType: 'video' | 'media' | 'all';
12
+ addHLS: boolean;
13
+ };
14
+ dispSpecs: {
15
+ nameTags: boolean;
16
+ backgroundColor: string;
17
+ nameTagsColor: string;
18
+ orientationVideo: string;
19
+ };
20
+ textSpecs?: {
21
+ addText?: boolean;
22
+ customText?: string;
23
+ customTextPosition?: string;
24
+ customTextColor?: string;
25
+ };
26
+ }
27
+
28
+ export interface RecordingNoticeParameters<
29
+ TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,
30
+ TEventType = EventType,
31
+ > {
32
+ islevel: string;
33
+ userRecordingParams: TUserRecordingParams;
34
+ pauseRecordCount?: number;
35
+ recordElapsedTime: number;
36
+ recordStartTime: number;
37
+ recordStarted: boolean;
38
+ recordPaused: boolean;
39
+ canLaunchRecord: boolean;
40
+ stopLaunchRecord: boolean;
41
+ recordStopped: boolean;
42
+ isTimerRunning: boolean;
43
+ canPauseResume: boolean;
44
+ eventType: TEventType;
45
+ updateRecordingProgressTime: (time: string) => void;
46
+ updateShowRecordButtons: (show: boolean) => void;
47
+ updateUserRecordingParams: (params: TUserRecordingParams) => void;
48
+ updateRecordingMediaOptions: (options: string) => void;
49
+ updateRecordingAudioOptions: (options: string) => void;
50
+ updateRecordingVideoOptions: (options: string) => void;
51
+ updateRecordingVideoType: (type: string) => void;
52
+ updateRecordingVideoOptimized: (optimized: boolean) => void;
53
+ updateRecordingDisplayType: (type: 'video' | 'media' | 'all') => void;
54
+ updateRecordingAddHLS: (addHLS: boolean) => void;
55
+ updateRecordingNameTags: (nameTags: boolean) => void;
56
+ updateRecordingBackgroundColor: (color: string) => void;
57
+ updateRecordingNameTagsColor: (color: string) => void;
58
+ updateRecordingOrientationVideo: (orientation: string) => void;
59
+ updateRecordingAddText: (addText: boolean) => void;
60
+ updateRecordingCustomText: (text: string) => void;
61
+ updateRecordingCustomTextPosition: (position: string) => void;
62
+ updateRecordingCustomTextColor: (color: string) => void;
63
+ updatePauseRecordCount: (count: number) => void;
64
+ updateRecordElapsedTime: (time: number) => void;
65
+ updateRecordStarted: (started: boolean) => void;
66
+ updateRecordPaused: (paused: boolean) => void;
67
+ updateCanLaunchRecord: (canLaunch: boolean) => void;
68
+ updateStopLaunchRecord: (stop: boolean) => void;
69
+ updateRecordStopped: (stopped: boolean) => void;
70
+ updateIsTimerRunning: (running: boolean) => void;
71
+ updateCanPauseResume: (canPause: boolean) => void;
72
+ updateRecordStartTime: (startTime: number) => void;
73
+ updateRecordState: (state: string) => void;
74
+ [key: string]: any;
75
+ }
76
+
77
+ export interface RecordingNoticeOptions<
78
+ TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,
79
+ TEventType = EventType,
80
+ > {
81
+ state: string;
82
+ userRecordingParam: TUserRecordingParams | null;
83
+ pauseCount: number;
84
+ timeDone: number;
85
+ parameters: RecordingNoticeParameters<TUserRecordingParams, TEventType>;
86
+ soundPlayer?: SoundPlayerType;
87
+ }
88
+
89
+ export type RecordingNoticeType<
90
+ TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,
91
+ TEventType = EventType,
92
+ > = (
93
+ options: RecordingNoticeOptions<TUserRecordingParams, TEventType>,
94
+ ) => Promise<void>;
95
+
96
+ /**
97
+ * Reconciles recording state updates, user recording settings, and progress UI after a recording socket notice.
98
+ *
99
+ * @param {RecordingNoticeOptions} options - Recording state payload and room-level update callbacks.
100
+ * @returns {Promise<void>} Resolves once recording state, UI flags, and progress text are synchronized.
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * await recordingNotice({
105
+ * state: 'pause',
106
+ * userRecordingParam,
107
+ * pauseCount: 2,
108
+ * timeDone: 3600,
109
+ * parameters,
110
+ * });
111
+ * ```
112
+ */
113
+ export const recordingNotice = async <
114
+ TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,
115
+ TEventType = EventType,
116
+ >({
117
+ state,
118
+ userRecordingParam,
119
+ pauseCount,
120
+ timeDone,
121
+ parameters,
122
+ soundPlayer,
123
+ }: RecordingNoticeOptions<TUserRecordingParams, TEventType>): Promise<void> => {
124
+ let {
125
+ islevel,
126
+ userRecordingParams,
127
+ pauseRecordCount,
128
+ recordElapsedTime,
129
+ recordStartTime,
130
+ recordStarted,
131
+ recordPaused,
132
+ canLaunchRecord,
133
+ stopLaunchRecord,
134
+ recordStopped,
135
+ isTimerRunning,
136
+ canPauseResume,
137
+ eventType,
138
+ updateRecordingProgressTime,
139
+ updateShowRecordButtons,
140
+ updateUserRecordingParams,
141
+ updateRecordingMediaOptions,
142
+ updateRecordingAudioOptions,
143
+ updateRecordingVideoOptions,
144
+ updateRecordingVideoType,
145
+ updateRecordingVideoOptimized,
146
+ updateRecordingDisplayType,
147
+ updateRecordingAddHLS,
148
+ updateRecordingNameTags,
149
+ updateRecordingBackgroundColor,
150
+ updateRecordingNameTagsColor,
151
+ updateRecordingOrientationVideo,
152
+ updateRecordingAddText,
153
+ updateRecordingCustomText,
154
+ updateRecordingCustomTextPosition,
155
+ updateRecordingCustomTextColor,
156
+ updatePauseRecordCount,
157
+ updateRecordElapsedTime,
158
+ updateRecordStartTime,
159
+ updateRecordStarted,
160
+ updateRecordPaused,
161
+ updateCanLaunchRecord,
162
+ updateStopLaunchRecord,
163
+ updateRecordStopped,
164
+ updateIsTimerRunning,
165
+ updateCanPauseResume,
166
+ updateRecordState,
167
+ } = parameters;
168
+
169
+ const playSound = async (soundUrl: string): Promise<void> => {
170
+ await (soundPlayer ?? SoundPlayer)({ soundUrl });
171
+ };
172
+
173
+ try {
174
+ if (islevel !== '2') {
175
+ if (state === 'pause') {
176
+ updateRecordStarted(true);
177
+ updateRecordPaused(true);
178
+ updateRecordState('yellow');
179
+ if (eventType !== 'broadcast') {
180
+ await playSound('https://www.mediasfu.com/sounds/record-paused.mp3');
181
+ }
182
+ } else if (state === 'stop') {
183
+ updateRecordStarted(true);
184
+ updateRecordStopped(true);
185
+ updateRecordState('green');
186
+ if (eventType !== 'broadcast') {
187
+ await playSound('https://www.mediasfu.com/sounds/record-stopped.mp3');
188
+ }
189
+ } else {
190
+ updateRecordState('red');
191
+ updateRecordStarted(true);
192
+ updateRecordPaused(false);
193
+ if (eventType !== 'broadcast') {
194
+ await playSound('https://www.mediasfu.com/sounds/record-progress.mp3');
195
+ }
196
+ }
197
+ } else {
198
+ if (state === 'pause') {
199
+ updateRecordState('yellow');
200
+ if (userRecordingParam) {
201
+ userRecordingParams.mainSpecs = userRecordingParam.mainSpecs;
202
+ userRecordingParams.dispSpecs = userRecordingParam.dispSpecs;
203
+ userRecordingParams.textSpecs = userRecordingParam.textSpecs;
204
+
205
+ updateUserRecordingParams(userRecordingParams);
206
+ updateRecordingMediaOptions(userRecordingParams.mainSpecs.mediaOptions);
207
+ updateRecordingAudioOptions(userRecordingParams.mainSpecs.audioOptions);
208
+ updateRecordingVideoOptions(userRecordingParams.mainSpecs.videoOptions);
209
+ updateRecordingVideoType(userRecordingParams.mainSpecs.videoType);
210
+ updateRecordingVideoOptimized(userRecordingParams.mainSpecs.videoOptimized);
211
+ updateRecordingDisplayType(userRecordingParams.mainSpecs.recordingDisplayType);
212
+ updateRecordingAddHLS(userRecordingParams.mainSpecs.addHLS);
213
+ updateRecordingNameTags(userRecordingParams.dispSpecs.nameTags);
214
+ updateRecordingBackgroundColor(userRecordingParams.dispSpecs.backgroundColor);
215
+ updateRecordingNameTagsColor(userRecordingParams.dispSpecs.nameTagsColor);
216
+ updateRecordingOrientationVideo(userRecordingParams.dispSpecs.orientationVideo);
217
+ updateRecordingAddText(userRecordingParams.textSpecs?.addText ?? false);
218
+ updateRecordingCustomText(userRecordingParams.textSpecs?.customText ?? '');
219
+ updateRecordingCustomTextPosition(
220
+ userRecordingParams.textSpecs?.customTextPosition ?? '',
221
+ );
222
+ updateRecordingCustomTextColor(
223
+ userRecordingParams.textSpecs?.customTextColor ?? '',
224
+ );
225
+
226
+ pauseRecordCount = pauseCount;
227
+ updatePauseRecordCount(pauseRecordCount);
228
+
229
+ recordElapsedTime = Math.floor(timeDone / 1000);
230
+ recordStartTime = Math.floor(Date.now() / 1000) - recordElapsedTime;
231
+ updateRecordStartTime(recordStartTime);
232
+ updateRecordElapsedTime(recordElapsedTime);
233
+
234
+ recordStarted = true;
235
+ recordPaused = true;
236
+ canLaunchRecord = false;
237
+ recordStopped = false;
238
+
239
+ updateRecordStarted(recordStarted);
240
+ updateRecordPaused(recordPaused);
241
+ updateCanLaunchRecord(canLaunchRecord);
242
+ updateRecordStopped(recordStopped);
243
+ updateShowRecordButtons(true);
244
+
245
+ isTimerRunning = false;
246
+ canPauseResume = true;
247
+
248
+ updateIsTimerRunning(isTimerRunning);
249
+ updateCanPauseResume(canPauseResume);
250
+ updateRecordingProgressTime(formatElapsedTime(recordElapsedTime));
251
+ }
252
+ await playSound('https://www.mediasfu.com/sounds/record-paused.mp3');
253
+ } else if (state === 'stop') {
254
+ recordStarted = true;
255
+ recordStopped = true;
256
+ canLaunchRecord = false;
257
+ stopLaunchRecord = true;
258
+
259
+ updateRecordStarted(recordStarted);
260
+ updateRecordStopped(recordStopped);
261
+ updateCanLaunchRecord(canLaunchRecord);
262
+ updateStopLaunchRecord(stopLaunchRecord);
263
+ updateShowRecordButtons(false);
264
+ updateRecordState('green');
265
+ await playSound('https://www.mediasfu.com/sounds/record-stopped.mp3');
266
+ } else {
267
+ updateRecordState('red');
268
+ updateRecordStarted(true);
269
+ updateRecordPaused(false);
270
+ await playSound('https://www.mediasfu.com/sounds/record-progress.mp3');
271
+ }
272
+ }
273
+ } catch (error) {
274
+ console.log('Error in RecordingNotice: ', error);
275
+ }
276
+ };
277
+
278
+ const formatElapsedTime = (recordElapsedTime: number): string => {
279
+ const hours = Math.floor(recordElapsedTime / 3600);
280
+ const minutes = Math.floor((recordElapsedTime % 3600) / 60);
281
+ const seconds = recordElapsedTime % 60;
282
+
283
+ return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;
284
+ };
285
+
286
+ const padNumber = (value: number): string => value.toString().padStart(2, '0');
@@ -0,0 +1,122 @@
1
+ export interface RecordParams {
2
+ recordingAudioPausesLimit: number;
3
+ recordingAudioPausesCount: number;
4
+ recordingAudioSupport: boolean;
5
+ recordingAudioPeopleLimit: number;
6
+ recordingAudioParticipantsTimeLimit: number;
7
+ recordingVideoPausesCount: number;
8
+ recordingVideoPausesLimit: number;
9
+ recordingVideoSupport: boolean;
10
+ recordingVideoPeopleLimit: number;
11
+ recordingVideoParticipantsTimeLimit: number;
12
+ recordingAllParticipantsSupport: boolean;
13
+ recordingVideoParticipantsSupport: boolean;
14
+ recordingAllParticipantsFullRoomSupport: boolean;
15
+ recordingVideoParticipantsFullRoomSupport: boolean;
16
+ recordingPreferredOrientation: string;
17
+ recordingSupportForOtherOrientation: boolean;
18
+ recordingMultiFormatsSupport: boolean;
19
+ }
20
+
21
+ export interface RoomRecordParamsParameters {
22
+ updateRecordingAudioPausesLimit: (value: number) => void;
23
+ updateRecordingAudioPausesCount: (value: number) => void;
24
+ updateRecordingAudioSupport: (value: boolean) => void;
25
+ updateRecordingAudioPeopleLimit: (value: number) => void;
26
+ updateRecordingAudioParticipantsTimeLimit: (value: number) => void;
27
+ updateRecordingVideoPausesCount: (value: number) => void;
28
+ updateRecordingVideoPausesLimit: (value: number) => void;
29
+ updateRecordingVideoSupport: (value: boolean) => void;
30
+ updateRecordingVideoPeopleLimit: (value: number) => void;
31
+ updateRecordingVideoParticipantsTimeLimit: (value: number) => void;
32
+ updateRecordingAllParticipantsSupport: (value: boolean) => void;
33
+ updateRecordingVideoParticipantsSupport: (value: boolean) => void;
34
+ updateRecordingAllParticipantsFullRoomSupport: (value: boolean) => void;
35
+ updateRecordingVideoParticipantsFullRoomSupport: (value: boolean) => void;
36
+ updateRecordingPreferredOrientation: (value: string) => void;
37
+ updateRecordingSupportForOtherOrientation: (value: boolean) => void;
38
+ updateRecordingMultiFormatsSupport: (value: boolean) => void;
39
+ [key: string]: any;
40
+ }
41
+
42
+ export interface RoomRecordParamsOptions {
43
+ recordParams: RecordParams;
44
+ parameters: RoomRecordParamsParameters;
45
+ }
46
+
47
+ export type RoomRecordParamsType = (
48
+ options: RoomRecordParamsOptions,
49
+ ) => Promise<void>;
50
+
51
+ /**
52
+ * Applies room-level recording capability limits and toggles to UI state.
53
+ *
54
+ * @param {RoomRecordParamsOptions} options - Recording capability payload and setters.
55
+ * @returns {Promise<void>} Resolves after all setters are applied.
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * await roomRecordParams({
60
+ * recordParams,
61
+ * parameters: recordingSetters,
62
+ * });
63
+ * ```
64
+ */
65
+ export const roomRecordParams = async ({
66
+ recordParams,
67
+ parameters,
68
+ }: RoomRecordParamsOptions): Promise<void> => {
69
+ const {
70
+ updateRecordingAudioPausesLimit,
71
+ updateRecordingAudioPausesCount,
72
+ updateRecordingAudioSupport,
73
+ updateRecordingAudioPeopleLimit,
74
+ updateRecordingAudioParticipantsTimeLimit,
75
+ updateRecordingVideoPausesCount,
76
+ updateRecordingVideoPausesLimit,
77
+ updateRecordingVideoSupport,
78
+ updateRecordingVideoPeopleLimit,
79
+ updateRecordingVideoParticipantsTimeLimit,
80
+ updateRecordingAllParticipantsSupport,
81
+ updateRecordingVideoParticipantsSupport,
82
+ updateRecordingAllParticipantsFullRoomSupport,
83
+ updateRecordingVideoParticipantsFullRoomSupport,
84
+ updateRecordingPreferredOrientation,
85
+ updateRecordingSupportForOtherOrientation,
86
+ updateRecordingMultiFormatsSupport,
87
+ } = parameters;
88
+
89
+ updateRecordingAudioPausesLimit(recordParams.recordingAudioPausesLimit);
90
+ updateRecordingAudioPausesCount(recordParams.recordingAudioPausesCount);
91
+ updateRecordingAudioSupport(recordParams.recordingAudioSupport);
92
+ updateRecordingAudioPeopleLimit(recordParams.recordingAudioPeopleLimit);
93
+ updateRecordingAudioParticipantsTimeLimit(
94
+ recordParams.recordingAudioParticipantsTimeLimit,
95
+ );
96
+ updateRecordingVideoPausesCount(recordParams.recordingVideoPausesCount);
97
+ updateRecordingVideoPausesLimit(recordParams.recordingVideoPausesLimit);
98
+ updateRecordingVideoSupport(recordParams.recordingVideoSupport);
99
+ updateRecordingVideoPeopleLimit(recordParams.recordingVideoPeopleLimit);
100
+ updateRecordingVideoParticipantsTimeLimit(
101
+ recordParams.recordingVideoParticipantsTimeLimit,
102
+ );
103
+ updateRecordingAllParticipantsSupport(
104
+ recordParams.recordingAllParticipantsSupport,
105
+ );
106
+ updateRecordingVideoParticipantsSupport(
107
+ recordParams.recordingVideoParticipantsSupport,
108
+ );
109
+ updateRecordingAllParticipantsFullRoomSupport(
110
+ recordParams.recordingAllParticipantsFullRoomSupport,
111
+ );
112
+ updateRecordingVideoParticipantsFullRoomSupport(
113
+ recordParams.recordingVideoParticipantsFullRoomSupport,
114
+ );
115
+ updateRecordingPreferredOrientation(
116
+ recordParams.recordingPreferredOrientation,
117
+ );
118
+ updateRecordingSupportForOtherOrientation(
119
+ recordParams.recordingSupportForOtherOrientation,
120
+ );
121
+ updateRecordingMultiFormatsSupport(recordParams.recordingMultiFormatsSupport);
122
+ };
@@ -0,0 +1,61 @@
1
+ import type { Participant } from '../../types/types';
2
+
3
+ export interface ScreenProducerIdOptions {
4
+ producerId: string;
5
+ screenId: string;
6
+ membersReceived: boolean;
7
+ shareScreenStarted: boolean;
8
+ deferScreenReceived: boolean;
9
+ participants: Participant[];
10
+ updateScreenId: (id: string) => void;
11
+ updateShareScreenStarted: (started: boolean) => void;
12
+ updateDeferScreenReceived: (received: boolean) => void;
13
+ }
14
+
15
+ export type ScreenProducerIdType = (options: ScreenProducerIdOptions) => void;
16
+
17
+ /**
18
+ * Reconciles a screen-share producer id with current participant state.
19
+ *
20
+ * @param {ScreenProducerIdOptions} options - Screen-share identifiers and setters.
21
+ * @returns {void} Updates screen state synchronously.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * screenProducerId({
26
+ * producerId: 'screen-producer',
27
+ * screenId: 'host-screen',
28
+ * membersReceived: true,
29
+ * shareScreenStarted: false,
30
+ * deferScreenReceived: false,
31
+ * participants,
32
+ * updateScreenId: setScreenId,
33
+ * updateShareScreenStarted: setShareScreenStarted,
34
+ * updateDeferScreenReceived: setDeferScreenReceived,
35
+ * });
36
+ * ```
37
+ */
38
+ export const screenProducerId = ({
39
+ producerId,
40
+ screenId,
41
+ membersReceived,
42
+ participants,
43
+ updateScreenId,
44
+ updateShareScreenStarted,
45
+ updateDeferScreenReceived,
46
+ }: ScreenProducerIdOptions): void => {
47
+ const host = participants.find(
48
+ (participant) =>
49
+ participant.ScreenID === screenId && participant.ScreenOn === true,
50
+ );
51
+
52
+ if (host && membersReceived) {
53
+ updateScreenId(producerId);
54
+ updateShareScreenStarted(true);
55
+ updateDeferScreenReceived(false);
56
+ return;
57
+ }
58
+
59
+ updateScreenId(producerId);
60
+ updateDeferScreenReceived(true);
61
+ };
@@ -0,0 +1,46 @@
1
+ export interface StartRecordsSocketLike {
2
+ emit: (
3
+ event: string,
4
+ payload: { roomName: string; member: string },
5
+ callback?: (response: { success: boolean }) => void,
6
+ ) => void;
7
+ }
8
+
9
+ export interface StartRecordsOptions {
10
+ roomName: string;
11
+ member: string;
12
+ socket: StartRecordsSocketLike;
13
+ }
14
+
15
+ export type StartRecordsType = (options: StartRecordsOptions) => Promise<void>;
16
+
17
+ /**
18
+ * Requests recording startup for the current room.
19
+ *
20
+ * @param {StartRecordsOptions} options - Room, member, and socket details.
21
+ * @returns {Promise<void>} Resolves after the emit request is sent.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * await startRecords({
26
+ * roomName: 'RoomA',
27
+ * member: 'AdminUser',
28
+ * socket,
29
+ * });
30
+ * ```
31
+ */
32
+ export const startRecords = async ({
33
+ roomName,
34
+ member,
35
+ socket,
36
+ }: StartRecordsOptions): Promise<void> => {
37
+ socket.emit(
38
+ 'startRecordIng',
39
+ { roomName, member },
40
+ ({ success }: { success: boolean }) => {
41
+ if (!success) {
42
+ // no-op: caller-controlled UX
43
+ }
44
+ },
45
+ );
46
+ };
@@ -0,0 +1,44 @@
1
+ import type { ShowAlert } from '../../types/types';
2
+
3
+ export interface StoppedRecordingOptions {
4
+ state: string;
5
+ reason: string;
6
+ showAlert?: ShowAlert;
7
+ }
8
+
9
+ export type StoppedRecordingType = (
10
+ options: StoppedRecordingOptions,
11
+ ) => Promise<void>;
12
+
13
+ /**
14
+ * Shows a reasoned alert when the backend reports that recording has stopped.
15
+ *
16
+ * @param {StoppedRecordingOptions} options - Recording stop state and alert helper.
17
+ * @returns {Promise<void>} Resolves after the alert is dispatched.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * await stoppedRecording({
22
+ * state: 'stop',
23
+ * reason: 'The session ended',
24
+ * showAlert,
25
+ * });
26
+ * ```
27
+ */
28
+ export const stoppedRecording = async ({
29
+ state,
30
+ reason,
31
+ showAlert,
32
+ }: StoppedRecordingOptions): Promise<void> => {
33
+ try {
34
+ if (state === 'stop') {
35
+ showAlert?.({
36
+ message: `The recording has stopped - ${reason}.`,
37
+ duration: 3000,
38
+ type: 'danger',
39
+ });
40
+ }
41
+ } catch (error) {
42
+ console.log('Error in stoppedRecording: ', error);
43
+ }
44
+ };