mediasfu-shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/index.cjs +7707 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.ts +7285 -0
  6. package/dist/index.js +7690 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +78 -0
  9. package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +68 -0
  10. package/src/consumers/addVideosGrid.ts +18 -0
  11. package/src/consumers/autoAdjust.ts +100 -0
  12. package/src/consumers/calculateRowsAndColumns.ts +51 -0
  13. package/src/consumers/changeVids.ts +753 -0
  14. package/src/consumers/checkGrid.ts +100 -0
  15. package/src/consumers/checkPermission.ts +89 -0
  16. package/src/consumers/checkScreenShare.ts +114 -0
  17. package/src/consumers/closeAndResize.ts +401 -0
  18. package/src/consumers/compareActiveNames.ts +122 -0
  19. package/src/consumers/compareScreenStates.ts +117 -0
  20. package/src/consumers/connectIps.ts +175 -0
  21. package/src/consumers/connectLocalIps.ts +103 -0
  22. package/src/consumers/connectRecvTransport.ts +158 -0
  23. package/src/consumers/connectSendTransport.ts +150 -0
  24. package/src/consumers/connectSendTransportAudio.ts +161 -0
  25. package/src/consumers/connectSendTransportScreen.ts +169 -0
  26. package/src/consumers/connectSendTransportVideo.ts +149 -0
  27. package/src/consumers/consumerResume.ts +25 -0
  28. package/src/consumers/controlMedia.ts +118 -0
  29. package/src/consumers/createSendTransport.ts +312 -0
  30. package/src/consumers/disconnectSendTransportAudio.ts +170 -0
  31. package/src/consumers/disconnectSendTransportScreen.ts +130 -0
  32. package/src/consumers/disconnectSendTransportVideo.ts +161 -0
  33. package/src/consumers/dispStreams.ts +694 -0
  34. package/src/consumers/generatePageContent.ts +118 -0
  35. package/src/consumers/getEstimate.ts +124 -0
  36. package/src/consumers/getPipedProducersAlt.ts +96 -0
  37. package/src/consumers/getProducersPiped.ts +89 -0
  38. package/src/consumers/getVideos.ts +107 -0
  39. package/src/consumers/mixStreams.ts +97 -0
  40. package/src/consumers/onScreenChanges.ts +106 -0
  41. package/src/consumers/prepopulateUserMedia.ts +18 -0
  42. package/src/consumers/processConsumerTransports.ts +157 -0
  43. package/src/consumers/processConsumerTransportsAudio.ts +121 -0
  44. package/src/consumers/rePort.ts +123 -0
  45. package/src/consumers/reUpdateInter.ts +289 -0
  46. package/src/consumers/readjust.ts +170 -0
  47. package/src/consumers/receiveAllPipedTransports.ts +77 -0
  48. package/src/consumers/receiveRoomMessages.ts +55 -0
  49. package/src/consumers/reorderStreams.ts +246 -0
  50. package/src/consumers/requestScreenShare.ts +103 -0
  51. package/src/consumers/resumePauseAudioStreams.ts +174 -0
  52. package/src/consumers/resumePauseStreams.ts +110 -0
  53. package/src/consumers/resumeSendTransportAudio.ts +143 -0
  54. package/src/consumers/signalNewConsumerTransport.ts +179 -0
  55. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +130 -0
  56. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +138 -0
  57. package/src/consumers/socketReceiveMethods/producerClosed.ts +102 -0
  58. package/src/consumers/startShareScreen.ts +124 -0
  59. package/src/consumers/stopShareScreen.ts +241 -0
  60. package/src/consumers/streamSuccessAudio.ts +297 -0
  61. package/src/consumers/streamSuccessAudioSwitch.ts +315 -0
  62. package/src/consumers/streamSuccessScreen.ts +255 -0
  63. package/src/consumers/streamSuccessVideo.ts +373 -0
  64. package/src/consumers/switchUserAudio.ts +140 -0
  65. package/src/consumers/switchUserVideo.ts +201 -0
  66. package/src/consumers/switchUserVideoAlt.ts +331 -0
  67. package/src/consumers/trigger.ts +250 -0
  68. package/src/consumers/updateMiniCardsGrid.ts +150 -0
  69. package/src/consumers/updateParticipantAudioDecibels.ts +56 -0
  70. package/src/index.ts +119 -0
  71. package/src/methods/background/launchBackground.ts +16 -0
  72. package/src/methods/breakoutRooms/breakoutRoomUpdated.ts +161 -0
  73. package/src/methods/breakoutRooms/handleStartBreakout.ts +96 -0
  74. package/src/methods/breakoutRooms/handleStopBreakout.ts +72 -0
  75. package/src/methods/breakoutRooms/index.ts +4 -0
  76. package/src/methods/breakoutRooms/launchBreakoutRooms.ts +31 -0
  77. package/src/methods/coHost/launchCoHost.ts +28 -0
  78. package/src/methods/coHostMethods/index.ts +2 -0
  79. package/src/methods/coHostMethods/modifyCoHostSettings.ts +94 -0
  80. package/src/methods/displaySettings/index.ts +1 -0
  81. package/src/methods/displaySettings/launchDisplaySettings.ts +31 -0
  82. package/src/methods/displaySettings/modifyDisplaySettings.ts +242 -0
  83. package/src/methods/exit/confirmExit.ts +60 -0
  84. package/src/methods/exit/index.ts +2 -0
  85. package/src/methods/exit/launchConfirmExit.ts +29 -0
  86. package/src/methods/index.ts +5 -0
  87. package/src/methods/mediaSettings/launchMediaSettings.ts +61 -0
  88. package/src/methods/menu/launchMenuModal.ts +28 -0
  89. package/src/methods/message/index.ts +1 -0
  90. package/src/methods/message/launchMessages.ts +27 -0
  91. package/src/methods/message/sendMessage.ts +175 -0
  92. package/src/methods/participants/index.ts +3 -0
  93. package/src/methods/participants/launchParticipants.ts +25 -0
  94. package/src/methods/participants/messageParticipants.ts +78 -0
  95. package/src/methods/participants/muteParticipants.ts +79 -0
  96. package/src/methods/participants/removeParticipants.ts +97 -0
  97. package/src/methods/polls/handleCreatePoll.ts +66 -0
  98. package/src/methods/polls/handleEndPoll.ts +64 -0
  99. package/src/methods/polls/handleVotePoll.ts +76 -0
  100. package/src/methods/polls/index.ts +3 -0
  101. package/src/methods/polls/launchPoll.ts +25 -0
  102. package/src/methods/prejoin/handleCreateRoom.ts +441 -0
  103. package/src/methods/prejoin/handleJoinRoom.ts +153 -0
  104. package/src/methods/prejoin/index.ts +14 -0
  105. package/src/methods/recording/checkPauseState.ts +57 -0
  106. package/src/methods/recording/checkResumeState.ts +42 -0
  107. package/src/methods/recording/confirmRecording.ts +241 -0
  108. package/src/methods/recording/launchRecording.ts +114 -0
  109. package/src/methods/recording/recordPauseTimer.ts +52 -0
  110. package/src/methods/recording/recordResumeTimer.ts +92 -0
  111. package/src/methods/recording/recordStartTimer.ts +106 -0
  112. package/src/methods/recording/recordUpdateTimer.ts +49 -0
  113. package/src/methods/recording/startRecording.ts +268 -0
  114. package/src/methods/recording/stopRecording.ts +124 -0
  115. package/src/methods/recording/updateRecording.ts +245 -0
  116. package/src/methods/requests/index.ts +1 -0
  117. package/src/methods/requests/launchRequests.ts +25 -0
  118. package/src/methods/requests/respondToRequests.ts +108 -0
  119. package/src/methods/settings/index.ts +2 -0
  120. package/src/methods/settings/launchSettings.ts +25 -0
  121. package/src/methods/settings/modifySettings.ts +99 -0
  122. package/src/methods/stream/clickVideo.ts +337 -0
  123. package/src/methods/stream/index.ts +3 -0
  124. package/src/methods/stream/switchAudio.ts +73 -0
  125. package/src/methods/stream/switchVideo.ts +148 -0
  126. package/src/methods/stream/switchVideoAlt.ts +152 -0
  127. package/src/methods/utils/checkLimitsAndMakeRequest.ts +103 -0
  128. package/src/methods/utils/validateAlphanumeric.ts +41 -0
  129. package/src/methods/waiting/index.ts +1 -0
  130. package/src/methods/waiting/launchWaiting.ts +26 -0
  131. package/src/methods/waiting/respondToWaiting.ts +82 -0
  132. package/src/methods/welcome/handleWelcomeRequest.ts +189 -0
  133. package/src/methods/welcome/index.ts +5 -0
  134. package/src/methods/whiteboard/handleStartWhiteboard.ts +65 -0
  135. package/src/methods/whiteboard/handleStopWhiteboard.ts +48 -0
  136. package/src/methods/whiteboard/index.ts +4 -0
  137. package/src/methods/whiteboard/launchConfigureWhiteboard.ts +29 -0
  138. package/src/producers/producerEmits/joinConRoom.ts +153 -0
  139. package/src/sockets/SocketManager.ts +232 -0
  140. package/src/types/shared-base-types.ts +752 -0
  141. package/src/types/types.ts +84 -0
@@ -0,0 +1,150 @@
1
+ import type { ProducerOptions } from 'mediasoup-client/lib/types';
2
+ import { ConnectSendTransportAudioType, ConnectSendTransportVideoType, ConnectSendTransportScreenType, ConnectSendTransportAudioParameters, ConnectSendTransportVideoParameters, ConnectSendTransportScreenParameters } from '../types/types';
3
+ export interface ConnectSendTransportParameters extends ConnectSendTransportAudioParameters, ConnectSendTransportVideoParameters, ConnectSendTransportScreenParameters {
4
+ audioParams: ProducerOptions
5
+ videoParams: ProducerOptions;
6
+ localStreamScreen: MediaStream | null;
7
+ canvasStream: MediaStream | null;
8
+ whiteboardStarted: boolean;
9
+ whiteboardEnded: boolean;
10
+ shared: boolean;
11
+ islevel: string;
12
+
13
+ //mediasfu functions
14
+ connectSendTransportAudio: ConnectSendTransportAudioType;
15
+ connectSendTransportVideo: ConnectSendTransportVideoType;
16
+ connectSendTransportScreen: ConnectSendTransportScreenType;
17
+
18
+ getUpdatedAllParams: () => ConnectSendTransportParameters;
19
+ [key: string]: any;
20
+ }
21
+
22
+ export interface ConnectSendTransportOptions {
23
+ option: 'audio' | 'video' | 'screen' | 'all';
24
+ targetOption?: 'local' | 'remote' | 'all';
25
+ parameters: ConnectSendTransportParameters;
26
+ }
27
+
28
+ // Export the type definition for the function
29
+ export type ConnectSendTransportType = (options: ConnectSendTransportOptions) => Promise<void>;
30
+
31
+ /**
32
+ * Connects the send transport based on the specified option.
33
+ *
34
+ * @param {ConnectSendTransportOptions} options - The options for connecting the send transport.
35
+ * @param {string} options.option - The type of transport to connect ("audio", "video", "screen", or "all").
36
+ * @param {boolean} options.targetOption - The target option to connect ("local", "remote", or "all").
37
+ * @param {ConnectSendTransportParameters} options.parameters - The parameters required for connecting the transport.
38
+ * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.
39
+ * @param {ProducerOptions} options.parameters.videoParams - The video parameters.
40
+ * @param {MediaStream} options.parameters.localStreamScreen - The local screen stream.
41
+ * @param {MediaStream} options.parameters.canvasStream - The canvas stream.
42
+ * @param {boolean} options.parameters.whiteboardStarted - Indicates if the whiteboard has started.
43
+ * @param {boolean} options.parameters.whiteboardEnded - Indicates if the whiteboard has ended.
44
+ * @param {boolean} options.parameters.shared - Indicates if the screen is shared.
45
+ * @param {string} options.parameters.islevel - The level of the screen sharing.
46
+ * @param {Function} options.parameters.connectSendTransportAudio - Function to connect the audio send transport.
47
+ * @param {Function} options.parameters.connectSendTransportVideo - Function to connect the video send transport.
48
+ * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the screen send transport.
49
+ *
50
+ * @returns {Promise<void>} A promise that resolves when the transport is connected.
51
+ *
52
+ * @throws Will throw an error if the connection fails.
53
+ *
54
+ * @example
55
+ * const options = {
56
+ * option: 'audio',
57
+ * targetOption: 'local',
58
+ * parameters: {
59
+ * audioParams: audioProducerOptions,
60
+ * videoParams: videoProducerOptions,
61
+ * localStreamScreen: localStream,
62
+ * canvasStream: canvasStream,
63
+ * whiteboardStarted: false,
64
+ * whiteboardEnded: false,
65
+ * shared: false,
66
+ * islevel: '1',
67
+ * connectSendTransportAudio: connectAudioFunction,
68
+ * connectSendTransportVideo: connectVideoFunction,
69
+ * connectSendTransportScreen: connectScreenFunction,
70
+ * },
71
+ * };
72
+ *
73
+ * connectSendTransport(options)
74
+ * .then(() => {
75
+ * console.log('Transport connected successfully');
76
+ * })
77
+ * .catch((error) => {
78
+ * console.error('Error connecting transport:', error);
79
+ * });
80
+ */
81
+
82
+ export const connectSendTransport = async ({ option, targetOption = "all", parameters }: ConnectSendTransportOptions): Promise<void> => {
83
+ try {
84
+ let {
85
+ audioParams,
86
+ videoParams,
87
+ localStreamScreen,
88
+ canvasStream,
89
+ whiteboardStarted,
90
+ whiteboardEnded,
91
+ shared,
92
+ islevel,
93
+
94
+ //media functions
95
+ connectSendTransportAudio,
96
+ connectSendTransportVideo,
97
+ connectSendTransportScreen,
98
+ } = parameters;
99
+
100
+ // Connect send transport based on the specified option
101
+ if (option === "audio") {
102
+ await connectSendTransportAudio({
103
+ targetOption,
104
+ audioParams,
105
+ parameters,
106
+ });
107
+ } else if (option === "video") {
108
+ await connectSendTransportVideo({
109
+ targetOption,
110
+ videoParams,
111
+ parameters,
112
+ });
113
+ } else if (option === "screen") {
114
+ if (
115
+ whiteboardStarted &&
116
+ !whiteboardEnded &&
117
+ canvasStream &&
118
+ islevel === "2" &&
119
+ !shared
120
+ ) {
121
+ await connectSendTransportScreen({
122
+ targetOption,
123
+ stream: canvasStream,
124
+ parameters,
125
+ });
126
+ } else {
127
+ await connectSendTransportScreen({
128
+ targetOption,
129
+ stream: localStreamScreen!,
130
+ parameters,
131
+ });
132
+ }
133
+ } else {
134
+ // Connect both audio and video send transports
135
+ await connectSendTransportAudio({
136
+ targetOption,
137
+ audioParams,
138
+ parameters,
139
+ });
140
+ await connectSendTransportVideo({
141
+ targetOption,
142
+ videoParams,
143
+ parameters,
144
+ });
145
+ }
146
+ } catch (error) {
147
+ console.log("connectSendTransport error", error);
148
+ // throw error;
149
+ }
150
+ };
@@ -0,0 +1,161 @@
1
+ import type { Transport, Producer, ProducerOptions } from 'mediasoup-client/lib/types';
2
+
3
+ export interface ConnectSendTransportAudioParameters {
4
+ audioProducer: Producer | null;
5
+ producerTransport: Transport | null;
6
+ localAudioProducer?: Producer | null;
7
+ localProducerTransport?: Transport | null;
8
+ updateAudioProducer: (producer: Producer | null) => void;
9
+ updateProducerTransport: (transport: Transport | null) => void;
10
+ updateLocalAudioProducer?: (localProducer: Producer | null) => void;
11
+ updateLocalProducerTransport?: (localTransport: Transport | null) => void;
12
+ updateAudioLevel: (level: number) => void;
13
+
14
+ // Function to get all parameters
15
+ getUpdatedAllParams: () => ConnectSendTransportAudioParameters;
16
+ [key: string]: any; // Extendable for additional parameters
17
+
18
+ }
19
+
20
+ export interface ConnectSendTransportAudioOptions {
21
+ audioParams: ProducerOptions;
22
+ parameters: ConnectSendTransportAudioParameters;
23
+ targetOption?: 'all' | 'local' | 'remote';
24
+ }
25
+
26
+ // Export the type definition for the function
27
+ export type ConnectSendTransportAudioType = (options: ConnectSendTransportAudioOptions) => Promise<void>;
28
+
29
+ const connectLocalSendTransportAudio = async ({
30
+ parameters,
31
+ audioParams
32
+ }: ConnectSendTransportAudioOptions): Promise<void> => {
33
+ try {
34
+ let {
35
+ localAudioProducer,
36
+ localProducerTransport,
37
+ updateLocalAudioProducer,
38
+ updateLocalProducerTransport,
39
+ } = parameters;
40
+
41
+ if (localProducerTransport) {
42
+ localAudioProducer = await localProducerTransport.produce(audioParams);
43
+
44
+ updateLocalAudioProducer?.(localAudioProducer);
45
+ updateLocalProducerTransport?.(localProducerTransport);
46
+ }
47
+ } catch (error) {
48
+ console.error("Error connecting local audio transport:", error);
49
+ throw error; // Re-throw to let the parent handle it
50
+ }
51
+ };
52
+
53
+ export const updateMicLevel = async (audioProducer: Producer, updateAudioLevel: (level: number) => void) => {
54
+ try {
55
+ setInterval(() => {
56
+ const sender = audioProducer!.rtpSender;
57
+
58
+ sender?.getStats().then((stats) => {
59
+ stats.forEach((report) => {
60
+
61
+ if (report.type === "media-source" && report.kind === "audio" && report.audioLevel !== undefined) {
62
+ const newLevel = 127.5 + (report.audioLevel * 127.5);
63
+ updateAudioLevel(newLevel);
64
+ }
65
+
66
+ });
67
+ });
68
+ }, 1000);
69
+ } catch {
70
+ // Handle error
71
+ }
72
+ }
73
+
74
+
75
+ /**
76
+ * Connects the send transport for audio by producing audio data and updating the audio producer and producer transport objects.
77
+ *
78
+ * If the primary connection fails, it attempts to connect using the local transport via a separate function.
79
+ *
80
+ * @param {ConnectSendTransportAudioOptions} options - The options for connecting the send transport.
81
+ * @param {ProducerOptions} options.audioParams - The audio parameters.
82
+ * @param {ConnectSendTransportAudioParameters} options.parameters - The parameters required for connecting the transport.
83
+ * @param {Producer | null} options.parameters.audioProducer - The audio producer object.
84
+ * @param {Transport | null} options.parameters.producerTransport - The producer transport object.
85
+ * @param {Producer | null} [options.parameters.localAudioProducer] - The local audio producer object.
86
+ * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport object.
87
+ * @param {(producer: Producer | null) => void} options.parameters.updateAudioProducer - The function to update the audio producer object.
88
+ * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the producer transport object.
89
+ * @param {(localProducer: Producer | null) => void} [options.parameters.updateLocalAudioProducer] - The function to update the local audio producer object.
90
+ * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.
91
+ * @param {(level: number) => void} [options.parameters.updateAudioLevel] - The function to update the audio level.
92
+ * @returns {Promise<void>} A promise that resolves when the connection is established.
93
+ *
94
+ * @example
95
+ * const options = {
96
+ * audioParams: { codec: "opus", maxBitrate: 128000 },
97
+ * parameters: {
98
+ * audioProducer: null,
99
+ * producerTransport: transport,
100
+ * localAudioProducer: null,
101
+ * localProducerTransport: localTransport,
102
+ * updateAudioProducer: (producer) => console.log("Updated producer:", producer),
103
+ * updateProducerTransport: (transport) => console.log("Updated transport:", transport),
104
+ * updateLocalAudioProducer: (localProducer) => console.log("Updated local producer:", localProducer),
105
+ * updateLocalProducerTransport: (localTransport) => console.log("Updated local transport:", localTransport),
106
+ * updateAudioLevel: (level) => console.log("Updated audio level:", level),
107
+ * },
108
+ * };
109
+ *
110
+ * connectSendTransportAudio(options)
111
+ * .then(() => console.log("Audio transport connected successfully"))
112
+ * .catch((error) => console.error("Error connecting audio transport:", error));
113
+ */
114
+
115
+ export const connectSendTransportAudio: ConnectSendTransportAudioType = async ({
116
+ parameters,
117
+ audioParams,
118
+ targetOption = "all",
119
+ }: ConnectSendTransportAudioOptions): Promise<void> => {
120
+ try {
121
+ let {
122
+ audioProducer,
123
+ producerTransport,
124
+ updateAudioProducer,
125
+ updateProducerTransport,
126
+ } = parameters;
127
+
128
+ // Attempt to connect the primary send transport
129
+ if (targetOption === "all" || targetOption === "remote") {
130
+ audioProducer = await producerTransport!.produce(audioParams);
131
+
132
+ // Update the audio level
133
+ updateMicLevel(audioProducer, parameters.updateAudioLevel);
134
+
135
+ // Update state with the new producer and transport
136
+ updateAudioProducer(audioProducer);
137
+ updateProducerTransport(producerTransport);
138
+ }
139
+
140
+ // Attempt to connect the local send transport
141
+ if (targetOption === "all" || targetOption === "local") {
142
+ try {
143
+ await connectLocalSendTransportAudio({ parameters, audioParams });
144
+
145
+ // Update the audio level
146
+ if (targetOption === "local" && parameters.updateAudioLevel) {
147
+ if (!parameters.localAudioProducer) {
148
+ parameters = parameters.getUpdatedAllParams();
149
+ }
150
+ updateMicLevel(parameters.localAudioProducer!, parameters.updateAudioLevel);
151
+ }
152
+ } catch (localError) {
153
+ console.error("Local audio transport connection failed:", localError);
154
+ }
155
+ }
156
+
157
+ } catch (primaryError) {
158
+ console.error("audio transport connection failed:", primaryError);
159
+ throw new Error("Failed to connect to audio transport.");
160
+ }
161
+ };
@@ -0,0 +1,169 @@
1
+ import type { Transport, Producer, Device, ProducerOptions } from 'mediasoup-client/lib/types';
2
+
3
+ export interface ConnectSendTransportScreenParameters {
4
+ screenProducer: Producer | null;
5
+ localScreenProducer?: Producer | null;
6
+ device: Device | null;
7
+ screenParams: ProducerOptions;
8
+ producerTransport: Transport | null;
9
+ localProducerTransport?: Transport | null;
10
+ params: ProducerOptions;
11
+ updateScreenProducer: (producer: Producer | null) => void;
12
+ updateLocalScreenProducer?: (localProducer: Producer | null) => void;
13
+ updateProducerTransport: (transport: Transport | null) => void;
14
+ updateLocalProducerTransport?: (localTransport: Transport | null) => void;
15
+
16
+ getUpdatedAllParams: () => ConnectSendTransportScreenParameters;
17
+ [key: string]: any; // Extendable for additional parameters
18
+ }
19
+
20
+ export interface ConnectSendTransportScreenOptions {
21
+ stream: MediaStream;
22
+ parameters: ConnectSendTransportScreenParameters;
23
+ targetOption?: "all" | "local" | "remote";
24
+ }
25
+
26
+ // Export the type definition for the function
27
+ export type ConnectSendTransportScreenType = (options: ConnectSendTransportScreenOptions) => Promise<void>;
28
+
29
+ const connectLocalSendTransportScreen = async ({
30
+ stream,
31
+ parameters,
32
+ }: ConnectSendTransportScreenOptions): Promise<void> => {
33
+ try {
34
+ let {
35
+ localScreenProducer,
36
+ localProducerTransport,
37
+ updateLocalScreenProducer,
38
+ updateLocalProducerTransport,
39
+ device,
40
+ } = parameters;
41
+
42
+ // Find VP9 codec for local screen share
43
+ const codec = device?.rtpCapabilities?.codecs?.find(
44
+ (codec: { mimeType: string }) =>
45
+ codec.mimeType.toLowerCase() === "video/vp9"
46
+ );
47
+
48
+ // Produce local screen share data
49
+ if (localProducerTransport) {
50
+ localScreenProducer = await localProducerTransport.produce({
51
+ track: stream.getVideoTracks()[0],
52
+ codec,
53
+ appData: { mediaTag: "screen-video" },
54
+ });
55
+
56
+ // Update the local producer and transport objects
57
+ updateLocalScreenProducer?.(localScreenProducer);
58
+ updateLocalProducerTransport?.(localProducerTransport);
59
+ }
60
+ } catch (error) {
61
+ console.error("Error connecting local screen transport:", error);
62
+ throw error; // Re-throw to propagate the error
63
+ }
64
+ };
65
+
66
+ /**
67
+ * Sets up and connects a screen sharing transport for sending video streams.
68
+ *
69
+ * This function supports both a primary and a local screen producer, delegating local handling to a separate function.
70
+ *
71
+ * @param {ConnectSendTransportScreenOptions} options - The configuration options for setting up the screen transport.
72
+ * @param {"all" | "local" | "remote"} [options.targetOption] - The target option for connecting the transport.
73
+ * @param {MediaStream} options.stream - The screen stream to be shared.
74
+ * @param {ConnectSendTransportScreenParameters} options.parameters - The parameters required for setting up the screen transport.
75
+ * @param {Producer | null} options.parameters.screenProducer - The screen producer object to be updated.
76
+ * @param {Device | null} options.parameters.device - The device object for media capabilities.
77
+ * @param {ProducerOptions} options.parameters.screenParams - The parameters for the screen producer.
78
+ * @param {Transport | null} options.parameters.producerTransport - The producer transport object.
79
+ * @param {ProducerOptions} options.parameters.params - The parameters for the producer.
80
+ * @param {Function} options.parameters.updateScreenProducer - The function to update the screen producer object.
81
+ * @param {Function} options.parameters.updateProducerTransport - The function to update the producer transport object.
82
+ * @param {Function} [options.parameters.updateLocalScreenProducer] - The function to update the local screen producer object.
83
+ * @param {Function} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.
84
+ * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.
85
+ * @param {Object} [options.parameters.*] - Additional parameters for future use.
86
+ *
87
+ * @returns {Promise<void>} - A promise that resolves once the screen transport is successfully connected and set up.
88
+ *
89
+ * @throws Will throw an error if there is an issue with the connection or setup process.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * await connectSendTransportScreen({
94
+ * stream: screenStream,
95
+ * targetOption: "all",
96
+ * parameters: {
97
+ * screenProducer: null,
98
+ * localScreenProducer: null,
99
+ * device: mediaDevice,
100
+ * screenParams: { encodings: [{ maxBitrate: 1500000 }] },
101
+ * producerTransport: sendTransport,
102
+ * localProducerTransport: localSendTransport,
103
+ * params: { track: screenStream.getVideoTracks()[0] },
104
+ * updateScreenProducer: setScreenProducer,
105
+ * updateLocalScreenProducer: setLocalScreenProducer,
106
+ * updateProducerTransport: setProducerTransport,
107
+ * updateLocalProducerTransport: setLocalProducerTransport,
108
+ * getUpdatedAllParams: getParams,
109
+ * },
110
+ * });
111
+ * ```
112
+ */
113
+
114
+ export const connectSendTransportScreen: ConnectSendTransportScreenType = async ({
115
+ stream,
116
+ parameters,
117
+ targetOption = "all",
118
+ }: ConnectSendTransportScreenOptions): Promise<void> => {
119
+ try {
120
+ let {
121
+ screenProducer,
122
+ device,
123
+ screenParams,
124
+ producerTransport,
125
+ params,
126
+ updateScreenProducer,
127
+ updateProducerTransport,
128
+ } = parameters;
129
+
130
+ // Fetch updated device information
131
+ device = parameters.getUpdatedAllParams().device;
132
+
133
+ // Retrieve screen share parameters
134
+ params = screenParams;
135
+
136
+ // Find VP9 codec for screen share
137
+ const codec = device?.rtpCapabilities?.codecs?.find(
138
+ (codec: { mimeType: string }) =>
139
+ codec.mimeType.toLowerCase() === "video/vp9"
140
+ );
141
+
142
+ // Produce screen share data using the producer transport
143
+ if (targetOption === "remote" || targetOption === "all") {
144
+ screenProducer = await producerTransport!.produce({
145
+ track: stream.getVideoTracks()[0],
146
+ ...params,
147
+ codec,
148
+ appData: { mediaTag: "screen-video" },
149
+ });
150
+
151
+ // Update the screen producer and producer transport objects
152
+ updateScreenProducer(screenProducer);
153
+ updateProducerTransport(producerTransport);
154
+ }
155
+
156
+ // Produce screen share data using the local producer transport
157
+ if (targetOption === "local" || targetOption === "all") {
158
+ try {
159
+ await connectLocalSendTransportScreen({ stream, parameters });
160
+ } catch (localError) {
161
+ console.log("Error connecting local screen transport:", localError);
162
+ }
163
+ }
164
+
165
+ } catch (error) {
166
+ console.log("connectSendTransportScreen error", error);
167
+ throw error;
168
+ }
169
+ };
@@ -0,0 +1,149 @@
1
+ import type { Device, Producer, ProducerOptions, Transport } from 'mediasoup-client/lib/types';
2
+
3
+ export interface ConnectSendTransportVideoParameters {
4
+ videoProducer: Producer | null;
5
+ localVideoProducer?: Producer | null;
6
+ device: Device | null;
7
+ producerTransport: Transport | null;
8
+ localProducerTransport?: Transport | null;
9
+ islevel: string;
10
+ updateMainWindow: boolean;
11
+ updateVideoProducer: (producer: Producer | null) => void;
12
+ updateLocalVideoProducer?: (localProducer: Producer | null) => void;
13
+ updateProducerTransport: (transport: Transport | null) => void;
14
+ updateLocalProducerTransport?: (localTransport: Transport | null) => void;
15
+ updateUpdateMainWindow: (state: boolean) => void;
16
+ [key: string]: any; // Extendable for additional parameters
17
+ }
18
+
19
+ export interface ConnectSendTransportVideoOptions {
20
+ videoParams: ProducerOptions;
21
+ parameters: ConnectSendTransportVideoParameters;
22
+ targetOption?: "all" | "local" | "remote";
23
+ }
24
+
25
+ // Export the type definition for the function
26
+ export type ConnectSendTransportVideoType = (options: ConnectSendTransportVideoOptions) => Promise<void>;
27
+
28
+ const connectLocalSendTransportVideo = async ({
29
+ videoParams,
30
+ parameters,
31
+ }: ConnectSendTransportVideoOptions): Promise<void> => {
32
+ try {
33
+ let {
34
+ localVideoProducer,
35
+ localProducerTransport,
36
+ updateLocalVideoProducer,
37
+ updateLocalProducerTransport,
38
+ } = parameters;
39
+
40
+ // Produce local video data if transport exists
41
+ if (localProducerTransport) {
42
+ localVideoProducer = await localProducerTransport.produce(videoParams);
43
+
44
+ // Update local producer and transport
45
+ updateLocalVideoProducer?.(localVideoProducer);
46
+ updateLocalProducerTransport?.(localProducerTransport);
47
+ }
48
+ } catch (error) {
49
+ console.error("Error connecting local video transport:", error);
50
+ throw error; // Re-throw to propagate the error
51
+ }
52
+ };
53
+
54
+ /**
55
+ * Connects the send transport for video by producing video data and updates the relevant states.
56
+ *
57
+ * This function supports both a primary and a local video producer, delegating local handling to a separate function.
58
+ *
59
+ * @param {ConnectSendTransportVideoOptions} options - The options for connecting the send transport for video.
60
+ * @param {ProducerOptions} options.videoParams - The parameters for the video producer.
61
+ * @param {"all" | "local" | "remote"} [options.targetOption] - The target option for the video transport connection.
62
+ * @param {ConnectSendTransportVideoParameters} options.parameters - The parameters for the video transport connection.
63
+ * @param {Producer | null} options.parameters.videoProducer - The primary video producer.
64
+ * @param {Producer | null} [options.parameters.localVideoProducer] - The local video producer.
65
+ * @param {Device | null} options.parameters.device - The device information.
66
+ * @param {Transport | null} options.parameters.producerTransport - The primary producer transport.
67
+ * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport.
68
+ * @param {string} options.parameters.islevel - The connection level for the video transport.
69
+ * @param {boolean} options.parameters.updateMainWindow - The flag to update the main window state.
70
+ * @param {(producer: Producer | null) => void} options.parameters.updateVideoProducer - The function to update the video producer state.
71
+ * @param {(localProducer: Producer | null) => void} [options.parameters.updateLocalVideoProducer] - The function to update the local video producer state.
72
+ * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the producer transport state.
73
+ * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport state.
74
+ * @param {(state: boolean) => void} options.parameters.updateUpdateMainWindow - The function to update the main window state.
75
+ * @param {any} [options.parameters] - Additional parameters for future use.
76
+ * @returns {Promise<void>} A promise that resolves when the send transport for video is connected.
77
+ *
78
+ * @throws Will throw an error if the connection fails.
79
+ *
80
+ * @example
81
+ * const options = {
82
+ * videoParams: {
83
+ * // video producer options (e.g., codec, bitrate)
84
+ * },
85
+ * targetOption: "all",
86
+ * parameters: {
87
+ * videoProducer: null,
88
+ * localVideoProducer: null,
89
+ * producerTransport: transport,
90
+ * localProducerTransport: localTransport,
91
+ * islevel: '2',
92
+ * updateMainWindow: false,
93
+ * updateVideoProducer: (producer) => console.log("Updated producer"),
94
+ * updateLocalVideoProducer: (localProducer) => console.log("Updated local producer"),
95
+ * updateProducerTransport: (transport) => console.log("Updated transport"),
96
+ * updateLocalProducerTransport: (localTransport) => console.log("Updated local transport"),
97
+ * updateUpdateMainWindow: (state) => console.log("Updated main window:", state),
98
+ * },
99
+ * };
100
+ *
101
+ * connectSendTransportVideo(options)
102
+ * .then(() => console.log("Video transport connected successfully"))
103
+ * .catch((error) => console.error("Error connecting video transport:", error));
104
+ */
105
+
106
+ export const connectSendTransportVideo: ConnectSendTransportVideoType = async ({
107
+ videoParams,
108
+ parameters,
109
+ targetOption = "all",
110
+ }: ConnectSendTransportVideoOptions): Promise<void> => {
111
+ try {
112
+ let {
113
+ videoProducer,
114
+ producerTransport,
115
+ islevel,
116
+ updateMainWindow,
117
+ updateVideoProducer,
118
+ updateProducerTransport,
119
+ updateUpdateMainWindow,
120
+ } = parameters;
121
+
122
+ // Produce video data using the primary transport
123
+ if (targetOption === "all" || targetOption === "remote"){
124
+ videoProducer = await producerTransport!.produce(videoParams);
125
+
126
+ // Update main window state based on the video connection level
127
+ if (islevel === "2") {
128
+ updateMainWindow = true;
129
+ }
130
+
131
+ // Update video producer, transport, and UI state
132
+ updateVideoProducer(videoProducer);
133
+ updateProducerTransport(producerTransport);
134
+ updateUpdateMainWindow(updateMainWindow);
135
+ }
136
+
137
+ // Handle local video transport regardless of primary success or
138
+ if (targetOption === "all" || targetOption === "local") {
139
+ try {
140
+ await connectLocalSendTransportVideo({ videoParams, parameters });
141
+ } catch (localError) {
142
+ console.log("Error connecting local video transport:", localError);
143
+ }
144
+ }
145
+ } catch (error) {
146
+ console.log("connectSendTransportVideo error", error);
147
+ throw error;
148
+ }
149
+ };
@@ -0,0 +1,25 @@
1
+ // Stub export for consumerResume
2
+ // This is a React component in the original and not needed for the shared package
3
+
4
+ import { Socket } from 'socket.io-client';
5
+
6
+ export interface ConsumerResumeParameters {
7
+ [key: string]: any;
8
+ }
9
+
10
+ export interface ConsumerResumeOptions {
11
+ track: MediaStreamTrack;
12
+ kind: string;
13
+ remoteProducerId: string;
14
+ params: any;
15
+ parameters: ConsumerResumeParameters;
16
+ nsock: Socket;
17
+ consumer?: any; // mediasoup Consumer
18
+ }
19
+
20
+ export type ConsumerResumeType = (options: ConsumerResumeOptions) => Promise<void>;
21
+
22
+ export const consumerResume: ConsumerResumeType = async () => {
23
+ // Stub implementation - actual logic handled in framework-specific packages
24
+ console.warn('consumerResume called on shared package - should be implemented in framework package');
25
+ };