jka-core
Version:
Library for working with Jedi Academy servers
68 lines (67 loc) • 2.77 kB
JavaScript
;
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 };
}