vani-meeting-client-native 0.0.2

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.
Files changed (42) hide show
  1. package/README.md +153 -0
  2. package/lib/MeetingHandler.d.ts +55 -0
  3. package/lib/MeetingHandler.js +496 -0
  4. package/lib/base/Base.d.ts +9 -0
  5. package/lib/base/Base.js +17 -0
  6. package/lib/index.d.ts +7 -0
  7. package/lib/index.js +7 -0
  8. package/lib/inter-communication-handler/CommunicationHandler.d.ts +65 -0
  9. package/lib/inter-communication-handler/CommunicationHandler.js +521 -0
  10. package/lib/model/Event.d.ts +84 -0
  11. package/lib/model/Event.js +35 -0
  12. package/lib/model/MeetingStartRequest.d.ts +54 -0
  13. package/lib/model/MeetingStartRequest.js +60 -0
  14. package/lib/model/MessagePayload.d.ts +32 -0
  15. package/lib/model/MessagePayload.js +31 -0
  16. package/lib/model/Participant.d.ts +16 -0
  17. package/lib/model/Participant.js +22 -0
  18. package/lib/model/TaskResponse.d.ts +5 -0
  19. package/lib/model/TaskResponse.js +1 -0
  20. package/lib/model/Track.d.ts +19 -0
  21. package/lib/model/Track.js +27 -0
  22. package/lib/user-media-handler/UserMediaHandler.d.ts +38 -0
  23. package/lib/user-media-handler/UserMediaHandler.js +786 -0
  24. package/lib/utility/DynamicLibHelper.d.ts +8 -0
  25. package/lib/utility/DynamicLibHelper.js +109 -0
  26. package/lib/utility/DynamicLibHelper.native.d.ts +8 -0
  27. package/lib/utility/DynamicLibHelper.native.js +109 -0
  28. package/lib/utility/DynamicLibHelper.node.d.ts +8 -0
  29. package/lib/utility/DynamicLibHelper.node.js +108 -0
  30. package/lib/utility/Utility.d.ts +3 -0
  31. package/lib/utility/Utility.js +12 -0
  32. package/lib/utility/VaniEventListener.d.ts +4 -0
  33. package/lib/utility/VaniEventListener.js +24 -0
  34. package/lib/video-call-handler/BaseVideoCallHandler.d.ts +25 -0
  35. package/lib/video-call-handler/BaseVideoCallHandler.js +98 -0
  36. package/lib/video-call-handler/SFUHandler.d.ts +57 -0
  37. package/lib/video-call-handler/SFUHandler.js +811 -0
  38. package/lib/video-call-handler/WebrtcHandler.d.ts +17 -0
  39. package/lib/video-call-handler/WebrtcHandler.js +107 -0
  40. package/lib/websocket-handler/WebsocketHandler.d.ts +102 -0
  41. package/lib/websocket-handler/WebsocketHandler.js +541 -0
  42. package/package.json +53 -0
@@ -0,0 +1,811 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ if (typeof b !== "function" && b !== null)
10
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
11
+ extendStatics(d, b);
12
+ function __() { this.constructor = d; }
13
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
+ };
15
+ })();
16
+ var __assign = (this && this.__assign) || function () {
17
+ __assign = Object.assign || function(t) {
18
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
19
+ s = arguments[i];
20
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
21
+ t[p] = s[p];
22
+ }
23
+ return t;
24
+ };
25
+ return __assign.apply(this, arguments);
26
+ };
27
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
+ return new (P || (P = Promise))(function (resolve, reject) {
30
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
34
+ });
35
+ };
36
+ var __generator = (this && this.__generator) || function (thisArg, body) {
37
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
38
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39
+ function verb(n) { return function (v) { return step([n, v]); }; }
40
+ function step(op) {
41
+ if (f) throw new TypeError("Generator is already executing.");
42
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
43
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
44
+ if (y = 0, t) op = [op[0] & 2, t.value];
45
+ switch (op[0]) {
46
+ case 0: case 1: t = op; break;
47
+ case 4: _.label++; return { value: op[1], done: false };
48
+ case 5: _.label++; y = op[1]; op = [0]; continue;
49
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
50
+ default:
51
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55
+ if (t[2]) _.ops.pop();
56
+ _.trys.pop(); continue;
57
+ }
58
+ op = body.call(thisArg, _);
59
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61
+ }
62
+ };
63
+ import log from 'loglevel';
64
+ import { BaseVideoCallHandler } from "./BaseVideoCallHandler";
65
+ import { detectDevice, Device } from 'mediasoup-client';
66
+ import { SFUMessageType } from "../websocket-handler/WebsocketHandler";
67
+ import { Track, TrackKind } from "../model/Track";
68
+ import { LogLevel, VaniEvent } from '..';
69
+ var SFUHandler = /** @class */ (function (_super) {
70
+ __extends(SFUHandler, _super);
71
+ function SFUHandler(_meetingStartRequest, _communicationHandler) {
72
+ var _this = _super.call(this, _meetingStartRequest, _communicationHandler) || this;
73
+ _this.device = undefined;
74
+ _this.transportCallBacks = {};
75
+ _this.isProduceTrackIntialWorkDone = false;
76
+ _this.producers = [];
77
+ _this.consumers = [];
78
+ _this.dataProducers = [];
79
+ _this.dataConsumer = [];
80
+ _this.onConsumerNotFound = function (data) {
81
+ var consumerId = data.message.consumerId;
82
+ var consumer = _this.consumers.find(function (consumer) { return consumer.id === consumerId; });
83
+ if (consumer) {
84
+ _this.consumers = _this.consumers.filter(function (consumer) { return consumer.id !== consumerId; });
85
+ consumer.close();
86
+ }
87
+ };
88
+ _this.onProducerNotFound = function (data) {
89
+ var _a;
90
+ var producerId = data.message.producerId;
91
+ var producer = _this.producers.find(function (producer) { return producer.id === producerId; });
92
+ if (producer) {
93
+ _this.producers = _this.producers.filter(function (eachProducer) { return eachProducer.id !== producerId; });
94
+ if (producer.appData.trackId) {
95
+ var track = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getTrackById(producer.appData.trackId);
96
+ track && _this.sendTrack(track);
97
+ }
98
+ }
99
+ };
100
+ var handlerName = detectDevice();
101
+ if (handlerName) {
102
+ _this.device = new Device();
103
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("detected handler: %s", handlerName);
104
+ }
105
+ else {
106
+ if (_this.meetingStartRequest && _this.meetingStartRequest.mediasoupDeviceHandlerName) {
107
+ _this.device = new Device({ handlerName: _this.meetingStartRequest.mediasoupDeviceHandlerName });
108
+ }
109
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.warn("no suitable handler found for current browser/device");
110
+ }
111
+ return _this;
112
+ }
113
+ SFUHandler.prototype.reconnectedWithoutPing = function () {
114
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("reconnectedWithoutPing");
115
+ this.onReconnect();
116
+ };
117
+ SFUHandler.prototype.onReconnect = function () {
118
+ return __awaiter(this, void 0, void 0, function () {
119
+ var data, data;
120
+ return __generator(this, function (_a) {
121
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("SFU onReconnect");
122
+ if (this.sendTransport &&
123
+ (this.sendTransport.connectionState === "disconnected" || this.sendTransport.connectionState === "failed" || this.sendTransport.connectionState === "new")) {
124
+ data = { to: "self", message: { transportId: this.sendTransport.id }, "type": SFUMessageType.OnRestartIceCandidate };
125
+ this.sendSFUMessageToSocket(data);
126
+ }
127
+ if (this.consumerTransport &&
128
+ (this.consumerTransport.connectionState === "disconnected" || this.consumerTransport.connectionState === "failed" || this.consumerTransport.connectionState === "new")) {
129
+ data = { to: "self", message: { transportId: this.consumerTransport.id }, "type": SFUMessageType.OnRestartIceCandidate };
130
+ this.sendSFUMessageToSocket(data);
131
+ }
132
+ return [2 /*return*/];
133
+ });
134
+ });
135
+ };
136
+ SFUHandler.prototype.onRestartIceCandidateResponse = function (data) {
137
+ var _a;
138
+ return __awaiter(this, void 0, void 0, function () {
139
+ var transportId, iceParameters;
140
+ return __generator(this, function (_b) {
141
+ switch (_b.label) {
142
+ case 0:
143
+ transportId = data.message.transportId;
144
+ iceParameters = data.message.iceParameters;
145
+ (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.downloadParticipantsData();
146
+ if (!(this.consumerTransport && this.consumerTransport.id === transportId)) return [3 /*break*/, 2];
147
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("Restat Ice consumer");
148
+ return [4 /*yield*/, this.consumerTransport.restartIce({ iceParameters: iceParameters })];
149
+ case 1:
150
+ _b.sent();
151
+ return [3 /*break*/, 4];
152
+ case 2:
153
+ if (!(this.sendTransport && this.sendTransport.id === transportId)) return [3 /*break*/, 4];
154
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("Restat Ice sender");
155
+ return [4 /*yield*/, this.sendTransport.restartIce({ iceParameters: iceParameters })];
156
+ case 3:
157
+ _b.sent();
158
+ _b.label = 4;
159
+ case 4: return [2 /*return*/];
160
+ }
161
+ });
162
+ });
163
+ };
164
+ SFUHandler.prototype.stopTrack = function (track) {
165
+ var producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; });
166
+ if (producer) {
167
+ // try {
168
+ // producer.track?.stop()
169
+ // }
170
+ // catch (err) {
171
+ // }
172
+ producer.close();
173
+ var messageJson = { to: "self", type: SFUMessageType.OnProducerClosed, message: { producerId: producer.id } };
174
+ this.sendSFUMessageToSocket(messageJson);
175
+ var index = this.producers.indexOf(producer);
176
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("stopTrack ", index);
177
+ if (index > -1) {
178
+ this.producers.splice(index, 1);
179
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("stopTrack producers", this.producers);
180
+ }
181
+ }
182
+ };
183
+ SFUHandler.prototype.pauseTrack = function (track) {
184
+ var _a;
185
+ var producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; });
186
+ if (producer) {
187
+ if ((_a = this.meetingStartRequest) === null || _a === void 0 ? void 0 : _a.isMobileApp) {
188
+ this.stopTrack(track);
189
+ }
190
+ else {
191
+ producer.pause();
192
+ var messageJson = { to: "self", type: SFUMessageType.OnPauseProducer, message: { producerId: producer.id } };
193
+ this.sendSFUMessageToSocket(messageJson);
194
+ }
195
+ }
196
+ };
197
+ SFUHandler.prototype.getConsumerForTrack = function (track) {
198
+ var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; });
199
+ return consumer;
200
+ };
201
+ SFUHandler.prototype.resumeProducerOrConsumerForTrack = function (track) {
202
+ return __awaiter(this, void 0, void 0, function () {
203
+ var producer, consumer;
204
+ return __generator(this, function (_a) {
205
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("resumeProducerOrConsumerForTrack");
206
+ if (track.track) {
207
+ track.track.enabled = true;
208
+ }
209
+ producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; });
210
+ if (producer) {
211
+ producer.resume();
212
+ }
213
+ else {
214
+ consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; });
215
+ if (consumer) {
216
+ consumer.resume();
217
+ }
218
+ }
219
+ return [2 /*return*/];
220
+ });
221
+ });
222
+ };
223
+ SFUHandler.prototype.pauseProducerOrConsumerForTrack = function (track) {
224
+ return __awaiter(this, void 0, void 0, function () {
225
+ var producer, consumer;
226
+ return __generator(this, function (_a) {
227
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("pauseProducerOrConsumerForTrack");
228
+ producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; });
229
+ if (producer) {
230
+ producer.pause();
231
+ }
232
+ else {
233
+ consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; });
234
+ if (consumer) {
235
+ consumer.pause();
236
+ }
237
+ }
238
+ if (track.track) {
239
+ track.track.enabled = false;
240
+ }
241
+ return [2 /*return*/];
242
+ });
243
+ });
244
+ };
245
+ SFUHandler.prototype.resumeTrack = function (track) {
246
+ var producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; });
247
+ if (producer) {
248
+ producer.resume();
249
+ var messageJson = { to: "self", type: SFUMessageType.OnResumeProducer, message: { producerId: producer.id } };
250
+ this.sendSFUMessageToSocket(messageJson);
251
+ }
252
+ };
253
+ SFUHandler.prototype.pauseIncomingTrack = function (track) {
254
+ var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; });
255
+ if (consumer) {
256
+ var messageJson = { to: "self", type: SFUMessageType.PauseConsumer, message: { id: consumer.id } };
257
+ this.sendSFUMessageToSocket(messageJson);
258
+ consumer.pause();
259
+ }
260
+ };
261
+ SFUHandler.prototype.resumeIncomingTrack = function (track) {
262
+ var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; });
263
+ if (consumer) {
264
+ var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
265
+ this.sendSFUMessageToSocket(messageJson);
266
+ consumer.resume();
267
+ }
268
+ };
269
+ SFUHandler.prototype.updateSpatialForTrack = function (track, spatialLayerIndex) {
270
+ return __awaiter(this, void 0, void 0, function () {
271
+ var consumer, messageJson;
272
+ return __generator(this, function (_a) {
273
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("updateSpatialForTrack");
274
+ consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; });
275
+ if (consumer) {
276
+ messageJson = { to: "self", type: SFUMessageType.UpdateSpatialConsumer, message: { id: consumer.id, spatialLayer: spatialLayerIndex } };
277
+ this.sendSFUMessageToSocket(messageJson);
278
+ }
279
+ return [2 /*return*/];
280
+ });
281
+ });
282
+ };
283
+ SFUHandler.prototype.sendTrack = function (track) {
284
+ var _a, _b, _c, _d, _e;
285
+ return __awaiter(this, void 0, void 0, function () {
286
+ var producer, appData, producerData, webcamProducer;
287
+ var _this = this;
288
+ return __generator(this, function (_f) {
289
+ switch (_f.label) {
290
+ case 0:
291
+ if (!(track && track.track)) return [3 /*break*/, 4];
292
+ producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; });
293
+ if (producer && producer.closed === false && ((_a = this.meetingStartRequest) === null || _a === void 0 ? void 0 : _a.isMobileApp)) {
294
+ this.stopTrack(track);
295
+ }
296
+ if (!(producer && producer.closed === false && ((_b = this.meetingStartRequest) === null || _b === void 0 ? void 0 : _b.isMobileApp) === false)) return [3 /*break*/, 2];
297
+ // try {
298
+ // producer.track?.stop()
299
+ // }
300
+ // catch (err) {
301
+ // }
302
+ return [4 /*yield*/, producer.replaceTrack({ track: track.track })];
303
+ case 1:
304
+ // try {
305
+ // producer.track?.stop()
306
+ // }
307
+ // catch (err) {
308
+ // }
309
+ _f.sent();
310
+ this.resumeTrack(track);
311
+ return [3 /*break*/, 4];
312
+ case 2:
313
+ appData = __assign({}, (_c = this.sendTransport) === null || _c === void 0 ? void 0 : _c.appData);
314
+ appData.trackKind = track.trackKind;
315
+ appData.trackId = track.trackId;
316
+ producerData = { track: track.track, appData: appData, disableTrackOnPause: false, zeroRtpOnPause: true, stopTracks: false };
317
+ if (track.trackKind === TrackKind.Video && this.meetingStartRequest.simulcastEncodings.length > 0) {
318
+ producerData.encodings = this.meetingStartRequest.simulcastEncodings;
319
+ }
320
+ if (track.track.kind === "audio") {
321
+ producerData.codecOptions = { opusStereo: true, opusFec: true };
322
+ if (this.meetingStartRequest.maxAudioBitrateConfig > 0) {
323
+ producerData.codecOptions.opusMaxAverageBitrate = (_d = this.meetingStartRequest) === null || _d === void 0 ? void 0 : _d.maxAudioBitrateConfig;
324
+ }
325
+ }
326
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(producerData);
327
+ return [4 /*yield*/, ((_e = this.sendTransport) === null || _e === void 0 ? void 0 : _e.produce(producerData))];
328
+ case 3:
329
+ webcamProducer = _f.sent();
330
+ if (webcamProducer) {
331
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("On webcamProducer");
332
+ this.producers.push(webcamProducer);
333
+ if (webcamProducer) {
334
+ webcamProducer.observer.on("trackended", function () {
335
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("On Track Endded producer event");
336
+ });
337
+ }
338
+ this.onParticipantUpdated();
339
+ // this.sendMessageReadyToConsume();
340
+ }
341
+ else {
342
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("On webcamProducer not created");
343
+ }
344
+ _f.label = 4;
345
+ case 4: return [2 /*return*/];
346
+ }
347
+ });
348
+ });
349
+ };
350
+ SFUHandler.prototype.createDataChannel = function () {
351
+ var _a, _b;
352
+ return __awaiter(this, void 0, void 0, function () {
353
+ var track, webcamProducer;
354
+ return __generator(this, function (_c) {
355
+ switch (_c.label) {
356
+ case 0:
357
+ if (!(this.dataProducers.length === 0)) return [3 /*break*/, 2];
358
+ track = new Track((_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getSelfParticipant(), true, TrackKind.DataChannel, undefined);
359
+ return [4 /*yield*/, ((_b = this.sendTransport) === null || _b === void 0 ? void 0 : _b.produceData({ appData: track }))];
360
+ case 1:
361
+ webcamProducer = _c.sent();
362
+ if (webcamProducer) {
363
+ this.dataProducers.push(webcamProducer);
364
+ }
365
+ _c.label = 2;
366
+ case 2: return [2 /*return*/];
367
+ }
368
+ });
369
+ });
370
+ };
371
+ SFUHandler.prototype.onParticipantUpdated = function () {
372
+ var _a;
373
+ if (this.producers) {
374
+ if (((_a = this.meetingStartRequest) === null || _a === void 0 ? void 0 : _a.shouldPauseUploadingStreamOnSingleParticipant) && (!this.communicationHandler || this.communicationHandler.getAllParticipants().length < 2)) {
375
+ this.producers.forEach(function (producer) {
376
+ producer.pause();
377
+ });
378
+ }
379
+ else {
380
+ this.producers.forEach(function (producer) {
381
+ producer.resume();
382
+ });
383
+ }
384
+ }
385
+ };
386
+ SFUHandler.prototype.sendMessageViaDataChannel = function (messagePayload) {
387
+ if (this.dataProducers && this.dataProducers.length > 0) {
388
+ this.dataProducers[0].send(JSON.stringify(messagePayload));
389
+ }
390
+ };
391
+ SFUHandler.prototype.init = function () {
392
+ return __awaiter(this, void 0, void 0, function () {
393
+ var messageJson;
394
+ return __generator(this, function (_a) {
395
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("SFU Init");
396
+ messageJson = { to: "self", type: SFUMessageType.GetRouterRtpCapabilities, message: SFUMessageType.GetRouterRtpCapabilities };
397
+ this.sendSFUMessageToSocket(messageJson);
398
+ this.addObserverForDevice();
399
+ return [2 /*return*/];
400
+ });
401
+ });
402
+ };
403
+ SFUHandler.prototype.onTransportNotFound = function (data) {
404
+ var _a;
405
+ return __awaiter(this, void 0, void 0, function () {
406
+ var _i, _b, producer, _c, _d, consumer, messageJson;
407
+ return __generator(this, function (_e) {
408
+ for (_i = 0, _b = this.producers; _i < _b.length; _i++) {
409
+ producer = _b[_i];
410
+ if (producer) {
411
+ producer.close();
412
+ }
413
+ }
414
+ for (_c = 0, _d = this.consumers; _c < _d.length; _c++) {
415
+ consumer = _d[_c];
416
+ if (consumer) {
417
+ try {
418
+ (_a = consumer.track) === null || _a === void 0 ? void 0 : _a.stop();
419
+ }
420
+ catch (err) {
421
+ }
422
+ consumer.close();
423
+ }
424
+ }
425
+ this.producers = [];
426
+ this.consumers = [];
427
+ if (this.consumerTransport) {
428
+ this.consumerTransport.close();
429
+ this.consumerTransport = undefined;
430
+ }
431
+ if (this.sendTransport) {
432
+ this.sendTransport.close();
433
+ this.sendTransport = undefined;
434
+ }
435
+ this.isProduceTrackIntialWorkDone = false;
436
+ messageJson = { to: "self", type: SFUMessageType.OnCreateTransportsForcefully, message: SFUMessageType.OnCreateTransportsForcefully };
437
+ this.sendSFUMessageToSocket(messageJson);
438
+ return [2 /*return*/];
439
+ });
440
+ });
441
+ };
442
+ SFUHandler.prototype.restartTransport = function () {
443
+ this.onTransportNotFound(undefined);
444
+ };
445
+ SFUHandler.prototype.addObserverForDevice = function () {
446
+ return __awaiter(this, void 0, void 0, function () {
447
+ var _this = this;
448
+ return __generator(this, function (_a) {
449
+ this.device.observer.on("newtransport", function (transport) {
450
+ transport.on("connect", function (transportLocalParameters, _callback, errback) { return __awaiter(_this, void 0, void 0, function () {
451
+ var messageJson;
452
+ return __generator(this, function (_a) {
453
+ this.transportCallBacks[transport.id] = _callback;
454
+ messageJson = { to: "self", type: SFUMessageType.OnTransportConnect, message: { type: transport.appData.type, transportId: transport.id, dtlsParameters: transportLocalParameters.dtlsParameters } };
455
+ this.sendSFUMessageToSocket(messageJson);
456
+ return [2 /*return*/];
457
+ });
458
+ }); });
459
+ });
460
+ return [2 /*return*/];
461
+ });
462
+ });
463
+ };
464
+ SFUHandler.prototype.onAllProducers = function (data) {
465
+ return __awaiter(this, void 0, void 0, function () {
466
+ var allProducers;
467
+ var _this = this;
468
+ return __generator(this, function (_a) {
469
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("onAllProducers");
470
+ if (this.consumerTransport) {
471
+ allProducers = data.message.producers;
472
+ allProducers.forEach(function (eachProducer) {
473
+ var producerId = eachProducer.id;
474
+ var consumedProducer = _this.consumers.find(function (eachConsumer) { return eachConsumer.producerId === producerId; });
475
+ if (!consumedProducer || consumedProducer.closed) {
476
+ if (consumedProducer) {
477
+ consumedProducer.close();
478
+ _this.consumers = _this.consumers.filter(function (eachConsumer) { return eachConsumer.producerId !== producerId; });
479
+ }
480
+ _this.onNewProducer({ data: { message: { producer: eachProducer } } });
481
+ }
482
+ });
483
+ }
484
+ return [2 /*return*/];
485
+ });
486
+ });
487
+ };
488
+ SFUHandler.prototype.onRouterRtpCapabilities = function (data) {
489
+ if (data && data.message && data.message.rtpCapabilities) {
490
+ this.routerRtpCapabilities = data.message.rtpCapabilities;
491
+ var routerRtpCapabilities = this.routerRtpCapabilities;
492
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(routerRtpCapabilities);
493
+ this.device.load({ routerRtpCapabilities: routerRtpCapabilities });
494
+ this.isProduceTrackIntialWorkDone = false;
495
+ //Create transport
496
+ var messageJson = { to: "self", type: SFUMessageType.OnCreateTransports, message: SFUMessageType.OnCreateTransports };
497
+ this.sendSFUMessageToSocket(messageJson);
498
+ }
499
+ };
500
+ SFUHandler.prototype.onTransportConnectDone = function (data) {
501
+ if (data && data.message && data.message.transportId) {
502
+ var transportId = data.message.transportId;
503
+ var callBack = this.transportCallBacks[transportId];
504
+ if (callBack) {
505
+ callBack();
506
+ delete this.transportCallBacks[transportId];
507
+ }
508
+ }
509
+ };
510
+ SFUHandler.prototype.onSendTransport = function (data) {
511
+ var _this = this;
512
+ if (data && data.message && data.message.transport) {
513
+ var transport = data.message.transport;
514
+ this.sendTransport = this.device.createSendTransport(transport);
515
+ this.sendTransport.on('produce', function (producerLocalParameters, callback, errback) {
516
+ var _a;
517
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log(" onSendTransport produce");
518
+ _this.transportCallBacks[producerLocalParameters.appData.trackId] = callback;
519
+ 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 } };
520
+ _this.sendSFUMessageToSocket(messageJson);
521
+ });
522
+ this.sendTransport.on("producedata", function (producerLocalParameters, callback, errback) { return __awaiter(_this, void 0, void 0, function () {
523
+ var messageJson;
524
+ var _a;
525
+ return __generator(this, function (_b) {
526
+ this.transportCallBacks[producerLocalParameters.appData.trackId] = callback;
527
+ 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 } };
528
+ this.sendSFUMessageToSocket(messageJson);
529
+ return [2 /*return*/];
530
+ });
531
+ }); });
532
+ this.sendTransport.on('connectionstatechange', function (newState) {
533
+ var _a;
534
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("connectionstatechange sendTransport ", newState);
535
+ if (newState === "disconnected" || newState === "failed") {
536
+ (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onIceCandidateDisconnected();
537
+ }
538
+ });
539
+ }
540
+ this.produceTracks();
541
+ };
542
+ SFUHandler.prototype.onConsumeTransportCreated = function (data) {
543
+ var _this = this;
544
+ if (data && data.message && data.message.transport) {
545
+ var transport = data.message.transport;
546
+ this.consumerTransport = this.device.createRecvTransport(transport);
547
+ this.consumerTransport.on("connectionstatechange", function (newState) {
548
+ var _a;
549
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("connectionstatechange consumerTransport ", newState);
550
+ if (newState === "disconnected" || newState === "failed") {
551
+ (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onIceCandidateDisconnected();
552
+ }
553
+ });
554
+ }
555
+ this.produceTracks();
556
+ };
557
+ SFUHandler.prototype.produceTracks = function () {
558
+ var _this = this;
559
+ var _a;
560
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("produceTracks");
561
+ if (!this.sendTransport || !this.consumerTransport || this.isProduceTrackIntialWorkDone) {
562
+ return;
563
+ }
564
+ this.isProduceTrackIntialWorkDone = true;
565
+ var selfTracks = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getAllSelfTracks();
566
+ if (selfTracks && selfTracks.length > 0) {
567
+ selfTracks.forEach(function (track) {
568
+ _this.sendTrack(track);
569
+ });
570
+ this.sendMessageReadyToConsume();
571
+ }
572
+ else {
573
+ this.sendMessageReadyToConsume();
574
+ }
575
+ // if (this.meetingStartRequest?.isDataChannelRequired) {
576
+ // this.createDataChannel()
577
+ // }
578
+ };
579
+ SFUHandler.prototype.onProduceSyncDone = function (data) {
580
+ if (data.message.appData && data.message.appData.trackId && data.message.producerId) {
581
+ var transportId = data.message.transportId;
582
+ var callBack = this.transportCallBacks[data.message.appData.trackId];
583
+ if (callBack) {
584
+ var id = data.message.producerId;
585
+ callBack({ id: id });
586
+ delete this.transportCallBacks[data.message.appData.trackId];
587
+ }
588
+ }
589
+ };
590
+ SFUHandler.prototype.sendMessageReadyToConsume = function () {
591
+ var messageJson = { to: "self", type: SFUMessageType.OnReadyToConsume, message: SFUMessageType.OnReadyToConsume };
592
+ this.sendSFUMessageToSocket(messageJson);
593
+ };
594
+ SFUHandler.prototype.sendSFUMessageToSocket = function (messageJson) {
595
+ var _a;
596
+ (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.sendWebSocketMessage(SFUMessageType.SFUMessage, messageJson);
597
+ };
598
+ SFUHandler.prototype.onSocketMessage = function (websocketCallHandler) {
599
+ if (websocketCallHandler.type === SFUMessageType.OnRouterRtpCapabilities) {
600
+ this.onRouterRtpCapabilities(websocketCallHandler.data);
601
+ }
602
+ else if (websocketCallHandler.type === SFUMessageType.OnTransportConnectDone) {
603
+ this.onTransportConnectDone(websocketCallHandler.data);
604
+ }
605
+ else if (websocketCallHandler.type === SFUMessageType.OnSendTransport) {
606
+ this.onSendTransport(websocketCallHandler.data);
607
+ }
608
+ else if (websocketCallHandler.type === SFUMessageType.OnConsumeTransport) {
609
+ this.onConsumeTransportCreated(websocketCallHandler.data);
610
+ }
611
+ else if (websocketCallHandler.type === SFUMessageType.OnNewProducer) {
612
+ this.onNewProducer(websocketCallHandler.data);
613
+ }
614
+ else if (websocketCallHandler.type === SFUMessageType.OnServerConsumer) {
615
+ this.onServerConsumer(websocketCallHandler.data);
616
+ }
617
+ else if (websocketCallHandler.type === SFUMessageType.OnProduceSyncDone) {
618
+ this.onProduceSyncDone(websocketCallHandler.data);
619
+ }
620
+ else if (websocketCallHandler.type === SFUMessageType.OnSpeakerChanged) {
621
+ this.onSpeakerChanged(websocketCallHandler.data);
622
+ }
623
+ else if (websocketCallHandler.type === SFUMessageType.OnAudioVolumeChanged) {
624
+ this.onAudioVolumeChanged(websocketCallHandler.data);
625
+ }
626
+ else if (websocketCallHandler.type === SFUMessageType.OnTrackEnded) {
627
+ this.onTrackEnded(websocketCallHandler.data);
628
+ }
629
+ else if (websocketCallHandler.type === SFUMessageType.OnTransportNotFound) {
630
+ this.onTransportNotFound(websocketCallHandler.data);
631
+ }
632
+ else if (websocketCallHandler.type === SFUMessageType.OnRestartIceCandidateResponse) {
633
+ this.onRestartIceCandidateResponse(websocketCallHandler.data);
634
+ }
635
+ else if (websocketCallHandler.type === SFUMessageType.OnAllProducers) {
636
+ this.onAllProducers(websocketCallHandler.data);
637
+ }
638
+ else if (websocketCallHandler.type === SFUMessageType.OnProducerNotFound) {
639
+ this.onProducerNotFound(websocketCallHandler.data);
640
+ }
641
+ else if (websocketCallHandler.type === SFUMessageType.OnConsumerNotFound) {
642
+ this.onConsumerNotFound(websocketCallHandler.data);
643
+ }
644
+ };
645
+ SFUHandler.prototype.onTrackEnded = function (data) {
646
+ var _a, _b, _c;
647
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("onTrackEnded");
648
+ if (data && data.message && data.message.producerId) {
649
+ var producerId_1 = data.message.producerId;
650
+ var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.producerId === producerId_1; });
651
+ if (consumer && consumer.appData && consumer.appData.producerData && consumer.appData.producerData.trackId) {
652
+ var track = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getTrackById(consumer.appData.producerData.trackId);
653
+ if (track) {
654
+ (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.removeTrack(track);
655
+ }
656
+ try {
657
+ (_c = consumer.track) === null || _c === void 0 ? void 0 : _c.stop();
658
+ }
659
+ catch (err) {
660
+ }
661
+ consumer.close();
662
+ var index = this.consumers.indexOf(consumer);
663
+ if (index > -1) {
664
+ this.consumers.splice(index, 1);
665
+ }
666
+ }
667
+ }
668
+ };
669
+ SFUHandler.prototype.onNewProducer = function (data) {
670
+ return __awaiter(this, void 0, void 0, function () {
671
+ var producer, producerId, consumerAppData, cosumeObj, message;
672
+ return __generator(this, function (_a) {
673
+ // this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("onNewProducer")
674
+ // this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log(data)
675
+ if (this.consumerTransport && data && data.message && data.message.producer) {
676
+ producer = data.message.producer;
677
+ producerId = producer.id;
678
+ consumerAppData = __assign({}, this.consumerTransport.appData);
679
+ consumerAppData.producerData = producer.appData;
680
+ consumerAppData.producerData.producerId = producerId;
681
+ producer.appData = consumerAppData;
682
+ cosumeObj = {
683
+ producerId: producerId, rtpCapabilities: this.routerRtpCapabilities, rtpParameters: data.message.producer.rtpParameters,
684
+ paused: true, appData: consumerAppData, transportId: this.consumerTransport.id, type: "consume",
685
+ sctpStreamParameters: data.message.producer.sctpStreamParameters, label: data.message.producer.label, protocol: data.message.producer.protocol
686
+ };
687
+ message = { to: "self", type: SFUMessageType.ConsumeProductId, message: cosumeObj };
688
+ this.sendSFUMessageToSocket(message);
689
+ }
690
+ return [2 /*return*/];
691
+ });
692
+ });
693
+ };
694
+ SFUHandler.prototype.onServerConsumer = function (data) {
695
+ return __awaiter(this, void 0, void 0, function () {
696
+ var consumerObj, consumerObj;
697
+ var _this = this;
698
+ return __generator(this, function (_a) {
699
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("onServerConsumer");
700
+ this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(data);
701
+ if (this.consumerTransport && data && data.message && data.message.consumer) {
702
+ if (data.message.consumer.appData.producerData.trackKind === TrackKind.DataChannel) {
703
+ consumerObj = data.message.consumer;
704
+ this.consumerTransport.consumeData(consumerObj).then(function (consumer) {
705
+ _this.dataConsumer.push(consumer);
706
+ consumer.on("message", function (message) {
707
+ var _a;
708
+ message = JSON.parse(message);
709
+ if (message && message.message) {
710
+ (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onMessage(message.message);
711
+ }
712
+ // this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("OnMessage Data Channel", message)
713
+ });
714
+ });
715
+ }
716
+ else {
717
+ consumerObj = data.message.consumer;
718
+ this.consumerTransport.consume(consumerObj).then(function (consumer) {
719
+ var _a, _b, _c;
720
+ consumer.observer.on("trackended", function () {
721
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("Consumer track Endded observer");
722
+ });
723
+ _this.consumers.push(consumer);
724
+ var mediaTrack = consumer.track;
725
+ var data = consumer.appData.producerData;
726
+ _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(data);
727
+ var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.participantByUserId(data.participant.userId);
728
+ if (!participant) {
729
+ participant = (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addParticipantIfNotExist(data.participant, true);
730
+ }
731
+ if (participant) {
732
+ var track = new Track(participant, false, data.trackKind, mediaTrack);
733
+ (_c = _this.communicationHandler) === null || _c === void 0 ? void 0 : _c.addUpdateRemoteTrack(track, participant, true);
734
+ }
735
+ var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } };
736
+ _this.sendSFUMessageToSocket(messageJson);
737
+ });
738
+ }
739
+ }
740
+ return [2 /*return*/];
741
+ });
742
+ });
743
+ };
744
+ SFUHandler.prototype.onAudioVolumeChanged = function (data) {
745
+ var _a, _b;
746
+ if (data && data.message && data.message.userId) {
747
+ var speakerId = data.message.userId;
748
+ var participant = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.participantByUserId(speakerId);
749
+ if (participant) {
750
+ (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.emitMessageToSource(VaniEvent.OnAudioVolumeChanged, { participant: participant, volume: data.message.volume });
751
+ }
752
+ }
753
+ };
754
+ SFUHandler.prototype.onSpeakerChanged = function (data) {
755
+ var _a, _b;
756
+ if (data && data.message && data.message.speakerUserId) {
757
+ var speakerId = data.message.speakerUserId;
758
+ var participant = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.participantByUserId(speakerId);
759
+ if (participant) {
760
+ (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.emitMessageToSource(VaniEvent.OnSpeakerChanged, participant);
761
+ }
762
+ }
763
+ };
764
+ SFUHandler.prototype.cleanup = function () {
765
+ if (this.sendTransport) {
766
+ this.sendTransport.close();
767
+ this.sendTransport = undefined;
768
+ }
769
+ if (this.consumerTransport) {
770
+ this.consumerTransport.close();
771
+ this.consumerTransport = undefined;
772
+ }
773
+ if (this.producers) {
774
+ this.producers.forEach(function (producer) {
775
+ var _a;
776
+ try {
777
+ (_a = producer.track) === null || _a === void 0 ? void 0 : _a.stop();
778
+ }
779
+ catch (err) {
780
+ }
781
+ if (producer.closed === false) {
782
+ producer.close();
783
+ }
784
+ });
785
+ }
786
+ this.dataProducers.forEach(function (producer) {
787
+ if (producer.closed === false) {
788
+ producer.close();
789
+ }
790
+ });
791
+ this.dataConsumer.forEach(function (consumer) {
792
+ if (consumer.closed === false) {
793
+ consumer.close();
794
+ }
795
+ });
796
+ this.consumers.forEach(function (consumer) {
797
+ var _a;
798
+ try {
799
+ (_a = consumer.track) === null || _a === void 0 ? void 0 : _a.stop();
800
+ }
801
+ catch (err) {
802
+ }
803
+ if (consumer.closed === false) {
804
+ consumer.close();
805
+ }
806
+ });
807
+ _super.prototype.cleanup.call(this);
808
+ };
809
+ return SFUHandler;
810
+ }(BaseVideoCallHandler));
811
+ export { SFUHandler };