import type { VextApp } from "../../types/app.js"; import type { AppInternals } from "../app.js"; import type { VextServerHandle } from "../../types/adapter.js"; import type { WorkerHeartbeatMessage, WorkerMetricsMessage, WorkerReadyMessage, WorkerRequestRestartMessage } from "./ipc-types.js"; /** * Worker 运行时配置 * * 从环境变量和 VextConfig 中提取。 */ export interface WorkerConfig { /** Worker 编号(来自 VEXT_WORKER_ID 环境变量) */ workerId: string; /** * 内存阈值(字节) * * 堆内存超过此值时 Worker 主动请求 Master 重启。 * 可通过 config.cluster.memoryThreshold 配置。 * * @default 1073741824 (1GB) */ memoryThreshold: number; /** * Worker 数量(用于 cluster 兼容性检测) * * 由 Master 通过 VEXT_WORKER_COUNT 环境变量传入。 */ workerCount: number; } /** * WorkerContext — Worker 运行时上下文 * * 持有所有定时器和资源引用,便于统一清理。 */ interface WorkerContext { /** 心跳定时器 */ heartbeatTimer: ReturnType | null; /** 指标上报定时器 */ metricsTimer: ReturnType | null; /** 内存检测定时器 */ memoryCheckTimer: ReturnType | null; /** bootstrap 返回的资源引用 */ app: VextApp | null; internals: AppInternals | null; serverHandle: VextServerHandle | null; /** 是否已触发关闭 */ isShuttingDown: boolean; } /** * workerMain — Worker 进程主入口 * * 由 bootstrap.ts 在 cluster.isWorker 且 VEXT_MODE='start' 时调用。 * * 完整流程: * 1. 读取环境变量,确定 Worker 编号和配置 * 2. 执行标准 bootstrap()(完整启动流程) * 3. 注册 IPC 消息处理器(响应 Master 指令) * 4. 通知 Master 已就绪(发送 'ready' 消息) * 5. 启动心跳定时器 * 6. 启动指标上报定时器 * 7. 启动内存检测定时器 * 8. 执行 cluster 兼容性检测(打印 WARN) * * 错误处理: * bootstrap 失败 → 打印错误 → process.exit(1) * Master 连接断开(disconnect)→ 触发优雅关闭 * * @param rootDir 用户项目根目录(与 bootstrap 共用) * @param bootstrapFn bootstrap 函数引用(避免循环依赖,由调用方传入) * * @example * ```typescript * // 在 bootstrap.ts 的 cluster.isWorker 分支中调用 * import { workerMain } from './cluster/worker.js' * import { bootstrap } from './bootstrap.js' * * await workerMain(rootDir, bootstrap) * ``` */ export declare function workerMain(rootDir: string, bootstrapFn: (rootDir: string) => Promise<{ app: VextApp; serverHandle: VextServerHandle; internals: AppInternals; }>): Promise; /** * registerIPCHandlers — 注册 Master → Worker IPC 消息处理器 * * 处理的消息类型: * - set-title: 设置 process.title * - shutdown: 触发优雅关闭 * - health-check: 立即回复心跳 * - broadcast: 转发给 app 事件系统(后续扩展用) */ declare function registerIPCHandlers(ctx: WorkerContext, config: WorkerConfig): void; /** * shutdownWorker — 触发 Worker 优雅关闭 * * 调用 internals.shutdown(serverHandle) 执行完整的关闭流程: * 1. 停止接受新请求 * 2. 等待飞行中请求完成 * 3. 执行 onClose 钩子 * 4. process.exit(0) * * 同时清理 Worker 自己的定时器(心跳 / 指标 / 内存检测)。 */ declare function shutdownWorker(ctx: WorkerContext, config: WorkerConfig): void; /** * startHeartbeat — 启动心跳定时器 * * 每 HEARTBEAT_INTERVAL 毫秒向 Master 发送心跳消息。 * Master 通过 lastHeartbeat 时间戳检测 Worker 是否存活。 * * 定时器使用 .unref() 不阻止进程退出。 * * @returns 定时器引用(用于清理) */ declare function startHeartbeat(): ReturnType; /** * startMetricsReporter — 启动指标上报定时器 * * 每 METRICS_INTERVAL 毫秒向 Master 上报运行指标。 * 包含内存使用详情、活跃请求数、累计请求数、平均响应时间。 * * 当前版本指标来源: * - 内存:process.memoryUsage() * - 请求计数:固定为 0(后续由 response-wrapper 累加器提供) * * 定时器使用 .unref() 不阻止进程退出。 * * @param app VextApp 实例 * @returns 定时器引用(用于清理) */ declare function startMetricsReporter(app: VextApp): ReturnType; /** * startMemoryMonitor — 启动内存阈值检测定时器 * * 每 MEMORY_CHECK_INTERVAL 毫秒检查堆内存使用量。 * 超过阈值时向 Master 发送 'request-restart' 消息, * Master 会 fork 新 Worker 替换当前 Worker。 * * 注意: * - 仅发送一次请求(通过 requested 标志防止重复) * - 不立即退出,等待 Master 发送 shutdown 指令 * - Worker 继续处理请求直到被替换 * * @param config Worker 配置 * @returns 定时器引用(用于清理) */ declare function startMemoryMonitor(config: WorkerConfig): ReturnType; /** * sendToMaster — 向 Master 发送 IPC 消息 * * 封装 process.send(),添加 null 检查和错误捕获。 * * process.send 不存在的场景: * - 进程不是通过 fork() 创建的 * - IPC channel 已断开 */ declare function sendToMaster(msg: WorkerReadyMessage | WorkerHeartbeatMessage | WorkerMetricsMessage | WorkerRequestRestartMessage): void; /** * cleanupTimers — 清理所有 Worker 定时器 * * 在 Worker 关闭或 bootstrap 失败时调用。 */ declare function cleanupTimers(ctx: WorkerContext): void; /** * @internal 仅供单元测试直接访问 */ export declare const _internals: { readonly HEARTBEAT_INTERVAL: 10000; readonly METRICS_INTERVAL: 30000; readonly DEFAULT_MEMORY_THRESHOLD: number; readonly MEMORY_CHECK_INTERVAL: 60000; readonly sendToMaster: typeof sendToMaster; readonly cleanupTimers: typeof cleanupTimers; readonly registerIPCHandlers: typeof registerIPCHandlers; readonly shutdownWorker: typeof shutdownWorker; readonly startHeartbeat: typeof startHeartbeat; readonly startMetricsReporter: typeof startMetricsReporter; readonly startMemoryMonitor: typeof startMemoryMonitor; }; export {};