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,242 @@
1
+ import type { ShowAlert, OnScreenChangesParameters, OnScreenChangesType } from '../../types/types'
2
+
3
+
4
+ export interface ModifyDisplaySettingsParameters extends OnScreenChangesParameters {
5
+ showAlert?: ShowAlert
6
+ meetingDisplayType: string
7
+ autoWave: boolean
8
+ forceFullDisplay: boolean
9
+ meetingVideoOptimized: boolean
10
+ islevel: string
11
+ recordStarted: boolean
12
+ recordResumed: boolean
13
+ recordStopped: boolean
14
+ recordPaused: boolean
15
+ recordingDisplayType: 'video' | 'media' | 'all'
16
+ recordingVideoOptimized: boolean
17
+ prevForceFullDisplay: boolean
18
+ prevMeetingDisplayType: string
19
+ updateMeetingDisplayType: (displayType: string) => void
20
+ updateAutoWave: (autoWave: boolean) => void
21
+ updateForceFullDisplay: (forceFullDisplay: boolean) => void
22
+ updateMeetingVideoOptimized: (optimized: boolean) => void
23
+ updatePrevForceFullDisplay: (forceFullDisplay: boolean) => void
24
+ updatePrevMeetingDisplayType: (displayType: string) => void
25
+ updateIsDisplaySettingsModalVisible: (isVisible: boolean) => void
26
+ updateFirstAll: (firstAll: boolean) => void
27
+ updateUpdateMainWindow: (update: boolean) => void
28
+ breakOutRoomStarted: boolean
29
+ breakOutRoomEnded: boolean
30
+
31
+ // mediasfu functions
32
+ onScreenChanges: OnScreenChangesType
33
+
34
+ [key: string]: any
35
+ }
36
+
37
+ export interface ModifyDisplaySettingsOptions {
38
+ parameters: ModifyDisplaySettingsParameters
39
+ }
40
+
41
+ // Export the type definition for the function
42
+ export type ModifyDisplaySettingsType = (
43
+ options: ModifyDisplaySettingsOptions
44
+ ) => Promise<void>
45
+
46
+ /**
47
+ * Modifies the display settings based on the provided parameters.
48
+ *
49
+ * @param {ModifyDisplaySettingsOptions} options - The options containing the parameters to modify the display settings.
50
+ * @param {Object} options.parameters - The parameters for modifying the display settings.
51
+ * @param {Function} options.parameters.showAlert - Function to show alert messages.
52
+ * @param {string} options.parameters.meetingDisplayType - The current meeting display type.
53
+ * @param {boolean} options.parameters.autoWave - Flag indicating if auto wave is enabled.
54
+ * @param {boolean} options.parameters.forceFullDisplay - Flag indicating if full display is forced.
55
+ * @param {boolean} options.parameters.meetingVideoOptimized - Flag indicating if the meeting video is optimized.
56
+ * @param {string} options.parameters.islevel - The current level of the meeting.
57
+ * @param {boolean} options.parameters.recordStarted - Flag indicating if recording has started.
58
+ * @param {boolean} options.parameters.recordResumed - Flag indicating if recording has resumed.
59
+ * @param {boolean} options.parameters.recordStopped - Flag indicating if recording has stopped.
60
+ * @param {boolean} options.parameters.recordPaused - Flag indicating if recording is paused.
61
+ * @param {string} options.parameters.recordingDisplayType - The current recording display type.
62
+ * @param {boolean} options.parameters.recordingVideoOptimized - Flag indicating if the recording video is optimized.
63
+ * @param {string} options.parameters.prevForceFullDisplay - The previous force full display value.
64
+ * @param {string} options.parameters.prevMeetingDisplayType - The previous meeting display type.
65
+ * @param {Function} options.parameters.updateMeetingDisplayType - Function to update the meeting display type.
66
+ * @param {Function} options.parameters.updateAutoWave - Function to update the auto wave setting.
67
+ * @param {Function} options.parameters.updateForceFullDisplay - Function to update the force full display setting.
68
+ * @param {Function} options.parameters.updateMeetingVideoOptimized - Function to update the meeting video optimization setting.
69
+ * @param {Function} options.parameters.updatePrevForceFullDisplay - Function to update the previous force full display setting.
70
+ * @param {Function} options.parameters.updatePrevMeetingDisplayType - Function to update the previous meeting display type.
71
+ * @param {Function} options.parameters.updateIsDisplaySettingsModalVisible - Function to update the visibility of the display settings modal.
72
+ * @param {Function} options.parameters.updateFirstAll - Function to update the first all setting.
73
+ * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.
74
+ * @param {boolean} options.parameters.breakOutRoomStarted - Flag indicating if a breakout room has started.
75
+ * @param {boolean} options.parameters.breakOutRoomEnded - Flag indicating if a breakout room has ended.
76
+ * @param {Function} options.parameters.onScreenChanges - Function to handle screen changes.
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * const options: ModifyDisplaySettingsOptions = {
81
+ * parameters: {
82
+ * showAlert: showAlertFunction,
83
+ * meetingDisplayType: "video",
84
+ * autoWave: true,
85
+ * forceFullDisplay: false,
86
+ * meetingVideoOptimized: true,
87
+ * islevel: "2",
88
+ * recordStarted: true,
89
+ * recordResumed: false,
90
+ * recordStopped: false,
91
+ * recordPaused: false,
92
+ * recordingDisplayType: "video",
93
+ * recordingVideoOptimized: true,
94
+ * prevForceFullDisplay: false,
95
+ * prevMeetingDisplayType: "media",
96
+ * updateMeetingDisplayType: updateDisplayTypeFunction,
97
+ * updateAutoWave: updateAutoWaveFunction,
98
+ * updateForceFullDisplay: updateForceFullDisplayFunction,
99
+ * updateMeetingVideoOptimized: updateVideoOptimizedFunction,
100
+ * updatePrevForceFullDisplay: updatePrevForceFullFunction,
101
+ * updatePrevMeetingDisplayType: updatePrevDisplayTypeFunction,
102
+ * updateIsDisplaySettingsModalVisible: setModalVisibilityFunction,
103
+ * updateFirstAll: setFirstAllFunction,
104
+ * updateUpdateMainWindow: setMainWindowUpdateFunction,
105
+ * breakOutRoomStarted: false,
106
+ * breakOutRoomEnded: true,
107
+ * onScreenChanges: onScreenChangesFunction
108
+ * }
109
+ * };
110
+ *
111
+ * await modifyDisplaySettings(options);
112
+ * ```
113
+ */
114
+
115
+ export const modifyDisplaySettings = async ({
116
+ parameters
117
+ }: ModifyDisplaySettingsOptions): Promise<void> => {
118
+ // Destructure the parameters
119
+ let {
120
+ showAlert,
121
+ meetingDisplayType,
122
+ autoWave,
123
+ forceFullDisplay,
124
+ meetingVideoOptimized,
125
+ islevel,
126
+ recordStarted,
127
+ recordResumed,
128
+ recordStopped,
129
+ recordPaused,
130
+ recordingDisplayType,
131
+ recordingVideoOptimized,
132
+ prevForceFullDisplay,
133
+ prevMeetingDisplayType,
134
+ updateMeetingDisplayType,
135
+ updateAutoWave,
136
+ updateForceFullDisplay,
137
+ updateMeetingVideoOptimized,
138
+ updatePrevForceFullDisplay,
139
+ updatePrevMeetingDisplayType,
140
+ updateIsDisplaySettingsModalVisible,
141
+ updateFirstAll,
142
+ updateUpdateMainWindow,
143
+ breakOutRoomStarted,
144
+ breakOutRoomEnded,
145
+ onScreenChanges
146
+ } = parameters
147
+
148
+ // Update previous states
149
+ updateAutoWave(autoWave)
150
+ updateForceFullDisplay(forceFullDisplay)
151
+
152
+ if (
153
+ islevel === '2' &&
154
+ (recordStarted || recordResumed) &&
155
+ !recordStopped &&
156
+ !recordPaused
157
+ ) {
158
+ if (
159
+ recordingDisplayType === 'video' &&
160
+ meetingDisplayType === 'video' &&
161
+ meetingVideoOptimized &&
162
+ !recordingVideoOptimized
163
+ ) {
164
+ showAlert?.({
165
+ message:
166
+ 'Meeting display type can be either video, media, or all when recording display type is non-optimized video.',
167
+ type: 'danger',
168
+ duration: 3000
169
+ })
170
+ // Reset to previous values or handle as needed
171
+ meetingDisplayType = recordingDisplayType
172
+ updateMeetingDisplayType(meetingDisplayType)
173
+ meetingVideoOptimized = recordingVideoOptimized
174
+ updateMeetingVideoOptimized(meetingVideoOptimized)
175
+ return
176
+ } else if (
177
+ recordingDisplayType === 'media' &&
178
+ meetingDisplayType === 'video'
179
+ ) {
180
+ showAlert?.({
181
+ message:
182
+ 'Meeting display type can be either media or all when recording display type is media.',
183
+ type: 'danger',
184
+ duration: 3000
185
+ })
186
+
187
+ // Reset to previous values or handle as needed
188
+ meetingDisplayType = recordingDisplayType
189
+ updateMeetingDisplayType(meetingDisplayType)
190
+ return
191
+ } else if (
192
+ recordingDisplayType === 'all' &&
193
+ (meetingDisplayType === 'video' || meetingDisplayType === 'media')
194
+ ) {
195
+ showAlert?.({
196
+ message:
197
+ 'Meeting display type can be only all when recording display type is all.',
198
+ type: 'danger',
199
+ duration: 3000
200
+ })
201
+ // Reset to previous values or handle as needed
202
+ meetingDisplayType = recordingDisplayType
203
+ updateMeetingDisplayType(meetingDisplayType)
204
+ return
205
+ }
206
+ }
207
+
208
+ updateMeetingDisplayType(meetingDisplayType)
209
+ updateMeetingVideoOptimized(meetingVideoOptimized)
210
+
211
+ // Close the modal or perform additional actions
212
+ updateIsDisplaySettingsModalVisible(false)
213
+
214
+ if (
215
+ prevMeetingDisplayType !== meetingDisplayType ||
216
+ prevForceFullDisplay !== forceFullDisplay
217
+ ) {
218
+ if (
219
+ breakOutRoomStarted &&
220
+ !breakOutRoomEnded &&
221
+ meetingDisplayType !== 'all'
222
+ ) {
223
+ showAlert?.({
224
+ message:
225
+ 'Breakout room is active. Display type can only be all.',
226
+ type: 'danger'
227
+ })
228
+ meetingDisplayType = prevMeetingDisplayType
229
+ updateMeetingDisplayType(prevMeetingDisplayType)
230
+ return
231
+ }
232
+
233
+ updateFirstAll(meetingDisplayType !== 'all' ? true : false)
234
+ updateUpdateMainWindow(true)
235
+ await onScreenChanges({
236
+ changed: true,
237
+ parameters: { ...parameters, meetingDisplayType, forceFullDisplay }
238
+ })
239
+ updatePrevForceFullDisplay(forceFullDisplay)
240
+ updatePrevMeetingDisplayType(meetingDisplayType)
241
+ }
242
+ }
@@ -0,0 +1,60 @@
1
+ import type { Socket } from 'socket.io-client'
2
+
3
+ export interface ConfirmExitOptions {
4
+ socket: Socket
5
+ localSocket?: Socket
6
+ member: string
7
+ roomName: string
8
+ ban?: boolean
9
+ }
10
+
11
+ // Export the type definition for the function
12
+ export type ConfirmExitType = (options: ConfirmExitOptions) => Promise<void>
13
+
14
+ /**
15
+ * Confirms the exit of a member from a room and optionally bans them.
16
+ *
17
+ * @param {ConfirmExitOptions} options - The options for confirming the exit.
18
+ * @param {Socket} options.socket - The socket instance to emit the event.
19
+ * @param {Socket} [options.localSocket] - The local socket instance to emit the event.
20
+ * @param {string} options.member - The member who is exiting.
21
+ * @param {string} options.roomName - The name of the room the member is exiting from.
22
+ * @param {boolean} [options.ban=false] - Whether to ban the member from the room.
23
+ * @returns {Promise<void>} A promise that resolves when the exit is confirmed.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const options = {
28
+ * socket: socketInstance,
29
+ * localSocket: localSocketInstance,
30
+ * member: "JohnDoe",
31
+ * roomName: "Room123",
32
+ * ban: true,
33
+ * };
34
+ * await confirmExit(options);
35
+ * ```
36
+ */
37
+
38
+ export const confirmExit = async ({
39
+ socket,
40
+ localSocket,
41
+ member,
42
+ roomName,
43
+ ban = false
44
+ }: ConfirmExitOptions): Promise<void> => {
45
+ // Emit a socket event to disconnect the user from the room
46
+ socket.emit('disconnectUser', {
47
+ member: member,
48
+ roomName: roomName,
49
+ ban: ban
50
+ })
51
+
52
+ if (localSocket && localSocket.id) {
53
+ // Emit a local socket event to disconnect the user from the room
54
+ localSocket.emit('disconnectUser', {
55
+ member: member,
56
+ roomName: roomName,
57
+ ban: ban
58
+ })
59
+ }
60
+ }
@@ -0,0 +1,2 @@
1
+ export * from './confirmExit'
2
+ export * from './launchConfirmExit'
@@ -0,0 +1,29 @@
1
+ export interface LaunchConfirmExitOptions {
2
+ updateIsConfirmExitModalVisible: (isVisible: boolean) => void
3
+ isConfirmExitModalVisible: boolean
4
+ }
5
+
6
+ export type LaunchConfirmExitType = (options: LaunchConfirmExitOptions) => void
7
+
8
+ /**
9
+ * Toggles the visibility of the confirmation exit modal.
10
+ *
11
+ * @param {LaunchConfirmExitOptions} options - The options for launching the confirmation exit modal.
12
+ * @param {Function} options.updateIsConfirmExitModalVisible - Function to update the visibility state of the confirmation exit modal.
13
+ * @param {boolean} options.isConfirmExitModalVisible - Current visibility state of the confirmation exit modal.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const options = {
18
+ * updateIsConfirmExitModalVisible: setIsConfirmExitModalVisible,
19
+ * isConfirmExitModalVisible: false,
20
+ * }
21
+ * launchConfirmExit(options)
22
+ * ```
23
+ */
24
+ export const launchConfirmExit: LaunchConfirmExitType = ({
25
+ updateIsConfirmExitModalVisible,
26
+ isConfirmExitModalVisible,
27
+ }) => {
28
+ updateIsConfirmExitModalVisible(!isConfirmExitModalVisible)
29
+ }
@@ -0,0 +1,5 @@
1
+ // Export all shared methods
2
+ // Prejoin methods
3
+ export * from './prejoin';
4
+ // Welcome methods
5
+ export * from './welcome';
@@ -0,0 +1,61 @@
1
+ export interface LaunchMediaSettingsOptions {
2
+ updateIsMediaSettingsModalVisible: (isVisible: boolean) => void
3
+ isMediaSettingsModalVisible: boolean
4
+ mediaDevices: MediaDevices
5
+ audioInputs: MediaDeviceInfo[]
6
+ videoInputs: MediaDeviceInfo[]
7
+ updateAudioInputs: (inputs: MediaDeviceInfo[]) => void
8
+ updateVideoInputs: (inputs: MediaDeviceInfo[]) => void
9
+ }
10
+
11
+ export type LaunchMediaSettingsType = (options: LaunchMediaSettingsOptions) => Promise<void>
12
+
13
+ /**
14
+ * Launches the media settings modal and updates the available audio and video input devices.
15
+ *
16
+ * @param {LaunchMediaSettingsOptions} options - The options for launching media settings.
17
+ * @param {Function} options.updateIsMediaSettingsModalVisible - Function to update the visibility state of the media settings modal.
18
+ * @param {boolean} options.isMediaSettingsModalVisible - Current visibility state of the media settings modal.
19
+ * @param {MediaDevices} options.mediaDevices - MediaDevices interface to enumerate media devices.
20
+ * @param {MediaDeviceInfo[]} options.audioInputs - Array to store available audio input devices.
21
+ * @param {MediaDeviceInfo[]} options.videoInputs - Array to store available video input devices.
22
+ * @param {Function} options.updateAudioInputs - Function to update the available audio input devices.
23
+ * @param {Function} options.updateVideoInputs - Function to update the available video input devices.
24
+ * @returns {Promise<void>} A promise that resolves when the media settings have been updated.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * launchMediaSettings({
29
+ * updateIsMediaSettingsModalVisible: (isVisible) => console.log('Modal visible:', isVisible),
30
+ * isMediaSettingsModalVisible: false,
31
+ * mediaDevices: navigator.mediaDevices,
32
+ * audioInputs: [],
33
+ * videoInputs: [],
34
+ * updateAudioInputs: (inputs) => console.log('Audio Inputs:', inputs),
35
+ * updateVideoInputs: (inputs) => console.log('Video Inputs:', inputs),
36
+ * })
37
+ * ```
38
+ */
39
+ export const launchMediaSettings: LaunchMediaSettingsType = async ({
40
+ updateIsMediaSettingsModalVisible,
41
+ isMediaSettingsModalVisible,
42
+ mediaDevices,
43
+ audioInputs,
44
+ videoInputs,
45
+ updateAudioInputs,
46
+ updateVideoInputs,
47
+ }) => {
48
+ if (!isMediaSettingsModalVisible) {
49
+ try {
50
+ const devices = await mediaDevices.enumerateDevices()
51
+ videoInputs = devices.filter((device) => device.kind === 'videoinput')
52
+ audioInputs = devices.filter((device) => device.kind === 'audioinput')
53
+ updateVideoInputs(videoInputs)
54
+ updateAudioInputs(audioInputs)
55
+ } catch (error) {
56
+ console.log('Error getting media devices', error)
57
+ }
58
+ }
59
+
60
+ updateIsMediaSettingsModalVisible(!isMediaSettingsModalVisible)
61
+ }
@@ -0,0 +1,28 @@
1
+ export interface LaunchMenuModalOptions {
2
+ updateIsMenuModalVisible: (isVisible: boolean) => void
3
+ isMenuModalVisible: boolean
4
+ }
5
+
6
+ export type LaunchMenuModalType = (options: LaunchMenuModalOptions) => void
7
+
8
+ /**
9
+ * Toggles the visibility of the menu modal.
10
+ *
11
+ * @param {LaunchMenuModalOptions} options - The options for launching the menu modal.
12
+ * @param {Function} options.updateIsMenuModalVisible - Function to update the visibility state of the menu modal.
13
+ * @param {boolean} options.isMenuModalVisible - Current visibility state of the menu modal.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * launchMenuModal({
18
+ * updateIsMenuModalVisible: (isVisible) => console.log("Menu modal visibility:", isVisible),
19
+ * isMenuModalVisible: false,
20
+ * });
21
+ * ```
22
+ */
23
+ export const launchMenuModal: LaunchMenuModalType = ({
24
+ updateIsMenuModalVisible,
25
+ isMenuModalVisible,
26
+ }) => {
27
+ updateIsMenuModalVisible(!isMenuModalVisible)
28
+ }
@@ -0,0 +1 @@
1
+ export { sendMessage, type SendMessageType, type SendMessageOptions } from './sendMessage';
@@ -0,0 +1,27 @@
1
+ export interface LaunchMessagesOptions {
2
+ updateIsMessagesModalVisible: (visible: boolean) => void
3
+ isMessagesModalVisible: boolean
4
+ }
5
+
6
+ export type LaunchMessagesType = (options: LaunchMessagesOptions) => void
7
+
8
+ /**
9
+ * Toggles the visibility state of the messages modal.
10
+ *
11
+ * @param {LaunchMessagesOptions} options - The options object.
12
+ * @param {Function} options.updateIsMessagesModalVisible - Function to update the visibility state of the messages modal.
13
+ * @param {boolean} options.isMessagesModalVisible - Current visibility state of the messages modal.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const options: LaunchMessagesOptions = {
18
+ * updateIsMessagesModalVisible: setModalVisibilityFunction,
19
+ * isMessagesModalVisible: false,
20
+ * }
21
+ *
22
+ * launchMessages(options)
23
+ * ```
24
+ */
25
+ export const launchMessages: LaunchMessagesType = ({ updateIsMessagesModalVisible, isMessagesModalVisible }) => {
26
+ updateIsMessagesModalVisible(!isMessagesModalVisible)
27
+ }
@@ -0,0 +1,175 @@
1
+ import { Socket } from "socket.io-client";
2
+ import type {
3
+ CoHostResponsibility,
4
+ EventType,
5
+ Message,
6
+ ShowAlert,
7
+ } from "../../types/types";
8
+
9
+ export interface SendMessageOptions {
10
+ message: string;
11
+ receivers: string[];
12
+ group: boolean;
13
+ messagesLength: number;
14
+ member: string;
15
+ sender: string;
16
+ islevel: string;
17
+ eventType?: EventType;
18
+ showAlert?: ShowAlert;
19
+ coHostResponsibility: CoHostResponsibility[];
20
+ coHost: string;
21
+ roomName: string;
22
+ socket: Socket;
23
+ chatSetting: string;
24
+ }
25
+
26
+ // Export the type
27
+ export type SendMessageType = (options: SendMessageOptions) => Promise<void>;
28
+
29
+ /**
30
+ * Sends a message to the server.
31
+ *
32
+ * @param {SendMessageOptions} options - The options for sending a message.
33
+ * @param {string} options.message - The message content to be sent.
34
+ * @param {string[]} options.receivers - The list of receivers for the message.
35
+ * @param {boolean} options.group - Indicates if the message is for a group.
36
+ * @param {number} options.messagesLength - The current number of messages.
37
+ * @param {string} options.member - The member sending the message.
38
+ * @param {string} options.sender - The sender of the message.
39
+ * @param {string} options.islevel - The level of the sender (e.g., "2" for admin).
40
+ * @param {EventType} [options.eventType] - The type of event (e.g., "broadcast", "chat", "conference").
41
+ * @param {ShowAlert} [options.showAlert] - Function to show alerts to the user.
42
+ * @param {CoHostResponsibility[]} options.coHostResponsibility - Array of co-host responsibilities.
43
+ * @param {string} options.coHost - The co-host member name.
44
+ * @param {string} options.roomName - The name of the room.
45
+ * @param {Socket} options.socket - The socket instance for communication.
46
+ * @param {string} options.chatSetting - The chat setting for the event room.
47
+ * @returns {Promise<void>} A promise that resolves when the message is sent.
48
+ *
49
+ * @throws Will show an alert if the message count exceeds the limit, if the message is invalid, or if the user is not allowed to send a message.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * await sendMessage({
54
+ * message: "Hello, World!",
55
+ * receivers: ["user1", "user2"],
56
+ * group: true,
57
+ * messagesLength: 50,
58
+ * member: "user3",
59
+ * sender: "user3",
60
+ * islevel: "2",
61
+ * eventType: "chat",
62
+ * showAlert: ({ message, type }) => console.log(message, type),
63
+ * coHostResponsibility: [{ name: "chat", value: true }],
64
+ * coHost: "coHostUser",
65
+ * roomName: "mainRoom",
66
+ * socket: socketInstance,
67
+ * chatSetting: "allow",
68
+ * });
69
+ * ```
70
+ */
71
+
72
+ export const sendMessage = async ({
73
+ message,
74
+ receivers,
75
+ group,
76
+ messagesLength,
77
+ member,
78
+ sender,
79
+ islevel,
80
+ eventType,
81
+ showAlert,
82
+ coHostResponsibility,
83
+ coHost,
84
+ roomName,
85
+ socket,
86
+ chatSetting,
87
+ }: SendMessageOptions): Promise<void> => {
88
+ let chatValue = false;
89
+
90
+ // Check if messages count exceeds the limit
91
+ if (eventType === "broadcast") {
92
+ if (messagesLength >= 100) {
93
+ showAlert?.({
94
+ message: "You have reached the maximum number of messages",
95
+ type: "danger",
96
+ duration: 3000,
97
+ });
98
+ return;
99
+ }
100
+ } else if (eventType === "chat") {
101
+ if (messagesLength >= 500) {
102
+ showAlert?.({
103
+ message: "You have reached the maximum number of messages",
104
+ type: "danger",
105
+ duration: 3000,
106
+ });
107
+ return;
108
+ }
109
+ } else {
110
+ if (messagesLength >= 100000) {
111
+ showAlert?.({
112
+ message: "You have reached the maximum number of messages",
113
+ type: "danger",
114
+ duration: 3000,
115
+ });
116
+ return;
117
+ }
118
+ }
119
+
120
+ // Check if message is valid
121
+ if (!message || message === "") {
122
+ showAlert?.({
123
+ message: "Message is not valid.",
124
+ type: "danger",
125
+ duration: 3000,
126
+ });
127
+ return;
128
+ }
129
+
130
+ // Check if receivers is valid
131
+ if (receivers.length < 1 && group === false) {
132
+ showAlert?.({
133
+ message: "Please select a message to reply to",
134
+ type: "danger",
135
+ duration: 3000,
136
+ });
137
+ return;
138
+ }
139
+
140
+ // Create message object
141
+ const messageObject: Message = {
142
+ sender: sender ? sender : member,
143
+ receivers: receivers,
144
+ message: message,
145
+ timestamp: new Date().toLocaleTimeString(),
146
+ group: group !== undefined && group !== null ? group : false,
147
+ };
148
+
149
+ try {
150
+ // Check co-host responsibility for chat
151
+ chatValue = coHostResponsibility.find((item) => item.name === "chat")?.value ?? false;
152
+ } catch (error) {
153
+ console.error(error);
154
+ }
155
+
156
+ if (islevel === "2" || (coHost === member && chatValue === true)) {
157
+ // Allow sending message
158
+ } else {
159
+ // Check if user is allowed to send a message in the event room
160
+ if (!chatSetting) {
161
+ showAlert?.({
162
+ message: "You are not allowed to send a message in this event room",
163
+ type: "danger",
164
+ duration: 3000,
165
+ });
166
+ return;
167
+ }
168
+ }
169
+
170
+ // Send the message to the server
171
+ socket.emit("sendMessage", {
172
+ messageObject: messageObject,
173
+ roomName: roomName,
174
+ });
175
+ };
@@ -0,0 +1,3 @@
1
+ export { muteParticipants, type MuteParticipantsOptions } from './muteParticipants';
2
+ export { messageParticipants, type MessageParticipantsOptions } from './messageParticipants';
3
+ export { removeParticipants, type RemoveParticipantsOptions } from './removeParticipants';
@@ -0,0 +1,25 @@
1
+ export interface LaunchParticipantsOptions {
2
+ updateIsParticipantsModalVisible: (isVisible: boolean) => void
3
+ isParticipantsModalVisible: boolean
4
+ }
5
+
6
+ export type LaunchParticipantsType = (options: LaunchParticipantsOptions) => void
7
+
8
+ /**
9
+ * Toggles the visibility of the participants modal.
10
+ *
11
+ * @param {LaunchParticipantsOptions} options - The options for toggling the participants modal.
12
+ * @param {Function} options.updateIsParticipantsModalVisible - Function to update the visibility state of the participants modal.
13
+ * @param {boolean} options.isParticipantsModalVisible - Current visibility state of the participants modal.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * launchParticipants({
18
+ * updateIsParticipantsModalVisible: (isVisible) => setParticipantsModalVisible(isVisible),
19
+ * isParticipantsModalVisible: true,
20
+ * })
21
+ * ```
22
+ */
23
+ export const launchParticipants: LaunchParticipantsType = ({ updateIsParticipantsModalVisible, isParticipantsModalVisible }) => {
24
+ updateIsParticipantsModalVisible(!isParticipantsModalVisible)
25
+ }