UNPKG

@xpresser/events-server

Version:

Xpresser's Official Events Server Plugin.

105 lines (104 loc) 3.04 kB
"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; }