UNPKG

sinch-rtc

Version:

RTC JavaScript/Web SDK

223 lines 10.3 kB
"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