Pokemon_server / dist /server /loginserver.js
Jofthomas's picture
Upload 4781 files
5c2ed06 verified
"use strict";
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