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.
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/index.cjs +7707 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +7285 -0
- package/dist/index.js +7690 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
- package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +68 -0
- package/src/consumers/addVideosGrid.ts +18 -0
- package/src/consumers/autoAdjust.ts +100 -0
- package/src/consumers/calculateRowsAndColumns.ts +51 -0
- package/src/consumers/changeVids.ts +753 -0
- package/src/consumers/checkGrid.ts +100 -0
- package/src/consumers/checkPermission.ts +89 -0
- package/src/consumers/checkScreenShare.ts +114 -0
- package/src/consumers/closeAndResize.ts +401 -0
- package/src/consumers/compareActiveNames.ts +122 -0
- package/src/consumers/compareScreenStates.ts +117 -0
- package/src/consumers/connectIps.ts +175 -0
- package/src/consumers/connectLocalIps.ts +103 -0
- package/src/consumers/connectRecvTransport.ts +158 -0
- package/src/consumers/connectSendTransport.ts +150 -0
- package/src/consumers/connectSendTransportAudio.ts +161 -0
- package/src/consumers/connectSendTransportScreen.ts +169 -0
- package/src/consumers/connectSendTransportVideo.ts +149 -0
- package/src/consumers/consumerResume.ts +25 -0
- package/src/consumers/controlMedia.ts +118 -0
- package/src/consumers/createSendTransport.ts +312 -0
- package/src/consumers/disconnectSendTransportAudio.ts +170 -0
- package/src/consumers/disconnectSendTransportScreen.ts +130 -0
- package/src/consumers/disconnectSendTransportVideo.ts +161 -0
- package/src/consumers/dispStreams.ts +694 -0
- package/src/consumers/generatePageContent.ts +118 -0
- package/src/consumers/getEstimate.ts +124 -0
- package/src/consumers/getPipedProducersAlt.ts +96 -0
- package/src/consumers/getProducersPiped.ts +89 -0
- package/src/consumers/getVideos.ts +107 -0
- package/src/consumers/mixStreams.ts +97 -0
- package/src/consumers/onScreenChanges.ts +106 -0
- package/src/consumers/prepopulateUserMedia.ts +18 -0
- package/src/consumers/processConsumerTransports.ts +157 -0
- package/src/consumers/processConsumerTransportsAudio.ts +121 -0
- package/src/consumers/rePort.ts +123 -0
- package/src/consumers/reUpdateInter.ts +289 -0
- package/src/consumers/readjust.ts +170 -0
- package/src/consumers/receiveAllPipedTransports.ts +77 -0
- package/src/consumers/receiveRoomMessages.ts +55 -0
- package/src/consumers/reorderStreams.ts +246 -0
- package/src/consumers/requestScreenShare.ts +103 -0
- package/src/consumers/resumePauseAudioStreams.ts +174 -0
- package/src/consumers/resumePauseStreams.ts +110 -0
- package/src/consumers/resumeSendTransportAudio.ts +143 -0
- package/src/consumers/signalNewConsumerTransport.ts +179 -0
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +130 -0
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +138 -0
- package/src/consumers/socketReceiveMethods/producerClosed.ts +102 -0
- package/src/consumers/startShareScreen.ts +124 -0
- package/src/consumers/stopShareScreen.ts +241 -0
- package/src/consumers/streamSuccessAudio.ts +297 -0
- package/src/consumers/streamSuccessAudioSwitch.ts +315 -0
- package/src/consumers/streamSuccessScreen.ts +255 -0
- package/src/consumers/streamSuccessVideo.ts +373 -0
- package/src/consumers/switchUserAudio.ts +140 -0
- package/src/consumers/switchUserVideo.ts +201 -0
- package/src/consumers/switchUserVideoAlt.ts +331 -0
- package/src/consumers/trigger.ts +250 -0
- package/src/consumers/updateMiniCardsGrid.ts +150 -0
- package/src/consumers/updateParticipantAudioDecibels.ts +56 -0
- package/src/index.ts +119 -0
- package/src/methods/background/launchBackground.ts +16 -0
- package/src/methods/breakoutRooms/breakoutRoomUpdated.ts +161 -0
- package/src/methods/breakoutRooms/handleStartBreakout.ts +96 -0
- package/src/methods/breakoutRooms/handleStopBreakout.ts +72 -0
- package/src/methods/breakoutRooms/index.ts +4 -0
- package/src/methods/breakoutRooms/launchBreakoutRooms.ts +31 -0
- package/src/methods/coHost/launchCoHost.ts +28 -0
- package/src/methods/coHostMethods/index.ts +2 -0
- package/src/methods/coHostMethods/modifyCoHostSettings.ts +94 -0
- package/src/methods/displaySettings/index.ts +1 -0
- package/src/methods/displaySettings/launchDisplaySettings.ts +31 -0
- package/src/methods/displaySettings/modifyDisplaySettings.ts +242 -0
- package/src/methods/exit/confirmExit.ts +60 -0
- package/src/methods/exit/index.ts +2 -0
- package/src/methods/exit/launchConfirmExit.ts +29 -0
- package/src/methods/index.ts +5 -0
- package/src/methods/mediaSettings/launchMediaSettings.ts +61 -0
- package/src/methods/menu/launchMenuModal.ts +28 -0
- package/src/methods/message/index.ts +1 -0
- package/src/methods/message/launchMessages.ts +27 -0
- package/src/methods/message/sendMessage.ts +175 -0
- package/src/methods/participants/index.ts +3 -0
- package/src/methods/participants/launchParticipants.ts +25 -0
- package/src/methods/participants/messageParticipants.ts +78 -0
- package/src/methods/participants/muteParticipants.ts +79 -0
- package/src/methods/participants/removeParticipants.ts +97 -0
- package/src/methods/polls/handleCreatePoll.ts +66 -0
- package/src/methods/polls/handleEndPoll.ts +64 -0
- package/src/methods/polls/handleVotePoll.ts +76 -0
- package/src/methods/polls/index.ts +3 -0
- package/src/methods/polls/launchPoll.ts +25 -0
- package/src/methods/prejoin/handleCreateRoom.ts +441 -0
- package/src/methods/prejoin/handleJoinRoom.ts +153 -0
- package/src/methods/prejoin/index.ts +14 -0
- package/src/methods/recording/checkPauseState.ts +57 -0
- package/src/methods/recording/checkResumeState.ts +42 -0
- package/src/methods/recording/confirmRecording.ts +241 -0
- package/src/methods/recording/launchRecording.ts +114 -0
- package/src/methods/recording/recordPauseTimer.ts +52 -0
- package/src/methods/recording/recordResumeTimer.ts +92 -0
- package/src/methods/recording/recordStartTimer.ts +106 -0
- package/src/methods/recording/recordUpdateTimer.ts +49 -0
- package/src/methods/recording/startRecording.ts +268 -0
- package/src/methods/recording/stopRecording.ts +124 -0
- package/src/methods/recording/updateRecording.ts +245 -0
- package/src/methods/requests/index.ts +1 -0
- package/src/methods/requests/launchRequests.ts +25 -0
- package/src/methods/requests/respondToRequests.ts +108 -0
- package/src/methods/settings/index.ts +2 -0
- package/src/methods/settings/launchSettings.ts +25 -0
- package/src/methods/settings/modifySettings.ts +99 -0
- package/src/methods/stream/clickVideo.ts +337 -0
- package/src/methods/stream/index.ts +3 -0
- package/src/methods/stream/switchAudio.ts +73 -0
- package/src/methods/stream/switchVideo.ts +148 -0
- package/src/methods/stream/switchVideoAlt.ts +152 -0
- package/src/methods/utils/checkLimitsAndMakeRequest.ts +103 -0
- package/src/methods/utils/validateAlphanumeric.ts +41 -0
- package/src/methods/waiting/index.ts +1 -0
- package/src/methods/waiting/launchWaiting.ts +26 -0
- package/src/methods/waiting/respondToWaiting.ts +82 -0
- package/src/methods/welcome/handleWelcomeRequest.ts +189 -0
- package/src/methods/welcome/index.ts +5 -0
- package/src/methods/whiteboard/handleStartWhiteboard.ts +65 -0
- package/src/methods/whiteboard/handleStopWhiteboard.ts +48 -0
- package/src/methods/whiteboard/index.ts +4 -0
- package/src/methods/whiteboard/launchConfigureWhiteboard.ts +29 -0
- package/src/producers/producerEmits/joinConRoom.ts +153 -0
- package/src/sockets/SocketManager.ts +232 -0
- package/src/types/shared-base-types.ts +752 -0
- 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
|
+
}
|