Spaces:
Paused
Paused
| ; | |
| var __defProp = Object.defineProperty; | |
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | |
| var __getOwnPropNames = Object.getOwnPropertyNames; | |
| var __hasOwnProp = Object.prototype.hasOwnProperty; | |
| var __export = (target, all) => { | |
| for (var name in all) | |
| __defProp(target, name, { get: all[name], enumerable: true }); | |
| }; | |
| var __copyProps = (to, from, except, desc) => { | |
| if (from && typeof from === "object" || typeof from === "function") { | |
| for (let key of __getOwnPropNames(from)) | |
| if (!__hasOwnProp.call(to, key) && key !== except) | |
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | |
| } | |
| return to; | |
| }; | |
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | |
| var loginserver_exports = {}; | |
| __export(loginserver_exports, { | |
| LoginServer: () => LoginServer | |
| }); | |
| module.exports = __toCommonJS(loginserver_exports); | |
| var import_lib = require("../lib"); | |
| /** | |
| * Login server abstraction layer | |
| * Pokemon Showdown - http://pokemonshowdown.com/ | |
| * | |
| * This file handles communicating with the login server. | |
| * | |
| * @license MIT | |
| */ | |
| const LOGIN_SERVER_TIMEOUT = 3e4; | |
| const LOGIN_SERVER_BATCH_TIME = 1e3; | |
| class TimeoutError extends Error { | |
| } | |
| TimeoutError.prototype.name = TimeoutError.name; | |
| function parseJSON(json) { | |
| if (json.startsWith("]")) | |
| json = json.substr(1); | |
| const data = { error: null, json: null }; | |
| try { | |
| data.json = JSON.parse(json); | |
| } catch (err) { | |
| data.error = err.message; | |
| } | |
| return data; | |
| } | |
| class LoginServerInstance { | |
| constructor() { | |
| this.uri = Config.loginserver; | |
| this.requestQueue = []; | |
| this.requestTimer = null; | |
| this.requestLog = ""; | |
| this.lastRequest = 0; | |
| this.openRequests = 0; | |
| this.disabled = false; | |
| } | |
| async instantRequest(action, data = null) { | |
| if (this.openRequests > 5) { | |
| return Promise.resolve( | |
| [null, new RangeError("Request overflow")] | |
| ); | |
| } | |
| this.openRequests++; | |
| try { | |
| const request = (0, import_lib.Net)(this.uri); | |
| const buffer = await request.get({ | |
| query: { | |
| ...data, | |
| act: action, | |
| serverid: Config.serverid, | |
| servertoken: Config.servertoken, | |
| nocache: new Date().getTime() | |
| } | |
| }); | |
| const json = parseJSON(buffer); | |
| this.openRequests--; | |
| if (json.error) { | |
| return [null, new Error(json.error)]; | |
| } | |
| this.openRequests--; | |
| return [json.json, null]; | |
| } catch (error) { | |
| this.openRequests--; | |
| return [null, error]; | |
| } | |
| } | |
| request(action, data = null) { | |
| if (this.disabled) { | |
| return Promise.resolve( | |
| [null, new Error(`Login server connection disabled.`)] | |
| ); | |
| } | |
| if (this[`${action}Server`]) { | |
| return this[`${action}Server`].request(action, data); | |
| } | |
| const actionData = data || {}; | |
| actionData.act = action; | |
| return new Promise((resolve) => { | |
| this.requestQueue.push([actionData, resolve]); | |
| this.requestTimerPoke(); | |
| }); | |
| } | |
| requestTimerPoke() { | |
| if (this.openRequests || this.requestTimer || !this.requestQueue.length) | |
| return; | |
| this.requestTimer = setTimeout(() => void this.makeRequests(), LOGIN_SERVER_BATCH_TIME); | |
| } | |
| async makeRequests() { | |
| this.requestTimer = null; | |
| const requests = this.requestQueue; | |
| this.requestQueue = []; | |
| if (!requests.length) | |
| return; | |
| const resolvers = []; | |
| const dataList = []; | |
| for (const [data, resolve] of requests) { | |
| resolvers.push(resolve); | |
| dataList.push(data); | |
| } | |
| this.requestStart(requests.length); | |
| try { | |
| const request = (0, import_lib.Net)(`${this.uri}action.php`); | |
| let buffer = await request.post({ | |
| body: { | |
| serverid: Config.serverid, | |
| servertoken: Config.servertoken, | |
| nocache: new Date().getTime(), | |
| json: JSON.stringify(dataList) | |
| }, | |
| timeout: LOGIN_SERVER_TIMEOUT | |
| }); | |
| const data = parseJSON(buffer).json; | |
| if (buffer.startsWith(`[{"actionsuccess":true,`)) { | |
| buffer = "stream interrupt"; | |
| } | |
| if (!data) { | |
| if (buffer.includes("<")) | |
| buffer = "invalid response"; | |
| throw new Error(buffer); | |
| } | |
| for (const [i, resolve] of resolvers.entries()) { | |
| resolve([data[i], null]); | |
| } | |
| this.requestEnd(); | |
| } catch (error) { | |
| for (const resolve of resolvers) { | |
| resolve([null, error]); | |
| } | |
| this.requestEnd(error); | |
| } | |
| } | |
| requestStart(size) { | |
| this.lastRequest = Date.now(); | |
| this.requestLog += ` | ${size} rqs: `; | |
| this.openRequests++; | |
| } | |
| requestEnd(error) { | |
| this.openRequests = 0; | |
| if (error && error instanceof TimeoutError) { | |
| this.requestLog += "TIMEOUT"; | |
| } else { | |
| this.requestLog += `${(Date.now() - this.lastRequest) / 1e3}s`; | |
| } | |
| this.requestLog = this.requestLog.substr(-1e3); | |
| this.requestTimerPoke(); | |
| } | |
| getLog() { | |
| if (!this.lastRequest) | |
| return this.requestLog; | |
| return `${this.requestLog} (${Chat.toDurationString(Date.now() - this.lastRequest)} since last request)`; | |
| } | |
| } | |
| const LoginServer = Object.assign(new LoginServerInstance(), { | |
| TimeoutError, | |
| ladderupdateServer: new LoginServerInstance(), | |
| prepreplayServer: new LoginServerInstance() | |
| }); | |
| (0, import_lib.FS)("./config/custom.css").onModify(() => { | |
| void LoginServer.request("invalidatecss"); | |
| }); | |
| if (!Config.nofswriting) { | |
| void LoginServer.request("invalidatecss"); | |
| } | |
| //# sourceMappingURL=loginserver.js.map | |