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
@@ -0,0 +1,70 @@
1
+ import type { Message, Participant } from '../../types/shared-base-types';
2
+
3
+ export interface GenerateRandomMessagesOptions {
4
+ participants: Participant[];
5
+ member: string;
6
+ coHost?: string;
7
+ host: string;
8
+ forChatBroadcast?: boolean;
9
+ }
10
+
11
+ export type GenerateRandomMessagesType = (options: GenerateRandomMessagesOptions) => Message[];
12
+
13
+ export const generateRandomMessages = ({
14
+ participants,
15
+ member,
16
+ coHost = '',
17
+ host,
18
+ forChatBroadcast = false,
19
+ }: GenerateRandomMessagesOptions): Message[] => {
20
+ const messages: Message[] = [];
21
+
22
+ const getRandomReceiver = (sender: string): string => {
23
+ const potentialReceivers = participants.filter((participant) => participant.name !== sender);
24
+ const randomReceiver = potentialReceivers[Math.floor(Math.random() * potentialReceivers.length)];
25
+ return randomReceiver?.name || '';
26
+ };
27
+
28
+ let refNames: string[] = [];
29
+ if (forChatBroadcast) {
30
+ refNames = [member, host];
31
+ } else if (coHost) {
32
+ refNames = [
33
+ member,
34
+ coHost,
35
+ host,
36
+ ...participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),
37
+ ];
38
+ } else {
39
+ refNames = [
40
+ member,
41
+ host,
42
+ ...participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),
43
+ ];
44
+ }
45
+
46
+ refNames = [...new Set(refNames)];
47
+
48
+ let timeIncrement = 0;
49
+ refNames.forEach((sender) => {
50
+ messages.push({
51
+ sender,
52
+ receivers: [getRandomReceiver(sender)],
53
+ message: `Direct message from ${sender}`,
54
+ timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),
55
+ group: false,
56
+ });
57
+
58
+ messages.push({
59
+ sender,
60
+ receivers: participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),
61
+ message: `Group message from ${sender}`,
62
+ timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),
63
+ group: true,
64
+ });
65
+
66
+ timeIncrement += 15000;
67
+ });
68
+
69
+ return messages;
70
+ };
@@ -0,0 +1,100 @@
1
+ import type { Participant } from '../../types/shared-base-types';
2
+
3
+ export interface GenerateRandomParticipantsOptions {
4
+ member: string;
5
+ coHost?: string;
6
+ host: string;
7
+ forChatBroadcast?: boolean;
8
+ }
9
+
10
+ export type GenerateRandomParticipantsType = (
11
+ options: GenerateRandomParticipantsOptions,
12
+ ) => Participant[];
13
+
14
+ export const generateRandomParticipants = ({
15
+ member,
16
+ coHost = '',
17
+ host,
18
+ forChatBroadcast = false,
19
+ }: GenerateRandomParticipantsOptions): Participant[] => {
20
+ const participants: Participant[] = [];
21
+ let names: string[] = [
22
+ 'Alice',
23
+ 'Bob',
24
+ 'Charlie',
25
+ 'David',
26
+ 'Eve',
27
+ 'Frank',
28
+ 'Grace',
29
+ 'Hank',
30
+ 'Ivy',
31
+ 'Jack',
32
+ 'Kate',
33
+ 'Liam',
34
+ 'Mia',
35
+ 'Nina',
36
+ 'Olivia',
37
+ 'Pete',
38
+ 'Quinn',
39
+ 'Rachel',
40
+ 'Steve',
41
+ 'Tina',
42
+ 'Ursula',
43
+ 'Vince',
44
+ 'Wendy',
45
+ 'Xander',
46
+ 'Yvonne',
47
+ 'Zack',
48
+ ];
49
+
50
+ if (forChatBroadcast) {
51
+ names.splice(2);
52
+ }
53
+
54
+ if (!names.includes(member)) {
55
+ names.unshift(member);
56
+ }
57
+
58
+ if (!names.includes(coHost) && !forChatBroadcast) {
59
+ names.unshift(coHost);
60
+ }
61
+
62
+ if (!names.includes(host)) {
63
+ names.unshift(host);
64
+ }
65
+
66
+ if (forChatBroadcast) {
67
+ names.splice(2);
68
+ }
69
+
70
+ names = names.filter((name) => name.length > 1);
71
+
72
+ const shuffledNames = [...names];
73
+ for (let index = shuffledNames.length - 1; index > 0; index -= 1) {
74
+ const randomIndex = Math.floor(Math.random() * (index + 1));
75
+ [shuffledNames[index], shuffledNames[randomIndex]] = [shuffledNames[randomIndex], shuffledNames[index]];
76
+ }
77
+
78
+ let hasLevel2Participant = false;
79
+
80
+ for (let index = 0; index < shuffledNames.length; index += 1) {
81
+ const randomName = shuffledNames[index];
82
+ const randomLevel = hasLevel2Participant ? '1' : randomName === host ? '2' : '1';
83
+ const randomMuted = forChatBroadcast ? true : Math.random() < 0.5;
84
+
85
+ if (randomLevel === '2') {
86
+ hasLevel2Participant = true;
87
+ }
88
+
89
+ participants.push({
90
+ name: randomName,
91
+ islevel: randomLevel,
92
+ muted: randomMuted,
93
+ id: index.toString(),
94
+ audioID: `audio-${index}`,
95
+ videoID: `video-${index}`,
96
+ });
97
+ }
98
+
99
+ return participants;
100
+ };
@@ -0,0 +1,43 @@
1
+ import type { Poll } from '../../types/shared-base-types';
2
+
3
+ export interface GenerateRandomPollsOptions {
4
+ numberOfPolls: number;
5
+ }
6
+
7
+ export type GenerateRandomPollsType = (options: GenerateRandomPollsOptions) => Poll[];
8
+
9
+ export const generateRandomPolls = ({ numberOfPolls }: GenerateRandomPollsOptions): Poll[] => {
10
+ const pollTypes: string[] = ['trueFalse', 'yesNo', 'custom'];
11
+ const polls: Poll[] = [];
12
+
13
+ for (let index = 0; index < numberOfPolls; index += 1) {
14
+ const type = pollTypes[Math.floor(Math.random() * pollTypes.length)];
15
+ let options: string[];
16
+
17
+ switch (type) {
18
+ case 'trueFalse':
19
+ options = ['True', 'False'];
20
+ break;
21
+ case 'yesNo':
22
+ options = ['Yes', 'No'];
23
+ break;
24
+ case 'custom':
25
+ options = Array.from({ length: Math.floor(Math.random() * 5) + 2 }, (_, optionIndex) => `Option ${optionIndex + 1}`);
26
+ break;
27
+ default:
28
+ options = [];
29
+ }
30
+
31
+ polls.push({
32
+ id: `${index + 1}`,
33
+ question: `Random Question ${index + 1}`,
34
+ type,
35
+ options,
36
+ votes: Array(options.length).fill(0),
37
+ status: 'inactive',
38
+ voters: {},
39
+ });
40
+ }
41
+
42
+ return polls;
43
+ };
@@ -0,0 +1,51 @@
1
+ import type { Participant, Request } from '../../types/shared-base-types';
2
+
3
+ export interface GenerateRandomRequestListOptions {
4
+ participants: Participant[];
5
+ hostName: string;
6
+ coHostName?: string;
7
+ numberOfRequests: number;
8
+ }
9
+
10
+ export type GenerateRandomRequestListType = (options: GenerateRandomRequestListOptions) => Request[];
11
+
12
+ export const generateRandomRequestList = ({
13
+ participants,
14
+ hostName,
15
+ coHostName,
16
+ numberOfRequests,
17
+ }: GenerateRandomRequestListOptions): Request[] => {
18
+ const filteredParticipants = participants.filter(
19
+ (participant) => participant.name !== hostName && participant.name !== coHostName,
20
+ );
21
+
22
+ const requestIcons = ['fa-video', 'fa-desktop', 'fa-microphone'];
23
+
24
+ for (let index = requestIcons.length - 1; index > 0; index -= 1) {
25
+ const randomIndex = Math.floor(Math.random() * (index + 1));
26
+ [requestIcons[index], requestIcons[randomIndex]] = [requestIcons[randomIndex], requestIcons[index]];
27
+ }
28
+
29
+ return filteredParticipants.flatMap((participant) => {
30
+ const uniqueIcons = new Set<string>();
31
+ const requests: Request[] = [];
32
+
33
+ for (let index = 0; index < numberOfRequests; index += 1) {
34
+ let randomIcon: string;
35
+ do {
36
+ randomIcon = requestIcons[Math.floor(Math.random() * requestIcons.length)];
37
+ } while (uniqueIcons.has(randomIcon));
38
+
39
+ uniqueIcons.add(randomIcon);
40
+
41
+ requests.push({
42
+ id: participant.id || '',
43
+ name: participant.name ? participant.name.toLowerCase().replace(/\s/g, '_') : '',
44
+ icon: randomIcon,
45
+ username: participant.name ? participant.name.toLowerCase().replace(/\s/g, '_') : '',
46
+ });
47
+ }
48
+
49
+ return requests;
50
+ });
51
+ };
@@ -0,0 +1,17 @@
1
+ import type { WaitingRoomParticipant } from '../../types/shared-base-types';
2
+
3
+ export type GenerateRandomWaitingRoomListType = () => WaitingRoomParticipant[];
4
+
5
+ export const generateRandomWaitingRoomList = (): WaitingRoomParticipant[] => {
6
+ const names = ['Dimen', 'Nore', 'Ker', 'Lor', 'Mik'];
7
+
8
+ const waitingRoomList: WaitingRoomParticipant[] = [];
9
+ for (let index = 0; index < names.length; index += 1) {
10
+ waitingRoomList.push({
11
+ name: names[index],
12
+ id: index.toString(),
13
+ });
14
+ }
15
+
16
+ return waitingRoomList;
17
+ };
@@ -0,0 +1,23 @@
1
+ import { ModalPositionStyle } from '../../types/shared-base-types';
2
+
3
+ export interface GetModalPositionOptions {
4
+ position: string;
5
+ }
6
+
7
+ export type GetModalPositionType = (options: GetModalPositionOptions) => ModalPositionStyle;
8
+
9
+ export const getModalPosition = ({ position }: GetModalPositionOptions): ModalPositionStyle => {
10
+ switch (position) {
11
+ case 'center':
12
+ return { justifyContent: 'center', alignItems: 'center' };
13
+ case 'topLeft':
14
+ return { justifyContent: 'flex-start', alignItems: 'flex-start' };
15
+ case 'topRight':
16
+ return { justifyContent: 'flex-start', alignItems: 'flex-end' };
17
+ case 'bottomLeft':
18
+ return { justifyContent: 'flex-end', alignItems: 'flex-start' };
19
+ case 'bottomRight':
20
+ default:
21
+ return { justifyContent: 'flex-end', alignItems: 'flex-end' };
22
+ }
23
+ };
@@ -0,0 +1,37 @@
1
+ import type { OverlayPositionStyle } from '../../types/types';
2
+
3
+ export interface GetOverlayPositionOptions {
4
+ position: string;
5
+ }
6
+
7
+ export type GetOverlayPositionType = (options: GetOverlayPositionOptions) => OverlayPositionStyle;
8
+
9
+ /**
10
+ * Maps a symbolic overlay position to CSS-style edge coordinates.
11
+ *
12
+ * This is used by display card components to anchor badges, audio indicators,
13
+ * or auxiliary overlays to a participant tile corner.
14
+ *
15
+ * @param options Overlay position options.
16
+ * @returns A partial coordinate object suitable for inline style application.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const style = getOverlayPosition({ position: 'bottomRight' });
21
+ * // style === { bottom: 0, right: 0 }
22
+ * ```
23
+ */
24
+ export const getOverlayPosition = ({ position }: GetOverlayPositionOptions): OverlayPositionStyle => {
25
+ switch (position) {
26
+ case 'topLeft':
27
+ return { top: 0, left: 0 };
28
+ case 'topRight':
29
+ return { top: 0, right: 0 };
30
+ case 'bottomLeft':
31
+ return { bottom: 0, left: 0 };
32
+ case 'bottomRight':
33
+ return { bottom: 0, right: 0 };
34
+ default:
35
+ return {};
36
+ }
37
+ };