From fb2dfb233709584d13fddb6815a98cd6003dfaab Mon Sep 17 00:00:00 2001 From: jhmaster2000 <32803471+jhmaster2000@users.noreply.github.com> Date: Mon, 11 Dec 2023 02:09:48 -0300 Subject: [PATCH] polyfills: hono serve rewrite --- packages/bun-polyfills/bun.lockb | Bin 92818 -> 93909 bytes packages/bun-polyfills/package.json | 2 + packages/bun-polyfills/src/global/process.ts | 2 +- packages/bun-polyfills/src/modules/bun.ts | 2 +- .../bun-polyfills/src/modules/bun/serve.ts | 292 +++++++++--------- packages/bun-polyfills/src/utils/webconv.ts | 10 +- 6 files changed, 148 insertions(+), 160 deletions(-) diff --git a/packages/bun-polyfills/bun.lockb b/packages/bun-polyfills/bun.lockb index 05d968a3db517f6ec4793c49ad9ad0e45a31d3f8..38e9a5a354ed8ac85c54bc23070f50fd9701d361 100755 GIT binary patch delta 15586 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 delta 15047 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 diff --git a/packages/bun-polyfills/package.json b/packages/bun-polyfills/package.json index 3c57f4ba50..93313a88cc 100644 --- a/packages/bun-polyfills/package.json +++ b/packages/bun-polyfills/package.json @@ -32,6 +32,7 @@ "typescript": "^5.2.2" }, "dependencies": { + "@hono/node-server": "^1.3.1", "argon2": "^0.31.2", "bcryptjs": "^2.4.3", "better-sqlite3": "^9.1.1", @@ -39,6 +40,7 @@ "chalk": "^5.3.0", "dateformat": "^5.0.3", "expect": "^29.7.0", + "hono": "^3.11.4", "html-rewriter-wasm": "^0.4.1", "isomorphic-ws": "^5.0.0", "jest-each": "^29.7.0", diff --git a/packages/bun-polyfills/src/global/process.ts b/packages/bun-polyfills/src/global/process.ts index 6cdcfc0bc3..8ef5b7d9aa 100644 --- a/packages/bun-polyfills/src/global/process.ts +++ b/packages/bun-polyfills/src/global/process.ts @@ -16,7 +16,7 @@ if (typeof process === 'object' && process !== null) { process.versions.c_ares = '0e7a5dee0fbb04080750cf6eabbe89d8bae87faa' satisfies Process['versions'][string]; process.versions.zig = '0.12.0-dev.1604+caae40c21' satisfies Process['versions'][string]; process.versions.bun = '1.0.13' satisfies Process['versions'][string]; - Reflect.set(process, 'revision', '5e0160552a0b63087cdf1cd5dd62f69fdca5d875' satisfies Process['revision']); + Reflect.set(process, 'revision', 'b8dcf2caf869bd911a3cb5df77f58fdce20bc185' satisfies Process['revision']); /** @end_generated_code */ // Doesn't work on Windows sadly diff --git a/packages/bun-polyfills/src/modules/bun.ts b/packages/bun-polyfills/src/modules/bun.ts index 790eaec145..fd3658f09f 100644 --- a/packages/bun-polyfills/src/modules/bun.ts +++ b/packages/bun-polyfills/src/modules/bun.ts @@ -48,7 +48,7 @@ export const main = path.resolve(process.cwd(), process.argv[1] ?? 'repl') satis //? These are automatically updated on build by tools/updateversions.ts, do not edit manually. export const version = '1.0.13' satisfies typeof Bun.version; -export const revision = '5e0160552a0b63087cdf1cd5dd62f69fdca5d875' satisfies typeof Bun.revision; +export const revision = 'b8dcf2caf869bd911a3cb5df77f58fdce20bc185' satisfies typeof Bun.revision; export const gc = ( globalThis.gc diff --git a/packages/bun-polyfills/src/modules/bun/serve.ts b/packages/bun-polyfills/src/modules/bun/serve.ts index 6cf0dfc84c..4d4f8d90d7 100644 --- a/packages/bun-polyfills/src/modules/bun/serve.ts +++ b/packages/bun-polyfills/src/modules/bun/serve.ts @@ -1,28 +1,14 @@ /// import type { - Server as BunServer, Serve, TLSServeOptions, UnixTLSServeOptions, TLSWebSocketServeOptions, UnixTLSWebSocketServeOptions, ArrayBufferView, SocketAddress, WebSocketHandler, ServerWebSocket, WebSocketCompressor + Serve, TLSServeOptions, UnixTLSServeOptions, TLSWebSocketServeOptions, UnixTLSWebSocketServeOptions, + Server as BunServer, ArrayBufferView, SocketAddress, WebSocketHandler, ServerWebSocket, WebSocketCompressor } from 'bun'; +import { serve as honoServe } from '@hono/node-server'; +import { WebSocketServer, type AddressInfo } from 'ws'; import { createHash } from 'node:crypto'; -import uws from 'uWebSockets.js'; - -type uwsInternalField = { res: uws.HttpResponse; req: uws.HttpRequest; }; -type uwsUpgradableRequest = { secwskey: string; secwsprotocol: string; secwsextensions: string; context: uws.us_socket_context_t; }; -const uwsInternalFieldSymbol = Symbol('bun-polyfills.serve.uwsInternalField'); -const uwsUpgradableRequestSymbol = Symbol('bun-polyfills.serve.uwsUpgradableRequest'); - -const wsCompressors: Record = { - '128KB': uws.DEDICATED_COMPRESSOR_128KB, - '16KB': uws.DEDICATED_COMPRESSOR_16KB, - '256KB': uws.DEDICATED_COMPRESSOR_256KB, - '32KB': uws.DEDICATED_COMPRESSOR_32KB, - '3KB': uws.DEDICATED_COMPRESSOR_3KB, - '4KB': uws.DEDICATED_COMPRESSOR_4KB, - '64KB': uws.DEDICATED_COMPRESSOR_64KB, - '8KB': uws.DEDICATED_COMPRESSOR_8KB, - dedicated: uws.DEDICATED_COMPRESSOR_32KB, - disable: uws.DISABLED, - shared: uws.SHARED_COMPRESSOR, -} as const; +import fs from 'node:fs'; +import http from 'node:http'; +import { requestRemoteIPSymbol, requestUpgradedSymbol, toWebRequest } from '../../utils/webconv.js'; export function serve(options: Serve): BunServer { return new Server(options); @@ -55,100 +41,59 @@ class Server implements BunServer { this.#onRequest = options.fetch; if (!this.#onRequest) throw new TypeError('Expected fetch() to be a function'); - this.#uws = uws[tls ? 'SSLApp' : 'App']({ - ca_file_name: tls?.ca instanceof Blob ? tls.ca.name - : tls?.ca instanceof Array ? (tls.ca[0] instanceof Blob ? tls.ca[0].name : tls.ca[0]) : tls?.ca, - cert_file_name: tls?.cert instanceof Blob ? tls.cert.name - : tls?.cert instanceof Array ? (tls.cert[0] instanceof Blob ? tls.cert[0].name : tls.cert[0]) : tls?.cert, - dh_params_file_name: tls?.dhParamsFile, - key_file_name: tls?.key instanceof Blob ? tls.key.name - : tls?.key instanceof Array ? (tls.key[0] instanceof Blob ? tls.key[0].name : tls.key[0]) : tls?.key, - passphrase: tls?.passphrase, - ssl_ciphers: tls?.secureOptions?.toString(), - ssl_prefer_low_memory_usage: tls?.lowMemoryMode, + if (tls?.ca instanceof Blob) tls.ca = tls.ca.name; + if (tls?.ca instanceof Array) tls.ca = tls.ca.map((ca) => ca instanceof Blob ? ca.name! : ca); + if (tls?.cert instanceof Blob) tls.cert = tls.cert.name; + if (tls?.cert instanceof Array) tls.cert = tls.cert.map((cert) => cert instanceof Blob ? cert.name! : cert); + if (tls?.key instanceof Blob) tls.key = tls.key.name; + if (tls?.key instanceof Array) tls.key = tls.key.map((key) => key instanceof Blob ? key.name! : key); + this.#server = honoServe({ + serverOptions: { + ca: tls?.ca as string | Buffer | (string | Buffer)[] | undefined, + cert: tls?.cert as string | Buffer | (string | Buffer)[] | undefined, + dhparam: tls?.dhParamsFile ? fs.readFileSync(tls.dhParamsFile) : undefined, + key: tls?.key as string | Buffer | (string | Buffer)[] | undefined, + passphrase: tls?.passphrase, + }, + hostname: listenOn.hostname, + port: listenOn.port, + fetch: async (request) => { + this.pendingRequests++; + const response = await this.#onRequest(request, this); + this.pendingRequests--; + return response; + }, + }, (info) => { }) as http.Server; + this.#server.listen(listenOn.port, listenOn.hostname); + this.#server.on('error', (error) => { + if (this.#onError) this.#onError(error); + }); + this.#server.on('upgrade', (req, duplex, head) => { + this.#onRequest(toWebRequest(req, undefined, this.#maxReqBodySize, true), this); }); - const httpHandler = async (res: uws.HttpResponse, req: uws.HttpRequest) => { - this.pendingRequests++; - res.onAborted(() => { - if (this.#onError) this.#onError(new Error('Aborted')); - }); - const headers = new Headers(); - req.forEach((name, value) => headers.append(name, value)); - const query = req.getQuery(); - const url = `${tls ? 'https' : 'http'}://${headers.get('host')}${req.getUrl()}${query ? '?' + query : ''}`; - const method = req.getMethod(); - const body = method === 'GET' || method === 'HEAD' ? undefined : await getUwsHttpResponseBody(res, this.#maxReqBodySize); - const webReq = new Request(url, { - method, - headers, - body: body?.byteLength ? body : undefined, - }); - Reflect.set(webReq, uwsInternalFieldSymbol, { res, req }); - const webRes = await this.#onRequest(webReq, this); - if (Reflect.get(req, uwsUpgradableRequestSymbol)) return void this.pendingRequests--; - if (!webRes) return this.pendingRequests--, void res.endWithoutBody(); - for (const [name, value] of webRes.headers) { - res.writeHeader(name, value); - } - res.writeStatus(`${webRes.status} ${webRes.statusText}`); - res.end(await webRes.arrayBuffer()); - this.pendingRequests--; - }; - this.#uws.any('/*', httpHandler); - - if (this.#ws) this.#uws.ws('/*', { - sendPingsAutomatically: this.#ws.sendPings ?? true, - idleTimeout: this.#ws.idleTimeout ?? 120, - maxBackpressure: this.#ws.backpressureLimit ?? 1024 * 1024 * 16, - maxPayloadLength: this.#ws.maxPayloadLength ?? 1024 * 1024 * 16, - closeOnBackpressureLimit: Number(this.#ws.closeOnBackpressureLimit ?? false), - compression: !this.#ws.perMessageDeflate || typeof this.#ws.perMessageDeflate === 'boolean' - ? (this.#ws.perMessageDeflate ? uws.SHARED_COMPRESSOR : uws.DISABLED) - : !this.#ws.perMessageDeflate.compress || typeof this.#ws.perMessageDeflate.compress === 'boolean' - ? (this.#ws.perMessageDeflate.compress ? uws.SHARED_COMPRESSOR : uws.DISABLED) - : wsCompressors[this.#ws.perMessageDeflate.compress], - - close: (ws, code, message) => { - if (this.#ws?.close) this.#ws.close(toBunSocket(ws), code, Buffer.from(message).toString('utf8')); - }, - drain: (ws) => { - if (this.#ws?.drain) this.#ws.drain(toBunSocket(ws)); - }, - message: (ws, message, isBinary) => { - if (this.#ws?.message) { - const buf = Buffer.from(message); - this.#ws.message(toBunSocket(ws), isBinary ? buf : buf.toString('utf8')); - } - }, - open: (ws) => { - this.pendingWebSockets++; - if (this.#ws?.open) this.#ws.open(toBunSocket(ws)); + this.#wss = new WebSocketServer({ + server: this.#server, + perMessageDeflate: typeof ws?.perMessageDeflate === 'boolean' + ? ws.perMessageDeflate : !!ws?.perMessageDeflate?.compress || !!ws?.perMessageDeflate?.decompress, + backlog: ws?.backpressureLimit, + // @ts-expect-error untyped "maxPayload" option but it's in the docs + maxPayload: ws?.maxPayloadLength, + }); + this.#wss.on('connection', (socket, req) => { + this.pendingWebSockets++; + this.#ws?.open?.(toBunSocket(socket, this)); + if (this.#ws?.close) socket.onclose = (event) => { + this.#ws?.close?.(toBunSocket(socket, this), event.code, event.reason); this.pendingWebSockets--; - }, - ping: (ws, message) => { - if (this.#ws?.ping) this.#ws.ping(toBunSocket(ws), Buffer.from(message)); - }, - pong: (ws, message) => { - if (this.#ws?.pong) this.#ws.pong(toBunSocket(ws), Buffer.from(message)); - }, - subscription: (ws, topic, newCount, oldCount) => { - - }, - upgrade: async (res, req, context) => { - const secwskey = req.getHeader('sec-websocket-key'); - const secwsprotocol = req.getHeader('sec-websocket-protocol'); - const secwsextensions = req.getHeader('sec-websocket-extensions'); - Reflect.set(req, uwsUpgradableRequestSymbol, { secwskey, secwsprotocol, secwsextensions, context }); - await httpHandler(res, req); - }, + }; + if (this.#ws?.message) socket.onmessage = (event) => this.#ws?.message?.(toBunSocket(socket, this), event.data); + if (this.#ws?.ping) socket.addEventListener('ping', (event) => this.#ws?.ping?.(toBunSocket(socket, this), event.data)); + if (this.#ws?.pong) socket.addEventListener('pong', (event) => this.#ws?.pong?.(toBunSocket(socket, this), event.data)); }); - - if (listenOn.unix) this.#uws.listen_unix((listenSock) => { this.#listenSock = listenSock; }, listenOn.unix); - else this.#uws.listen(listenOn.hostname!, listenOn.port ?? 0, (listenSock) => { this.#listenSock = listenSock; }); } - #listenSock: uws.us_listen_socket | null = null; - #uws: uws.TemplatedApp; + #wss: WebSocketServer; + #server: http.Server; #ws: WebSocketHandler | null; #tls: TLSOptions | null; //#unix?: string; @@ -159,7 +104,8 @@ class Server implements BunServer { development: boolean; hostname: string; get port(): number { - const port = uws.us_socket_local_port(this.#listenSock!); + const addrinfo = this.#server.address(); + const port = typeof addrinfo === 'string' ? -1 : addrinfo?.port!; return port === -1 ? undefined as unknown as number : port; } id: string; @@ -172,39 +118,31 @@ class Server implements BunServer { return this.#onRequest(request, this) as Response | Promise; } publish(topic: string, data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, compress?: boolean): number { - const message = (typeof data === 'string' ? data : 'buffer' in data ? data.buffer : data) as string | ArrayBuffer; - const success = this.#uws.publish(topic, message, typeof message !== 'string', compress); - if (!success) return 0; - return typeof message === 'string' ? message.length : message.byteLength; + this.#wss.clients.forEach((client) => { + if (client.readyState !== 1) return; + const bunSocket = Reflect.get(client, '@@asBunSocket') as BunSocket | undefined; + if (!bunSocket) throw new Error('Internal error: Expected client to have a BunSocket reference'); + if (bunSocket.isSubscribed(topic)) bunSocket.send(data, compress); + }); + return 0; } upgrade(request: Request, options?: { headers?: HeadersInit; data?: T; }): boolean { - const uwsInfo = Reflect.get(request, uwsInternalFieldSymbol) as uwsInternalField | undefined; - if (!uwsInfo) return false; // This polyfill can only upgrade requests created by itself - const { req, res } = uwsInfo; - const ctx = Reflect.get(req, uwsUpgradableRequestSymbol) as uwsUpgradableRequest | undefined; - if (!ctx) return false; - res.upgrade({}, ctx.secwskey, ctx.secwsprotocol, ctx.secwsextensions, ctx.context); - return true; + return Reflect.get(request, requestUpgradedSymbol) ?? false; } requestIP(request: Request): SocketAddress | null { - const uwsInfo = Reflect.get(request, uwsInternalFieldSymbol) as uwsInternalField | undefined; - if (!uwsInfo) return null; - const fullIP = new TextDecoder().decode(uwsInfo.res.getRemoteAddressAsText()); - const [ip, port] = fullIP.split(':'); - return { - address: ip, - port: Number(port), - family: ip.includes('.') ? 'IPv4' : 'IPv6', - }; + const addrinfo = Reflect.get(request, requestRemoteIPSymbol) as AddressInfo & { family: 'IPv4' | 'IPv6'; } | undefined; + if (addrinfo) return addrinfo; + else return null; } reload(options: Serve): void { this.#onRequest = options.fetch ?? this.#onRequest; this.#onError = options.error ?? this.#onError; } stop(closeActiveConnections?: boolean): void { - if (closeActiveConnections) return void this.#uws.close(); this.#closed = true; - uws.us_listen_socket_close(this.#listenSock!); + if (closeActiveConnections) this.#wss.clients.forEach((client) => client.close()); + this.#wss.close(); + this.#server.close(); } }; @@ -225,27 +163,73 @@ function generateSecWSAccept(secWSKey: string) { .digest('base64'); } -// TODO -function toBunSocket(socket: uws.WebSocket) { - return socket as unknown as ServerWebSocket; +class BunSocket implements ServerWebSocket { + #ws: WebSocket; + #server: Server; + constructor(socket: WebSocket, server: Server) { + this.#ws = socket; + this.#server = server; + Reflect.set(socket, '@@asBunSocket', this); + } + send(data: string | BufferSource, compress?: boolean | undefined): number { + this.#ws.send(data); + return typeof data === 'string' ? Buffer.byteLength(data, 'utf8') : data.byteLength; + } + sendText(data: string, compress?: boolean | undefined): number { + this.#ws.send(data); + return Buffer.byteLength(data, 'utf8'); + } + sendBinary(data: BufferSource, compress?: boolean | undefined): number { + this.#ws.send(data); + return data.byteLength; + } + close(code?: number | undefined, reason?: string | undefined): void { + this.#ws.close(code, reason); + } + terminate(): void { + this.#ws.terminate(); + } + ping(data?: string | BufferSource | undefined): number { + this.#ws.ping(data); + return typeof data === 'string' ? Buffer.byteLength(data, 'utf8') : data?.byteLength ?? 0; + } + pong(data?: string | BufferSource | undefined): number { + this.#ws.pong(data); + return typeof data === 'string' ? Buffer.byteLength(data, 'utf8') : data?.byteLength ?? 0; + } + publish(topic: string, data: string | BufferSource, compress?: boolean | undefined): number { + return this.#server.publish(topic, data, compress); + } + publishText(topic: string, data: string, compress?: boolean | undefined): number { + return this.publish(topic, data, compress); + } + publishBinary(topic: string, data: BufferSource, compress?: boolean | undefined): number { + return this.publish(topic, data, compress); + } + subscribe(topic: string): void { + this.#subscribedTopics.add(topic); + } + unsubscribe(topic: string): void { + this.#subscribedTopics.delete(topic); + } + isSubscribed(topic: string): boolean { + return this.#subscribedTopics.has(topic); + } + cork(callback: (ws: ServerWebSocket) => T): T { + return callback(this); + } + get remoteAddress(): string { + return this.#ws.url; + }; + get readyState(): WebSocketReadyState { + return this.#ws.readyState; + }; + #subscribedTopics = new Set(); + binaryType?: 'nodebuffer' | 'arraybuffer' | 'uint8array' | undefined; + // @ts-expect-error generic mess + data: T; } -async function getUwsHttpResponseBody(res: uws.HttpResponse, maxSize: number) { - return new Promise((resolve, reject) => { - const buffers: Buffer[] = []; - let totalSize = 0; - res.onData((ab, isLast) => { - const chunk = Buffer.from(ab); - totalSize += chunk.byteLength; - if (totalSize > maxSize) return void res.close(); // calls onAborted - if (!isLast) return void buffers.push(chunk); - try { - if (buffers.length === 0) return void resolve(Buffer.from(structuredClone(ab))); - buffers.push(chunk); - return void resolve(Buffer.concat(buffers, totalSize)); - } catch (e) { - return void res.close(); // calls onAborted - } - }); - }); +function toBunSocket(socket: WebSocket, server: Server) { + return new BunSocket(socket, server); } diff --git a/packages/bun-polyfills/src/utils/webconv.ts b/packages/bun-polyfills/src/utils/webconv.ts index c60541601e..59e970d777 100644 --- a/packages/bun-polyfills/src/utils/webconv.ts +++ b/packages/bun-polyfills/src/utils/webconv.ts @@ -7,7 +7,8 @@ import { splitCookiesString } from 'set-cookie-parser'; export const requestNodeResSymbol = Symbol('bun-polyfills.serve.nodeReq'); export const requestRemoteIPSymbol = Symbol('bun-polyfills.serve.remoteIP'); -export const toWebRequest = (nodeReq: IncomingMessage, nodeRes: ServerResponse, bodySizeLimit?: number): Request => { +export const requestUpgradedSymbol = Symbol('bun-polyfills.serve.upgraded'); +export const toWebRequest = (nodeReq: IncomingMessage, nodeRes?: ServerResponse, bodySizeLimit?: number, upgraded = false): Request => { const webReq = new Request('http://' + nodeReq.headers.host! + nodeReq.url, { duplex: 'half', method: nodeReq.method, @@ -18,8 +19,9 @@ export const toWebRequest = (nodeReq: IncomingMessage, nodeRes: ServerResponse, address: nodeReq.socket.remoteAddress, port: nodeReq.socket.remotePort, family: nodeReq.socket.remoteFamily, }); Reflect.set(webReq, requestNodeResSymbol, nodeRes); + Reflect.set(webReq, requestUpgradedSymbol, upgraded); return webReq; -} +}; export const sendWebResponse = (nodeRes: ServerResponse, webRes: Response): void => { const headers = Object.fromEntries(webRes.headers); @@ -47,7 +49,7 @@ export const sendWebResponse = (nodeRes: ServerResponse, webRes: Response): void nodeRes.off('error', cancel); // If the reader has already been interrupted with an error earlier, // then it will appear here, it is useless, but it needs to be caught. - reader.cancel(error).catch(() => {}); + reader.cancel(error).catch(() => { }); if (error) nodeRes.destroy(error); }; nodeRes.on('close', cancel); @@ -66,7 +68,7 @@ export const sendWebResponse = (nodeRes: ServerResponse, webRes: Response): void cancel(error instanceof Error ? error : new Error(String(error))); } } -} +}; class HTTPError extends Error { constructor(status: number, reason: string) {