multi-lane-manager
Version:
Nacos 泳道管理与请求路由组件
391 lines (389 loc) • 23.2 kB
JavaScript
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