UNPKG

vani-meeting-client

Version:
818 lines (817 loc) 45.2 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { 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; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; import log from 'loglevel'; import { BaseVideoCallHandler } from "./BaseVideoCallHandler"; import { detectDevice, Device } from 'mediasoup-client'; import { SFUMessageType } from "../websocket-handler/WebsocketHandler"; import { Track, TrackKind } from "../model/Track"; import { LogLevel, VaniEvent } from '..'; var SFUHandler = /** @class */ (function (_super) { __extends(SFUHandler, _super); function SFUHandler(_meetingStartRequest, _communicationHandler) { var _this = _super.call(this, _meetingStartRequest, _communicationHandler) || this; _this.device = undefined; _this.transportCallBacks = {}; _this.isProduceTrackIntialWorkDone = false; _this.producers = []; _this.consumers = []; _this.dataProducers = []; _this.dataConsumer = []; _this.onConsumerNotFound = function (data) { var consumerId = data.message.consumerId; var consumer = _this.consumers.find(function (consumer) { return consumer.id === consumerId; }); if (consumer) { _this.consumers = _this.consumers.filter(function (consumer) { return consumer.id !== consumerId; }); consumer.close(); } }; _this.onProducerNotFound = function (data) { var _a; var producerId = data.message.producerId; var producer = _this.producers.find(function (producer) { return producer.id === producerId; }); if (producer) { _this.producers = _this.producers.filter(function (eachProducer) { return eachProducer.id !== producerId; }); if (producer.appData.trackId) { var track = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getTrackById(producer.appData.trackId); track && _this.sendTrack(track); } } }; var handlerName = detectDevice(); if (handlerName) { _this.device = new Device(); _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("detected handler: %s", handlerName); } else { if (_this.meetingStartRequest && _this.meetingStartRequest.mediasoupDeviceHandlerName) { _this.device = new Device({ handlerName: _this.meetingStartRequest.mediasoupDeviceHandlerName }); } _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.warn("no suitable handler found for current browser/device"); } return _this; } SFUHandler.prototype.reconnectedWithoutPing = function () { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("reconnectedWithoutPing"); this.onReconnect(); }; SFUHandler.prototype.onReconnect = function () { return __awaiter(this, void 0, void 0, function () { var data, data; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("SFU onReconnect"); if (this.sendTransport && (this.sendTransport.connectionState === "disconnected" || this.sendTransport.connectionState === "failed" || this.sendTransport.connectionState === "new")) { data = { to: "self", message: { transportId: this.sendTransport.id }, "type": SFUMessageType.OnRestartIceCandidate }; this.sendSFUMessageToSocket(data); } if (this.consumerTransport && (this.consumerTransport.connectionState === "disconnected" || this.consumerTransport.connectionState === "failed" || this.consumerTransport.connectionState === "new")) { data = { to: "self", message: { transportId: this.consumerTransport.id }, "type": SFUMessageType.OnRestartIceCandidate }; this.sendSFUMessageToSocket(data); } return [2 /*return*/]; }); }); }; SFUHandler.prototype.onRestartIceCandidateResponse = function (data) { var _a; return __awaiter(this, void 0, void 0, function () { var transportId, iceParameters; return __generator(this, function (_b) { switch (_b.label) { case 0: transportId = data.message.transportId; iceParameters = data.message.iceParameters; (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.downloadParticipantsData(); if (!(this.consumerTransport && this.consumerTransport.id === transportId)) return [3 /*break*/, 2]; this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("Restat Ice consumer"); return [4 /*yield*/, this.consumerTransport.restartIce({ iceParameters: iceParameters })]; case 1: _b.sent(); return [3 /*break*/, 4]; case 2: if (!(this.sendTransport && this.sendTransport.id === transportId)) return [3 /*break*/, 4]; this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("Restat Ice sender"); return [4 /*yield*/, this.sendTransport.restartIce({ iceParameters: iceParameters })]; case 3: _b.sent(); _b.label = 4; case 4: return [2 /*return*/]; } }); }); }; SFUHandler.prototype.stopTrack = function (track) { var producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; }); if (producer) { // try { // producer.track?.stop() // } // catch (err) { // } producer.close(); var messageJson = { to: "self", type: SFUMessageType.OnProducerClosed, message: { producerId: producer.id } }; this.sendSFUMessageToSocket(messageJson); var index = this.producers.indexOf(producer); this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("stopTrack ", index); if (index > -1) { this.producers.splice(index, 1); this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("stopTrack producers", this.producers); } } }; SFUHandler.prototype.pauseTrack = function (track) { var _a; var producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; }); if (producer) { if ((_a = this.meetingStartRequest) === null || _a === void 0 ? void 0 : _a.isMobileApp) { this.stopTrack(track); } else { producer.pause(); var messageJson = { to: "self", type: SFUMessageType.OnPauseProducer, message: { producerId: producer.id } }; this.sendSFUMessageToSocket(messageJson); } } }; SFUHandler.prototype.getConsumerForTrack = function (track) { var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; }); return consumer; }; SFUHandler.prototype.resumeProducerOrConsumerForTrack = function (track) { return __awaiter(this, void 0, void 0, function () { var producer, consumer; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("resumeProducerOrConsumerForTrack"); if (track.track) { track.track.enabled = true; } producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; }); if (producer) { producer.resume(); } else { consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; }); if (consumer) { consumer.resume(); } } return [2 /*return*/]; }); }); }; SFUHandler.prototype.pauseProducerOrConsumerForTrack = function (track) { return __awaiter(this, void 0, void 0, function () { var producer, consumer; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("pauseProducerOrConsumerForTrack"); producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; }); if (producer) { producer.pause(); } else { consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; }); if (consumer) { consumer.pause(); } } if (track.track) { track.track.enabled = false; } return [2 /*return*/]; }); }); }; SFUHandler.prototype.resumeTrack = function (track) { var producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; }); if (producer) { producer.resume(); var messageJson = { to: "self", type: SFUMessageType.OnResumeProducer, message: { producerId: producer.id } }; this.sendSFUMessageToSocket(messageJson); } }; SFUHandler.prototype.pauseIncomingTrack = function (track) { var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; }); if (consumer) { var messageJson = { to: "self", type: SFUMessageType.PauseConsumer, message: { id: consumer.id } }; this.sendSFUMessageToSocket(messageJson); consumer.pause(); } }; SFUHandler.prototype.resumeIncomingTrack = function (track) { var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; }); if (consumer) { var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } }; this.sendSFUMessageToSocket(messageJson); consumer.resume(); } }; SFUHandler.prototype.updateSpatialForTrack = function (track, spatialLayerIndex) { return __awaiter(this, void 0, void 0, function () { var consumer, messageJson; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("updateSpatialForTrack"); consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.trackId === track.trackId; }); if (consumer) { messageJson = { to: "self", type: SFUMessageType.UpdateSpatialConsumer, message: { id: consumer.id, spatialLayer: spatialLayerIndex } }; this.sendSFUMessageToSocket(messageJson); } return [2 /*return*/]; }); }); }; SFUHandler.prototype.sendTrack = function (track) { var _a, _b, _c, _d, _e; return __awaiter(this, void 0, void 0, function () { var producer, appData, producerData, webcamProducer; var _this = this; return __generator(this, function (_f) { switch (_f.label) { case 0: if (!(track && track.track)) return [3 /*break*/, 4]; producer = this.producers.find(function (producer) { return producer.appData.trackId === track.trackId; }); if (producer && producer.closed === false && ((_a = this.meetingStartRequest) === null || _a === void 0 ? void 0 : _a.isMobileApp)) { this.stopTrack(track); } if (!(producer && producer.closed === false && ((_b = this.meetingStartRequest) === null || _b === void 0 ? void 0 : _b.isMobileApp) === false)) return [3 /*break*/, 2]; // try { // producer.track?.stop() // } // catch (err) { // } return [4 /*yield*/, producer.replaceTrack({ track: track.track })]; case 1: // try { // producer.track?.stop() // } // catch (err) { // } _f.sent(); this.resumeTrack(track); return [3 /*break*/, 4]; case 2: appData = __assign({}, (_c = this.sendTransport) === null || _c === void 0 ? void 0 : _c.appData); appData.trackKind = track.trackKind; appData.trackId = track.trackId; producerData = { track: track.track, appData: appData, disableTrackOnPause: false, zeroRtpOnPause: true, stopTracks: false }; if (track.trackKind === TrackKind.Video && this.meetingStartRequest.simulcastEncodings.length > 0) { producerData.encodings = this.meetingStartRequest.simulcastEncodings; } if (track.track.kind === "audio") { producerData.codecOptions = { opusStereo: true, opusFec: true }; if (this.meetingStartRequest.maxAudioBitrateConfig > 0) { producerData.codecOptions.opusMaxAverageBitrate = (_d = this.meetingStartRequest) === null || _d === void 0 ? void 0 : _d.maxAudioBitrateConfig; } } this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(producerData); return [4 /*yield*/, ((_e = this.sendTransport) === null || _e === void 0 ? void 0 : _e.produce(producerData))]; case 3: webcamProducer = _f.sent(); if (webcamProducer) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("On webcamProducer"); this.producers.push(webcamProducer); if (webcamProducer) { webcamProducer.observer.on("trackended", function () { _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("On Track Endded producer event"); }); } this.onParticipantUpdated(); // this.sendMessageReadyToConsume(); } else { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("On webcamProducer not created"); } _f.label = 4; case 4: return [2 /*return*/]; } }); }); }; SFUHandler.prototype.createDataChannel = function () { var _a, _b; return __awaiter(this, void 0, void 0, function () { var track, webcamProducer; return __generator(this, function (_c) { switch (_c.label) { case 0: if (!(this.dataProducers.length === 0)) return [3 /*break*/, 2]; track = new Track((_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getSelfParticipant(), true, TrackKind.DataChannel, undefined); return [4 /*yield*/, ((_b = this.sendTransport) === null || _b === void 0 ? void 0 : _b.produceData({ appData: track }))]; case 1: webcamProducer = _c.sent(); if (webcamProducer) { this.dataProducers.push(webcamProducer); } _c.label = 2; case 2: return [2 /*return*/]; } }); }); }; SFUHandler.prototype.onParticipantUpdated = function () { var _a; if (this.producers) { if (((_a = this.meetingStartRequest) === null || _a === void 0 ? void 0 : _a.shouldPauseUploadingStreamOnSingleParticipant) && (!this.communicationHandler || this.communicationHandler.getAllParticipants().length < 2)) { this.producers.forEach(function (producer) { producer.pause(); }); } else { this.producers.forEach(function (producer) { producer.resume(); }); } } }; SFUHandler.prototype.sendMessageViaDataChannel = function (messagePayload) { if (this.dataProducers && this.dataProducers.length > 0) { this.dataProducers[0].send(JSON.stringify(messagePayload)); } }; SFUHandler.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var messageJson; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("SFU Init"); messageJson = { to: "self", type: SFUMessageType.GetRouterRtpCapabilities, message: SFUMessageType.GetRouterRtpCapabilities }; this.sendSFUMessageToSocket(messageJson); this.addObserverForDevice(); return [2 /*return*/]; }); }); }; SFUHandler.prototype.onTransportNotFound = function (data) { var _a; return __awaiter(this, void 0, void 0, function () { var _i, _b, producer, _c, _d, consumer, messageJson; return __generator(this, function (_e) { for (_i = 0, _b = this.producers; _i < _b.length; _i++) { producer = _b[_i]; if (producer) { producer.close(); } } for (_c = 0, _d = this.consumers; _c < _d.length; _c++) { consumer = _d[_c]; if (consumer) { try { (_a = consumer.track) === null || _a === void 0 ? void 0 : _a.stop(); } catch (err) { } consumer.close(); } } this.producers = []; this.consumers = []; if (this.consumerTransport) { this.consumerTransport.close(); this.consumerTransport = undefined; } if (this.sendTransport) { this.sendTransport.close(); this.sendTransport = undefined; } this.isProduceTrackIntialWorkDone = false; messageJson = { to: "self", type: SFUMessageType.OnCreateTransportsForcefully, message: SFUMessageType.OnCreateTransportsForcefully }; this.sendSFUMessageToSocket(messageJson); return [2 /*return*/]; }); }); }; SFUHandler.prototype.restartTransport = function () { this.onTransportNotFound(undefined); }; SFUHandler.prototype.addObserverForDevice = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { this.device.observer.on("newtransport", function (transport) { transport.on("connect", function (transportLocalParameters, _callback, errback) { return __awaiter(_this, void 0, void 0, function () { var messageJson; return __generator(this, function (_a) { this.transportCallBacks[transport.id] = _callback; messageJson = { to: "self", type: SFUMessageType.OnTransportConnect, message: { type: transport.appData.type, transportId: transport.id, dtlsParameters: transportLocalParameters.dtlsParameters } }; this.sendSFUMessageToSocket(messageJson); return [2 /*return*/]; }); }); }); }); return [2 /*return*/]; }); }); }; SFUHandler.prototype.onAllProducers = function (data) { return __awaiter(this, void 0, void 0, function () { var allProducers; var _this = this; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("onAllProducers"); if (this.consumerTransport) { allProducers = data.message.producers; allProducers.forEach(function (eachProducer) { var producerId = eachProducer.id; var consumedProducer = _this.consumers.find(function (eachConsumer) { return eachConsumer.producerId === producerId; }); if (!consumedProducer || consumedProducer.closed) { if (consumedProducer) { consumedProducer.close(); _this.consumers = _this.consumers.filter(function (eachConsumer) { return eachConsumer.producerId !== producerId; }); } _this.onNewProducer({ data: { message: { producer: eachProducer } } }); } }); } return [2 /*return*/]; }); }); }; SFUHandler.prototype.onRouterRtpCapabilities = function (data) { if (data && data.message && data.message.rtpCapabilities) { this.routerRtpCapabilities = data.message.rtpCapabilities; var routerRtpCapabilities = this.routerRtpCapabilities; this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(routerRtpCapabilities); this.device.load({ routerRtpCapabilities: routerRtpCapabilities }); this.isProduceTrackIntialWorkDone = false; //Create transport var messageJson = { to: "self", type: SFUMessageType.OnCreateTransports, message: SFUMessageType.OnCreateTransports }; this.sendSFUMessageToSocket(messageJson); } }; SFUHandler.prototype.onTransportConnectDone = function (data) { if (data && data.message && data.message.transportId) { var transportId = data.message.transportId; var callBack = this.transportCallBacks[transportId]; if (callBack) { callBack(); delete this.transportCallBacks[transportId]; } } }; SFUHandler.prototype.onSendTransport = function (data) { var _this = this; if (data && data.message && data.message.transport) { var transport = data.message.transport; this.sendTransport = this.device.createSendTransport(transport); this.sendTransport.on('produce', function (producerLocalParameters, callback, errback) { var _a; _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log(" onSendTransport produce"); _this.transportCallBacks[producerLocalParameters.appData.trackId] = callback; 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 } }; _this.sendSFUMessageToSocket(messageJson); }); this.sendTransport.on("producedata", function (producerLocalParameters, callback, errback) { return __awaiter(_this, void 0, void 0, function () { var messageJson; var _a; return __generator(this, function (_b) { this.transportCallBacks[producerLocalParameters.appData.trackId] = callback; 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 } }; this.sendSFUMessageToSocket(messageJson); return [2 /*return*/]; }); }); }); this.sendTransport.on('connectionstatechange', function (newState) { var _a; _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("connectionstatechange sendTransport ", newState); if (newState === "disconnected" || newState === "failed") { (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onIceCandidateDisconnected(); } }); } this.produceTracks(); }; SFUHandler.prototype.onConsumeTransportCreated = function (data) { var _this = this; if (data && data.message && data.message.transport) { var transport = data.message.transport; this.consumerTransport = this.device.createRecvTransport(transport); this.consumerTransport.on("connectionstatechange", function (newState) { var _a; _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("connectionstatechange consumerTransport ", newState); if (newState === "disconnected" || newState === "failed") { (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onIceCandidateDisconnected(); } }); } this.produceTracks(); }; SFUHandler.prototype.produceTracks = function () { var _this = this; var _a; this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("produceTracks"); if (!this.sendTransport || !this.consumerTransport || this.isProduceTrackIntialWorkDone) { return; } this.isProduceTrackIntialWorkDone = true; var selfTracks = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getAllSelfTracks(); if (selfTracks && selfTracks.length > 0) { selfTracks.forEach(function (track) { _this.sendTrack(track); }); this.sendMessageReadyToConsume(); } else { this.sendMessageReadyToConsume(); } // if (this.meetingStartRequest?.isDataChannelRequired) { // this.createDataChannel() // } }; SFUHandler.prototype.onProduceSyncDone = function (data) { if (data.message.appData && data.message.appData.trackId && data.message.producerId) { var transportId = data.message.transportId; var callBack = this.transportCallBacks[data.message.appData.trackId]; if (callBack) { var id = data.message.producerId; callBack({ id: id }); delete this.transportCallBacks[data.message.appData.trackId]; } } }; SFUHandler.prototype.sendMessageReadyToConsume = function () { var messageJson = { to: "self", type: SFUMessageType.OnReadyToConsume, message: SFUMessageType.OnReadyToConsume }; this.sendSFUMessageToSocket(messageJson); }; SFUHandler.prototype.sendSFUMessageToSocket = function (messageJson) { var _a; (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.sendWebSocketMessage(SFUMessageType.SFUMessage, messageJson); }; SFUHandler.prototype.onSocketMessage = function (websocketCallHandler) { if (websocketCallHandler.type === SFUMessageType.OnRouterRtpCapabilities) { this.onRouterRtpCapabilities(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnTransportConnectDone) { this.onTransportConnectDone(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnSendTransport) { this.onSendTransport(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnConsumeTransport) { this.onConsumeTransportCreated(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnNewProducer) { this.onNewProducer(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnServerConsumer) { this.onServerConsumer(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnProduceSyncDone) { this.onProduceSyncDone(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnSpeakerChanged) { this.onSpeakerChanged(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnAudioVolumeChanged) { this.onAudioVolumeChanged(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnTrackEnded) { this.onTrackEnded(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnTransportNotFound) { this.onTransportNotFound(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnRestartIceCandidateResponse) { this.onRestartIceCandidateResponse(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnAllProducers) { this.onAllProducers(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnProducerNotFound) { this.onProducerNotFound(websocketCallHandler.data); } else if (websocketCallHandler.type === SFUMessageType.OnConsumerNotFound) { this.onConsumerNotFound(websocketCallHandler.data); } }; SFUHandler.prototype.onTrackEnded = function (data) { var _a, _b, _c; this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("onTrackEnded"); if (data && data.message && data.message.producerId) { var producerId_1 = data.message.producerId; var consumer = this.consumers.find(function (consumer) { return consumer.appData.producerData.producerId === producerId_1; }); if (consumer && consumer.appData && consumer.appData.producerData && consumer.appData.producerData.trackId) { var track = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.getTrackById(consumer.appData.producerData.trackId); if (track) { (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.removeTrack(track); } try { (_c = consumer.track) === null || _c === void 0 ? void 0 : _c.stop(); } catch (err) { } consumer.close(); var index = this.consumers.indexOf(consumer); if (index > -1) { this.consumers.splice(index, 1); } } } }; SFUHandler.prototype.onNewProducer = function (data) { return __awaiter(this, void 0, void 0, function () { var producer, producerId, consumerAppData, cosumeObj, message; return __generator(this, function (_a) { // this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("onNewProducer") // this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log(data) if (this.consumerTransport && data && data.message && data.message.producer) { producer = data.message.producer; producerId = producer.id; consumerAppData = __assign({}, this.consumerTransport.appData); consumerAppData.producerData = producer.appData; consumerAppData.producerData.producerId = producerId; producer.appData = consumerAppData; cosumeObj = { producerId: producerId, rtpCapabilities: this.routerRtpCapabilities, rtpParameters: data.message.producer.rtpParameters, paused: true, appData: consumerAppData, transportId: this.consumerTransport.id, type: "consume", sctpStreamParameters: data.message.producer.sctpStreamParameters, label: data.message.producer.label, protocol: data.message.producer.protocol }; message = { to: "self", type: SFUMessageType.ConsumeProductId, message: cosumeObj }; this.sendSFUMessageToSocket(message); } return [2 /*return*/]; }); }); }; SFUHandler.prototype.onServerConsumer = function (data) { return __awaiter(this, void 0, void 0, function () { var consumerObj, consumerObj; var _this = this; return __generator(this, function (_a) { this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info("onServerConsumer"); this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(data); if (this.consumerTransport && data && data.message && data.message.consumer) { if (data.message.consumer.appData.producerData.trackKind === TrackKind.DataChannel) { consumerObj = data.message.consumer; this.consumerTransport.consumeData(consumerObj).then(function (consumer) { _this.dataConsumer.push(consumer); consumer.on("message", function (message) { var _a; message = JSON.parse(message); if (message && message.message) { (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.onMessage(message.message); } // this.meetingStartRequest && this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("OnMessage Data Channel", message) }); }); } else { consumerObj = data.message.consumer; this.consumerTransport.consume(consumerObj).then(function (consumer) { var _a, _b, _c; consumer.observer.on("trackended", function () { _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("Consumer track Endded observer"); }); _this.consumers.push(consumer); var mediaTrack = consumer.track; var data = consumer.appData.producerData; _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && log.info(data); var participant = (_a = _this.communicationHandler) === null || _a === void 0 ? void 0 : _a.participantByUserId(data.participant.userId); if (!participant) { _this.meetingStartRequest && _this.meetingStartRequest.logLevel === LogLevel.Debug && console.log("addParticipantIfNotExist from onServerConsumer", data.participant); participant = (_b = _this.communicationHandler) === null || _b === void 0 ? void 0 : _b.addParticipantIfNotExist(data.participant, true); } if (participant) { var track = new Track(participant, false, data.trackKind, mediaTrack); (_c = _this.communicationHandler) === null || _c === void 0 ? void 0 : _c.addUpdateRemoteTrack(track, participant, true); } var messageJson = { to: "self", type: SFUMessageType.ResumeConsumer, message: { id: consumer.id } }; _this.sendSFUMessageToSocket(messageJson); }); } } return [2 /*return*/]; }); }); }; SFUHandler.prototype.onAudioVolumeChanged = function (data) { var _a, _b; if (data && data.message && data.message.userId) { var speakerId = data.message.userId; var participant = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.participantByUserId(speakerId); if (participant) { (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.emitMessageToSource(VaniEvent.OnAudioVolumeChanged, { participant: participant, volume: data.message.volume }); } } }; SFUHandler.prototype.onSpeakerChanged = function (data) { var _a, _b; if (data && data.message && data.message.speakerUserId) { var speakerId = data.message.speakerUserId; var participant = (_a = this.communicationHandler) === null || _a === void 0 ? void 0 : _a.participantByUserId(speakerId); if (participant) { (_b = this.communicationHandler) === null || _b === void 0 ? void 0 : _b.emitMessageToSource(VaniEvent.OnSpeakerChanged, participant); } } }; SFUHandler.prototype.cleanup = function (shouldStopTracks) { if (shouldStopTracks === void 0) { shouldStopTracks = true; } if (this.sendTransport) { this.sendTransport.close(); this.sendTransport = undefined; } if (this.consumerTransport) { this.consumerTransport.close(); this.consumerTransport = undefined; } if (this.producers) { this.producers.forEach(function (producer) { var _a; try { if (shouldStopTracks) { (_a = producer.track) === null || _a === void 0 ? void 0 : _a.stop(); } } catch (err) { } if (producer.closed === false) { producer.close(); } }); } this.dataProducers.forEach(function (producer) { if (producer.closed === false) { if (shouldStopTracks) { producer.close(); } } }); this.dataConsumer.forEach(function (consumer) { if (consumer.closed === false) { consumer.close(); } }); this.consumers.forEach(function (consumer) { var _a; try { (_a = consumer.track) === null || _a === void 0 ? void 0 : _a.stop(); } catch (err) { } if (consumer.closed === false) { consumer.close(); } }); _super.prototype.cleanup.call(this); }; return SFUHandler; }(BaseVideoCallHandler)); export { SFUHandler };