dlovely-websocket
Version:
WebSocket For Dlovely
79 lines (78 loc) • 2.9 kB
JavaScript
;
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;
}