vani-meeting-server 1.2.2 → 1.2.4

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.
@@ -2,6 +2,15 @@ import { RedisHandler } from "./lib/redis/RedisHandler";
2
2
  import { WebSocketServerStartRequest } from "./models/WebSocketServerStartRequest";
3
3
  import { SFUHandler } from "./sfu/SFUHandler";
4
4
  import { WebSocketHandler } from "./websocket/WebSocketHandler";
5
+ export interface PlainTransportPayload {
6
+ remoteIpAddress: string;
7
+ isAudioRequired: boolean;
8
+ isVideoRequired: boolean;
9
+ audioPort: number;
10
+ audioRtcpPort: number;
11
+ videoPort: number;
12
+ videoRtcpPort: number;
13
+ }
5
14
  export declare class ServerHandler {
6
15
  serverStartRequest: WebSocketServerStartRequest;
7
16
  rediHandler?: RedisHandler;
@@ -11,4 +20,5 @@ export declare class ServerHandler {
11
20
  static getInstance(): ServerHandler;
12
21
  constructor();
13
22
  initWithServerStartRequest(serverStartRequest: WebSocketServerStartRequest): Promise<void>;
23
+ startPlainTransportForBroadcasting(plainTransportPayload: PlainTransportPayload, forRoomid: string): Promise<void>;
14
24
  }
@@ -29,5 +29,7 @@ class ServerHandler {
29
29
  this.sfuHandler = SFUHandler_1.SFUHandler.getInstance();
30
30
  this.sfuHandler.init();
31
31
  }
32
+ async startPlainTransportForBroadcasting(plainTransportPayload, forRoomid) {
33
+ }
32
34
  }
33
35
  exports.ServerHandler = ServerHandler;
package/lib/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './models/Event';
2
2
  export * from './models/WebSocketServerStartRequest';
3
3
  export * from './ServerHandler';
4
+ export * from './utility/EventEmitterHandler';
package/lib/index.js CHANGED
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./models/Event"), exports);
18
18
  __exportStar(require("./models/WebSocketServerStartRequest"), exports);
19
19
  __exportStar(require("./ServerHandler"), exports);
20
+ __exportStar(require("./utility/EventEmitterHandler"), exports);
@@ -4,7 +4,8 @@ export declare enum VaniEvent {
4
4
  OnNewMeetingEnded = "onNewMeetingEnded",
5
5
  OnUserJoined = "onUserJoined",
6
6
  OnUserLeft = "onUserLeft",
7
- OnServerStarted = "onServerStarted"
7
+ OnServerStarted = "onServerStarted",
8
+ OnPlainTransportCreated = "onPlainTransportCreated"
8
9
  }
9
10
  interface VaniConnectionEvents {
10
11
  [VaniEvent.OnNewMeetingStarted]: (roomId: string) => any;
@@ -12,6 +13,7 @@ interface VaniConnectionEvents {
12
13
  [VaniEvent.OnUserJoined]: (participant: Participant) => any;
13
14
  [VaniEvent.OnUserLeft]: (participant: Participant) => any;
14
15
  [VaniEvent.OnServerStarted]: () => any;
16
+ [VaniEvent.OnPlainTransportCreated]: () => any;
15
17
  }
16
18
  export declare interface VaniEventListener {
17
19
  on<U extends keyof VaniConnectionEvents>(event: U, listener: VaniConnectionEvents[U]): this;
@@ -8,4 +8,5 @@ var VaniEvent;
8
8
  VaniEvent["OnUserJoined"] = "onUserJoined";
9
9
  VaniEvent["OnUserLeft"] = "onUserLeft";
10
10
  VaniEvent["OnServerStarted"] = "onServerStarted";
11
+ VaniEvent["OnPlainTransportCreated"] = "onPlainTransportCreated";
11
12
  })(VaniEvent = exports.VaniEvent || (exports.VaniEvent = {}));
@@ -4,6 +4,7 @@ import { Router } from "mediasoup/node/lib/Router";
4
4
  import { Worker } from "mediasoup/node/lib/Worker";
5
5
  import { BaseSFUWebsocket } from "../base/BaseSFUWebsocket";
6
6
  import { Participant } from "../models/Participant";
7
+ import { PlainTransportPayload } from "../ServerHandler";
7
8
  import { SFUMessageType } from "../websocket/EachSocketConnectionHandler";
8
9
  import { SFUEachRoomUserHandler } from "./SFUEachRoomUserHandler";
9
10
  export interface SFUEachRoomParticipantInterface {
@@ -37,6 +38,7 @@ export declare class SFUEachRoomHandler extends BaseSFUWebsocket implements SFUE
37
38
  roomPaticipants: Map<string, SFUEachRoomUserHandler>;
38
39
  private plainTransportForAudio?;
39
40
  private plainTransportForVideo?;
41
+ private plainTransportConsumers;
40
42
  private workers?;
41
43
  private sendWorkerIndex;
42
44
  private audioObserver?;
@@ -56,6 +58,8 @@ export declare class SFUEachRoomHandler extends BaseSFUWebsocket implements SFUE
56
58
  onNewProducer(producer: Producer, participant: Participant): Promise<void>;
57
59
  addAudioObserverForProducer(audioProducer: Producer): Promise<void>;
58
60
  onUserLeft(participant: Participant): void;
59
- private startBroadcasting;
61
+ resumeAllBroadcastingConsumers(): Promise<void>;
62
+ startBroadcasting(plainTransportPayload: PlainTransportPayload): Promise<void>;
63
+ private consumeProducerForPlainTransport;
60
64
  cleanUp(): void;
61
65
  }
@@ -38,6 +38,7 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
38
38
  roomPaticipants = new Map();
39
39
  plainTransportForAudio;
40
40
  plainTransportForVideo;
41
+ plainTransportConsumers = [];
41
42
  workers;
42
43
  sendWorkerIndex = -1;
43
44
  audioObserver;
@@ -54,9 +55,9 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
54
55
  if (payload.type === EachSocketConnectionHandler_1.SFUMessageType.GetRouterRtpCapabilities) {
55
56
  this.onGetRTPCapabilities(participant);
56
57
  }
57
- else if (payload.type === EachSocketConnectionHandler_1.SFUMessageType.StartBroadcasting) {
58
- this.startBroadcasting(payload);
59
- }
58
+ // else if (payload.type === SFUMessageType.StartBroadcasting) {
59
+ // this.startBroadcasting(payload)
60
+ // }
60
61
  else {
61
62
  const sfuEachRoomUser = this.getEachRoomUserFromParticipant(participant);
62
63
  if (sfuEachRoomUser) {
@@ -186,18 +187,10 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
186
187
  async onNewProducer(producer, participant) {
187
188
  if (producer && producer.closed === false) {
188
189
  if (this.plainTransportForAudio && producer.kind === "audio") {
189
- this.plainTransportForAudio.consume({
190
- producerId: producer.id,
191
- rtpCapabilities: this.sendRouter.rtpCapabilities,
192
- paused: false,
193
- });
190
+ this.consumeProducerForPlainTransport(this.plainTransportForAudio, producer);
194
191
  }
195
192
  else if (this.plainTransportForVideo && producer.kind === "video") {
196
- this.plainTransportForVideo.consume({
197
- producerId: producer.id,
198
- rtpCapabilities: this.sendRouter.rtpCapabilities,
199
- paused: false,
200
- });
193
+ this.consumeProducerForPlainTransport(this.plainTransportForVideo, producer);
201
194
  }
202
195
  }
203
196
  }
@@ -213,61 +206,79 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
213
206
  this.roomPaticipants.delete(participant.userId);
214
207
  }
215
208
  }
216
- async startBroadcasting(payload) {
209
+ async resumeAllBroadcastingConsumers() {
210
+ this.plainTransportConsumers.forEach((eachConsumer) => {
211
+ if (eachConsumer && eachConsumer.closed === false) {
212
+ try {
213
+ eachConsumer.resume();
214
+ }
215
+ catch (err) {
216
+ }
217
+ }
218
+ });
219
+ }
220
+ async startBroadcasting(plainTransportPayload) {
221
+ //Create Plain Transport
217
222
  console.log("=====startBroadcasting=======");
218
- console.log(payload);
223
+ console.log(plainTransportPayload);
219
224
  console.log("=====startBroadcasting=======");
220
- const isAudioRequired = payload.message.isAudioRequired;
221
- const isVideoRequired = payload.message.isVideoRequired;
222
- const connectToIp = payload.message.connectToIp;
225
+ const isAudioRequired = plainTransportPayload.isAudioRequired;
226
+ const isVideoRequired = plainTransportPayload.isVideoRequired;
227
+ const connectToIp = plainTransportPayload.remoteIpAddress;
223
228
  if (isAudioRequired && this.plainTransportForAudio === undefined) {
224
229
  this.plainTransportForAudio = await this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration());
225
230
  if (this.plainTransportForAudio) {
226
- const port = payload.message.audio.port;
227
- const rtcpPort = payload.message.audio.rtcpPort;
231
+ const port = plainTransportPayload.audioPort;
232
+ const rtcpPort = plainTransportPayload.audioRtcpPort;
228
233
  await this.plainTransportForAudio.connect({
229
234
  ip: connectToIp,
230
235
  port: port,
231
236
  rtcpPort: rtcpPort,
232
237
  });
233
- this.getAllProducerForRoom().forEach((eachRoomProducer) => {
234
- if (eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.closed === false && eachRoomProducer.producer.kind === 'audio') {
235
- try {
236
- this.plainTransportForAudio?.consume({
237
- producerId: eachRoomProducer.producer.id,
238
- rtpCapabilities: this.sendRouter.rtpCapabilities,
239
- paused: false,
240
- });
241
- }
242
- catch (err) {
243
- }
244
- }
245
- });
246
238
  }
239
+ this.getAllProducerForRoom().forEach((eachRoomProducer) => {
240
+ if (this.plainTransportForAudio && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'audio') {
241
+ try {
242
+ this.consumeProducerForPlainTransport(this.plainTransportForAudio, eachRoomProducer.producer);
243
+ }
244
+ catch (err) {
245
+ }
246
+ }
247
+ });
247
248
  }
248
249
  if (isVideoRequired && this.plainTransportForVideo === undefined) {
249
250
  this.plainTransportForVideo = await this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration());
250
251
  if (this.plainTransportForVideo) {
251
- const port = payload.message.video.port;
252
- const rtcpPort = payload.message.video.rtcpPort;
252
+ const port = plainTransportPayload.videoPort;
253
+ const rtcpPort = plainTransportPayload.videoRtcpPort;
253
254
  await this.plainTransportForVideo.connect({
254
255
  ip: connectToIp,
255
256
  port: port,
256
257
  rtcpPort: rtcpPort,
257
258
  });
258
- this.getAllProducerForRoom().forEach((eachRoomProducer) => {
259
- if (eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.closed === false && eachRoomProducer.producer.kind === 'video') {
260
- try {
261
- this.plainTransportForVideo?.consume({
262
- producerId: eachRoomProducer.producer.id,
263
- rtpCapabilities: this.sendRouter.rtpCapabilities,
264
- paused: false,
265
- });
266
- }
267
- catch (err) {
268
- }
259
+ }
260
+ this.getAllProducerForRoom().forEach((eachRoomProducer) => {
261
+ if (this.plainTransportForVideo && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'video') {
262
+ try {
263
+ this.consumeProducerForPlainTransport(this.plainTransportForVideo, eachRoomProducer.producer);
269
264
  }
270
- });
265
+ catch (err) {
266
+ }
267
+ }
268
+ });
269
+ }
270
+ EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnPlainTransportCreated, {});
271
+ }
272
+ async consumeProducerForPlainTransport(plainTransport, producer) {
273
+ if (producer && producer.closed === false && this.sendRouter && this.sendRouter.rtpCapabilities) {
274
+ try {
275
+ this.plainTransportConsumers.push(await plainTransport.consume({
276
+ producerId: producer.id,
277
+ rtpCapabilities: this.sendRouter.rtpCapabilities,
278
+ paused: true,
279
+ }));
280
+ }
281
+ catch (err) {
271
282
  }
272
283
  }
273
284
  }
@@ -278,6 +289,22 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
278
289
  this.roomPaticipants.forEach((sfuEachRoomUser) => {
279
290
  this.onUserLeft(sfuEachRoomUser.selfParticipant);
280
291
  });
292
+ this.plainTransportConsumers.forEach((eachConsumer) => {
293
+ try {
294
+ eachConsumer.close();
295
+ }
296
+ catch (err) {
297
+ }
298
+ });
299
+ this.plainTransportConsumers = [];
300
+ if (this.plainTransportForAudio) {
301
+ this.plainTransportForAudio.close();
302
+ this.plainTransportForAudio = undefined;
303
+ }
304
+ if (this.plainTransportForVideo) {
305
+ this.plainTransportForVideo.close();
306
+ this.plainTransportForVideo = undefined;
307
+ }
281
308
  this.recvRouter.forEach((eachRouter) => {
282
309
  eachRouter.close();
283
310
  });
@@ -1,4 +1,5 @@
1
1
  import { SFUEachRoomHandler } from './SFUEachRoomHandler';
2
+ import { PlainTransportPayload } from '../ServerHandler';
2
3
  export declare class SFUHandler {
3
4
  static instance: SFUHandler;
4
5
  private workers;
@@ -9,5 +10,6 @@ export declare class SFUHandler {
9
10
  checkAndSetupRoom(roomId: string): Promise<void>;
10
11
  checkIfCanCloseRoom(roomId: string): void;
11
12
  getRoomSFUHandler(roomId: string): SFUEachRoomHandler | undefined;
13
+ startPlainTransportForBroadcasting(plainTransportPayload: PlainTransportPayload, forRoomid: string): Promise<void>;
12
14
  private createWorkers;
13
15
  }
@@ -64,6 +64,12 @@ class SFUHandler {
64
64
  console.error("No Room Found During SFU Message", roomId);
65
65
  }
66
66
  }
67
+ async startPlainTransportForBroadcasting(plainTransportPayload, forRoomid) {
68
+ const sfuEachRoomHandler = this.getRoomSFUHandler(forRoomid);
69
+ if (sfuEachRoomHandler) {
70
+ sfuEachRoomHandler.startBroadcasting(plainTransportPayload);
71
+ }
72
+ }
67
73
  async createWorkers() {
68
74
  while (this.workers.length < os.cpus().length) {
69
75
  mediasoup.logLevel = "info";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vani-meeting-server",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "Vani Meeting Server SDK",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",