mediasfu-shared 1.0.1 → 1.0.2
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 -21
- package/README.md +103 -222
- package/dist/index.cjs +7500 -2163
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4203 -273
- package/dist/index.js +7521 -2184
- package/dist/index.js.map +1 -1
- package/package.json +85 -78
- package/src/ProducerClient/producerClientEmits/joinRoomClient.ts +57 -0
- package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +401 -0
- package/src/consumers/addVideosGrid.ts +3 -2
- package/src/consumers/changeVids.ts +111 -41
- package/src/consumers/checkPermission.ts +35 -1
- package/src/consumers/connectRecvTransport.ts +42 -1
- package/src/consumers/consumerResume.ts +2 -2
- package/src/consumers/dispStreams.ts +83 -37
- package/src/consumers/frameworkConsumerContract.ts +6 -0
- package/src/consumers/generatePageContent.ts +24 -10
- package/src/consumers/getPipedProducersAlt.ts +112 -16
- package/src/consumers/gridLayout/addVideosGrid.engine.ts +42 -0
- package/src/consumers/gridLayout/prepopulateUserMedia.engine.ts +444 -0
- package/src/consumers/mixStreams.ts +45 -14
- package/src/consumers/onScreenChanges.ts +25 -10
- package/src/consumers/prepopulateUserMedia.ts +3 -2
- package/src/consumers/processConsumerTransports.ts +68 -23
- package/src/consumers/processConsumerTransportsAudio.ts +53 -16
- package/src/consumers/reUpdateInter.ts +61 -21
- package/src/consumers/readjust.ts +30 -14
- package/src/consumers/reorderStreams.ts +76 -42
- package/src/consumers/resumePauseAudioStreams.ts +66 -17
- package/src/consumers/resumePauseStreams.ts +53 -10
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +8 -0
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +114 -0
- package/src/consumers/socketReceiveMethods/producerClosed.ts +13 -0
- package/src/consumers/streamSuccessScreen.ts +2 -2
- package/src/consumers/streamSuccessVideo.ts +5 -0
- package/src/consumers/translationConsumerSwitch.ts +299 -0
- package/src/index.ts +85 -1
- package/src/methods/coHostMethods/modifyCoHostSettings.ts +9 -9
- package/src/methods/displaySettings/modifyDisplaySettings.ts +5 -0
- package/src/methods/index.ts +66 -0
- package/src/methods/message/sendMessage.ts +12 -29
- package/src/methods/panelists/focusPanelists.ts +83 -0
- package/src/methods/panelists/index.ts +3 -0
- package/src/methods/panelists/launchPanelists.ts +13 -0
- package/src/methods/panelists/updatePanelists.ts +135 -0
- package/src/methods/permissions/index.ts +3 -0
- package/src/methods/permissions/launchPermissions.ts +13 -0
- package/src/methods/permissions/updateParticipantPermission.ts +127 -0
- package/src/methods/permissions/updatePermissionConfig.ts +52 -0
- package/src/methods/polls/pollUpdated.ts +88 -0
- package/src/methods/recording/confirmRecording.ts +15 -12
- package/src/methods/recording/recordResumeTimer.ts +2 -2
- package/src/methods/recording/recordStartTimer.ts +2 -2
- package/src/methods/recording/timeLeftRecording.ts +25 -0
- package/src/methods/requests/hostRequestResponse.ts +153 -0
- package/src/methods/settings/modifySettings.ts +17 -17
- package/src/methods/socketReceive/allMembers.ts +450 -0
- package/src/methods/socketReceive/allMembersRest.ts +480 -0
- package/src/methods/socketReceive/allWaitingRoomMembers.ts +35 -0
- package/src/methods/socketReceive/banParticipant.ts +73 -0
- package/src/methods/socketReceive/controlMediaHost.ts +280 -0
- package/src/methods/socketReceive/disconnect.ts +40 -0
- package/src/methods/socketReceive/disconnectUserSelf.ts +56 -0
- package/src/methods/socketReceive/getDomains.ts +112 -0
- package/src/methods/socketReceive/meetingEnded.ts +49 -0
- package/src/methods/socketReceive/meetingStillThere.ts +26 -0
- package/src/methods/socketReceive/panelistReceiveMethods.ts +195 -0
- package/src/methods/socketReceive/participantRequested.ts +48 -0
- package/src/methods/socketReceive/permissionReceiveMethods.ts +59 -0
- package/src/methods/socketReceive/personJoined.ts +35 -0
- package/src/methods/socketReceive/producerMediaClosed.ts +223 -0
- package/src/methods/socketReceive/producerMediaPaused.ts +267 -0
- package/src/methods/socketReceive/producerMediaResumed.ts +157 -0
- package/src/methods/socketReceive/reInitiateRecording.ts +53 -0
- package/src/methods/socketReceive/receiveMessage.ts +117 -0
- package/src/methods/socketReceive/recordingNotice.ts +286 -0
- package/src/methods/socketReceive/roomRecordParams.ts +122 -0
- package/src/methods/socketReceive/screenProducerId.ts +61 -0
- package/src/methods/socketReceive/startRecords.ts +46 -0
- package/src/methods/socketReceive/stoppedRecording.ts +44 -0
- package/src/methods/socketReceive/translationReceiveMethods.ts +581 -0
- package/src/methods/socketReceive/updateConsumingDomains.ts +128 -0
- package/src/methods/socketReceive/updateMediaSettings.ts +45 -0
- package/src/methods/socketReceive/updatedCoHost.ts +75 -0
- package/src/methods/socketReceive/userWaiting.ts +45 -0
- package/src/methods/stream/clickAudio.ts +380 -0
- package/src/methods/stream/clickChat.ts +36 -0
- package/src/methods/stream/clickScreenShare.ts +173 -0
- package/src/methods/stream/clickVideo.ts +22 -5
- package/src/methods/stream/index.ts +1 -0
- package/src/methods/utils/SoundPlayer.ts +31 -0
- package/src/methods/utils/checkLimitsAndMakeRequest.ts +156 -2
- package/src/methods/utils/createResponseJoinRoom.ts +47 -0
- package/src/methods/utils/createRoomOnMediaSFU.ts +160 -0
- package/src/methods/utils/formatNumber.ts +42 -0
- package/src/methods/utils/generateRandomMessages.ts +70 -0
- package/src/methods/utils/generateRandomParticipants.ts +100 -0
- package/src/methods/utils/generateRandomPolls.ts +43 -0
- package/src/methods/utils/generateRandomRequestList.ts +51 -0
- package/src/methods/utils/generateRandomWaitingRoomList.ts +17 -0
- package/src/methods/utils/getModalPosition.ts +23 -0
- package/src/methods/utils/getOverlayPosition.ts +37 -0
- package/src/methods/utils/initialValuesState.ts +405 -0
- package/src/methods/utils/joinRoomOnMediaSFU.ts +124 -0
- package/src/methods/utils/liveSubtitle.ts +107 -0
- package/src/methods/utils/meetingTimeRemaining.ts +33 -0
- package/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts +72 -0
- package/src/methods/utils/producer/aParams.ts +10 -0
- package/src/methods/utils/producer/hParams.ts +26 -0
- package/src/methods/utils/producer/screenParams.ts +13 -0
- package/src/methods/utils/producer/vParams.ts +26 -0
- package/src/methods/utils/producer/videoCaptureConstraints.ts +65 -0
- package/src/methods/utils/resolveMediaSFURoomApi.ts +16 -0
- package/src/methods/utils/sleep.ts +24 -0
- package/src/methods/utils/translationLanguages.ts +308 -0
- package/src/methods/utils/webrtc.ts +44 -0
- package/src/methods/welcome/handleWelcomeRequest.ts +11 -2
- package/src/methods/welcome/index.ts +5 -1
- package/src/methods/whiteboard/captureCanvasStream.ts +128 -0
- package/src/producers/producerEmits/joinConRoom.ts +2 -2
- package/src/producers/producerEmits/joinLocalRoom.ts +240 -0
- package/src/producers/producerEmits/joinRoom.ts +129 -0
- package/src/types/shared-base-types.ts +14 -3
- package/src/types/types.ts +255 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { Participant, ShowAlert } from '../../types/types';
|
|
2
|
+
|
|
3
|
+
export interface PanelistData {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface PanelistsUpdatedData {
|
|
9
|
+
panelists: PanelistData[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface PanelistFocusChangedData {
|
|
13
|
+
focusEnabled: boolean;
|
|
14
|
+
panelists: PanelistData[];
|
|
15
|
+
muteOthersMic: boolean;
|
|
16
|
+
muteOthersCamera: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ControlMediaData {
|
|
20
|
+
type: 'audio' | 'video';
|
|
21
|
+
action: 'mute' | 'unmute';
|
|
22
|
+
reason?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface AddedAsPanelistData {
|
|
26
|
+
message: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface RemovedFromPanelistsData {
|
|
30
|
+
message: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface PanelistsUpdatedOptions {
|
|
34
|
+
data: PanelistsUpdatedData;
|
|
35
|
+
updatePanelists?: (panelists: Participant[]) => void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface PanelistFocusChangedOptions {
|
|
39
|
+
data: PanelistFocusChangedData;
|
|
40
|
+
updatePanelistsFocused?: (focused: boolean) => void;
|
|
41
|
+
updateMuteOthersMic?: (mute: boolean) => void;
|
|
42
|
+
updateMuteOthersCamera?: (mute: boolean) => void;
|
|
43
|
+
updatePanelists?: (panelists: Participant[]) => void;
|
|
44
|
+
currentPanelistsFocused?: boolean;
|
|
45
|
+
currentPanelists?: Participant[];
|
|
46
|
+
onScreenChanges?: () => Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ControlMediaOptions {
|
|
50
|
+
data: ControlMediaData;
|
|
51
|
+
showAlert?: ShowAlert;
|
|
52
|
+
clickAudio?: () => void;
|
|
53
|
+
clickVideo?: () => void;
|
|
54
|
+
audioAlreadyOn?: boolean;
|
|
55
|
+
videoAlreadyOn?: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface AddedAsPanelistOptions {
|
|
59
|
+
data: AddedAsPanelistData;
|
|
60
|
+
showAlert?: ShowAlert;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface RemovedFromPanelistsOptions {
|
|
64
|
+
data: RemovedFromPanelistsData;
|
|
65
|
+
showAlert?: ShowAlert;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type PanelistsUpdatedType = (options: PanelistsUpdatedOptions) => Promise<void>;
|
|
69
|
+
export type PanelistFocusChangedType = (options: PanelistFocusChangedOptions) => Promise<void>;
|
|
70
|
+
export type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;
|
|
71
|
+
export type AddedAsPanelistType = (options: AddedAsPanelistOptions) => Promise<void>;
|
|
72
|
+
export type RemovedFromPanelistsType = (options: RemovedFromPanelistsOptions) => Promise<void>;
|
|
73
|
+
|
|
74
|
+
export const panelistsUpdated: PanelistsUpdatedType = async ({
|
|
75
|
+
data,
|
|
76
|
+
updatePanelists,
|
|
77
|
+
}): Promise<void> => {
|
|
78
|
+
try {
|
|
79
|
+
const { panelists } = data;
|
|
80
|
+
|
|
81
|
+
if (updatePanelists) {
|
|
82
|
+
updatePanelists(
|
|
83
|
+
panelists.map((panelist) => ({
|
|
84
|
+
id: panelist.id,
|
|
85
|
+
name: panelist.name,
|
|
86
|
+
audioID: '',
|
|
87
|
+
videoID: '',
|
|
88
|
+
} as Participant)),
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error('Error handling panelistsUpdated:', error);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const panelistFocusChanged: PanelistFocusChangedType = async ({
|
|
97
|
+
data,
|
|
98
|
+
updatePanelistsFocused,
|
|
99
|
+
updateMuteOthersMic,
|
|
100
|
+
updateMuteOthersCamera,
|
|
101
|
+
updatePanelists,
|
|
102
|
+
currentPanelistsFocused,
|
|
103
|
+
currentPanelists,
|
|
104
|
+
onScreenChanges,
|
|
105
|
+
}): Promise<void> => {
|
|
106
|
+
try {
|
|
107
|
+
const { focusEnabled, panelists, muteOthersMic, muteOthersCamera } = data;
|
|
108
|
+
const focusChanged = currentPanelistsFocused !== undefined && currentPanelistsFocused !== focusEnabled;
|
|
109
|
+
const currentPanelistIds = (currentPanelists || []).map((panelist) => panelist.id).sort().join(',');
|
|
110
|
+
const newPanelistIds = panelists.map((panelist) => panelist.id).sort().join(',');
|
|
111
|
+
const panelistsChanged = currentPanelistIds !== newPanelistIds;
|
|
112
|
+
|
|
113
|
+
updatePanelistsFocused?.(focusEnabled);
|
|
114
|
+
updateMuteOthersMic?.(muteOthersMic);
|
|
115
|
+
updateMuteOthersCamera?.(muteOthersCamera);
|
|
116
|
+
|
|
117
|
+
if (updatePanelists) {
|
|
118
|
+
updatePanelists(
|
|
119
|
+
panelists.map((panelist) => ({
|
|
120
|
+
id: panelist.id,
|
|
121
|
+
name: panelist.name,
|
|
122
|
+
audioID: '',
|
|
123
|
+
videoID: '',
|
|
124
|
+
} as Participant)),
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if ((focusChanged || panelistsChanged) && onScreenChanges) {
|
|
129
|
+
await onScreenChanges();
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
console.error('Error handling panelistFocusChanged:', error);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export const panelistControlMedia: ControlMediaType = async ({
|
|
137
|
+
data,
|
|
138
|
+
showAlert,
|
|
139
|
+
clickAudio,
|
|
140
|
+
clickVideo,
|
|
141
|
+
audioAlreadyOn,
|
|
142
|
+
videoAlreadyOn,
|
|
143
|
+
}: ControlMediaOptions): Promise<void> => {
|
|
144
|
+
try {
|
|
145
|
+
const { type, action, reason } = data;
|
|
146
|
+
|
|
147
|
+
if (action === 'mute') {
|
|
148
|
+
if (type === 'audio' && audioAlreadyOn && clickAudio) {
|
|
149
|
+
clickAudio();
|
|
150
|
+
} else if (type === 'video' && videoAlreadyOn && clickVideo) {
|
|
151
|
+
clickVideo();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (showAlert && reason) {
|
|
155
|
+
showAlert({
|
|
156
|
+
message: `Your ${type === 'audio' ? 'microphone' : 'camera'} has been muted. ${reason}`,
|
|
157
|
+
type: 'info',
|
|
158
|
+
duration: 3000,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.error('Error handling controlMedia:', error);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
export const addedAsPanelist: AddedAsPanelistType = async ({
|
|
168
|
+
data,
|
|
169
|
+
showAlert,
|
|
170
|
+
}: AddedAsPanelistOptions): Promise<void> => {
|
|
171
|
+
try {
|
|
172
|
+
showAlert?.({
|
|
173
|
+
message: data.message || 'You have been added as a panelist',
|
|
174
|
+
type: 'success',
|
|
175
|
+
duration: 3000,
|
|
176
|
+
});
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.error('Error handling addedAsPanelist:', error);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
export const removedFromPanelists: RemovedFromPanelistsType = async ({
|
|
183
|
+
data,
|
|
184
|
+
showAlert,
|
|
185
|
+
}: RemovedFromPanelistsOptions): Promise<void> => {
|
|
186
|
+
try {
|
|
187
|
+
showAlert?.({
|
|
188
|
+
message: data.message || 'You have been removed from panelists',
|
|
189
|
+
type: 'info',
|
|
190
|
+
duration: 3000,
|
|
191
|
+
});
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.error('Error handling removedFromPanelists:', error);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Request, WaitingRoomParticipant } from '../../types/types';
|
|
2
|
+
|
|
3
|
+
export interface ParticipantRequestedOptions {
|
|
4
|
+
userRequest: Request;
|
|
5
|
+
requestList: Request[];
|
|
6
|
+
waitingRoomList: WaitingRoomParticipant[];
|
|
7
|
+
updateTotalReqWait: (count: number) => void;
|
|
8
|
+
updateRequestList: (list: Request[]) => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type ParticipantRequestedType = (
|
|
12
|
+
options: ParticipantRequestedOptions,
|
|
13
|
+
) => Promise<void>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Appends a new participant request and refreshes the combined request/waiting count.
|
|
17
|
+
*
|
|
18
|
+
* @param {ParticipantRequestedOptions} options - Request payload and state setters.
|
|
19
|
+
* @returns {Promise<void>} Resolves after the request state is updated.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* await participantRequested({
|
|
24
|
+
* userRequest,
|
|
25
|
+
* requestList,
|
|
26
|
+
* waitingRoomList,
|
|
27
|
+
* updateRequestList: setRequestList,
|
|
28
|
+
* updateTotalReqWait: setTotalReqWait,
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export const participantRequested = async ({
|
|
33
|
+
userRequest,
|
|
34
|
+
requestList,
|
|
35
|
+
waitingRoomList,
|
|
36
|
+
updateTotalReqWait,
|
|
37
|
+
updateRequestList,
|
|
38
|
+
}: ParticipantRequestedOptions): Promise<void> => {
|
|
39
|
+
const hasMatchingRequest = requestList.some(
|
|
40
|
+
(request) => request.id === userRequest.id && request.icon === userRequest.icon,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const updatedRequestList = hasMatchingRequest
|
|
44
|
+
? requestList
|
|
45
|
+
: [...requestList, userRequest];
|
|
46
|
+
updateRequestList(updatedRequestList);
|
|
47
|
+
updateTotalReqWait(updatedRequestList.length + waitingRoomList.length);
|
|
48
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ShowAlert } from '../../types/types';
|
|
2
|
+
import type {
|
|
3
|
+
PermissionConfig,
|
|
4
|
+
} from '../permissions/updatePermissionConfig';
|
|
5
|
+
|
|
6
|
+
export interface PermissionUpdatedData {
|
|
7
|
+
newLevel: string;
|
|
8
|
+
message?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface PermissionConfigUpdatedData {
|
|
12
|
+
config: PermissionConfig;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface PermissionUpdatedOptions {
|
|
16
|
+
data: PermissionUpdatedData;
|
|
17
|
+
showAlert?: ShowAlert;
|
|
18
|
+
updateIslevel?: (level: string) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface PermissionConfigUpdatedOptions {
|
|
22
|
+
data: PermissionConfigUpdatedData;
|
|
23
|
+
updatePermissionConfig?: (config: PermissionConfig) => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type PermissionUpdatedType = (options: PermissionUpdatedOptions) => Promise<void>;
|
|
27
|
+
export type PermissionConfigUpdatedType = (options: PermissionConfigUpdatedOptions) => Promise<void>;
|
|
28
|
+
|
|
29
|
+
export const permissionUpdated: PermissionUpdatedType = async ({
|
|
30
|
+
data,
|
|
31
|
+
showAlert,
|
|
32
|
+
updateIslevel,
|
|
33
|
+
}: PermissionUpdatedOptions): Promise<void> => {
|
|
34
|
+
try {
|
|
35
|
+
const { newLevel, message } = data;
|
|
36
|
+
updateIslevel?.(newLevel);
|
|
37
|
+
|
|
38
|
+
if (showAlert && message) {
|
|
39
|
+
showAlert({
|
|
40
|
+
message,
|
|
41
|
+
type: newLevel === '1' ? 'success' : 'info',
|
|
42
|
+
duration: 3000,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error('Error handling permissionUpdated:', error);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export const permissionConfigUpdated: PermissionConfigUpdatedType = async ({
|
|
51
|
+
data,
|
|
52
|
+
updatePermissionConfig,
|
|
53
|
+
}: PermissionConfigUpdatedOptions): Promise<void> => {
|
|
54
|
+
try {
|
|
55
|
+
updatePermissionConfig?.(data.config);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error('Error handling permissionConfigUpdated:', error);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ShowAlert } from '../../types/types';
|
|
2
|
+
|
|
3
|
+
export interface PersonJoinedOptions {
|
|
4
|
+
showAlert?: ShowAlert;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export type PersonJoinedType = (options: PersonJoinedOptions) => Promise<void>;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Announces that a participant has joined the event.
|
|
12
|
+
*
|
|
13
|
+
* @param {PersonJoinedOptions} options - Join alert settings.
|
|
14
|
+
* @param {string} options.name - Participant name to display.
|
|
15
|
+
* @param {ShowAlert} [options.showAlert] - Optional alert presenter.
|
|
16
|
+
* @returns {Promise<void>} Resolves after the alert is dispatched.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* await personJoined({
|
|
21
|
+
* name: 'Alice',
|
|
22
|
+
* showAlert: ({ message }) => console.log(message),
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const personJoined = async ({
|
|
27
|
+
name,
|
|
28
|
+
showAlert,
|
|
29
|
+
}: PersonJoinedOptions): Promise<void> => {
|
|
30
|
+
showAlert?.({
|
|
31
|
+
message: `${name} joined the event.`,
|
|
32
|
+
type: 'success',
|
|
33
|
+
duration: 3000,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CloseAndResizeParameters,
|
|
3
|
+
PrepopulateUserMediaParameters,
|
|
4
|
+
ReorderStreamsParameters,
|
|
5
|
+
} from '../../types/types';
|
|
6
|
+
|
|
7
|
+
export interface ProducerMediaClosedCloseAndResizeOptions<TParameters = unknown> {
|
|
8
|
+
producerId: string;
|
|
9
|
+
kind: 'video' | 'screen' | 'audio' | 'screenshare';
|
|
10
|
+
parameters: TParameters;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type ProducerMediaClosedCloseAndResizeType<TParameters = unknown> = (
|
|
14
|
+
options: ProducerMediaClosedCloseAndResizeOptions<TParameters>,
|
|
15
|
+
) => Promise<unknown>;
|
|
16
|
+
|
|
17
|
+
export interface ProducerMediaClosedPrepopulateUserMediaOptions<
|
|
18
|
+
TParameters = unknown,
|
|
19
|
+
> {
|
|
20
|
+
name: string;
|
|
21
|
+
parameters: TParameters;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type ProducerMediaClosedPrepopulateUserMediaType<
|
|
25
|
+
TParameters = unknown,
|
|
26
|
+
> = (
|
|
27
|
+
options: ProducerMediaClosedPrepopulateUserMediaOptions<TParameters>,
|
|
28
|
+
) => Promise<unknown>;
|
|
29
|
+
|
|
30
|
+
export interface ProducerMediaClosedReorderStreamsOptions<
|
|
31
|
+
TParameters = unknown,
|
|
32
|
+
> {
|
|
33
|
+
add: boolean;
|
|
34
|
+
screenChanged?: boolean;
|
|
35
|
+
parameters: TParameters;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type ProducerMediaClosedReorderStreamsType<TParameters = unknown> = (
|
|
39
|
+
options: ProducerMediaClosedReorderStreamsOptions<TParameters>,
|
|
40
|
+
) => Promise<unknown>;
|
|
41
|
+
|
|
42
|
+
export interface ProducerMediaClosedTransportLike {
|
|
43
|
+
producerId: string;
|
|
44
|
+
consumerTransport?: {
|
|
45
|
+
close: () => Promise<void> | void;
|
|
46
|
+
};
|
|
47
|
+
consumer: {
|
|
48
|
+
close: () => Promise<void> | void;
|
|
49
|
+
};
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface ProducerMediaClosedParameters<
|
|
54
|
+
TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,
|
|
55
|
+
TCloseAndResizeParameters = CloseAndResizeParameters,
|
|
56
|
+
TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
|
|
57
|
+
TReorderStreamsParameters = ReorderStreamsParameters,
|
|
58
|
+
TAllParameters extends TCloseAndResizeParameters &
|
|
59
|
+
TPrepopulateUserMediaParameters &
|
|
60
|
+
TReorderStreamsParameters = TCloseAndResizeParameters &
|
|
61
|
+
TPrepopulateUserMediaParameters &
|
|
62
|
+
TReorderStreamsParameters,
|
|
63
|
+
> {
|
|
64
|
+
consumerTransports: TTransport[];
|
|
65
|
+
updateConsumerTransports: (transports: TTransport[]) => void;
|
|
66
|
+
hostLabel: string;
|
|
67
|
+
shared: boolean;
|
|
68
|
+
updateShared: (shared: boolean) => void;
|
|
69
|
+
updateShareScreenStarted: (started: boolean) => void;
|
|
70
|
+
updateScreenId: (screenId: string) => void;
|
|
71
|
+
updateShareEnded: (ended: boolean) => void;
|
|
72
|
+
closeAndResize: ProducerMediaClosedCloseAndResizeType<TCloseAndResizeParameters>;
|
|
73
|
+
prepopulateUserMedia: ProducerMediaClosedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;
|
|
74
|
+
reorderStreams: ProducerMediaClosedReorderStreamsType<TReorderStreamsParameters>;
|
|
75
|
+
getUpdatedAllParams: () =>
|
|
76
|
+
ProducerMediaClosedParameters<
|
|
77
|
+
TTransport,
|
|
78
|
+
TCloseAndResizeParameters,
|
|
79
|
+
TPrepopulateUserMediaParameters,
|
|
80
|
+
TReorderStreamsParameters,
|
|
81
|
+
TAllParameters
|
|
82
|
+
> & TAllParameters;
|
|
83
|
+
[key: string]: any;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface ProducerMediaClosedOptions<
|
|
87
|
+
TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,
|
|
88
|
+
TCloseAndResizeParameters = CloseAndResizeParameters,
|
|
89
|
+
TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
|
|
90
|
+
TReorderStreamsParameters = ReorderStreamsParameters,
|
|
91
|
+
TAllParameters extends TCloseAndResizeParameters &
|
|
92
|
+
TPrepopulateUserMediaParameters &
|
|
93
|
+
TReorderStreamsParameters = TCloseAndResizeParameters &
|
|
94
|
+
TPrepopulateUserMediaParameters &
|
|
95
|
+
TReorderStreamsParameters,
|
|
96
|
+
> {
|
|
97
|
+
producerId: string;
|
|
98
|
+
kind: 'video' | 'screen' | 'audio' | 'screenshare';
|
|
99
|
+
parameters:
|
|
100
|
+
ProducerMediaClosedParameters<
|
|
101
|
+
TTransport,
|
|
102
|
+
TCloseAndResizeParameters,
|
|
103
|
+
TPrepopulateUserMediaParameters,
|
|
104
|
+
TReorderStreamsParameters,
|
|
105
|
+
TAllParameters
|
|
106
|
+
> & TAllParameters;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export type ProducerMediaClosedType<
|
|
110
|
+
TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,
|
|
111
|
+
TCloseAndResizeParameters = CloseAndResizeParameters,
|
|
112
|
+
TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
|
|
113
|
+
TReorderStreamsParameters = ReorderStreamsParameters,
|
|
114
|
+
TAllParameters extends TCloseAndResizeParameters &
|
|
115
|
+
TPrepopulateUserMediaParameters &
|
|
116
|
+
TReorderStreamsParameters = TCloseAndResizeParameters &
|
|
117
|
+
TPrepopulateUserMediaParameters &
|
|
118
|
+
TReorderStreamsParameters,
|
|
119
|
+
> = (
|
|
120
|
+
options: ProducerMediaClosedOptions<
|
|
121
|
+
TTransport,
|
|
122
|
+
TCloseAndResizeParameters,
|
|
123
|
+
TPrepopulateUserMediaParameters,
|
|
124
|
+
TReorderStreamsParameters,
|
|
125
|
+
TAllParameters
|
|
126
|
+
>,
|
|
127
|
+
) => Promise<void>;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Tears down a producer consumer transport and reconciles shared screen state when a producer closes.
|
|
131
|
+
*
|
|
132
|
+
* @param {ProducerMediaClosedOptions} options - Producer identity and shared room/media callbacks.
|
|
133
|
+
* @returns {Promise<void>} Resolves once transport teardown and UI cleanup are complete.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* await producerMediaClosed({
|
|
138
|
+
* producerId: '12345',
|
|
139
|
+
* kind: 'screenshare',
|
|
140
|
+
* parameters,
|
|
141
|
+
* });
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export const producerMediaClosed = async <
|
|
145
|
+
TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,
|
|
146
|
+
TCloseAndResizeParameters = CloseAndResizeParameters,
|
|
147
|
+
TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,
|
|
148
|
+
TReorderStreamsParameters = ReorderStreamsParameters,
|
|
149
|
+
TAllParameters extends TCloseAndResizeParameters &
|
|
150
|
+
TPrepopulateUserMediaParameters &
|
|
151
|
+
TReorderStreamsParameters = TCloseAndResizeParameters &
|
|
152
|
+
TPrepopulateUserMediaParameters &
|
|
153
|
+
TReorderStreamsParameters,
|
|
154
|
+
>({
|
|
155
|
+
producerId,
|
|
156
|
+
kind,
|
|
157
|
+
parameters,
|
|
158
|
+
}: ProducerMediaClosedOptions<
|
|
159
|
+
TTransport,
|
|
160
|
+
TCloseAndResizeParameters,
|
|
161
|
+
TPrepopulateUserMediaParameters,
|
|
162
|
+
TReorderStreamsParameters,
|
|
163
|
+
TAllParameters
|
|
164
|
+
>): Promise<void> => {
|
|
165
|
+
const updatedParameters = parameters.getUpdatedAllParams();
|
|
166
|
+
|
|
167
|
+
const {
|
|
168
|
+
consumerTransports,
|
|
169
|
+
updateConsumerTransports,
|
|
170
|
+
hostLabel,
|
|
171
|
+
shared,
|
|
172
|
+
updateShared,
|
|
173
|
+
updateShareScreenStarted,
|
|
174
|
+
updateScreenId,
|
|
175
|
+
updateShareEnded,
|
|
176
|
+
closeAndResize,
|
|
177
|
+
prepopulateUserMedia,
|
|
178
|
+
reorderStreams,
|
|
179
|
+
} = updatedParameters;
|
|
180
|
+
|
|
181
|
+
const producerToClose = consumerTransports.find(
|
|
182
|
+
(transportData) => transportData.producerId === producerId,
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
if (producerToClose) {
|
|
186
|
+
try {
|
|
187
|
+
await producerToClose.consumerTransport?.close();
|
|
188
|
+
} catch (error) {
|
|
189
|
+
console.error('Error closing consumer transport:', error);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
producerToClose.consumer.close();
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.error('Error closing consumer:', error);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const updatedTransports = consumerTransports.filter(
|
|
199
|
+
(transportData) => transportData.producerId !== producerId,
|
|
200
|
+
);
|
|
201
|
+
updateConsumerTransports(updatedTransports);
|
|
202
|
+
|
|
203
|
+
await closeAndResize({
|
|
204
|
+
producerId,
|
|
205
|
+
kind,
|
|
206
|
+
parameters: updatedParameters,
|
|
207
|
+
});
|
|
208
|
+
} else if (kind === 'screenshare' || kind === 'screen') {
|
|
209
|
+
if (shared) {
|
|
210
|
+
updateShared(false);
|
|
211
|
+
} else {
|
|
212
|
+
updateShareScreenStarted(false);
|
|
213
|
+
updateScreenId('');
|
|
214
|
+
}
|
|
215
|
+
updateShareEnded(true);
|
|
216
|
+
await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });
|
|
217
|
+
await reorderStreams({
|
|
218
|
+
add: false,
|
|
219
|
+
screenChanged: true,
|
|
220
|
+
parameters: updatedParameters,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
};
|