From 5fb969da7ca0affde1869842e48fcba76abe4423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 3 May 2026 15:32:44 +0800 Subject: [PATCH] Add WebSocket package with client/server & native Introduce a new WebSocket package implementing RFC6455 functionality and permessage-deflate support. Adds core connection handling (packages/websocket/websocket.js), client wrapper (client.js), server and upgrade handling (server.js), extensions (permessage-deflate) and helpers (extensions.js), an index and native loader (native.js). Also include prebuilt native addon binaries for multiple platforms and integration points to use the native Parser and frame builder. The server supports handleUpgrade, subprotocol negotiation, and verifyClient hooks; the client performs handshakes and queues sends until open. Error handling, UTF-8 validation, close/ping/pong control frames, and max-payload checks are implemented. --- .../runtime/native/websocket-linux-arm64.node | Bin 0 -> 150624 bytes .../runtime/native/websocket-linux-x64.node | Bin 0 -> 105360 bytes .../runtime/native/websocket-win32-x64.node | Bin 0 -> 163328 bytes packages/websocket/client.js | 240 +++++++++ packages/websocket/extensions.js | 152 ++++++ packages/websocket/index.js | 24 + packages/websocket/native.js | 33 ++ packages/websocket/server.js | 260 ++++++++++ packages/websocket/websocket.js | 461 ++++++++++++++++++ 9 files changed, 1170 insertions(+) create mode 100644 packages/runtime/native/websocket-linux-arm64.node create mode 100644 packages/runtime/native/websocket-linux-x64.node create mode 100644 packages/runtime/native/websocket-win32-x64.node create mode 100644 packages/websocket/client.js create mode 100644 packages/websocket/extensions.js create mode 100644 packages/websocket/index.js create mode 100644 packages/websocket/native.js create mode 100644 packages/websocket/server.js create mode 100644 packages/websocket/websocket.js diff --git a/packages/runtime/native/websocket-linux-arm64.node b/packages/runtime/native/websocket-linux-arm64.node new file mode 100644 index 0000000000000000000000000000000000000000..903662347996c2fc0af363da22e719648ccd20b5 GIT binary patch literal 150624 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 Wt?Ij?QJGa~$j5x0RP;5H@BaZYyzxx{ literal 0 HcmV?d00001 diff --git a/packages/runtime/native/websocket-linux-x64.node b/packages/runtime/native/websocket-linux-x64.node new file mode 100644 index 0000000000000000000000000000000000000000..f336da320597f4e39f11ca734b8ab80d3925cfce GIT binary patch literal 105360 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�o<^-2!iM_;Do=qHTh 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 F{{h9F$C>~D literal 0 HcmV?d00001 diff --git a/packages/runtime/native/websocket-win32-x64.node b/packages/runtime/native/websocket-win32-x64.node new file mode 100644 index 0000000000000000000000000000000000000000..b015be712475f70c6752119d23096941260861a8 GIT binary patch literal 163328 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 YCwR~oSc?kB6HV{9i;Dkykv#DK0QZ&=qyPW_ literal 0 HcmV?d00001 diff --git a/packages/websocket/client.js b/packages/websocket/client.js new file mode 100644 index 00000000..73053a0e --- /dev/null +++ b/packages/websocket/client.js @@ -0,0 +1,240 @@ +import { EventEmitter } from 'node:events'; +import net from 'node:net'; +import tls from 'node:tls'; +import crypto from 'node:crypto'; +import { URL } from 'node:url'; +import native from './native.js'; +import { + offerPerMessageDeflate, + parseAcceptedPerMessageDeflate, +} from './extensions.js'; +import { WebSocket, CONNECTING, OPEN, isValidCloseCode } from './websocket.js'; + +function parseHeaders(headerBlock) { + const lines = headerBlock.split('\r\n'); + const status = lines.shift(); + const m = /^HTTP\/1\.1\s+(\d+)\s*(.*)$/.exec(status); + if (!m) throw new Error('Bad HTTP status line: ' + status); + const headers = Object.create(null); + for (const line of lines) { + if (!line) continue; + const idx = line.indexOf(':'); + if (idx < 0) continue; + const k = line.slice(0, idx).trim().toLowerCase(); + const v = line.slice(idx + 1).trim(); + headers[k] = v; + } + return { statusCode: Number(m[1]), statusMessage: m[2], headers }; +} + +class WebSocketClient extends EventEmitter { + constructor(address, protocols, options) { + super(); + if (typeof protocols === 'object' && !Array.isArray(protocols) && protocols !== null) { + options = protocols; + protocols = undefined; + } + options = options || {}; + this._url = new URL(address); + if (this._url.protocol !== 'ws:' && this._url.protocol !== 'wss:') { + throw new Error('Only ws: and wss: URLs are supported'); + } + this._secure = this._url.protocol === 'wss:'; + this._readyState = CONNECTING; + this._maxPayload = options.maxPayload; + this._ws = null; + this._pendingQueue = []; + this._perMessageDeflate = options.perMessageDeflate; + this._protocols = Array.isArray(protocols) ? protocols.map(String) : undefined; + this.protocol = ''; + this.extensions = ''; + + const host = this._url.hostname; + const port = this._url.port ? Number(this._url.port) : (this._secure ? 443 : 80); + + // Generate random 16-byte Sec-WebSocket-Key per RFC 6455 §4.1. + const keyBytes = crypto.randomBytes(16); + this._wsKey = keyBytes.toString('base64'); + this._expectedAccept = native.computeAcceptKey(this._wsKey); + + const connectOpts = { + host, + port, + ...(options.socketOptions || {}), + }; + + const onConnect = () => { + const pathAndQuery = (this._url.pathname || '/') + (this._url.search || ''); + const hostHeader = (this._url.port && Number(this._url.port) !== (this._secure ? 443 : 80)) + ? `${host}:${this._url.port}` + : host; + const reqLines = [ + `GET ${pathAndQuery} HTTP/1.1`, + `Host: ${hostHeader}`, + 'Upgrade: websocket', + 'Connection: Upgrade', + `Sec-WebSocket-Key: ${this._wsKey}`, + 'Sec-WebSocket-Version: 13', + ]; + if (Array.isArray(protocols) && protocols.length > 0) { + reqLines.push(`Sec-WebSocket-Protocol: ${protocols.join(', ')}`); + } + const extensionOffer = offerPerMessageDeflate(options.perMessageDeflate); + if (extensionOffer) { + reqLines.push(`Sec-WebSocket-Extensions: ${extensionOffer}`); + } + if (options.headers) { + for (const [k, v] of Object.entries(options.headers)) { + reqLines.push(`${k}: ${v}`); + } + } + reqLines.push('', ''); + this._socket.write(reqLines.join('\r\n')); + }; + + if (this._secure && connectOpts.servername === undefined && net.isIP(host) === 0) { + connectOpts.servername = host; + } + + this._socket = this._secure + ? tls.connect(connectOpts, onConnect) + : net.connect(connectOpts, onConnect); + + this._socket.setNoDelay && this._socket.setNoDelay(true); + this._handshakeBuf = Buffer.alloc(0); + this._socket.on('data', (chunk) => this._onHandshakeData(chunk)); + this._socket.on('error', (err) => this._onEarlyError(err)); + this._socket.on('close', () => this._onEarlyClose()); + } + + get readyState() { + return this._ws ? this._ws.readyState : this._readyState; + } + + _onHandshakeData(chunk) { + this._handshakeBuf = Buffer.concat([this._handshakeBuf, chunk]); + const idx = this._handshakeBuf.indexOf('\r\n\r\n'); + if (idx < 0) { + if (this._handshakeBuf.length > 16384) { + this._abort('Handshake response too large'); + } + return; + } + const headBlock = this._handshakeBuf.slice(0, idx).toString('latin1'); + const rest = this._handshakeBuf.slice(idx + 4); + let parsed; + try { + parsed = parseHeaders(headBlock); + } catch (e) { + return this._abort(e.message); + } + + if (parsed.statusCode !== 101) { + return this._abort(`Unexpected response status ${parsed.statusCode}`); + } + if ((parsed.headers['upgrade'] || '').toLowerCase() !== 'websocket') { + return this._abort('Missing/invalid Upgrade header'); + } + if (!/\bupgrade\b/i.test(parsed.headers['connection'] || '')) { + return this._abort('Missing Connection: Upgrade header'); + } + if (parsed.headers['sec-websocket-accept'] !== this._expectedAccept) { + return this._abort('Invalid Sec-WebSocket-Accept'); + } + let acceptedExtensions; + try { + acceptedExtensions = parseAcceptedPerMessageDeflate( + parsed.headers['sec-websocket-extensions'], + this._perMessageDeflate, + ); + } catch (e) { + return this._abort(e.message); + } + if (parsed.headers['sec-websocket-extensions'] && !acceptedExtensions) { + return this._abort('Unexpected Sec-WebSocket-Extensions'); + } + const protocol = parsed.headers['sec-websocket-protocol'] || ''; + if (protocol && (!Array.isArray(this._protocols) || !this._protocols.includes(protocol))) { + return this._abort('Unexpected Sec-WebSocket-Protocol'); + } + + // Detach handshake listeners; hand the socket off to the WebSocket. + this._socket.removeAllListeners('data'); + this._socket.removeAllListeners('error'); + this._socket.removeAllListeners('close'); + + this._readyState = OPEN; + this._ws = new WebSocket(this._socket, { + isServer: false, + maxPayload: this._maxPayload, + extensions: acceptedExtensions ? { perMessageDeflate: acceptedExtensions } : undefined, + protocol, + readyState: OPEN, + }); + this.protocol = protocol; + this.extensions = acceptedExtensions ? 'permessage-deflate' : ''; + // Forward events to the client wrapper. + this._ws.on('message', (d, isBinary) => this.emit('message', d, isBinary)); + this._ws.on('ping', (d) => this.emit('ping', d)); + this._ws.on('pong', (d) => this.emit('pong', d)); + this._ws.on('close', (c, r) => this.emit('close', c, r)); + this._ws.on('error', (e) => this.emit('error', e)); + + this.emit('upgrade', parsed); + this.emit('open'); + + // Feed leftover bytes (if any) into the frame parser. + if (rest.length > 0) this._ws._onData(rest); + + // Flush any queued sends that happened before open. + for (const entry of this._pendingQueue) this._ws.send(entry.data, entry.options, entry.cb); + this._pendingQueue = []; + } + + _onEarlyError(err) { + this.emit('error', err); + } + + _onEarlyClose() { + if (!this._ws) { + this._readyState = 3; + this.emit('close', 1006, ''); + } + } + + _abort(msg) { + const err = new Error('WebSocket handshake failed: ' + msg); + try { this._socket.destroy(); } catch {} + this.emit('error', err); + this._readyState = 3; + this.emit('close', 1006, ''); + } + + send(data, options, cb) { + if (this._ws) return this._ws.send(data, options, cb); + this._pendingQueue.push({ data, options, cb }); + } + + ping(data, mask, cb) { if (this._ws) this._ws.ping(data, mask, cb); } + pong(data, mask, cb) { if (this._ws) this._ws.pong(data, mask, cb); } + + close(code, reason) { + if (code !== undefined && !isValidCloseCode(code)) { + throw new RangeError(`Invalid close code: ${code}`); + } + if (this._ws) return this._ws.close(code, reason); + try { this._socket.destroy(); } catch {} + } + + terminate() { + if (this._ws) return this._ws.terminate(); + try { this._socket.destroy(); } catch {} + } +} + +WebSocketClient.CONNECTING = 0; +WebSocketClient.OPEN = 1; +WebSocketClient.CLOSING = 2; +WebSocketClient.CLOSED = 3; + +export { WebSocketClient }; diff --git a/packages/websocket/extensions.js b/packages/websocket/extensions.js new file mode 100644 index 00000000..92dfa2b6 --- /dev/null +++ b/packages/websocket/extensions.js @@ -0,0 +1,152 @@ +import zlib from 'node:zlib'; + +const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]); + +function parseHeader(header) { + const offers = []; + if (!header) return offers; + for (const rawOffer of String(header).split(',')) { + const parts = rawOffer.split(';').map((p) => p.trim()).filter(Boolean); + if (parts.length === 0) continue; + const name = parts.shift().toLowerCase(); + const params = Object.create(null); + for (const part of parts) { + const eq = part.indexOf('='); + if (eq === -1) { + params[part.toLowerCase()] = true; + } else { + const key = part.slice(0, eq).trim().toLowerCase(); + let value = part.slice(eq + 1).trim(); + if ((value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1); + } + params[key] = value; + } + } + offers.push({ name, params }); + } + return offers; +} + +function normalizePerMessageDeflateOptions(value) { + if (value === undefined || value === false || value === null) return null; + if (value === true) { + return { clientNoContextTakeover: true, serverNoContextTakeover: true }; + } + if (typeof value === 'object') { + return { + clientNoContextTakeover: true, + serverNoContextTakeover: true, + ...value, + }; + } + return { clientNoContextTakeover: true, serverNoContextTakeover: true }; +} + +function acceptPerMessageDeflate(requestHeader, options) { + const config = normalizePerMessageDeflateOptions(options); + if (!config) return null; + const offer = parseHeader(requestHeader).find((item) => item.name === 'permessage-deflate'); + if (!offer) return null; + const responseParams = []; + + if (config.serverNoContextTakeover !== false || offer.params.server_no_context_takeover) { + responseParams.push('server_no_context_takeover'); + } + if (config.clientNoContextTakeover !== false || offer.params.client_no_context_takeover) { + responseParams.push('client_no_context_takeover'); + } + + const accepted = { + enabled: true, + requestNoContextTakeover: responseParams.includes('client_no_context_takeover'), + responseNoContextTakeover: responseParams.includes('server_no_context_takeover'), + threshold: config.threshold ?? 1024, + }; + + return { + header: ['permessage-deflate', ...responseParams].join('; '), + options: accepted, + }; +} + +function offerPerMessageDeflate(options) { + const config = normalizePerMessageDeflateOptions(options); + if (!config) return null; + const params = ['permessage-deflate']; + if (config.clientNoContextTakeover !== false) params.push('client_no_context_takeover'); + if (config.serverNoContextTakeover !== false) params.push('server_no_context_takeover'); + return params.join('; '); +} + +function parseAcceptedPerMessageDeflate(responseHeader, requestedOptions) { + const config = normalizePerMessageDeflateOptions(requestedOptions); + if (!config) return null; + const accepted = parseHeader(responseHeader).find((item) => item.name === 'permessage-deflate'); + if (!accepted) return null; + for (const key of Object.keys(accepted.params)) { + if (key !== 'client_no_context_takeover' && key !== 'server_no_context_takeover') { + throw new Error(`Unsupported permessage-deflate parameter: ${key}`); + } + } + return { + enabled: true, + requestNoContextTakeover: !!accepted.params.server_no_context_takeover, + responseNoContextTakeover: !!accepted.params.client_no_context_takeover, + threshold: config.threshold ?? 1024, + }; +} + +function compressRaw(data) { + const compressed = zlib.deflateRawSync(data, { flush: zlib.constants.Z_SYNC_FLUSH }); + if (compressed.length >= 4 && compressed.subarray(compressed.length - 4).equals(TRAILER)) { + return compressed.subarray(0, compressed.length - 4); + } + return compressed; +} + +function decompressRaw(data, maxPayload) { + const inflated = zlib.inflateRawSync(Buffer.concat([data, TRAILER]), { + finishFlush: zlib.constants.Z_SYNC_FLUSH, + }); + if (maxPayload !== undefined && inflated.length > maxPayload) { + const err = new Error('Message too large after inflate'); + err.code = 1009; + throw err; + } + return inflated; +} + +function normalizeProtocolList(protocols) { + if (!protocols) return []; + if (typeof protocols === 'string') return protocols.split(',').map((p) => p.trim()).filter(Boolean); + if (Array.isArray(protocols)) return protocols.map(String).map((p) => p.trim()).filter(Boolean); + if (protocols instanceof Set) return Array.from(protocols).map(String).map((p) => p.trim()).filter(Boolean); + return []; +} + +function chooseSubprotocol(requestHeader, protocols) { + const requested = normalizeProtocolList(requestHeader); + if (typeof protocols === 'function') { + const selected = protocols(requested); + return selected && requested.includes(String(selected)) ? String(selected) : null; + } + const supported = normalizeProtocolList(protocols); + if (requested.length === 0 || supported.length === 0) return null; + for (const protocol of supported) { + if (requested.includes(protocol)) return protocol; + } + return null; +} + +export { + acceptPerMessageDeflate, + chooseSubprotocol, + compressRaw, + decompressRaw, + offerPerMessageDeflate, + normalizeProtocolList, + parseAcceptedPerMessageDeflate, + parseHeader, +}; diff --git a/packages/websocket/index.js b/packages/websocket/index.js new file mode 100644 index 00000000..c1c246b1 --- /dev/null +++ b/packages/websocket/index.js @@ -0,0 +1,24 @@ +import { WebSocket as InternalWebSocket } from './websocket.js'; +import { WebSocketServer } from './server.js'; +import { WebSocketClient } from './client.js'; +import native from './native.js'; + +WebSocketClient.Server = WebSocketServer; + +const WebSocket = WebSocketClient; +const Server = WebSocketServer; +const _internal = { WebSocket: InternalWebSocket, native }; + +export { + WebSocket, + WebSocketServer, + Server, + _internal, +}; + +export default { + WebSocket, + WebSocketServer, + Server, + _internal, +}; diff --git a/packages/websocket/native.js b/packages/websocket/native.js new file mode 100644 index 00000000..ba414bfb --- /dev/null +++ b/packages/websocket/native.js @@ -0,0 +1,33 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; + +const require = createRequire(import.meta.url); +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const candidates = [ + path.join(__dirname, '..', 'build', 'Release', 'snowluma_ws.node'), + path.join(__dirname, '..', 'build', 'Debug', 'snowluma_ws.node'), +]; + +let addon = null; +let lastErr = null; +for (const p of candidates) { + if (fs.existsSync(p)) { + try { + addon = require(p); + break; + } catch (e) { + lastErr = e; + } + } +} +if (!addon) { + throw new Error( + 'Failed to load native snowluma_ws addon. Run `npm run build` first. ' + + (lastErr ? `Last error: ${lastErr.message}` : ''), + ); +} + +export default addon; diff --git a/packages/websocket/server.js b/packages/websocket/server.js new file mode 100644 index 00000000..d24bce35 --- /dev/null +++ b/packages/websocket/server.js @@ -0,0 +1,260 @@ +import { EventEmitter } from 'node:events'; +import http from 'node:http'; +import https from 'node:https'; +import native from './native.js'; +import { + acceptPerMessageDeflate, + chooseSubprotocol, +} from './extensions.js'; +import { WebSocket, OPEN } from './websocket.js'; + +const WS_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; + +function computeAccept(key) { + return native.computeAcceptKey(key); +} + +// Abort the upgrade with a canned HTTP error response. +function abortUpgrade(socket, status, message) { + try { + const body = message ? message : http.STATUS_CODES[status] || ''; + const head = + `HTTP/1.1 ${status} ${http.STATUS_CODES[status] || 'Error'}\r\n` + + 'Connection: close\r\n' + + `Content-Length: ${Buffer.byteLength(body)}\r\n` + + 'Content-Type: text/plain\r\n\r\n'; + socket.write(head + body); + } catch { /* noop */ } + try { socket.destroy(); } catch { /* noop */ } +} + +function getTlsOptions(options) { + const keys = [ + 'ALPNProtocols', + 'SNICallback', + 'ca', + 'cert', + 'ciphers', + 'clientCertEngine', + 'crl', + 'dhparam', + 'ecdhCurve', + 'honorCipherOrder', + 'key', + 'maxVersion', + 'minVersion', + 'passphrase', + 'pfx', + 'privateKeyEngine', + 'privateKeyIdentifier', + 'requestCert', + 'rejectUnauthorized', + 'secureOptions', + 'secureProtocol', + 'sessionIdContext', + 'sigalgs', + 'ticketKeys', + ]; + const tlsOptions = {}; + for (const key of keys) { + if (options[key] !== undefined) tlsOptions[key] = options[key]; + } + if (options.tls && typeof options.tls === 'object') { + Object.assign(tlsOptions, options.tls); + } + return tlsOptions; +} + +class WebSocketServer extends EventEmitter { + constructor(options) { + super(); + options = options || {}; + this.options = { + port: options.port, + host: options.host, + server: options.server, + noServer: !!options.noServer, + path: options.path, + maxPayload: options.maxPayload, + verifyClient: options.verifyClient, + protocols: options.protocols, + perMessageDeflate: options.perMessageDeflate, + backlog: options.backlog, + tls: options.tls, + }; + const tlsOptions = getTlsOptions(options); + this.options.tls = Object.keys(tlsOptions).length > 0 ? tlsOptions : undefined; + this.clients = new Set(); + this._server = null; // internal http.Server (if we own it) + this._externalServer = null; + this._upgradeHandler = null; + + if (this.options.noServer) { + // Just provide handleUpgrade; user is responsible for routing. + return; + } + + if (this.options.server) { + this._externalServer = this.options.server; + this._attachToServer(this._externalServer); + } else if (this.options.port !== undefined) { + const requestHandler = (req, res) => { + // Non-WebSocket HTTP hits on the standalone port get a 426. + const body = http.STATUS_CODES[426]; + res.writeHead(426, { + 'Content-Length': Buffer.byteLength(body), + 'Content-Type': 'text/plain', + }); + res.end(body); + }; + this._server = this.options.tls + ? https.createServer(this.options.tls, requestHandler) + : http.createServer(requestHandler); + this._attachToServer(this._server); + this._server.listen( + this.options.port, + this.options.host, + this.options.backlog, + () => this.emit('listening'), + ); + this._server.on('error', (err) => this.emit('error', err)); + } else { + throw new Error('WebSocketServer requires { port } or { server } or { noServer: true }'); + } + } + + address() { + if (this._server) return this._server.address(); + if (this._externalServer && this._externalServer.address) return this._externalServer.address(); + return null; + } + + _attachToServer(server) { + const handler = (req, socket, head) => { + // If a path is configured, filter on it. + if (this.options.path) { + const urlPath = req.url.split('?')[0]; + if (urlPath !== this.options.path) { + // Let other upgrade listeners handle it; if none, abort. + if (server.listenerCount('upgrade') === 1) { + abortUpgrade(socket, 400, 'Bad path for WebSocket'); + } + return; + } + } + this.handleUpgrade(req, socket, head, (ws) => { + this.emit('connection', ws, req); + }); + }; + this._upgradeHandler = handler; + server.on('upgrade', handler); + } + + // Perform the RFC 6455 handshake on an already-produced upgrade request. + // Accepts the same argument shape as `ws` for drop-in compatibility. + handleUpgrade(request, socket, head, cb) { + const upgrade = (request.headers['upgrade'] || '').toLowerCase(); + const connection = (request.headers['connection'] || '').toLowerCase(); + const version = request.headers['sec-websocket-version']; + const key = request.headers['sec-websocket-key']; + + if (request.method !== 'GET') return abortUpgrade(socket, 405, 'Method not allowed'); + if (upgrade !== 'websocket') return abortUpgrade(socket, 400, 'Upgrade header must be websocket'); + if (!/\bupgrade\b/i.test(connection)) return abortUpgrade(socket, 400, 'Connection header must contain "upgrade"'); + if (version !== '13') { + try { + socket.write( + 'HTTP/1.1 426 Upgrade Required\r\n' + + 'Sec-WebSocket-Version: 13\r\n' + + 'Connection: close\r\n\r\n'); + } catch {} + try { socket.destroy(); } catch {} + return; + } + if (!key || !/^[+/0-9A-Za-z]{22}==$/.test(key)) { + return abortUpgrade(socket, 400, 'Invalid Sec-WebSocket-Key'); + } + + const doAccept = () => { + const accept = computeAccept(key); + const extension = acceptPerMessageDeflate( + request.headers['sec-websocket-extensions'], + this.options.perMessageDeflate, + ); + const protocol = chooseSubprotocol( + request.headers['sec-websocket-protocol'], + this.options.protocols, + ); + const responseHeaders = [ + 'HTTP/1.1 101 Switching Protocols', + 'Upgrade: websocket', + 'Connection: Upgrade', + `Sec-WebSocket-Accept: ${accept}`, + ]; + if (extension) responseHeaders.push(`Sec-WebSocket-Extensions: ${extension.header}`); + if (protocol) responseHeaders.push(`Sec-WebSocket-Protocol: ${protocol}`); + try { + socket.write(responseHeaders.join('\r\n') + '\r\n\r\n'); + } catch (err) { + try { socket.destroy(); } catch {} + return; + } + + // Disable Nagle for lower latency (typical WS guidance). + if (socket.setTimeout) socket.setTimeout(0); + if (socket.setNoDelay) socket.setNoDelay(true); + + const ws = new WebSocket(socket, { + isServer: true, + maxPayload: this.options.maxPayload, + extensions: extension ? { perMessageDeflate: extension.options } : undefined, + protocol, + readyState: OPEN, + }); + this.clients.add(ws); + ws.on('close', () => this.clients.delete(ws)); + + // If `head` contained bytes past the HTTP request (unusual for most + // clients but possible), feed them into the parser now. + if (head && head.length > 0) ws._onData(head); + + cb(ws, request); + }; + + if (typeof this.options.verifyClient === 'function') { + const info = { origin: request.headers['origin'], secure: !!(socket.encrypted), req: request }; + if (this.options.verifyClient.length >= 2) { + // Async style: (info, cb) + this.options.verifyClient(info, (allow, code, message, headers) => { + if (!allow) return abortUpgrade(socket, code || 401, message); + doAccept(); + }); + } else { + const allow = this.options.verifyClient(info); + if (!allow) return abortUpgrade(socket, 401, 'Unauthorized'); + doAccept(); + } + } else { + doAccept(); + } + } + + close(cb) { + // Stop accepting new upgrades and close our owned server (if any). + if (this._externalServer && this._upgradeHandler) { + this._externalServer.removeListener('upgrade', this._upgradeHandler); + this._upgradeHandler = null; + } + // Initiate a graceful close on all live clients. + for (const ws of this.clients) { + try { ws.close(1001, 'Server shutting down'); } catch {} + } + if (this._server) { + this._server.close((err) => cb && cb(err)); + } else if (cb) { + setImmediate(cb); + } + } +} + +export { WebSocketServer }; diff --git a/packages/websocket/websocket.js b/packages/websocket/websocket.js new file mode 100644 index 00000000..83135c21 --- /dev/null +++ b/packages/websocket/websocket.js @@ -0,0 +1,461 @@ +import { EventEmitter } from 'node:events'; +import crypto from 'node:crypto'; +import native from './native.js'; +import { compressRaw, decompressRaw } from './extensions.js'; + +// RFC 6455 opcodes. +const OP_CONT = 0x0; +const OP_TEXT = 0x1; +const OP_BIN = 0x2; +const OP_CLOSE = 0x8; +const OP_PING = 0x9; +const OP_PONG = 0xA; +const RSV1 = 0x40; + +// Ready states (mirror the standard WebSocket API numbers). +const CONNECTING = 0; +const OPEN = 1; +const CLOSING = 2; +const CLOSED = 3; + +// Default cap per-message and per-frame. +const DEFAULT_MAX_PAYLOAD = 100 * 1024 * 1024; + +function isValidCloseCode(code) { + if (code === 1000 || code === 1001 || code === 1002 || code === 1003 || + code === 1007 || code === 1008 || code === 1009 || code === 1010 || + code === 1011) { + return true; + } + if (code >= 3000 && code <= 4999) return true; + return false; +} + +function encodeClosePayload(code, reason) { + const reasonBuf = reason ? Buffer.from(String(reason), 'utf8') : Buffer.alloc(0); + if (code === undefined || code === null) { + if (reasonBuf.length > 0) { + throw new Error('Cannot send close reason without a code'); + } + return Buffer.alloc(0); + } + const buf = Buffer.allocUnsafe(2 + reasonBuf.length); + buf.writeUInt16BE(code & 0xFFFF, 0); + reasonBuf.copy(buf, 2); + return buf; +} + +// Streaming UTF-8 validator used while a text message is being received in +// fragments. Returns { ok, done } after appending a chunk; `done` means the +// message ended on a code-point boundary. +class Utf8Validator { + constructor() { + this.state = 0; // bytes still expected in current code point + this.codepoint = 0; + this.minNext = 0; // for overlong / surrogate range validation + } + + push(buf) { + for (let i = 0; i < buf.length; i++) { + const b = buf[i]; + if (this.state === 0) { + if ((b & 0x80) === 0) continue; + if ((b & 0xE0) === 0xC0) { + if (b < 0xC2) return false; // overlong + this.codepoint = b & 0x1F; + this.state = 1; + this.minNext = 0x80; + } else if ((b & 0xF0) === 0xE0) { + this.codepoint = b & 0x0F; + this.state = 2; + this.minNext = (b === 0xE0) ? 0xA0 : 0x80; + } else if ((b & 0xF8) === 0xF0) { + if (b > 0xF4) return false; + this.codepoint = b & 0x07; + this.state = 3; + this.minNext = (b === 0xF0) ? 0x90 : 0x80; + } else { + return false; + } + } else { + if (b < this.minNext || b > 0xBF) return false; + // Reject UTF-16 surrogates encoded as 3-byte sequences (ED A0..BF ..). + if (this.state === 2 && this.codepoint === 0xD && (b & 0x20)) { + // Actually this branch is unreachable because minNext would be 0x80 + // and for codepoint starting 0xED (codepoint==0xD) minNext above is + // 0x80 already so any A0..BF passes. We explicitly reject here. + return false; + } + if (this.codepoint === 0xD && this.state === 2 && b >= 0xA0) { + return false; + } + this.codepoint = (this.codepoint << 6) | (b & 0x3F); + this.state--; + this.minNext = 0x80; + } + } + return true; + } + + done() { + return this.state === 0; + } +} + +function randomMaskKey() { + const b = Buffer.allocUnsafe(4); + // crypto.randomFillSync is slightly faster than randomBytes for small sizes. + crypto.randomFillSync(b); + return b; +} + +// Shared WebSocket connection handling logic. Used by both server- and +// client-side after a successful handshake. +class WebSocket extends EventEmitter { + constructor(socket, options) { + super(); + options = options || {}; + this._socket = socket; + this._isServer = !!options.isServer; + this._maxPayload = options.maxPayload ?? DEFAULT_MAX_PAYLOAD; + this._readyState = options.readyState ?? OPEN; + this._perMessageDeflate = options.extensions && options.extensions.perMessageDeflate; + this.protocol = options.protocol || ''; + this.extensions = this._perMessageDeflate ? 'permessage-deflate' : ''; + + this._parser = new native.Parser({ + isServer: this._isServer, // server expects masked frames from clients + maxPayload: this._maxPayload, + allowedRsv: this._perMessageDeflate ? RSV1 : 0, + }); + + // Fragmented message assembly state. + this._msgOpcode = 0; + this._msgChunks = []; + this._msgSize = 0; + this._msgValidator = null; + this._msgCompressed = false; + + // Close state. + this._closeCodeSent = null; + this._closeCodeReceived = null; + this._closeReasonReceived = ''; + this._closeFrameSent = false; + this._closeTimer = null; + + this._bindSocket(); + } + + get readyState() { return this._readyState; } + get isServer() { return this._isServer; } + + _bindSocket() { + const sock = this._socket; + sock.on('data', (chunk) => this._onData(chunk)); + sock.on('end', () => this._onEnd()); + sock.on('close', () => this._onSocketClose()); + sock.on('error', (err) => this._onError(err)); + } + + _onData(chunk) { + if (this._readyState === CLOSED) return; + const res = this._parser.push(chunk); + if (res.error) { + this._failConnection(res.code || 1002, res.message || 'Protocol error'); + return; + } + for (const f of res.frames) { + this._handleFrame(f); + if (this._readyState === CLOSED) return; + } + } + + _onEnd() { + // Peer gracefully half-closed without a Close frame. + if (this._readyState !== CLOSED) { + // If we never received a Close, treat as abnormal. + if (this._closeCodeReceived === null) { + this._closeCodeReceived = 1006; + this._closeReasonReceived = ''; + } + this._destroySocket(); + } + } + + _onSocketClose() { + if (this._readyState === CLOSED) return; + if (this._closeCodeReceived === null) { + this._closeCodeReceived = 1006; + } + this._readyState = CLOSED; + if (this._closeTimer) { clearTimeout(this._closeTimer); this._closeTimer = null; } + this.emit('close', this._closeCodeReceived, this._closeReasonReceived); + } + + _onError(err) { + this.emit('error', err); + } + + _handleFrame(f) { + const { fin, opcode, payload, rsv = 0 } = f; + if (opcode === OP_PING) { + this.emit('ping', payload); + if (this._readyState === OPEN) this._sendControl(OP_PONG, payload); + return; + } + if (opcode === OP_PONG) { + this.emit('pong', payload); + return; + } + if (opcode === OP_CLOSE) { + this._handleCloseFrame(payload); + return; + } + + // Data frames (TEXT / BIN / CONT). + if (opcode === OP_TEXT || opcode === OP_BIN) { + if (this._msgOpcode !== 0) { + this._failConnection(1002, 'New data frame started before previous fragmented message finished'); + return; + } + if ((rsv & RSV1) && !this._perMessageDeflate) { + this._failConnection(1002, 'Compressed frame without negotiated permessage-deflate'); + return; + } + this._msgOpcode = opcode; + this._msgChunks = []; + this._msgSize = 0; + this._msgCompressed = (rsv & RSV1) !== 0; + if (opcode === OP_TEXT) this._msgValidator = new Utf8Validator(); + else this._msgValidator = null; + } else if (opcode === OP_CONT) { + if (this._msgOpcode === 0) { + this._failConnection(1002, 'Continuation frame without active message'); + return; + } + if (rsv !== 0) { + this._failConnection(1002, 'RSV bits set on continuation frame'); + return; + } + } + + this._msgSize += payload.length; + if (this._msgSize > this._maxPayload) { + this._failConnection(1009, 'Message too large'); + return; + } + if (payload.length > 0) this._msgChunks.push(payload); + + if (fin) { + let data = this._msgChunks.length === 1 + ? this._msgChunks[0] + : Buffer.concat(this._msgChunks, this._msgSize); + if (this._msgCompressed) { + try { + data = decompressRaw(data, this._maxPayload); + } catch (err) { + this._failConnection(err.code || 1007, err.message || 'Invalid compressed payload'); + return; + } + } + if (this._msgValidator) { + if (!this._msgValidator.push(data) || !this._msgValidator.done()) { + this._failConnection(1007, 'Invalid UTF-8'); + return; + } + } + const isBinary = this._msgOpcode === OP_BIN; + this._msgOpcode = 0; + this._msgChunks = []; + this._msgSize = 0; + this._msgValidator = null; + this._msgCompressed = false; + this.emit('message', data, isBinary); + } + } + + _handleCloseFrame(payload) { + let code = 1005; + let reason = ''; + if (payload.length === 1) { + return this._failConnection(1002, 'Close payload length 1'); + } + if (payload.length >= 2) { + code = payload.readUInt16BE(0); + if (!isValidCloseCode(code)) { + return this._failConnection(1002, 'Invalid close code'); + } + if (payload.length > 2) { + try { + reason = new TextDecoder('utf-8', { fatal: true }).decode(payload.subarray(2)); + } catch { + return this._failConnection(1007, 'Invalid UTF-8 in close reason'); + } + } + } + this._closeCodeReceived = code; + this._closeReasonReceived = reason; + + if (this._readyState === OPEN) { + // Echo a close frame back with same code (per RFC 6455 §5.5.1). + this._readyState = CLOSING; + const echo = encodeClosePayload(code === 1005 ? undefined : code, ''); + this._sendControl(OP_CLOSE, echo); + this._closeFrameSent = true; + this._endSocketSoon(); + } else if (this._readyState === CLOSING) { + // We already sent our close frame; the handshake is complete. + this._endSocketSoon(); + } + } + + _endSocketSoon() { + // Flush pending writes then half-close. Give the peer a moment to close. + try { this._socket.end(); } catch { /* noop */ } + if (this._closeTimer) clearTimeout(this._closeTimer); + this._closeTimer = setTimeout(() => this._destroySocket(), 30000); + this._closeTimer.unref && this._closeTimer.unref(); + } + + _destroySocket() { + try { this._socket.destroy(); } catch { /* noop */ } + } + + _failConnection(code, reason) { + if (this._readyState === CLOSED) return; + const payload = encodeClosePayload(code, reason); + let frame = null; + try { + frame = native.buildFrame(OP_CLOSE, true, payload, + this._isServer ? null : randomMaskKey(), 0); + } catch { /* noop */ } + this._closeCodeSent = code; + this._readyState = CLOSING; + const err = new Error(`WebSocket protocol error: ${reason}`); + err.code = code; + this.emit('error', err); + // Use `end(frame)` so the close frame flushes and a FIN is sent. This + // yields a clean TCP half-close peers can observe via the 'end' event. + try { + if (frame) this._socket.end(frame); + else this._socket.end(); + } catch { /* noop */ } + // Failsafe: destroy if the peer never FIN's back. + if (this._closeTimer) clearTimeout(this._closeTimer); + this._closeTimer = setTimeout(() => this._destroySocket(), 2000); + this._closeTimer.unref && this._closeTimer.unref(); + } + + _sendControl(opcode, payload) { + if (!payload) payload = Buffer.alloc(0); + const frame = native.buildFrame(opcode, true, payload, this._isServer ? null : randomMaskKey(), 0); + this._socket.write(frame); + } + + // Public API ------------------------------------------------------------- + + send(data, options, cb) { + if (typeof options === 'function') { cb = options; options = undefined; } + options = options || {}; + if (this._readyState !== OPEN) { + const err = new Error('WebSocket is not open'); + if (cb) return cb(err); + throw err; + } + let payload; + let opcode; + if (typeof data === 'string') { + payload = Buffer.from(data, 'utf8'); + opcode = options.binary ? OP_BIN : OP_TEXT; + } else if (Buffer.isBuffer(data)) { + payload = data; + opcode = options.binary === false ? OP_TEXT : OP_BIN; + } else if (data instanceof Uint8Array) { + payload = Buffer.from(data.buffer, data.byteOffset, data.byteLength); + opcode = options.binary === false ? OP_TEXT : OP_BIN; + } else if (data instanceof ArrayBuffer) { + payload = Buffer.from(data); + opcode = options.binary === false ? OP_TEXT : OP_BIN; + } else { + const err = new TypeError('Unsupported data type for send()'); + if (cb) return cb(err); + throw err; + } + let rsv = 0; + if (this._perMessageDeflate && options.compress !== false && + payload.length >= (this._perMessageDeflate.threshold ?? 1024)) { + payload = compressRaw(payload); + rsv = RSV1; + } + const maskKey = this._isServer ? null : randomMaskKey(); + const frame = native.buildFrame(opcode, true, payload, maskKey, rsv); + this._socket.write(frame, cb); + } + + ping(data, mask, cb) { + if (typeof data === 'function') { cb = data; data = undefined; mask = undefined; } + if (typeof mask === 'function') { cb = mask; mask = undefined; } + const payload = data ? (Buffer.isBuffer(data) ? data : Buffer.from(String(data), 'utf8')) : Buffer.alloc(0); + if (payload.length > 125) throw new Error('Ping payload must be <=125 bytes'); + if (this._readyState !== OPEN) { + const err = new Error('WebSocket is not open'); + if (cb) return cb(err); + throw err; + } + const maskKey = this._isServer ? null : randomMaskKey(); + const frame = native.buildFrame(OP_PING, true, payload, maskKey, 0); + this._socket.write(frame, cb); + } + + pong(data, mask, cb) { + if (typeof data === 'function') { cb = data; data = undefined; mask = undefined; } + if (typeof mask === 'function') { cb = mask; mask = undefined; } + const payload = data ? (Buffer.isBuffer(data) ? data : Buffer.from(String(data), 'utf8')) : Buffer.alloc(0); + if (payload.length > 125) throw new Error('Pong payload must be <=125 bytes'); + if (this._readyState !== OPEN) { + const err = new Error('WebSocket is not open'); + if (cb) return cb(err); + throw err; + } + const maskKey = this._isServer ? null : randomMaskKey(); + const frame = native.buildFrame(OP_PONG, true, payload, maskKey, 0); + this._socket.write(frame, cb); + } + + close(code, reason) { + if (this._readyState === CLOSED || this._readyState === CLOSING) return; + if (code !== undefined && !isValidCloseCode(code)) { + throw new RangeError(`Invalid close code: ${code}`); + } + const reasonBuf = reason ? Buffer.from(String(reason), 'utf8') : Buffer.alloc(0); + if (reasonBuf.length > 123) throw new RangeError('Close reason must be <=123 bytes'); + const payload = encodeClosePayload(code, reason); + const maskKey = this._isServer ? null : randomMaskKey(); + const frame = native.buildFrame(OP_CLOSE, true, payload, maskKey, 0); + this._readyState = CLOSING; + this._closeCodeSent = code ?? null; + this._socket.write(frame); + this._closeFrameSent = true; + this._endSocketSoon(); + } + + terminate() { + this._readyState = CLOSING; + this._destroySocket(); + } +} + +WebSocket.CONNECTING = CONNECTING; +WebSocket.OPEN = OPEN; +WebSocket.CLOSING = CLOSING; +WebSocket.CLOSED = CLOSED; + +export { + WebSocket, + CONNECTING, OPEN, CLOSING, CLOSED, + OP_CONT, OP_TEXT, OP_BIN, OP_CLOSE, OP_PING, OP_PONG, + RSV1, + isValidCloseCode, + encodeClosePayload, + randomMaskKey, +};