From 78b73402e4a963132db44e8cb62f2589c7b7b01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Fri, 23 Aug 2024 15:16:10 +0200 Subject: [PATCH] fix: stale value in closure --- .../src/runtime/handler-web-and-node.ts | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/vike-node/src/runtime/handler-web-and-node.ts b/packages/vike-node/src/runtime/handler-web-and-node.ts index 9193594..86525ac 100644 --- a/packages/vike-node/src/runtime/handler-web-and-node.ts +++ b/packages/vike-node/src/runtime/handler-web-and-node.ts @@ -1,30 +1,44 @@ import { isNodeLike } from '../utils/isNodeLike.js' -import type { VikeOptions, WebHandler } from './types.js' +import type { VikeOptions } from './types.js' -export function createHandler(options: VikeOptions = {}) { - let nodeLike = undefined - let nodeHandler: WebHandler | undefined = undefined - let webHandler: WebHandler | undefined = undefined +type Handler = (params: { + request: Request + platformRequest: PlatformRequest +}) => Response | undefined | Promise - return async function handler({ request, platformRequest }: { request: Request; platformRequest: PlatformRequest }) { +export function createHandler(options: VikeOptions = {}): Handler { + let nodeLike: boolean | undefined = undefined + let nodeHandler: Handler | undefined = undefined + let webHandler: Handler | undefined = undefined + + return async function handler({ request, platformRequest }) { if (request.method !== 'GET') { return undefined } + nodeLike ??= await isNodeLike() + if (nodeLike) { if (!nodeHandler) { - const connectToWeb = (await import('./adapters/connectToWeb.js')).connectToWeb - const handler = (await import('./handler-node-only.js')).createHandler(options) - nodeHandler = connectToWeb((req, res, next) => handler!({ req, res, platformRequest, next })) + const { connectToWeb } = await import('./adapters/connectToWeb.js') + const { createHandler } = await import('./handler-node-only.js') + const nodeOnlyHandler = createHandler(options) + nodeHandler = ({ request, platformRequest }) => { + const connectedHandler = connectToWeb((req, res, next) => + nodeOnlyHandler({ req, res, platformRequest, next }) + ) + return connectedHandler(request) + } } - return nodeHandler(request) + + return nodeHandler({ request, platformRequest }) } if (!webHandler) { - const handler = (await import('./handler-web-only.js')).createHandler(options) - webHandler = (request) => handler({ request, platformRequest }) + const { createHandler } = await import('./handler-web-only.js') + webHandler = createHandler(options) } - return webHandler(request) + return webHandler({ request, platformRequest }) } }