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
|
@@ -1,13 +1,41 @@
|
|
|
1
1
|
import { Stream, Participant } from "../types/types";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
interface MixStreamLike {
|
|
4
|
+
producerId?: string | null;
|
|
5
|
+
muted?: boolean | null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
interface MixParticipantLike {
|
|
9
|
+
videoID?: string | null;
|
|
10
|
+
muted?: boolean | null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const getProducerId = (value: unknown): string | null | undefined => {
|
|
14
|
+
return (value as MixStreamLike | null | undefined)?.producerId;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const getVideoId = (value: unknown): string | null | undefined => {
|
|
18
|
+
return (value as MixParticipantLike | null | undefined)?.videoID;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const getMuted = (value: unknown): boolean | null | undefined => {
|
|
22
|
+
return (value as (MixStreamLike & MixParticipantLike) | null | undefined)?.muted;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export interface MixStreamsOptions<
|
|
26
|
+
TStream extends MixStreamLike = Stream,
|
|
27
|
+
TParticipant extends MixParticipantLike = Participant,
|
|
28
|
+
> {
|
|
29
|
+
alVideoStreams: (TStream | TParticipant)[];
|
|
30
|
+
non_alVideoStreams: TParticipant[];
|
|
31
|
+
ref_participants: (TStream | TParticipant)[];
|
|
7
32
|
}
|
|
8
33
|
|
|
9
34
|
// Export the type definition for the function
|
|
10
|
-
export type MixStreamsType =
|
|
35
|
+
export type MixStreamsType = <
|
|
36
|
+
TStream extends MixStreamLike = Stream,
|
|
37
|
+
TParticipant extends MixParticipantLike = Participant,
|
|
38
|
+
>(options: MixStreamsOptions<TStream, TParticipant>) => Promise<(TStream | TParticipant)[]>;
|
|
11
39
|
|
|
12
40
|
/**
|
|
13
41
|
* Mixes video and audio streams and participants based on specified parameters.
|
|
@@ -30,37 +58,40 @@ export type MixStreamsType = (options: MixStreamsOptions) => Promise<(Stream | P
|
|
|
30
58
|
*/
|
|
31
59
|
|
|
32
60
|
|
|
33
|
-
export async function mixStreams
|
|
61
|
+
export async function mixStreams<
|
|
62
|
+
TStream extends MixStreamLike = Stream,
|
|
63
|
+
TParticipant extends MixParticipantLike = Participant,
|
|
64
|
+
>({
|
|
34
65
|
alVideoStreams,
|
|
35
66
|
non_alVideoStreams,
|
|
36
67
|
ref_participants,
|
|
37
|
-
}: MixStreamsOptions): Promise<(
|
|
68
|
+
}: MixStreamsOptions<TStream, TParticipant>): Promise<(TStream | TParticipant)[]> {
|
|
38
69
|
try {
|
|
39
70
|
|
|
40
|
-
const mixedStreams: (
|
|
71
|
+
const mixedStreams: (TStream | TParticipant)[] = [];
|
|
41
72
|
|
|
42
73
|
// Find "youyou" or "youyouyou" stream
|
|
43
74
|
const youyouStream = alVideoStreams.find(
|
|
44
|
-
(obj) => obj
|
|
75
|
+
(obj) => getProducerId(obj) === "youyou" || getProducerId(obj) === "youyouyou"
|
|
45
76
|
);
|
|
46
77
|
|
|
47
78
|
let remainingAlVideoStreams = alVideoStreams.filter(
|
|
48
|
-
(obj) => obj
|
|
79
|
+
(obj) => getProducerId(obj) !== "youyou" && getProducerId(obj) !== "youyouyou"
|
|
49
80
|
);
|
|
50
81
|
|
|
51
82
|
// Separate unmuted and muted streams
|
|
52
83
|
const unmutedAlVideoStreams = remainingAlVideoStreams.filter((obj) => {
|
|
53
84
|
const participant = ref_participants.find(
|
|
54
|
-
(p) => p
|
|
85
|
+
(p) => getVideoId(p) === getProducerId(obj)
|
|
55
86
|
);
|
|
56
|
-
return !obj
|
|
87
|
+
return !getMuted(obj) && participant && getMuted(participant) === false;
|
|
57
88
|
});
|
|
58
89
|
|
|
59
90
|
const mutedAlVideoStreams = remainingAlVideoStreams.filter((obj) => {
|
|
60
91
|
const participant = ref_participants.find(
|
|
61
|
-
(p) => p
|
|
92
|
+
(p) => getVideoId(p) === getProducerId(obj)
|
|
62
93
|
);
|
|
63
|
-
return obj
|
|
94
|
+
return !!getMuted(obj) || (participant && getMuted(participant) === true);
|
|
64
95
|
});
|
|
65
96
|
|
|
66
97
|
const nonAlVideoStreams = [...non_alVideoStreams]; // Create a copy of non_alVideoStreams
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReorderStreamsParameters, EventType } from "../types/types";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
type OpaqueReorderStreamsInvoker = {
|
|
4
|
+
bivarianceHack: (options: any) => Promise<void>;
|
|
5
|
+
}["bivarianceHack"];
|
|
6
|
+
|
|
7
|
+
export interface OnScreenChangesParameters extends ReorderStreamsParameters<any, any, any> {
|
|
4
8
|
eventType: EventType;
|
|
5
9
|
shareScreenStarted: boolean;
|
|
6
10
|
shared: boolean;
|
|
@@ -10,18 +14,22 @@ export interface OnScreenChangesParameters extends ReorderStreamsParameters {
|
|
|
10
14
|
updateItemPageLimit: (value: number) => void;
|
|
11
15
|
updateMainHeightWidth: (value: number) => void;
|
|
12
16
|
|
|
13
|
-
//mediasfu functions
|
|
14
|
-
reorderStreams:
|
|
17
|
+
// mediasfu functions
|
|
18
|
+
reorderStreams: OpaqueReorderStreamsInvoker;
|
|
15
19
|
[key: string]: any;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
|
-
export interface OnScreenChangesOptions
|
|
22
|
+
export interface OnScreenChangesOptions<
|
|
23
|
+
TParameters extends OnScreenChangesParameters = OnScreenChangesParameters,
|
|
24
|
+
> {
|
|
19
25
|
changed?: boolean;
|
|
20
|
-
parameters:
|
|
26
|
+
parameters: TParameters;
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
// Export the type definition for the function
|
|
24
|
-
export type OnScreenChangesType =
|
|
30
|
+
export type OnScreenChangesType = <
|
|
31
|
+
TParameters extends OnScreenChangesParameters = OnScreenChangesParameters,
|
|
32
|
+
>(options: OnScreenChangesOptions<TParameters>) => Promise<void>;
|
|
25
33
|
|
|
26
34
|
/**
|
|
27
35
|
* Handles changes in screen events such as broadcast, chat, and conference.
|
|
@@ -62,13 +70,17 @@ export type OnScreenChangesType = (options: OnScreenChangesOptions) => Promise<v
|
|
|
62
70
|
* ```
|
|
63
71
|
*/
|
|
64
72
|
|
|
65
|
-
export async function onScreenChanges
|
|
73
|
+
export async function onScreenChanges<
|
|
74
|
+
TParameters extends OnScreenChangesParameters = OnScreenChangesParameters,
|
|
75
|
+
>({ changed, parameters }: OnScreenChangesOptions<TParameters>): Promise<void> {
|
|
66
76
|
try {
|
|
67
77
|
// Destructure parameters
|
|
68
78
|
let {
|
|
69
79
|
eventType,
|
|
70
80
|
shareScreenStarted,
|
|
71
81
|
shared,
|
|
82
|
+
whiteboardStarted,
|
|
83
|
+
whiteboardEnded,
|
|
72
84
|
addForBasic,
|
|
73
85
|
updateMainHeightWidth,
|
|
74
86
|
updateAddForBasic,
|
|
@@ -78,6 +90,7 @@ export async function onScreenChanges({ changed, parameters }: OnScreenChangesOp
|
|
|
78
90
|
//mediasfu functions
|
|
79
91
|
reorderStreams,
|
|
80
92
|
} = parameters;
|
|
93
|
+
const screenFlowActive = shareScreenStarted || shared || (whiteboardStarted && !whiteboardEnded);
|
|
81
94
|
|
|
82
95
|
// Remove element with id 'controlButtons'
|
|
83
96
|
addForBasic = false;
|
|
@@ -89,9 +102,11 @@ export async function onScreenChanges({ changed, parameters }: OnScreenChangesOp
|
|
|
89
102
|
|
|
90
103
|
itemPageLimit = eventType === "broadcast" ? 1 : 2;
|
|
91
104
|
updateItemPageLimit(itemPageLimit);
|
|
92
|
-
updateMainHeightWidth(eventType === "broadcast" ? 100 : 0);
|
|
105
|
+
updateMainHeightWidth(screenFlowActive ? 84 : eventType === "broadcast" ? 100 : 0);
|
|
106
|
+
} else if (screenFlowActive) {
|
|
107
|
+
updateMainHeightWidth(84);
|
|
93
108
|
} else {
|
|
94
|
-
if (eventType === "conference"
|
|
109
|
+
if (eventType === "conference") {
|
|
95
110
|
updateMainHeightWidth(0);
|
|
96
111
|
}
|
|
97
112
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Stub export for prepopulateUserMedia
|
|
2
2
|
// This is a React component in the original and not needed for the shared package
|
|
3
3
|
|
|
4
|
+
import { createFrameworkConsumerContractError } from './frameworkConsumerContract';
|
|
5
|
+
|
|
4
6
|
export interface PrepopulateUserMediaParameters {
|
|
5
7
|
[key: string]: any;
|
|
6
8
|
}
|
|
@@ -13,6 +15,5 @@ export interface PrepopulateUserMediaOptions {
|
|
|
13
15
|
export type PrepopulateUserMediaType = (options: PrepopulateUserMediaOptions) => Promise<void>;
|
|
14
16
|
|
|
15
17
|
export const prepopulateUserMedia: PrepopulateUserMediaType = async () => {
|
|
16
|
-
|
|
17
|
-
console.warn('prepopulateUserMedia called on shared package - should be implemented in framework package');
|
|
18
|
+
throw createFrameworkConsumerContractError('prepopulateUserMedia');
|
|
18
19
|
};
|
|
@@ -1,24 +1,65 @@
|
|
|
1
1
|
import { Stream, Participant, Transport, SleepType } from "../types/types";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
interface ProducerIdCarrier {
|
|
4
|
+
producerId?: string | null;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const getProducerId = (value: unknown): string | null | undefined => {
|
|
8
|
+
return (value as ProducerIdCarrier | null | undefined)?.producerId;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
interface ConsumerLike {
|
|
12
|
+
paused?: boolean;
|
|
13
|
+
kind?: string;
|
|
14
|
+
pause: () => unknown;
|
|
15
|
+
resume: () => unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface SocketLike {
|
|
19
|
+
emit: (
|
|
20
|
+
event: string,
|
|
21
|
+
payload: { serverConsumerId: string },
|
|
22
|
+
callback?: ((payload?: { resumed: boolean }) => void | Promise<unknown>)
|
|
23
|
+
) => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface TransportLike {
|
|
27
|
+
producerId?: string | null;
|
|
28
|
+
consumer?: ConsumerLike;
|
|
29
|
+
socket_: SocketLike;
|
|
30
|
+
serverConsumerTransportId: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ProcessConsumerTransportsParameters<
|
|
34
|
+
TStreamEntry = Stream,
|
|
35
|
+
TMediaEntry = Stream | Participant,
|
|
36
|
+
> {
|
|
37
|
+
remoteScreenStream: TStreamEntry[];
|
|
38
|
+
oldAllStreams: TMediaEntry[];
|
|
39
|
+
newLimitedStreams: TMediaEntry[];
|
|
7
40
|
|
|
8
41
|
// mediasfu functions
|
|
9
42
|
sleep: SleepType;
|
|
10
|
-
getUpdatedAllParams: () => ProcessConsumerTransportsParameters
|
|
43
|
+
getUpdatedAllParams: () => ProcessConsumerTransportsParameters<TStreamEntry, TMediaEntry>;
|
|
11
44
|
[key: string]: any;
|
|
12
45
|
}
|
|
13
46
|
|
|
14
|
-
export interface ProcessConsumerTransportsOptions
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
47
|
+
export interface ProcessConsumerTransportsOptions<
|
|
48
|
+
TTransport extends TransportLike = Transport,
|
|
49
|
+
TStreamEntry = Stream,
|
|
50
|
+
TMediaEntry = Stream | Participant,
|
|
51
|
+
> {
|
|
52
|
+
consumerTransports: TTransport[];
|
|
53
|
+
lStreams_: TMediaEntry[];
|
|
54
|
+
parameters: ProcessConsumerTransportsParameters<TStreamEntry, TMediaEntry>;
|
|
18
55
|
}
|
|
19
56
|
|
|
20
57
|
// Export the type definition for the function
|
|
21
|
-
export type ProcessConsumerTransportsType =
|
|
58
|
+
export type ProcessConsumerTransportsType = <
|
|
59
|
+
TTransport extends TransportLike = Transport,
|
|
60
|
+
TStreamEntry = Stream,
|
|
61
|
+
TMediaEntry = Stream | Participant,
|
|
62
|
+
>(options: ProcessConsumerTransportsOptions<TTransport, TStreamEntry, TMediaEntry>) => Promise<void>;
|
|
22
63
|
|
|
23
64
|
/**
|
|
24
65
|
* Processes consumer transports by pausing and resuming them based on certain conditions.
|
|
@@ -57,11 +98,15 @@ export type ProcessConsumerTransportsType = (options: ProcessConsumerTransportsO
|
|
|
57
98
|
* ```
|
|
58
99
|
*/
|
|
59
100
|
|
|
60
|
-
export async function processConsumerTransports
|
|
101
|
+
export async function processConsumerTransports<
|
|
102
|
+
TTransport extends TransportLike = Transport,
|
|
103
|
+
TStreamEntry = Stream,
|
|
104
|
+
TMediaEntry = Stream | Participant,
|
|
105
|
+
>({
|
|
61
106
|
consumerTransports,
|
|
62
107
|
lStreams_,
|
|
63
108
|
parameters,
|
|
64
|
-
}: ProcessConsumerTransportsOptions): Promise<void> {
|
|
109
|
+
}: ProcessConsumerTransportsOptions<TTransport, TStreamEntry, TMediaEntry>): Promise<void> {
|
|
65
110
|
try {
|
|
66
111
|
// Destructure parameters and get updated values
|
|
67
112
|
parameters = parameters.getUpdatedAllParams();
|
|
@@ -74,14 +119,14 @@ export async function processConsumerTransports({
|
|
|
74
119
|
} = parameters;
|
|
75
120
|
|
|
76
121
|
// Function to check if the producerId is valid in the given stream arrays
|
|
77
|
-
function isValidProducerId(producerId: string, ...streamArrays:
|
|
122
|
+
function isValidProducerId(producerId: string | null | undefined, ...streamArrays: unknown[][]): boolean {
|
|
78
123
|
return (
|
|
79
124
|
producerId !== null &&
|
|
80
125
|
producerId !== "" &&
|
|
81
126
|
streamArrays.some((streamArray) => {
|
|
82
127
|
return (
|
|
83
128
|
streamArray.length > 0 &&
|
|
84
|
-
streamArray.some((stream) => stream
|
|
129
|
+
streamArray.some((stream) => getProducerId(stream) === producerId)
|
|
85
130
|
);
|
|
86
131
|
})
|
|
87
132
|
);
|
|
@@ -98,7 +143,7 @@ export async function processConsumerTransports({
|
|
|
98
143
|
newLimitedStreams
|
|
99
144
|
) &&
|
|
100
145
|
transport.consumer?.paused === true &&
|
|
101
|
-
transport.consumer
|
|
146
|
+
transport.consumer?.kind !== "audio"
|
|
102
147
|
);
|
|
103
148
|
|
|
104
149
|
// Get unpaused consumer transports that are not audio
|
|
@@ -108,15 +153,15 @@ export async function processConsumerTransports({
|
|
|
108
153
|
transport.producerId !== null &&
|
|
109
154
|
transport.producerId !== "" &&
|
|
110
155
|
!lStreams_.some(
|
|
111
|
-
(stream) => stream
|
|
156
|
+
(stream) => getProducerId(stream) === transport.producerId
|
|
112
157
|
) &&
|
|
113
158
|
transport.consumer &&
|
|
114
|
-
transport.consumer
|
|
159
|
+
transport.consumer?.kind &&
|
|
115
160
|
transport.consumer.paused !== true &&
|
|
116
161
|
transport.consumer.kind !== "audio" &&
|
|
117
|
-
!remoteScreenStream.some((stream) => stream
|
|
118
|
-
!oldAllStreams.some((stream) => stream
|
|
119
|
-
!newLimitedStreams.some((stream) => stream
|
|
162
|
+
!remoteScreenStream.some((stream) => getProducerId(stream) === transport.producerId) &&
|
|
163
|
+
!oldAllStreams.some((stream) => getProducerId(stream) === transport.producerId) &&
|
|
164
|
+
!newLimitedStreams.some((stream) => getProducerId(stream) === transport.producerId)
|
|
120
165
|
);
|
|
121
166
|
|
|
122
167
|
// Pause consumer transports after a short delay
|
|
@@ -124,7 +169,7 @@ export async function processConsumerTransports({
|
|
|
124
169
|
|
|
125
170
|
// Emit consumer.pause() for each filtered transport (not audio)
|
|
126
171
|
for (const transport of consumerTransportsToPause) {
|
|
127
|
-
transport.consumer
|
|
172
|
+
transport.consumer?.pause();
|
|
128
173
|
transport.socket_.emit(
|
|
129
174
|
"consumer-pause",
|
|
130
175
|
{ serverConsumerId: transport.serverConsumerTransportId },
|
|
@@ -139,9 +184,9 @@ export async function processConsumerTransports({
|
|
|
139
184
|
transport.socket_.emit(
|
|
140
185
|
"consumer-resume",
|
|
141
186
|
{ serverConsumerId: transport.serverConsumerTransportId },
|
|
142
|
-
async ({ resumed }: { resumed: boolean }) => {
|
|
187
|
+
async ({ resumed }: { resumed: boolean } = { resumed: false }) => {
|
|
143
188
|
if (resumed) {
|
|
144
|
-
transport.consumer
|
|
189
|
+
transport.consumer?.resume();
|
|
145
190
|
}
|
|
146
191
|
}
|
|
147
192
|
);
|
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
import { Stream, Transport, Participant, SleepType } from "../types/types";
|
|
2
2
|
|
|
3
|
+
interface ProducerIdCarrier {
|
|
4
|
+
producerId?: string | null;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const getProducerId = (value: unknown): string | null | undefined => {
|
|
8
|
+
return (value as ProducerIdCarrier | null | undefined)?.producerId;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
interface ConsumerLike {
|
|
12
|
+
paused?: boolean;
|
|
13
|
+
kind?: string;
|
|
14
|
+
pause: () => unknown;
|
|
15
|
+
resume: () => unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface SocketLike {
|
|
19
|
+
emit: (
|
|
20
|
+
event: string,
|
|
21
|
+
payload: { serverConsumerId: string },
|
|
22
|
+
callback?: ((payload?: { resumed: boolean }) => void | Promise<unknown>)
|
|
23
|
+
) => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface TransportLike {
|
|
27
|
+
producerId?: string | null;
|
|
28
|
+
consumer?: ConsumerLike;
|
|
29
|
+
socket_: SocketLike;
|
|
30
|
+
serverConsumerTransportId: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
3
33
|
export interface ProcessConsumerTransportsAudioParameters {
|
|
4
34
|
|
|
5
35
|
// mediasfu functions
|
|
@@ -7,16 +37,20 @@ export interface ProcessConsumerTransportsAudioParameters {
|
|
|
7
37
|
[key: string]: any;
|
|
8
38
|
}
|
|
9
39
|
|
|
10
|
-
export interface ProcessConsumerTransportsAudioOptions
|
|
11
|
-
|
|
12
|
-
|
|
40
|
+
export interface ProcessConsumerTransportsAudioOptions<
|
|
41
|
+
TTransport extends TransportLike = Transport,
|
|
42
|
+
TMediaEntry = Stream | Participant,
|
|
43
|
+
> {
|
|
44
|
+
consumerTransports: TTransport[];
|
|
45
|
+
lStreams: TMediaEntry[];
|
|
13
46
|
parameters: ProcessConsumerTransportsAudioParameters;
|
|
14
47
|
}
|
|
15
48
|
|
|
16
49
|
// Export the type definition for the function
|
|
17
|
-
export type ProcessConsumerTransportsAudioType =
|
|
18
|
-
|
|
19
|
-
|
|
50
|
+
export type ProcessConsumerTransportsAudioType = <
|
|
51
|
+
TTransport extends TransportLike = Transport,
|
|
52
|
+
TMediaEntry = Stream | Participant,
|
|
53
|
+
>(options: ProcessConsumerTransportsAudioOptions<TTransport, TMediaEntry>) => Promise<void>;
|
|
20
54
|
|
|
21
55
|
/**
|
|
22
56
|
* Processes consumer transports for audio streams by pausing and resuming them based on their current state and the provided streams.
|
|
@@ -43,23 +77,26 @@ export type ProcessConsumerTransportsAudioType = (
|
|
|
43
77
|
* ```
|
|
44
78
|
*/
|
|
45
79
|
|
|
46
|
-
export const processConsumerTransportsAudio = async
|
|
80
|
+
export const processConsumerTransportsAudio = async <
|
|
81
|
+
TTransport extends TransportLike = Transport,
|
|
82
|
+
TMediaEntry = Stream | Participant,
|
|
83
|
+
>({
|
|
47
84
|
consumerTransports,
|
|
48
85
|
lStreams,
|
|
49
86
|
parameters,
|
|
50
|
-
}: ProcessConsumerTransportsAudioOptions): Promise<void> => {
|
|
87
|
+
}: ProcessConsumerTransportsAudioOptions<TTransport, TMediaEntry>): Promise<void> => {
|
|
51
88
|
try {
|
|
52
89
|
const { sleep } = parameters;
|
|
53
90
|
|
|
54
91
|
// Function to check if the producerId is valid in the given stream arrays
|
|
55
|
-
const isValidProducerId = (producerId: string, ...streamArrays:
|
|
92
|
+
const isValidProducerId = (producerId: string | null | undefined, ...streamArrays: unknown[][]): boolean => {
|
|
56
93
|
return (
|
|
57
94
|
producerId !== null &&
|
|
58
95
|
producerId !== "" &&
|
|
59
96
|
streamArrays.some((streamArray) => {
|
|
60
97
|
return (
|
|
61
98
|
streamArray.length > 0 &&
|
|
62
|
-
streamArray.some((stream) => stream
|
|
99
|
+
streamArray.some((stream) => getProducerId(stream) === producerId)
|
|
63
100
|
);
|
|
64
101
|
})
|
|
65
102
|
);
|
|
@@ -70,7 +107,7 @@ export const processConsumerTransportsAudio = async ({
|
|
|
70
107
|
(transport) =>
|
|
71
108
|
isValidProducerId(transport.producerId, lStreams) &&
|
|
72
109
|
transport.consumer?.paused === true &&
|
|
73
|
-
transport.consumer
|
|
110
|
+
transport.consumer?.kind === "audio"
|
|
74
111
|
);
|
|
75
112
|
|
|
76
113
|
// Get unpaused consumer transports that are audio
|
|
@@ -80,10 +117,10 @@ export const processConsumerTransportsAudio = async ({
|
|
|
80
117
|
transport.producerId !== null &&
|
|
81
118
|
transport.producerId !== "" &&
|
|
82
119
|
!lStreams.some(
|
|
83
|
-
(stream) => stream
|
|
120
|
+
(stream) => getProducerId(stream) === transport.producerId
|
|
84
121
|
) &&
|
|
85
122
|
transport.consumer &&
|
|
86
|
-
transport.consumer
|
|
123
|
+
transport.consumer?.kind &&
|
|
87
124
|
transport.consumer.paused !== true &&
|
|
88
125
|
transport.consumer.kind === "audio"
|
|
89
126
|
);
|
|
@@ -92,7 +129,7 @@ export const processConsumerTransportsAudio = async ({
|
|
|
92
129
|
|
|
93
130
|
// Emit consumer.pause() for each transport to pause
|
|
94
131
|
for (const transport of consumerTransportsToPause) {
|
|
95
|
-
transport.consumer
|
|
132
|
+
transport.consumer?.pause();
|
|
96
133
|
transport.socket_.emit(
|
|
97
134
|
"consumer-pause",
|
|
98
135
|
{ serverConsumerId: transport.serverConsumerTransportId },
|
|
@@ -107,9 +144,9 @@ export const processConsumerTransportsAudio = async ({
|
|
|
107
144
|
transport.socket_.emit(
|
|
108
145
|
"consumer-resume",
|
|
109
146
|
{ serverConsumerId: transport.serverConsumerTransportId },
|
|
110
|
-
async ({ resumed }: { resumed: boolean }) => {
|
|
147
|
+
async ({ resumed }: { resumed: boolean } = { resumed: false }) => {
|
|
111
148
|
if (resumed) {
|
|
112
|
-
transport.consumer
|
|
149
|
+
transport.consumer?.resume();
|
|
113
150
|
}
|
|
114
151
|
}
|
|
115
152
|
);
|
|
@@ -1,13 +1,47 @@
|
|
|
1
1
|
|
|
2
|
-
import { Participant, Stream,
|
|
3
|
-
|
|
2
|
+
import { Participant, Stream, EventType } from "../types/types";
|
|
3
|
+
|
|
4
|
+
interface ReUpdateInterStreamLike {
|
|
5
|
+
producerId?: string | null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
interface ReUpdateInterParticipantLike {
|
|
9
|
+
name: string;
|
|
10
|
+
videoID?: string | null;
|
|
11
|
+
muted?: boolean | null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type BooleanUpdater = (value: boolean) => void;
|
|
15
|
+
type NumberUpdater = (value: number) => void;
|
|
16
|
+
type StringListUpdater = (ids: string[]) => void;
|
|
17
|
+
|
|
18
|
+
type OnScreenChangesInvoker = (options: {
|
|
19
|
+
changed?: boolean;
|
|
20
|
+
parameters: any;
|
|
21
|
+
}) => Promise<void>;
|
|
22
|
+
|
|
23
|
+
type ReorderStreamsInvoker = (options: {
|
|
24
|
+
add?: boolean;
|
|
25
|
+
screenChanged?: boolean;
|
|
26
|
+
parameters: any;
|
|
27
|
+
}) => Promise<void>;
|
|
28
|
+
|
|
29
|
+
type ChangeVidsInvoker = (options: {
|
|
30
|
+
screenChanged?: boolean;
|
|
31
|
+
parameters: any;
|
|
32
|
+
}) => Promise<void>;
|
|
33
|
+
|
|
34
|
+
export interface ReUpdateInterParameters<
|
|
35
|
+
TStream extends ReUpdateInterStreamLike = Stream,
|
|
36
|
+
TParticipant extends ReUpdateInterParticipantLike = Participant,
|
|
37
|
+
> {
|
|
4
38
|
screenPageLimit: number;
|
|
5
39
|
itemPageLimit: number;
|
|
6
40
|
reorderInterval: number;
|
|
7
41
|
fastReorderInterval: number;
|
|
8
42
|
eventType: EventType;
|
|
9
|
-
participants:
|
|
10
|
-
allVideoStreams: (
|
|
43
|
+
participants: TParticipant[];
|
|
44
|
+
allVideoStreams: (TParticipant | TStream)[];
|
|
11
45
|
shared: boolean;
|
|
12
46
|
shareScreenStarted: boolean;
|
|
13
47
|
adminNameStream?: string;
|
|
@@ -15,35 +49,39 @@ export interface ReUpdateInterParameters extends OnScreenChangesParameters, Reor
|
|
|
15
49
|
updateMainWindow: boolean;
|
|
16
50
|
sortAudioLoudness: boolean;
|
|
17
51
|
lastReorderTime: number;
|
|
18
|
-
newLimitedStreams: (
|
|
52
|
+
newLimitedStreams: (TParticipant | TStream)[];
|
|
19
53
|
newLimitedStreamsIDs: string[];
|
|
20
54
|
oldSoundIds: string[];
|
|
21
|
-
updateUpdateMainWindow:
|
|
22
|
-
updateSortAudioLoudness:
|
|
23
|
-
updateLastReorderTime:
|
|
24
|
-
updateNewLimitedStreams: (streams: (
|
|
25
|
-
updateNewLimitedStreamsIDs:
|
|
26
|
-
updateOldSoundIds:
|
|
55
|
+
updateUpdateMainWindow: BooleanUpdater;
|
|
56
|
+
updateSortAudioLoudness: BooleanUpdater;
|
|
57
|
+
updateLastReorderTime: NumberUpdater;
|
|
58
|
+
updateNewLimitedStreams: (streams: (TParticipant | TStream)[]) => void;
|
|
59
|
+
updateNewLimitedStreamsIDs: StringListUpdater;
|
|
60
|
+
updateOldSoundIds: StringListUpdater;
|
|
27
61
|
|
|
28
62
|
// mediasfu functions
|
|
29
|
-
onScreenChanges:
|
|
30
|
-
reorderStreams:
|
|
31
|
-
changeVids:
|
|
63
|
+
onScreenChanges: OnScreenChangesInvoker;
|
|
64
|
+
reorderStreams: ReorderStreamsInvoker;
|
|
65
|
+
changeVids: ChangeVidsInvoker;
|
|
32
66
|
|
|
33
|
-
getUpdatedAllParams: () => ReUpdateInterParameters
|
|
67
|
+
getUpdatedAllParams: () => ReUpdateInterParameters<TStream, TParticipant>;
|
|
34
68
|
[key: string]: any;
|
|
35
69
|
}
|
|
36
70
|
|
|
37
|
-
export interface ReUpdateInterOptions
|
|
71
|
+
export interface ReUpdateInterOptions<
|
|
72
|
+
TParameters extends ReUpdateInterParameters<any, any> = ReUpdateInterParameters,
|
|
73
|
+
> {
|
|
38
74
|
name: string;
|
|
39
75
|
add?: boolean;
|
|
40
76
|
force?: boolean;
|
|
41
77
|
average?: number;
|
|
42
|
-
parameters:
|
|
78
|
+
parameters: TParameters;
|
|
43
79
|
}
|
|
44
80
|
|
|
45
81
|
// Export the type definition for the function
|
|
46
|
-
export type ReUpdateInterType =
|
|
82
|
+
export type ReUpdateInterType = <
|
|
83
|
+
TParameters extends ReUpdateInterParameters<any, any> = ReUpdateInterParameters,
|
|
84
|
+
>(options: ReUpdateInterOptions<TParameters>) => Promise<void>;
|
|
47
85
|
|
|
48
86
|
/**
|
|
49
87
|
* Updates the interaction state based on the provided options and parameters.
|
|
@@ -123,13 +161,15 @@ export type ReUpdateInterType = (options: ReUpdateInterOptions) => Promise<void>
|
|
|
123
161
|
*/
|
|
124
162
|
|
|
125
163
|
|
|
126
|
-
export async function reUpdateInter
|
|
164
|
+
export async function reUpdateInter<
|
|
165
|
+
TParameters extends ReUpdateInterParameters<any, any> = ReUpdateInterParameters,
|
|
166
|
+
>({
|
|
127
167
|
name,
|
|
128
168
|
add = false,
|
|
129
169
|
force = false,
|
|
130
170
|
average = 127,
|
|
131
171
|
parameters,
|
|
132
|
-
}: ReUpdateInterOptions): Promise<void> {
|
|
172
|
+
}: ReUpdateInterOptions<TParameters>): Promise<void> {
|
|
133
173
|
let {
|
|
134
174
|
screenPageLimit,
|
|
135
175
|
itemPageLimit,
|
|
@@ -159,7 +199,7 @@ export async function reUpdateInter({
|
|
|
159
199
|
onScreenChanges,
|
|
160
200
|
reorderStreams,
|
|
161
201
|
changeVids,
|
|
162
|
-
} = parameters;
|
|
202
|
+
} = parameters as TParameters;
|
|
163
203
|
|
|
164
204
|
if (eventType === "broadcast" || eventType === "chat") {
|
|
165
205
|
return;
|