socket.io-requests
Version:
Better requests functionality for Socket.io - Server & Client.
87 lines (77 loc) • 2.38 kB
JavaScript
;
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);