sinch-rtc
Version:
RTC JavaScript/Web SDK
98 lines • 3.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EstablishedState = void 0;
const Option_1 = require("fp-ts/Option");
const function_1 = require("fp-ts/function");
const mxp_1 = require("../mxp");
const models_1 = require("../mxp/models");
const SessionState_1 = require("./SessionState");
const TerminationCause_1 = require("./TerminationCause");
const SessionStateBase_1 = require("./SessionStateBase");
const TransitionSource_1 = require("./fsm/TransitionSource");
const CallTerminationConfig = new Map([
[
TerminationCause_1.TerminationCause.None,
{
terminationCause: TerminationCause_1.TerminationCause.HungUp,
headers: {
extterm: mxp_1.HeaderBooleanValue.Yes,
},
},
],
[
TerminationCause_1.TerminationCause.Inactive,
{
terminationCause: TerminationCause_1.TerminationCause.Inactive,
headers: {
inactive: mxp_1.HeaderBooleanValue.Yes,
},
},
],
[
TerminationCause_1.TerminationCause.IceFailedToConnect,
{
terminationCause: TerminationCause_1.TerminationCause.IceFailedToConnect,
headers: {
iceFailed: mxp_1.HeaderBooleanValue.Yes,
},
},
],
]);
class EstablishedState extends SessionStateBase_1.SessionStateBase {
constructor(session) {
super(SessionState_1.SessionState.Established, session);
this.toMessageContent = (terminationCause) => CallTerminationConfig.has(terminationCause)
? (0, Option_1.some)(CallTerminationConfig.get(terminationCause))
: Option_1.none;
}
setTerminationCauseAndLeave(messageContent) {
this.terminationCause = messageContent.terminationCause;
const mxpMessageBuilder = this.Session.newMessage().method(models_1.Method.Leave);
const mxpMessage = messageContent.headers
? mxpMessageBuilder.values(messageContent.headers).build()
: mxpMessageBuilder.build();
this.sendOutboundMessage(mxpMessage);
}
onWillTerminate(source) {
if (source === TransitionSource_1.TransitionSource.RemotePeerMessage) {
return;
}
switch (this.terminationCause) {
case TerminationCause_1.TerminationCause.Error:
this.sendError(this.Session.error);
return;
default:
this.sendMxpMessageForLocalTermination();
return;
}
}
sendMxpMessageForLocalTermination() {
(0, function_1.pipe)(this.terminationCause, this.toMessageContent, (0, Option_1.match)(() => {
// No mapping found for this terminationCause in CallTerminationConfig
// No action is required
}, (messageContent) => this.setTerminationCauseAndLeave(messageContent)));
}
handleInboundMessage(message) {
switch (message.method) {
case models_1.Method.Leave:
this.terminateBasedOnMessage(message, TerminationCause_1.TerminationCause.HungUp);
return true;
case models_1.Method.Ack:
// todo: handle sdp if no remote description exist
return true;
case models_1.Method.Join:
// keep sending joined as a response even after established
this.sendJoined(message);
return true;
case models_1.Method.PeerEvent:
this.Session.emitJsepEvent(message);
return true;
case models_1.Method.Error:
this.terminateBasedOnMessage(message, TerminationCause_1.TerminationCause.Error);
return true;
}
return false;
}
}
exports.EstablishedState = EstablishedState;
//# sourceMappingURL=EstablishedState.js.map