vani-meeting-client 0.3.5 → 0.3.8
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/MeetingHandler.js +8 -3
- package/lib/model/MeetingStartRequest.d.ts +1 -0
- package/lib/model/MeetingStartRequest.js +1 -0
- package/lib/model/MessagePayload.d.ts +5 -0
- package/lib/model/MessagePayload.js +6 -0
- package/lib/model/Track.d.ts +2 -1
- package/lib/model/Track.js +1 -0
- package/lib/video-call-handler/BaseVideoCallHandler.d.ts +1 -0
- package/lib/video-call-handler/SFUHandler.d.ts +1 -0
- package/lib/video-call-handler/SFUHandler.js +80 -33
- package/lib/video-call-handler/WebrtcHandler.d.ts +1 -0
- package/lib/video-call-handler/WebrtcHandler.js +3 -0
- package/lib/websocket-handler/WebsocketHandler.d.ts +1 -0
- package/lib/websocket-handler/WebsocketHandler.js +1 -0
- package/package.json +1 -1
package/lib/MeetingHandler.js
CHANGED
|
@@ -34,7 +34,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
-
import { VaniEvent, MeetingStartRequest } from ".";
|
|
37
|
+
import { VaniEvent, MeetingStartRequest, ChatSendVia } from ".";
|
|
38
38
|
import { DynamicLibHelper } from "./utility/DynamicLibHelper";
|
|
39
39
|
import * as log from 'loglevel';
|
|
40
40
|
import { WebSocketBasicEvents, WebsocketHandler } from "./websocket-handler/WebsocketHandler";
|
|
@@ -303,7 +303,7 @@ var MeetingHandler = /** @class */ (function () {
|
|
|
303
303
|
};
|
|
304
304
|
///Messages
|
|
305
305
|
MeetingHandler.prototype.sendMessage = function (message) {
|
|
306
|
-
var _a, _b;
|
|
306
|
+
var _a, _b, _c;
|
|
307
307
|
if (!message.sender) {
|
|
308
308
|
message.sender = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getSelfParticipant();
|
|
309
309
|
}
|
|
@@ -317,7 +317,12 @@ var MeetingHandler = /** @class */ (function () {
|
|
|
317
317
|
else {
|
|
318
318
|
var to = message.to === "all" ? this.meetingStartRequest.roomId : message.to;
|
|
319
319
|
var messageObj = { type: "chat", message: message.toJsonObjectForSending(), to: to, shouldPresist: message.shouldPresist };
|
|
320
|
-
(
|
|
320
|
+
if (message.chatSendVia === ChatSendVia.DataChannel) {
|
|
321
|
+
(_b = this.videoCallHandler) === null || _b === void 0 ? void 0 : _b.sendMessageViaDataChannel(messageObj);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
(_c = this.websocketCallHandler) === null || _c === void 0 ? void 0 : _c.sendSocketMessage(WebSocketBasicEvents.Message, messageObj);
|
|
325
|
+
}
|
|
321
326
|
return { message: "Message Sent", error: 'NoError', isSuccess: true };
|
|
322
327
|
}
|
|
323
328
|
};
|
|
@@ -36,6 +36,7 @@ export declare class MeetingStartRequest {
|
|
|
36
36
|
defaultScreenShareBlocked: boolean;
|
|
37
37
|
defaultCameraFacingMode: CameraFacingMode;
|
|
38
38
|
simulcastEncodings: RTCRtpEncodingParameters[];
|
|
39
|
+
isDataChannelRequired: boolean;
|
|
39
40
|
urlToCheckInternetPresent: string;
|
|
40
41
|
constructor(_roomId: string, _userId: string, _appId: string, _wssUrl: string);
|
|
41
42
|
}
|
|
@@ -31,6 +31,7 @@ var MeetingStartRequest = /** @class */ (function () {
|
|
|
31
31
|
this.defaultScreenShareBlocked = false;
|
|
32
32
|
this.defaultCameraFacingMode = CameraFacingMode.Front;
|
|
33
33
|
this.simulcastEncodings = [{ maxBitrate: 40000, scaleResolutionDownBy: 2.0 }, { maxBitrate: 620000, scaleResolutionDownBy: 1.0 },];
|
|
34
|
+
this.isDataChannelRequired = false;
|
|
34
35
|
this.urlToCheckInternetPresent = "https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=Stack%20Overflow";
|
|
35
36
|
this.roomId = _roomId;
|
|
36
37
|
this.userId = _userId;
|
|
@@ -4,6 +4,10 @@ export declare enum ChatMessageType {
|
|
|
4
4
|
File = "file",
|
|
5
5
|
Info = "info"
|
|
6
6
|
}
|
|
7
|
+
export declare enum ChatSendVia {
|
|
8
|
+
WebSocket = "WebSocket",
|
|
9
|
+
DataChannel = "DataChannel"
|
|
10
|
+
}
|
|
7
11
|
export declare class MessagePayload {
|
|
8
12
|
message: string;
|
|
9
13
|
to: string;
|
|
@@ -13,6 +17,7 @@ export declare class MessagePayload {
|
|
|
13
17
|
sender?: Participant;
|
|
14
18
|
shouldPresist: boolean;
|
|
15
19
|
time: number;
|
|
20
|
+
chatSendVia: ChatSendVia;
|
|
16
21
|
constructor(_message: string);
|
|
17
22
|
constructor(_message: string, _to: string);
|
|
18
23
|
toJsonObjectForSending(): {
|
|
@@ -4,6 +4,11 @@ export var ChatMessageType;
|
|
|
4
4
|
ChatMessageType["File"] = "file";
|
|
5
5
|
ChatMessageType["Info"] = "info";
|
|
6
6
|
})(ChatMessageType || (ChatMessageType = {}));
|
|
7
|
+
export var ChatSendVia;
|
|
8
|
+
(function (ChatSendVia) {
|
|
9
|
+
ChatSendVia["WebSocket"] = "WebSocket";
|
|
10
|
+
ChatSendVia["DataChannel"] = "DataChannel";
|
|
11
|
+
})(ChatSendVia || (ChatSendVia = {}));
|
|
7
12
|
var MessagePayload = /** @class */ (function () {
|
|
8
13
|
function MessagePayload(_message, _to, _sender, _type) {
|
|
9
14
|
if (_to === void 0) { _to = "all"; }
|
|
@@ -12,6 +17,7 @@ var MessagePayload = /** @class */ (function () {
|
|
|
12
17
|
this.extraData = {};
|
|
13
18
|
this.shouldPresist = false;
|
|
14
19
|
this.time = new Date().getTime();
|
|
20
|
+
this.chatSendVia = ChatSendVia.WebSocket;
|
|
15
21
|
this.message = _message;
|
|
16
22
|
this.to = _to;
|
|
17
23
|
this.sender = _sender;
|
package/lib/model/Track.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ export declare enum TrackKind {
|
|
|
4
4
|
Audio = "Audio",
|
|
5
5
|
ScreenshareVideo = "ScreenshareVideo",
|
|
6
6
|
ScreenshareAudio = "ScreenshareAudio",
|
|
7
|
-
LocalVideo = "LocalVideo"
|
|
7
|
+
LocalVideo = "LocalVideo",
|
|
8
|
+
DataChannel = "DataChannel"
|
|
8
9
|
}
|
|
9
10
|
export declare class Track {
|
|
10
11
|
trackId: string;
|
package/lib/model/Track.js
CHANGED
|
@@ -5,6 +5,7 @@ export var TrackKind;
|
|
|
5
5
|
TrackKind["ScreenshareVideo"] = "ScreenshareVideo";
|
|
6
6
|
TrackKind["ScreenshareAudio"] = "ScreenshareAudio";
|
|
7
7
|
TrackKind["LocalVideo"] = "LocalVideo";
|
|
8
|
+
TrackKind["DataChannel"] = "DataChannel";
|
|
8
9
|
})(TrackKind || (TrackKind = {}));
|
|
9
10
|
var Track = /** @class */ (function () {
|
|
10
11
|
function Track(_participant, _isLocalTrack, _trackKind, _track) {
|
|
@@ -14,6 +14,7 @@ export declare abstract class BaseVideoCallHandler extends Base {
|
|
|
14
14
|
abstract pauseIncomingTrack(track: Track): void;
|
|
15
15
|
abstract onParticipantUpdated(): void;
|
|
16
16
|
abstract createDataChannel(): any;
|
|
17
|
+
abstract sendMessageViaDataChannel(messagePayload: any): any;
|
|
17
18
|
updateSpatialForTrack(track: Track, spatialLayerIndex: number): Promise<void>;
|
|
18
19
|
reconnectedWithoutPing(): void;
|
|
19
20
|
cleanup(): void;
|
|
@@ -22,6 +22,7 @@ export declare class SFUHandler extends BaseVideoCallHandler {
|
|
|
22
22
|
sendTrack(track: Track): Promise<void>;
|
|
23
23
|
createDataChannel(): Promise<void>;
|
|
24
24
|
onParticipantUpdated(): void;
|
|
25
|
+
sendMessageViaDataChannel(messagePayload: any): void;
|
|
25
26
|
init(): Promise<void>;
|
|
26
27
|
private onTransportNotFound;
|
|
27
28
|
private addObserverForDevice;
|
|
@@ -198,7 +198,6 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
198
198
|
if (webcamProducer) {
|
|
199
199
|
this.producers.push(webcamProducer);
|
|
200
200
|
this.onParticipantUpdated();
|
|
201
|
-
this.createDataChannel();
|
|
202
201
|
// this.sendMessageReadyToConsume();
|
|
203
202
|
}
|
|
204
203
|
_d.label = 4;
|
|
@@ -208,20 +207,21 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
208
207
|
});
|
|
209
208
|
};
|
|
210
209
|
SFUHandler.prototype.createDataChannel = function () {
|
|
211
|
-
var _a;
|
|
210
|
+
var _a, _b;
|
|
212
211
|
return __awaiter(this, void 0, void 0, function () {
|
|
213
|
-
var webcamProducer;
|
|
214
|
-
return __generator(this, function (
|
|
215
|
-
switch (
|
|
212
|
+
var track, webcamProducer;
|
|
213
|
+
return __generator(this, function (_c) {
|
|
214
|
+
switch (_c.label) {
|
|
216
215
|
case 0:
|
|
217
216
|
if (!(this.dataProducers.length === 0)) return [3 /*break*/, 2];
|
|
218
|
-
|
|
217
|
+
track = new Track((_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getSelfParticipant(), true, TrackKind.DataChannel, undefined);
|
|
218
|
+
return [4 /*yield*/, ((_b = this.sendTransport) === null || _b === void 0 ? void 0 : _b.produceData({ appData: track }))];
|
|
219
219
|
case 1:
|
|
220
|
-
webcamProducer =
|
|
220
|
+
webcamProducer = _c.sent();
|
|
221
221
|
if (webcamProducer) {
|
|
222
222
|
this.dataProducers.push(webcamProducer);
|
|
223
223
|
}
|
|
224
|
-
|
|
224
|
+
_c.label = 2;
|
|
225
225
|
case 2: return [2 /*return*/];
|
|
226
226
|
}
|
|
227
227
|
});
|
|
@@ -239,6 +239,11 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
239
239
|
});
|
|
240
240
|
}
|
|
241
241
|
};
|
|
242
|
+
SFUHandler.prototype.sendMessageViaDataChannel = function (messagePayload) {
|
|
243
|
+
if (this.dataProducers && this.dataProducers.length > 0) {
|
|
244
|
+
this.dataProducers[0].send(messagePayload);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
242
247
|
SFUHandler.prototype.init = function () {
|
|
243
248
|
return __awaiter(this, void 0, void 0, function () {
|
|
244
249
|
var messageJson;
|
|
@@ -308,16 +313,16 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
308
313
|
this.sendTransport = this.device.createSendTransport(transport);
|
|
309
314
|
this.sendTransport.on('produce', function (producerLocalParameters, callback, errback) {
|
|
310
315
|
var _a;
|
|
311
|
-
_this.transportCallBacks[
|
|
316
|
+
_this.transportCallBacks[producerLocalParameters.appData.trackId] = callback;
|
|
312
317
|
var messageJson = { to: "self", type: SFUMessageType.OnTransportProduceSyncRequest, message: { type: producerLocalParameters.appData.type, transportId: (_a = _this.sendTransport) === null || _a === void 0 ? void 0 : _a.id, kind: producerLocalParameters.kind, rtpParameters: producerLocalParameters.rtpParameters, appData: producerLocalParameters.appData } };
|
|
313
318
|
_this.sendSFUMessageToSocket(messageJson);
|
|
314
319
|
});
|
|
315
|
-
|
|
320
|
+
this.sendTransport.on("producedata", function (producerLocalParameters, callback, errback) { return __awaiter(_this, void 0, void 0, function () {
|
|
316
321
|
var messageJson;
|
|
317
322
|
var _a;
|
|
318
323
|
return __generator(this, function (_b) {
|
|
319
|
-
this.transportCallBacks[
|
|
320
|
-
messageJson = { to: "self", type: SFUMessageType.
|
|
324
|
+
this.transportCallBacks[producerLocalParameters.appData.trackId] = callback;
|
|
325
|
+
messageJson = { to: "self", type: SFUMessageType.OnTransportDataProduceSyncRequest, message: { type: 'send', transportId: (_a = this.sendTransport) === null || _a === void 0 ? void 0 : _a.id, sctpStreamParameters: producerLocalParameters.sctpStreamParameters, label: producerLocalParameters.label, appData: producerLocalParameters.appData } };
|
|
321
326
|
this.sendSFUMessageToSocket(messageJson);
|
|
322
327
|
return [2 /*return*/];
|
|
323
328
|
});
|
|
@@ -347,7 +352,7 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
347
352
|
};
|
|
348
353
|
SFUHandler.prototype.produceTracks = function () {
|
|
349
354
|
var _this = this;
|
|
350
|
-
var _a;
|
|
355
|
+
var _a, _b;
|
|
351
356
|
log.info("produceTracks");
|
|
352
357
|
if (!this.sendTransport || !this.consumerTransport == null || this.isProduceTrackIntialWorkDone) {
|
|
353
358
|
return;
|
|
@@ -363,15 +368,18 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
363
368
|
else {
|
|
364
369
|
this.sendMessageReadyToConsume();
|
|
365
370
|
}
|
|
371
|
+
if ((_b = this.meetingStartRequest) === null || _b === void 0 ? void 0 : _b.isDataChannelRequired) {
|
|
372
|
+
this.createDataChannel();
|
|
373
|
+
}
|
|
366
374
|
};
|
|
367
375
|
SFUHandler.prototype.onProduceSyncDone = function (data) {
|
|
368
|
-
if (data.message.
|
|
376
|
+
if (data.message.appData && data.message.appData.trackId && data.message.producerId) {
|
|
369
377
|
var transportId = data.message.transportId;
|
|
370
|
-
var callBack = this.transportCallBacks[
|
|
378
|
+
var callBack = this.transportCallBacks[data.message.appData.trackId];
|
|
371
379
|
if (callBack) {
|
|
372
380
|
var id = data.message.producerId;
|
|
373
381
|
callBack({ id: id });
|
|
374
|
-
delete this.transportCallBacks[
|
|
382
|
+
delete this.transportCallBacks[data.message.appData.trackId];
|
|
375
383
|
}
|
|
376
384
|
}
|
|
377
385
|
};
|
|
@@ -426,6 +434,11 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
426
434
|
if (track) {
|
|
427
435
|
(_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.removeTrack(track);
|
|
428
436
|
}
|
|
437
|
+
consumer.close();
|
|
438
|
+
var index = this.consumers.indexOf(consumer);
|
|
439
|
+
if (index > -1) {
|
|
440
|
+
this.consumers.splice(index, 1);
|
|
441
|
+
}
|
|
429
442
|
}
|
|
430
443
|
}
|
|
431
444
|
};
|
|
@@ -441,7 +454,12 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
441
454
|
consumerAppData = __assign({}, this.consumerTransport.appData);
|
|
442
455
|
consumerAppData.producerData = producer.appData;
|
|
443
456
|
consumerAppData.producerData.producerId = producerId;
|
|
444
|
-
|
|
457
|
+
producer.appData = consumerAppData;
|
|
458
|
+
cosumeObj = {
|
|
459
|
+
producerId: producerId, rtpCapabilities: this.routerRtpCapabilities, rtpParameters: data.message.producer.rtpParameters,
|
|
460
|
+
paused: true, appData: consumerAppData, transportId: this.consumerTransport.id, type: "consume",
|
|
461
|
+
sctpStreamParameters: data.message.producer.sctpStreamParameters, label: data.message.producer.label, protocol: data.message.producer.protocol
|
|
462
|
+
};
|
|
445
463
|
message = { to: "self", type: SFUMessageType.ConsumeProductId, message: cosumeObj };
|
|
446
464
|
this.sendSFUMessageToSocket(message);
|
|
447
465
|
}
|
|
@@ -451,27 +469,46 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
451
469
|
};
|
|
452
470
|
SFUHandler.prototype.onServerConsumer = function (data) {
|
|
453
471
|
return __awaiter(this, void 0, void 0, function () {
|
|
454
|
-
var consumerObj;
|
|
472
|
+
var consumerObj, consumerObj;
|
|
455
473
|
var _this = this;
|
|
456
474
|
return __generator(this, function (_a) {
|
|
457
475
|
log.info("onServerConsumer");
|
|
458
476
|
log.info(data);
|
|
459
477
|
if (this.consumerTransport && data && data.message && data.message.consumer) {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
478
|
+
if (data.message.consumer.appData.producerData.trackKind === TrackKind.DataChannel) {
|
|
479
|
+
consumerObj = data.message.consumer;
|
|
480
|
+
this.consumerTransport.consumeData(consumerObj).then(function (consumer) {
|
|
481
|
+
_this.dataConsumer.push(consumer);
|
|
482
|
+
consumer.on("message", function (message, ppid) {
|
|
483
|
+
var _a;
|
|
484
|
+
if (ppid === 51)
|
|
485
|
+
console.log("text message received:", message.toString("utf-8"));
|
|
486
|
+
else if (ppid === 53)
|
|
487
|
+
console.log("binary message received");
|
|
488
|
+
if (message && message.message) {
|
|
489
|
+
(_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onMessage(message.message);
|
|
490
|
+
}
|
|
491
|
+
console.log("OnMessage Data Channel", message);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
consumerObj = data.message.consumer;
|
|
497
|
+
this.consumerTransport.consume(consumerObj).then(function (consumer) {
|
|
498
|
+
var _a, _b;
|
|
499
|
+
_this.consumers.push(consumer);
|
|
500
|
+
var mediaTrack = consumer.track;
|
|
501
|
+
var data = consumer.appData.producerData;
|
|
502
|
+
log.info(data);
|
|
503
|
+
var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.addParticipantIfNotExist(data.participant, true);
|
|
504
|
+
if (participant) {
|
|
505
|
+
var track = new Track(participant, false, data.trackKind, mediaTrack);
|
|
506
|
+
(_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addUpdateRemoteTrack(track, participant, true);
|
|
507
|
+
}
|
|
508
|
+
var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
|
|
509
|
+
_this.sendSFUMessageToSocket(messageJson);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
475
512
|
}
|
|
476
513
|
return [2 /*return*/];
|
|
477
514
|
});
|
|
@@ -501,6 +538,16 @@ var SFUHandler = /** @class */ (function (_super) {
|
|
|
501
538
|
producer.close();
|
|
502
539
|
}
|
|
503
540
|
});
|
|
541
|
+
this.dataProducers.forEach(function (producer) {
|
|
542
|
+
if (producer.closed === false) {
|
|
543
|
+
producer.close();
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
this.dataConsumer.forEach(function (consumer) {
|
|
547
|
+
if (consumer.closed === false) {
|
|
548
|
+
consumer.close();
|
|
549
|
+
}
|
|
550
|
+
});
|
|
504
551
|
this.consumers.forEach(function (consumer) {
|
|
505
552
|
if (consumer.closed === false) {
|
|
506
553
|
consumer.close();
|
|
@@ -98,6 +98,9 @@ var WebrtcHandler = /** @class */ (function (_super) {
|
|
|
98
98
|
});
|
|
99
99
|
});
|
|
100
100
|
};
|
|
101
|
+
WebrtcHandler.prototype.sendMessageViaDataChannel = function (messagePayload) {
|
|
102
|
+
throw new Error('Method not implemented.');
|
|
103
|
+
};
|
|
101
104
|
return WebrtcHandler;
|
|
102
105
|
}(BaseVideoCallHandler));
|
|
103
106
|
export { WebrtcHandler };
|
|
@@ -36,6 +36,7 @@ export declare enum SFUMessageType {
|
|
|
36
36
|
OnSendTransport = "onSendTransport",
|
|
37
37
|
OnConsumeTransport = "onConsumeTransport",
|
|
38
38
|
OnTransportProduceSyncRequest = "transportProduceSync",
|
|
39
|
+
OnTransportDataProduceSyncRequest = "dataTransportProduceSync",
|
|
39
40
|
OnReadyToConsume = "readyToConsume",
|
|
40
41
|
OnProducerClosed = "producerClosed",
|
|
41
42
|
OnPauseProducer = "pauseProducer",
|
|
@@ -92,6 +92,7 @@ export var SFUMessageType;
|
|
|
92
92
|
SFUMessageType["OnSendTransport"] = "onSendTransport";
|
|
93
93
|
SFUMessageType["OnConsumeTransport"] = "onConsumeTransport";
|
|
94
94
|
SFUMessageType["OnTransportProduceSyncRequest"] = "transportProduceSync";
|
|
95
|
+
SFUMessageType["OnTransportDataProduceSyncRequest"] = "dataTransportProduceSync";
|
|
95
96
|
SFUMessageType["OnReadyToConsume"] = "readyToConsume";
|
|
96
97
|
SFUMessageType["OnProducerClosed"] = "producerClosed";
|
|
97
98
|
SFUMessageType["OnPauseProducer"] = "pauseProducer";
|