vani-meeting-client 0.3.3 → 0.3.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.
@@ -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
- (_b = this.websocketCallHandler) === null || _b === void 0 ? void 0 : _b.sendSocketMessage(WebSocketBasicEvents.Message, messageObj);
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;
@@ -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;
@@ -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) {
@@ -13,6 +13,8 @@ export declare abstract class BaseVideoCallHandler extends Base {
13
13
  abstract resumeIncomingTrack(track: Track): void;
14
14
  abstract pauseIncomingTrack(track: Track): void;
15
15
  abstract onParticipantUpdated(): void;
16
+ abstract createDataChannel(): any;
17
+ abstract sendMessageViaDataChannel(messagePayload: any): any;
16
18
  updateSpatialForTrack(track: Track, spatialLayerIndex: number): Promise<void>;
17
19
  reconnectedWithoutPing(): void;
18
20
  cleanup(): void;
@@ -10,6 +10,8 @@ export declare class SFUHandler extends BaseVideoCallHandler {
10
10
  private isProduceTrackIntialWorkDone;
11
11
  private producers;
12
12
  private consumers;
13
+ private dataProducers;
14
+ private dataConsumer;
13
15
  onReconnect(): Promise<void>;
14
16
  stopTrack(track: Track): void;
15
17
  pauseTrack(track: Track): void;
@@ -18,7 +20,9 @@ export declare class SFUHandler extends BaseVideoCallHandler {
18
20
  resumeIncomingTrack(track: Track): void;
19
21
  updateSpatialForTrack(track: Track, spatialLayerIndex: number): Promise<void>;
20
22
  sendTrack(track: Track): Promise<void>;
23
+ createDataChannel(): Promise<void>;
21
24
  onParticipantUpdated(): void;
25
+ sendMessageViaDataChannel(messagePayload: any): void;
22
26
  init(): Promise<void>;
23
27
  private onTransportNotFound;
24
28
  private addObserverForDevice;
@@ -75,6 +75,8 @@ var SFUHandler = /** @class */ (function (_super) {
75
75
  _this.isProduceTrackIntialWorkDone = false;
76
76
  _this.producers = [];
77
77
  _this.consumers = [];
78
+ _this.dataProducers = [];
79
+ _this.dataConsumer = [];
78
80
  return _this;
79
81
  }
80
82
  SFUHandler.prototype.onReconnect = function () {
@@ -204,6 +206,27 @@ var SFUHandler = /** @class */ (function (_super) {
204
206
  });
205
207
  });
206
208
  };
209
+ SFUHandler.prototype.createDataChannel = function () {
210
+ var _a, _b;
211
+ return __awaiter(this, void 0, void 0, function () {
212
+ var track, webcamProducer;
213
+ return __generator(this, function (_c) {
214
+ switch (_c.label) {
215
+ case 0:
216
+ if (!(this.dataProducers.length === 0)) return [3 /*break*/, 2];
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
+ case 1:
220
+ webcamProducer = _c.sent();
221
+ if (webcamProducer) {
222
+ this.dataProducers.push(webcamProducer);
223
+ }
224
+ _c.label = 2;
225
+ case 2: return [2 /*return*/];
226
+ }
227
+ });
228
+ });
229
+ };
207
230
  SFUHandler.prototype.onParticipantUpdated = function () {
208
231
  if (!this.communicationHandler || this.communicationHandler.getAllParticipants().length < 2) {
209
232
  this.producers.forEach(function (producer) {
@@ -216,6 +239,11 @@ var SFUHandler = /** @class */ (function (_super) {
216
239
  });
217
240
  }
218
241
  };
242
+ SFUHandler.prototype.sendMessageViaDataChannel = function (messagePayload) {
243
+ if (this.dataProducers && this.dataProducers.length > 0) {
244
+ this.dataProducers[0].send(messagePayload);
245
+ }
246
+ };
219
247
  SFUHandler.prototype.init = function () {
220
248
  return __awaiter(this, void 0, void 0, function () {
221
249
  var messageJson;
@@ -285,10 +313,20 @@ var SFUHandler = /** @class */ (function (_super) {
285
313
  this.sendTransport = this.device.createSendTransport(transport);
286
314
  this.sendTransport.on('produce', function (producerLocalParameters, callback, errback) {
287
315
  var _a;
288
- _this.transportCallBacks[_this.sendTransport.id] = callback;
316
+ _this.transportCallBacks[producerLocalParameters.appData.trackId] = callback;
289
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 } };
290
318
  _this.sendSFUMessageToSocket(messageJson);
291
319
  });
320
+ this.sendTransport.on("producedata", function (producerLocalParameters, callback, errback) { return __awaiter(_this, void 0, void 0, function () {
321
+ var messageJson;
322
+ var _a;
323
+ return __generator(this, function (_b) {
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 } };
326
+ this.sendSFUMessageToSocket(messageJson);
327
+ return [2 /*return*/];
328
+ });
329
+ }); });
292
330
  this.sendTransport.on('connectionstatechange', function (newState) {
293
331
  var _a;
294
332
  if (newState === "disconnected" || newState === "failed") {
@@ -314,7 +352,7 @@ var SFUHandler = /** @class */ (function (_super) {
314
352
  };
315
353
  SFUHandler.prototype.produceTracks = function () {
316
354
  var _this = this;
317
- var _a;
355
+ var _a, _b;
318
356
  log.info("produceTracks");
319
357
  if (!this.sendTransport || !this.consumerTransport == null || this.isProduceTrackIntialWorkDone) {
320
358
  return;
@@ -330,15 +368,18 @@ var SFUHandler = /** @class */ (function (_super) {
330
368
  else {
331
369
  this.sendMessageReadyToConsume();
332
370
  }
371
+ if ((_b = this.meetingStartRequest) === null || _b === void 0 ? void 0 : _b.isDataChannelRequired) {
372
+ this.createDataChannel();
373
+ }
333
374
  };
334
375
  SFUHandler.prototype.onProduceSyncDone = function (data) {
335
- if (data.message.transportId && data.message.producerId) {
376
+ if (data.message.appData && data.message.appData.trackId && data.message.producerId) {
336
377
  var transportId = data.message.transportId;
337
- var callBack = this.transportCallBacks[transportId];
378
+ var callBack = this.transportCallBacks[data.message.appData.trackId];
338
379
  if (callBack) {
339
380
  var id = data.message.producerId;
340
381
  callBack({ id: id });
341
- delete this.transportCallBacks[transportId];
382
+ delete this.transportCallBacks[data.message.appData.trackId];
342
383
  }
343
384
  }
344
385
  };
@@ -393,6 +434,11 @@ var SFUHandler = /** @class */ (function (_super) {
393
434
  if (track) {
394
435
  (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.removeTrack(track);
395
436
  }
437
+ consumer.close();
438
+ var index = this.consumers.indexOf(consumer);
439
+ if (index > -1) {
440
+ this.consumers.splice(index, 1);
441
+ }
396
442
  }
397
443
  }
398
444
  };
@@ -400,13 +446,20 @@ var SFUHandler = /** @class */ (function (_super) {
400
446
  return __awaiter(this, void 0, void 0, function () {
401
447
  var producer, producerId, consumerAppData, cosumeObj, message;
402
448
  return __generator(this, function (_a) {
449
+ console.log("onNewProducer");
450
+ console.log(data);
403
451
  if (this.consumerTransport && data && data.message && data.message.producer) {
404
452
  producer = data.message.producer;
405
453
  producerId = producer.id;
406
454
  consumerAppData = __assign({}, this.consumerTransport.appData);
407
455
  consumerAppData.producerData = producer.appData;
408
456
  consumerAppData.producerData.producerId = producerId;
409
- cosumeObj = { producerId: producerId, rtpCapabilities: this.routerRtpCapabilities, paused: true, appData: consumerAppData, transportId: this.consumerTransport.id, type: "consume" };
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
+ };
410
463
  message = { to: "self", type: SFUMessageType.ConsumeProductId, message: cosumeObj };
411
464
  this.sendSFUMessageToSocket(message);
412
465
  }
@@ -416,27 +469,38 @@ var SFUHandler = /** @class */ (function (_super) {
416
469
  };
417
470
  SFUHandler.prototype.onServerConsumer = function (data) {
418
471
  return __awaiter(this, void 0, void 0, function () {
419
- var consumerObj;
472
+ var consumerObj, consumerObj;
420
473
  var _this = this;
421
474
  return __generator(this, function (_a) {
422
475
  log.info("onServerConsumer");
423
476
  log.info(data);
424
477
  if (this.consumerTransport && data && data.message && data.message.consumer) {
425
- consumerObj = data.message.consumer;
426
- this.consumerTransport.consume(consumerObj).then(function (consumer) {
427
- var _a, _b;
428
- _this.consumers.push(consumer);
429
- var mediaTrack = consumer.track;
430
- var data = consumer.appData.producerData;
431
- log.info(data);
432
- var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.addParticipantIfNotExist(data.participant, true);
433
- if (participant) {
434
- var track = new Track(participant, false, data.trackKind, mediaTrack);
435
- (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addUpdateRemoteTrack(track, participant, true);
436
- }
437
- var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
438
- _this.sendSFUMessageToSocket(messageJson);
439
- });
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
+ console.log("OnMessage Data Channel", message);
484
+ });
485
+ });
486
+ }
487
+ else {
488
+ consumerObj = data.message.consumer;
489
+ this.consumerTransport.consume(consumerObj).then(function (consumer) {
490
+ var _a, _b;
491
+ _this.consumers.push(consumer);
492
+ var mediaTrack = consumer.track;
493
+ var data = consumer.appData.producerData;
494
+ log.info(data);
495
+ var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.addParticipantIfNotExist(data.participant, true);
496
+ if (participant) {
497
+ var track = new Track(participant, false, data.trackKind, mediaTrack);
498
+ (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addUpdateRemoteTrack(track, participant, true);
499
+ }
500
+ var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
501
+ _this.sendSFUMessageToSocket(messageJson);
502
+ });
503
+ }
440
504
  }
441
505
  return [2 /*return*/];
442
506
  });
@@ -466,6 +530,16 @@ var SFUHandler = /** @class */ (function (_super) {
466
530
  producer.close();
467
531
  }
468
532
  });
533
+ this.dataProducers.forEach(function (producer) {
534
+ if (producer.closed === false) {
535
+ producer.close();
536
+ }
537
+ });
538
+ this.dataConsumer.forEach(function (consumer) {
539
+ if (consumer.closed === false) {
540
+ consumer.close();
541
+ }
542
+ });
469
543
  this.consumers.forEach(function (consumer) {
470
544
  if (consumer.closed === false) {
471
545
  consumer.close();
@@ -12,4 +12,6 @@ export declare class WebrtcHandler extends BaseVideoCallHandler {
12
12
  pauseTrack(track: Track): void;
13
13
  resumeTrack(track: Track): void;
14
14
  sendTrack(track: Track): void;
15
+ createDataChannel(): Promise<void>;
16
+ sendMessageViaDataChannel(messagePayload: any): void;
15
17
  }
@@ -91,6 +91,16 @@ var WebrtcHandler = /** @class */ (function (_super) {
91
91
  WebrtcHandler.prototype.sendTrack = function (track) {
92
92
  throw new Error("Method not implemented.");
93
93
  };
94
+ WebrtcHandler.prototype.createDataChannel = function () {
95
+ return __awaiter(this, void 0, void 0, function () {
96
+ return __generator(this, function (_a) {
97
+ return [2 /*return*/];
98
+ });
99
+ });
100
+ };
101
+ WebrtcHandler.prototype.sendMessageViaDataChannel = function (messagePayload) {
102
+ throw new Error('Method not implemented.');
103
+ };
94
104
  return WebrtcHandler;
95
105
  }(BaseVideoCallHandler));
96
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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vani-meeting-client",
3
- "version": "0.3.3",
3
+ "version": "0.3.6",
4
4
  "description": "Vani Meeting Clinet SDK",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",