UNPKG

jka-core

Version:

Library for working with Jedi Academy servers

68 lines (67 loc) 2.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.basicRequest = void 0; const dgram_1 = require("dgram"); const getIpAndPort_validator_1 = require("../validation/getIpAndPort.validator"); const constants_1 = require("../constants"); /** * * @param params Object with keys: * request - request to the server, * ip - ip or domain name of the server * port - port (number 1-65534) * timeout - timer in secs after which request would be interrupted (min: 2, default: 10) * @returns string with server response or throws an error */ const basicRequest = (params) => { const { ip, port, timeout, request } = validateAndParseInput(params); return new Promise((resolve, reject) => { const packet = Buffer.from(`\xFF\xFF\xFF\xFF${request}`, 'latin1'); const socket = (0, dgram_1.createSocket)('udp4'); let isSocketClosed = false; const msg = []; const listener = (response) => msg.push(response.toString()); const connection = socket.once('message', (response) => { msg.push(response.toString()); // Coming below is required because response can come as a load of packets, not just one socket.on('message', listener); setTimeout(() => { connection.off('message', listener); if (!isSocketClosed) socket.close(); resolve(msg.join('')); }, 2000); }); socket.on('error', (err) => { console.error('jka-core basic request error: ', err); if (!isSocketClosed) socket.close(); reject('No response!'); }); socket.on('close', () => { isSocketClosed = true; }); socket.send(packet, 0, packet.length, port, ip); setTimeout(() => { connection.off('message', listener); if (!isSocketClosed) socket.close(); reject('No response!'); }, timeout * 1000); }); }; exports.basicRequest = basicRequest; function validateAndParseInput(params) { const noParams = []; if (!params.server) noParams.push('server'); if (!params.request) noParams.push('request'); if (noParams.length > 0) throw new Error('Parameter "ip" is required!'); if (params.timeout && params.timeout < constants_1.MIN_REQUEST_TIMEOUT) throw new Error('Parameter "timeout" must be at least 1 second!'); const { ip, port } = (0, getIpAndPort_validator_1.getIpAndPort)(params.server); const timeout = (params === null || params === void 0 ? void 0 : params.timeout) || constants_1.DEFAULT_REQUEST_TIMEOUT; return { ip, port, timeout, request: params.request }; }