vani-meeting-client 0.3.5 → 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) {
@@ -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 (_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,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[_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
  });
315
- transport.on("producedata", function (producerLocalParameters, callback, errback) { return __awaiter(_this, void 0, void 0, function () {
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[this.sendTransport.id] = callback;
320
- 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 } };
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.transportId && data.message.producerId) {
376
+ if (data.message.appData && data.message.appData.trackId && data.message.producerId) {
369
377
  var transportId = data.message.transportId;
370
- var callBack = this.transportCallBacks[transportId];
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[transportId];
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
- 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
+ };
445
463
  message = { to: "self", type: SFUMessageType.ConsumeProductId, message: cosumeObj };
446
464
  this.sendSFUMessageToSocket(message);
447
465
  }
@@ -451,27 +469,38 @@ 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
- consumerObj = data.message.consumer;
461
- this.consumerTransport.consume(consumerObj).then(function (consumer) {
462
- var _a, _b;
463
- _this.consumers.push(consumer);
464
- var mediaTrack = consumer.track;
465
- var data = consumer.appData.producerData;
466
- log.info(data);
467
- var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.addParticipantIfNotExist(data.participant, true);
468
- if (participant) {
469
- var track = new Track(participant, false, data.trackKind, mediaTrack);
470
- (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addUpdateRemoteTrack(track, participant, true);
471
- }
472
- var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
473
- _this.sendSFUMessageToSocket(messageJson);
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
+ 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
+ }
475
504
  }
476
505
  return [2 /*return*/];
477
506
  });
@@ -501,6 +530,16 @@ var SFUHandler = /** @class */ (function (_super) {
501
530
  producer.close();
502
531
  }
503
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
+ });
504
543
  this.consumers.forEach(function (consumer) {
505
544
  if (consumer.closed === false) {
506
545
  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.5",
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",