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.
- package/lib/ServerHandler.d.ts +10 -0
- package/lib/ServerHandler.js +2 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/models/Event.d.ts +3 -1
- package/lib/models/Event.js +1 -0
- package/lib/sfu/SFUEachRoomHandler.d.ts +5 -1
- package/lib/sfu/SFUEachRoomHandler.js +74 -47
- package/lib/sfu/SFUHandler.d.ts +2 -0
- package/lib/sfu/SFUHandler.js +6 -0
- package/package.json +1 -1
package/lib/ServerHandler.d.ts
CHANGED
|
@@ -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
|
}
|
package/lib/ServerHandler.js
CHANGED
package/lib/index.d.ts
CHANGED
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);
|
package/lib/models/Event.d.ts
CHANGED
|
@@ -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;
|
package/lib/models/Event.js
CHANGED
|
@@ -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
|
-
|
|
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 ===
|
|
58
|
-
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
223
|
+
console.log(plainTransportPayload);
|
|
219
224
|
console.log("=====startBroadcasting=======");
|
|
220
|
-
const isAudioRequired =
|
|
221
|
-
const isVideoRequired =
|
|
222
|
-
const 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 =
|
|
227
|
-
const 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 =
|
|
252
|
-
const 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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
});
|
package/lib/sfu/SFUHandler.d.ts
CHANGED
|
@@ -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
|
}
|
package/lib/sfu/SFUHandler.js
CHANGED
|
@@ -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";
|