UNPKG

multi-lane-manager

Version:

Nacos 泳道管理与请求路由组件

391 lines (389 loc) 23.2 kB
import { deregisterServiceInstance, getNacosLaneInstances, registerServiceInstance } from "./chunk-OFHMEPQ6.mjs"; import { proxyRequestWithFailover, selectInstance } from "./chunk-TPRQBNNR.mjs"; import { getConfig, getGlobalState, updateConfigPort } from "./chunk-WTX544FP.mjs"; import { logger } from "./chunk-XVCPZ7FX.mjs"; import { DEFAULT_LANE_TARGET_HEADER, DEFAULT_PORT, HEADER_LANE_DEBUG, HEADER_LANE_DETAIL, getSafeHeaderValue } from "./chunk-YVTE7PPA.mjs"; // src/runtime/server-utils.ts function parseCookieValue(cookieHeader, key) { console.log(`[multi-lane-manager] \u89E3\u6790Cookie: cookieHeader=${cookieHeader}, key=${key}`); if (!cookieHeader || !key) { console.log(`[multi-lane-manager] Cookie\u89E3\u6790\u5931\u8D25: cookieHeader\u6216key\u4E3A\u7A7A`); return void 0; } const cookies = cookieHeader.split(";"); console.log(`[multi-lane-manager] Cookie\u5206\u5272\u7ED3\u679C: ${JSON.stringify(cookies)}`); for (const cookie of cookies) { console.log(`[multi-lane-manager] \u5904\u7406Cookie\u7247\u6BB5: ${cookie}`); const parts = cookie.split("="); if (parts.length < 2) { console.log(`[multi-lane-manager] \u65E0\u6548\u7684Cookie\u683C\u5F0F: ${cookie}`); continue; } const cookieKey = parts[0].trim(); const cookieValue = parts.slice(1).join("=").trim(); console.log(`[multi-lane-manager] Cookie\u952E\u503C\u5BF9: key=${cookieKey}, value=${cookieValue}`); if (cookieKey.toLowerCase() === key.toLowerCase()) { console.log(`[multi-lane-manager] \u627E\u5230\u5339\u914D\u7684Cookie: ${cookieKey}=${cookieValue}`); return cookieValue; } } console.log(`[multi-lane-manager] \u672A\u627E\u5230\u5339\u914D\u7684Cookie: ${key}`); return void 0; } function getServerPort() { const port = parseInt(process.env.NITRO_PORT || process.env.PORT || String(DEFAULT_PORT), 10); logger.debug(`\u{1F50D} \u4ECE\u73AF\u5883\u53D8\u91CF\u83B7\u53D6\u670D\u52A1\u5668\u7AEF\u53E3: ${port}`); return port; } function detectPortAndRegisterOnFirstRequest() { logger.info(`====== \u{1F680} \u5F00\u59CB\u7AEF\u53E3\u68C0\u6D4B\u548C\u670D\u52A1\u6CE8\u518C\u6D41\u7A0B ======`); logger.debug(`\u{1F4CB} \u6B63\u5728\u52A0\u8F7D\u914D\u7F6E...`); const config = getConfig(); try { logger.debug(`\u{1F50D} \u68C0\u67E5\u6CF3\u9053\u529F\u80FD\u662F\u5426\u542F\u7528: ${config.isLaneEnabled}`); if (!config.isLaneEnabled) { logger.debug(`\u{1F6AB} \u6CF3\u9053\u529F\u80FD\u672A\u542F\u7528\uFF0C\u8DF3\u8FC7\u521D\u59CB\u6CE8\u518C`); return false; } const serverPort = getServerPort(); logger.info(`\u{1F50C} \u68C0\u6D4B\u5230\u670D\u52A1\u5668\u7AEF\u53E3: ${serverPort}`); const globalState = getGlobalState(); if (!globalState._laneMgrRegistered) { logger.info(`\u{1F195} \u9996\u6B21\u68C0\u6D4B\u5230\u7AEF\u53E3 ${serverPort}\uFF0C\u51C6\u5907\u6CE8\u518C\u670D\u52A1...`); globalState._laneMgrRegistered = true; globalState._laneMgrPort = serverPort; updateConfigPort(serverPort); registerServiceInstance(serverPort).then((success) => { if (success) { logger.info(`\u2705 \u670D\u52A1\u6CE8\u518C\u6210\u529F\uFF0C\u8BBE\u7F6E\u8FDB\u7A0B\u9000\u51FA\u5904\u7406\u7A0B\u5E8F`); const gracefulShutdown = async () => { logger.info(`\u{1F6D1} \u5E94\u7528\u9000\u51FA/\u4FE1\u53F7\uFF0C\u6B63\u5728\u6CE8\u9500\u670D\u52A1\uFF0C\u7AEF\u53E3=${serverPort}...`); await deregisterServiceInstance(serverPort); }; process.on("beforeExit", gracefulShutdown); process.on("SIGINT", async () => { logger.info("\u{1F534} \u6536\u5230 SIGINT \u4FE1\u53F7\uFF0C\u6267\u884C\u6CE8\u9500..."); await gracefulShutdown(); process.exit(0); }); process.on("SIGTERM", async () => { logger.info("\u{1F534} \u6536\u5230 SIGTERM \u4FE1\u53F7\uFF0C\u6267\u884C\u6CE8\u9500..."); await gracefulShutdown(); process.exit(0); }); } else { logger.warn(`\u26A0\uFE0F \u670D\u52A1\u6CE8\u518C\u5931\u8D25\uFF0C\u4E0D\u8BBE\u7F6E\u9000\u51FA\u5904\u7406\u7A0B\u5E8F`); } }).catch((err) => { logger.error(`\u274C \u6CE8\u518C\u8FC7\u7A0B\u4E2D\u51FA\u9519: ${err.message}`, err.stack); }); logger.info(`====== \u2705 \u7AEF\u53E3\u68C0\u6D4B\u548C\u670D\u52A1\u6CE8\u518C\u6D41\u7A0B\u5B8C\u6210\uFF0C\u8FD4\u56DE true ======`); return true; } else { logger.info(`\u2139\uFE0F \u670D\u52A1\u5DF2\u6CE8\u518C (\u7AEF\u53E3: ${globalState._laneMgrPort})\uFF0C\u8DF3\u8FC7\u521D\u59CB\u6CE8\u518C`); } logger.info(`====== \u2705 \u7AEF\u53E3\u68C0\u6D4B\u548C\u670D\u52A1\u6CE8\u518C\u6D41\u7A0B\u5B8C\u6210\uFF0C\u8FD4\u56DE false ======`); return false; } catch (error) { logger.error( `\u274C \u7AEF\u53E3\u68C0\u6D4B\u6216\u521D\u59CB\u6CE8\u518C\u9519\u8BEF: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error.stack : "" ); return false; } } function createServerMiddleware() { const config = getConfig(); console.log(`[multi-lane-manager] \u{1F527} \u670D\u52A1\u5668\u4E2D\u95F4\u4EF6\u521D\u59CB\u5316: \u542F\u7528\u72B6\u6001=${config.isLaneEnabled}, \u5F53\u524D\u6CF3\u9053ID=${config.currentLaneId}, \u670D\u52A1\u540D=${config.serviceName}, \u76EE\u6807\u6CF3\u9053Header=${config.targetLaneHeaderKey || DEFAULT_LANE_TARGET_HEADER.toLowerCase()}, Cookie\u68C0\u6D4B=${config.isLaneCookieEnabled ? "\u542F\u7528" : "\u7981\u7528"}`); logger.info( `\u{1F527} \u670D\u52A1\u5668\u4E2D\u95F4\u4EF6\u521D\u59CB\u5316: \u542F\u7528\u72B6\u6001=${config.isLaneEnabled}, \u5F53\u524D\u6CF3\u9053ID=${config.currentLaneId}, \u670D\u52A1\u540D=${config.serviceName}, \u76EE\u6807\u6CF3\u9053Header=${config.targetLaneHeaderKey || DEFAULT_LANE_TARGET_HEADER.toLowerCase()}, Cookie\u68C0\u6D4B=${config.isLaneCookieEnabled ? "\u542F\u7528" : "\u7981\u7528"}` ); return async (event) => { const debugHeaderKey = HEADER_LANE_DEBUG.toLowerCase(); const debugHeaderValue = event.node.req.headers[debugHeaderKey]; const isDebugMode = !!debugHeaderValue; console.log(`[multi-lane-manager] \u8C03\u8BD5\u6A21\u5F0F\u68C0\u6D4B: headerKey=${HEADER_LANE_DEBUG}, headerKeyLower=${debugHeaderKey}, value=${debugHeaderValue}, isDebugMode=${isDebugMode}`); const debugInfo = []; if (isDebugMode) { debugInfo.push(`\u8BF7\u6C42\u65F6\u95F4: ${(/* @__PURE__ */ new Date()).toISOString()}`); debugInfo.push(`\u8BF7\u6C42\u8DEF\u5F84: ${event.node.req.method} ${event.node.req.url || ""}`); debugInfo.push(`\u5F53\u524D\u6CF3\u9053: ${config.currentLaneId}`); debugInfo.push(`\u670D\u52A1\u540D\u79F0: ${config.serviceName}`); } if (event.context._laneManagerHandled) { if (isDebugMode) debugInfo.push(`\u72B6\u6001: \u8BF7\u6C42\u5DF2\u88AB\u6CF3\u9053\u7BA1\u7406\u5668\u5904\u7406\uFF0C\u8DF3\u8FC7`); logger.debug(`\u23ED\uFE0F \u8BF7\u6C42\u5DF2\u88AB\u6CF3\u9053\u7BA1\u7406\u5668\u5904\u7406\uFF0C\u8DF3\u8FC7`); return; } const requestPath = event.node.req.url || ""; if (event.path.startsWith("/_nuxt/")) { console.log(`[multi-lane-manager] Intercepting _nuxt request2: ${event.path}`); logger.info(`\u{1F50D} \u62E6\u622A\u5230\u9759\u6001\u8D44\u6E90\u8BF7\u6C42: ${event.path}`); } if (event.path.startsWith("/api/")) { console.log(`[multi-lane-manager] Intercepting API request: ${event.path}`); logger.info(`\u{1F50D} \u62E6\u622A\u5230API\u8BF7\u6C42: ${event.path}, \u65B9\u6CD5: ${event.node.req.method}, \u5934\u90E8: ${JSON.stringify(event.node.req.headers)}`); } console.log(`[multi-lane-manager] \u{1F4E5} \u4E2D\u95F4\u4EF6\u63A5\u6536\u8BF7\u6C42: ${event.node.req.method} ${requestPath}`); logger.debug(`\u{1F4E5} \u4E2D\u95F4\u4EF6\u63A5\u6536\u8BF7\u6C42: ${event.node.req.method} ${requestPath}`); if (!config.isLaneEnabled) { if (isDebugMode) debugInfo.push(`\u72B6\u6001: \u6CF3\u9053\u529F\u80FD\u672A\u542F\u7528\uFF0C\u8DF3\u8FC7\u4EE3\u7406\u903B\u8F91`); logger.debug(`\u{1F6AB} \u6CF3\u9053\u529F\u80FD\u672A\u542F\u7528\uFF0C\u8DF3\u8FC7\u4EE3\u7406\u903B\u8F91`); if (isDebugMode && !event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } return; } event.context._laneManagerProcessing = true; const headerKey = config.targetLaneHeaderKey || DEFAULT_LANE_TARGET_HEADER; console.log(`[multi-lane-manager] \u8BF7\u6C42\u5934\u4FE1\u606F:`, event.node.req.headers); const headerKeyLower = headerKey.toLowerCase(); const requestTargetLaneIdHeaderValue = event.node.req.headers[headerKeyLower]; let requestTargetLaneId = Array.isArray(requestTargetLaneIdHeaderValue) ? requestTargetLaneIdHeaderValue[0]?.trim() : requestTargetLaneIdHeaderValue?.trim(); console.log(`[multi-lane-manager] \u5C1D\u8BD5\u4ECE\u8BF7\u6C42\u5934\u83B7\u53D6\u6CF3\u9053ID: headerKey=${headerKey}, headerKeyLower=${headerKeyLower}, value=${requestTargetLaneIdHeaderValue}`); if (isDebugMode) { debugInfo.push(`\u76EE\u6807\u6CF3\u9053Header\u952E: ${headerKey} (\u5B9E\u9645\u67E5\u627E: ${headerKeyLower})`); } if (!requestTargetLaneId && config.isLaneCookieEnabled) { const cookieHeader = event.node.req.headers.cookie; if (cookieHeader) { console.log(`[multi-lane-manager] Cookie\u4FE1\u606F: ${cookieHeader}`); const cookieKey = headerKey; const cookieValue = parseCookieValue(cookieHeader, cookieKey); console.log(`[multi-lane-manager] \u5C1D\u8BD5\u4ECECookie\u83B7\u53D6\u6CF3\u9053ID: cookieKey=${cookieKey}, value=${cookieValue}`); if (cookieValue) { requestTargetLaneId = cookieValue.trim(); console.log(`[multi-lane-manager] \u{1F36A} \u4ECECookie\u4E2D\u83B7\u53D6\u5230\u6CF3\u9053ID: ${requestTargetLaneId}, Cookie\u952E\u540D: ${cookieKey}`); logger.debug(`\u{1F36A} \u4ECECookie\u4E2D\u83B7\u53D6\u5230\u6CF3\u9053ID: ${requestTargetLaneId}, Cookie\u952E\u540D: ${cookieKey}`); if (isDebugMode) debugInfo.push(`\u6CF3\u9053ID\u6765\u6E90: Cookie, \u503C: ${requestTargetLaneId}`); } else if (isDebugMode) { debugInfo.push(`Cookie\u4E2D\u672A\u627E\u5230\u6CF3\u9053ID, Cookie\u952E: ${cookieKey}`); } } else if (isDebugMode) { debugInfo.push(`\u8BF7\u6C42\u4E2D\u6CA1\u6709Cookie`); } } else if (requestTargetLaneId) { console.log(`[multi-lane-manager] \u{1F524} \u4ECEHeader\u4E2D\u83B7\u53D6\u5230\u6CF3\u9053ID: ${requestTargetLaneId}`); logger.debug(`\u{1F524} \u4ECEHeader\u4E2D\u83B7\u53D6\u5230\u6CF3\u9053ID: ${requestTargetLaneId}`); if (isDebugMode) debugInfo.push(`\u6CF3\u9053ID\u6765\u6E90: Header, \u503C: ${requestTargetLaneId}`); } else if (isDebugMode) { debugInfo.push(`\u672A\u627E\u5230\u6CF3\u9053ID`); } if (requestTargetLaneId && requestTargetLaneId !== config.currentLaneId) { const sourceType = event.node.req.headers[headerKey] ? "Header" : "Cookie"; console.log(`[multi-lane-manager] \u{1F500} \u68C0\u6D4B\u5230\u8DE8\u6CF3\u9053\u8BF7\u6C42: \u5F53\u524D\u6CF3\u9053=${config.currentLaneId}, \u76EE\u6807\u6CF3\u9053=${requestTargetLaneId} (\u6765\u6E90: ${sourceType}), \u8DEF\u5F84: ${event.path}`); logger.info(`\u{1F500} \u68C0\u6D4B\u5230\u8DE8\u6CF3\u9053\u8BF7\u6C42: \u5F53\u524D\u6CF3\u9053=${config.currentLaneId}, \u76EE\u6807\u6CF3\u9053=${requestTargetLaneId} (\u6765\u6E90: ${sourceType}), \u8DEF\u5F84: ${event.path}`); if (isDebugMode) { debugInfo.push(`\u5904\u7406: \u8DE8\u6CF3\u9053\u8BF7\u6C42`); debugInfo.push(`\u76EE\u6807\u6CF3\u9053: ${requestTargetLaneId}`); } } else if (!requestTargetLaneId) { logger.debug(`\u{1F50D} \u8BF7\u6C42\u672A\u6307\u5B9A\u6CF3\u9053ID\uFF0C\u5C1D\u8BD5\u67E5\u627E baseline \u6CF3\u9053\u5B9E\u4F8B`); if (isDebugMode) { debugInfo.push(`\u5904\u7406: \u672A\u6307\u5B9A\u6CF3\u9053ID\uFF0C\u5C1D\u8BD5\u8DEF\u7531\u5230 baseline \u6CF3\u9053`); } if (config.currentLaneId === "baseline") { logger.debug(`\u2705 \u5F53\u524D\u5DF2\u662F baseline \u6CF3\u9053\uFF0C\u5728\u672C\u5730\u5904\u7406\u8BF7\u6C42`); if (isDebugMode) { debugInfo.push(`\u72B6\u6001: \u5F53\u524D\u5DF2\u662F baseline \u6CF3\u9053\uFF0C\u5728\u672C\u5730\u5904\u7406`); if (!event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } } event.context._laneManagerProcessing = false; return; } requestTargetLaneId = "baseline"; if (isDebugMode) { debugInfo.push(`\u76EE\u6807\u6CF3\u9053: ${requestTargetLaneId} (\u9ED8\u8BA4)`); } } if (requestTargetLaneId && requestTargetLaneId !== config.currentLaneId) { try { const targetInstances = await getNacosLaneInstances(config.serviceName, requestTargetLaneId, true); if (isDebugMode) { debugInfo.push(`\u627E\u5230\u5B9E\u4F8B\u6570\u91CF: ${targetInstances.length}`); } if (targetInstances.length > 0) { const targetInstance = selectInstance( targetInstances, config.serviceName, "round-robin" /* ROUND_ROBIN */ ); if (isDebugMode) { debugInfo.push(`\u9009\u62E9\u5B9E\u4F8B: ${targetInstance.ip}:${targetInstance.port}`); debugInfo.push(`\u8D1F\u8F7D\u5747\u8861\u7B56\u7565: ROUND_ROBIN`); if (!event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } } await proxyRequestWithFailover(event, targetInstance, isDebugMode, targetInstances); return; } else { if (requestTargetLaneId === "baseline" && !event.node.req.headers[headerKey]) { logger.info(`\u{1F504} \u672A\u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053 ${config.currentLaneId} \u5904\u7406\u8BF7\u6C42`); if (isDebugMode) { debugInfo.push(`\u72B6\u6001: \u672A\u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053\u5904\u7406`); if (!event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } } event.context._laneManagerProcessing = false; return; } logger.warn(`\u26A0\uFE0F \u672A\u627E\u5230\u6CF3\u9053 ${requestTargetLaneId} \u7684\u5065\u5EB7\u5B9E\u4F8B\uFF0C\u5C1D\u8BD5\u67E5\u627E baseline \u6CF3\u9053`); if (isDebugMode) { debugInfo.push(`\u8B66\u544A: \u672A\u627E\u5230\u6CF3\u9053 ${requestTargetLaneId} \u7684\u5065\u5EB7\u5B9E\u4F8B\uFF0C\u5C1D\u8BD5\u67E5\u627E baseline \u6CF3\u9053`); } if (config.currentLaneId === "baseline") { console.log(`[multi-lane-manager] \u5F53\u524D\u5B9E\u4F8B\u5DF2\u662F baseline \u6CF3\u9053\uFF0C\u76F4\u63A5\u672C\u5730\u5904\u7406\u8BF7\u6C42\uFF0C\u907F\u514D\u65E0\u9650\u8F6C\u53D1`); logger.info(`\u{1F504} \u5F53\u524D\u5B9E\u4F8B\u5DF2\u662F baseline \u6CF3\u9053\uFF0C\u76F4\u63A5\u672C\u5730\u5904\u7406\u8BF7\u6C42\uFF0C\u907F\u514D\u65E0\u9650\u8F6C\u53D1`); if (isDebugMode) { debugInfo.push(`\u72B6\u6001: \u5F53\u524D\u5B9E\u4F8B\u5DF2\u662F baseline \u6CF3\u9053\uFF0C\u76F4\u63A5\u672C\u5730\u5904\u7406\u8BF7\u6C42\uFF0C\u907F\u514D\u65E0\u9650\u8F6C\u53D1`); if (!event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } } event.context._laneManagerProcessing = false; return; } if (requestTargetLaneId !== "baseline") { console.log(`[multi-lane-manager] \u5C1D\u8BD5\u67E5\u627E baseline \u6CF3\u9053\u5B9E\u4F8B`); const baselineInstances = await getNacosLaneInstances(config.serviceName, "baseline", true); if (baselineInstances.length > 0) { console.log(`[multi-lane-manager] \u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5C06\u8BF7\u6C42\u8F6C\u53D1\u5230 baseline \u6CF3\u9053`); logger.info(`\u2705 \u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5C06\u8BF7\u6C42\u8F6C\u53D1\u5230 baseline \u6CF3\u9053`); if (isDebugMode) { debugInfo.push(`\u72B6\u6001: \u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5C06\u8BF7\u6C42\u8F6C\u53D1\u5230 baseline \u6CF3\u9053`); } const baselineInstance = selectInstance( baselineInstances, config.serviceName, "round-robin" /* ROUND_ROBIN */ ); if (isDebugMode) { debugInfo.push(`\u9009\u62E9\u5B9E\u4F8B: ${baselineInstance.ip}:${baselineInstance.port}`); debugInfo.push(`\u8D1F\u8F7D\u5747\u8861\u7B56\u7565: ROUND_ROBIN`); if (!event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } } await proxyRequestWithFailover(event, baselineInstance, isDebugMode, baselineInstances); return; } else { console.log(`[multi-lane-manager] \u672A\u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053\u5904\u7406\u8BF7\u6C42`); logger.info(`\u{1F504} \u672A\u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053 ${config.currentLaneId} \u5904\u7406\u8BF7\u6C42`); if (isDebugMode) { debugInfo.push(`\u72B6\u6001: \u672A\u627E\u5230 baseline \u6CF3\u9053\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053\u5904\u7406\u8BF7\u6C42`); } event.context._laneManagerProcessing = false; if (isDebugMode && !event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } return; } } else { console.log(`[multi-lane-manager] \u5DF2\u7ECF\u662F baseline \u6CF3\u9053\u4F46\u672A\u627E\u5230\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053\u5904\u7406\u8BF7\u6C42`); logger.info(`\u{1F504} \u5DF2\u7ECF\u662F baseline \u6CF3\u9053\u4F46\u672A\u627E\u5230\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053 ${config.currentLaneId} \u5904\u7406\u8BF7\u6C42`); if (isDebugMode) { debugInfo.push(`\u72B6\u6001: \u5DF2\u7ECF\u662F baseline \u6CF3\u9053\u4F46\u672A\u627E\u5230\u5B9E\u4F8B\uFF0C\u5728\u5F53\u524D\u6CF3\u9053\u5904\u7406\u8BF7\u6C42`); } event.context._laneManagerProcessing = false; if (isDebugMode && !event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } return; } } } catch (e) { logger.error(`\u274C \u5904\u7406\u8DE8\u6CF3\u9053\u8BF7\u6C42\u65F6\u53D1\u751F\u9519\u8BEF: ${e instanceof Error ? e.message : String(e)}`); if (isDebugMode) { debugInfo.push(`\u9519\u8BEF: ${e instanceof Error ? e.message : String(e)}`); } if (!event.node.res.headersSent) { if (isDebugMode) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } event.node.res.statusCode = 500; event.node.res.setHeader("Content-Type", "text/plain"); event.node.res.end("\u5904\u7406\u6CF3\u9053\u8BF7\u6C42\u65F6\u53D1\u751F\u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF\u3002"); } event.context._laneManagerHandled = true; return; } } logger.debug(`\u2705 \u8BF7\u6C42\u5728\u5F53\u524D\u6CF3\u9053 (${config.currentLaneId}) \u5904\u7406\u6216\u65E0\u76EE\u6807\u6CF3\u9053\u6307\u5B9A\uFF0C\u5C06\u7531\u540E\u7EED\u5904\u7406\u7A0B\u5E8F\u5904\u7406\u3002`); if (isDebugMode) { debugInfo.push(`\u5904\u7406: \u5728\u5F53\u524D\u6CF3\u9053\u5904\u7406\u8BF7\u6C42`); if (!event.node.res.headersSent) { try { event.node.res.setHeader(HEADER_LANE_DETAIL, getSafeHeaderValue(debugInfo)); } catch (error) { logger.error(`\u274C \u8BBE\u7F6E\u8C03\u8BD5\u54CD\u5E94\u5934\u65F6\u51FA\u9519: ${error instanceof Error ? error.message : String(error)}`); } } } event.context._laneManagerProcessing = false; }; } export { getServerPort, detectPortAndRegisterOnFirstRequest, createServerMiddleware }; //# sourceMappingURL=chunk-VD4KK2BL.mjs.map