decord/source/lib/RTCControlSocket.tsx
2026-07-20 17:37:48 +00:00

1056 lines
40 KiB
TypeScript

// Module ID: 12609
// Function ID: 96949
// Name: _isNativeReflectConstruct
// Dependencies: []
// Module 12609 (_isNativeReflectConstruct)
function _isNativeReflectConstruct() {
let closure_0 = !valueOf.call(Reflect.construct(Boolean, [], () => {
}));
function _isNativeReflectConstruct() {
return closure_0;
}
const result = _isNativeReflectConstruct();
}
function noop() {
}
function convertCodecs(arr) {
return arr.map((name) => ({ name: name.name, type: name.type, priority: 1000 * name.priority, payload_type: name.payloadType, rtx_payload_type: name.rtxPayloadType, encode: name.encode, decode: name.decode }));
}
function convertStreamParametersToWire(arr) {
let mapped;
if (null != arr) {
mapped = arr.map((type) => {
let obj = { type: type.type, rid: type.rid, ssrc: type.ssrc, active: type.active, quality: type.quality, rtx_ssrc: type.rtxSsrc, max_bitrate: type.maxBitrate, max_framerate: type.maxFrameRate };
let tmp;
if (null != type.maxResolution) {
obj = { type: type.maxResolution.type, width: type.maxResolution.width, height: type.maxResolution.height };
tmp = obj;
}
obj.max_resolution = tmp;
return obj;
});
}
return mapped;
}
function convertStreamParametersFromWire(arr) {
let mapped;
if (null != arr) {
mapped = arr.map((type) => {
let obj = {};
type = type.type;
if ("audio" === type) {
let VIDEO = constants.AUDIO;
} else if ("test" === type) {
VIDEO = constants.TEST;
} else if ("screen" === type) {
VIDEO = constants.SCREEN;
} else {
VIDEO = constants.VIDEO;
}
obj.type = VIDEO;
({ rid: obj.rid, ssrc: obj.ssrc, rtx_ssrc: obj.rtxSsrc, active: obj.active, quality: obj.quality, max_bitrate: obj.maxBitrate, max_framerate: obj.maxFrameRate } = type);
let tmp5;
if (null != type.max_resolution) {
obj = { type: type.max_resolution.type, width: type.max_resolution.width, height: type.max_resolution.height };
tmp5 = obj;
}
obj.maxResolution = tmp5;
return obj;
});
}
if (null == mapped) {
mapped = [];
}
return mapped;
}
let closure_3 = importDefault(dependencyMap[0]);
let closure_4 = importDefault(dependencyMap[1]);
let closure_5 = importDefault(dependencyMap[2]);
let closure_6 = importDefault(dependencyMap[3]);
let closure_7 = importDefault(dependencyMap[4]);
let closure_8 = importDefault(dependencyMap[5]);
({ MediaEngineContextTypes: closure_9, MediaTypes: closure_10, SpeakingFlags: closure_11 } = arg1(dependencyMap[6]));
let obj = { IDENTIFY: 0, [0]: "IDENTIFY", SELECT_PROTOCOL: 1, [1]: "SELECT_PROTOCOL", READY: 2, [2]: "READY", HEARTBEAT: 3, [3]: "HEARTBEAT", SELECT_PROTOCOL_ACK: 4, [4]: "SELECT_PROTOCOL_ACK", SPEAKING: 5, [5]: "SPEAKING", HEARTBEAT_ACK: 6, [6]: "HEARTBEAT_ACK", RESUME: 7, [7]: "RESUME", HELLO: 8, [8]: "HELLO", RESUMED: 9, [9]: "RESUMED", CLIENT_CONNECT: 11, [11]: "CLIENT_CONNECT", VIDEO: 12, [12]: "VIDEO", CLIENT_DISCONNECT: 13, [13]: "CLIENT_DISCONNECT", SESSION_UPDATE: 14, [14]: "SESSION_UPDATE", MEDIA_SINK_WANTS: 15, [15]: "MEDIA_SINK_WANTS", VOICE_BACKEND_VERSION: 16, [16]: "VOICE_BACKEND_VERSION", CHANNEL_OPTIONS_UPDATE: 17, [17]: "CHANNEL_OPTIONS_UPDATE", FLAGS: 18, [18]: "FLAGS", PLATFORM: 20, [20]: "PLATFORM", DAVE_PROTOCOL_PREPARE_TRANSITION: 21, [21]: "DAVE_PROTOCOL_PREPARE_TRANSITION", DAVE_PROTOCOL_EXECUTE_TRANSITION: 22, [22]: "DAVE_PROTOCOL_EXECUTE_TRANSITION", DAVE_PROTOCOL_READY_FOR_TRANSITION: 23, [23]: "DAVE_PROTOCOL_READY_FOR_TRANSITION", DAVE_PROTOCOL_PREPARE_EPOCH: 24, [24]: "DAVE_PROTOCOL_PREPARE_EPOCH", MLS_EXTERNAL_SENDER_PACKAGE: 25, [25]: "MLS_EXTERNAL_SENDER_PACKAGE", MLS_KEY_PACKAGE: 26, [26]: "MLS_KEY_PACKAGE", MLS_PROPOSALS: 27, [27]: "MLS_PROPOSALS", MLS_COMMIT_WELCOME: 28, [28]: "MLS_COMMIT_WELCOME", MLS_PREPARE_COMMIT_TRANSITION: 29, [29]: "MLS_PREPARE_COMMIT_TRANSITION", MLS_WELCOME: 30, [30]: "MLS_WELCOME", MLS_INVALID_COMMIT_WELCOME: 31, [31]: "MLS_INVALID_COMMIT_WELCOME", CLIENT_CANNOT_REACH_RTC_SERVER: 32, [32]: "CLIENT_CANNOT_REACH_RTC_SERVER" };
let closure_13 = { AUTHENTICATION_FAILED: 4004, [4004]: "AUTHENTICATION_FAILED", INVALID_SESSION: 4006, [4006]: "INVALID_SESSION", SERVER_NOT_FOUND: 4011, [4011]: "SERVER_NOT_FOUND", SERVER_CRASH: 4015, [4015]: "SERVER_CRASH", CANCELED: 4016, [4016]: "CANCELED", HEARTBEAT_TIMEOUT: 4800, [4800]: "HEARTBEAT_TIMEOUT", UNRESUMABLE: 4801, [4801]: "UNRESUMABLE", RESET_BACKOFF: 4802, [4802]: "RESET_BACKOFF" };
let closure_14 = { DISCONNECTED: 0, [0]: "DISCONNECTED", CONNECTING: 1, [1]: "CONNECTING", IDENTIFYING: 2, [2]: "IDENTIFYING", RESUMING: 3, [3]: "RESUMING", CONNECTED: 4, [4]: "CONNECTED", RECONNECTING: 5, [5]: "RECONNECTING" };
let closure_15 = 20 * importDefault(dependencyMap[7]).Millis.SECOND;
const MINUTE = importDefault(dependencyMap[7]).Millis.MINUTE;
let closure_17 = 5 * importDefault(dependencyMap[7]).Millis.SECOND;
obj = { Connecting: "connecting", Connect: "connect", Disconnect: "disconnect", Resuming: "resuming", Ready: "ready", Speaking: "speaking", Video: "video", Ping: "ping", ClientConnect: "client-connect", ClientDisconnect: "client-disconnect", Codecs: "codecs", MediaSessionId: "media-session-id", MediaSinkWants: "media-sink-wants", VoiceBackendVersion: "voice-backend-version", KeyframeInterval: "keyframe-interval", ChannelOptionsUpdateSecureFramesProtocol: "update-secure-frames-protocol", Flags: "flags", Platform: "platform", SDP: "sdp", Encryption: "encryption", BandwidthEstimationExperiment: "bandwidth-estimation-experiment", SecureFramesInit: "secure-frames-init", SecureFramesPrepareTransition: "secure-frames-prepare-transition", SecureFramesExecuteTransition: "secure-frames-execute-transition", SecureFramesPrepareEpoch: "secure-frames-prepare-epoch", MLSExternalSenderPackage: "mls-external-sender-package", MLSProposals: "mls-proposals", MLSPrepareCommitTransition: "mls-prepare-commit-transition", MLSWelcome: "mls-welcome", ReceiveMessage: "receive-message", SendMessage: "send-message" };
const tmp2 = arg1(dependencyMap[6]);
const tmp3 = (arg0) => {
class RTCControlSocket {
constructor(arg0) {
DEFAULT = arg1;
self = this;
if (arg1 === undefined) {
tmp = closure_9;
DEFAULT = closure_9.DEFAULT;
}
tmp2 = closure_3(self, RTCControlSocket);
obj = closure_6(RTCControlSocket);
tmp3 = closure_5;
if (closure_19()) {
tmp5 = globalThis;
_Reflect = Reflect;
tmp6 = closure_6;
constructResult = Reflect.construct(obj, [], closure_6(self).constructor);
} else {
constructResult = obj.apply(self, undefined);
}
tmp3Result = tmp3(self, constructResult);
tmp8 = closure_1(closure_2[8]);
tmp8 = new tmp8(1000, 5000);
tmp3Result.backoff = tmp8;
tmp3Result.serverVersion = 0;
tmp3Result.url = arg0;
tmp10 = closure_1(closure_2[9]);
tmp10 = new tmp10("RTCControlSocket(" + DEFAULT + ")");
tmp3Result.logger = tmp10;
logger = tmp3Result.logger;
enableNativeLoggerResult = logger.enableNativeLogger(true);
tmp3Result.webSocket = null;
tmp3Result.connectionState = closure_14.DISCONNECTED;
tmp3Result.helloTimeout = null;
tmp3Result.lastHeartbeatAckTime = null;
tmp3Result.heartbeatInterval = null;
tmp3Result.heartbeater = null;
tmp3Result.heartbeatAck = true;
tmp3Result.expeditedHeartbeatTimeout = null;
tmp3Result.heartbeatIntervalModifier = 1;
tmp3Result.connectionStartTime = 0;
tmp3Result.lastRecvSeqNum = null;
tmp3Result.sessionId = null;
tmp3Result.serverId = null;
tmp3Result.channelId = null;
tmp3Result.token = null;
tmp3Result.resumable = false;
return tmp3Result;
}
}
const arg1 = RTCControlSocket;
callback2(RTCControlSocket, arg0);
let obj = {
key: "createWebSocket",
value() {
const self = this;
const RTCControlSocket = this;
const logger = this.logger;
logger.info("[CONNECT] " + this.url);
if (null !== this.webSocket) {
const logger2 = self.logger;
logger2.error("Connect called with already existing websocket");
self.cleanupWebSocket((close) => close.close(4000));
}
self.connectionStartTime = RTCControlSocket(closure_2[10]).now();
self.helloTimeout = setTimeout(() => {
self.handleClose(false, 0, "The connection timed out after " + self(closure_2[10]).now() - self.connectionStartTime + " ms - did not receive OP_HELLO in time.");
}, closure_15);
const webSocket = new WebSocket("" + self.url + "?v=9");
self.webSocket = webSocket;
webSocket.binaryType = "arraybuffer";
webSocket.onopen = () => {
if (self.connectionState === constants2.CONNECTING) {
self.emit(Platform.Connect);
} else if (self.connectionState === constants2.RECONNECTING) {
self.doResumeOrClose();
}
self.connectionState = constants2.CONNECTED;
const diff = self(closure_2[10]).now() - self.connectionStartTime;
const logger = self.logger;
logger.info("[CONNECTED] " + self.url + " in " + diff + " ms");
self.emit(Platform.Ping, Math.round(diff / 2));
};
webSocket.onmessage = (arg0) => {
let audio_ssrc;
let d;
let op;
let seq;
let user_id;
let video_ssrc;
let result = self.parseWebSocketMessage(arg0);
({ op, seq, d } = result);
self.emit(Platform.ReceiveMessage, op, d);
if (seq) {
self.lastRecvSeqNum = seq;
}
if (obj.isLoggingGatewayEvents) {
const _Uint8Array = Uint8Array;
if (d instanceof Uint8Array) {
const items = [];
HermesBuiltin.arraySpread(d, 0);
const mapped = items.map((arg0) => arg0.toString(16).padStart(2, "0"));
const logger2 = self.logger;
const _HermesInternal2 = HermesInternal;
logger2.info("~> " + op + ": 0x" + mapped.join(""));
} else {
const logger = self.logger;
const _JSON = JSON;
const _HermesInternal = HermesInternal;
logger.info("~> " + op + ": " + JSON.stringify(d));
}
}
if (constants.HELLO === op) {
result = self;
result = self.clearHelloTimeout();
result = self.handleHello(d);
} else {
result = constants;
if (constants.READY === op) {
result = self;
result = self.handleReady(d);
} else {
result = constants;
if (constants.RESUMED === op) {
result = self;
result = self.handleResumed(d);
} else {
result = constants;
if (constants.SELECT_PROTOCOL_ACK === op) {
if (d.bandwidth_estimation_experiment) {
result = self;
result = Platform;
result = self.emit(Platform.BandwidthEstimationExperiment, d.bandwidth_estimation_experiment);
}
result = self;
result = Platform;
result = self.emit(Platform.Codecs, d.audio_codec, d.video_codec);
if (d.media_session_id) {
result = self;
result = Platform;
result = self.emit(Platform.MediaSessionId, d.media_session_id);
}
if (d.sdp) {
result = self;
result = Platform;
result = self.emit(Platform.SDP, d.sdp);
} else if (d.mode) {
result = self;
result = Platform;
result = self.emit(Platform.Encryption, d.mode, d.secret_key);
}
if (d.keyframe_interval) {
result = self;
result = Platform;
result = self.emit(Platform.KeyframeInterval, d.keyframe_interval);
}
result = Platform;
let num8 = d.dave_protocol_version;
result = self;
if (!num8) {
num8 = 0;
}
result = self.emit(Platform.SecureFramesInit, num8);
result = self;
self.resumable = true;
} else {
result = constants;
if (constants.SPEAKING === op) {
const speaking = d.speaking;
if ("boolean" !== typeof speaking) {
result = self.emit(Platform.Speaking, d.user_id, d.ssrc, tmp93);
}
} else {
result = constants;
if (constants.HEARTBEAT === op) {
self.sendHeartbeat();
} else {
result = constants;
if (constants.HEARTBEAT_ACK === op) {
self.handleHeartbeatAck(d);
} else {
result = constants;
if (constants.VIDEO === op) {
const Video = Platform.Video;
({ user_id, audio_ssrc, video_ssrc } = d);
self.emit(Video, user_id, audio_ssrc, video_ssrc, callback(d.streams));
} else {
result = constants;
if (constants.CLIENT_CONNECT === op) {
self.emit(Platform.ClientConnect, d.user_ids);
} else {
result = constants;
if (constants.CLIENT_DISCONNECT === op) {
self.emit(Platform.ClientDisconnect, d.user_id);
} else {
result = constants;
if (constants.SESSION_UPDATE === op) {
if (!tmp67) {
self.emit(Platform.Codecs, d.audio_codec, d.video_codec);
}
if (null != d.media_session_id) {
self.emit(Platform.MediaSessionId, d.media_session_id);
}
if (d.keyframe_interval) {
self.emit(Platform.KeyframeInterval, d.keyframe_interval);
}
const tmp67 = null == d.audio_codec && null == d.video_codec;
} else {
result = constants;
if (constants.MEDIA_SINK_WANTS === op) {
self.emit(Platform.MediaSinkWants, d);
} else {
result = constants;
if (constants.VOICE_BACKEND_VERSION === op) {
if (tmp59) {
self.emit(Platform.VoiceBackendVersion, d.voice, d.rtc_worker);
}
const tmp59 = null != d.voice && null != d.rtc_worker;
} else {
result = constants;
if (constants.FLAGS === op) {
if (tmp54) {
self.emit(Platform.Flags, d.user_id, d.flags);
}
const tmp54 = null != d.flags && null != d.user_id;
} else {
result = constants;
if (constants.PLATFORM === op) {
if (tmp49) {
self.emit(Platform.Platform, d.user_id, d.platform);
}
const tmp49 = null != d.platform && null != d.user_id;
} else {
result = constants;
if (constants.DAVE_PROTOCOL_PREPARE_TRANSITION === op) {
if (tmp44) {
self.emit(Platform.SecureFramesPrepareTransition, d.transition_id, d.protocol_version);
}
const tmp44 = null != d.transition_id && null != d.protocol_version;
} else {
result = constants;
if (constants.DAVE_PROTOCOL_EXECUTE_TRANSITION === op) {
if (null != d.transition_id) {
result = self;
result = Platform;
result = self.emit(Platform.SecureFramesExecuteTransition, d.transition_id);
}
} else {
result = constants;
if (constants.DAVE_PROTOCOL_PREPARE_EPOCH === op) {
if (tmp38) {
self.emit(Platform.SecureFramesPrepareEpoch, d.epoch, d.protocol_version);
}
const tmp38 = null != d.epoch && null != d.protocol_version;
} else {
result = constants;
if (constants.MLS_EXTERNAL_SENDER_PACKAGE === op) {
self.emit(Platform.MLSExternalSenderPackage, d);
} else {
result = constants;
if (constants.MLS_PROPOSALS === op) {
self.emit(Platform.MLSProposals, d);
} else {
result = constants;
if (constants.MLS_PREPARE_COMMIT_TRANSITION === op) {
const _DataView2 = DataView;
const dataView = new DataView(d.buffer, d.byteOffset, 2);
const uint16 = dataView.getUint16(0, false);
self.emit(Platform.MLSPrepareCommitTransition, uint16, d.slice(2));
} else {
result = constants;
if (constants.MLS_WELCOME === op) {
const _DataView = DataView;
const dataView1 = new DataView(d.buffer, d.byteOffset, 2);
const uint161 = dataView1.getUint16(0, false);
self.emit(Platform.MLSWelcome, uint161, d.slice(2));
} else {
const logger3 = self.logger;
const _HermesInternal3 = HermesInternal;
logger3.info("Unhandled op " + op);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
};
webSocket.onerror = () => self.handleClose(false, 0, "An error with the websocket occurred");
webSocket.onclose = (wasClean) => self.handleClose(wasClean.wasClean, wasClean.code, wasClean.reason);
}
};
const items = [obj, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ];
obj = {
key: "send",
value(op) {
let tmp = arg1;
const self = this;
if (arg1 === undefined) {
tmp = null;
}
const webSocket = self.webSocket;
let obj = webSocket;
if (null != webSocket) {
const _WebSocket = WebSocket;
if (obj.readyState === WebSocket.OPEN) {
const _JSON = JSON;
obj = { op, d: tmp2 };
const json = JSON.stringify(obj);
if (obj.isLoggingGatewayEvents) {
const logger = self.logger;
const _HermesInternal = HermesInternal;
logger.info("<~ " + json);
}
self.emit(closure_18.SendMessage, op, tmp);
obj.send(json);
}
}
}
};
items[1] = obj;
obj = {
key: "sendBinary",
value(arg0, byteLength) {
const webSocket = this.webSocket;
if (null != webSocket) {
const _WebSocket = WebSocket;
if (obj.readyState === WebSocket.OPEN) {
const _Uint8Array = Uint8Array;
const uint8Array = new Uint8Array(byteLength.byteLength + 1);
uint8Array[0] = arg0;
const result = uint8Array.set(byteLength, 1);
obj.send(uint8Array.buffer);
}
}
}
};
items[2] = obj;
items[3] = {
key: "doResumeOrClose",
value() {
const self = this;
const nowResult = RTCControlSocket(closure_2[10]).now();
if (null !== this.serverId) {
if (null !== self.channelId) {
if (null !== self.token) {
if (null !== self.sessionId) {
if (self.resumable) {
self.doResume();
self.lastHeartbeatAckTime = nowResult;
}
}
}
}
}
self.disconnect(false, constants3.UNRESUMABLE, "Cannot resume connection.");
}
};
items[4] = {
key: "doResume",
value() {
let logger;
let serverId;
const self = this;
const lastRecvSeqNum = this.lastRecvSeqNum;
let num = -1;
if (null != lastRecvSeqNum) {
num = lastRecvSeqNum;
}
({ logger, serverId } = self);
let str = "";
let str2 = "";
if (null != serverId) {
str2 = serverId;
}
const channelId = self.channelId;
let tmp = str;
if (null != channelId) {
tmp = channelId;
}
const sessionId = self.sessionId;
if (null != sessionId) {
str = sessionId;
}
logger.info("[RESUME] resuming session. serverId=" + str2 + " channelId=" + tmp + " sessionId=" + str + " seqAck=" + num);
self.emit(closure_18.Resuming);
self.connectionState = constants4.RESUMING;
const obj = { token: self.token, session_id: self.sessionId, server_id: self.serverId, channel_id: self.channelId, seq_ack: num };
self.send(constants2.RESUME, obj);
}
};
items[5] = {
key: "handleHello",
value(v) {
let heartbeatInterval;
let logger;
const self = this;
v = v.v;
let num = 3;
if (null != v) {
num = v;
}
self.serverVersion = num;
if (self.serverVersion <= 3) {
let num4 = 0.1;
if (RTCControlSocket(closure_2[11]).isPlatformEmbedded) {
num4 = 0.25;
}
self.heartbeatInterval = v.heartbeat_interval * num4;
} else {
self.heartbeatInterval = v.heartbeat_interval * self.heartbeatIntervalModifier;
if (!RTCControlSocket(closure_2[11]).isPlatformEmbedded) {
let _NaN = self.heartbeatInterval;
if (null == _NaN) {
_NaN = NaN;
}
self.heartbeatInterval = Math.min(closure_17, _NaN);
const tmp4 = closure_17;
}
}
const diff = RTCControlSocket(closure_2[10]).now() - self.connectionStartTime;
({ logger, heartbeatInterval } = self);
let str = "??";
if (null != heartbeatInterval) {
str = heartbeatInterval;
}
logger.info("[HELLO] heartbeat interval: " + str + ", version: " + self.serverVersion + ", took " + diff + " ms");
self.startHeartbeater();
}
};
items[6] = {
key: "handleReady",
value(streams) {
let ip;
let modes;
let port;
let ssrc;
const self = this;
const backoff = this.backoff;
backoff.succeed();
const logger = this.logger;
logger.info("[READY] took " + RTCControlSocket(closure_2[10]).now() - this.connectionStartTime + " ms");
if (this.serverVersion >= 6) {
self.send(constants2.VOICE_BACKEND_VERSION, {});
}
({ ip, port, modes, ssrc } = streams);
self.emit(closure_18.Ready, ip, port, modes, ssrc, callback7(streams.streams), streams.experiments);
}
};
items[7] = {
key: "handleResumed",
value() {
const backoff = this.backoff;
backoff.succeed();
}
};
items[8] = {
key: "handleClose",
value(arg0, arg1, arg2) {
let backoff;
let logger2;
let flag = arg0;
const self = this;
const RTCControlSocket = this;
flag = arg0;
this.connectionState = constants4.DISCONNECTED;
if (!arg0) {
flag = false;
}
self.cleanupWebSocket();
if (arg1 !== constants3.AUTHENTICATION_FAILED) {
if (arg1 !== constants3.SERVER_CRASH) {
if (arg1 !== constants3.SERVER_NOT_FOUND) {
if (arg1 !== constants3.INVALID_SESSION) {
if (self.backoff.fails > 3) {
const logger = self.logger;
let str = "[WS CLOSED] Backoff exceed. Resetting.";
logger.warn("[WS CLOSED] Backoff exceed. Resetting.");
self.disconnect(flag, arg1, arg2);
} else {
({ backoff, logger: logger2 } = self);
str = flag.toString();
const result = backoff.fail(() => self.reconnect(flag, arg1, arg2)) / 1000;
const _HermesInternal = HermesInternal;
logger2.warn("[WS CLOSED] (clean: " + str + ", code: " + arg1 + ", reason: " + arg2 + ") retrying in " + result.toFixed(2) + " seconds.");
const failResult = backoff.fail(() => self.reconnect(flag, arg1, arg2));
}
}
}
}
}
return self.disconnect(flag, arg1, arg2);
}
};
items[9] = {
key: "disconnect",
value(arg0, arg1, arg2) {
const logger = this.logger;
logger.warn("[DISCONNECT] (" + arg0.toString() + ", " + arg1 + ", " + arg2 + ")");
this.cleanupWebSocket();
this.cleanupState();
this.connectionState = constants4.DISCONNECTED;
this.emit(closure_18.Disconnect, arg0, arg1, arg2);
}
};
items[10] = {
key: "reconnect",
value(arg0, arg1, arg2) {
const logger = this.logger;
logger.info("[RECONNECT] wasClean=" + arg0.toString() + " code=" + arg1 + " reason=" + arg2);
this.cleanupWebSocket((close) => close.close(4000));
this.connectionState = constants4.RECONNECTING;
const webSocket = this.createWebSocket();
}
};
items[11] = {
key: "cleanupWebSocket",
value(arg0) {
this.stopHeartbeater();
this.clearHelloTimeout();
const webSocket = this.webSocket;
this.webSocket = null;
if (null != webSocket) {
webSocket.onopen = closure_20;
webSocket.onmessage = closure_20;
webSocket.onerror = closure_20;
webSocket.onclose = closure_20;
if (null != arg0) {
arg0(webSocket);
}
}
const backoff = this.backoff;
backoff.cancel();
}
};
items[12] = {
key: "cleanupState",
value() {
this.serverId = null;
this.channelId = null;
this.sessionId = null;
this.token = null;
this.resumable = false;
this.lastRecvSeqNum = null;
}
};
items[13] = {
key: "parseWebSocketMessage",
value(data) {
const self = this;
if (data.data instanceof ArrayBuffer) {
const _Uint8Array = Uint8Array;
const uint8Array = new Uint8Array(data.data);
let uint16 = null;
if (self.serverVersion >= 8) {
const _DataView = DataView;
const dataView = new DataView(uint8Array.buffer);
uint16 = dataView.getUint16(0, false);
}
let num3 = 0;
if (self.serverVersion >= 8) {
num3 = 2;
}
const obj = { op: uint8Array[num3], seq: uint16, d: uint8Array.subarray(num3 + 1) };
return obj;
} else {
const _JSON = JSON;
return JSON.parse(data.data);
}
}
};
items[14] = {
key: "clearHelloTimeout",
value() {
const self = this;
if (null != this.helloTimeout) {
const _clearTimeout = clearTimeout;
clearTimeout(self.helloTimeout);
self.helloTimeout = null;
}
}
};
items[15] = {
key: "handleHeartbeatAck",
value(arg0) {
const self = this;
const logger = this.logger;
logger.info("Heartbeat ACK received");
let t = arg0;
if (this.serverVersion >= 8) {
t = arg0.t;
}
self.emit(closure_18.Ping, RTCControlSocket(closure_2[10]).now() - t);
const obj = RTCControlSocket(closure_2[10]);
self.lastHeartbeatAckTime = RTCControlSocket(closure_2[10]).now();
self.heartbeatAck = true;
if (null !== self.expeditedHeartbeatTimeout) {
const _clearTimeout = clearTimeout;
clearTimeout(self.expeditedHeartbeatTimeout);
self.expeditedHeartbeatTimeout = null;
const logger2 = self.logger;
logger2.info("Expedited heartbeat succeeded");
}
}
};
items[16] = {
key: "handleHeartbeatTimeout",
value() {
let backoff;
let logger;
const RTCControlSocket = this;
this.cleanupWebSocket((close) => close.close(4000));
({ backoff, logger } = this);
const result = backoff.fail(() => self.reconnect(false, constants.HEARTBEAT_TIMEOUT, "Heartbeat timeout.")) / 1000;
logger.warn("[HEARTBEAT ACK TIMEOUT] reconnecting in " + result.toFixed(2) + " seconds.");
}
};
items[17] = {
key: "startHeartbeater",
value() {
const self = this;
const RTCControlSocket = this;
callback(closure_2[12])(null != this.heartbeatInterval, "RTCControlSocket: Heartbeat interval should never null here.");
const logger = this.logger;
logger.info("Starting heartbeat with interval: " + this.heartbeatInterval);
if (null !== this.heartbeater) {
const _clearInterval = clearInterval;
clearInterval(self.heartbeater);
}
self.heartbeatAck = true;
self.heartbeater = setInterval(() => {
if (self.heartbeatAck) {
obj.heartbeatAck = false;
obj.sendHeartbeat();
} else if (null === obj.expeditedHeartbeatTimeout) {
const result = self.handleHeartbeatTimeout();
}
}, self.heartbeatInterval);
}
};
items[18] = {
key: "sendHeartbeat",
value() {
const self = this;
if (this.serverVersion >= 8) {
const lastRecvSeqNum = self.lastRecvSeqNum;
let num2 = -1;
if (null != lastRecvSeqNum) {
num2 = lastRecvSeqNum;
}
const logger2 = self.logger;
const _HermesInternal = HermesInternal;
logger2.info("Sending heartbeat with last received sequence number: " + num2);
let obj = { t: RTCControlSocket(closure_2[10]).now(), seq_ack: num2 };
self.send(constants2.HEARTBEAT, obj);
const obj3 = RTCControlSocket(closure_2[10]);
} else {
const logger = self.logger;
logger.info("Sending heartbeat");
obj = RTCControlSocket(closure_2[10]);
self.send(constants2.HEARTBEAT, obj.now());
}
}
};
items[19] = {
key: "stopHeartbeater",
value() {
const self = this;
if (null !== this.heartbeater) {
const _clearInterval = clearInterval;
clearInterval(self.heartbeater);
self.heartbeater = null;
}
if (null !== self.expeditedHeartbeatTimeout) {
const _clearTimeout = clearTimeout;
clearTimeout(self.expeditedHeartbeatTimeout);
self.expeditedHeartbeatTimeout = null;
}
}
};
items[20] = {
key: "connect",
value() {
const self = this;
if (this.connectionState !== constants4.DISCONNECTED) {
const logger = self.logger;
logger.error("Cannot start a new connection, connection state is not disconnected");
let flag = false;
} else {
self.connectionState = constants4.CONNECTING;
const webSocket = self.createWebSocket();
self.emit(closure_18.Connecting);
flag = true;
}
return flag;
}
};
items[21] = {
key: "identify",
value(streamParameters) {
let channelId;
let maxDaveProtocolVersion;
let serverId;
let sessionId;
let token;
let userId;
let video;
const self = this;
({ serverId, channelId, sessionId, token, video } = streamParameters);
({ userId, maxDaveProtocolVersion } = streamParameters);
if (video === undefined) {
video = false;
}
self.serverId = serverId;
self.channelId = channelId;
self.sessionId = sessionId;
self.token = token;
self.connectionState = constants4.IDENTIFYING;
const obj = { server_id: serverId, channel_id: channelId, user_id: userId, session_id: sessionId, token, max_dave_protocol_version: maxDaveProtocolVersion, video, streams: callback6(streamParameters.streamParameters) };
self.send(constants2.IDENTIFY, obj);
}
};
items[22] = {
key: "expeditedHeartbeat",
value(arg0) {
let str = arg1;
let flag = arg2;
const self = this;
const RTCControlSocket = this;
if (arg1 === undefined) {
str = "";
}
if (flag === undefined) {
flag = true;
}
if (null != self.webSocket) {
const logger2 = self.logger;
let str5 = "";
if ("" !== str) {
str5 = `reason: ${str}`;
}
logger2.info(`Performing an expedited heartbeat ${str5}`);
self.heartbeatAck = false;
self.sendHeartbeat();
if (null !== self.expeditedHeartbeatTimeout) {
const _clearTimeout = clearTimeout;
clearTimeout(self.expeditedHeartbeatTimeout);
}
const _setTimeout = setTimeout;
self.expeditedHeartbeatTimeout = setTimeout(() => {
self.expeditedHeartbeatTimeout = null;
if (false === self.heartbeatAck) {
const result = self.handleHeartbeatTimeout();
}
}, arg0);
} else if (flag) {
return self.resetBackoff(str);
} else {
const logger = self.logger;
let str2 = "";
if ("" !== str) {
str2 = `reason: ${str}`;
}
logger.info(`Expedited heartbeat requested, but is disconnected and a reset was not requested ${str2}`);
}
return false;
}
};
items[23] = {
key: "resetBackoff",
value() {
let str = arg0;
const self = this;
if (arg0 === undefined) {
str = "";
}
let flag = self.backoff.fails > 0;
if (flag) {
flag = null == self.webSocket;
}
if (flag) {
const logger = self.logger;
let str2 = "";
if ("" !== str) {
str2 = `for reason: ${str}`;
}
logger.info(`Connection backoff reset ${str2}`);
const backoff = self.backoff;
backoff.succeed();
self.reconnect(false, constants3.RESET_BACKOFF, "Reset backoff.");
flag = true;
}
return flag;
}
};
items[24] = {
key: "close",
value() {
const logger = this.logger;
logger.info("CLOSE");
this.cleanupWebSocket((close) => close.close(4000));
this.cleanupState();
this.connectionState = constants4.DISCONNECTED;
this.emit(closure_18.Disconnect, true, 1000, "Force Close");
}
};
items[25] = {
key: "destroy",
value() {
this.close();
}
};
items[26] = {
key: "selectProtocol",
value(protocol, arg1, sdp) {
const self = this;
let obj = {};
sdp = null;
let tmp2 = obj;
if (null != sdp) {
if ("sdp" in sdp) {
if (null != sdp.sdp) {
if ("" !== sdp.sdp) {
sdp = sdp.sdp;
obj = {};
const merged = Object.assign(sdp);
obj["codecs"] = callback5(sdp.codecs);
obj["rtc_connection_id"] = arg1;
tmp2 = obj;
}
}
}
let BooleanResult = "address" in sdp && null != sdp.address;
if (BooleanResult) {
BooleanResult = "" !== sdp.address;
}
if (BooleanResult) {
const _Boolean = Boolean;
BooleanResult = Boolean(sdp.port);
}
if (BooleanResult) {
BooleanResult = null != sdp.mode;
}
if (BooleanResult) {
BooleanResult = "" !== sdp.mode;
}
tmp2 = obj;
if (BooleanResult) {
obj = {};
({ address: obj2.address, port: obj2.port, mode: obj2.mode } = sdp);
const obj1 = {};
const merged1 = Object.assign(sdp);
obj1["codecs"] = callback5(sdp.codecs);
obj1["rtc_connection_id"] = arg1;
obj1["experiments"] = arg3;
sdp = obj;
tmp2 = obj1;
}
}
const obj2 = { protocol, data: sdp };
const merged2 = Object.assign(tmp2);
self.send(constants2.SELECT_PROTOCOL, obj2);
}
};
items[27] = {
key: "updateSession",
value(codecs) {
this.send(constants2.SESSION_UPDATE, { codecs: callback5(codecs.codecs) });
}
};
items[28] = {
key: "speaking",
value(arg0) {
let num = arg1;
let num2 = arg2;
const self = this;
if (arg1 === undefined) {
num = 0;
}
if (num2 === undefined) {
num2 = 0;
}
const obj = {};
let BooleanResult = arg0;
if (self.serverVersion <= 3) {
const _Boolean = Boolean;
BooleanResult = Boolean(arg0);
}
obj.speaking = BooleanResult;
obj.delay = num;
obj.ssrc = num2;
self.send(constants2.SPEAKING, obj);
}
};
items[29] = {
key: "video",
value(audio_ssrc, video_ssrc, rtx_ssrc) {
this.send(constants2.VIDEO, { audio_ssrc, video_ssrc, rtx_ssrc, streams: callback6(arg3) });
}
};
items[30] = {
key: "mediaSinkWants",
value(arg0) {
const self = this;
if (this.serverVersion >= 5) {
self.send(constants2.MEDIA_SINK_WANTS, arg0);
}
}
};
items[31] = {
key: "secureFramesReadyForTransition",
value(transition_id) {
this.send(constants2.DAVE_PROTOCOL_READY_FOR_TRANSITION, { transition_id });
}
};
items[32] = {
key: "sendMLSKeyPackage",
value(arg0) {
const logger = this.logger;
logger.info("Sending MLS key package");
const uint8Array = new Uint8Array(arg0);
this.sendBinary(constants2.MLS_KEY_PACKAGE, uint8Array);
}
};
items[33] = {
key: "sendMLSCommitWelcome",
value(arg0) {
const logger = this.logger;
logger.info("Sending MLS commit + welcome message");
const uint8Array = new Uint8Array(arg0);
this.sendBinary(constants2.MLS_COMMIT_WELCOME, uint8Array);
}
};
items[34] = {
key: "flagMLSInvalidCommitWelcome",
value(transition_id) {
this.send(constants2.MLS_INVALID_COMMIT_WELCOME, { transition_id });
}
};
items[35] = {
key: "noRoute",
value() {
this.send(constants2.CLIENT_CANNOT_REACH_RTC_SERVER, {});
}
};
items[36] = {
key: "setHeartbeatIntervalModifier",
value(heartbeatIntervalModifier) {
this.heartbeatIntervalModifier = heartbeatIntervalModifier;
}
};
return callback(RTCControlSocket, items);
}(importDefault(dependencyMap[13]));
const result = arg1(dependencyMap[14]).fileFinishedImporting("lib/RTCControlSocket.tsx");
export default tmp3;
export const RTCSocketOpcode = obj;
export const SocketEvent = obj;