/* Metro module 12491; source: modules/gateway/GatewaySocket.tsx; dependencies: [57, 5, 6, 7, 15, 17, 18, 691, 661, 3, 12492, 12494, 672, 561, 12495, 12497, 12503, 12505, 12524, 20, 14, 4488, 12502, 477, 507, 683, 44, 566, 5231, 5237, 5240, 5238, 12525, 12526, 12508, 652, 4826, 4831, 1216, 694, 2] */ function _fun95051(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#95051, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:6, offset: 0x0212fe16, size: 542 bytes, params: 8, frame: 22 let env0_0 = require; const noop_95055 = function() { }; const withGatewayCompressionHandler = function(a0, a1, a2) { var env0_0 = a0; var env0_1 = a1; var env0_2 = a2; var env0_3 = 0; a0.dataReady(_fun95057); var env0_4 = false; return _fun95058; }; const byteSize = function(a0) { return a0 == null ? 0 : typeof a0 === 'string' ? a0.length : a0.byteLength; }; const Object = global.Object; Object.defineProperty(exports, '__esModule', {value: true}); let env0_4 = importDefault(57) /* metro dependency 57 */; const env0_5 = importDefault(5) /* metro dependency 5 */; const env0_6 = importDefault(6) /* metro dependency 6 */; const env0_7 = importDefault(7) /* metro dependency 7 */; const env0_8 = importDefault(15) /* metro dependency 15 */; const env0_9 = importDefault(17) /* metro dependency 17 */; const env0_10 = importDefault(18) /* metro dependency 18 */; const developerOptionsStore = importDefault(691) /* metro dependency 691: DeveloperOptionsStore */; let value = require(661) /* metro dependency 661: Constants */; const env0_12 = value.AnalyticEvents; const env0_13 = value.Endpoints; value = importDefault(3) /* metro dependency 3: Logger */; value = new value('GatewaySocket'); value = importDefault(12492) /* metro dependency 12492: GatewayEncoding */; value = new value(); let Millis = (importDefault(672) /* metro dependency 672: Durations */).Millis; const SECOND = Millis.SECOND; const env0_17 = 30 * SECOND; Millis = (importDefault(672) /* metro dependency 672: Durations */).Millis; let MINUTE = Millis.MINUTE; const env0_18 = 3 * MINUTE; Millis = (importDefault(672) /* metro dependency 672: Durations */).Millis; MINUTE = Millis.MINUTE; const env0_19 = 1 * MINUTE; const GLOBAL_ENV = global.window.GLOBAL_ENV; const env0_20 = GLOBAL_ENV.GATEWAY_ENDPOINT; value = importDefault(12495) /* metro dependency 12495: GatewaySocketOpCodes */; value = _fun95060(value); (require(2) /* metro dependency 2 */).fileFinishedImporting('modules/gateway/GatewaySocket.tsx'); exports.default = value; exports.setAccountSwitchUserId = function(a0) { env0_16 = a0; }; } function _isNativeReflectConstruct_95052() { // fn#95052, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:221, offset: 0x02130034, size: 98 bytes, params: 1, frame: 18 var Boolean; var prototype; var valueOf; var call; var Reflect; var construct; var closure; var value; var error; try { Boolean = global.Boolean; prototype = Boolean.prototype; valueOf = prototype.valueOf; call = valueOf.call; Reflect = global.Reflect; construct = Reflect.construct; Boolean = global.Boolean; closure = function() { }; value = Reflect.apply(construct, Reflect, [Boolean, [], closure]); value = Reflect.apply(call, valueOf, [value]); var result = !value; } catch (error) { } return (_isNativeReflectConstruct_95052_isNativeReflectConstruct = function() { return !!result; })(); } function withGatewayCompressionHandler(a0, a1, a2) { // fn#95056, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:583, offset: 0x02130096, size: 64 bytes, params: 4, frame: 12 const env0_0 = a0; const env0_1 = a1; const env0_2 = a2; a0.dataReady(_fun95057); return _fun95058; } function _fun95060(a0) { // fn#95060, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:977, offset: 0x021301b9, size: 1214 bytes, params: 2, frame: 17 const closure = GatewaySocket; env0_10(closure, a0); const binding = env0_7; const items2 = [{key: 'connectionState', get: function() { return this.connectionState_; }, set: set_95064}]; items2[1] = {key: 'addAnalytics', value: function(a0) { var r2; var object = {}; copyDataProperties(object, a0, copyDataProperties(object, this.analytics, r2)); this.analytics = object; }}; items2[2] = {key: 'setResumeUrl', value: value_95066}; items2[3] = {key: 'handleActiveStateChange', value: value_95067}; items2[4] = {key: 'handleUpdateTimeSpentSessionId', value: function(a0, a1, a2) { if (this.connectionState_ === importDefault(dependencyMap[16]).SESSION_ESTABLISHED) { this.send(require(dependencyMap[14]).Opcode.UPDATE_TIME_SPENT_SESSION_ID, {initialization_timestamp: a0, session_id: a1, client_launch_id: a2}); this._sendHeartbeat(); } }}; items2[5] = {key: '_connect', value: value_95069}; items2[6] = {key: '_handleHello', value: value_95080}; items2[7] = {key: '_handleReconnect', value: value_95081}; items2[8] = {key: '_handleInvalidSession', value: value_95083}; items2[9] = {key: '_handleDispatch', value: value_95084}; items2[10] = {key: 'handleResumeDispatched', value: value_95085}; items2[11] = {key: 'handleReadyDispatched', value: function() { this.didForceClearGuildHashes = false; this.hasConnectedOnce = true; }}; items2[12] = {key: '_getGatewayUrl', value: function() { return this.resumeUrl ?? GATEWAY_ENDPOINT; }}; items2[13] = {key: '_handleHeartbeatReceive', value: function() { var property; this._sendHeartbeat(); if (this.heartbeater != null && this.heartbeatInterval != null) { property = global.clearInterval; property(this.heartbeater); property = global.setInterval; this.heartbeater = property(this._doHeartbeatInterval.bind(this), this.heartbeatInterval); } }}; items2[14] = {key: '_handleHeartbeatAck', value: value_95089}; items2[15] = {key: '_handleHeartbeatTimeout', value: value_95090}; items2[16] = {key: '_handleClose', value: value_95093}; items2[17] = {key: '_tryDetectInvalidIOSToken', value: value_95095}; items2[18] = {key: '_reset', value: value_95098}; items2[19] = {key: '_sendHeartbeatIfDue', value: function() { var r0; var lastHeartbeatTime; var value; if (this.heartbeatInterval != null) { if (this.heartbeater != null) { lastHeartbeatTime = this.lastHeartbeatTime; value = lastHeartbeatTime != null; if (value) { value = global.Date.now() - lastHeartbeatTime; value = value > this.heartbeatInterval + 5000; r0 = value; } else { r0 = value; } if (r0) { this._sendHeartbeat(); } } } }}; items2[20] = {key: '_doHeartbeatInterval', value: function() { if (this.heartbeatAck) { this.heartbeatAck = false; this._sendHeartbeat(); } else if (this.expeditedHeartbeatTimeout === null) { this._handleHeartbeatTimeout(); } }}; items2[21] = {key: '_startHeartbeater', value: value_95101}; items2[22] = {key: '_stopHeartbeater', value: function() { if (this.heartbeater !== null) { global.clearInterval(this.heartbeater); this.heartbeater = null; } if (this.initialHeartbeatTimeout !== null) { global.clearTimeout(this.initialHeartbeatTimeout); this.initialHeartbeatTimeout = null; } if (this.expeditedHeartbeatTimeout !== null) { global.clearTimeout(this.expeditedHeartbeatTimeout); this.expeditedHeartbeatTimeout = null; } }}; items2[23] = {key: '_clearHelloTimeout', value: function() { if (this.helloTimeout != null) { global.clearTimeout(this.helloTimeout); this.helloTimeout = null; } }}; items2[24] = {key: '_cleanup', value: value_95105}; items2[25] = {key: '_doResume', value: value_95106}; const env0_0 = env0_5(_fun95108); items2[26] = {key: '_doIdentify', value: value_95109}; items2[27] = {key: '_doFastConnectIdentify', value: value_95110}; items2[28] = {key: '_doResumeOrIdentify', value: value_95111}; items2[29] = {key: '_updateLastHeartbeatAckTime', value: function() { var Date = global.Date; this.lastHeartbeatAckTime = Date.now(); }}; items2[30] = {key: '_consumeQOSPayload', value: function() { var currentPayload = this.heartbeatQOSState.currentPayload; this.heartbeatQOSState.currentPayload = this.heartbeatQOSState.upcomingState ?? this.heartbeatQOSState.currentPayload; this.heartbeatQOSState.upcomingState = null; return currentPayload; }}; items2[31] = {key: '_sendHeartbeat', value: function() { this.send(require(dependencyMap[14]).Opcode.QOS_HEARTBEAT, {seq: this.seq, qos: this._consumeQOSPayload()}, false); this.lastHeartbeatTime = global.Date.now(); }}; items2[32] = {key: 'getLogger', value: value_95115}; items2[33] = {key: 'willReconnect', value: function() { return this.connectionState === importDefault(dependencyMap[16]).WILL_RECONNECT; }}; items2[34] = {key: 'isClosed', value: function() { return this.connectionState === importDefault(dependencyMap[16]).CLOSED; }}; items2[35] = {key: 'isSessionEstablished', value: value_95118}; items2[36] = {key: 'isConnected', value: value_95119}; items2[37] = {key: 'connect', value: value_95120}; items2[38] = {key: 'resetSocketAndClearCacheOnError', value: value_95121}; items2[39] = {key: 'resetSocketOnDispatchError', value: function(a0) { var r5; var r3; var message; var value = a0.error.message != null; if (value) { message = a0.error.message; value = message.indexOf('Guild data was missing from store'); value = value >= 0; r3 = value; r5 = message; } else { r3 = value; } var object = {}; copyDataProperties(object, a0, r5); object['sentry'] = !r3; this.resetSocketAndClearCacheOnError(object); }}; items2[40] = {key: 'close', value: value_95128}; items2[41] = {key: 'networkStateChange', value: function(a0, a1) { var value = a2; this.expeditedHeartbeat(a0, a1, !(value !== undefined) || value, false); }}; items2[42] = {key: 'expeditedHeartbeat', value: value_95132}; items2[43] = {key: 'resetBackoff', value: value_95134}; return binding(closure, items2); } function _fun95057(a0) { // fn#95057, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:650, offset: 0x021300d6, size: 46 bytes, params: 2, frame: 14 var value; var binding; var defaultImport; var error; try { value = environment; binding = env0_3; defaultImport = importDefault(a0, binding); } catch (error) { env0_3 = 0; throw error; } return defaultImport; } function _fun95058(a0) { // fn#95058, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:704, offset: 0x02130104, size: 138 bytes, params: 2, frame: 18 var value; var binding; var value2; var error; const data = a0.data; if (a0.raw_length != null) { binding = env0_3; env0_3 = binding + a0.raw_length; } else { binding = env0_3; value2 = environment.__proto__; env0_3 = binding + byteSize(data); } try { value = environment; binding = env0_0; binding.feed(data); } catch (error) { if (!env0_4) { env0_4 = true; require(false, 0, 'A decompression error occurred'); } throw error; } } function GatewaySocket() { // fn#95061, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:989, offset: 0x02130677, size: 524 bytes, params: 1, frame: 22 let binding = env1_6; binding(this, GatewaySocket); const value3 = env1_9(GatewaySocket); const value6 = env1_8(this, _isNativeReflectConstruct_95052() ? global.Reflect.construct(value3, [], env1_9(this).constructor) : value3.apply(this, undefined)); const defaultImport = importDefault(561) /* metro dependency 561: Backoff */; binding = env1_19; const value7 = Object.create(defaultImport.prototype, {constructor: {value: defaultImport}}); const defaultImport4 = new defaultImport(1000, binding); value6.dispatchExceptionBackoff = defaultImport4 instanceof Object ? defaultImport4 : value7; value6.dispatchSuccessTimer = 0; value6.didForceClearGuildHashes = false; value6.identifyUncompressedByteSize = 0; value6.identifyCompressedByteSize = 0; value6.analytics = {}; value6.identifyCount = 0; value6.resumeUrl = null; value6.iosGoingAwayEventCount = 0; value6.heartbeatQOSState = {'currentPayload': null, 'upcomingState': null}; value6.send = send_95062; const defaultImport2 = importDefault(12497) /* metro dependency 12497: GatewaySocketDispatcher */; const value10 = Object.create(defaultImport2.prototype, {constructor: {value: defaultImport2}}); const defaultImport22 = new defaultImport2(value6); value6.dispatcher = defaultImport22 instanceof Object ? defaultImport22 : value10; const defaultImport3 = defaultImport; const value13 = Object.create(defaultImport3.prototype, {constructor: {value: defaultImport3}}); const defaultImport32 = new defaultImport3(1000, 60000); value6.gatewayBackoff = defaultImport32 instanceof Object ? defaultImport32 : value13; const CLOSED = (importDefault(12503) /* metro dependency 12503: ConnectionState */).CLOSED; value6.connectionState_ = CLOSED; value6.webSocket = null; value6.seq = 0; value6.sessionId = null; value6.token = null; value6.initialHeartbeatTimeout = null; value6.expeditedHeartbeatTimeout = null; value6.lastHeartbeatTime = null; value6.lastHeartbeatAckTime = null; value6.helloTimeout = null; value6.heartbeatInterval = null; value6.heartbeater = null; value6.heartbeatAck = true; value6.connectionStartTime = 0; value6.identifyStartTime = 0; value6.nextReconnectIsImmediate = false; value6.compressionHandler = (require(12505) /* metro dependency 12505: GatewayCompressionHandler */).getCompressionHandler(env1_15); value6.hasConnectedOnce = false; value6.isFastConnect = false; value6.identifyCount = 0; value6.iosGoingAwayEventCount = 0; return value6; } function set_95064(a0) { // fn#95064, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:2488, offset: 0x0213096c, size: 58 bytes, params: 2, frame: 13 env1_14.verbose('Setting connection state to ' + a0); this.connectionState_ = a0; } function value_95066(a0) { // fn#95066, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:2678, offset: 0x021309cc, size: 118 bytes, params: 2, frame: 15 let value = a0; const r1 = value != null && value.endsWith('/') ? value.substring(0, value.length - 1) : value; if (r1 !== null) { value = environment.__proto__; env1_14.verbose('Updating resume url to ' + r1); } this.resumeUrl = r1; } function value_95067(a0) { // fn#95067, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:2853, offset: 0x02130a42, size: 230 bytes, params: 2, frame: 19 var Set; var reasons; var items2; var value2; var set; let currentPayload = this.heartbeatQOSState.currentPayload; let r2 = currentPayload != null && currentPayload.active; value = !r2; if (this.heartbeatQOSState.currentPayload == null) { this.heartbeatQOSState.currentPayload = a0; } currentPayload = this.heartbeatQOSState.currentPayload; if (a0.active) { currentPayload.active = true; Set = global.Set; reasons = currentPayload.reasons; items2 = []; value2 = arraySpread(items2, reasons, 0, undefined); reasons = a0.reasons; arraySpread(items2, reasons, value2, undefined); set = new Set(); items2 = []; arraySpread(items2, set, 0, undefined); currentPayload.reasons = items2.sort(); r2 = r2 ? value : this.isSessionEstablished(); if (r2) { this._sendHeartbeat(); } } this.heartbeatQOSState.upcomingState = a0; } function value_95069() { // fn#95069, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:3522, offset: 0x02130ba8, size: 665 bytes, params: 1, frame: 32 var binding; var compressionHandler; var name; var value4; var API_VERSION; var Date; var setTimeout; var uRL; var searchParams; var object2; var withGatewayCompressionHandlerBinding; let value = this.willReconnect(); if (value) { value = importAll(12524) /* metro dependency 12524: PauseGatewaySocket */; if (value.getIsPaused()) { env1_14.info('Skipping _connect because socket is paused'); } else { this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).CONNECTING; this.nextReconnectIsImmediate = false; compressionHandler = this.compressionHandler; value = compressionHandler.getAlgorithm(); binding = env1_15; name = binding.getName(); value4 = this._getGatewayUrl(); API_VERSION = global.window.GLOBAL_ENV.API_VERSION; (importDefault(20) /* metro dependency 20: AppStartPerformance */).mark('🌐', 'Socket._connect'); binding = env1_14; binding.info('[CONNECT] ' + value4 + ', encoding: ' + name + ', version: ' + API_VERSION + ', compression: ' + (value ?? 'none')); if (this.webSocket !== null) { env1_14.error('_connect called with already existing websocket'); this._cleanup(function(a0) { return a0.close(4000); }); } Date = global.Date; this.connectionStartTime = Date.now(); setTimeout = global.setTimeout; binding = env1_17; this.helloTimeout = setTimeout(_fun95071, binding); uRL = new global.URL(); searchParams = uRL.searchParams; searchParams.append('encoding', name); searchParams = uRL.searchParams; searchParams.append('v', API_VERSION.toString()); if (value != null) { uRL.searchParams.append('compress', value); } object2 = {}; object2.gatewayURL = uRL.toString(); object2.newCallback = newCallback; object2.onOpen = onOpen; withGatewayCompressionHandlerBinding = withGatewayCompressionHandler; compressionHandler = this.compressionHandler; value = this._handleClose.bind(this); object2.onMessage = withGatewayCompressionHandlerBinding(compressionHandler, value, _fun95077); object2.onError = onError_95078; object2.onClose = onClose_95079; newOrTakeoverWebSocket(object2); } } else { env1_14.verbose('Skipping _connect because willReconnect is false'); } } function value_95080(a0) { // fn#95080, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:7334, offset: 0x021316d9, size: 152 bytes, params: 2, frame: 25 const heartbeat_interval = a0.heartbeat_interval; this.heartbeatInterval = heartbeat_interval; const Date = global.Date; let value = Date.now(); value -= this.connectionStartTime; const binding = env1_14; binding.verbose('[HELLO] via ' + (require(12502) /* metro dependency 12502: GatewaySocketAnalytics */).getConnectionPath(a0) + ', heartbeat interval: ' + heartbeat_interval + ', took ' + value + ' ms'); this._startHeartbeater(); } function value_95081() { // fn#95081, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:7589, offset: 0x02131771, size: 93 bytes, params: 1, frame: 13 env1_14.verbose('[RECONNECT] gateway requested I reconnect.'); this._cleanup(function(a0) { return a0.close(4000); }); const WILL_RECONNECT = (importDefault(12503) /* metro dependency 12503: ConnectionState */).WILL_RECONNECT; this.connectionState = WILL_RECONNECT; this._connect(); } function value_95083(a0) { // fn#95083, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:7787, offset: 0x021317ce, size: 76 bytes, params: 2, frame: 14 const value = environment.__proto__; const binding = env1_14; binding.info('[INVALID_SESSION]' + (a0 ? ' can resume)' : '')); if (a0) { this._doResumeOrIdentify(); } else { this._doIdentify(); } } function value_95084(a0, a1, a2) { // fn#95084, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:7928, offset: 0x0213181a, size: 530 bytes, params: 4, frame: 25 var binding; var verbose; var moduleValue; var value2; var session_id; var value3; var connectionPath; const Date = global.Date; let value = Date.now(); value -= this.connectionStartTime; if (a1 === 'READY') { session_id = a0.session_id; this.sessionId = session_id; value3 = environment.__proto__; connectionPath = (require(12502) /* metro dependency 12502: GatewaySocketAnalytics */).getConnectionPath(a0); (importDefault(20) /* metro dependency 20: AppStartPerformance */).setServerTrace(connectionPath); binding = env1_14; binding.info('[READY] took ' + value + 'ms, as ' + session_id); binding.verbose('' + connectionPath); this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).SESSION_ESTABLISHED; this.gatewayBackoff.succeed(); this.iosGoingAwayEventCount = 0; this.setResumeUrl(a0.resume_gateway_url); } else if (a1 === 'READY_SUPPLEMENTAL') { value2 = environment.__proto__; env1_14.info('[READY_SUPPLEMENTAL] took ' + value + 'ms'); this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).SESSION_ESTABLISHED; this.gatewayBackoff.succeed(); this.iosGoingAwayEventCount = 0; } else if (a1 === 'RESUMED') { value = environment.__proto__; binding = env1_14; verbose = binding.verbose; moduleValue = require(12502) /* metro dependency 12502: GatewaySocketAnalytics */; Reflect.apply(verbose, binding, [moduleValue.getConnectionPath(a0)]); this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).SESSION_ESTABLISHED; this.gatewayBackoff.succeed(); this.iosGoingAwayEventCount = 0; } this.dispatcher.receiveDispatch(a0, a1, a2); } function value_95085() { // fn#95085, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:8737, offset: 0x02131a2c, size: 109 bytes, params: 1, frame: 21 const Date = global.Date; let value = Date.now(); value -= this.connectionStartTime; const binding = env1_14; binding.info('[RESUMED] took ' + value + 'ms, replayed ' + this.dispatcher.resumeAnalytics.numEvents + ' events, new seq: ' + this.seq); } function value_95089() { // fn#95089, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:9383, offset: 0x02131b3a, size: 99 bytes, params: 1, frame: 13 var value; const Date = global.Date; this.lastHeartbeatAckTime = Date.now(); this.heartbeatAck = true; if (this.expeditedHeartbeatTimeout !== null) { global.clearTimeout(this.expeditedHeartbeatTimeout); this.expeditedHeartbeatTimeout = null; value = environment.__proto__; env1_14.verbose('Expedited heartbeat succeeded'); } } function value_95090() { // fn#95090, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:9656, offset: 0x02131b9d, size: 159 bytes, params: 1, frame: 16 var environment; this._cleanup(function(a0) { return a0.close(4000); }); let value = environment.__proto__; const WILL_RECONNECT = (importDefault(12503) /* metro dependency 12503: ConnectionState */).WILL_RECONNECT; this.connectionState = WILL_RECONNECT; const value2 = this.gatewayBackoff.fail(_fun95092); const binding = env1_14; const warn = binding.warn; value = value2 / 1000; value = value.toFixed(2); Reflect.apply(warn, binding, ['[ACK TIMEOUT] reconnecting in ' + value + ' seconds.']); } function value_95093(a0, a1, a2) { // fn#95093, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:9898, offset: 0x02131c4f, size: 454 bytes, params: 4, frame: 30 var environment; var gatewayBackoff; var value2; var binding; const r4 = a0 || false; this._cleanup(); this.emit('close', {code: a1, reason: a2}); if (a1 === 4004) { value = environment.__proto__; this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).CLOSED; env1_14.warn('[WS CLOSED] because of authentication failure, marking as closed.'); return this._reset(r4, a1, a2); } this._tryDetectInvalidIOSToken(a1, a2, r4); value = environment.__proto__; const WILL_RECONNECT = (importDefault(12503) /* metro dependency 12503: ConnectionState */).WILL_RECONNECT; this.connectionState = WILL_RECONNECT; if (this.nextReconnectIsImmediate) { binding = env1_14; binding.info('[WS CLOSED] (' + r4.toString() + ', ' + a1 + ', ' + a2 + ') retrying immediately.'); this._connect(); } else { gatewayBackoff = this.gatewayBackoff; value2 = gatewayBackoff.fail(_fun95094); binding = env1_14; binding.info('[WS CLOSED] (' + r4.toString() + ', ' + a1 + ', ' + a2 + ') retrying in ' + (value2 / 1000).toFixed(2) + ' seconds.'); gatewayBackoff = this.gatewayBackoff; if (gatewayBackoff.fails > 4) { this._reset(r4, a1, a2); } } } function value_95095(a0, a1, a2) { // fn#95095, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:10573, offset: 0x02131e15, size: 238 bytes, params: 4, frame: 16 var environment; var iosGoingAwayEventCount; var HTTP; const env0_1 = a2; const value = environment.__proto__; if ((require(477) /* metro dependency 477: PlatformUtils */).isIOS() && this.token != null && a0 === 1001 && a1 === 'Stream end encountered') { iosGoingAwayEventCount = this.iosGoingAwayEventCount; this.iosGoingAwayEventCount = iosGoingAwayEventCount + 1; iosGoingAwayEventCount = this.iosGoingAwayEventCount; if (iosGoingAwayEventCount === 3) { HTTP = (require(507) /* metro dependency 507: HTTPUtils */).HTTP; HTTP.get({url: Endpoints.ME, headers: {authorization: this.token}, rejectWithError: false}).then(function({status}) { var defaultImport = importDefault(dependencyMap[25]); var IOS_INVALID_TOKEN_WORKAROUND_TRIGGERED = AnalyticEvents.IOS_INVALID_TOKEN_WORKAROUND_TRIGGERED; defaultImport.track(IOS_INVALID_TOKEN_WORKAROUND_TRIGGERED, {api_status_code: status}); }, _fun95097); } } } function value_95098(a0, a1, a2) { // fn#95098, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:11215, offset: 0x02131fe8, size: 137 bytes, params: 4, frame: 24 this.sessionId = null; this.seq = 0; const value = environment.__proto__; const binding = env1_14; binding.warn('[RESET] (' + a0.toString() + ', ' + a1 + ', ' + a2 + ')'); this.emit('disconnect', {wasClean: a0, code: a1, reason: a2}); } function value_95101() { // fn#95101, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:11781, offset: 0x0213210b, size: 192 bytes, params: 1, frame: 18 var environment; const heartbeatInterval = this.heartbeatInterval; const value = environment.__proto__; (importDefault(44) /* metro dependency 44 */)(heartbeatInterval != null, 'GatewaySocket: Heartbeat interval should never null here.'); if (this.initialHeartbeatTimeout !== null) { global.clearTimeout(this.initialHeartbeatTimeout); } if (this.heartbeater !== null) { global.clearInterval(this.heartbeater); this.heartbeater = null; } const setTimeout = global.setTimeout; const Math = global.Math; const floor = Math.floor; const Math2 = global.Math; this.initialHeartbeatTimeout = setTimeout(_fun95102, Reflect.apply(floor, Math, [Math2.random() * heartbeatInterval])); } function value_95105(a0) { // fn#95105, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:12802, offset: 0x02132290, size: 199 bytes, params: 2, frame: 16 var noop_95055Binding; const Emitter = (importDefault(566) /* metro dependency 566: flux */).Emitter; Emitter.resume(); this._stopHeartbeater(); this._clearHelloTimeout(); const webSocket = this.webSocket; this.webSocket = null; if (webSocket != null) { noop_95055Binding = noop_95055; webSocket.onopen = noop_95055Binding; webSocket.onmessage = noop_95055Binding; webSocket.onerror = noop_95055Binding; webSocket.onclose = noop_95055Binding; if (a0 != null) { a0(webSocket); } } this.gatewayBackoff.cancel(); this.compressionHandler.close(); const gatewayCompressionHandlerModule = require(12505) /* metro dependency 12505: GatewayCompressionHandler */; const getCompressionHandler = gatewayCompressionHandlerModule.getCompressionHandler; this.compressionHandler = Reflect.apply(getCompressionHandler, gatewayCompressionHandlerModule, [env1_15]); } function value_95106() { // fn#95106, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:13161, offset: 0x02132357, size: 263 bytes, params: 1, frame: 20 const RESUMING = (importDefault(12503) /* metro dependency 12503: ConnectionState */).RESUMING; this.connectionState = RESUMING; const dispatcher = this.dispatcher; const gatewaySocketAnalyticsModule = require(12502) /* metro dependency 12502: GatewaySocketAnalytics */; const createResumeAnalytics = gatewaySocketAnalyticsModule.createResumeAnalytics; const Date = global.Date; dispatcher.resumeAnalytics = Reflect.apply(createResumeAnalytics, gatewaySocketAnalyticsModule, [Date.now() - this.connectionStartTime]); const binding = env1_14; binding.info('[RESUME] resuming session ' + (this.sessionId ?? '') + ', seq: ' + this.seq); const send = this.send; const Opcode = (require(12495) /* metro dependency 12495: GatewaySocketOpCodes */).Opcode; const RESUME = Opcode.RESUME; Reflect.apply(send, this, [RESUME, {token: this.token, session_id: this.sessionId, seq: this.seq}, false]); } function* _fun95108() { // fn#95108, original name: ?anon_0_, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:13532, offset: 0x02132469, size: 913 bytes, params: 1, frame: 29 var r11; var r10; var r12; var value3; var binding; var binding2; var IDENTIFYING; var value4; var Promise; var all; var value5; var isCacheEnabled; var object; var value8; var isCacheEnabled2; var value14; var value16; var property; var property2; var connectionState; var token; var properties; var presence; var binding3; var getClientCapabilities; var object2; var length; var value18; if (true) { this.seq = 0; this.sessionId = null; value = this.handleIdentify(); if (value !== null) { value3 = environment.__proto__.__proto__; binding = env2_1; binding2 = env2_3; IDENTIFYING = binding(binding2[16]).IDENTIFYING; this.connectionState = IDENTIFYING; value4 = global.Date.now(); this.identifyStartTime = value4; Promise = global.Promise; all = Promise.all; binding = env2_0; value5 = binding(binding2[28]); isCacheEnabled = value5.isCacheEnabled; r11 = Reflect.apply(isCacheEnabled, value5, []) ? env2_1(env2_3[29]).getCommittedVersions() : {}; object = [r11]; binding = env2_0; value8 = binding(env2_3[28]); isCacheEnabled = value8.isCacheEnabled; r11 = Reflect.apply(isCacheEnabled, value8, []) ? env2_1(env2_3[30]).getCommittedVersions() : {}; object[1] = r11; binding = env2_0; isCacheEnabled2 = binding(env2_3[28]).isCacheEnabled(); r11 = isCacheEnabled2 ? env2_1(env2_3[31]).canUseGuildVersions() : !!isCacheEnabled2; object[2] = r11; yield Reflect.apply(all, Promise, [object]); value14 = undefined; if (false) { return value14; } value16 = env2_4(value14, 3); property = value16[0]; property2 = value16[1]; r10 = value16[2] ? {guild_versions: property, highest_last_message_id: property2.highest_last_message_id, read_state_version: property2.read_state_version, user_guild_settings_version: property2.user_guild_settings_version, user_settings_version: property2.user_settings_version, private_channels_version: property2.private_channels_version, api_code_version: property2.api_code_version, initial_guild_id: property2.initial_guild_id} : {guild_versions: {}}; connectionState = this.connectionState; binding = env2_1; IDENTIFYING = binding(env2_3[16]).IDENTIFYING; if (connectionState !== IDENTIFYING) { env2_14.warn('Skipping identify because connectionState or identifyStartTime has changed'); } else if (this.identifyStartTime === value4) { token = value.token; properties = value.properties; r12 = properties !== undefined ? properties : {}; presence = value.presence; this.token = token; binding = env2_14; binding.verbose('[IDENTIFY]'); object = {token: token}; binding = env2_0; binding3 = env2_3; value = binding(binding3[32]); getClientCapabilities = value.getClientCapabilities; object2 = {}; object2.useChannelObfuscation = binding(binding3[33]).isChannelMetadataObfuscationEnabled('GatewaySocket'); object.capabilities = Reflect.apply(getClientCapabilities, value, [object2]); object.properties = r12; object.presence = presence; object.compress = this.compressionHandler.usesLegacyCompression(); object.client_state = r10; value = global.JSON.stringify(object); length = value.length; this.identifyUncompressedByteSize = length; value18 = env2_2(binding3[34]); length = value18.deflate(value).length; this.identifyCompressedByteSize = length; this.identifyCount = this.identifyCount + 1; this.send(binding(binding3[14]).Opcode.IDENTIFY, object, false); binding = env2_1; value = binding(binding3[25]); value.track(env2_12.SESSION_START_CLIENT, {}); } else { env2_14.warn('Skipping identify because connectionState or identifyStartTime has changed'); } } else { this._handleClose(true, 4004, 'No connection info provided'); } } } function value_95110() { // fn#95110, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:15184, offset: 0x021327fa, size: 188 bytes, params: 1, frame: 16 var Date; this.seq = 0; this.sessionId = null; let value = this.handleIdentify(); if (value !== null) { this.token = value.token; value = environment.__proto__; this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).IDENTIFYING; Date = global.Date; this.identifyStartTime = Date.now(); this.identifyCount = this.identifyCount + 1; env1_14.verbose('[IDENTIFY, fast-connect]'); this._updateLastHeartbeatAckTime(); } else { this._handleClose(true, 4004, 'No connection info provided'); } } function value_95111() { // fn#95111, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:15559, offset: 0x021328b6, size: 101 bytes, params: 1, frame: 11 var value2; const Date = global.Date; let value = Date.now(); if (this.sessionId === null) { this._doIdentify(); } else if (this.lastHeartbeatAckTime == null) { this._doResume(); } else { value -= this.lastHeartbeatAckTime; value2 = environment.__proto__; if (value <= env1_18) { this._doResume(); } else { this._doIdentify(); } } this._updateLastHeartbeatAckTime(); } function value_95118() { // fn#95118, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:16533, offset: 0x02132a4a, size: 82 bytes, params: 1, frame: 15 const connectionState = this.connectionState; const value = environment.__proto__; const SESSION_ESTABLISHED = (importDefault(12503) /* metro dependency 12503: ConnectionState */).SESSION_ESTABLISHED; return connectionState === SESSION_ESTABLISHED || this.connectionState === (importDefault(12503) /* metro dependency 12503: ConnectionState */).RESUMING; } function value_95119() { // fn#95119, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:16672, offset: 0x02132a9c, size: 118 bytes, params: 1, frame: 16 const connectionState = this.connectionState; const value = environment.__proto__; const IDENTIFYING = (importDefault(12503) /* metro dependency 12503: ConnectionState */).IDENTIFYING; let r0 = connectionState === IDENTIFYING || this.connectionState === (importDefault(12503) /* metro dependency 12503: ConnectionState */).RESUMING; r0 = !r0 ? this.connectionState === (importDefault(12503) /* metro dependency 12503: ConnectionState */).SESSION_ESTABLISHED : r0; return r0; } function value_95120() { // fn#95120, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:16852, offset: 0x02132b12, size: 108 bytes, params: 1, frame: 14 var r0; const isClosed = this.isClosed(); const binding = env1_14; if (isClosed) { binding.verbose('.connect() called, new state is WILL_RECONNECT'); this.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).WILL_RECONNECT; this._connect(); r0 = true; } else { binding.error('Cannot start a new connection, connection state is not closed'); r0 = false; } return r0; } function value_95121({action, error, metricAction, sentry}) { // fn#95121, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:17137, offset: 0x02132b7e, size: 753 bytes, params: 2, frame: 26 var environment; const value = environment.__proto__; const binding = env1_14; binding.error('resetSocketAndClearCacheOnError during ' + action + ': ' + error.message, error.stack); const value3 = (require(652) /* metro dependency 652: ClientModDetectionUtils */).usesClientMods(); const defaultImport = importDefault(4826) /* metro dependency 4826: MonitoringAgent */; const increment = defaultImport.increment; const MetricEvents = (require(4831) /* metro dependency 4831: MetricEvents */).MetricEvents; const SOCKET_CRASHED = MetricEvents.SOCKET_CRASHED; Reflect.apply(increment, defaultImport, [{name: SOCKET_CRASHED, tags: ['action:' + (metricAction ?? action), 'modded_client:' + value3]}, true]); if (sentry !== false) { (importDefault(1216) /* metro dependency 1216: SentryUtilsNative */).captureException(error, {tags: {socketCrashedAction: action}}); } const defaultImport3 = importDefault(683) /* metro dependency 683: AnalyticsUtils */; const track = defaultImport3.track; const GATEWAY_SOCKET_RESET = AnalyticEvents.GATEWAY_SOCKET_RESET; Reflect.apply(track, defaultImport3, [GATEWAY_SOCKET_RESET, {error_message: error.message, error_stack: error.stack, has_client_mods: value3, action: action}]); this._cleanup(function(a0) { return a0.close(); }); this._reset(true, 1000, 'Resetting socket due to error.'); this.dispatcher.clear(); const WILL_RECONNECT = (importDefault(12503) /* metro dependency 12503: ConnectionState */).WILL_RECONNECT; this.connectionState = WILL_RECONNECT; this.dispatchExceptionBackoff.cancel(); if (this.dispatchExceptionBackoff._fails === 0) { env1_14.verbose('Triggering fast reconnect'); this.dispatchExceptionBackoff.fail(function() { }); global.setTimeout(_fun95124, 0); } else { this.dispatchExceptionBackoff.fail(_fun95125); } this.didForceClearGuildHashes = true; (importDefault(694) /* metro dependency 694: Dispatcher */).dispatch({type: 'CLEAR_CACHES', reason: 'Socket reset during ' + action}); (importDefault(694) /* metro dependency 694: Dispatcher */).dispatch({type: 'LIBDISCORE_RESET'}); global.clearTimeout(this.dispatchSuccessTimer); this.dispatchSuccessTimer = global.setTimeout(_fun95126, 2 * env1_19); } function value_95128() { // fn#95128, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:18522, offset: 0x02132ef8, size: 230 bytes, params: 1, frame: 19 let value = a0; const value2 = undefined; const r0 = value !== value2 ? value : false; var env0_1; value = this.isClosed(); const binding = env1_14; if (value) { binding.verbose('close() called, but socket is already closed.'); if (!r0) { this.sessionId = null; this.token = null; } } else { binding.info('Closing connection, current state is ' + this.connectionState); env0_1 = r0 ? 4000 : value2; this._cleanup(_fun95129); var CLOSED = (importDefault(12503) /* metro dependency 12503: ConnectionState */).CLOSED; this.connectionState = CLOSED; if (!r0) { this.sessionId = null; this.token = null; global.setImmediate(_fun95130); } } return value2; } function value_95132(a0) { // fn#95132, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:19062, offset: 0x02133043, size: 326 bytes, params: 2, frame: 22 var environment; var binding; var verbose; var connectionState; let value = a1; const value2 = a2; const value3 = a3; const r9 = value !== undefined ? value : ''; if (!this.isClosed()) { if (this.isConnected()) { value = environment.__proto__; binding = env1_14; value = ''; binding.verbose('Performing an expedited heartbeat ' + (r9 != null ? value === r9 ? value : 'reason: ' + r9 : value)); this.heartbeatAck = false; this._sendHeartbeat(); if (this.expeditedHeartbeatTimeout !== null) { global.clearTimeout(this.expeditedHeartbeatTimeout); } this.expeditedHeartbeatTimeout = global.setTimeout(_fun95133, a0); } else if (!(value2 !== undefined) || value2) { this.resetBackoff(r9, !(value3 !== undefined) || value3); } else { value = environment.__proto__; binding = env1_14; verbose = binding.verbose; connectionState = this.connectionState; value = ''; Reflect.apply(verbose, binding, ['Expedited heartbeat requested, but, connection state is ' + connectionState + ' and reconnectImmediately was not requested ' + (r9 != null ? value === r9 ? value : 'reason: ' + r9 : value)]); } } } function value_95134() { // fn#95134, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:19726, offset: 0x021331b6, size: 200 bytes, params: 1, frame: 20 let value = a0; const value2 = a1; const r5 = value !== undefined ? value : ''; let r1 = !(value2 !== undefined) || value2; value = environment.__proto__; const binding = env1_14; const value3 = ''; binding.verbose('Connection has reset backoff' + (r5 != null ? value3 === r5 ? value3 : ' for reason: ' + r5 : value3)); this.gatewayBackoff.succeed(); this.iosGoingAwayEventCount = 0; this.nextReconnectIsImmediate = true; if (this.willReconnect()) { this._connect(); } else { r1 = r1 && this.connectionState !== (importDefault(12503) /* metro dependency 12503: ConnectionState */).SESSION_ESTABLISHED; if (r1) { this._handleClose(true, 0, r5); } } } function GatewaySocketSend(a0, a1, a2) { // fn#95062, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:1515, owner: GatewaySocket.send, offset: 0x02130883, size: 222 bytes, params: 4, frame: 21 var binding; var verboseDangerously; var Opcode; var pack; var value2; var value3; var isSessionEstablished; var warn; var HermesInternal; var concat; var webSocket; var value4; var send; var error; reducibleJoin2: while (true) { if (DeveloperOptionsStore.isLoggingGatewayEvents) { binding = env2_14; verboseDangerously = binding.verboseDangerously; Opcode = (require(12495) /* metro dependency 12495: GatewaySocketOpCodes */).Opcode; Reflect.apply(verboseDangerously, binding, ['~>', a0, Opcode[a0], a1]); break reducibleJoin2; } break reducibleJoin2; } reducibleJoin5: while (true) { reduciblePort15: while (true) { exceptionLanding14: while (true) { binding = env2_15; pack = binding.pack; value2 = Reflect.apply(pack, binding, [{op: a0, d: a1}]); if (a2) { value3 = environment; binding = env0_0; isSessionEstablished = binding.isSessionEstablished; if (Reflect.apply(isSessionEstablished, binding, [])) { break reducibleJoin5; } binding = env2_14; warn = binding.warn; HermesInternal = global.HermesInternal; concat = HermesInternal.concat; Reflect.apply(warn, binding, ['Attempted to send while not being in a connected state opcode: ' + a0]); break reduciblePort15; } break reducibleJoin5; } break reduciblePort15; } return undefined; } try { binding = env0_0; } catch (error) { break exceptionLanding14; } try { webSocket = binding.webSocket; } catch (error) { break exceptionLanding14; } try { value4 = webSocket == null; } catch (error) { break exceptionLanding14; } reducibleJoin15: while (true) { if (value4) { break reducibleJoin15; } try { binding = env0_0; } catch (error) { break exceptionLanding14; } try { webSocket = binding.webSocket; } catch (error) { break exceptionLanding14; } try { send = webSocket.send; } catch (error) { break exceptionLanding14; } try { Reflect.apply(send, webSocket, [value2]); } catch (error) { break exceptionLanding14; } break reducibleJoin15; } } function _fun95071() { // fn#95071, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:4143, offset: 0x02130e41, size: 97 bytes, params: 1, frame: 16 const Date = global.Date; let value = Date.now(); const binding = env0_0; value -= binding.connectionStartTime; const _handleClose = binding._handleClose; value = 'The connection timed out after ' + value + ' ms - did not receive OP_HELLO in time.'; Reflect.apply(_handleClose, binding, [false, 0, value]); binding.setResumeUrl(null); } function newOrTakeoverWebSocket({gatewayURL, newCallback, onOpen, onMessage, onError, onClose}) { // fn#95072, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:4458, owner: value_95069.newOrTakeoverWebSocket, offset: 0x02130ea2, size: 637 bytes, params: 2, frame: 36 var environment; var r17; var r1; var messages; var r8; var r9; var open; var ws; var state; var userId; var object3; var log; var object4; var identify; var clientState; let value = environment.__proto__.__proto__; let binding = env2_14; binding.enableNativeLogger(true); const _ws = global.window._ws; global.window._ws = null; if (_ws != null) { ws = _ws.ws; state = _ws.state; userId = state.userId; r17 = userId != null && env2_16 != null; r17 = r17 && userId !== env2_16; state = _ws.state; if (state.gateway !== gatewayURL) { binding = env2_14; binding.verbose('[FAST CONNECT] gatewayURL mismatch: ' + _ws.state.gateway + ' !== ' + gatewayURL); ws.close(1000); r1 = null; messages = null; r8 = null; r9 = false; open = false; } else if (r17) { binding = env2_14; binding.log('[FAST CONNECT] refusing to adopt socket: identified user ' + userId + ' does not match switch target ' + env2_16); ws.close(1000); r1 = null; messages = null; r8 = null; r9 = false; open = false; } else { object3 = {}; state = _ws.state; copyDataProperties(object3, state, undefined); messages = object3.messages; if (messages != null) { object3.messages = object3.messages.map(function(a0) { var r5; var r0; var object; var value = a0; if (value.data == null) { r0 = value; } else if (typeof value.data !== 'string') { r0 = value; } else { object = {}; copyDataProperties(object, value, r5); value = value.data.substring(0, 100); object['data'] = value; r0 = object; } return r0; }); } binding = env2_14; log = binding.log; object4 = {}; copyDataProperties(object4, object3, undefined); messages = object3.messages; object4['messages'] = messages?.length; Reflect.apply(log, binding, ['[FAST CONNECT] successfully took over websocket, state:', object4]); state = _ws.state; open = state.open; state = _ws.state; identify = state.identify; state = _ws.state; messages = state.messages; state = _ws.state; clientState = state.clientState; r1 = ws; r8 = clientState; r9 = identify; } } else { r1 = undefined; messages = null; r8 = null; r9 = false; open = false; } if (r1 == null) { value = (importDefault(12494) /* metro dependency 12494: createWebSocketAndroid */)(gatewayURL); value.binaryType = 'arraybuffer'; r1 = value; } newCallback(r1); if (open) { onOpen(r9, r8); } if (messages != null) { messages.forEach(onMessage); } r1.onopen = function() { return onOpen(identify, clientState); }; r1.onmessage = onMessage; r1.onclose = onClose; r1.onerror = onError; } function newCallback(a0) { // fn#95075, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:5499, owner: value_95069.newCallback, offset: 0x0213118c, size: 39 bytes, params: 2, frame: 11 const binding = env0_0; binding.webSocket = a0; binding.compressionHandler.bindWebSocket(a0); } function onOpen(a0) { // fn#95076, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:5569, owner: value_95069.onOpen, offset: 0x021311b3, size: 200 bytes, params: 2, frame: 23 const value = environment.__proto__.__proto__; (importDefault(20) /* metro dependency 20: AppStartPerformance */).mark('🌐', 'GatewaySocket.onOpen ' + a0); const Date = global.Date; const value3 = Date.now(); let binding = env0_0; const value5 = value3 - binding.connectionStartTime; const binding2 = env2_14; binding2.info('[CONNECTED] ' + env0_1.toString() + ' in ' + value5 + ' ms'); binding.isFastConnect = a0; binding = env0_0; if (a0) { binding._doFastConnectIdentify(); } else { binding._doResumeOrIdentify(); } } function _fun95077(a0, a1) { // fn#95077, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:5889, offset: 0x0213127b, size: 996 bytes, params: 3, frame: 26 var r15; var r4; var defaultImport; var mark; var property; var object; var verboseDangerously; var items2; var _handleDispatch; let Date = global.Date; let value = Date.now(); let binding = env2_15; const {op, s, t, d} = binding.unpack(a0); const Opcode = (require(12495) /* metro dependency 12495: GatewaySocketOpCodes */).Opcode; const DISPATCH = Opcode.DISPATCH; if (op !== DISPATCH) { defaultImport = importDefault(20) /* metro dependency 20: AppStartPerformance */; mark = defaultImport.mark; property = Opcode[op]; Reflect.apply(mark, defaultImport, ['🌐', 'GatewaySocket.onMessage ' + op + ' ' + property]); r15 = property; } if (DeveloperOptionsStore.isLoggingGatewayEvents) { object = [op]; if (op === Opcode.DISPATCH) { object.push(t); } object.push(d); binding = env2_14; verboseDangerously = binding.verboseDangerously; items2 = ['<~']; arraySpread(items2, object, 1, r15); apply(verboseDangerously, items2, binding, r15); } Date = global.Date; const value5 = Date.now() - value; const value6 = t === 'READY'; if (value6) { (importDefault(14) /* metro dependency 14: TTITracker */).parseReady.set(value, value5); } else if (t === 'READY_SUPPLEMENTAL') { (importDefault(14) /* metro dependency 14: TTITracker */).parseReadySupplemental.set(value, value5); } else if (value5 > 10) { (importDefault(20) /* metro dependency 20: AppStartPerformance */).mark('🌐', 'Parse ' + t, value5); } value = null; if (value != s) { env0_0.seq = s; } const HELLO = Opcode.HELLO; if (HELLO === op) { binding = env0_0; binding._clearHelloTimeout(); binding._handleHello(d); } else if (Opcode.RECONNECT === op) { env0_0._handleReconnect(); } else if (Opcode.INVALID_SESSION === op) { env0_0._handleInvalidSession(d); } else if (Opcode.HEARTBEAT === op) { env0_0._handleHeartbeatReceive(); } else if (Opcode.HEARTBEAT_ACK === op) { env0_0._handleHeartbeatAck(d); } else if (Opcode.DISPATCH === op) { binding = env0_0; _handleDispatch = binding._handleDispatch; if (value6) { object = {compressed_byte_size: a1}; object.uncompressed_byte_size = byteSize(a0); object.compression_algorithm = env0_0.compressionHandler.getAlgorithm(); object.packing_algorithm = env2_15.getName(); object.unpack_duration_ms = value5; r4 = object; } else { r4 = value; } Reflect.apply(_handleDispatch, binding, [d, t, r4]); } else { env2_14.info('Unhandled op ' + op); } env0_0._sendHeartbeatIfDue(); } function value_95069OnError() { // fn#95078, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:7054, owner: value_95069.onError, offset: 0x0213165f, size: 80 bytes, params: 1, frame: 16 const binding = env0_0; binding.setResumeUrl(null); const value = environment.__proto__.__proto__; (importDefault(4488) /* metro dependency 4488: CrossPlatformNativeUtilsNative */).flushDNSCache(); binding._handleClose(false, 0, 'An error with the websocket occurred'); } function value_95069OnClose({wasClean, code, reason}) { // fn#95079, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:7180, owner: value_95069.onClose, offset: 0x021316af, size: 42 bytes, params: 2, frame: 15 return env0_0._handleClose(wasClean, code, reason); } function _fun95092() { // fn#95092, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:9777, offset: 0x02131c3c, size: 19 bytes, params: 1, frame: 9 return env0_0._connect(); } function _fun95097({status}) { // fn#95097, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:10915, offset: 0x02131f42, size: 166 bytes, params: 2, frame: 17 var binding; var value2; if (status === 401) { binding = env0_0; value2 = environment.__proto__.__proto__; binding.connectionState = (importDefault(12503) /* metro dependency 12503: ConnectionState */).CLOSED; env2_14.warn('[WS CLOSED] because of manual authentication failure, marking as closed.'); binding._reset(importDefault, 4004, 'invalid token manually detected'); } const defaultImport = importDefault(683) /* metro dependency 683: AnalyticsUtils */; const track = defaultImport.track; const IOS_INVALID_TOKEN_WORKAROUND_TRIGGERED = AnalyticEvents.IOS_INVALID_TOKEN_WORKAROUND_TRIGGERED; Reflect.apply(track, defaultImport, [IOS_INVALID_TOKEN_WORKAROUND_TRIGGERED, {api_status_code: status}]); } function _fun95102() { // fn#95102, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:12101, offset: 0x021321cb, size: 77 bytes, params: 1, frame: 14 const binding = env0_0; binding.initialHeartbeatTimeout = null; binding.heartbeatAck = true; binding.heartbeater = global.setInterval(binding._doHeartbeatInterval.bind(binding), heartbeatInterval); binding._doHeartbeatInterval(); } function _fun95126() { // fn#95126, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:18249, offset: 0x02132e7e, size: 25 bytes, params: 1, frame: 9 return env0_0.dispatchExceptionBackoff.succeed(); } function _fun95129(a0) { // fn#95129, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:18774, offset: 0x02132fde, size: 23 bytes, params: 2, frame: 11 return a0.close(env0_1); } function _fun95130() { // fn#95130, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:18881, offset: 0x02132ff5, size: 38 bytes, params: 1, frame: 15 env0_0._reset(true, 1000, 'Disconnect requested by user'); } function _fun95133() { // fn#95133, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12681:19393, offset: 0x02133189, size: 45 bytes, params: 1, frame: 10 const binding = env0_0; binding.expeditedHeartbeatTimeout = null; if (binding.heartbeatAck === false) { env0_0._handleHeartbeatTimeout(); } }