@xpresser/events-server
Version:
Xpresser's Official Events Server Plugin.
105 lines (104 loc) • 3.04 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class PlaneSocket {
constructor(socket) {
this.keepAliveRetries = 0;
this.keepAlive = false;
this.events = {};
if (typeof socket === "function") {
this.socket = socket();
this.socketProvider = socket;
}
else {
this.socket = socket;
}
}
$keepAlive() {
if (this.socketProvider)
this.keepAlive = true;
return this;
}
$setupListeners() {
if (this.keepAlive) {
if (this.keepAliveRetries >= 5) {
clearIntervalConnect();
return;
}
this.socket.on("connect", () => {
this.keepAliveRetries = 0;
clearIntervalConnect();
});
this.socket.on("error", () => {
launchIntervalConnect(this);
});
this.socket.on("close", () => {
launchIntervalConnect(this);
});
this.socket.on("end", () => {
launchIntervalConnect(this);
});
}
this.socket.on("data", (data) => {
if (!data)
return;
let chunks = data.toString().split("\n");
for (let chunk of chunks) {
let parsed;
chunk = chunk.trim();
if (!chunk)
continue;
try {
const { __ps__, ...others } = JSON.parse(chunk);
// Check if data is from a plane socket lib.
if (!__ps__)
return console.error(`Cannot parse non PlaneSocket data!`);
parsed = others;
}
catch (e) {
return console.error({ e, chunk });
}
if (this.events.hasOwnProperty(parsed.event)) {
this.events[parsed.event](...parsed.args);
}
}
});
}
on(event, fn) {
this.events[event] = fn;
return this;
}
emit(event, ...args) {
const data = JSON.stringify({
__ps__: true,
event,
args
});
this.socket.write(data + "\n");
return this;
}
}
exports.default = PlaneSocket;
let intervalConnect = false;
/**
* This function retries connecting to server 5 times.
* @param ps
*/
function launchIntervalConnect(ps) {
// return if an interval has already been set.
if (intervalConnect)
return;
intervalConnect = setInterval(() => {
// Reset socketProvider.
ps.socket = ps.socketProvider();
// Increment Retires
ps.keepAliveRetries++;
// Listen for events
ps.$setupListeners();
}, 5000);
}
function clearIntervalConnect() {
if (false === intervalConnect)
return;
clearInterval(intervalConnect);
intervalConnect = false;
}