vani-meeting-server 2.8.3 → 2.8.5

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.
@@ -10,10 +10,6 @@ export interface PlainTransportPayload {
10
10
  remoteIpAddress: string;
11
11
  isAudioRequired: boolean;
12
12
  isVideoRequired: boolean;
13
- audioPort?: number;
14
- audioRtcpPort?: number;
15
- videoPort?: number;
16
- videoRtcpPort?: number;
17
13
  extraData?: any;
18
14
  }
19
15
  export interface PlainTransportCreatedCallback {
@@ -0,0 +1,9 @@
1
+ import { PlainTransportPayload } from "../ServerHandler";
2
+ export interface BroadcastDataSource {
3
+ getPortForBroadcasting(plainTransportPayload: PlainTransportPayload): Promise<BroadcastPortResponse>;
4
+ }
5
+ export interface BroadcastPortResponse {
6
+ port?: number;
7
+ rtcpPort?: number;
8
+ plainTransportPayload: PlainTransportPayload;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +1,4 @@
1
+ import { BroadcastDataSource } from "../interface/BroadcastDataSource";
1
2
  export declare enum ConnectionProtocol {
2
3
  TCP = "TCP",
3
4
  UDP = "UDP"
@@ -26,4 +27,5 @@ export declare class WebSocketServerStartRequest {
26
27
  wssServerHostForCert?: string;
27
28
  shouldShareDetailStats: boolean;
28
29
  shouldShareStreamScoreChange: boolean;
30
+ broadcastDataSource?: BroadcastDataSource;
29
31
  }
@@ -31,5 +31,6 @@ class WebSocketServerStartRequest {
31
31
  wssServerHostForCert;
32
32
  shouldShareDetailStats = false;
33
33
  shouldShareStreamScoreChange = false;
34
+ broadcastDataSource;
34
35
  }
35
36
  exports.WebSocketServerStartRequest = WebSocketServerStartRequest;
@@ -36,9 +36,9 @@ export declare class SFUEachRoomHandler extends BaseSFUWebsocket implements SFUE
36
36
  private sendRouter?;
37
37
  private roomId;
38
38
  roomPaticipants: Map<string, SFUEachRoomUserHandler>;
39
- private plainTransportForAudio?;
40
- private plainTransportForVideo?;
39
+ private plainTransportsForBroadCasting;
41
40
  private plainTransportConsumers;
41
+ private plainTransportPayload?;
42
42
  private workers?;
43
43
  private sendWorkerIndex;
44
44
  private audioObserver?;
@@ -72,6 +72,7 @@ export declare class SFUEachRoomHandler extends BaseSFUWebsocket implements SFUE
72
72
  onUserLeft(participant: Participant): void;
73
73
  resumeAllBroadcastingConsumers(): Promise<void>;
74
74
  startBroadcasting(plainTransportPayload: PlainTransportPayload): Promise<void>;
75
+ createPlainTransportAndConsumeProducer: (plainTransportPayload: PlainTransportPayload, producer: Producer) => Promise<void>;
75
76
  private consumeProducerForPlainTransport;
76
77
  private redisSubscribeToTopic;
77
78
  private onRedisMessage;
@@ -42,9 +42,11 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
42
42
  sendRouter;
43
43
  roomId;
44
44
  roomPaticipants = new Map();
45
- plainTransportForAudio;
46
- plainTransportForVideo;
45
+ plainTransportsForBroadCasting = [];
46
+ // private plainTransportForAudio?: PlainTransport
47
+ // private plainTransportForVideo?: PlainTransport
47
48
  plainTransportConsumers = [];
49
+ plainTransportPayload;
48
50
  workers;
49
51
  sendWorkerIndex = -1;
50
52
  audioObserver;
@@ -330,11 +332,17 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
330
332
  }
331
333
  async onNewProducer(producer, participant) {
332
334
  if (producer && producer.closed === false) {
333
- if (this.plainTransportForAudio && producer.kind === "audio") {
334
- await this.consumeProducerForPlainTransport(this.plainTransportForAudio, producer);
335
+ try {
336
+ ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None &&
337
+ console.log("onNewProducer 411", producer, participant.userData);
338
+ }
339
+ catch (err) {
340
+ }
341
+ if (this.plainTransportPayload && this.plainTransportPayload.isAudioRequired && producer.kind === "audio") {
342
+ await this.createPlainTransportAndConsumeProducer(this.plainTransportPayload, producer);
335
343
  }
336
- else if (this.plainTransportForVideo && producer.kind === "video") {
337
- await this.consumeProducerForPlainTransport(this.plainTransportForVideo, producer);
344
+ if (this.plainTransportPayload && this.plainTransportPayload.isVideoRequired && producer.kind === "video") {
345
+ await this.createPlainTransportAndConsumeProducer(this.plainTransportPayload, producer);
338
346
  }
339
347
  }
340
348
  if (this.eachRoomMutliserverHandler) {
@@ -374,83 +382,105 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
374
382
  ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("=====startBroadcasting=======");
375
383
  ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log(plainTransportPayload);
376
384
  ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("=====startBroadcasting=======");
385
+ this.plainTransportPayload = plainTransportPayload;
377
386
  const isAudioRequired = plainTransportPayload.isAudioRequired;
378
387
  const isVideoRequired = plainTransportPayload.isVideoRequired;
379
- const connectToIp = plainTransportPayload.remoteIpAddress;
380
- if (isAudioRequired && this.plainTransportForAudio === undefined) {
381
- ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("isAudioRequired", isAudioRequired, "plainTransportForAudio is undefined");
382
- this.plainTransportForAudio = await this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration());
383
- if (this.plainTransportForAudio) {
384
- const port = plainTransportPayload.audioPort;
385
- const rtcpPort = (await Constant_1.default.plainTransportConfiguration()).rtcpMux ? undefined : plainTransportPayload.audioRtcpPort;
386
- await this.plainTransportForAudio.connect({
387
- ip: connectToIp,
388
- port: port,
389
- rtcpPort: rtcpPort,
390
- });
391
- }
392
- for (const eachRoomProducer of this.getAllProducerForRoom()) {
393
- if (this.plainTransportForAudio && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'audio') {
394
- try {
395
- ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("consumeProducerForPlainTransport", eachRoomProducer.producer);
396
- await this.consumeProducerForPlainTransport(this.plainTransportForAudio, eachRoomProducer.producer);
397
- }
398
- catch (err) {
399
- console.log("Error- 485 line no", err);
400
- }
388
+ // const connectToIp = plainTransportPayload.remoteIpAddress
389
+ for (const eachRoomProducer of this.getAllProducerForRoom()) {
390
+ if (isAudioRequired && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'audio') {
391
+ try {
392
+ await this.createPlainTransportAndConsumeProducer(plainTransportPayload, eachRoomProducer.producer);
393
+ }
394
+ catch (err) {
401
395
  }
402
396
  }
403
- }
404
- if (isVideoRequired && this.plainTransportForVideo === undefined) {
405
- this.plainTransportForVideo = await this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration());
406
- if (this.plainTransportForVideo) {
407
- const port = plainTransportPayload.videoPort;
408
- const rtcpPort = plainTransportPayload.videoRtcpPort;
409
- await this.plainTransportForVideo.connect({
410
- ip: connectToIp,
411
- port: port,
412
- rtcpPort: rtcpPort,
413
- });
414
- }
415
- for (const eachRoomProducer of this.getAllProducerForRoom()) {
416
- if (this.plainTransportForVideo && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'video') {
417
- try {
418
- await this.consumeProducerForPlainTransport(this.plainTransportForVideo, eachRoomProducer.producer);
419
- }
420
- catch (err) {
421
- }
397
+ else if (isVideoRequired && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'video') {
398
+ try {
399
+ await this.createPlainTransportAndConsumeProducer(plainTransportPayload, eachRoomProducer.producer);
400
+ }
401
+ catch (err) {
422
402
  }
423
403
  }
424
404
  }
405
+ // if (isAudioRequired && this.plainTransportForAudio === undefined) {
406
+ // ServerHandler.getInstance().serverStartRequest && ServerHandler.getInstance().serverStartRequest.logLevel !== LogLevel.None && console.log("isAudioRequired",isAudioRequired , "plainTransportForAudio is undefined")
407
+ // this.plainTransportForAudio = await this.sendRouter?.createPlainTransport(await Constant.plainTransportConfiguration())
408
+ // if (this.plainTransportForAudio) {
409
+ // const port = plainTransportPayload.audioPort
410
+ // const rtcpPort = (await Constant.plainTransportConfiguration()).rtcpMux ? undefined : plainTransportPayload.audioRtcpPort
411
+ // await this.plainTransportForAudio.connect({
412
+ // ip: connectToIp,
413
+ // port: port,
414
+ // rtcpPort: rtcpPort,
415
+ // })
416
+ // }
417
+ // for(const eachRoomProducer of this.getAllProducerForRoom()){
418
+ // if (this.plainTransportForAudio && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'audio') {
419
+ // try {
420
+ // ServerHandler.getInstance().serverStartRequest && ServerHandler.getInstance().serverStartRequest.logLevel !== LogLevel.None && console.log("consumeProducerForPlainTransport",eachRoomProducer.producer)
421
+ // await this.consumeProducerForPlainTransport(this.plainTransportForAudio, eachRoomProducer.producer)
422
+ // }
423
+ // catch (err) {
424
+ // console.log("Error- 485 line no",err )
425
+ // }
426
+ // }
427
+ // }
428
+ // }
429
+ // if (isVideoRequired && this.plainTransportForVideo === undefined) {
430
+ // this.plainTransportForVideo = await this.sendRouter?.createPlainTransport(await Constant.plainTransportConfiguration())
431
+ // if (this.plainTransportForVideo) {
432
+ // const port = plainTransportPayload.videoPort
433
+ // const rtcpPort = plainTransportPayload.videoRtcpPort
434
+ // await this.plainTransportForVideo.connect({
435
+ // ip: connectToIp,
436
+ // port: port,
437
+ // rtcpPort: rtcpPort,
438
+ // })
439
+ // }
440
+ // for(const eachRoomProducer of this.getAllProducerForRoom()){
441
+ // if (this.plainTransportForVideo && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'video') {
442
+ // try {
443
+ // await this.consumeProducerForPlainTransport(this.plainTransportForVideo, eachRoomProducer.producer)
444
+ // }
445
+ // catch (err) {
446
+ // }
447
+ // }
448
+ // }
449
+ // }
425
450
  const response = { plainTransportPayload: plainTransportPayload, roomId: this.roomId, rtpCapabilities: this.sendRouter?.rtpCapabilities };
426
451
  EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnPlainTransportCreated, response);
427
452
  }
453
+ createPlainTransportAndConsumeProducer = async (plainTransportPayload, producer) => {
454
+ if (ServerHandler_1.ServerHandler.getInstance().serverStartRequest.broadcastDataSource) {
455
+ const [portForBroadcasting, plainTransport] = await Promise.all([
456
+ ServerHandler_1.ServerHandler.getInstance().serverStartRequest.broadcastDataSource?.getPortForBroadcasting(plainTransportPayload),
457
+ this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration())
458
+ ]);
459
+ if (plainTransport) {
460
+ await plainTransport.connect({
461
+ ip: plainTransportPayload.remoteIpAddress,
462
+ port: portForBroadcasting.port,
463
+ rtcpPort: portForBroadcasting.rtcpPort,
464
+ });
465
+ await this.consumeProducerForPlainTransport(plainTransport, producer);
466
+ }
467
+ }
468
+ };
428
469
  async consumeProducerForPlainTransport(plainTransport, producer) {
429
470
  if (producer && producer.closed === false && this.sendRouter && this.sendRouter.rtpCapabilities) {
430
471
  try {
472
+ ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("consumeProducerForPlainTransport 529", producer.appData, producer.type);
431
473
  this.plainTransportConsumers.push(await plainTransport.consume({
432
474
  producerId: producer.id,
433
475
  rtpCapabilities: this.sendRouter.rtpCapabilities, // Assume the recorder supports same formats as mediasoup's router
434
476
  paused: false,
435
477
  appData: producer.appData
436
478
  }));
479
+ ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("consumeProducerForPlainTransport success 529", producer.appData, producer.type);
437
480
  }
438
481
  catch (err) {
439
482
  console.log("consumeProducerForPlainTransport ", err);
440
483
  }
441
- // try{
442
- // setTimeout(async () => {
443
- // try{
444
- // this.resumeAllBroadcastingConsumers()
445
- // }
446
- // catch(err){
447
- // console.log("consumeProducerForPlainTransport 542",err )
448
- // }
449
- // }, 500);
450
- // }
451
- // catch(err){
452
- // console.log("consumeProducerForPlainTransport 546",err )
453
- // }
454
484
  }
455
485
  }
456
486
  async redisSubscribeToTopic(topic) {
@@ -505,15 +535,24 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
505
535
  catch (err) {
506
536
  }
507
537
  });
538
+ this.plainTransportsForBroadCasting.forEach((eachPlainTransportsForBroadCasting) => {
539
+ try {
540
+ eachPlainTransportsForBroadCasting.close();
541
+ }
542
+ catch (err) {
543
+ }
544
+ });
508
545
  this.plainTransportConsumers = [];
509
- if (this.plainTransportForAudio) {
510
- this.plainTransportForAudio.close();
511
- this.plainTransportForAudio = undefined;
512
- }
513
- if (this.plainTransportForVideo) {
514
- this.plainTransportForVideo.close();
515
- this.plainTransportForVideo = undefined;
516
- }
546
+ this.plainTransportsForBroadCasting = [];
547
+ this.plainTransportPayload = undefined;
548
+ // if (this.plainTransportForAudio) {
549
+ // this.plainTransportForAudio.close()
550
+ // this.plainTransportForAudio = undefined
551
+ // }
552
+ // if (this.plainTransportForVideo) {
553
+ // this.plainTransportForVideo.close()
554
+ // this.plainTransportForVideo = undefined
555
+ // }
517
556
  this.recvRouter.forEach((eachRouter) => {
518
557
  eachRouter.close();
519
558
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vani-meeting-server",
3
- "version": "2.8.3",
3
+ "version": "2.8.5",
4
4
  "description": "Vani Meeting Server SDK",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",