UNPKG

socket.io-requests

Version:

Better requests functionality for Socket.io - Server & Client.

87 lines (77 loc) 2.38 kB
"use strict"; const REQUESTPREFIX = "SioR-Request-"; const RESPONSEPREFIX = "SioR-Response-"; class SocketRequest { timeout = 30000; constructor(socket) { this.socket = socket; this.createFunctions(); } createFunctions() { this.createSendFunction(); this.createOnRequestFunction(); this.createOnAnyRequestFunction(); } createSendFunction() { this.socket.sendRequest = (event, bodyData, timeout = this.timeout) => new Promise((resolve, reject) => { const request = { uuid: SocketRequest.createUUID(), event: event, body: bodyData, }; this.socket.emit(REQUESTPREFIX + event, request); let active = true; setTimeout(() => { active = false; reject(`Timeout. The request has expired after ${timeout} ms.`); }, timeout); this.socket.on(RESPONSEPREFIX + request.uuid, (response) => { if (active) resolve(response); }); }); } createOnRequestFunction() { this.socket.onRequest = (event, handler) => { this.socket.on(REQUESTPREFIX + event, (data) => { handler(data.body, (responseData) => { this.socket.emit(RESPONSEPREFIX + data.uuid, responseData); }, data.uuid); }); }; } createOnAnyRequestFunction() { this.socket.onAnyRequest = (handler) => { this.socket.onAny((event, data) => { if (event.includes(REQUESTPREFIX)) { handler(data.event, data.body, (responseData) => { this.socket.emit(RESPONSEPREFIX + data.uuid, responseData); }, data.uuid); } }); }; } static createUUID() { let d = new Date().getTime(); let d2 = (typeof performance !== "undefined" && performance.now && performance.now() * 1000) || 0; return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace( /[xy]/g, function (c) { let r = Math.random() * 16; if (d > 0) { r = (d + r) % 16 | 0; d = Math.floor(d / 16); } else { r = (d2 + r) % 16 | 0; d2 = Math.floor(d2 / 16); } return (c === "x" ? r : (r & 0x3) | 0x8).toString(16); } ); } } module.exports = (socket) => new SocketRequest(socket);