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,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
+ }