vani-meeting-client
Version:
Vani Meeting Clinet SDK
818 lines (817 loc) • 45.2 kB
JavaScript
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 };