sinch-rtc
Version:
RTC JavaScript/Web SDK
223 lines • 10.3 kB
JavaScript
"use strict";
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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DefaultCall = void 0;
const SessionState_1 = require("../session/SessionState");
const PeerConnectionClient_1 = require("../rtc/PeerConnectionClient");
const CallEventsManagers_1 = require("./listeners/CallEventsManagers");
const TrackEventFanout_1 = require("./listeners/TrackEventFanout");
const Event_1 = require("../utils/Event");
const Errors_1 = require("../utils/Errors");
const models_1 = require("./models");
const utils_1 = require("../utils");
const rtc_1 = require("../rtc");
const ClientEvent_1 = require("./reporting/ClientEvent");
const DefaultCallDetails_1 = require("./DefaultCallDetails");
const TerminationCause_1 = require("../session/TerminationCause");
const CallQualityWarningEventFanout_1 = require("./listeners/CallQualityWarningEventFanout");
const CallQualityDetectorsFactory_1 = require("./quality/detectors/CallQualityDetectorsFactory");
const PublicCallListenerCallbackMapper_1 = require("./PublicCallListenerCallbackMapper");
class DefaultCall {
constructor(requestedVideo, session, mxpChannel, mediaController, useRelayIceCandidatesOnly, clientEventsCollector, callQualityCollector, warningControllerFactory, iceServers) {
this.requestedVideo = requestedVideo;
this.session = session;
this.mxpChannel = mxpChannel;
this.mediaController = mediaController;
this.useRelayIceCandidatesOnly = useRelayIceCandidatesOnly;
this.clientEventsCollector = clientEventsCollector;
this.callQualityCollector = callQualityCollector;
this.iceServers = iceServers;
this.p2p = true;
this.createdAt = new Date();
this.start = () => __awaiter(this, void 0, void 0, function* () {
yield this.peerConnectionClient.start();
this.withSession((s) => s.start());
});
this.onTrackEvent = (track) => {
this.trackEvent.onEvent(track);
};
this.onInboundMessage = (m) => {
this.withSession((s) => {
s.onInboundMessage(m);
});
};
this.onLocalJsepMessage = (message) => {
if (message.isCandidate) {
if (this.p2p)
this.withSession((s) => s.setLocalCandidate([message]));
}
else {
this.onLocalDescription(message);
}
};
this.publicCallListenerCallbackMapper =
new PublicCallListenerCallbackMapper_1.PublicCallListenerCallbackMapper();
this.trackEvent = new TrackEventFanout_1.TrackEventFanout(this);
this.callEventFanout = new CallEventsManagers_1.default(this);
this.callQualityWarningEventFanout = new CallQualityWarningEventFanout_1.CallQualityWarningEventFanout(this);
this.callQualityWarningController = warningControllerFactory.create(new CallQualityDetectorsFactory_1.CallQualityDetectorsFactory(this.callQualityWarningEventFanout), this);
this.callDetail = new DefaultCallDetails_1.DefaultCallDetails(this, session);
this.peerConnectionClient = PeerConnectionClient_1.PeerConnectionClient.create(mediaController, new Event_1.Event(this.onTrackEvent), this.useRelayIceCandidatesOnly, this.inactivate.bind(this), this.clientEventsCollector, this, this.iceServers);
this.peerConnectionClient.onLocalJsepMessage.add((m) => this.onLocalJsepMessage(m));
session.onOutboundMessage = this.mxpChannel.sendOutboundMessage;
session.onStateChanged = this.callEventFanout.onEvent;
session.onJsepMessageReceived = (evt) => this.peerConnectionClient.onJsepMessageReceived(evt.messages);
mxpChannel.onInboundMessage.add(this.onInboundMessage);
this.addInternalListener(this.peerConnectionClient);
this.addInternalListener(this.clientEventsCollector);
this.addInternalListener(this.callQualityWarningController);
this.addInternalListener(this.callQualityCollector);
this.addInternalListener(this.publicCallListenerCallbackMapper);
this.setIceServers = (0, rtc_1.createIceServerSetter)(this.peerConnectionClient);
}
answer() {
return __awaiter(this, void 0, void 0, function* () {
throw new Errors_1.InvalidOperationError("Answer can only be called on incoming call.");
});
}
sendDtmf(keys) {
if (!new RegExp("^[0-9#*abcdABCD]+$").test(keys))
throw new Errors_1.ArgumentError("Invalid DTMF keys", (0, utils_1.nameof)(keys));
this.peerConnectionClient.insertDtmf(keys).catch((err) => {
console.error(err);
});
}
get localPeer() {
return this.session.localPeer;
}
mute() {
this.muted = true;
this.enableSenderTracks(false, "audio");
}
unmute() {
this.muted = false;
this.enableSenderTracks(true, "audio");
}
pauseVideo() {
this.videoPaused = true;
this.enableSenderTracks(false, "video");
}
resumeVideo() {
this.videoPaused = false;
this.enableSenderTracks(true, "video");
}
updateMediaController(media) {
this.mediaController = media;
this.peerConnectionClient.updateMediaController(media);
}
enableSenderTracks(enabled, kind) {
this.peerConnectionClient.enableSenderTracks(enabled, kind);
}
onIceConnectionStateChanged(state) {
this.callEventFanout.setCurrentIceConnectionState(state);
this.callQualityWarningController.onIceConnectionStateChanged(state);
}
inactivate() {
this.clientEventsCollector.addEvent(ClientEvent_1.ClientEvent.createClientEventType(ClientEvent_1.ClientEventName.SDK_CALL_MARKED_INACTIVE));
this.withSession((session) => session.terminateWithCause(TerminationCause_1.TerminationCause.Inactive));
}
onLocalDescription(message) {
this.withSession((s) => s.setLocalSessionDescription(message));
}
withSession(action) {
action(this.session);
}
setPushNotificationRequestSent() {
this.callEventFanout.setPushNotificationRequestSent();
}
get incomingStream() {
return this.peerConnectionClient.remoteStream;
}
get outgoingStream() {
return this.mediaController.mediaStream;
}
addListener(listener) {
this.publicCallListenerCallbackMapper.addListener(listener);
}
removeListener(listener) {
this.publicCallListenerCallbackMapper.removeListener(listener);
}
performCallEndedCleanup() {
var _a;
this.peerConnectionClient.cleanup();
(_a = this.mediaController) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((t) => t.stop());
}
mapState(state) {
switch (state) {
case SessionState_1.SessionState.Created:
case SessionState_1.SessionState.Initiating:
return this.details.progressTime
? models_1.CallState.Progressing
: models_1.CallState.Init;
case SessionState_1.SessionState.Progress:
return models_1.CallState.Ringing; // See `CallEventFanout` for explanation for this mapping.
case SessionState_1.SessionState.Established:
return this.details.establishedTime
? models_1.CallState.Established
: models_1.CallState.Answered;
case SessionState_1.SessionState.Terminated:
return models_1.CallState.Ended;
}
}
get state() {
return this.mapState(this.session.state);
}
get id() {
return this.session.id;
}
get direction() {
return this.session.direction;
}
setHeaders(headers) {
this.publicHeaders = headers;
}
get headers() {
var _a;
return (_a = this.publicHeaders) !== null && _a !== void 0 ? _a : {};
}
setLegacyRelayCandidates(candidates) {
this.peerConnectionClient.setLegacyRelayCandidates(candidates);
}
setMxpSignalingConfiguration(sessionKey, signalingChannel) {
this.mxpChannel.configure(sessionKey, signalingChannel);
}
hangup(error) {
this.clientEventsCollector.addEvent(ClientEvent_1.ClientEvent.createClientEventType(ClientEvent_1.ClientEventName.SDK_API_CALL_TERMINATE));
this.withSession((session) => session.terminate(error));
}
emitClientEvent(event) {
this.withSession((session) => session.sendClientEvent(event));
}
terminateDueToIceFailure() {
this.clientEventsCollector.addEvent(ClientEvent_1.ClientEvent.createClientEventType(ClientEvent_1.ClientEventName.SDK_ICE_FAILED_TERMINATE));
this.withSession((session) => session.terminateWithCause(TerminationCause_1.TerminationCause.IceFailedToConnect));
}
addInternalListener(listener) {
this.callEventFanout.addListener(listener);
this.trackEvent.addListener(listener);
this.callQualityWarningEventFanout.addListener(listener);
}
removeInternalListener(listener) {
this.callEventFanout.removeListener(listener);
this.trackEvent.removeListener(listener);
this.callQualityWarningEventFanout.removeListener(listener);
}
get details() {
return this.callDetail;
}
getPeerConnectionStats() {
return __awaiter(this, void 0, void 0, function* () {
return yield this.peerConnectionClient.getPeerConnectionStats();
});
}
}
exports.DefaultCall = DefaultCall;
//# sourceMappingURL=DefaultCall.js.map