vani-meeting-server 2.0.3 → 2.0.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/lib/redis/RedisHandler.js +1 -0
- package/lib/models/Event.d.ts +2 -0
- package/lib/models/Event.js +1 -0
- package/lib/sfu/SFUEachRoomHandler.d.ts +1 -1
- package/lib/sfu/SFUEachRoomHandler.js +15 -3
- package/lib/sfu/SFUEachRoomMutliServerHandler.d.ts +1 -0
- package/lib/sfu/SFUEachRoomMutliServerHandler.js +28 -12
- package/lib/sfu/SFUHandler.d.ts +1 -1
- package/lib/sfu/SFUHandler.js +2 -2
- package/lib/websocket/EachSocketConnectionHandler.d.ts +1 -0
- package/lib/websocket/EachSocketConnectionHandler.js +1 -0
- package/package.json +1 -1
package/lib/models/Event.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { Participant } from "./Participant";
|
|
|
5
5
|
export declare enum VaniEvent {
|
|
6
6
|
OnNewMeetingStarted = "onNewMeetingStarted",
|
|
7
7
|
OnNewMeetingEnded = "onNewMeetingEnded",
|
|
8
|
+
OnAllParticipantLeftOnServer = "OnAllParticipantLeftOnServer",
|
|
8
9
|
OnUserJoined = "onUserJoined",
|
|
9
10
|
OnUserLeft = "onUserLeft",
|
|
10
11
|
OnServerStarted = "onServerStarted",
|
|
@@ -16,6 +17,7 @@ export declare enum VaniEvent {
|
|
|
16
17
|
interface VaniConnectionEvents {
|
|
17
18
|
[VaniEvent.OnNewMeetingStarted]: (roomId: string) => any;
|
|
18
19
|
[VaniEvent.OnNewMeetingEnded]: (roomId: string) => any;
|
|
20
|
+
[VaniEvent.OnAllParticipantLeftOnServer]: (roomId: string) => any;
|
|
19
21
|
[VaniEvent.OnUserJoined]: (participant: Participant) => any;
|
|
20
22
|
[VaniEvent.OnUserLeft]: (participant: Participant) => any;
|
|
21
23
|
[VaniEvent.OnServerStarted]: () => any;
|
package/lib/models/Event.js
CHANGED
|
@@ -5,6 +5,7 @@ var VaniEvent;
|
|
|
5
5
|
(function (VaniEvent) {
|
|
6
6
|
VaniEvent["OnNewMeetingStarted"] = "onNewMeetingStarted";
|
|
7
7
|
VaniEvent["OnNewMeetingEnded"] = "onNewMeetingEnded";
|
|
8
|
+
VaniEvent["OnAllParticipantLeftOnServer"] = "OnAllParticipantLeftOnServer";
|
|
8
9
|
VaniEvent["OnUserJoined"] = "onUserJoined";
|
|
9
10
|
VaniEvent["OnUserLeft"] = "onUserLeft";
|
|
10
11
|
VaniEvent["OnServerStarted"] = "onServerStarted";
|
|
@@ -68,5 +68,5 @@ export declare class SFUEachRoomHandler extends BaseSFUWebsocket implements SFUE
|
|
|
68
68
|
resumeAllBroadcastingConsumers(): Promise<void>;
|
|
69
69
|
startBroadcasting(plainTransportPayload: PlainTransportPayload): Promise<void>;
|
|
70
70
|
private consumeProducerForPlainTransport;
|
|
71
|
-
cleanUp(): void
|
|
71
|
+
cleanUp(): Promise<void>;
|
|
72
72
|
}
|
|
@@ -371,12 +371,24 @@ class SFUEachRoomHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket {
|
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
|
-
cleanUp() {
|
|
374
|
+
async cleanUp() {
|
|
375
375
|
console.debug("Clean Up Room Id ", this.roomId);
|
|
376
|
-
RedisHandler_1.RedisHandler.getInstance().
|
|
376
|
+
const allParticipants = await RedisHandler_1.RedisHandler.getInstance().getAllParticipants(this.roomId);
|
|
377
|
+
let shouldCleanupRedis = true;
|
|
378
|
+
if (allParticipants && allParticipants.length > 0) {
|
|
379
|
+
const selfIpAddress = await Constant_1.default.getPublicIp();
|
|
380
|
+
const participantOnOtherServer = allParticipants.filter((eachParticipant) => eachParticipant.serverIpAddress !== selfIpAddress);
|
|
381
|
+
if (participantOnOtherServer && participantOnOtherServer.length > 0) {
|
|
382
|
+
shouldCleanupRedis = false;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (shouldCleanupRedis) {
|
|
386
|
+
RedisHandler_1.RedisHandler.getInstance().cleanUpRoomId(this.roomId);
|
|
387
|
+
EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnNewMeetingEnded, this.roomId);
|
|
388
|
+
}
|
|
389
|
+
EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnAllParticipantLeftOnServer, this.roomId);
|
|
377
390
|
this.eachRoomMutliserverHandler?.cleanUp();
|
|
378
391
|
this.eachRoomMutliserverHandler = undefined;
|
|
379
|
-
EventEmitterHandler_1.EventEmitterHandler.getInstance().vaniEventEmitter.emit(Event_1.VaniEvent.OnNewMeetingEnded, this.roomId);
|
|
380
392
|
this.roomPaticipants.forEach((sfuEachRoomUser) => {
|
|
381
393
|
this.onUserLeft(sfuEachRoomUser.selfParticipant);
|
|
382
394
|
});
|
|
@@ -19,4 +19,5 @@ export declare class SFUEachRoomMutliServerHandler extends BaseSFUWebsocket {
|
|
|
19
19
|
consumeProductAndInfrom: (transport: PipeTransport, ipAddress: string, producer: SFUEachRoomProducer) => Promise<void>;
|
|
20
20
|
onNewLocalProducer(producer: SFUEachRoomProducer): Promise<void>;
|
|
21
21
|
onNewRemoteProducer(producer: Producer): Promise<void>;
|
|
22
|
+
private onRemoteConsumerClosed;
|
|
22
23
|
}
|
|
@@ -75,10 +75,16 @@ class SFUEachRoomMutliServerHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket
|
|
|
75
75
|
const ip = message.data.ip;
|
|
76
76
|
if (this.pipeTransports[ip]) {
|
|
77
77
|
const producer = await this.pipeTransports[ip].transport.produce({ rtpParameters: message.data.rtpParameters, kind: message.data.kind, appData: message.data.appData });
|
|
78
|
+
producer.appData.consumerId = message.data.consumerId;
|
|
78
79
|
this.onNewRemoteProducer(producer);
|
|
79
80
|
console.log("MultiSystemEvents.OnConsumerData", producer);
|
|
80
81
|
}
|
|
81
82
|
}
|
|
83
|
+
else if (message.type === EachSocketConnectionHandler_1.MultiSystemEvents.OnRemoteConsumerClosed) {
|
|
84
|
+
if (message.data.consumerId) {
|
|
85
|
+
this.onRemoteConsumerClosed(message.data.consumerId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
82
88
|
};
|
|
83
89
|
createPipeTransport = async (ip) => {
|
|
84
90
|
if (this.pipeTransports[ip]) {
|
|
@@ -113,13 +119,12 @@ class SFUEachRoomMutliServerHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket
|
|
|
113
119
|
const consumer = await transport.consume({ producerId: producer.producer.id });
|
|
114
120
|
console.log("consumeProductAndInfrom consumer.paused", consumer.paused);
|
|
115
121
|
if (consumer) {
|
|
116
|
-
consumer.on("@
|
|
117
|
-
console.log("Transport consumer closed");
|
|
118
|
-
});
|
|
119
|
-
consumer.on("@producerclose", () => {
|
|
122
|
+
consumer.on("@producerclose", async () => {
|
|
120
123
|
console.log("Transport producerclose closed");
|
|
124
|
+
consumer.close();
|
|
125
|
+
this.redisBroadcastMessageToTopic(Utility_1.Utility.getTopicForRoomIdAndIp(this.roomId, ipAddress), this.prepareMutilSystemEvents(EachSocketConnectionHandler_1.MultiSystemEvents.OnRemoteConsumerClosed, this.roomId, { ip: await Constant_1.default.getPublicIp(), consumerId: consumer.id }));
|
|
121
126
|
});
|
|
122
|
-
this.redisBroadcastMessageToTopic(Utility_1.Utility.getTopicForRoomIdAndIp(this.roomId, ipAddress), this.prepareMutilSystemEvents(EachSocketConnectionHandler_1.MultiSystemEvents.OnConsumerData, this.roomId, { ip: await Constant_1.default.getPublicIp(), rtpParameters: consumer?.rtpParameters, kind: consumer.kind, appData: producer.producer.appData }));
|
|
127
|
+
this.redisBroadcastMessageToTopic(Utility_1.Utility.getTopicForRoomIdAndIp(this.roomId, ipAddress), this.prepareMutilSystemEvents(EachSocketConnectionHandler_1.MultiSystemEvents.OnConsumerData, this.roomId, { ip: await Constant_1.default.getPublicIp(), rtpParameters: consumer?.rtpParameters, kind: consumer.kind, appData: producer.producer.appData, consumerId: consumer.id }));
|
|
123
128
|
}
|
|
124
129
|
}
|
|
125
130
|
};
|
|
@@ -137,15 +142,17 @@ class SFUEachRoomMutliServerHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket
|
|
|
137
142
|
if (remoteParticipant) {
|
|
138
143
|
await producer.resume();
|
|
139
144
|
producer.on("@close", async () => {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const remoteProducer = this.remoteProducers.find((eachRemoteProducer) => eachRemoteProducer.producer.id === producer.id);
|
|
143
|
-
if (remoteProducer) {
|
|
144
|
-
this.redisBroadcastMessageToTopic(Utility_1.Utility.getTopicForRoomIdAndIp(this.roomId, (await Constant_1.default.getPublicIp())), this.preapreClientMessageBody(false, remoteProducer.participant, this.preapreWebSocketMessageBody(EachSocketConnectionHandler_1.SFUMessageType.OnTrackEnded, response)));
|
|
145
|
-
this.remoteProducers = this.remoteProducers.filter((eachRemoteProducer) => eachRemoteProducer.producer.id !== producer.id);
|
|
145
|
+
if (producer.appData.consumerId) {
|
|
146
|
+
this.onRemoteConsumerClosed(producer.appData.consumerId);
|
|
146
147
|
}
|
|
148
|
+
// console.log("On Producer closed", producer)
|
|
149
|
+
// const response = { producerId: producer.id }
|
|
150
|
+
// const remoteProducer = this.remoteProducers.find((eachRemoteProducer) => eachRemoteProducer.producer.id === producer.id)
|
|
151
|
+
// if (remoteProducer) {
|
|
152
|
+
// this.redisBroadcastMessageToTopic(Utility.getTopicForRoomIdAndIp(this.roomId, (await Constant.getPublicIp())!), this.preapreClientMessageBody(false, remoteProducer.participant, this.preapreWebSocketMessageBody(SFUMessageType.OnTrackEnded, response)));
|
|
153
|
+
// this.remoteProducers = this.remoteProducers.filter((eachRemoteProducer) => eachRemoteProducer.producer.id !== producer.id)
|
|
154
|
+
// }
|
|
147
155
|
});
|
|
148
|
-
console.log("onNewRemoteProducer producer.paused", producer.paused);
|
|
149
156
|
await this.roomHandlerDataSource.pipeToRoute(producer);
|
|
150
157
|
this.remoteProducers.push({ producer: producer, participant: remoteParticipant });
|
|
151
158
|
this.roomHandlerDataSource.onNewProducer(producer, remoteParticipant);
|
|
@@ -154,5 +161,14 @@ class SFUEachRoomMutliServerHandler extends BaseSFUWebsocket_1.BaseSFUWebsocket
|
|
|
154
161
|
}
|
|
155
162
|
}
|
|
156
163
|
}
|
|
164
|
+
onRemoteConsumerClosed = async (remoteConsumerId) => {
|
|
165
|
+
const remoteProducer = this.remoteProducers.find((eachRemoteProducer) => eachRemoteProducer.producer.appData.consumerId === remoteConsumerId);
|
|
166
|
+
if (remoteProducer) {
|
|
167
|
+
remoteProducer.producer.close();
|
|
168
|
+
const response = { producerId: remoteProducer.producer.id };
|
|
169
|
+
this.redisBroadcastMessageToTopic(Utility_1.Utility.getTopicForRoomIdAndIp(this.roomId, (await Constant_1.default.getPublicIp())), this.preapreClientMessageBody(false, remoteProducer.participant, this.preapreWebSocketMessageBody(EachSocketConnectionHandler_1.SFUMessageType.OnTrackEnded, response)));
|
|
170
|
+
this.remoteProducers = this.remoteProducers.filter((eachRemoteProducer) => eachRemoteProducer.producer.id !== remoteProducer.producer.id);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
157
173
|
}
|
|
158
174
|
exports.SFUEachRoomMutliServerHandler = SFUEachRoomMutliServerHandler;
|
package/lib/sfu/SFUHandler.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare class SFUHandler {
|
|
|
9
9
|
constructor();
|
|
10
10
|
init(): Promise<void>;
|
|
11
11
|
checkAndSetupRoom(roomId: string, connectionProtocol: ConnectionProtocol): Promise<void>;
|
|
12
|
-
checkIfCanCloseRoom(roomId: string): void
|
|
12
|
+
checkIfCanCloseRoom(roomId: string): Promise<void>;
|
|
13
13
|
getRoomSFUHandler(roomId: string): SFUEachRoomHandler | undefined;
|
|
14
14
|
startPlainTransportForBroadcasting(plainTransportPayload: PlainTransportPayload, forRoomid: string): Promise<void>;
|
|
15
15
|
resumeAllBroadcastingConsumers(forRoomid: string): Promise<void>;
|
package/lib/sfu/SFUHandler.js
CHANGED
|
@@ -51,10 +51,10 @@ class SFUHandler {
|
|
|
51
51
|
this.sfuRooms.set(roomId, sfuEachRoomHandler);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
checkIfCanCloseRoom(roomId) {
|
|
54
|
+
async checkIfCanCloseRoom(roomId) {
|
|
55
55
|
const room = this.getRoomSFUHandler(roomId);
|
|
56
56
|
if (room && room.roomPaticipants.size === 0) {
|
|
57
|
-
room.cleanUp();
|
|
57
|
+
await room.cleanUp();
|
|
58
58
|
this.sfuRooms.delete(roomId);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -66,6 +66,7 @@ export declare enum SFUMessageType {
|
|
|
66
66
|
export declare enum MultiSystemEvents {
|
|
67
67
|
OnNewServerJoinedForRoom = "OnNewServerJoinedForRoom",
|
|
68
68
|
OnConsumerData = "OnConsumerData",
|
|
69
|
+
OnRemoteConsumerClosed = "OnRemoteConsumerClosed",
|
|
69
70
|
OnConnectPipe = "OnConnectPipe",
|
|
70
71
|
OnPipeConnected = "OnPipeConnected"
|
|
71
72
|
}
|
|
@@ -84,6 +84,7 @@ var MultiSystemEvents;
|
|
|
84
84
|
(function (MultiSystemEvents) {
|
|
85
85
|
MultiSystemEvents["OnNewServerJoinedForRoom"] = "OnNewServerJoinedForRoom";
|
|
86
86
|
MultiSystemEvents["OnConsumerData"] = "OnConsumerData";
|
|
87
|
+
MultiSystemEvents["OnRemoteConsumerClosed"] = "OnRemoteConsumerClosed";
|
|
87
88
|
MultiSystemEvents["OnConnectPipe"] = "OnConnectPipe";
|
|
88
89
|
MultiSystemEvents["OnPipeConnected"] = "OnPipeConnected";
|
|
89
90
|
})(MultiSystemEvents = exports.MultiSystemEvents || (exports.MultiSystemEvents = {}));
|