@elysiajs/node
Advanced tools
+30
-7
@@ -78,2 +78,26 @@ "use strict"; | ||
| }; | ||
| function mergeHeaders(responseHeaders, setHeaders) { | ||
| const headers = new Headers(Object.fromEntries(responseHeaders.entries())); | ||
| if (setHeaders instanceof Headers) | ||
| for (const key of setHeaders.keys()) { | ||
| if (key === "set-cookie") { | ||
| if (headers.has("set-cookie")) continue; | ||
| for (const cookie of setHeaders.getSetCookie()) | ||
| headers.append("set-cookie", cookie); | ||
| } else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders?.get(key) ?? ""); | ||
| } | ||
| else | ||
| for (const key in setHeaders) | ||
| if (key === "set-cookie") | ||
| headers.append(key, setHeaders[key]); | ||
| else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders[key]); | ||
| return headers; | ||
| } | ||
| function mergeStatus(responseStatus, setStatus) { | ||
| if (typeof setStatus === "string") setStatus = import_utils.StatusMap[setStatus]; | ||
| if (responseStatus === 200) return setStatus; | ||
| return responseStatus; | ||
| } | ||
| var createResponseHandler = (handler) => { | ||
@@ -83,8 +107,4 @@ const handleStream2 = (0, import_utils2.createStreamHandler)(handler); | ||
| const newResponse = new import_srvx.FastResponse(response.body, { | ||
| headers: Object.assign( | ||
| // @ts-ignore | ||
| Object.fromEntries(response.headers.entries()), | ||
| set2.headers | ||
| ), | ||
| status: response.status ?? set2.status | ||
| headers: mergeHeaders(response.headers, set2.headers), | ||
| status: mergeStatus(response.status, set2.status) | ||
| }); | ||
@@ -95,3 +115,6 @@ if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") | ||
| (0, import_utils2.responseToSetHeaders)(newResponse, set2), | ||
| request | ||
| request, | ||
| // @ts-ignore | ||
| true | ||
| // don't auto-format SSE for pre-formatted Response | ||
| ); | ||
@@ -98,0 +121,0 @@ return newResponse; |
+76
-49
@@ -29,6 +29,6 @@ "use strict"; | ||
| var import_utils8 = require("elysia/utils"); | ||
| var import_crossws = require("crossws"); | ||
| var import_server = require("crossws/server"); | ||
| // src/ws.ts | ||
| var import_crossws = require("crossws"); | ||
| var import_elysia = require("elysia"); | ||
@@ -209,3 +209,38 @@ var import_utils = require("elysia/adapter/utils"); | ||
| } | ||
| return { handler, context: store }; | ||
| function createConfig(app) { | ||
| return (0, import_crossws.defineHooks)({ | ||
| async upgrade(request) { | ||
| const id = request.wsId = randomId(); | ||
| const response = await app.handle(request); | ||
| const context = store[id]; | ||
| if (!context) return response; | ||
| return { | ||
| context, | ||
| headers: context.data.set.headers | ||
| }; | ||
| }, | ||
| open(ws) { | ||
| const context = ws.context; | ||
| context.open(ws); | ||
| }, | ||
| message(ws, message) { | ||
| const context = ws.context; | ||
| context.message(ws, message.text()); | ||
| }, | ||
| close(ws, detail) { | ||
| const context = ws.context; | ||
| context.close( | ||
| // ws is parsed in context.open | ||
| ws, | ||
| detail.code, | ||
| detail.reason | ||
| ); | ||
| }, | ||
| error(ws, error) { | ||
| const context = ws.context; | ||
| context.error?.(ws, error); | ||
| } | ||
| }); | ||
| } | ||
| return { handler, createConfig, context: store }; | ||
| } | ||
@@ -262,2 +297,26 @@ | ||
| }; | ||
| function mergeHeaders(responseHeaders, setHeaders) { | ||
| const headers = new Headers(Object.fromEntries(responseHeaders.entries())); | ||
| if (setHeaders instanceof Headers) | ||
| for (const key of setHeaders.keys()) { | ||
| if (key === "set-cookie") { | ||
| if (headers.has("set-cookie")) continue; | ||
| for (const cookie of setHeaders.getSetCookie()) | ||
| headers.append("set-cookie", cookie); | ||
| } else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders?.get(key) ?? ""); | ||
| } | ||
| else | ||
| for (const key in setHeaders) | ||
| if (key === "set-cookie") | ||
| headers.append(key, setHeaders[key]); | ||
| else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders[key]); | ||
| return headers; | ||
| } | ||
| function mergeStatus(responseStatus, setStatus) { | ||
| if (typeof setStatus === "string") setStatus = import_utils3.StatusMap[setStatus]; | ||
| if (responseStatus === 200) return setStatus; | ||
| return responseStatus; | ||
| } | ||
| var createResponseHandler = (handler) => { | ||
@@ -267,8 +326,4 @@ const handleStream2 = (0, import_utils4.createStreamHandler)(handler); | ||
| const newResponse = new import_srvx.FastResponse(response.body, { | ||
| headers: Object.assign( | ||
| // @ts-ignore | ||
| Object.fromEntries(response.headers.entries()), | ||
| set2.headers | ||
| ), | ||
| status: response.status ?? set2.status | ||
| headers: mergeHeaders(response.headers, set2.headers), | ||
| status: mergeStatus(response.status, set2.status) | ||
| }); | ||
@@ -279,3 +334,6 @@ if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") | ||
| (0, import_utils4.responseToSetHeaders)(newResponse, set2), | ||
| request | ||
| request, | ||
| // @ts-ignore | ||
| true | ||
| // don't auto-format SSE for pre-formatted Response | ||
| ); | ||
@@ -791,47 +849,13 @@ return newResponse; | ||
| } | ||
| const websocket = (0, import_crossws.defineHooks)({ | ||
| async upgrade(request) { | ||
| const id = request.wsId = (0, import_utils8.randomId)(); | ||
| const response = await app.handle(request); | ||
| const context = ws.context[id]; | ||
| if (!context) return response; | ||
| return { | ||
| context, | ||
| headers: context.data.set.headers | ||
| }; | ||
| }, | ||
| open(ws2) { | ||
| const context = ws2.context; | ||
| context.open(ws2); | ||
| }, | ||
| message(ws2, message) { | ||
| const context = ws2.context; | ||
| context.message( | ||
| ws2, | ||
| message.text() | ||
| ); | ||
| }, | ||
| close(ws2, detail) { | ||
| const context = ws2.context; | ||
| context.close( | ||
| // ws is parsed in context.open | ||
| ws2, | ||
| detail.code, | ||
| detail.reason | ||
| ); | ||
| }, | ||
| error(ws2, error) { | ||
| const context = ws2.context; | ||
| context.error?.(ws2, error); | ||
| } | ||
| }); | ||
| const serverOptions = typeof options === "number" ? { | ||
| port: options, | ||
| silent: true, | ||
| websocket, | ||
| fetch: app.fetch | ||
| websocket: ws.createConfig(app), | ||
| fetch: app.fetch, | ||
| reusePort: true | ||
| } : { | ||
| reusePort: true, | ||
| ...options, | ||
| silent: true, | ||
| websocket, | ||
| websocket: ws.createConfig(app), | ||
| fetch: app.fetch | ||
@@ -862,2 +886,3 @@ }; | ||
| publish() { | ||
| return 0; | ||
| }, | ||
@@ -873,2 +898,3 @@ ref() { | ||
| server = (0, import_server.serve)(serverOptions); | ||
| return serverInfo; | ||
| }, | ||
@@ -881,3 +907,3 @@ requestIP() { | ||
| stop() { | ||
| server.close(); | ||
| return server.close(); | ||
| }, | ||
@@ -895,2 +921,3 @@ upgrade() { | ||
| }, | ||
| // @ts-ignore | ||
| raw: server | ||
@@ -897,0 +924,0 @@ }; |
@@ -8,3 +8,5 @@ import type { ReadStream } from 'fs'; | ||
| } | ||
| export declare function mergeHeaders(responseHeaders: Headers, setHeaders: Context['set']['headers']): Headers; | ||
| export declare function mergeStatus(responseStatus: number, setStatus: Context['set']['status']): number | undefined; | ||
| export declare const createResponseHandler: (handler: CreateHandlerParameter) => (response: Response, set: Context["set"], request?: Request) => any; | ||
| export {}; |
+36
-9
@@ -24,3 +24,5 @@ "use strict"; | ||
| createResponseHandler: () => createResponseHandler, | ||
| handleFile: () => handleFile | ||
| handleFile: () => handleFile, | ||
| mergeHeaders: () => mergeHeaders, | ||
| mergeStatus: () => mergeStatus | ||
| }); | ||
@@ -72,2 +74,26 @@ module.exports = __toCommonJS(utils_exports); | ||
| }; | ||
| function mergeHeaders(responseHeaders, setHeaders) { | ||
| const headers = new Headers(Object.fromEntries(responseHeaders.entries())); | ||
| if (setHeaders instanceof Headers) | ||
| for (const key of setHeaders.keys()) { | ||
| if (key === "set-cookie") { | ||
| if (headers.has("set-cookie")) continue; | ||
| for (const cookie of setHeaders.getSetCookie()) | ||
| headers.append("set-cookie", cookie); | ||
| } else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders?.get(key) ?? ""); | ||
| } | ||
| else | ||
| for (const key in setHeaders) | ||
| if (key === "set-cookie") | ||
| headers.append(key, setHeaders[key]); | ||
| else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders[key]); | ||
| return headers; | ||
| } | ||
| function mergeStatus(responseStatus, setStatus) { | ||
| if (typeof setStatus === "string") setStatus = import_utils.StatusMap[setStatus]; | ||
| if (responseStatus === 200) return setStatus; | ||
| return responseStatus; | ||
| } | ||
| var createResponseHandler = (handler) => { | ||
@@ -77,8 +103,4 @@ const handleStream = (0, import_utils2.createStreamHandler)(handler); | ||
| const newResponse = new import_srvx.FastResponse(response.body, { | ||
| headers: Object.assign( | ||
| // @ts-ignore | ||
| Object.fromEntries(response.headers.entries()), | ||
| set.headers | ||
| ), | ||
| status: response.status ?? set.status | ||
| headers: mergeHeaders(response.headers, set.headers), | ||
| status: mergeStatus(response.status, set.status) | ||
| }); | ||
@@ -89,3 +111,6 @@ if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") | ||
| (0, import_utils2.responseToSetHeaders)(newResponse, set), | ||
| request | ||
| request, | ||
| // @ts-ignore | ||
| true | ||
| // don't auto-format SSE for pre-formatted Response | ||
| ); | ||
@@ -98,3 +123,5 @@ return newResponse; | ||
| createResponseHandler, | ||
| handleFile | ||
| handleFile, | ||
| mergeHeaders, | ||
| mergeStatus | ||
| }); |
+15
-0
@@ -23,3 +23,18 @@ import { Peer, WSError } from 'crossws'; | ||
| handler: (app: AnyElysia, path: string, options: AnyWSLocalHook) => void; | ||
| createConfig: (app: AnyElysia) => { | ||
| upgrade(request: Request & { | ||
| readonly context?: Record<string, unknown>; | ||
| }): Promise<Response | { | ||
| context: any; | ||
| headers: any; | ||
| }>; | ||
| open(ws: Peer<import("crossws").AdapterInternal>): void; | ||
| message(ws: Peer<import("crossws").AdapterInternal>, message: import("crossws").Message): void; | ||
| close(ws: Peer<import("crossws").AdapterInternal>, detail: { | ||
| code?: number; | ||
| reason?: string; | ||
| }): void; | ||
| error(ws: Peer<import("crossws").AdapterInternal>, error: WSError): void; | ||
| }; | ||
| context: Record<string, NodeWebSocketContext>; | ||
| }; |
+37
-1
@@ -26,2 +26,3 @@ "use strict"; | ||
| module.exports = __toCommonJS(ws_exports); | ||
| var import_crossws = require("crossws"); | ||
| var import_elysia = require("elysia"); | ||
@@ -202,3 +203,38 @@ var import_utils = require("elysia/adapter/utils"); | ||
| } | ||
| return { handler, context: store }; | ||
| function createConfig(app) { | ||
| return (0, import_crossws.defineHooks)({ | ||
| async upgrade(request) { | ||
| const id = request.wsId = randomId(); | ||
| const response = await app.handle(request); | ||
| const context = store[id]; | ||
| if (!context) return response; | ||
| return { | ||
| context, | ||
| headers: context.data.set.headers | ||
| }; | ||
| }, | ||
| open(ws) { | ||
| const context = ws.context; | ||
| context.open(ws); | ||
| }, | ||
| message(ws, message) { | ||
| const context = ws.context; | ||
| context.message(ws, message.text()); | ||
| }, | ||
| close(ws, detail) { | ||
| const context = ws.context; | ||
| context.close( | ||
| // ws is parsed in context.open | ||
| ws, | ||
| detail.code, | ||
| detail.reason | ||
| ); | ||
| }, | ||
| error(ws, error) { | ||
| const context = ws.context; | ||
| context.error?.(ws, error); | ||
| } | ||
| }); | ||
| } | ||
| return { handler, createConfig, context: store }; | ||
| } | ||
@@ -205,0 +241,0 @@ // Annotate the CommonJS export names for ESM import in node: |
+31
-8
@@ -12,3 +12,3 @@ // src/handle.ts | ||
| import { FastResponse as Response } from "srvx"; | ||
| import { isNotEmpty } from "elysia/utils"; | ||
| import { isNotEmpty, StatusMap } from "elysia/utils"; | ||
| import { | ||
@@ -60,2 +60,26 @@ createStreamHandler, | ||
| }; | ||
| function mergeHeaders(responseHeaders, setHeaders) { | ||
| const headers = new Headers(Object.fromEntries(responseHeaders.entries())); | ||
| if (setHeaders instanceof Headers) | ||
| for (const key of setHeaders.keys()) { | ||
| if (key === "set-cookie") { | ||
| if (headers.has("set-cookie")) continue; | ||
| for (const cookie of setHeaders.getSetCookie()) | ||
| headers.append("set-cookie", cookie); | ||
| } else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders?.get(key) ?? ""); | ||
| } | ||
| else | ||
| for (const key in setHeaders) | ||
| if (key === "set-cookie") | ||
| headers.append(key, setHeaders[key]); | ||
| else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders[key]); | ||
| return headers; | ||
| } | ||
| function mergeStatus(responseStatus, setStatus) { | ||
| if (typeof setStatus === "string") setStatus = StatusMap[setStatus]; | ||
| if (responseStatus === 200) return setStatus; | ||
| return responseStatus; | ||
| } | ||
| var createResponseHandler = (handler) => { | ||
@@ -65,8 +89,4 @@ const handleStream2 = createStreamHandler(handler); | ||
| const newResponse = new Response(response.body, { | ||
| headers: Object.assign( | ||
| // @ts-ignore | ||
| Object.fromEntries(response.headers.entries()), | ||
| set2.headers | ||
| ), | ||
| status: response.status ?? set2.status | ||
| headers: mergeHeaders(response.headers, set2.headers), | ||
| status: mergeStatus(response.status, set2.status) | ||
| }); | ||
@@ -77,3 +97,6 @@ if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") | ||
| responseToSetHeaders(newResponse, set2), | ||
| request | ||
| request, | ||
| // @ts-ignore | ||
| true | ||
| // don't auto-format SSE for pre-formatted Response | ||
| ); | ||
@@ -80,0 +103,0 @@ return newResponse; |
+79
-52
| // src/index.ts | ||
| import { WebStandardAdapter } from "elysia/adapter/web-standard"; | ||
| import { isNumericString, randomId } from "elysia/utils"; | ||
| import { defineHooks } from "crossws"; | ||
| import { isNumericString, randomId as randomId2 } from "elysia/utils"; | ||
| import { serve } from "crossws/server"; | ||
| // src/ws.ts | ||
| import { defineHooks } from "crossws"; | ||
| import { | ||
@@ -191,3 +191,38 @@ getSchemaValidator, | ||
| } | ||
| return { handler, context: store }; | ||
| function createConfig(app) { | ||
| return defineHooks({ | ||
| async upgrade(request) { | ||
| const id = request.wsId = randomId(); | ||
| const response = await app.handle(request); | ||
| const context = store[id]; | ||
| if (!context) return response; | ||
| return { | ||
| context, | ||
| headers: context.data.set.headers | ||
| }; | ||
| }, | ||
| open(ws) { | ||
| const context = ws.context; | ||
| context.open(ws); | ||
| }, | ||
| message(ws, message) { | ||
| const context = ws.context; | ||
| context.message(ws, message.text()); | ||
| }, | ||
| close(ws, detail) { | ||
| const context = ws.context; | ||
| context.close( | ||
| // ws is parsed in context.open | ||
| ws, | ||
| detail.code, | ||
| detail.reason | ||
| ); | ||
| }, | ||
| error(ws, error) { | ||
| const context = ws.context; | ||
| context.error?.(ws, error); | ||
| } | ||
| }); | ||
| } | ||
| return { handler, createConfig, context: store }; | ||
| } | ||
@@ -206,3 +241,3 @@ | ||
| import { FastResponse as Response } from "srvx"; | ||
| import { isNotEmpty as isNotEmpty2 } from "elysia/utils"; | ||
| import { isNotEmpty as isNotEmpty2, StatusMap } from "elysia/utils"; | ||
| import { | ||
@@ -254,2 +289,26 @@ createStreamHandler, | ||
| }; | ||
| function mergeHeaders(responseHeaders, setHeaders) { | ||
| const headers = new Headers(Object.fromEntries(responseHeaders.entries())); | ||
| if (setHeaders instanceof Headers) | ||
| for (const key of setHeaders.keys()) { | ||
| if (key === "set-cookie") { | ||
| if (headers.has("set-cookie")) continue; | ||
| for (const cookie of setHeaders.getSetCookie()) | ||
| headers.append("set-cookie", cookie); | ||
| } else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders?.get(key) ?? ""); | ||
| } | ||
| else | ||
| for (const key in setHeaders) | ||
| if (key === "set-cookie") | ||
| headers.append(key, setHeaders[key]); | ||
| else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders[key]); | ||
| return headers; | ||
| } | ||
| function mergeStatus(responseStatus, setStatus) { | ||
| if (typeof setStatus === "string") setStatus = StatusMap[setStatus]; | ||
| if (responseStatus === 200) return setStatus; | ||
| return responseStatus; | ||
| } | ||
| var createResponseHandler = (handler) => { | ||
@@ -259,8 +318,4 @@ const handleStream2 = createStreamHandler(handler); | ||
| const newResponse = new Response(response.body, { | ||
| headers: Object.assign( | ||
| // @ts-ignore | ||
| Object.fromEntries(response.headers.entries()), | ||
| set2.headers | ||
| ), | ||
| status: response.status ?? set2.status | ||
| headers: mergeHeaders(response.headers, set2.headers), | ||
| status: mergeStatus(response.status, set2.status) | ||
| }); | ||
@@ -271,3 +326,6 @@ if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") | ||
| responseToSetHeaders(newResponse, set2), | ||
| request | ||
| request, | ||
| // @ts-ignore | ||
| true | ||
| // don't auto-format SSE for pre-formatted Response | ||
| ); | ||
@@ -783,47 +841,13 @@ return newResponse; | ||
| } | ||
| const websocket = defineHooks({ | ||
| async upgrade(request) { | ||
| const id = request.wsId = randomId(); | ||
| const response = await app.handle(request); | ||
| const context = ws.context[id]; | ||
| if (!context) return response; | ||
| return { | ||
| context, | ||
| headers: context.data.set.headers | ||
| }; | ||
| }, | ||
| open(ws2) { | ||
| const context = ws2.context; | ||
| context.open(ws2); | ||
| }, | ||
| message(ws2, message) { | ||
| const context = ws2.context; | ||
| context.message( | ||
| ws2, | ||
| message.text() | ||
| ); | ||
| }, | ||
| close(ws2, detail) { | ||
| const context = ws2.context; | ||
| context.close( | ||
| // ws is parsed in context.open | ||
| ws2, | ||
| detail.code, | ||
| detail.reason | ||
| ); | ||
| }, | ||
| error(ws2, error) { | ||
| const context = ws2.context; | ||
| context.error?.(ws2, error); | ||
| } | ||
| }); | ||
| const serverOptions = typeof options === "number" ? { | ||
| port: options, | ||
| silent: true, | ||
| websocket, | ||
| fetch: app.fetch | ||
| websocket: ws.createConfig(app), | ||
| fetch: app.fetch, | ||
| reusePort: true | ||
| } : { | ||
| reusePort: true, | ||
| ...options, | ||
| silent: true, | ||
| websocket, | ||
| websocket: ws.createConfig(app), | ||
| fetch: app.fetch | ||
@@ -837,3 +861,3 @@ }; | ||
| ...server, | ||
| id: randomId(), | ||
| id: randomId2(), | ||
| development: process.env.NODE_ENV !== "production", | ||
@@ -855,2 +879,3 @@ fetch: app.fetch, | ||
| publish() { | ||
| return 0; | ||
| }, | ||
@@ -866,2 +891,3 @@ ref() { | ||
| server = serve(serverOptions); | ||
| return serverInfo; | ||
| }, | ||
@@ -874,3 +900,3 @@ requestIP() { | ||
| stop() { | ||
| server.close(); | ||
| return server.close(); | ||
| }, | ||
@@ -888,2 +914,3 @@ upgrade() { | ||
| }, | ||
| // @ts-ignore | ||
| raw: server | ||
@@ -890,0 +917,0 @@ }; |
+2
-0
@@ -8,3 +8,5 @@ import type { ReadStream } from 'fs'; | ||
| } | ||
| export declare function mergeHeaders(responseHeaders: Headers, setHeaders: Context['set']['headers']): Headers; | ||
| export declare function mergeStatus(responseStatus: number, setStatus: Context['set']['status']): number | undefined; | ||
| export declare const createResponseHandler: (handler: CreateHandlerParameter) => (response: Response, set: Context["set"], request?: Request) => any; | ||
| export {}; |
+34
-9
| // src/utils.ts | ||
| import { FastResponse as Response } from "srvx"; | ||
| import { isNotEmpty } from "elysia/utils"; | ||
| import { isNotEmpty, StatusMap } from "elysia/utils"; | ||
| import { | ||
@@ -50,2 +50,26 @@ createStreamHandler, | ||
| }; | ||
| function mergeHeaders(responseHeaders, setHeaders) { | ||
| const headers = new Headers(Object.fromEntries(responseHeaders.entries())); | ||
| if (setHeaders instanceof Headers) | ||
| for (const key of setHeaders.keys()) { | ||
| if (key === "set-cookie") { | ||
| if (headers.has("set-cookie")) continue; | ||
| for (const cookie of setHeaders.getSetCookie()) | ||
| headers.append("set-cookie", cookie); | ||
| } else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders?.get(key) ?? ""); | ||
| } | ||
| else | ||
| for (const key in setHeaders) | ||
| if (key === "set-cookie") | ||
| headers.append(key, setHeaders[key]); | ||
| else if (!responseHeaders.has(key)) | ||
| headers.set(key, setHeaders[key]); | ||
| return headers; | ||
| } | ||
| function mergeStatus(responseStatus, setStatus) { | ||
| if (typeof setStatus === "string") setStatus = StatusMap[setStatus]; | ||
| if (responseStatus === 200) return setStatus; | ||
| return responseStatus; | ||
| } | ||
| var createResponseHandler = (handler) => { | ||
@@ -55,8 +79,4 @@ const handleStream = createStreamHandler(handler); | ||
| const newResponse = new Response(response.body, { | ||
| headers: Object.assign( | ||
| // @ts-ignore | ||
| Object.fromEntries(response.headers.entries()), | ||
| set.headers | ||
| ), | ||
| status: response.status ?? set.status | ||
| headers: mergeHeaders(response.headers, set.headers), | ||
| status: mergeStatus(response.status, set.status) | ||
| }); | ||
@@ -67,3 +87,6 @@ if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") | ||
| responseToSetHeaders(newResponse, set), | ||
| request | ||
| request, | ||
| // @ts-ignore | ||
| true | ||
| // don't auto-format SSE for pre-formatted Response | ||
| ); | ||
@@ -75,3 +98,5 @@ return newResponse; | ||
| createResponseHandler, | ||
| handleFile | ||
| handleFile, | ||
| mergeHeaders, | ||
| mergeStatus | ||
| }; |
+15
-0
@@ -23,3 +23,18 @@ import { Peer, WSError } from 'crossws'; | ||
| handler: (app: AnyElysia, path: string, options: AnyWSLocalHook) => void; | ||
| createConfig: (app: AnyElysia) => { | ||
| upgrade(request: Request & { | ||
| readonly context?: Record<string, unknown>; | ||
| }): Promise<Response | { | ||
| context: any; | ||
| headers: any; | ||
| }>; | ||
| open(ws: Peer<import("crossws").AdapterInternal>): void; | ||
| message(ws: Peer<import("crossws").AdapterInternal>, message: import("crossws").Message): void; | ||
| close(ws: Peer<import("crossws").AdapterInternal>, detail: { | ||
| code?: number; | ||
| reason?: string; | ||
| }): void; | ||
| error(ws: Peer<import("crossws").AdapterInternal>, error: WSError): void; | ||
| }; | ||
| context: Record<string, NodeWebSocketContext>; | ||
| }; |
+37
-1
| // src/ws.ts | ||
| import { defineHooks } from "crossws"; | ||
| import { | ||
@@ -185,3 +186,38 @@ getSchemaValidator, | ||
| } | ||
| return { handler, context: store }; | ||
| function createConfig(app) { | ||
| return defineHooks({ | ||
| async upgrade(request) { | ||
| const id = request.wsId = randomId(); | ||
| const response = await app.handle(request); | ||
| const context = store[id]; | ||
| if (!context) return response; | ||
| return { | ||
| context, | ||
| headers: context.data.set.headers | ||
| }; | ||
| }, | ||
| open(ws) { | ||
| const context = ws.context; | ||
| context.open(ws); | ||
| }, | ||
| message(ws, message) { | ||
| const context = ws.context; | ||
| context.message(ws, message.text()); | ||
| }, | ||
| close(ws, detail) { | ||
| const context = ws.context; | ||
| context.close( | ||
| // ws is parsed in context.open | ||
| ws, | ||
| detail.code, | ||
| detail.reason | ||
| ); | ||
| }, | ||
| error(ws, error) { | ||
| const context = ws.context; | ||
| context.error?.(ws, error); | ||
| } | ||
| }); | ||
| } | ||
| return { handler, createConfig, context: store }; | ||
| } | ||
@@ -188,0 +224,0 @@ export { |
+4
-3
| { | ||
| "name": "@elysiajs/node", | ||
| "version": "1.4.3", | ||
| "version": "1.4.4", | ||
| "description": "Elysia adapter to run Elysia on Node.js", | ||
@@ -8,4 +8,5 @@ "license": "MIT", | ||
| "dev": "tsx --watch ./example/index.ts", | ||
| "test": "bun run test:node", | ||
| "test": "bun run test:node && bun run test:node-cluster", | ||
| "test:node": "npm install --prefix ./test/node/cjs/ && npm install --prefix ./test/node/esm/ && node ./test/node/cjs/index.js && node ./test/node/esm/index.js", | ||
| "test:node-cluster": "node ./test/cluster/cluster.cjs port && node ./test/cluster/cluster.cjs object && node ./test/cluster/cluster.cjs true && node ./test/cluster/cluster.cjs false", | ||
| "build": "bun build.ts", | ||
@@ -16,3 +17,3 @@ "release": "npm run build && npm run test && npm publish --access public" | ||
| "crossws": "^0.4.1", | ||
| "srvx": "^0.10.0" | ||
| "srvx": "^0.11.2" | ||
| }, | ||
@@ -19,0 +20,0 @@ "peerDependencies": { |
Sorry, the diff of this file is too big to display
203850
5.06%3950
6.99%+ Added
- Removed
Updated