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.
- package/lib/ServerHandler.d.ts +0 -4
- package/lib/interface/BroadcastDataSource.d.ts +9 -0
- package/lib/interface/BroadcastDataSource.js +2 -0
- package/lib/models/WebSocketServerStartRequest.d.ts +2 -0
- package/lib/models/WebSocketServerStartRequest.js +1 -0
- package/lib/sfu/SFUEachRoomHandler.d.ts +3 -2
- package/lib/sfu/SFUEachRoomHandler.js +107 -68
- package/package.json +1 -1
package/lib/ServerHandler.d.ts
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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
|
}
|
|
@@ -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
|
|
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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
334
|
-
|
|
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
|
-
|
|
337
|
-
await this.
|
|
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
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
});
|