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,241 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ShowAlert,
|
|
3
|
+
MainSpecs,
|
|
4
|
+
DispSpecs,
|
|
5
|
+
TextSpecs,
|
|
6
|
+
EventType,
|
|
7
|
+
UserRecordingParams,
|
|
8
|
+
} from '../../types/types'
|
|
9
|
+
|
|
10
|
+
export interface ConfirmRecordingParameters {
|
|
11
|
+
showAlert?: ShowAlert
|
|
12
|
+
recordingMediaOptions: string
|
|
13
|
+
recordingAudioOptions: string
|
|
14
|
+
recordingVideoOptions: string
|
|
15
|
+
recordingVideoType: string
|
|
16
|
+
recordingDisplayType: 'video' | 'media' | 'all'
|
|
17
|
+
recordingNameTags: boolean
|
|
18
|
+
recordingBackgroundColor: string
|
|
19
|
+
recordingNameTagsColor: string
|
|
20
|
+
recordingOrientationVideo: string
|
|
21
|
+
recordingAddHLS: boolean
|
|
22
|
+
recordingAddText: boolean
|
|
23
|
+
recordingCustomText: string
|
|
24
|
+
recordingCustomTextPosition: string
|
|
25
|
+
recordingCustomTextColor: string
|
|
26
|
+
meetingDisplayType: string
|
|
27
|
+
recordingVideoParticipantsFullRoomSupport: boolean
|
|
28
|
+
recordingAllParticipantsSupport: boolean
|
|
29
|
+
recordingVideoParticipantsSupport: boolean
|
|
30
|
+
recordingSupportForOtherOrientation: boolean
|
|
31
|
+
recordingPreferredOrientation: string
|
|
32
|
+
recordingMultiFormatsSupport: boolean
|
|
33
|
+
recordingVideoOptimized: boolean
|
|
34
|
+
recordingAllParticipantsFullRoomSupport: boolean
|
|
35
|
+
meetingVideoOptimized: boolean
|
|
36
|
+
eventType: EventType
|
|
37
|
+
breakOutRoomStarted: boolean
|
|
38
|
+
breakOutRoomEnded: boolean
|
|
39
|
+
updateRecordingDisplayType: (value: 'video' | 'media' | 'all') => void
|
|
40
|
+
updateRecordingVideoOptimized: (value: boolean) => void
|
|
41
|
+
updateUserRecordingParams: (params: UserRecordingParams) => void
|
|
42
|
+
updateConfirmedToRecord: (value: boolean) => void
|
|
43
|
+
getUpdatedAllParams: () => ConfirmRecordingParameters
|
|
44
|
+
[key: string]: any
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ConfirmRecordingOptions {
|
|
48
|
+
parameters: ConfirmRecordingParameters
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type ConfirmRecordingType = (options: ConfirmRecordingOptions) => Promise<void>
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Confirms the recording settings based on the provided parameters and updates the recording state.
|
|
55
|
+
*/
|
|
56
|
+
export const confirmRecording: ConfirmRecordingType = async ({
|
|
57
|
+
parameters,
|
|
58
|
+
}) => {
|
|
59
|
+
parameters = parameters.getUpdatedAllParams()
|
|
60
|
+
|
|
61
|
+
let {
|
|
62
|
+
showAlert,
|
|
63
|
+
recordingMediaOptions,
|
|
64
|
+
recordingAudioOptions,
|
|
65
|
+
recordingVideoOptions,
|
|
66
|
+
recordingVideoType,
|
|
67
|
+
recordingDisplayType,
|
|
68
|
+
recordingNameTags,
|
|
69
|
+
recordingBackgroundColor,
|
|
70
|
+
recordingNameTagsColor,
|
|
71
|
+
recordingOrientationVideo,
|
|
72
|
+
recordingAddHLS,
|
|
73
|
+
recordingAddText,
|
|
74
|
+
recordingCustomText,
|
|
75
|
+
recordingCustomTextPosition,
|
|
76
|
+
recordingCustomTextColor,
|
|
77
|
+
meetingDisplayType,
|
|
78
|
+
recordingVideoParticipantsFullRoomSupport,
|
|
79
|
+
recordingAllParticipantsSupport,
|
|
80
|
+
recordingVideoParticipantsSupport,
|
|
81
|
+
recordingSupportForOtherOrientation,
|
|
82
|
+
recordingPreferredOrientation,
|
|
83
|
+
recordingMultiFormatsSupport,
|
|
84
|
+
recordingVideoOptimized,
|
|
85
|
+
recordingAllParticipantsFullRoomSupport,
|
|
86
|
+
meetingVideoOptimized,
|
|
87
|
+
eventType,
|
|
88
|
+
breakOutRoomStarted,
|
|
89
|
+
breakOutRoomEnded,
|
|
90
|
+
updateRecordingDisplayType,
|
|
91
|
+
updateRecordingVideoOptimized,
|
|
92
|
+
updateUserRecordingParams,
|
|
93
|
+
updateConfirmedToRecord,
|
|
94
|
+
} = parameters
|
|
95
|
+
|
|
96
|
+
if (
|
|
97
|
+
!recordingVideoParticipantsFullRoomSupport &&
|
|
98
|
+
recordingVideoOptions === 'all' &&
|
|
99
|
+
recordingMediaOptions === 'video'
|
|
100
|
+
) {
|
|
101
|
+
if (meetingDisplayType === 'all' && !(breakOutRoomStarted && !breakOutRoomEnded)) {
|
|
102
|
+
showAlert?.({
|
|
103
|
+
message:
|
|
104
|
+
'You are not allowed to record videos of all participants; change the meeting display type to video or video optimized.',
|
|
105
|
+
type: 'danger',
|
|
106
|
+
duration: 3000,
|
|
107
|
+
})
|
|
108
|
+
return
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!recordingAllParticipantsSupport && recordingVideoOptions === 'all') {
|
|
113
|
+
showAlert?.({
|
|
114
|
+
message: 'You are only allowed to record yourself.',
|
|
115
|
+
type: 'danger',
|
|
116
|
+
duration: 3000,
|
|
117
|
+
})
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (!recordingVideoParticipantsSupport && recordingDisplayType === 'video') {
|
|
122
|
+
showAlert?.({
|
|
123
|
+
message: 'You are not allowed to record other video participants.',
|
|
124
|
+
type: 'danger',
|
|
125
|
+
duration: 3000,
|
|
126
|
+
})
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!recordingSupportForOtherOrientation && recordingOrientationVideo === 'all') {
|
|
131
|
+
showAlert?.({
|
|
132
|
+
message: 'You are not allowed to record all orientations.',
|
|
133
|
+
type: 'danger',
|
|
134
|
+
duration: 3000,
|
|
135
|
+
})
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (
|
|
140
|
+
(recordingPreferredOrientation === 'landscape' && recordingOrientationVideo === 'portrait') ||
|
|
141
|
+
(recordingPreferredOrientation === 'portrait' && recordingOrientationVideo === 'landscape')
|
|
142
|
+
) {
|
|
143
|
+
if (!recordingSupportForOtherOrientation) {
|
|
144
|
+
showAlert?.({
|
|
145
|
+
message: 'You are not allowed to record this orientation.',
|
|
146
|
+
type: 'danger',
|
|
147
|
+
duration: 3000,
|
|
148
|
+
})
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!recordingMultiFormatsSupport && recordingVideoType === 'all') {
|
|
154
|
+
showAlert?.({
|
|
155
|
+
message: 'You are not allowed to record all formats.',
|
|
156
|
+
type: 'danger',
|
|
157
|
+
duration: 3000,
|
|
158
|
+
})
|
|
159
|
+
return
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (eventType !== 'broadcast') {
|
|
163
|
+
if (recordingMediaOptions === 'video') {
|
|
164
|
+
if (meetingDisplayType === 'media' && recordingDisplayType === 'all') {
|
|
165
|
+
showAlert?.({
|
|
166
|
+
message:
|
|
167
|
+
'Recording display type can be either video, video optimized, or media when meeting display type is media.',
|
|
168
|
+
type: 'danger',
|
|
169
|
+
duration: 3000,
|
|
170
|
+
})
|
|
171
|
+
updateRecordingDisplayType(meetingDisplayType as 'video' | 'media' | 'all')
|
|
172
|
+
return
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (meetingDisplayType === 'video') {
|
|
176
|
+
if (recordingDisplayType === 'all' || recordingDisplayType === 'media') {
|
|
177
|
+
showAlert?.({
|
|
178
|
+
message:
|
|
179
|
+
'Recording display type can be either video or video optimized when meeting display type is video.',
|
|
180
|
+
type: 'danger',
|
|
181
|
+
duration: 3000,
|
|
182
|
+
})
|
|
183
|
+
updateRecordingDisplayType(meetingDisplayType as 'video' | 'media' | 'all')
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (meetingVideoOptimized && !recordingVideoOptimized) {
|
|
188
|
+
showAlert?.({
|
|
189
|
+
message:
|
|
190
|
+
'Recording display type can only be video optimized when meeting display type is video optimized.',
|
|
191
|
+
type: 'danger',
|
|
192
|
+
duration: 3000,
|
|
193
|
+
})
|
|
194
|
+
updateRecordingVideoOptimized(meetingVideoOptimized)
|
|
195
|
+
return
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
} else {
|
|
199
|
+
updateRecordingDisplayType('media')
|
|
200
|
+
updateRecordingVideoOptimized(false)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (recordingDisplayType === 'all' && !recordingAllParticipantsFullRoomSupport) {
|
|
205
|
+
showAlert?.({
|
|
206
|
+
message: 'You can only record all participants with media.',
|
|
207
|
+
type: 'danger',
|
|
208
|
+
duration: 3000,
|
|
209
|
+
})
|
|
210
|
+
return
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const mainSpecs: MainSpecs = {
|
|
214
|
+
mediaOptions: recordingMediaOptions,
|
|
215
|
+
audioOptions: recordingAudioOptions,
|
|
216
|
+
videoOptions: recordingVideoOptions,
|
|
217
|
+
videoType: recordingVideoType,
|
|
218
|
+
videoOptimized: recordingVideoOptimized,
|
|
219
|
+
recordingDisplayType,
|
|
220
|
+
addHLS: recordingAddHLS,
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const dispSpecs: DispSpecs = {
|
|
224
|
+
nameTags: recordingNameTags,
|
|
225
|
+
backgroundColor: recordingBackgroundColor,
|
|
226
|
+
nameTagsColor: recordingNameTagsColor,
|
|
227
|
+
orientationVideo: recordingOrientationVideo,
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const textSpecs: TextSpecs = {
|
|
231
|
+
addText: recordingAddText,
|
|
232
|
+
customText: recordingCustomText,
|
|
233
|
+
customTextPosition: recordingCustomTextPosition,
|
|
234
|
+
customTextColor: recordingCustomTextColor,
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const userRecordingParams = { mainSpecs, dispSpecs, textSpecs }
|
|
238
|
+
|
|
239
|
+
updateUserRecordingParams(userRecordingParams)
|
|
240
|
+
updateConfirmedToRecord(true)
|
|
241
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { ShowAlert } from '../../types/types'
|
|
2
|
+
|
|
3
|
+
export interface LaunchRecordingOptions {
|
|
4
|
+
updateIsRecordingModalVisible: (visible: boolean) => void
|
|
5
|
+
isRecordingModalVisible: boolean
|
|
6
|
+
showAlert?: ShowAlert
|
|
7
|
+
stopLaunchRecord: boolean
|
|
8
|
+
canLaunchRecord: boolean
|
|
9
|
+
recordingAudioSupport: boolean
|
|
10
|
+
recordingVideoSupport: boolean
|
|
11
|
+
updateCanRecord: (canRecord: boolean) => void
|
|
12
|
+
updateClearedToRecord: (cleared: boolean) => void
|
|
13
|
+
recordStarted: boolean
|
|
14
|
+
recordPaused: boolean
|
|
15
|
+
localUIMode: boolean
|
|
16
|
+
[key: string]: any
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type LaunchRecordingType = (options: LaunchRecordingOptions) => void
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Launches the recording process based on various conditions and updates the UI accordingly.
|
|
23
|
+
*
|
|
24
|
+
* @param {Object} options - The options for launching the recording.
|
|
25
|
+
* @param {Function} options.updateIsRecordingModalVisible - Function to update the visibility of the recording modal.
|
|
26
|
+
* @param {boolean} options.isRecordingModalVisible - Indicates if the recording modal is currently visible.
|
|
27
|
+
* @param {Function} options.showAlert - Function to show an alert message.
|
|
28
|
+
* @param {boolean} options.stopLaunchRecord - Indicates if the recording launch should be stopped.
|
|
29
|
+
* @param {boolean} options.canLaunchRecord - Indicates if the recording can be launched.
|
|
30
|
+
* @param {boolean} options.recordingAudioSupport - Indicates if audio recording is supported.
|
|
31
|
+
* @param {boolean} options.recordingVideoSupport - Indicates if video recording is supported.
|
|
32
|
+
* @param {Function} options.updateCanRecord - Function to update the recording capability.
|
|
33
|
+
* @param {Function} options.updateClearedToRecord - Function to update the cleared-to-record status.
|
|
34
|
+
* @param {boolean} options.recordStarted - Indicates if the recording has started.
|
|
35
|
+
* @param {boolean} options.recordPaused - Indicates if the recording is paused.
|
|
36
|
+
* @param {boolean} options.localUIMode - Indicates if the local UI mode is active.
|
|
37
|
+
*
|
|
38
|
+
* @returns {void}
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* launchRecording({
|
|
43
|
+
* updateIsRecordingModalVisible: (visible) => console.log(`Modal visible: ${visible}`),
|
|
44
|
+
* isRecordingModalVisible: false,
|
|
45
|
+
* showAlert: (alert) => console.log(alert.message),
|
|
46
|
+
* stopLaunchRecord: false,
|
|
47
|
+
* canLaunchRecord: true,
|
|
48
|
+
* recordingAudioSupport: true,
|
|
49
|
+
* recordingVideoSupport: true,
|
|
50
|
+
* updateCanRecord: (canRecord) => console.log(`Can record: ${canRecord}`),
|
|
51
|
+
* updateClearedToRecord: (cleared) => console.log(`Cleared to record: ${cleared}`),
|
|
52
|
+
* recordStarted: false,
|
|
53
|
+
* recordPaused: false,
|
|
54
|
+
* localUIMode: false,
|
|
55
|
+
* })
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export const launchRecording: LaunchRecordingType = ({
|
|
59
|
+
updateIsRecordingModalVisible,
|
|
60
|
+
isRecordingModalVisible,
|
|
61
|
+
showAlert,
|
|
62
|
+
stopLaunchRecord,
|
|
63
|
+
canLaunchRecord,
|
|
64
|
+
recordingAudioSupport,
|
|
65
|
+
recordingVideoSupport,
|
|
66
|
+
updateCanRecord,
|
|
67
|
+
updateClearedToRecord,
|
|
68
|
+
recordStarted,
|
|
69
|
+
recordPaused,
|
|
70
|
+
localUIMode,
|
|
71
|
+
}) => {
|
|
72
|
+
if (!isRecordingModalVisible && stopLaunchRecord && !localUIMode) {
|
|
73
|
+
showAlert?.({
|
|
74
|
+
message: 'Recording has already ended or you are not allowed to record',
|
|
75
|
+
type: 'danger',
|
|
76
|
+
duration: 3000,
|
|
77
|
+
})
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!isRecordingModalVisible && canLaunchRecord && !localUIMode) {
|
|
82
|
+
if (!recordingAudioSupport && !recordingVideoSupport) {
|
|
83
|
+
showAlert?.({
|
|
84
|
+
message: 'You are not allowed to record',
|
|
85
|
+
type: 'danger',
|
|
86
|
+
duration: 3000,
|
|
87
|
+
})
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
updateClearedToRecord(false)
|
|
92
|
+
updateCanRecord(false)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!isRecordingModalVisible && recordStarted && !recordPaused) {
|
|
96
|
+
showAlert?.({
|
|
97
|
+
message: 'You can only re-configure recording after pausing it',
|
|
98
|
+
type: 'danger',
|
|
99
|
+
duration: 3000,
|
|
100
|
+
})
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (!isRecordingModalVisible && !recordingAudioSupport && !recordingVideoSupport && !localUIMode) {
|
|
105
|
+
showAlert?.({
|
|
106
|
+
message: 'You are not allowed to record',
|
|
107
|
+
type: 'danger',
|
|
108
|
+
duration: 3000,
|
|
109
|
+
})
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
updateIsRecordingModalVisible(!isRecordingModalVisible)
|
|
114
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ShowAlert } from '../../types/types'
|
|
2
|
+
|
|
3
|
+
export interface RecordPauseTimerOptions {
|
|
4
|
+
stop?: boolean
|
|
5
|
+
isTimerRunning: boolean
|
|
6
|
+
canPauseResume: boolean
|
|
7
|
+
showAlert?: ShowAlert
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type RecordPauseTimerType = (options: RecordPauseTimerOptions) => boolean
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Records the pause timer.
|
|
14
|
+
*
|
|
15
|
+
* @param {RecordPauseTimerOptions} options - The options for recording the pause timer.
|
|
16
|
+
* @param {boolean} options.stop - A flag to stop the timer.
|
|
17
|
+
* @param {boolean} options.isTimerRunning - Indicates if the timer is running.
|
|
18
|
+
* @param {boolean} options.canPauseResume - Indicates if the timer can be paused or resumed.
|
|
19
|
+
* @param {Function} options.showAlert - Function to show alerts.
|
|
20
|
+
*
|
|
21
|
+
* @returns {boolean} `true` if the timer can be paused or resumed, otherwise `false`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const canPause = recordPauseTimer({
|
|
26
|
+
* stop: false,
|
|
27
|
+
* isTimerRunning: true,
|
|
28
|
+
* canPauseResume: true,
|
|
29
|
+
* showAlert: (alert) => console.log(alert.message),
|
|
30
|
+
* })
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export const recordPauseTimer: RecordPauseTimerType = ({
|
|
34
|
+
stop = false,
|
|
35
|
+
isTimerRunning,
|
|
36
|
+
canPauseResume,
|
|
37
|
+
showAlert,
|
|
38
|
+
}) => {
|
|
39
|
+
if (isTimerRunning && canPauseResume) {
|
|
40
|
+
return true
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const message = stop
|
|
44
|
+
? 'Can only stop after 15 seconds of starting or pausing or resuming recording'
|
|
45
|
+
: 'Can only pause or resume after 15 seconds of starting or pausing or resuming recording'
|
|
46
|
+
|
|
47
|
+
showAlert?.({
|
|
48
|
+
message,
|
|
49
|
+
type: 'danger',
|
|
50
|
+
})
|
|
51
|
+
return false
|
|
52
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { ShowAlert } from '../../types/types'
|
|
2
|
+
import { recordUpdateTimer } from './recordUpdateTimer'
|
|
3
|
+
|
|
4
|
+
export interface RecordResumeTimerParameters {
|
|
5
|
+
isTimerRunning: boolean
|
|
6
|
+
canPauseResume: boolean
|
|
7
|
+
recordElapsedTime: number
|
|
8
|
+
recordStartTime: number
|
|
9
|
+
recordTimerInterval?: NodeJS.Timeout | null
|
|
10
|
+
showAlert?: ShowAlert
|
|
11
|
+
recordPaused: boolean
|
|
12
|
+
recordStopped: boolean
|
|
13
|
+
roomName: string | null
|
|
14
|
+
updateRecordStartTime: (time: number) => void
|
|
15
|
+
updateRecordTimerInterval: (interval: NodeJS.Timeout | null) => void
|
|
16
|
+
updateIsTimerRunning: (isRunning: boolean) => void
|
|
17
|
+
updateCanPauseResume: (canPause: boolean) => void
|
|
18
|
+
updateRecordElapsedTime: (elapsed: number) => void
|
|
19
|
+
updateRecordingProgressTime: (formatted: string) => void
|
|
20
|
+
getUpdatedAllParams: () => RecordResumeTimerParameters
|
|
21
|
+
[key: string]: any
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface RecordResumeTimerOptions {
|
|
25
|
+
parameters: RecordResumeTimerParameters
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type RecordResumeTimerType = (options: RecordResumeTimerOptions) => Promise<boolean>
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Resumes the recording timer if it is not already running and can be paused/resumed.
|
|
32
|
+
*/
|
|
33
|
+
export const recordResumeTimer: RecordResumeTimerType = async ({ parameters }) => {
|
|
34
|
+
const { getUpdatedAllParams } = parameters
|
|
35
|
+
parameters = getUpdatedAllParams()
|
|
36
|
+
|
|
37
|
+
let {
|
|
38
|
+
isTimerRunning,
|
|
39
|
+
canPauseResume,
|
|
40
|
+
recordElapsedTime,
|
|
41
|
+
recordStartTime,
|
|
42
|
+
recordTimerInterval,
|
|
43
|
+
showAlert,
|
|
44
|
+
updateRecordStartTime,
|
|
45
|
+
updateRecordTimerInterval,
|
|
46
|
+
updateIsTimerRunning,
|
|
47
|
+
updateCanPauseResume,
|
|
48
|
+
} = parameters
|
|
49
|
+
|
|
50
|
+
if (!isTimerRunning && canPauseResume) {
|
|
51
|
+
recordStartTime = new Date().getTime() - recordElapsedTime * 1000
|
|
52
|
+
updateRecordStartTime(recordStartTime)
|
|
53
|
+
|
|
54
|
+
recordTimerInterval = setInterval(() => {
|
|
55
|
+
recordUpdateTimer({
|
|
56
|
+
recordElapsedTime,
|
|
57
|
+
recordStartTime,
|
|
58
|
+
updateRecordElapsedTime: parameters.updateRecordElapsedTime,
|
|
59
|
+
updateRecordingProgressTime: parameters.updateRecordingProgressTime,
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
parameters = getUpdatedAllParams()
|
|
63
|
+
|
|
64
|
+
if (
|
|
65
|
+
parameters.recordPaused ||
|
|
66
|
+
parameters.recordStopped ||
|
|
67
|
+
parameters.roomName === '' ||
|
|
68
|
+
parameters.roomName === null
|
|
69
|
+
) {
|
|
70
|
+
clearInterval(recordTimerInterval!)
|
|
71
|
+
updateRecordTimerInterval(null)
|
|
72
|
+
isTimerRunning = false
|
|
73
|
+
updateIsTimerRunning(isTimerRunning)
|
|
74
|
+
canPauseResume = false
|
|
75
|
+
updateCanPauseResume(canPauseResume)
|
|
76
|
+
}
|
|
77
|
+
}, 1000)
|
|
78
|
+
|
|
79
|
+
updateRecordTimerInterval(recordTimerInterval!)
|
|
80
|
+
isTimerRunning = true
|
|
81
|
+
updateIsTimerRunning(isTimerRunning)
|
|
82
|
+
canPauseResume = false
|
|
83
|
+
updateCanPauseResume(canPauseResume)
|
|
84
|
+
return true
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
showAlert?.({
|
|
88
|
+
type: 'danger',
|
|
89
|
+
message: 'Can only pause or resume after 15 seconds of starting or pausing or resuming recording',
|
|
90
|
+
})
|
|
91
|
+
return false
|
|
92
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { recordUpdateTimer } from './recordUpdateTimer'
|
|
2
|
+
|
|
3
|
+
export interface RecordStartTimerParameters {
|
|
4
|
+
recordStartTime: number
|
|
5
|
+
recordTimerInterval?: NodeJS.Timeout | null
|
|
6
|
+
isTimerRunning: boolean
|
|
7
|
+
canPauseResume: boolean
|
|
8
|
+
recordChangeSeconds: number
|
|
9
|
+
recordPaused: boolean
|
|
10
|
+
recordStopped: boolean
|
|
11
|
+
roomName: string | null
|
|
12
|
+
updateRecordStartTime: (time: number) => void
|
|
13
|
+
updateRecordTimerInterval: (interval: NodeJS.Timeout | null) => void
|
|
14
|
+
updateIsTimerRunning: (isRunning: boolean) => void
|
|
15
|
+
updateCanPauseResume: (canPause: boolean) => void
|
|
16
|
+
recordElapsedTime: number
|
|
17
|
+
updateRecordElapsedTime: (elapsed: number) => void
|
|
18
|
+
updateRecordingProgressTime: (formatted: string) => void
|
|
19
|
+
getUpdatedAllParams: () => RecordStartTimerParameters
|
|
20
|
+
[key: string]: any
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface RecordStartTimerOptions {
|
|
24
|
+
parameters: RecordStartTimerParameters
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type RecordStartTimerType = (options: RecordStartTimerOptions) => Promise<void>
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Starts a recording timer and manages its state.
|
|
31
|
+
*
|
|
32
|
+
* @param {RecordStartTimerOptions} options - The options for starting the recording timer.
|
|
33
|
+
* @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.
|
|
34
|
+
* @param {number} options.parameters.recordStartTime - The start time of the recording.
|
|
35
|
+
* @param {number | null} options.parameters.recordTimerInterval - The interval ID for the recording timer.
|
|
36
|
+
* @param {boolean} options.parameters.isTimerRunning - Flag indicating if the timer is running.
|
|
37
|
+
* @param {boolean} options.parameters.canPauseResume - Flag indicating if pause/resume actions are enabled.
|
|
38
|
+
* @param {number} options.parameters.recordChangeSeconds - The time after which pause/resume actions are enabled.
|
|
39
|
+
* @param {Function} options.parameters.updateRecordStartTime - Function to update the recording start time.
|
|
40
|
+
* @param {Function} options.parameters.updateRecordTimerInterval - Function to update the recording timer interval.
|
|
41
|
+
* @param {Function} options.parameters.updateIsTimerRunning - Function to update the timer running state.
|
|
42
|
+
* @param {Function} options.parameters.updateCanPauseResume - Function to update the pause/resume state.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* await recordStartTimer({ parameters })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export const recordStartTimer: RecordStartTimerType = async ({ parameters }) => {
|
|
50
|
+
const { getUpdatedAllParams } = parameters
|
|
51
|
+
parameters = getUpdatedAllParams()
|
|
52
|
+
|
|
53
|
+
let {
|
|
54
|
+
recordStartTime,
|
|
55
|
+
recordTimerInterval,
|
|
56
|
+
isTimerRunning,
|
|
57
|
+
canPauseResume,
|
|
58
|
+
recordChangeSeconds,
|
|
59
|
+
updateRecordStartTime,
|
|
60
|
+
updateRecordTimerInterval,
|
|
61
|
+
updateIsTimerRunning,
|
|
62
|
+
updateCanPauseResume,
|
|
63
|
+
} = parameters
|
|
64
|
+
|
|
65
|
+
const enablePauseResume = (): void => {
|
|
66
|
+
canPauseResume = true
|
|
67
|
+
updateCanPauseResume(canPauseResume)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!isTimerRunning) {
|
|
71
|
+
recordStartTime = new Date().getTime()
|
|
72
|
+
updateRecordStartTime(recordStartTime)
|
|
73
|
+
|
|
74
|
+
recordTimerInterval = setInterval(() => {
|
|
75
|
+
recordUpdateTimer({
|
|
76
|
+
recordElapsedTime: parameters.recordElapsedTime,
|
|
77
|
+
recordStartTime,
|
|
78
|
+
updateRecordElapsedTime: parameters.updateRecordElapsedTime,
|
|
79
|
+
updateRecordingProgressTime: parameters.updateRecordingProgressTime,
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
parameters = getUpdatedAllParams()
|
|
83
|
+
|
|
84
|
+
if (
|
|
85
|
+
parameters.recordPaused ||
|
|
86
|
+
parameters.recordStopped ||
|
|
87
|
+
parameters.roomName === '' ||
|
|
88
|
+
parameters.roomName === null
|
|
89
|
+
) {
|
|
90
|
+
clearInterval(recordTimerInterval!)
|
|
91
|
+
updateRecordTimerInterval(null)
|
|
92
|
+
isTimerRunning = false
|
|
93
|
+
updateIsTimerRunning(isTimerRunning)
|
|
94
|
+
canPauseResume = false
|
|
95
|
+
updateCanPauseResume(canPauseResume)
|
|
96
|
+
}
|
|
97
|
+
}, 1000)
|
|
98
|
+
|
|
99
|
+
updateRecordTimerInterval(recordTimerInterval)
|
|
100
|
+
isTimerRunning = true
|
|
101
|
+
updateIsTimerRunning(isTimerRunning)
|
|
102
|
+
canPauseResume = false
|
|
103
|
+
updateCanPauseResume(canPauseResume)
|
|
104
|
+
setTimeout(enablePauseResume, recordChangeSeconds)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface RecordUpdateTimerOptions {
|
|
2
|
+
recordElapsedTime: number
|
|
3
|
+
recordStartTime: number
|
|
4
|
+
updateRecordElapsedTime: (elapsedTime: number) => void
|
|
5
|
+
updateRecordingProgressTime: (formattedTime: string) => void
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export type RecordUpdateTimerType = (options: RecordUpdateTimerOptions) => void
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Updates the recording timer by calculating the elapsed time since the recording started
|
|
12
|
+
* and formatting it in HH:MM:SS format.
|
|
13
|
+
*
|
|
14
|
+
* @param {RecordUpdateTimerOptions} options - The options object.
|
|
15
|
+
* @param {number} options.recordElapsedTime - The elapsed recording time in seconds.
|
|
16
|
+
* @param {number} options.recordStartTime - The timestamp when the recording started.
|
|
17
|
+
* @param {Function} options.updateRecordElapsedTime - Callback to update the elapsed recording time.
|
|
18
|
+
* @param {Function} options.updateRecordingProgressTime - Callback to update the formatted recording time.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* recordUpdateTimer({
|
|
23
|
+
* recordElapsedTime: 0,
|
|
24
|
+
* recordStartTime: Date.now(),
|
|
25
|
+
* updateRecordElapsedTime: (elapsedTime) => console.log('Elapsed:', elapsedTime),
|
|
26
|
+
* updateRecordingProgressTime: (formatted) => console.log('Progress:', formatted),
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const recordUpdateTimer: RecordUpdateTimerType = ({
|
|
31
|
+
recordElapsedTime,
|
|
32
|
+
recordStartTime,
|
|
33
|
+
updateRecordElapsedTime,
|
|
34
|
+
updateRecordingProgressTime,
|
|
35
|
+
}) => {
|
|
36
|
+
const padNumber = (value: number): string => value.toString().padStart(2, '0')
|
|
37
|
+
|
|
38
|
+
const currentTime = new Date().getTime()
|
|
39
|
+
let elapsedSeconds = recordElapsedTime
|
|
40
|
+
elapsedSeconds = Math.floor((currentTime - recordStartTime) / 1000)
|
|
41
|
+
updateRecordElapsedTime(elapsedSeconds)
|
|
42
|
+
|
|
43
|
+
const hours = Math.floor(elapsedSeconds / 3600)
|
|
44
|
+
const minutes = Math.floor((elapsedSeconds % 3600) / 60)
|
|
45
|
+
const seconds = elapsedSeconds % 60
|
|
46
|
+
const formattedTime = `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`
|
|
47
|
+
|
|
48
|
+
updateRecordingProgressTime(formattedTime)
|
|
49
|
+
}
|