UNPKG

dlovely-websocket

Version:

WebSocket For Dlovely

79 lines (78 loc) 2.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPongFrame = exports.createPingFrame = exports.createCloseFrame = exports.createBinaryFrame = exports.createTextFrame = void 0; function createTextFrame(data, masked = false) { const payload = Buffer.from(data); const meta = generateMetaData(true, 1, masked, payload); return Buffer.concat([meta, payload], meta.length + payload.length); } exports.createTextFrame = createTextFrame; function createBinaryFrame(data, masked = false, first = true, fin = true) { let payload; if (masked) { payload = Buffer.alloc(data.length); data.copy(payload); } else payload = data; const meta = generateMetaData(fin, first ? 2 : 0, masked, payload); return Buffer.concat([meta, payload], meta.length + payload.length); } exports.createBinaryFrame = createBinaryFrame; function createCloseFrame(code, reason = '', masked = false) { let payload; if (code && code !== 1005) { payload = Buffer.from(`--${reason}`); payload.writeUInt16BE(code, 0); } else { payload = Buffer.alloc(0); } const meta = generateMetaData(true, 8, masked, payload); return Buffer.concat([meta, payload], meta.length + payload.length); } exports.createCloseFrame = createCloseFrame; function createPingFrame(data, masked = false) { const payload = Buffer.from(data); const meta = generateMetaData(true, 9, masked, payload); return Buffer.concat([meta, payload], meta.length + payload.length); } exports.createPingFrame = createPingFrame; function createPongFrame(data, masked = false) { const payload = Buffer.from(data); const meta = generateMetaData(true, 10, masked, payload); return Buffer.concat([meta, payload], meta.length + payload.length); } exports.createPongFrame = createPongFrame; function generateMetaData(fin, opcode, masked, payload) { const len = payload.length; const meta = Buffer.alloc(2 + (len < 126 ? 0 : len < 65536 ? 2 : 8) + (masked ? 4 : 0)); meta[0] = (fin ? 128 : 0) + opcode; meta[1] = masked ? 128 : 0; let start = 2; if (len < 126) { meta[1] += len; } else if (len < 65536) { meta[1] += 126; meta.writeUInt16BE(len, 2); start += 2; } else { meta[1] += 127; meta.writeUInt32BE(Math.floor(len / Math.pow(2, 32)), 2); meta.writeUInt32BE(len % Math.pow(2, 32), 6); start += 8; } if (masked) { const mask = Buffer.alloc(4); for (let i = 0; i < 4; i++) { meta[start + i] = mask[i] = Math.floor(Math.random() * 256); } for (let i = 0; i < payload.length; i++) { payload[i] ^= mask[i % 4]; } start += 4; } return meta; }