mediasfu-shared 1.0.0

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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/index.cjs +7707 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.ts +7285 -0
  6. package/dist/index.js +7690 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +78 -0
  9. package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +68 -0
  10. package/src/consumers/addVideosGrid.ts +18 -0
  11. package/src/consumers/autoAdjust.ts +100 -0
  12. package/src/consumers/calculateRowsAndColumns.ts +51 -0
  13. package/src/consumers/changeVids.ts +753 -0
  14. package/src/consumers/checkGrid.ts +100 -0
  15. package/src/consumers/checkPermission.ts +89 -0
  16. package/src/consumers/checkScreenShare.ts +114 -0
  17. package/src/consumers/closeAndResize.ts +401 -0
  18. package/src/consumers/compareActiveNames.ts +122 -0
  19. package/src/consumers/compareScreenStates.ts +117 -0
  20. package/src/consumers/connectIps.ts +175 -0
  21. package/src/consumers/connectLocalIps.ts +103 -0
  22. package/src/consumers/connectRecvTransport.ts +158 -0
  23. package/src/consumers/connectSendTransport.ts +150 -0
  24. package/src/consumers/connectSendTransportAudio.ts +161 -0
  25. package/src/consumers/connectSendTransportScreen.ts +169 -0
  26. package/src/consumers/connectSendTransportVideo.ts +149 -0
  27. package/src/consumers/consumerResume.ts +25 -0
  28. package/src/consumers/controlMedia.ts +118 -0
  29. package/src/consumers/createSendTransport.ts +312 -0
  30. package/src/consumers/disconnectSendTransportAudio.ts +170 -0
  31. package/src/consumers/disconnectSendTransportScreen.ts +130 -0
  32. package/src/consumers/disconnectSendTransportVideo.ts +161 -0
  33. package/src/consumers/dispStreams.ts +694 -0
  34. package/src/consumers/generatePageContent.ts +118 -0
  35. package/src/consumers/getEstimate.ts +124 -0
  36. package/src/consumers/getPipedProducersAlt.ts +96 -0
  37. package/src/consumers/getProducersPiped.ts +89 -0
  38. package/src/consumers/getVideos.ts +107 -0
  39. package/src/consumers/mixStreams.ts +97 -0
  40. package/src/consumers/onScreenChanges.ts +106 -0
  41. package/src/consumers/prepopulateUserMedia.ts +18 -0
  42. package/src/consumers/processConsumerTransports.ts +157 -0
  43. package/src/consumers/processConsumerTransportsAudio.ts +121 -0
  44. package/src/consumers/rePort.ts +123 -0
  45. package/src/consumers/reUpdateInter.ts +289 -0
  46. package/src/consumers/readjust.ts +170 -0
  47. package/src/consumers/receiveAllPipedTransports.ts +77 -0
  48. package/src/consumers/receiveRoomMessages.ts +55 -0
  49. package/src/consumers/reorderStreams.ts +246 -0
  50. package/src/consumers/requestScreenShare.ts +103 -0
  51. package/src/consumers/resumePauseAudioStreams.ts +174 -0
  52. package/src/consumers/resumePauseStreams.ts +110 -0
  53. package/src/consumers/resumeSendTransportAudio.ts +143 -0
  54. package/src/consumers/signalNewConsumerTransport.ts +179 -0
  55. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +130 -0
  56. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +138 -0
  57. package/src/consumers/socketReceiveMethods/producerClosed.ts +102 -0
  58. package/src/consumers/startShareScreen.ts +124 -0
  59. package/src/consumers/stopShareScreen.ts +241 -0
  60. package/src/consumers/streamSuccessAudio.ts +297 -0
  61. package/src/consumers/streamSuccessAudioSwitch.ts +315 -0
  62. package/src/consumers/streamSuccessScreen.ts +255 -0
  63. package/src/consumers/streamSuccessVideo.ts +373 -0
  64. package/src/consumers/switchUserAudio.ts +140 -0
  65. package/src/consumers/switchUserVideo.ts +201 -0
  66. package/src/consumers/switchUserVideoAlt.ts +331 -0
  67. package/src/consumers/trigger.ts +250 -0
  68. package/src/consumers/updateMiniCardsGrid.ts +150 -0
  69. package/src/consumers/updateParticipantAudioDecibels.ts +56 -0
  70. package/src/index.ts +119 -0
  71. package/src/methods/background/launchBackground.ts +16 -0
  72. package/src/methods/breakoutRooms/breakoutRoomUpdated.ts +161 -0
  73. package/src/methods/breakoutRooms/handleStartBreakout.ts +96 -0
  74. package/src/methods/breakoutRooms/handleStopBreakout.ts +72 -0
  75. package/src/methods/breakoutRooms/index.ts +4 -0
  76. package/src/methods/breakoutRooms/launchBreakoutRooms.ts +31 -0
  77. package/src/methods/coHost/launchCoHost.ts +28 -0
  78. package/src/methods/coHostMethods/index.ts +2 -0
  79. package/src/methods/coHostMethods/modifyCoHostSettings.ts +94 -0
  80. package/src/methods/displaySettings/index.ts +1 -0
  81. package/src/methods/displaySettings/launchDisplaySettings.ts +31 -0
  82. package/src/methods/displaySettings/modifyDisplaySettings.ts +242 -0
  83. package/src/methods/exit/confirmExit.ts +60 -0
  84. package/src/methods/exit/index.ts +2 -0
  85. package/src/methods/exit/launchConfirmExit.ts +29 -0
  86. package/src/methods/index.ts +5 -0
  87. package/src/methods/mediaSettings/launchMediaSettings.ts +61 -0
  88. package/src/methods/menu/launchMenuModal.ts +28 -0
  89. package/src/methods/message/index.ts +1 -0
  90. package/src/methods/message/launchMessages.ts +27 -0
  91. package/src/methods/message/sendMessage.ts +175 -0
  92. package/src/methods/participants/index.ts +3 -0
  93. package/src/methods/participants/launchParticipants.ts +25 -0
  94. package/src/methods/participants/messageParticipants.ts +78 -0
  95. package/src/methods/participants/muteParticipants.ts +79 -0
  96. package/src/methods/participants/removeParticipants.ts +97 -0
  97. package/src/methods/polls/handleCreatePoll.ts +66 -0
  98. package/src/methods/polls/handleEndPoll.ts +64 -0
  99. package/src/methods/polls/handleVotePoll.ts +76 -0
  100. package/src/methods/polls/index.ts +3 -0
  101. package/src/methods/polls/launchPoll.ts +25 -0
  102. package/src/methods/prejoin/handleCreateRoom.ts +441 -0
  103. package/src/methods/prejoin/handleJoinRoom.ts +153 -0
  104. package/src/methods/prejoin/index.ts +14 -0
  105. package/src/methods/recording/checkPauseState.ts +57 -0
  106. package/src/methods/recording/checkResumeState.ts +42 -0
  107. package/src/methods/recording/confirmRecording.ts +241 -0
  108. package/src/methods/recording/launchRecording.ts +114 -0
  109. package/src/methods/recording/recordPauseTimer.ts +52 -0
  110. package/src/methods/recording/recordResumeTimer.ts +92 -0
  111. package/src/methods/recording/recordStartTimer.ts +106 -0
  112. package/src/methods/recording/recordUpdateTimer.ts +49 -0
  113. package/src/methods/recording/startRecording.ts +268 -0
  114. package/src/methods/recording/stopRecording.ts +124 -0
  115. package/src/methods/recording/updateRecording.ts +245 -0
  116. package/src/methods/requests/index.ts +1 -0
  117. package/src/methods/requests/launchRequests.ts +25 -0
  118. package/src/methods/requests/respondToRequests.ts +108 -0
  119. package/src/methods/settings/index.ts +2 -0
  120. package/src/methods/settings/launchSettings.ts +25 -0
  121. package/src/methods/settings/modifySettings.ts +99 -0
  122. package/src/methods/stream/clickVideo.ts +337 -0
  123. package/src/methods/stream/index.ts +3 -0
  124. package/src/methods/stream/switchAudio.ts +73 -0
  125. package/src/methods/stream/switchVideo.ts +148 -0
  126. package/src/methods/stream/switchVideoAlt.ts +152 -0
  127. package/src/methods/utils/checkLimitsAndMakeRequest.ts +103 -0
  128. package/src/methods/utils/validateAlphanumeric.ts +41 -0
  129. package/src/methods/waiting/index.ts +1 -0
  130. package/src/methods/waiting/launchWaiting.ts +26 -0
  131. package/src/methods/waiting/respondToWaiting.ts +82 -0
  132. package/src/methods/welcome/handleWelcomeRequest.ts +189 -0
  133. package/src/methods/welcome/index.ts +5 -0
  134. package/src/methods/whiteboard/handleStartWhiteboard.ts +65 -0
  135. package/src/methods/whiteboard/handleStopWhiteboard.ts +48 -0
  136. package/src/methods/whiteboard/index.ts +4 -0
  137. package/src/methods/whiteboard/launchConfigureWhiteboard.ts +29 -0
  138. package/src/producers/producerEmits/joinConRoom.ts +153 -0
  139. package/src/sockets/SocketManager.ts +232 -0
  140. package/src/types/shared-base-types.ts +752 -0
  141. package/src/types/types.ts +84 -0
@@ -0,0 +1,268 @@
1
+ import type { Socket } from 'socket.io-client'
2
+ import {
3
+ recordStartTimer,
4
+ type RecordStartTimerParameters,
5
+ } from './recordStartTimer'
6
+ import {
7
+ recordResumeTimer,
8
+ type RecordResumeTimerParameters,
9
+ } from './recordResumeTimer'
10
+ import type { UserRecordingParams, ShowAlert } from '../../types/types'
11
+
12
+ export interface StartRecordingParameters
13
+ extends RecordStartTimerParameters,
14
+ RecordResumeTimerParameters {
15
+ roomName: string
16
+ userRecordingParams: UserRecordingParams
17
+ socket: Socket
18
+ localSocket?: Socket
19
+ updateIsRecordingModalVisible: (visible: boolean) => void
20
+ confirmedToRecord: boolean
21
+ showAlert?: ShowAlert
22
+ recordingMediaOptions: string
23
+ videoAlreadyOn: boolean
24
+ audioAlreadyOn: boolean
25
+ recordStarted: boolean
26
+ recordPaused: boolean
27
+ recordResumed: boolean
28
+ recordStopped: boolean
29
+ startReport: boolean
30
+ endReport: boolean
31
+ canRecord: boolean
32
+ updateClearedToRecord: (cleared: boolean) => void
33
+ updateRecordStarted: (started: boolean) => void
34
+ updateRecordPaused: (paused: boolean) => void
35
+ updateRecordResumed: (resumed: boolean) => void
36
+ updateStartReport: (started: boolean) => void
37
+ updateEndReport: (ended: boolean) => void
38
+ updateCanRecord: (canRecord: boolean) => void
39
+ whiteboardStarted: boolean
40
+ whiteboardEnded: boolean
41
+ rePort: StartRecordingRePort
42
+ captureCanvasStream: StartRecordingCaptureCanvasStream
43
+ getUpdatedAllParams: () => StartRecordingParameters
44
+ [key: string]: any
45
+ }
46
+
47
+ export type StartRecordingRePort = (options: {
48
+ restart?: boolean
49
+ parameters: any
50
+ }) => Promise<void>
51
+
52
+ export type StartRecordingCaptureCanvasStream = (options: {
53
+ parameters: any
54
+ start?: boolean
55
+ }) => Promise<void>
56
+
57
+ export interface StartRecordingOptions {
58
+ parameters: StartRecordingParameters
59
+ }
60
+
61
+ export type StartRecordingType = (
62
+ options: StartRecordingOptions,
63
+ ) => Promise<boolean | undefined>
64
+
65
+ /**
66
+ * Starts the recording process based on the provided parameters.
67
+ *
68
+ * @param {StartRecordingOptions} options - The options for starting the recording.
69
+ * @param {object} options.parameters - The parameters required for starting the recording.
70
+ * @param {string} options.parameters.roomName - The name of the room where recording is to be started.
71
+ * @param {object} options.parameters.userRecordingParams - User-specific recording parameters.
72
+ * @param {object} options.parameters.socket - The socket instance for communication.
73
+ * @param {object} options.parameters.localSocket - The local socket instance for communication.
74
+ * @param {function} options.parameters.updateIsRecordingModalVisible - Function to update the visibility of the recording modal.
75
+ * @param {boolean} options.parameters.confirmedToRecord - Flag indicating if the user has confirmed to record.
76
+ * @param {function} options.parameters.showAlert - Function to show alerts.
77
+ * @param {string} options.parameters.recordingMediaOptions - The media options for recording (e.g., "video", "audio").
78
+ * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.
79
+ * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.
80
+ * @param {boolean} options.parameters.recordStarted - Flag indicating if the recording has started.
81
+ * @param {boolean} options.parameters.recordPaused - Flag indicating if the recording is paused.
82
+ * @param {boolean} options.parameters.recordResumed - Flag indicating if the recording is resumed.
83
+ * @param {boolean} options.parameters.recordStopped - Flag indicating if the recording is stopped.
84
+ * @param {boolean} options.parameters.startReport - Flag indicating if the start report is active.
85
+ * @param {boolean} options.parameters.endReport - Flag indicating if the end report is active.
86
+ * @param {boolean} options.parameters.canRecord - Flag indicating if recording is allowed.
87
+ * @param {function} options.parameters.updateClearedToRecord - Function to update the cleared to record status.
88
+ * @param {function} options.parameters.updateRecordStarted - Function to update the record started status.
89
+ * @param {function} options.parameters.updateRecordPaused - Function to update the record paused status.
90
+ * @param {function} options.parameters.updateRecordResumed - Function to update the record resumed status.
91
+ * @param {function} options.parameters.updateStartReport - Function to update the start report status.
92
+ * @param {function} options.parameters.updateEndReport - Function to update the end report status.
93
+ * @param {function} options.parameters.updateCanRecord - Function to update the can record status.
94
+ * @param {boolean} options.parameters.whiteboardStarted - Flag indicating if the whiteboard has started.
95
+ * @param {boolean} options.parameters.whiteboardEnded - Flag indicating if the whiteboard has ended.
96
+ * @param {function} options.parameters.rePort - Function to report the recording status.
97
+ * @param {function} options.parameters.captureCanvasStream - Function to capture the canvas stream.
98
+ *
99
+ * @returns {Promise<boolean | undefined>} - A promise that resolves to a boolean indicating if the recording attempt was successful, or undefined if not applicable.
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * startRecording({
104
+ * parameters: {
105
+ * roomName: "Room101",
106
+ * userRecordingParams: myUserRecordingParams,
107
+ * socket: mySocket,
108
+ * localSocket: myLocalSocket,
109
+ * updateIsRecordingModalVisible: setIsRecordingModalVisible,
110
+ * confirmedToRecord: true,
111
+ * showAlert: myShowAlert,
112
+ * recordingMediaOptions: "video",
113
+ * videoAlreadyOn: true,
114
+ * audioAlreadyOn: true,
115
+ * recordStarted: false,
116
+ * recordPaused: false,
117
+ * recordResumed: false,
118
+ * recordStopped: false,
119
+ * startReport: false,
120
+ * endReport: false,
121
+ * canRecord: true,
122
+ * updateClearedToRecord: setClearedToRecord,
123
+ * updateRecordStarted: setRecordStarted,
124
+ * updateRecordPaused: setRecordPaused,
125
+ * updateRecordResumed: setRecordResumed,
126
+ * updateStartReport: setStartReport,
127
+ * updateEndReport: setEndReport,
128
+ * updateCanRecord: setCanRecord,
129
+ * whiteboardStarted: true,
130
+ * whiteboardEnded: false,
131
+ * rePort: myRePort,
132
+ * captureCanvasStream: myCaptureCanvasStream,
133
+ * },
134
+ * })
135
+ * ```
136
+ */
137
+ export const startRecording: StartRecordingType = async ({
138
+ parameters,
139
+ }) => {
140
+ parameters = parameters.getUpdatedAllParams()
141
+
142
+ let {
143
+ roomName,
144
+ userRecordingParams,
145
+ socket,
146
+ localSocket,
147
+ updateIsRecordingModalVisible,
148
+ confirmedToRecord,
149
+ showAlert,
150
+ recordingMediaOptions,
151
+ videoAlreadyOn,
152
+ audioAlreadyOn,
153
+ recordStarted,
154
+ recordPaused,
155
+ recordResumed,
156
+ recordStopped,
157
+ startReport,
158
+ endReport,
159
+ canRecord,
160
+ updateClearedToRecord,
161
+ updateRecordStarted,
162
+ updateRecordPaused,
163
+ updateRecordResumed,
164
+ updateStartReport,
165
+ updateEndReport,
166
+ updateCanRecord,
167
+ whiteboardStarted,
168
+ whiteboardEnded,
169
+ rePort,
170
+ captureCanvasStream,
171
+ } = parameters
172
+
173
+ if (!confirmedToRecord) {
174
+ showAlert?.({
175
+ message: 'You must click confirm before you can start recording',
176
+ type: 'danger',
177
+ })
178
+ return false
179
+ }
180
+
181
+ if (recordingMediaOptions === 'video' && !videoAlreadyOn) {
182
+ showAlert?.({
183
+ message: 'You must turn on your video before you can start recording',
184
+ type: 'danger',
185
+ })
186
+ return false
187
+ }
188
+
189
+ if (recordingMediaOptions === 'audio' && !audioAlreadyOn) {
190
+ showAlert?.({
191
+ message: 'You must turn on your audio before you can start recording',
192
+ type: 'danger',
193
+ })
194
+ return false
195
+ }
196
+
197
+ updateClearedToRecord(true)
198
+
199
+ let action = 'startRecord'
200
+ if (recordStarted && recordPaused && !recordResumed && !recordStopped) {
201
+ action = 'resumeRecord'
202
+ }
203
+
204
+ let recAttempt = false
205
+ const socketRef = localSocket && localSocket.connected ? localSocket : socket
206
+
207
+ await new Promise<void>((resolve) => {
208
+ socketRef.emit(
209
+ action,
210
+ { roomName, userRecordingParams },
211
+ async ({ success, reason }: { success: boolean; reason: string }) => {
212
+ if (success) {
213
+ recordStarted = true
214
+ startReport = true
215
+ endReport = false
216
+ recordPaused = false
217
+ recAttempt = true
218
+
219
+ updateRecordStarted(recordStarted)
220
+ updateStartReport(startReport)
221
+ updateEndReport(endReport)
222
+ updateRecordPaused(recordPaused)
223
+
224
+ if (action === 'startRecord') {
225
+ await rePort({ parameters: parameters.getUpdatedAllParams() })
226
+ await recordStartTimer({ parameters })
227
+ } else {
228
+ updateRecordResumed(true)
229
+ await rePort({ restart: true, parameters: parameters.getUpdatedAllParams() })
230
+ await recordResumeTimer({ parameters })
231
+ }
232
+ } else {
233
+ showAlert?.({
234
+ message: `Recording could not start - ${reason}`,
235
+ type: 'danger',
236
+ })
237
+ canRecord = true
238
+ startReport = false
239
+ endReport = true
240
+ recAttempt = false
241
+
242
+ updateCanRecord(canRecord)
243
+ updateStartReport(startReport)
244
+ updateEndReport(endReport)
245
+ }
246
+
247
+ resolve()
248
+ },
249
+ )
250
+ })
251
+
252
+ try {
253
+ if (
254
+ recAttempt &&
255
+ whiteboardStarted &&
256
+ !whiteboardEnded &&
257
+ recordingMediaOptions === 'video'
258
+ ) {
259
+ await captureCanvasStream({ parameters: parameters.getUpdatedAllParams() })
260
+ }
261
+ } catch (error) {
262
+ console.error('Error capturing canvas stream:', error)
263
+ }
264
+
265
+ updateIsRecordingModalVisible(false)
266
+
267
+ return recAttempt
268
+ }
@@ -0,0 +1,124 @@
1
+ import type { Socket } from 'socket.io-client'
2
+ import { recordPauseTimer } from './recordPauseTimer'
3
+ import type { ShowAlert } from '../../types/types'
4
+
5
+ export interface StopRecordingParameters {
6
+ roomName: string
7
+ socket: Socket
8
+ localSocket?: Socket
9
+ showAlert?: ShowAlert
10
+ startReport: boolean
11
+ endReport: boolean
12
+ recordStarted: boolean
13
+ recordPaused: boolean
14
+ recordStopped: boolean
15
+ updateRecordPaused: (paused: boolean) => void
16
+ updateRecordStopped: (stopped: boolean) => void
17
+ updateStartReport: (startReport: boolean) => void
18
+ updateEndReport: (endReport: boolean) => void
19
+ updateShowRecordButtons: (show: boolean) => void
20
+ whiteboardStarted: boolean
21
+ whiteboardEnded: boolean
22
+ recordingMediaOptions: string
23
+ captureCanvasStream: (options: { parameters: any; start?: boolean }) => void
24
+ getUpdatedAllParams: () => StopRecordingParameters
25
+ [key: string]: any
26
+ }
27
+
28
+ export interface StopRecordingOptions {
29
+ parameters: StopRecordingParameters
30
+ }
31
+
32
+ export type StopRecordingType = (options: StopRecordingOptions) => Promise<void>
33
+
34
+ /**
35
+ * Stops the recording process if it has been started and not yet stopped.
36
+ */
37
+ export const stopRecording: StopRecordingType = async ({ parameters }) => {
38
+ let {
39
+ roomName,
40
+ socket,
41
+ localSocket,
42
+ showAlert,
43
+ startReport,
44
+ endReport,
45
+ recordStarted,
46
+ recordPaused,
47
+ recordStopped,
48
+ updateRecordPaused,
49
+ updateRecordStopped,
50
+ updateStartReport,
51
+ updateEndReport,
52
+ updateShowRecordButtons,
53
+ whiteboardStarted,
54
+ whiteboardEnded,
55
+ recordingMediaOptions,
56
+ captureCanvasStream,
57
+ } = parameters
58
+
59
+ let recAttempt = false
60
+
61
+ if (recordStarted && !recordStopped) {
62
+ const stop = recordPauseTimer({
63
+ stop: true,
64
+ isTimerRunning: parameters.isTimerRunning,
65
+ canPauseResume: parameters.canPauseResume,
66
+ showAlert: parameters.showAlert,
67
+ })
68
+
69
+ if (stop) {
70
+ const action = 'stopRecord'
71
+
72
+ const socketRef = localSocket && localSocket.connected ? localSocket : socket
73
+
74
+ await new Promise<void>((resolve) => {
75
+ socketRef.emit(
76
+ action,
77
+ { roomName },
78
+ ({ success, reason, recordState }: { success: boolean; reason: string; recordState: string }) => {
79
+ if (success) {
80
+ startReport = false
81
+ endReport = true
82
+ recordPaused = false
83
+ recordStopped = true
84
+ recAttempt = true
85
+
86
+ updateStartReport(startReport)
87
+ updateEndReport(endReport)
88
+ updateRecordPaused(recordPaused)
89
+ updateRecordStopped(recordStopped)
90
+ showAlert?.({ message: 'Recording Stopped', type: 'success' })
91
+ updateShowRecordButtons(false)
92
+ } else {
93
+ const reasonMessage = `Recording Stop Failed: ${reason}; the recording is currently ${recordState}`
94
+ showAlert?.({ message: reasonMessage, type: 'danger' })
95
+ recAttempt = false
96
+ }
97
+
98
+ resolve()
99
+ },
100
+ )
101
+ })
102
+
103
+ try {
104
+ if (
105
+ recAttempt &&
106
+ whiteboardStarted &&
107
+ !whiteboardEnded &&
108
+ recordingMediaOptions === 'video'
109
+ ) {
110
+ captureCanvasStream({ parameters: parameters.getUpdatedAllParams(), start: false })
111
+ }
112
+ } catch (error) {
113
+ console.error('Error capturing canvas stream:', error)
114
+ }
115
+ } else {
116
+ return
117
+ }
118
+ } else {
119
+ showAlert?.({
120
+ message: 'Recording is not started yet or already stopped',
121
+ type: 'danger',
122
+ })
123
+ }
124
+ }
@@ -0,0 +1,245 @@
1
+ import type { Socket } from 'socket.io-client'
2
+ import { checkPauseState } from './checkPauseState'
3
+ import { checkResumeState } from './checkResumeState'
4
+ import { recordPauseTimer } from './recordPauseTimer'
5
+ import {
6
+ recordResumeTimer,
7
+ type RecordResumeTimerParameters,
8
+ } from './recordResumeTimer'
9
+ import type { ShowAlert, UserRecordingParams } from '../../types/types'
10
+
11
+ export interface UpdateRecordingParameters extends RecordResumeTimerParameters {
12
+ roomName: string
13
+ userRecordingParams: UserRecordingParams
14
+ socket: Socket
15
+ localSocket?: Socket
16
+ updateIsRecordingModalVisible: (visible: boolean) => void
17
+ confirmedToRecord: boolean
18
+ showAlert?: ShowAlert
19
+ recordingMediaOptions: string
20
+ videoAlreadyOn: boolean
21
+ audioAlreadyOn: boolean
22
+ recordStarted: boolean
23
+ recordPaused: boolean
24
+ recordResumed: boolean
25
+ recordStopped: boolean
26
+ recordChangeSeconds: number
27
+ pauseRecordCount: number
28
+ startReport: boolean
29
+ endReport: boolean
30
+ canRecord: boolean
31
+ canPauseResume: boolean
32
+ updateCanPauseResume: (canPauseResume: boolean) => void
33
+ updatePauseRecordCount: (count: number) => void
34
+ updateClearedToRecord: (cleared: boolean) => void
35
+ updateRecordPaused: (paused: boolean) => void
36
+ updateRecordResumed: (resumed: boolean) => void
37
+ updateStartReport: (start: boolean) => void
38
+ updateEndReport: (end: boolean) => void
39
+ updateCanRecord: (canRecord: boolean) => void
40
+ rePort: UpdateRecordingRePort
41
+ getUpdatedAllParams: () => UpdateRecordingParameters
42
+ [key: string]: any
43
+ }
44
+
45
+ export type UpdateRecordingRePort = (options: {
46
+ restart?: boolean
47
+ parameters: any
48
+ }) => Promise<void>
49
+
50
+ export interface UpdateRecordingOptions {
51
+ parameters: UpdateRecordingParameters
52
+ }
53
+
54
+ export type UpdateRecordingType = (options: UpdateRecordingOptions) => Promise<void>
55
+
56
+ /**
57
+ * Updates the recording state based on the provided parameters.
58
+ */
59
+ export const updateRecording: UpdateRecordingType = async ({ parameters }) => {
60
+ let {
61
+ roomName,
62
+ userRecordingParams,
63
+ socket,
64
+ localSocket,
65
+ updateIsRecordingModalVisible,
66
+ confirmedToRecord,
67
+ showAlert,
68
+ recordingMediaOptions,
69
+ videoAlreadyOn,
70
+ audioAlreadyOn,
71
+ recordStarted,
72
+ recordPaused,
73
+ recordResumed,
74
+ recordStopped,
75
+ recordChangeSeconds,
76
+ pauseRecordCount,
77
+ startReport,
78
+ endReport,
79
+ canRecord,
80
+ canPauseResume,
81
+ updateCanPauseResume,
82
+ updatePauseRecordCount,
83
+ updateClearedToRecord,
84
+ updateRecordPaused,
85
+ updateRecordResumed,
86
+ updateStartReport,
87
+ updateEndReport,
88
+ updateCanRecord,
89
+ rePort,
90
+ } = parameters
91
+
92
+ if (recordStopped) {
93
+ showAlert?.({
94
+ message: 'Recording has already stopped',
95
+ type: 'danger',
96
+ duration: 3000,
97
+ })
98
+ return
99
+ }
100
+
101
+ if (recordingMediaOptions === 'video' && !videoAlreadyOn) {
102
+ showAlert?.({
103
+ message: 'You must turn on your video before you can start recording',
104
+ type: 'danger',
105
+ duration: 3000,
106
+ })
107
+ return
108
+ }
109
+
110
+ if (recordingMediaOptions === 'audio' && !audioAlreadyOn) {
111
+ showAlert?.({
112
+ message: 'You must turn on your audio before you can start recording',
113
+ type: 'danger',
114
+ duration: 3000,
115
+ })
116
+ return
117
+ }
118
+
119
+ const socketRef = localSocket && localSocket.connected ? localSocket : socket
120
+
121
+ if (recordStarted && !recordPaused && !recordStopped) {
122
+ const proceed = await checkPauseState({
123
+ recordingMediaOptions,
124
+ recordingVideoPausesLimit: parameters.recordingVideoPausesLimit,
125
+ recordingAudioPausesLimit: parameters.recordingAudioPausesLimit,
126
+ pauseRecordCount,
127
+ showAlert,
128
+ })
129
+
130
+ if (!proceed) return
131
+
132
+ const record = recordPauseTimer({
133
+ stop: false,
134
+ isTimerRunning: parameters.isTimerRunning,
135
+ canPauseResume: parameters.canPauseResume,
136
+ showAlert,
137
+ })
138
+
139
+ if (record) {
140
+ const action = 'pauseRecord'
141
+ await new Promise<void>((resolve) => {
142
+ socketRef.emit(
143
+ action,
144
+ { roomName },
145
+ async ({ success, reason, recordState, pauseCount }: { success: boolean; reason: string; recordState: string; pauseCount: number }) => {
146
+ pauseRecordCount = pauseCount
147
+ updatePauseRecordCount(pauseRecordCount)
148
+
149
+ if (success) {
150
+ startReport = false
151
+ endReport = true
152
+ recordPaused = true
153
+ updateStartReport(startReport)
154
+ updateEndReport(endReport)
155
+ updateRecordPaused(recordPaused)
156
+
157
+ showAlert?.({
158
+ message: 'Recording paused',
159
+ type: 'success',
160
+ duration: 3000,
161
+ })
162
+
163
+ updateIsRecordingModalVisible(false)
164
+
165
+ setTimeout(() => {
166
+ canPauseResume = true
167
+ updateCanPauseResume(canPauseResume)
168
+ }, recordChangeSeconds)
169
+ } else {
170
+ showAlert?.({
171
+ message: `Recording Pause Failed: ${reason}; the current state is: ${recordState}`,
172
+ type: 'danger',
173
+ duration: 3000,
174
+ })
175
+ }
176
+ resolve()
177
+ },
178
+ )
179
+ })
180
+ }
181
+ } else if (recordStarted && recordPaused && !recordStopped) {
182
+ if (!confirmedToRecord) {
183
+ showAlert?.({
184
+ message: 'You must click confirm before you can start recording',
185
+ type: 'danger',
186
+ duration: 3000,
187
+ })
188
+ return
189
+ }
190
+
191
+ const proceed = await checkResumeState({
192
+ recordingMediaOptions,
193
+ recordingVideoPausesLimit: parameters.recordingVideoPausesLimit,
194
+ recordingAudioPausesLimit: parameters.recordingAudioPausesLimit,
195
+ pauseRecordCount,
196
+ })
197
+
198
+ if (!proceed) return
199
+
200
+ const resume = await recordResumeTimer({ parameters })
201
+ if (resume) {
202
+ updateClearedToRecord(true)
203
+
204
+ const action = 'resumeRecord'
205
+ await new Promise<void>((resolve) => {
206
+ socketRef.emit(
207
+ action,
208
+ { roomName, userRecordingParams },
209
+ async ({ success, reason }: { success: boolean; reason: string }) => {
210
+ if (success) {
211
+ recordResumed = true
212
+ recordPaused = false
213
+
214
+ updateRecordPaused(recordPaused)
215
+ updateRecordResumed(recordResumed)
216
+
217
+ await rePort({ restart: true, parameters: parameters.getUpdatedAllParams() })
218
+ } else {
219
+ showAlert?.({
220
+ message: `Recording could not resume - ${reason}`,
221
+ type: 'danger',
222
+ duration: 3000,
223
+ })
224
+ }
225
+ canRecord = true
226
+ startReport = false
227
+ endReport = true
228
+
229
+ updateCanRecord(canRecord)
230
+ updateStartReport(startReport)
231
+ updateEndReport(endReport)
232
+
233
+ resolve()
234
+ },
235
+ )
236
+ })
237
+
238
+ updateIsRecordingModalVisible(false)
239
+
240
+ setTimeout(() => {
241
+ updateCanPauseResume(true)
242
+ }, recordChangeSeconds)
243
+ }
244
+ }
245
+ }
@@ -0,0 +1 @@
1
+ export { respondToRequests, type RespondToRequestsType, type RespondToRequestsOptions } from './respondToRequests';
@@ -0,0 +1,25 @@
1
+ export interface LaunchRequestsOptions {
2
+ updateIsRequestsModalVisible: (isVisible: boolean) => void
3
+ isRequestsModalVisible: boolean
4
+ }
5
+
6
+ export type LaunchRequestsType = (options: LaunchRequestsOptions) => void
7
+
8
+ /**
9
+ * Toggles the visibility state of the requests modal.
10
+ *
11
+ * @param {LaunchRequestsOptions} options - The options for launching requests.
12
+ * @param {Function} options.updateIsRequestsModalVisible - Function to update the visibility state of the requests modal.
13
+ * @param {boolean} options.isRequestsModalVisible - Current visibility state of the requests modal.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * launchRequests({
18
+ * updateIsRequestsModalVisible: setRequestsModalVisible,
19
+ * isRequestsModalVisible: true,
20
+ * })
21
+ * ```
22
+ */
23
+ export const launchRequests: LaunchRequestsType = ({ updateIsRequestsModalVisible, isRequestsModalVisible }) => {
24
+ updateIsRequestsModalVisible(!isRequestsModalVisible)
25
+ }