vani-meeting-client 0.3.4 → 0.3.7

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;
@@ -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 (_b) {
215
- switch (_b.label) {
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
- return [4 /*yield*/, ((_a = this.sendTransport) === null || _a === void 0 ? void 0 : _a.produceData())];
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 = _b.sent();
220
+ webcamProducer = _c.sent();
221
221
  if (webcamProducer) {
222
222
  this.dataProducers.push(webcamProducer);
223
223
  }
224
- _b.label = 2;
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,10 +313,20 @@ 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[_this.sendTransport.id] = callback;
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
  });
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
+ }); });
315
330
  this.sendTransport.on('connectionstatechange', function (newState) {
316
331
  var _a;
317
332
  if (newState === "disconnected" || newState === "failed") {
@@ -337,7 +352,7 @@ var SFUHandler = /** @class */ (function (_super) {
337
352
  };
338
353
  SFUHandler.prototype.produceTracks = function () {
339
354
  var _this = this;
340
- var _a;
355
+ var _a, _b;
341
356
  log.info("produceTracks");
342
357
  if (!this.sendTransport || !this.consumerTransport == null || this.isProduceTrackIntialWorkDone) {
343
358
  return;
@@ -353,15 +368,18 @@ var SFUHandler = /** @class */ (function (_super) {
353
368
  else {
354
369
  this.sendMessageReadyToConsume();
355
370
  }
371
+ if ((_b = this.meetingStartRequest) === null || _b === void 0 ? void 0 : _b.isDataChannelRequired) {
372
+ this.createDataChannel();
373
+ }
356
374
  };
357
375
  SFUHandler.prototype.onProduceSyncDone = function (data) {
358
- if (data.message.transportId && data.message.producerId) {
376
+ if (data.message.appData && data.message.appData.trackId && data.message.producerId) {
359
377
  var transportId = data.message.transportId;
360
- var callBack = this.transportCallBacks[transportId];
378
+ var callBack = this.transportCallBacks[data.message.appData.trackId];
361
379
  if (callBack) {
362
380
  var id = data.message.producerId;
363
381
  callBack({ id: id });
364
- delete this.transportCallBacks[transportId];
382
+ delete this.transportCallBacks[data.message.appData.trackId];
365
383
  }
366
384
  }
367
385
  };
@@ -416,6 +434,11 @@ var SFUHandler = /** @class */ (function (_super) {
416
434
  if (track) {
417
435
  (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.removeTrack(track);
418
436
  }
437
+ consumer.close();
438
+ var index = this.consumers.indexOf(consumer);
439
+ if (index > -1) {
440
+ this.consumers.splice(index, 1);
441
+ }
419
442
  }
420
443
  }
421
444
  };
@@ -431,7 +454,12 @@ var SFUHandler = /** @class */ (function (_super) {
431
454
  consumerAppData = __assign({}, this.consumerTransport.appData);
432
455
  consumerAppData.producerData = producer.appData;
433
456
  consumerAppData.producerData.producerId = producerId;
434
- 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
+ };
435
463
  message = { to: "self", type: SFUMessageType.ConsumeProductId, message: cosumeObj };
436
464
  this.sendSFUMessageToSocket(message);
437
465
  }
@@ -441,27 +469,42 @@ var SFUHandler = /** @class */ (function (_super) {
441
469
  };
442
470
  SFUHandler.prototype.onServerConsumer = function (data) {
443
471
  return __awaiter(this, void 0, void 0, function () {
444
- var consumerObj;
472
+ var consumerObj, consumerObj;
445
473
  var _this = this;
446
474
  return __generator(this, function (_a) {
447
475
  log.info("onServerConsumer");
448
476
  log.info(data);
449
477
  if (this.consumerTransport && data && data.message && data.message.consumer) {
450
- consumerObj = data.message.consumer;
451
- this.consumerTransport.consume(consumerObj).then(function (consumer) {
452
- var _a, _b;
453
- _this.consumers.push(consumer);
454
- var mediaTrack = consumer.track;
455
- var data = consumer.appData.producerData;
456
- log.info(data);
457
- var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.addParticipantIfNotExist(data.participant, true);
458
- if (participant) {
459
- var track = new Track(participant, false, data.trackKind, mediaTrack);
460
- (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addUpdateRemoteTrack(track, participant, true);
461
- }
462
- var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
463
- _this.sendSFUMessageToSocket(messageJson);
464
- });
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 (message && message.message) {
485
+ (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onMessage(message.message);
486
+ }
487
+ console.log("OnMessage Data Channel", message);
488
+ });
489
+ });
490
+ }
491
+ else {
492
+ consumerObj = data.message.consumer;
493
+ this.consumerTransport.consume(consumerObj).then(function (consumer) {
494
+ var _a, _b;
495
+ _this.consumers.push(consumer);
496
+ var mediaTrack = consumer.track;
497
+ var data = consumer.appData.producerData;
498
+ log.info(data);
499
+ var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.addParticipantIfNotExist(data.participant, true);
500
+ if (participant) {
501
+ var track = new Track(participant, false, data.trackKind, mediaTrack);
502
+ (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addUpdateRemoteTrack(track, participant, true);
503
+ }
504
+ var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
505
+ _this.sendSFUMessageToSocket(messageJson);
506
+ });
507
+ }
465
508
  }
466
509
  return [2 /*return*/];
467
510
  });
@@ -491,6 +534,16 @@ var SFUHandler = /** @class */ (function (_super) {
491
534
  producer.close();
492
535
  }
493
536
  });
537
+ this.dataProducers.forEach(function (producer) {
538
+ if (producer.closed === false) {
539
+ producer.close();
540
+ }
541
+ });
542
+ this.dataConsumer.forEach(function (consumer) {
543
+ if (consumer.closed === false) {
544
+ consumer.close();
545
+ }
546
+ });
494
547
  this.consumers.forEach(function (consumer) {
495
548
  if (consumer.closed === false) {
496
549
  consumer.close();
@@ -13,4 +13,5 @@ export declare class WebrtcHandler extends BaseVideoCallHandler {
13
13
  resumeTrack(track: Track): void;
14
14
  sendTrack(track: Track): void;
15
15
  createDataChannel(): Promise<void>;
16
+ sendMessageViaDataChannel(messagePayload: any): void;
16
17
  }
@@ -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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vani-meeting-client",
3
- "version": "0.3.4",
3
+ "version": "0.3.7",
4
4
  "description": "Vani Meeting Clinet SDK",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",