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.
Files changed (125) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +103 -222
  3. package/dist/index.cjs +7500 -2163
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.ts +4203 -273
  6. package/dist/index.js +7521 -2184
  7. package/dist/index.js.map +1 -1
  8. package/package.json +85 -78
  9. package/src/ProducerClient/producerClientEmits/joinRoomClient.ts +57 -0
  10. package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +401 -0
  11. package/src/consumers/addVideosGrid.ts +3 -2
  12. package/src/consumers/changeVids.ts +111 -41
  13. package/src/consumers/checkPermission.ts +35 -1
  14. package/src/consumers/connectRecvTransport.ts +42 -1
  15. package/src/consumers/consumerResume.ts +2 -2
  16. package/src/consumers/dispStreams.ts +83 -37
  17. package/src/consumers/frameworkConsumerContract.ts +6 -0
  18. package/src/consumers/generatePageContent.ts +24 -10
  19. package/src/consumers/getPipedProducersAlt.ts +112 -16
  20. package/src/consumers/gridLayout/addVideosGrid.engine.ts +42 -0
  21. package/src/consumers/gridLayout/prepopulateUserMedia.engine.ts +444 -0
  22. package/src/consumers/mixStreams.ts +45 -14
  23. package/src/consumers/onScreenChanges.ts +25 -10
  24. package/src/consumers/prepopulateUserMedia.ts +3 -2
  25. package/src/consumers/processConsumerTransports.ts +68 -23
  26. package/src/consumers/processConsumerTransportsAudio.ts +53 -16
  27. package/src/consumers/reUpdateInter.ts +61 -21
  28. package/src/consumers/readjust.ts +30 -14
  29. package/src/consumers/reorderStreams.ts +76 -42
  30. package/src/consumers/resumePauseAudioStreams.ts +66 -17
  31. package/src/consumers/resumePauseStreams.ts +53 -10
  32. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +8 -0
  33. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +114 -0
  34. package/src/consumers/socketReceiveMethods/producerClosed.ts +13 -0
  35. package/src/consumers/streamSuccessScreen.ts +2 -2
  36. package/src/consumers/streamSuccessVideo.ts +5 -0
  37. package/src/consumers/translationConsumerSwitch.ts +299 -0
  38. package/src/index.ts +85 -1
  39. package/src/methods/coHostMethods/modifyCoHostSettings.ts +9 -9
  40. package/src/methods/displaySettings/modifyDisplaySettings.ts +5 -0
  41. package/src/methods/index.ts +66 -0
  42. package/src/methods/message/sendMessage.ts +12 -29
  43. package/src/methods/panelists/focusPanelists.ts +83 -0
  44. package/src/methods/panelists/index.ts +3 -0
  45. package/src/methods/panelists/launchPanelists.ts +13 -0
  46. package/src/methods/panelists/updatePanelists.ts +135 -0
  47. package/src/methods/permissions/index.ts +3 -0
  48. package/src/methods/permissions/launchPermissions.ts +13 -0
  49. package/src/methods/permissions/updateParticipantPermission.ts +127 -0
  50. package/src/methods/permissions/updatePermissionConfig.ts +52 -0
  51. package/src/methods/polls/pollUpdated.ts +88 -0
  52. package/src/methods/recording/confirmRecording.ts +15 -12
  53. package/src/methods/recording/recordResumeTimer.ts +2 -2
  54. package/src/methods/recording/recordStartTimer.ts +2 -2
  55. package/src/methods/recording/timeLeftRecording.ts +25 -0
  56. package/src/methods/requests/hostRequestResponse.ts +153 -0
  57. package/src/methods/settings/modifySettings.ts +17 -17
  58. package/src/methods/socketReceive/allMembers.ts +450 -0
  59. package/src/methods/socketReceive/allMembersRest.ts +480 -0
  60. package/src/methods/socketReceive/allWaitingRoomMembers.ts +35 -0
  61. package/src/methods/socketReceive/banParticipant.ts +73 -0
  62. package/src/methods/socketReceive/controlMediaHost.ts +280 -0
  63. package/src/methods/socketReceive/disconnect.ts +40 -0
  64. package/src/methods/socketReceive/disconnectUserSelf.ts +56 -0
  65. package/src/methods/socketReceive/getDomains.ts +112 -0
  66. package/src/methods/socketReceive/meetingEnded.ts +49 -0
  67. package/src/methods/socketReceive/meetingStillThere.ts +26 -0
  68. package/src/methods/socketReceive/panelistReceiveMethods.ts +195 -0
  69. package/src/methods/socketReceive/participantRequested.ts +48 -0
  70. package/src/methods/socketReceive/permissionReceiveMethods.ts +59 -0
  71. package/src/methods/socketReceive/personJoined.ts +35 -0
  72. package/src/methods/socketReceive/producerMediaClosed.ts +223 -0
  73. package/src/methods/socketReceive/producerMediaPaused.ts +267 -0
  74. package/src/methods/socketReceive/producerMediaResumed.ts +157 -0
  75. package/src/methods/socketReceive/reInitiateRecording.ts +53 -0
  76. package/src/methods/socketReceive/receiveMessage.ts +117 -0
  77. package/src/methods/socketReceive/recordingNotice.ts +286 -0
  78. package/src/methods/socketReceive/roomRecordParams.ts +122 -0
  79. package/src/methods/socketReceive/screenProducerId.ts +61 -0
  80. package/src/methods/socketReceive/startRecords.ts +46 -0
  81. package/src/methods/socketReceive/stoppedRecording.ts +44 -0
  82. package/src/methods/socketReceive/translationReceiveMethods.ts +581 -0
  83. package/src/methods/socketReceive/updateConsumingDomains.ts +128 -0
  84. package/src/methods/socketReceive/updateMediaSettings.ts +45 -0
  85. package/src/methods/socketReceive/updatedCoHost.ts +75 -0
  86. package/src/methods/socketReceive/userWaiting.ts +45 -0
  87. package/src/methods/stream/clickAudio.ts +380 -0
  88. package/src/methods/stream/clickChat.ts +36 -0
  89. package/src/methods/stream/clickScreenShare.ts +173 -0
  90. package/src/methods/stream/clickVideo.ts +22 -5
  91. package/src/methods/stream/index.ts +1 -0
  92. package/src/methods/utils/SoundPlayer.ts +31 -0
  93. package/src/methods/utils/checkLimitsAndMakeRequest.ts +156 -2
  94. package/src/methods/utils/createResponseJoinRoom.ts +47 -0
  95. package/src/methods/utils/createRoomOnMediaSFU.ts +160 -0
  96. package/src/methods/utils/formatNumber.ts +42 -0
  97. package/src/methods/utils/generateRandomMessages.ts +70 -0
  98. package/src/methods/utils/generateRandomParticipants.ts +100 -0
  99. package/src/methods/utils/generateRandomPolls.ts +43 -0
  100. package/src/methods/utils/generateRandomRequestList.ts +51 -0
  101. package/src/methods/utils/generateRandomWaitingRoomList.ts +17 -0
  102. package/src/methods/utils/getModalPosition.ts +23 -0
  103. package/src/methods/utils/getOverlayPosition.ts +37 -0
  104. package/src/methods/utils/initialValuesState.ts +405 -0
  105. package/src/methods/utils/joinRoomOnMediaSFU.ts +124 -0
  106. package/src/methods/utils/liveSubtitle.ts +107 -0
  107. package/src/methods/utils/meetingTimeRemaining.ts +33 -0
  108. package/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts +72 -0
  109. package/src/methods/utils/producer/aParams.ts +10 -0
  110. package/src/methods/utils/producer/hParams.ts +26 -0
  111. package/src/methods/utils/producer/screenParams.ts +13 -0
  112. package/src/methods/utils/producer/vParams.ts +26 -0
  113. package/src/methods/utils/producer/videoCaptureConstraints.ts +65 -0
  114. package/src/methods/utils/resolveMediaSFURoomApi.ts +16 -0
  115. package/src/methods/utils/sleep.ts +24 -0
  116. package/src/methods/utils/translationLanguages.ts +308 -0
  117. package/src/methods/utils/webrtc.ts +44 -0
  118. package/src/methods/welcome/handleWelcomeRequest.ts +11 -2
  119. package/src/methods/welcome/index.ts +5 -1
  120. package/src/methods/whiteboard/captureCanvasStream.ts +128 -0
  121. package/src/producers/producerEmits/joinConRoom.ts +2 -2
  122. package/src/producers/producerEmits/joinLocalRoom.ts +240 -0
  123. package/src/producers/producerEmits/joinRoom.ts +129 -0
  124. package/src/types/shared-base-types.ts +14 -3
  125. package/src/types/types.ts +255 -0
@@ -1,13 +1,41 @@
1
1
  import { Stream, Participant } from "../types/types";
2
2
 
3
- export interface MixStreamsOptions {
4
- alVideoStreams: (Stream | Participant)[];
5
- non_alVideoStreams: Participant[];
6
- ref_participants: (Stream | Participant)[];
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 = (options: MixStreamsOptions) => Promise<(Stream | Participant)[]>;
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<(Stream | Participant)[]> {
68
+ }: MixStreamsOptions<TStream, TParticipant>): Promise<(TStream | TParticipant)[]> {
38
69
  try {
39
70
 
40
- const mixedStreams: (Stream | Participant)[] = [];
71
+ const mixedStreams: (TStream | TParticipant)[] = [];
41
72
 
42
73
  // Find "youyou" or "youyouyou" stream
43
74
  const youyouStream = alVideoStreams.find(
44
- (obj) => obj.producerId === "youyou" || obj.producerId === "youyouyou"
75
+ (obj) => getProducerId(obj) === "youyou" || getProducerId(obj) === "youyouyou"
45
76
  );
46
77
 
47
78
  let remainingAlVideoStreams = alVideoStreams.filter(
48
- (obj) => obj.producerId !== "youyou" && obj.producerId !== "youyouyou"
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.videoID === obj.producerId
85
+ (p) => getVideoId(p) === getProducerId(obj)
55
86
  );
56
- return !obj.muted && participant && participant.muted === false;
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.videoID === obj.producerId
92
+ (p) => getVideoId(p) === getProducerId(obj)
62
93
  );
63
- return obj.muted || (participant && participant.muted === true);
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 { ReorderStreamsType, ReorderStreamsParameters, EventType } from "../types/types";
1
+ import { ReorderStreamsParameters, EventType } from "../types/types";
2
2
 
3
- export interface OnScreenChangesParameters extends ReorderStreamsParameters {
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: ReorderStreamsType;
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: OnScreenChangesParameters;
26
+ parameters: TParameters;
21
27
  }
22
28
 
23
29
  // Export the type definition for the function
24
- export type OnScreenChangesType = (options: OnScreenChangesOptions) => Promise<void>;
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({ changed, parameters }: OnScreenChangesOptions): Promise<void> {
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" && !(shareScreenStarted || shared)) {
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
- // Stub implementation - actual logic handled in framework-specific packages
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
- export interface ProcessConsumerTransportsParameters {
4
- remoteScreenStream: Stream[];
5
- oldAllStreams: (Stream | Participant)[];
6
- newLimitedStreams: (Stream | Participant)[];
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
- consumerTransports: Transport[];
16
- lStreams_: (Stream | Participant)[];
17
- parameters: ProcessConsumerTransportsParameters;
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 = (options: ProcessConsumerTransportsOptions) => Promise<void>;
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: (Stream | Participant)[][]): boolean {
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?.producerId === producerId)
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.kind !== "audio"
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.producerId === transport.producerId
156
+ (stream) => getProducerId(stream) === transport.producerId
112
157
  ) &&
113
158
  transport.consumer &&
114
- transport.consumer.kind &&
159
+ transport.consumer?.kind &&
115
160
  transport.consumer.paused !== true &&
116
161
  transport.consumer.kind !== "audio" &&
117
- !remoteScreenStream.some((stream) => stream.producerId === transport.producerId) &&
118
- !oldAllStreams.some((stream) => stream.producerId === transport.producerId) &&
119
- !newLimitedStreams.some((stream) => stream.producerId === transport.producerId)
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.pause();
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.resume();
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
- consumerTransports: Transport[];
12
- lStreams: (Stream | Participant)[];
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
- options: ProcessConsumerTransportsAudioOptions
19
- ) => Promise<void>;
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: (Stream | Participant)[][]): boolean => {
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?.producerId === producerId)
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.kind === "audio"
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.producerId === transport.producerId
120
+ (stream) => getProducerId(stream) === transport.producerId
84
121
  ) &&
85
122
  transport.consumer &&
86
- transport.consumer.kind &&
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.pause();
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.resume();
149
+ transport.consumer?.resume();
113
150
  }
114
151
  }
115
152
  );
@@ -1,13 +1,47 @@
1
1
 
2
- import { Participant, Stream, OnScreenChangesType, ReorderStreamsType, ChangeVidsType, OnScreenChangesParameters, ReorderStreamsParameters, ChangeVidsParameters, EventType } from "../types/types";
3
- export interface ReUpdateInterParameters extends OnScreenChangesParameters, ReorderStreamsParameters, ChangeVidsParameters {
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: Participant[];
10
- allVideoStreams: (Participant | Stream)[];
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: (Participant | Stream)[];
52
+ newLimitedStreams: (TParticipant | TStream)[];
19
53
  newLimitedStreamsIDs: string[];
20
54
  oldSoundIds: string[];
21
- updateUpdateMainWindow: (value: boolean) => void;
22
- updateSortAudioLoudness: (value: boolean) => void;
23
- updateLastReorderTime: (value: number) => void;
24
- updateNewLimitedStreams: (streams: (Participant | Stream)[]) => void;
25
- updateNewLimitedStreamsIDs: (ids: string[]) => void;
26
- updateOldSoundIds: (ids: string[]) => void;
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: OnScreenChangesType;
30
- reorderStreams: ReorderStreamsType;
31
- changeVids: ChangeVidsType;
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: ReUpdateInterParameters;
78
+ parameters: TParameters;
43
79
  }
44
80
 
45
81
  // Export the type definition for the function
46
- export type ReUpdateInterType = (options: ReUpdateInterOptions) => Promise<void>;
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;