vani-meeting-server 2.8.4 → 2.8.6

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.
@@ -6,19 +6,17 @@ import { WebSocketServerStartRequest } from "./models/WebSocketServerStartReques
6
6
  import { SFUHandler } from "./sfu/SFUHandler";
7
7
  import { WebSocketHandler } from "./websocket/WebSocketHandler";
8
8
  import { RtpCapabilities } from "mediasoup/node/lib/rtpParametersTypes";
9
+ import { BroadcastPortResponse } from "./interface/BroadcastDataSource";
9
10
  export interface PlainTransportPayload {
10
11
  remoteIpAddress: string;
11
12
  isAudioRequired: boolean;
12
13
  isVideoRequired: boolean;
13
- audioPort?: number;
14
- audioRtcpPort?: number;
15
- videoPort?: number;
16
- videoRtcpPort?: number;
17
14
  extraData?: any;
18
15
  }
19
16
  export interface PlainTransportCreatedCallback {
20
17
  roomId: string;
21
18
  plainTransportPayload: PlainTransportPayload;
19
+ broadcastPortResponse?: BroadcastPortResponse;
22
20
  rtpCapabilities?: RtpCapabilities;
23
21
  }
24
22
  export declare class ServerHandler {
@@ -0,0 +1,9 @@
1
+ import { PlainTransportPayload } from "../ServerHandler";
2
+ export interface BroadcastDataSource {
3
+ getPortForBroadcasting(plainTransportPayload: PlainTransportPayload): Promise<BroadcastPortResponse | undefined>;
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;
@@ -336,11 +338,11 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
336
338
  }
337
339
  catch (err) {
338
340
  }
339
- if (this.plainTransportForAudio && producer.kind === "audio") {
340
- await this.consumeProducerForPlainTransport(this.plainTransportForAudio, producer);
341
+ if (this.plainTransportPayload && this.plainTransportPayload.isAudioRequired && producer.kind === "audio") {
342
+ await this.createPlainTransportAndConsumeProducer(this.plainTransportPayload, producer);
341
343
  }
342
- else if (this.plainTransportForVideo && producer.kind === "video") {
343
- await this.consumeProducerForPlainTransport(this.plainTransportForVideo, producer);
344
+ if (this.plainTransportPayload && this.plainTransportPayload.isVideoRequired && producer.kind === "video") {
345
+ await this.createPlainTransportAndConsumeProducer(this.plainTransportPayload, producer);
344
346
  }
345
347
  }
346
348
  if (this.eachRoomMutliserverHandler) {
@@ -380,57 +382,92 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
380
382
  ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("=====startBroadcasting=======");
381
383
  ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log(plainTransportPayload);
382
384
  ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("=====startBroadcasting=======");
385
+ this.plainTransportPayload = plainTransportPayload;
383
386
  const isAudioRequired = plainTransportPayload.isAudioRequired;
384
387
  const isVideoRequired = plainTransportPayload.isVideoRequired;
385
- const connectToIp = plainTransportPayload.remoteIpAddress;
386
- if (isAudioRequired && this.plainTransportForAudio === undefined) {
387
- ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("isAudioRequired", isAudioRequired, "plainTransportForAudio is undefined");
388
- this.plainTransportForAudio = await this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration());
389
- if (this.plainTransportForAudio) {
390
- const port = plainTransportPayload.audioPort;
391
- const rtcpPort = (await Constant_1.default.plainTransportConfiguration()).rtcpMux ? undefined : plainTransportPayload.audioRtcpPort;
392
- await this.plainTransportForAudio.connect({
393
- ip: connectToIp,
394
- port: port,
395
- rtcpPort: rtcpPort,
396
- });
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) {
395
+ }
397
396
  }
398
- for (const eachRoomProducer of this.getAllProducerForRoom()) {
399
- if (this.plainTransportForAudio && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'audio') {
400
- try {
401
- ServerHandler_1.ServerHandler.getInstance().serverStartRequest && ServerHandler_1.ServerHandler.getInstance().serverStartRequest.logLevel !== WebSocketServerStartRequest_1.LogLevel.None && console.log("consumeProducerForPlainTransport", eachRoomProducer.producer);
402
- await this.consumeProducerForPlainTransport(this.plainTransportForAudio, eachRoomProducer.producer);
403
- }
404
- catch (err) {
405
- console.log("Error- 485 line no", err);
406
- }
397
+ else if (isVideoRequired && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'video') {
398
+ try {
399
+ await this.createPlainTransportAndConsumeProducer(plainTransportPayload, eachRoomProducer.producer);
400
+ }
401
+ catch (err) {
407
402
  }
408
403
  }
409
404
  }
410
- if (isVideoRequired && this.plainTransportForVideo === undefined) {
411
- this.plainTransportForVideo = await this.sendRouter?.createPlainTransport(await Constant_1.default.plainTransportConfiguration());
412
- if (this.plainTransportForVideo) {
413
- const port = plainTransportPayload.videoPort;
414
- const rtcpPort = plainTransportPayload.videoRtcpPort;
415
- await this.plainTransportForVideo.connect({
416
- ip: connectToIp,
417
- port: port,
418
- rtcpPort: rtcpPort,
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
+ // }
450
+ // const response: PlainTransportCreatedCallback = { plainTransportPayload: plainTransportPayload, roomId: this.roomId ,rtpCapabilities : this.sendRouter?.rtpCapabilities}
451
+ // EventEmitterHandler.getInstance().vaniEventEmitter.emit(VaniEvent.OnPlainTransportCreated, response)
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 && portForBroadcasting) {
460
+ await plainTransport.connect({
461
+ ip: plainTransportPayload.remoteIpAddress,
462
+ port: portForBroadcasting.port,
463
+ rtcpPort: portForBroadcasting.rtcpPort,
419
464
  });
420
- }
421
- for (const eachRoomProducer of this.getAllProducerForRoom()) {
422
- if (this.plainTransportForVideo && eachRoomProducer && eachRoomProducer.producer && eachRoomProducer.producer.kind === 'video') {
423
- try {
424
- await this.consumeProducerForPlainTransport(this.plainTransportForVideo, eachRoomProducer.producer);
425
- }
426
- catch (err) {
427
- }
428
- }
465
+ await this.consumeProducerForPlainTransport(plainTransport, producer);
466
+ const response = { plainTransportPayload: plainTransportPayload, roomId: this.roomId, rtpCapabilities: this.sendRouter?.rtpCapabilities, broadcastPortResponse: portForBroadcasting };
467
+ EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnPlainTransportCreated, response);
429
468
  }
430
469
  }
431
- const response = { plainTransportPayload: plainTransportPayload, roomId: this.roomId, rtpCapabilities: this.sendRouter?.rtpCapabilities };
432
- EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnPlainTransportCreated, response);
433
- }
470
+ };
434
471
  async consumeProducerForPlainTransport(plainTransport, producer) {
435
472
  if (producer && producer.closed === false && this.sendRouter && this.sendRouter.rtpCapabilities) {
436
473
  try {
@@ -446,19 +483,6 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
446
483
  catch (err) {
447
484
  console.log("consumeProducerForPlainTransport ", err);
448
485
  }
449
- // try{
450
- // setTimeout(async () => {
451
- // try{
452
- // this.resumeAllBroadcastingConsumers()
453
- // }
454
- // catch(err){
455
- // console.log("consumeProducerForPlainTransport 542",err )
456
- // }
457
- // }, 500);
458
- // }
459
- // catch(err){
460
- // console.log("consumeProducerForPlainTransport 546",err )
461
- // }
462
486
  }
463
487
  }
464
488
  async redisSubscribeToTopic(topic) {
@@ -513,15 +537,24 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
513
537
  catch (err) {
514
538
  }
515
539
  });
540
+ this.plainTransportsForBroadCasting.forEach((eachPlainTransportsForBroadCasting) => {
541
+ try {
542
+ eachPlainTransportsForBroadCasting.close();
543
+ }
544
+ catch (err) {
545
+ }
546
+ });
516
547
  this.plainTransportConsumers = [];
517
- if (this.plainTransportForAudio) {
518
- this.plainTransportForAudio.close();
519
- this.plainTransportForAudio = undefined;
520
- }
521
- if (this.plainTransportForVideo) {
522
- this.plainTransportForVideo.close();
523
- this.plainTransportForVideo = undefined;
524
- }
548
+ this.plainTransportsForBroadCasting = [];
549
+ this.plainTransportPayload = undefined;
550
+ // if (this.plainTransportForAudio) {
551
+ // this.plainTransportForAudio.close()
552
+ // this.plainTransportForAudio = undefined
553
+ // }
554
+ // if (this.plainTransportForVideo) {
555
+ // this.plainTransportForVideo.close()
556
+ // this.plainTransportForVideo = undefined
557
+ // }
525
558
  this.recvRouter.forEach((eachRouter) => {
526
559
  eachRouter.close();
527
560
  });
@@ -97,7 +97,7 @@ class SFUHandler {
97
97
  sfuEachRoomHandler.startBroadcasting(plainTransportPayload);
98
98
  }
99
99
  else {
100
- const response = { plainTransportPayload: plainTransportPayload, roomId: forRoomid };
100
+ const response = { plainTransportPayload: plainTransportPayload, roomId: forRoomid, broadcastPortResponse: undefined };
101
101
  EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnPlainTransportCreateError, response);
102
102
  }
103
103
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vani-meeting-server",
3
- "version": "2.8.4",
3
+ "version": "2.8.6",
4
4
  "description": "Vani Meeting Server SDK",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",