WebSocket protocol — handle WebSocket frames manually.
1const { createHash } = require("crypto");2const net = require("net");34const MAGIC_KEY = "258EAFA5-E914-47DA-95CA-5AB9FC1C1B5A";56const server = net.createServer((socket) => {7 socket.once("data", (data) => {8 const request = data.toString();910 // Extract WebSocket key11 const keyMatch = request.match(/Sec-WebSocket-Key: (.+)\r\n/);12 if (!keyMatch) return socket.end();1314 const key = keyMatch[1].trim();15 const acceptKey = createHash("sha1")16 .update(key + MAGIC_KEY)17 .digest("base64");1819 // Send handshake20 socket.write(21 "HTTP/1.1 101 Switching Protocols\r\n" +22 "Upgrade: websocket\r\n" +23 "Connection: Upgrade\r\n" +24 `Sec-WebSocket-Accept: ${acceptKey}\r\n\r\n`25 );2627 // Handle frames28 socket.on("data", (frame) => {29 const payload = decodeFrame(frame);30 console.log("Received:", payload);31 socket.write(encodeFrame("Echo: " + payload));32 });33 });34});3536function decodeFrame(buffer) {37 const length = buffer[1] & 0x7f;38 const mask = buffer.slice(2, 6);39 const data = buffer.slice(6, 6 + length);40 return data.map((byte, i) => byte ^ mask[i % 4]).toString();41}4243function encodeFrame(message) {44 const data = Buffer.from(message);45 const frame = Buffer.alloc(2 + data.length);46 frame[0] = 0x81; // FIN + text47 frame[1] = data.length;48 data.copy(frame, 2);49 return frame;50}