sqlite-executor 4.0.9 → 4.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"esm/index.mjs","sources":["webpack://sqlite-executor/./src/utils/timeout.js","webpack://sqlite-executor/./src/core/parser.js","webpack://sqlite-executor/./src/constants.js","webpack://sqlite-executor/./src/stream/stream.js","webpack://sqlite-executor/./src/transaction/transaction.js","webpack://sqlite-executor/./src/which.js","webpack://sqlite-executor/./src/core/process.js","webpack://sqlite-executor/./src/utils/token.js","webpack://sqlite-executor/./src/core/lruCache.js","webpack://sqlite-executor/./src/utils/escape.js","webpack://sqlite-executor/./src/utils/interpolate.js","webpack://sqlite-executor/./src/utils/constants.js","webpack://sqlite-executor/./src/utils/normalize.js","webpack://sqlite-executor/./src/core/classifier.js","webpack://sqlite-executor/./src/core/queue.js","webpack://sqlite-executor/./src/core/inflightTracker.js","webpack://sqlite-executor/./src/core/settleUtils.js","webpack://sqlite-executor/./src/core/protocol.js","webpack://sqlite-executor/./src/core/pipelineUtils.js","webpack://sqlite-executor/./src/core/taskWorker.js","webpack://sqlite-executor/./src/core/readerPool.js","webpack://sqlite-executor/./src/core/metrics.js","webpack://sqlite-executor/./src/core/transactionScope.js","webpack://sqlite-executor/./src/core/pipelineEngine.js","webpack://sqlite-executor/./src/core/executor.js"],"sourcesContent":["/** 默认 SQL 超时时间(毫秒) */\nexport const DEFAULT_STATEMENT_TIMEOUT = 30_000;\n\n/**\n * 创建一个描述 SQL 超时的 Error 对象。\n * 消息格式:`SQLite statement timed out after {timeout}ms: {sql}`\n * @param {number} timeout - 超时毫秒数\n * @param {string} sql - 超时的 SQL 语句(已标准化)\n * @returns {Error}\n */\nexport function createTimeoutError(timeout, sql) {\n\treturn new Error(`SQLite statement timed out after ${timeout}ms: ${sql}`);\n}\n","/**\n * 将任意值统一转为 Error 对象。\n * 如果已是 Error 实例则原样返回,否则将其字符串化后包装为新 Error。\n * @param {unknown} value\n * @returns {Error}\n */\nexport function toError(value) {\n\treturn value instanceof Error ? value : new Error(String(value));\n}\n\nconst CHAR_QUOTE = 34; // \"\nconst CHAR_BACKSLASH = 92; // \\\nconst CHAR_OPEN_BRACKET = 91; // [\nconst CHAR_CLOSE_BRACKET = 93; // ]\nconst CHAR_OPEN_BRACE = 123; // {\nconst CHAR_CLOSE_BRACE = 125; // }\nconst CHAR_COMMA = 44; // ,\nconst CHAR_SPACE = 32; //\nconst CHAR_TAB = 9; // \\t\nconst CHAR_LF = 10; // \\n\nconst CHAR_CR = 13; // \\r\n\n/**\n * 判断字符码是否为空白字符(空格、制表符、换行、回车)。\n * @param {number} code\n * @returns {boolean}\n */\nfunction isWhitespaceCode(code) {\n\treturn code === CHAR_SPACE || code === CHAR_TAB || code === CHAR_LF || code === CHAR_CR;\n}\n\n/**\n * 创建一个 JSON 值解析器,逐字符扫描流式数据,检测完整的顶层 JSON 值\n *(对象或数组),解析出完整的 JSON 文本后通过回调通知。\n *\n * 核心逻辑是一个状态机,维护以下状态:\n * start — 当前正在累积的顶层 JSON 值在 buffer 中的起始位置,-1 表示未开始\n * nesting — 当前嵌套深度(遇到 [ 或 { 递增,遇到 ] 或 } 递减)\n * inString — 是否在字符串内部(字符串内的括号不计入嵌套深度)\n * escaped — 前一个字符是否为反斜杠(用于处理字符串内的转义 \\\" \\\\ 等)\n *\n * 支持流式分块输入,通过 readPos 记录上次扫描位置,避免多次分块间重复扫描已处理数据。\n *\n * 关键优化:空数组 [] 走 fast path,直接跳过 slice 和 onValue 回调。\n *\n * @param {(raw: string) => void} onValue - 每当解析出一个完整 JSON 值时被调用\n * @returns {{\n * feed(chunk: string): void,\n * reset(): void,\n * buffer: string,\n * start: number,\n * readPos: number,\n * nesting: number,\n * inString: boolean,\n * escaped: boolean,\n * }}\n */\nexport function createJsonValueParser(onValue) {\n\treturn {\n\t\t// 累积的未解析原始数据\n\t\tbuffer: \"\",\n\t\t// 当前顶层 JSON 值在 buffer 中的起始索引,-1 表示未开始扫描顶层值\n\t\tstart: -1,\n\t\t// 上次扫描到的位置,下次 feed 从这继续,避免重复扫描\n\t\treadPos: 0,\n\t\t// 嵌套深度:遇到 [ 或 { 递增,遇到 ] 或 } 递减;归零表示一个完整值结束\n\t\tnesting: 0,\n\t\t// 是否在一对双引号内部(字符串内的括号不参与 nesting 计数)\n\t\tinString: false,\n\t\t// 前一个字符是否为反斜杠(处理字符串中的转义序列 \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\uXXXX)\n\t\tescaped: false,\n\t\t// 已累积消费的字节数,用于延迟 buffer 物理裁剪,减少 String 分配和 GC 压力\n\t\t_consumed: 0,\n\t\tfeed(chunk) {\n\t\t\t// 1. 将新数据追加到 buffer 尾部\n\t\t\tthis.buffer += chunk;\n\t\t\tlet consumeUntil = 0;\n\n\t\t\t// 将状态缓存到局部变量,避免热循环中反复访问 this.* 引发的隐藏类查找\n\t\t\tconst buffer = this.buffer;\n\t\t\tlet start = this.start;\n\t\t\tlet nesting = this.nesting;\n\t\t\tlet inString = this.inString;\n\t\t\tlet escaped = this.escaped;\n\n\t\t\t// 2. 从上次处理到的位置继续扫描\n\t\t\tfor (let index = this.readPos; index < buffer.length; index++) {\n\t\t\t\tconst code = buffer.charCodeAt(index);\n\n\t\t\t\t// === 状态 A:未开始解析顶层值,跳过空白,寻找 [ 或 { ===\n\t\t\t\tif (start === -1) {\n\t\t\t\t\tif (isWhitespaceCode(code)) continue;\n\t\t\t\t\tif (code !== CHAR_OPEN_BRACKET && code !== CHAR_OPEN_BRACE) continue;\n\t\t\t\t\t// 找到顶层值的起始位置,初始化嵌套计数\n\t\t\t\t\tstart = index;\n\t\t\t\t\tnesting = 1;\n\t\t\t\t\tinString = false;\n\t\t\t\t\tescaped = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 状态 B:在字符串内部,处理转义序列 ===\n\t\t\t\tif (inString) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\t// 前一个字符是反斜杠,当前字符被转义,重置 escaped\n\t\t\t\t\t\tescaped = false;\n\t\t\t\t\t} else if (code === CHAR_BACKSLASH) {\n\t\t\t\t\t\t// 遇到反斜杠,标记下一个字符为转义状态\n\t\t\t\t\t\tescaped = true;\n\t\t\t\t\t} else if (code === CHAR_QUOTE) {\n\t\t\t\t\t\t// 遇到未转义的双引号,字符串结束\n\t\t\t\t\t\tinString = false;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 状态 C:不在字符串内,遇到双引号则进入字符串 ===\n\t\t\t\tif (code === CHAR_QUOTE) {\n\t\t\t\t\tinString = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 状态 D:不在字符串内,处理嵌套结构 ===\n\t\t\t\tif (code === CHAR_OPEN_BRACKET || code === CHAR_OPEN_BRACE) {\n\t\t\t\t\t// 进入一层嵌套\n\t\t\t\t\tnesting++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (code === CHAR_CLOSE_BRACKET || code === CHAR_CLOSE_BRACE) {\n\t\t\t\t\t// 退出一层嵌套\n\t\t\t\t\tnesting--;\n\t\t\t\t\tif (nesting === 0) {\n\t\t\t\t\t\t// 嵌套归零 → 一个完整的顶层 JSON 值解析完成\n\t\t\t\t\t\t// Fast path: 空数组 [],index === start + 1,无需 slice 和回调\n\t\t\t\t\t\tif (index === start + 1) {\n\t\t\t\t\t\t\tstart = -1;\n\t\t\t\t\t\t\tconsumeUntil = index + 1;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 正常路径:切片出完整 JSON 文本,通过回调通知\n\t\t\t\t\t\tconst raw = buffer.slice(start, index + 1);\n\t\t\t\t\t\tstart = -1;\n\t\t\t\t\t\tonValue(raw);\n\t\t\t\t\t\tconsumeUntil = index + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 将局部状态写回 this,供下次 feed 调用继续使用\n\t\t\tthis.start = start;\n\t\t\tthis.nesting = nesting;\n\t\t\tthis.inString = inString;\n\t\t\tthis.escaped = escaped;\n\n\t\t\t// 3. 清理已消费部分:用 _consumed 记录已消费位置而非每次都物理裁剪 buffer。\n\t\t\t// 避免每个完整值都产生一次 String 分配(buffer.slice),\n\t\t\t// 仅在累积超过 64KB 时一次性物理裁剪,减少 GC 压力。\n\t\t\t// 注意:consumeUntil 是相对 buffer 起始的绝对位置,直接赋值即可。\n\t\t\tif (consumeUntil > 0) {\n\t\t\t\tthis._consumed = consumeUntil;\n\t\t\t\t// 当有未完成的部分值(start !== -1)时,readPos 跳到 buffer 末尾\n\t\t\t\t// 避免下次 feed 重扫已计入 nesting 的 [/{ 字符,\n\t\t\t\t// 同时保留 nested/inString/escaped 状态供继续解析。\n\t\t\t\tthis.readPos = this.start !== -1 ? buffer.length : this._consumed;\n\t\t\t\tif (this._consumed > 65536) {\n\t\t\t\t\tif (this.start !== -1) this.start -= this._consumed;\n\t\t\t\t\tthis.buffer = this.buffer.slice(this._consumed);\n\t\t\t\t\tthis.readPos = this.buffer.length;\n\t\t\t\t\tthis._consumed = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 没有完整值被消费,记录当前位置,下次 feed 从此继续\n\t\t\t\tthis.readPos = buffer.length;\n\t\t\t}\n\t\t},\n\t\treset() {\n\t\t\tthis.buffer = \"\";\n\t\t\tthis._consumed = 0;\n\t\t\tthis.start = -1;\n\t\t\tthis.readPos = 0;\n\t\t\tthis.nesting = 0;\n\t\t\tthis.inString = false;\n\t\t\tthis.escaped = false;\n\t\t},\n\t};\n}\n\n/**\n * 创建一个行流解析器,用于解析 sqlite3 `-json` 模式下输出的 JSON 数组。\n * 不是在数组整体解析完后一次性返回,而是在每个元素到达时逐行回调 `onRow`,\n * 支持分块输入、嵌套对象/数组、转义字符串。\n *\n * 核心状态机比 createJsonValueParser 更复杂,因为需要在数组上下文中\n * 逐个识别元素边界(逗号分隔,] 结束),而不是只匹配顶层括号匹配。\n *\n * 解析流程概览:\n * 1. 跳过空白,等待 [ → 标记 started\n * 2. 跳过空白和逗号,等待元素起始 → 记录 elementStart\n * 3. 扫描元素内容,跟踪 nesting 深度直到归零 → 记录 elementEnd\n * 4. 向前 look-ahead 确认后面是逗号或 ](即元素完全结束)→ 回调 onRow 并截断已处理部分\n * 5. 遇到 ] → 标记 finished,返回剩余数据\n *\n * @param {(rawRow: string) => void} onRow - 每当解析出一个数组元素时被调用,传入元素的原始 JSON 文本\n * @returns {{\n * feed(chunk: string): string,\n * reset(): void,\n * buffer: string,\n * started: boolean,\n * finished: boolean,\n * inString: boolean,\n * escaped: boolean,\n * elementStart: number,\n * elementEnd: number,\n * nesting: number,\n * readPos: number,\n * }}\n */\nexport function createRowStreamParser(onRow) {\n\treturn {\n\t\tbuffer: \"\",\n\t\t// 是否已遇到数组开始的 [\n\t\tstarted: false,\n\t\t// 是否已遇到数组结束的 ],之后 feed 直接返回输入\n\t\tfinished: false,\n\t\t// 是否在字符串内部\n\t\tinString: false,\n\t\t// 前一个字符是否为反斜杠\n\t\tescaped: false,\n\t\t// 当前元素在 buffer 中的起始位置\n\t\telementStart: -1,\n\t\t// 当前元素在 buffer 中的结束位置(exclusive)\n\t\telementEnd: -1,\n\t\t// 当前元素的嵌套深度(用于处理元素内部的嵌套结构)\n\t\tnesting: 0,\n\t\t// 上次扫描位置\n\t\treadPos: 0,\n\t\t// 已累积消费的字节数,用于延迟 buffer 物理裁剪\n\t\t_consumed: 0,\n\t\tfeed(chunk) {\n\t\t\t// 如果数组已结束,直接返回新数据\n\t\t\tif (this.finished) return chunk;\n\n\t\t\t// 1. 追加新数据到 buffer;将状态缓存到局部变量避免隐藏类查找\n\t\t\tthis.buffer += chunk;\n\n\t\t\t// 使用 let 以便 64KB 物理裁剪时同步更新局部引用\n\t\t\tlet buffer = this.buffer;\n\t\t\tlet started = this.started;\n\t\t\tlet inString = this.inString;\n\t\t\tlet escaped = this.escaped;\n\t\t\tlet elementStart = this.elementStart;\n\t\t\tlet elementEnd = this.elementEnd;\n\t\t\tlet nesting = this.nesting;\n\t\t\tlet consumed = this._consumed;\n\t\t\tlet index = this.readPos;\n\n\t\t\twhile (index < buffer.length) {\n\t\t\t\tconst code = buffer.charCodeAt(index);\n\n\t\t\t\t// === 阶段 1:等待数组开始 [ ===\n\t\t\t\tif (!started) {\n\t\t\t\t\tif (isWhitespaceCode(code)) {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (code !== CHAR_OPEN_BRACKET) {\n\t\t\t\t\t\t// 非 [ 的字符(非空白)直接跳过\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstarted = true;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 2:在字符串内部,处理转义 ===\n\t\t\t\tif (inString) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\tescaped = false;\n\t\t\t\t\t} else if (code === CHAR_BACKSLASH) {\n\t\t\t\t\t\tescaped = true;\n\t\t\t\t\t} else if (code === CHAR_QUOTE) {\n\t\t\t\t\t\tinString = false;\n\t\t\t\t\t}\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 3:不在任何元素内,等待元素起始 ===\n\t\t\t\tif (elementStart === -1) {\n\t\t\t\t\tif (isWhitespaceCode(code) || code === CHAR_COMMA) {\n\t\t\t\t\t\t// 跳过空白和元素间逗号\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (code === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\t\t// 数组结束,标记 finished 并返回剩余数据\n\t\t\t\t\t\tthis.finished = true;\n\t\t\t\t\t\tthis.readPos = 0;\n\t\t\t\t\t\tthis.buffer = \"\";\n\t\t\t\t\t\tthis.started = false;\n\t\t\t\t\t\treturn buffer.slice(index + 1);\n\t\t\t\t\t}\n\t\t\t\t\t// 记录元素起始位置,初始化嵌套计数\n\t\t\t\t\telementStart = index;\n\t\t\t\t\telementEnd = -1;\n\t\t\t\t\tnesting = code === CHAR_OPEN_BRACE || code === CHAR_OPEN_BRACKET ? 1 : 0;\n\t\t\t\t\tinString = code === CHAR_QUOTE;\n\t\t\t\t\tescaped = false;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 4:在元素内,处理字符串、嵌套结构 ===\n\t\t\t\tif (code === CHAR_QUOTE) {\n\t\t\t\t\tinString = true;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (code === CHAR_OPEN_BRACE || code === CHAR_OPEN_BRACKET) {\n\t\t\t\t\tnesting++;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (code === CHAR_CLOSE_BRACE || code === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\tnesting--;\n\t\t\t\t\tif (nesting === 0) {\n\t\t\t\t\t\t// 嵌套归零,标记元素结束位置\n\t\t\t\t\t\telementEnd = index + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 5:确认元素后面是逗号或 ],保证元素完整结束 ===\n\t\t\t\tif (elementEnd !== -1) {\n\t\t\t\t\t// 向前 look-ahead,跳过元素后的空白\n\t\t\t\t\tlet lookAhead = index + 1;\n\t\t\t\t\twhile (lookAhead < buffer.length && isWhitespaceCode(buffer.charCodeAt(lookAhead))) {\n\t\t\t\t\t\tlookAhead++;\n\t\t\t\t\t}\n\t\t\t\t\tif (lookAhead < buffer.length) {\n\t\t\t\t\t\tconst delimiter = buffer.charCodeAt(lookAhead);\n\t\t\t\t\t\tif (delimiter === CHAR_COMMA || delimiter === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\t\t\t// 元素完整,切片出元素文本并回调\n\t\t\t\t\t\t\tonRow(buffer.slice(elementStart, elementEnd));\n\t\t\t\t\t\t\t// 不直接物理裁剪 buffer,改用 consumed 记录已消费位置\n\t\t\t\t\t\t\tconsumed = lookAhead + 1;\n\t\t\t\t\t\t\telementStart = -1;\n\t\t\t\t\t\t\telementEnd = -1;\n\t\t\t\t\t\t\tnesting = 0;\n\t\t\t\t\t\t\tif (delimiter === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\t\t\t\t// 数组结束,从 consumed 处切片剩余数据返回\n\t\t\t\t\t\t\t\tthis.finished = true;\n\t\t\t\t\t\t\t\tthis.buffer = \"\";\n\t\t\t\t\t\t\t\tthis.started = false;\n\t\t\t\t\t\t\t\tthis.inString = false;\n\t\t\t\t\t\t\t\tthis.escaped = false;\n\t\t\t\t\t\t\t\tthis.elementStart = -1;\n\t\t\t\t\t\t\t\tthis.elementEnd = -1;\n\t\t\t\t\t\t\t\tthis.nesting = 0;\n\t\t\t\t\t\t\t\tthis._consumed = 0;\n\t\t\t\t\t\t\t\tthis.readPos = 0;\n\t\t\t\t\t\t\t\treturn buffer.slice(consumed);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tindex = consumed;\n\t\t\t\t\t\t\t// 累积消费超过 64KB 时一次物理裁剪,避免 buffer 膨胀和过多 String 分配\n\t\t\t\t\t\t\tif (consumed > 65536) {\n\t\t\t\t\t\t\t\tbuffer = buffer.slice(consumed);\n\t\t\t\t\t\t\t\tthis.buffer = buffer;\n\t\t\t\t\t\t\t\tthis._consumed = 0;\n\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t\tconsumed = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// look-ahead 没有看到逗号或 ],说明元素可能被分块截断了,暂不处理\n\t\t\t\t}\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// 将局部状态写回 this,供下次 feed 调用继续使用\n\t\t\tthis.started = started;\n\t\t\tthis.inString = inString;\n\t\t\tthis.escaped = escaped;\n\t\t\tthis.elementStart = elementStart;\n\t\t\tthis.elementEnd = elementEnd;\n\t\t\tthis.nesting = nesting;\n\t\t\tthis._consumed = consumed;\n\n\t\t\t// 6. buffer 裁剪:用 _consumed 取代逐个元素的 buffer.slice,\n\t\t\t// 每消费一个元素就 slice 一次在高吞吐下会大量分配临时 String。\n\t\t\t// 改为累积消费偏移,仅在本轮末尾做一次物理裁剪。\n\t\t\tif (consumed > 0) {\n\t\t\t\tif (elementStart !== -1) {\n\t\t\t\t\tthis.elementStart -= consumed;\n\t\t\t\t\tif (elementEnd !== -1) this.elementEnd -= consumed;\n\t\t\t\t}\n\t\t\t\tthis.buffer = buffer.slice(consumed);\n\t\t\t\tthis._consumed = 0;\n\t\t\t}\n\t\t\t// 保留原始逻辑:若 elementStart > 0 则将未完成元素对齐到 buffer 头部\n\t\t\tif (this.elementStart > 0) {\n\t\t\t\tthis.buffer = this.buffer.slice(this.elementStart);\n\t\t\t\tif (this.elementEnd !== -1) this.elementEnd -= this.elementStart;\n\t\t\t\tthis.elementStart = 0;\n\t\t\t}\n\n\t\t\tthis.readPos = this.elementStart === 0 ? this.buffer.length : 0;\n\n\t\t\treturn \"\";\n\t\t},\n\t\treset() {\n\t\t\tthis.buffer = \"\";\n\t\t\tthis._consumed = 0;\n\t\t\tthis.started = false;\n\t\t\tthis.finished = false;\n\t\t\tthis.inString = false;\n\t\t\tthis.escaped = false;\n\t\t\tthis.elementStart = -1;\n\t\t\tthis.elementEnd = -1;\n\t\t\tthis.nesting = 0;\n\t\t\tthis.readPos = 0;\n\t\t},\n\t};\n}\n","export const TOKEN_COLUMN = \"__sqlite_executor_token__\";\n\n/** 管线化批量发送的默认 batch 大小 */\nexport const DEFAULT_BATCH_SIZE = 10;\n\n/**\n * 管线最大并发数(inflight 任务上限)。\n * 防止大量任务一次性写入 stdin 撑爆 OS 管道缓冲区\n * (Windows 管道 buffer 仅 4KB,Unix 为 64KB)。\n */\nexport const DEFAULT_MAX_INFLIGHT = 50;\n\n/**\n * Inflight 任务数组压缩阈值。\n * 当 #shiftInflight() 中 #inflightHead 超过此值时,\n * 通过 slice() 压缩 inflightTasks 数组以回收已被消费的前部 null 条目所占内存。\n */\nexport const INFLIGHT_COMPACT_THRESHOLD = 128;\n","import { createRowStreamParser } from \"../core/parser.js\";\nimport { toError } from \"../core/parser.js\";\nimport { TOKEN_COLUMN } from \"../core/protocol.js\";\n\nexport { createRowStreamParser };\n\n/**\n * 为 stream 类型的任务设置行级流解析器。\n * 如果任务类型不是 \"stream\" 则返回 null。\n *\n * 解析器内部逐行解析 JSON 数组元素,每解析出一行就调用 task.onRow()。\n * 如果 onRow 抛异常,会将错误记录到 task.consumerError。\n *\n * sqlite3 `-json` 模式下空结果集不输出 `[]`,\n * 此时行解析器可能错误地消费 sentinel 数组(而非数据数组)。\n * 回调中检测 sentinel 行并回喂给 sharedValueParser 以确保 sentinel 被识别。\n *\n * @param {{ kind: string, onRow?: Function, consumerError?: Error | null, token?: string }} task\n * @param {{ feed: (raw: string) => void }} pipelineOrFeed - 共享 JSON 值解析器的 feed 方法,用于回喂 sentinel 行\n * @returns {ReturnType<typeof createRowStreamParser> | null}\n */\nexport function setupStreamParser(task, pipelineOrFeed = { feed() {} }) {\n\tif (task.kind !== \"stream\") return null;\n\tconst parser = createRowStreamParser((rawRow) => {\n\t\tif (task.consumerError) return;\n\t\ttry {\n\t\t\tconst row = JSON.parse(rawRow);\n\t\t\t// sqlite3 空结果不输出 [],导致 sentinel 被行解析器消费。\n\t\t\t// 若该行包含 TOKEN_COLUMN,回喂给 valueParser 做正式 sentinel 检测。\n\t\t\tif (typeof row === \"object\" && row !== null && TOKEN_COLUMN in row) {\n\t\t\t\tpipelineOrFeed.feed(`[${rawRow}]`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttask.onRow(row);\n\t\t} catch (error) {\n\t\t\ttask.consumerError = toError(error);\n\t\t}\n\t});\n\treturn parser;\n}\n\n/**\n * 将回调驱动的行流桥接到 Async Iterator 协议。\n *\n * stream 使用 onRow 回调消费行数据,\n * 而 stream() 方法返回 AsyncIterable 供 for await 使用。\n * AsyncRowBuffer 在两者之间充当适配器:\n * - push(row) 由 onRow 回调调用\n * - end() 由任务完成时调用\n * - error(err) 由任务失败时调用\n * - next() / [Symbol.asyncIterator]() 供消费者使用\n */\nexport class AsyncRowBuffer {\n\t#buffer = [];\n\t/** 已消费行在 #buffer 中的索引,替代 shift() 避免 O(N) 元素搬运 */\n\t#index = 0;\n\t#done = false;\n\t#error = null;\n\t#pending = null;\n\n\t/** 生产者侧:添加一行数据 */\n\tpush(row) {\n\t\tif (this.#done || this.#error) return;\n\t\tif (this.#pending) {\n\t\t\tconst resolve = this.#pending.resolve;\n\t\t\tthis.#pending = null;\n\t\t\tresolve({ value: row, done: false });\n\t\t} else {\n\t\t\tthis.#buffer.push(row);\n\t\t}\n\t}\n\n\t/** 生产者侧:标记数据流结束 */\n\tend() {\n\t\tthis.#done = true;\n\t\tif (this.#pending) {\n\t\t\tconst resolve = this.#pending.resolve;\n\t\t\tthis.#pending = null;\n\t\t\tresolve({ value: undefined, done: true });\n\t\t}\n\t}\n\n\t/** 生产者侧:标记数据流出错 */\n\terror(err) {\n\t\tthis.#error = err;\n\t\tif (this.#pending) {\n\t\t\tconst reject = this.#pending.reject;\n\t\t\tthis.#pending = null;\n\t\t\treject(err);\n\t\t}\n\t}\n\n\t/** AsyncIterator 协议:获取下一行 */\n\tnext() {\n\t\tif (this.#index < this.#buffer.length) {\n\t\t\treturn Promise.resolve({ value: this.#buffer[this.#index++], done: false });\n\t\t}\n\t\tif (this.#done) {\n\t\t\treturn Promise.resolve({ value: undefined, done: true });\n\t\t}\n\t\tif (this.#error) {\n\t\t\treturn Promise.reject(this.#error);\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.#pending = { resolve, reject };\n\t\t});\n\t}\n\n\t/** for await 提前 break / return 时清理 */\n\treturn() {\n\t\tthis.#done = true;\n\t\tthis.#buffer = [];\n\t\tthis.#index = 0;\n\t\tif (this.#pending) {\n\t\t\tconst resolve = this.#pending.resolve;\n\t\t\tthis.#pending = null;\n\t\t\tresolve({ value: undefined, done: true });\n\t\t}\n\t\treturn Promise.resolve({ value: undefined, done: true });\n\t}\n\n\t[Symbol.asyncIterator]() {\n\t\treturn this;\n\t}\n}\n","import { AsyncRowBuffer } from \"../stream/stream.js\";\n\n/** SQLite 支持的三种事务模式 */\nexport const VALID_TRANSACTION_MODES = [\"DEFERRED\", \"IMMEDIATE\", \"EXCLUSIVE\"];\n\n/**\n * 判断给定的值是否为有效的事务模式。\n * @param {unknown} value\n * @returns {boolean}\n */\nexport function isTransactionMode(value) {\n\treturn VALID_TRANSACTION_MODES.includes(value);\n}\n\n/**\n * 创建一个事务操作句柄。\n * 该句柄的 execute/query/stream 方法会自动携带 scopeId,\n * 使得事务内的所有操作被标记为属于同一事务域。\n *\n * @param {symbol} scopeId - 事务域标识\n * @param {{ enqueue(kind: string, sql: string, params: any[], options: object, scopeId: symbol | null): Promise<any> }} executor\n * @returns {{ execute: Function, query: Function, stream: Function }}\n */\nexport function createTransactionHandle(scopeId, executor) {\n\tconst handle = {\n\t\texecute: (sql, params = [], options = {}) => executor.enqueue(\"execute\", sql, params, options, scopeId),\n\t\tquery: (sql, params = [], options = {}) => executor.enqueue(\"query\", sql, params, options, scopeId),\n\t\tstream: (sql, params = [], options = {}) => {\n\t\t\tif (!Array.isArray(params)) throw new TypeError(\"params must be an array\");\n\t\t\tconst buffer = new AsyncRowBuffer();\n\t\t\texecutor.enqueue(\"stream\", sql, params, { ...options, onRow: (row) => buffer.push(row) }, scopeId)\n\t\t\t\t.then(() => buffer.end(), (err) => buffer.error(err));\n\t\t\treturn buffer;\n\t\t},\n\t};\n\treturn handle;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nfunction isWindows() {\n\treturn os.platform() === \"win32\";\n}\n\n/**\n * 判断文件是否可执行\n */\nfunction isExecutable(filePath) {\n\ttry {\n\t\tif (isWindows()) {\n\t\t\t// Windows:只要文件存在即可(是否可执行由扩展名判断)\n\t\t\treturn fs.statSync(filePath).isFile();\n\t\t} else {\n\t\t\tfs.accessSync(filePath, fs.constants.X_OK);\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 获取 Windows 下的可执行扩展名\n */\nfunction getPathExts() {\n\tif (!isWindows()) return [\"\"];\n\tconst ext = process.env.PATHEXT || \".EXE;.CMD;.BAT;.COM;.PS1\";\n\treturn ext.split(\";\").map((e) => e.toLowerCase());\n}\n\n/**\n * which 实现\n * @param {string} command\n * @returns {string|null}\n */\nexport function which(command) {\n\tif (!command) return null;\n\n\tconst pathExts = getPathExts();\n\n\t// 如果 command 本身包含路径\n\tif (command.includes(path.sep)) {\n\t\tconst fullPath = path.resolve(command);\n\n\t\tif (isWindows()) {\n\t\t\t// Windows:需要尝试补全扩展名\n\t\t\tif (path.extname(fullPath)) {\n\t\t\t\treturn isExecutable(fullPath) ? fullPath : null;\n\t\t\t}\n\n\t\t\tfor (const ext of pathExts) {\n\t\t\t\tconst file = fullPath + ext;\n\t\t\t\tif (isExecutable(file)) return file;\n\t\t\t}\n\t\t} else {\n\t\t\treturn isExecutable(fullPath) ? fullPath : null;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// 从 PATH 中查找\n\tconst envPath = process.env.PATH || \"\";\n\tconst pathDirs = envPath.split(path.delimiter);\n\n\tfor (const dir of pathDirs) {\n\t\tif (!dir) continue;\n\n\t\tif (isWindows()) {\n\t\t\tfor (const ext of pathExts) {\n\t\t\t\tconst file = path.join(dir, command + ext);\n\t\t\t\tif (isExecutable(file)) return file;\n\t\t\t}\n\t\t} else {\n\t\t\tconst file = path.join(dir, command);\n\t\t\tif (isExecutable(file)) return file;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { spawn } from \"node:child_process\";\nimport { once } from \"node:events\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { which } from \"../which.js\";\n\n/** @type {number} */\nconst GRACEFUL_SHUTDOWN_TIMEOUT = 5_000;\n\n/**\n * 管理 sqlite3 子进程的生命周期。\n * 负责启动/stderr/stdin/stdout 管道配置,以及进程的终止与清理。\n */\nexport class ProcessManager {\n\t#binary;\n\t#database;\n\t#proc = null;\n\t#initMode;\n\t#draining = false;\n\t/** @type {string[]} draining 期间暂存的写入数据,drain 事件后逐个发送 */\n\t#writeBuffer = [];\n\t/** @type {(() => void)[]} 通过 onDrained() 注册的回调,缓冲排空后一次触发 */\n\t#drainCallbacks = [];\n\t#onDrain;\n\n\t/**\n\t * @param {{ binary?: string, database?: string, initMode?: \"wal\" | \"none\", onDrain?: () => void }} options\n\t */\n\tconstructor({ binary, database, initMode = \"wal\", onDrain } = {}) {\n\t\tthis.#binary = which(binary) ?? binary;\n\t\tthis.#database = database;\n\t\tthis.#initMode = initMode;\n\t\tthis.#onDrain = onDrain ?? (() => {});\n\t}\n\n\t/** drain 状态为 true 时表示 OS pipe 已满,应暂停写入 stdin。 */\n\tget draining() {\n\t\treturn this.#draining;\n\t}\n\n\t/** 注册 drain 回调,当 pipe 重新可写时被调用。 */\n\tsetOnDrainCallback(fn) {\n\t\tthis.#onDrain = fn;\n\t}\n\n\t/**\n\t * 注册一个\"缓冲排空\"回调。\n\t * 若当前无缓冲且非 draining,回调会被立即同步调用;\n\t * 否则暂存,等内部缓冲全部排空、draining 为 false 后一次触发全部回调。\n\t * @param {() => void} callback\n\t */\n\tonDrained(callback) {\n\t\tif (!this.#draining && this.#writeBuffer.length === 0) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\tthis.#drainCallbacks.push(callback);\n\t}\n\n\tget binary() {\n\t\treturn this.#binary;\n\t}\n\n\tget process() {\n\t\treturn this.#proc;\n\t}\n\n\t/**\n\t * 启动 sqlite3 子进程。\n\t * 使用 `-json` 模式启动。\n\t * 对于文件数据库,initMode=\"wal\" 时自动启用 WAL 模式 + busy_timeout。\n\t * @returns {import(\"node:child_process\").ChildProcess}\n\t */\n\tstart() {\n\t\tif (!this.#binary) {\n\t\t\tthrow new Error(\"sqlite3 binary path is empty. Provide a valid --binary / binary option.\");\n\t\t}\n\t\tif (path.isAbsolute(this.#binary) && !fs.existsSync(this.#binary)) {\n\t\t\tthrow new Error(`sqlite3 binary not found: ${this.#binary}. Make sure sqlite3 is installed or provide a valid --binary / binary option.`);\n\t\t}\n\n\t\tconst args = [\"-json\"];\n\t\tif (this.#database) args.push(this.#database);\n\t\tif (this.#database && this.#database !== \":memory:\" && this.#initMode === \"wal\") {\n\t\t\targs.push(\"-cmd\", \"PRAGMA journal_mode=WAL;\");\n\t\t\targs.push(\"-cmd\", \"PRAGMA busy_timeout=5000;\");\n\t\t}\n\n\t\tconst proc = spawn(this.#binary, args, {\n\t\t\tstdio: \"pipe\",\n\t\t\tshell: false,\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tproc.stdin?.setDefaultEncoding(\"utf-8\");\n\t\tproc.stdout?.setEncoding(\"utf-8\");\n\t\tproc.stderr?.setEncoding(\"utf-8\");\n\n\t\t// 处理 stdin pipe 在进程退出后被关闭时的 EPIPE 错误。\n\t\t// 场景:进程被外部 kill(SIGTERM/KILL)、OS 级进程终止,\n\t\t// close 事件尚未到达事件循环时,pump() 可能尝试写入已关闭的 stdin。\n\t\t// 错误被吃掉,不传播为 uncaughtException。\n\t\t// PipelineEngine 的 pump 会在 close 事件抵达后通过\n\t\t// #handleProcessFailure → #pipeline.rejectAll() 正确拒绝所有待处理任务。\n\t\tproc.stdin?.on(\"error\", () => {\n\t\t\t// EPIPE 是预期的(进程已退出,stdin pipe 被关闭),静默忽略。\n\t\t\t// 任何 stdin 写入错误都不应传播为 uncaughtException。\n\t\t});\n\n\t\tthis.#proc = proc;\n\t\treturn proc;\n\t}\n\n\t/**\n\t * 向子进程的 stdin 写入数据。\n\t *\n\t * 当 Node.js 内部 buffer 超过 highWaterMark(默认 16KB)时 `stream.write()` 返回 false,\n\t * 表示 OS pipe 缓冲区已满,应暂停写入等待 drain 事件。\n\t *\n\t * 旧行为(P0 bug):\n\t * - 在 `#draining = true` 时直接 `return`,静默丢弃后续写入的数据。\n\t *\n\t * 当前行为(修复):\n\t * - `#draining = true` 时,后续 `write()` 调用将数据存入 `#writeBuffer` 暂存。\n\t * - drain 事件触发后:\n\t * 1. 清 `#draining`\n\t * 2. 调 `#flushBuffer()` 逐个发送缓冲中的数据(可能再次触发 draining,剩余数据继续暂存)\n\t * 3. 调 `#notifyIfDrained()` 通知所有 `onDrained` 注册方\n\t * 4. 调 `#onDrain()`(上游 pumpQueue 的入口)\n\t * - 这样在任何 pipe 容量下都不会丢失数据,写入自动节流。\n\t *\n\t * @param {string} data\n\t */\n\twrite(data) {\n\t\tconst stream = this.#proc?.stdin;\n\t\tif (!stream) return;\n\n\t\tif (this.#draining) {\n\t\t\tthis.#writeBuffer.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!stream.write(data)) {\n\t\t\tthis.#draining = true;\n\t\t\tstream.once(\"drain\", () => {\n\t\t\t\tthis.#draining = false;\n\t\t\t\tthis.#flushBuffer();\n\t\t\t\tthis.#notifyIfDrained();\n\t\t\t\tthis.#onDrain();\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * 逐个发送写缓冲区中的数据。\n\t * 每项调用 `this.write()`,若 `stream.write()` 再次返回 false,\n\t * `#draining` 会重新变为 true,剩余数据继续暂存,等待下一次 drain。\n\t */\n\t#flushBuffer() {\n\t\tconst buffer = this.#writeBuffer;\n\t\tthis.#writeBuffer = [];\n\t\tfor (const data of buffer) {\n\t\t\tthis.write(data);\n\t\t}\n\t}\n\n\t/**\n\t * 当缓冲全部排空且 `#draining = false` 时,触发所有 `onDrained` 回调。\n\t * 每个回调最多触发一次(触发后从 `#drainCallbacks` 移除)。\n\t */\n\t#notifyIfDrained() {\n\t\tif (this.#draining) return;\n\t\tconst callbacks = this.#drainCallbacks;\n\t\tthis.#drainCallbacks = [];\n\t\tfor (const cb of callbacks) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\t/**\n\t * 优雅关闭:等待写缓冲区排空,然后向子进程发送 `.quit` 命令并等待其自行退出。\n\t * 如果在超时时间内未退出,则强制 kill。\n\t * @returns {Promise<void>}\n\t */\n\tasync gracefulShutdown() {\n\t\tconst proc = this.#proc;\n\t\tif (!proc) return;\n\n\t\t// 等待当前缓冲数据(由 drain 期间堆积的 write() 调用产生)全部写入 pipe\n\t\tif (this.#draining || this.#writeBuffer.length > 0) {\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\tconst timer = setTimeout(resolve, GRACEFUL_SHUTDOWN_TIMEOUT);\n\t\t\t\tthis.onDrained(() => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tproc.kill();\n\t\t}, GRACEFUL_SHUTDOWN_TIMEOUT).unref();\n\n\t\ttry {\n\t\t\tproc.stdin?.write(\".quit\\n\");\n\t\t\tawait once(proc, \"close\");\n\t\t} catch {\n\t\t\t// 进程可能已被清理,忽略\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\t/**\n\t * 终止子进程并清理所有监听器与管道。\n\t * @returns {import(\"node:child_process\").ChildProcess | null} 被终止的进程引用(如果没有正在运行的进程则为 null)\n\t */\n\tkill() {\n\t\tconst proc = this.#proc;\n\t\tif (!proc) return null;\n\t\tthis.#proc = null;\n\t\tthis.#draining = false;\n\t\tthis.#writeBuffer = [];\n\t\tthis.#drainCallbacks = [];\n\t\tproc.stdout?.removeAllListeners();\n\t\tproc.stderr?.removeAllListeners();\n\t\tproc.removeAllListeners();\n\t\tproc.stdin?.destroy();\n\t\tproc.kill();\n\t\treturn proc;\n\t}\n}\n","let _counter = 0;\nconst _PREFIX = \"__executor_end__\";\nconst _PID36 = process.pid.toString(36);\n\n/**\n * 生成一个唯一的 sentinel token。\n * 使用递增计数器和进程 PID 组合,避免每次分配随机数字符串。\n * 格式:__executor_end__{base36计数器}_{base36 PID}\n * @returns {string}\n */\nexport function generateToken() {\n\t_counter = (_counter + 1) >>> 0; // 保持在 32 位无符号整数范围内\n\n\treturn `${_PREFIX}${_counter.toString(36)}_${_PID36}`;\n}\n","/**\n * 基于 Map 插入顺序的 LRU 缓存。\n *\n * 使用 `get()` 命中时自动将条目提升到末尾;\n * `set()` 在达到容量上限时淘汰最久未访问的条目(首个 key)。\n * 仅缓存字符串 key,长度超过 `maxKeyLength` 的 key 不会被缓存。\n *\n * @template T\n */\nexport class LRUCache {\n\t#maxSize;\n\t#maxKeyLength;\n\t#maxValueLength;\n\t/** @type {Map<string, T>} */\n\t#map = new Map();\n\n\t/**\n\t * @param {{ maxSize?: number, maxKeyLength?: number, maxValueLength?: number }} [options]\n\t * maxSize - 最大缓存条目数(默认 256,自动提升到至少 1)\n\t * maxKeyLength - key 最大长度,超长 key 不缓存(默认 4096)\n\t * maxValueLength - value 字符串/数组的最大长度,超长不缓存(默认 Infinity)\n\t */\n\tconstructor({ maxSize = 256, maxKeyLength = 4096, maxValueLength = Infinity } = {}) {\n\t\tthis.#maxSize = Math.max(1, maxSize);\n\t\tthis.#maxKeyLength = maxKeyLength;\n\t\tthis.#maxValueLength = maxValueLength;\n\t}\n\n\t/**\n\t * 获取缓存值。命中时将条目提升到末尾;未命中或 key 不合法时返回 undefined。\n\t * @param {string} key - 缓存键\n\t * @returns {T | undefined}\n\t */\n\tget(key) {\n\t\tif (typeof key !== \"string\" || key.length > this.#maxKeyLength) return undefined;\n\t\tconst value = this.#map.get(key);\n\t\tif (value === undefined) return undefined;\n\t\tthis.#map.delete(key);\n\t\tthis.#map.set(key, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * 设置缓存值。达到容量上限时淘汰最旧条目。超长 key 不缓存。\n\t * 对字符串/数组类型检查 maxValueLength;其他类型不做长度过滤(如对象)。\n\t * @param {string} key - 缓存键\n\t * @param {T} value - 缓存值\n\t */\n\tset(key, value) {\n\t\tif (typeof key !== \"string\" || key.length > this.#maxKeyLength) return;\n\t\tif (typeof value === \"string\" && value.length > this.#maxValueLength) return;\n\t\tif (Array.isArray(value) && value.length > this.#maxValueLength) return;\n\t\tif (this.#map.size >= this.#maxSize) {\n\t\t\tconst firstKey = this.#map.keys().next().value;\n\t\t\tthis.#map.delete(firstKey);\n\t\t}\n\t\tthis.#map.set(key, value);\n\t}\n\n\t/** 当前缓存条目数。 */\n\tget size() {\n\t\treturn this.#map.size;\n\t}\n\n\t/** 清空缓存。 */\n\tclear() {\n\t\tthis.#map.clear();\n\t}\n}\n","/**\n * 转义 SQLite 参数值为安全字符串。\n * 字符串中的单引号会被双写('')转义;\n * null/undefined 转 \"NULL\";boolean 转 \"TRUE\"/\"FALSE\";\n * Date 转 ISO 字符串带引号;数字/bigint 直转字符串。\n * @param {any} value - 要转义的值\n * @returns {string}\n */\nexport function escapeValue(value) {\n\tif (typeof value === \"string\") {\n\t\t// 绝大多数字符串不含单引号,先检查再 replace 避免无意义的分配\n\t\treturn value.includes(\"'\") ? `'${value.replace(/'/g, \"''\")}'` : `'${value}'`;\n\t}\n\tif (value === null || value === undefined) return \"NULL\";\n\tif (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n\tif (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n\tif (value instanceof Date) return `'${value.toISOString()}'`;\n\tthrow new TypeError(`Unsupported parameter type: ${typeof value}`);\n}\n","import { LRUCache } from \"../core/lruCache.js\";\nimport { escapeValue } from \"./escape.js\";\nimport {\n\tCC_SINGLE_QUOTE,\n\tCC_DOUBLE_QUOTE,\n\tCC_DASH,\n\tCC_SLASH,\n\tCC_STAR,\n\tCC_NEWLINE,\n\tCC_QUESTION,\n\tSTATE_NORMAL,\n\tSTATE_SINGLE_QUOTE,\n\tSTATE_DOUBLE_QUOTE,\n\tSTATE_LINE_COMMENT,\n\tSTATE_BLOCK_COMMENT,\n} from \"./constants.js\";\n\n/** @type {LRUCache<{ segments: string[], paramCount: number }>} */\nconst _interpCache = new LRUCache({ maxSize: 256, maxKeyLength: 4096 });\n\n/**\n * 将 SQL 模板解析为以 `?` 分隔的文本段。\n * @param {string} sql\n * @returns {{ segments: string[], paramCount: number }}\n */\nfunction _parseTemplate(sql) {\n\tconst segments = [];\n\tlet segStart = 0;\n\tlet state = STATE_NORMAL;\n\tlet stateStartPos = -1;\n\n\tfor (let pos = 0; pos < sql.length; pos++) {\n\t\tconst code = sql.charCodeAt(pos);\n\n\t\tif (state === STATE_NORMAL) {\n\t\t\tif (code === CC_SINGLE_QUOTE) {\n\t\t\t\tstate = STATE_SINGLE_QUOTE;\n\t\t\t\tstateStartPos = pos;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_DOUBLE_QUOTE) {\n\t\t\t\tstate = STATE_DOUBLE_QUOTE;\n\t\t\t\tstateStartPos = pos;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_DASH && sql.charCodeAt(pos + 1) === CC_DASH) {\n\t\t\t\tstate = STATE_LINE_COMMENT;\n\t\t\t\tpos++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_SLASH && sql.charCodeAt(pos + 1) === CC_STAR) {\n\t\t\t\tstate = STATE_BLOCK_COMMENT;\n\t\t\t\tstateStartPos = pos;\n\t\t\t\tpos++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_QUESTION) {\n\t\t\t\tsegments.push(sql.slice(segStart, pos));\n\t\t\t\tsegStart = pos + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_SINGLE_QUOTE) {\n\t\t\tif (code === CC_SINGLE_QUOTE) {\n\t\t\t\tif (sql.charCodeAt(pos + 1) === CC_SINGLE_QUOTE) {\n\t\t\t\t\tpos++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tstateStartPos = -1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_DOUBLE_QUOTE) {\n\t\t\tif (code === CC_DOUBLE_QUOTE) {\n\t\t\t\tif (sql.charCodeAt(pos + 1) === CC_DOUBLE_QUOTE) {\n\t\t\t\t\tpos++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tstateStartPos = -1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_LINE_COMMENT) {\n\t\t\tif (code === CC_NEWLINE) state = STATE_NORMAL;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_BLOCK_COMMENT) {\n\t\t\tif (code === CC_STAR && sql.charCodeAt(pos + 1) === CC_SLASH) {\n\t\t\t\tpos++;\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tstateStartPos = -1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (state === STATE_SINGLE_QUOTE) {\n\t\tthrow new Error(`Unterminated single-quoted string starting at position ${stateStartPos + 1}`);\n\t}\n\n\tif (state === STATE_DOUBLE_QUOTE) {\n\t\tthrow new Error(`Unterminated double-quoted identifier/string starting at position ${stateStartPos + 1}`);\n\t}\n\n\tif (state === STATE_BLOCK_COMMENT) {\n\t\tthrow new Error(`Unterminated block comment starting at position ${stateStartPos + 1}`);\n\t}\n\n\tsegments.push(sql.slice(segStart));\n\treturn { segments, paramCount: segments.length - 1 };\n}\n\n/**\n * 使用预解析的模板替换参数,避免重新扫描 SQL。\n * @param {{ segments: string[], paramCount: number }} template - 由 _parseTemplate 返回的模板\n * @param {any[]} params - 参数数组\n * @returns {string}\n */\nexport function interpolateFromTemplate(template, params) {\n\tconst { segments, paramCount } = template;\n\tif (params.length < paramCount) throw new Error(\"Too few parameters provided\");\n\tif (params.length > paramCount) throw new Error(\"Too many parameters provided\");\n\n\tif (paramCount === 0) return segments[0];\n\n\tconst parts = [segments[0]];\n\tfor (let i = 0; i < params.length; i++) {\n\t\tparts.push(escapeValue(params[i]));\n\t\tparts.push(segments[i + 1]);\n\t}\n\treturn parts.join(\"\");\n}\n\n/**\n * 替换 SQL 语句中的 ? 为转义后的参数。\n * 内部使用 LRU 缓存已解析的模板,避免重复扫描相同 SQL。\n * @param {string} sql - SQL 模板(含 ? 占位符)\n * @param {any[]} params - 参数数组\n * @returns {string}\n */\nexport function interpolateSQL(sql, params) {\n\tif (!sql.includes(\"?\")) {\n\t\tif (params.length > 0) throw new Error(\"Too many parameters provided\");\n\t\treturn sql;\n\t}\n\n\tlet template = _interpCache.get(sql);\n\n\tif (template === undefined) {\n\t\ttemplate = _parseTemplate(sql);\n\t\t_interpCache.set(sql, template);\n\t}\n\n\treturn interpolateFromTemplate(template, params);\n}\n","const CC_SINGLE_QUOTE = 39;\nconst CC_DOUBLE_QUOTE = 34;\nconst CC_DASH = 45;\nconst CC_SLASH = 47;\nconst CC_STAR = 42;\nconst CC_NEWLINE = 10;\nconst CC_QUESTION = 63;\nconst CC_SEMICOLON = 59;\nconst CC_SPACE = 32;\n\nconst STATE_NORMAL = 0;\nconst STATE_SINGLE_QUOTE = 1;\nconst STATE_DOUBLE_QUOTE = 2;\nconst STATE_LINE_COMMENT = 3;\nconst STATE_BLOCK_COMMENT = 4;\n\nexport {\n\tCC_SINGLE_QUOTE,\n\tCC_DOUBLE_QUOTE,\n\tCC_DASH,\n\tCC_SLASH,\n\tCC_STAR,\n\tCC_NEWLINE,\n\tCC_QUESTION,\n\tCC_SEMICOLON,\n\tCC_SPACE,\n\tSTATE_NORMAL,\n\tSTATE_SINGLE_QUOTE,\n\tSTATE_DOUBLE_QUOTE,\n\tSTATE_LINE_COMMENT,\n\tSTATE_BLOCK_COMMENT,\n};\n","import { LRUCache } from \"../core/lruCache.js\";\nimport {\n\tCC_SINGLE_QUOTE,\n\tCC_DOUBLE_QUOTE,\n\tCC_DASH,\n\tCC_SLASH,\n\tCC_STAR,\n\tCC_NEWLINE,\n\tCC_QUESTION,\n\tCC_SEMICOLON,\n\tCC_SPACE,\n\tSTATE_NORMAL,\n\tSTATE_SINGLE_QUOTE,\n\tSTATE_DOUBLE_QUOTE,\n\tSTATE_LINE_COMMENT,\n\tSTATE_BLOCK_COMMENT,\n} from \"./constants.js\";\n\n/**\n * 将 Uint16Array(UCS-2 编码)解码为 JavaScript 字符串。\n * 使用 String.fromCharCode.apply 替代 TextDecoder,避免跨 CPU 字节序问题:\n * - TextDecoder(\"utf-16le\") 在小端 CPU 上正确,但在大端 CPU 上产生乱码\n * - Uint16Array 的底层内存布局依赖 CPU 字节序\n * - String.fromCharCode() 直接从 16 位码元创建字符,与字节序无关\n * @param {Uint16Array} codes\n * @returns {string}\n */\nfunction _decodeU16(codes) {\n\tconst len = codes.length;\n\tif (len === 0) return \"\";\n\t// 1024 是个安全的批处理大小,避免 V8 的 apply 参数栈溢出\n\tconst batchSize = 1024;\n\tif (len <= batchSize) {\n\t\treturn String.fromCharCode.apply(null, codes);\n\t}\n\tconst parts = new Array(Math.ceil(len / batchSize));\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst start = i * batchSize;\n\t\tconst end = Math.min(start + batchSize, len);\n\t\tparts[i] = String.fromCharCode.apply(null, codes.subarray(start, end));\n\t}\n\treturn parts.join(\"\");\n}\n\nconst _normCache = new LRUCache({ maxSize: 256, maxKeyLength: 4096 });\n\nfunction _normalize(sql) {\n\tconst len = sql.length;\n\tconst needed = len + 1;\n\tconst outCodes = new Uint16Array(needed);\n\tlet writePos = 0;\n\tlet pendingSpace = false;\n\tlet state = STATE_NORMAL;\n\tconst questionPositions = [];\n\n\tfor (let i = 0; i < len; i++) {\n\t\tconst code = sql.charCodeAt(i);\n\t\tconst nextCode = sql.charCodeAt(i + 1);\n\n\t\tif (state === STATE_BLOCK_COMMENT) {\n\t\t\tif (code === CC_STAR && nextCode === CC_SLASH) {\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\ti++;\n\t\t\t\tif (writePos > 0) pendingSpace = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_LINE_COMMENT) {\n\t\t\tif (code === CC_NEWLINE) {\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tif (writePos > 0) pendingSpace = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_NORMAL) {\n\t\t\tif (code === CC_DASH && nextCode === CC_DASH) {\n\t\t\t\tstate = STATE_LINE_COMMENT;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (code === CC_SLASH && nextCode === CC_STAR) {\n\t\t\t\tstate = STATE_BLOCK_COMMENT;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (code === 32 || code === 9 || code === 10 || code === 11 || code === 12 || code === 13) {\n\t\t\tif (writePos > 0) pendingSpace = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pendingSpace && writePos > 0) {\n\t\t\toutCodes[writePos++] = CC_SPACE;\n\t\t\tpendingSpace = false;\n\t\t}\n\n\t\tif (code === CC_QUESTION && state === STATE_NORMAL) {\n\t\t\tquestionPositions.push(writePos);\n\t\t}\n\t\toutCodes[writePos++] = code;\n\n\t\tif (state === STATE_NORMAL) {\n\t\t\tif (code === CC_SINGLE_QUOTE) state = STATE_SINGLE_QUOTE;\n\t\t\telse if (code === CC_DOUBLE_QUOTE) state = STATE_DOUBLE_QUOTE;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_SINGLE_QUOTE) {\n\t\t\tif (code === CC_SINGLE_QUOTE && nextCode === CC_SINGLE_QUOTE) {\n\t\t\t\toutCodes[writePos++] = nextCode;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_SINGLE_QUOTE) state = STATE_NORMAL;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_DOUBLE_QUOTE) {\n\t\t\tif (code === CC_DOUBLE_QUOTE && nextCode === CC_DOUBLE_QUOTE) {\n\t\t\t\toutCodes[writePos++] = nextCode;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_DOUBLE_QUOTE) state = STATE_NORMAL;\n\t\t}\n\t}\n\n\tlet normalized;\n\tif (writePos === 0) {\n\t\tnormalized = \";\";\n\t} else {\n\t\twhile (writePos > 0 && outCodes[writePos - 1] === CC_SEMICOLON) writePos--;\n\t\toutCodes[writePos++] = CC_SEMICOLON;\n\t\tnormalized = _decodeU16(outCodes.subarray(0, writePos));\n\t}\n\n\tconst paramCount = questionPositions.length;\n\tif (paramCount === 0) {\n\t\treturn { normalized, segments: [normalized], paramCount: 0 };\n\t}\n\n\tconst segments = [];\n\tlet segStart = 0;\n\tfor (const pos of questionPositions) {\n\t\tsegments.push(normalized.slice(segStart, pos));\n\t\tsegStart = pos + 1;\n\t}\n\tsegments.push(normalized.slice(segStart));\n\treturn { normalized, segments, paramCount };\n}\n\nexport function normalizeSQL(sql) {\n\tconst cached = _normCache.get(sql);\n\tif (cached !== undefined) return cached.normalized;\n\tconst result = _normalize(sql);\n\t_normCache.set(sql, result);\n\treturn result.normalized;\n}\n\nexport function normalizeSQLTemplate(sql) {\n\tconst cached = _normCache.get(sql);\n\tif (cached !== undefined) return cached;\n\tconst result = _normalize(sql);\n\t_normCache.set(sql, result);\n\treturn result;\n}\n","import { LRUCache } from \"./lruCache.js\";\n\nconst READ_ONLY_KINDS = new Set([\"SELECT\", \"WITH\", \"VALUES\", \"EXPLAIN\"]);\n\n/**\n * classifySQL 的 LRU 缓存。\n * 以规范化后的 SQL 模板为 key(参数插值前),\n * 使得相同形状的查询即使参数不同也能命中缓存。\n * @type {LRUCache<\"read\" | \"write\">}\n */\nconst _classifyCache = new LRUCache({ maxSize: 256, maxKeyLength: 4096 });\n\nfunction classifySingle(stmt) {\n\tconst trimmed = stmt.trim();\n\t// 使用 indexOf 替代 split(/\\s+/) 避免数组分配\n\tconst firstSpace = trimmed.indexOf(\" \");\n\tconst kind = (firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace)).toUpperCase();\n\treturn READ_ONLY_KINDS.has(kind) ? \"read\" : \"write\";\n}\n\n/**\n * 判断一条 SQL 语句是否为只读操作。\n * 多语句(以 ; 分隔)中若包含任意写语句,整体返回 \"write\"。\n * @param {string} sql\n * @returns {\"read\" | \"write\"}\n */\nexport function classifySQL(sql) {\n\tif (typeof sql !== \"string\") return \"write\";\n\n\tconst cached = _classifyCache.get(sql);\n\tif (cached !== undefined) return cached;\n\n\t// sql 已经过 normalizeSQL 去除首尾空白,但保留 trim() 防御直接调用\n\tconst trimmed = sql.trim();\n\tif (trimmed.length === 0) return \"write\";\n\tlet result;\n\tif (trimmed.includes(\";\")) {\n\t\tconst stmts = trimmed.split(\";\").filter((s) => s.trim().length > 0);\n\t\tif (stmts.length === 0) return \"write\";\n\t\tresult = \"read\";\n\t\tfor (const stmt of stmts) {\n\t\t\tif (classifySingle(stmt) === \"write\") {\n\t\t\t\tresult = \"write\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = classifySingle(trimmed);\n\t}\n\n\t_classifyCache.set(sql, result);\n\treturn result;\n}\n","const INITIAL_CAPACITY = 16;\nconst SHRINK_THRESHOLD = 256; // >= 256 slots → clear() 时收缩到 INITIAL_CAPACITY\n\nexport class Queue {\n\t#items = new Array(INITIAL_CAPACITY);\n\t#head = 0;\n\t#tail = 0;\n\t#size = 0;\n\t#mask = INITIAL_CAPACITY - 1;\n\n\tenqueue(value) {\n\t\tif (this.#size === this.#items.length) {\n\t\t\tthis.#grow();\n\t\t}\n\t\tthis.#items[this.#tail] = value;\n\t\tthis.#tail = (this.#tail + 1) & this.#mask;\n\t\tthis.#size++;\n\t}\n\n\t#grow() {\n\t\tconst oldMask = this.#mask;\n\t\tconst newCap = this.#items.length * 2;\n\t\tthis.#mask = newCap - 1;\n\t\tif (this.#head === 0) {\n\t\t\t// Items are contiguous from index 0; extend in-place without copying.\n\t\t\tthis.#items.length = newCap;\n\t\t\tthis.#tail = this.#size;\n\t\t} else {\n\t\t\tconst newItems = new Array(newCap);\n\t\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\t\tnewItems[i] = this.#items[(this.#head + i) & oldMask];\n\t\t\t}\n\t\t\tthis.#items = newItems;\n\t\t\tthis.#head = 0;\n\t\t\tthis.#tail = this.#size;\n\t\t}\n\t}\n\n\tdequeue() {\n\t\tif (this.#size === 0) return null;\n\t\tconst value = this.#items[this.#head];\n\t\tthis.#items[this.#head] = undefined;\n\t\tthis.#head = (this.#head + 1) & this.#mask;\n\t\tthis.#size--;\n\t\treturn value;\n\t}\n\n\tclear() {\n\t\t// Reuse the existing backing array (avoids allocation + GC pressure on hot paths\n\t\t// such as #restoreDeferred which calls clear() on every exclusive-zone exit).\n\t\t// #mask stays valid: it equals #items.length - 1 and the array length is unchanged.\n\t\tthis.#items.fill(undefined);\n\t\tthis.#head = 0;\n\t\tthis.#tail = 0;\n\t\tthis.#size = 0;\n\t\tthis.#shrinkIfNeeded();\n\t}\n\n\t/**\n\t * 如果 backing array 远超实际需求,收缩到初始容量以释放内存。\n\t * 仅在 clear() 中调用(非热路径),避免热路径上的 GC 压力。\n\t * 在百万级 SQL 的高负载场景下,队列可能膨胀到数十万 slots,\n\t * 任务耗尽后的大数组将长期驻留内存。收缩解决此问题。\n\t */\n\t#shrinkIfNeeded() {\n\t\tif (this.#items.length >= SHRINK_THRESHOLD) {\n\t\t\tthis.#items = new Array(INITIAL_CAPACITY);\n\t\t\tthis.#mask = INITIAL_CAPACITY - 1;\n\t\t}\n\t}\n\n\tremove(value) {\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tconst idx = (this.#head + i) & this.#mask;\n\t\t\tif (this.#items[idx] === value) {\n\t\t\t\tfor (let j = i; j < this.#size - 1; j++) {\n\t\t\t\t\tconst curr = (this.#head + j) & this.#mask;\n\t\t\t\t\tconst next = (this.#head + j + 1) & this.#mask;\n\t\t\t\t\tthis.#items[curr] = this.#items[next];\n\t\t\t\t}\n\t\t\t\tthis.#tail = (this.#tail - 1) & this.#mask;\n\t\t\t\tthis.#items[this.#tail] = undefined;\n\t\t\t\tthis.#size--;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfind(predicate) {\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tconst value = this.#items[(this.#head + i) & this.#mask];\n\t\t\tif (predicate(value)) return value;\n\t\t}\n\t\treturn null;\n\t}\n\n\ttoArray() {\n\t\tconst result = new Array(this.#size);\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tresult[i] = this.#items[(this.#head + i) & this.#mask];\n\t\t}\n\t\treturn result;\n\t}\n\n\t*values() {\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tyield this.#items[(this.#head + i) & this.#mask];\n\t\t}\n\t}\n\n\tpeek() {\n\t\treturn this.#size > 0 ? this.#items[this.#head] : null;\n\t}\n\n\t/**\n\t * 将另一个 Queue 中的所有元素插入到当前队列的前面,保持原始顺序。\n\t * 源队列在操作后被清空。\n\t * 比 toArray() + clear() + 多次 enqueue() 更高效,\n\t * 因为避免了中间数组分配并减少 enqueue 调用开销。\n\t * @param {Queue} other - 源队列(操作后被清空)\n\t */\n\tprependAll(other) {\n\t\tif (other.isEmpty()) return;\n\n\t\t// Fast path: this queue is empty — just swap internals.\n\t\tif (this.#size === 0) {\n\t\t\tconst tmpItems = this.#items;\n\t\t\tconst tmpMask = this.#mask;\n\t\t\tthis.#items = other.#items;\n\t\t\tthis.#head = other.#head;\n\t\t\tthis.#tail = other.#tail;\n\t\t\tthis.#size = other.#size;\n\t\t\tthis.#mask = other.#mask;\n\t\t\tother.#items = tmpItems;\n\t\t\tother.#head = 0;\n\t\t\tother.#tail = 0;\n\t\t\tother.#size = 0;\n\t\t\tother.#mask = tmpMask;\n\t\t\treturn;\n\t\t}\n\n\t\t// General path: merge both queues into a new array so the donor's items\n\t\t// come first, followed by this queue's existing items.\n\t\tconst totalSize = this.#size + other.#size;\n\t\tlet newCap = this.#items.length;\n\t\twhile (newCap < totalSize) newCap *= 2;\n\n\t\tconst newItems = new Array(newCap);\n\t\tlet writeIdx = 0;\n\n\t\tfor (let i = 0; i < other.#size; i++) {\n\t\t\tnewItems[writeIdx++] = other.#items[(other.#head + i) & other.#mask];\n\t\t}\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tnewItems[writeIdx++] = this.#items[(this.#head + i) & this.#mask];\n\t\t}\n\n\t\tthis.#items = newItems;\n\t\tthis.#head = 0;\n\t\tthis.#tail = totalSize;\n\t\tthis.#size = totalSize;\n\t\tthis.#mask = newCap - 1;\n\n\t\tother.#items.fill(undefined);\n\t\tother.#head = 0;\n\t\tother.#tail = 0;\n\t\tother.#size = 0;\n\t}\n\n\t[Symbol.iterator]() {\n\t\treturn this.values();\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\tisEmpty() {\n\t\treturn this.#size === 0;\n\t}\n}\n","import { INFLIGHT_COMPACT_THRESHOLD } from \"../constants.js\";\n\n/**\n * Inflight 任务数组管理器。\n *\n * 封装了变长数组 + 头指针的 push/shift 操作和自动压缩逻辑,\n * PipelineEngine 和 TaskWorker 共享此类,避免重复实现 inflight 管理。\n *\n * 设计:\n * - shift() 出队时将对应槽位置为 null,仅移动头指针\n * - 头指针超过阈值时通过 slice() 物理回收已消费的前部空间\n * - 不需使用者关心 #tasks / #head 的内部细节\n */\nexport class InflightTracker {\n\t#tasks = [];\n\t#head = 0;\n\n\t/** 当前 inflight 任务数。 */\n\tget count() {\n\t\treturn this.#tasks.length - this.#head;\n\t}\n\n\t/** 第一个(最旧的)inflight 任务,无任务时返回 null。 */\n\tget first() {\n\t\treturn this.#head < this.#tasks.length ? this.#tasks[this.#head] : null;\n\t}\n\n\t/** 将一个或多个任务追加到队尾。 */\n\tpush(...items) {\n\t\tthis.#tasks.push(...items);\n\t}\n\n\t/** 移除并返回第一个 inflight 任务。空时返回 null。 */\n\tshift() {\n\t\tif (this.#tasks.length === this.#head) return null;\n\t\tconst task = this.#tasks[this.#head];\n\t\tthis.#tasks[this.#head] = null;\n\t\tthis.#head++;\n\t\tif (this.#head >= this.#tasks.length) {\n\t\t\tthis.#tasks = [];\n\t\t\tthis.#head = 0;\n\t\t} else if (this.#head > INFLIGHT_COMPACT_THRESHOLD) {\n\t\t\tthis.#tasks = this.#tasks.slice(this.#head);\n\t\t\tthis.#head = 0;\n\t\t}\n\t\treturn task;\n\t}\n\n\t/** 清空所有 inflight 任务。 */\n\tclear() {\n\t\tthis.#tasks = [];\n\t\tthis.#head = 0;\n\t}\n\n\t/** 对每个 inflight 任务调用 fn(task)。 */\n\tforEach(fn) {\n\t\tfor (let i = this.#head; i < this.#tasks.length; i++) {\n\t\t\tfn(this.#tasks[i]);\n\t\t}\n\t}\n\n\t/** 返回所有 inflight 任务的浅拷贝数组(不含 null 槽位)。 */\n\ttoArray() {\n\t\treturn this.#tasks.slice(this.#head);\n\t}\n\n\t/** 测试用:获取内部数组长度。 */\n\tget _tasksLength() {\n\t\treturn this.#tasks.length;\n\t}\n\n\t/** 测试用:获取头指针位置。 */\n\tget _head() {\n\t\treturn this.#head;\n\t}\n}\n","import { toError } from \"./parser.js\";\n\n/**\n * 将解析后的 JSON 数组行收集到 query 任务的结果数组中。\n * @param {{ rows: any[] }} task\n * @param {any} parsed\n */\nexport function collectQueryRows(task, parsed) {\n\tif (Array.isArray(parsed)) {\n\t\t// task.rows 在 query 任务中始终初始化为 [](见 executor.js / taskWorker.js)\n\t\tfor (let i = 0; i < parsed.length; i++) {\n\t\t\ttask.rows.push(parsed[i]);\n\t\t}\n\t}\n}\n\n/**\n * 将解析后的 JSON 数组元素通过 stream 任务的 onRow 逐行回调。\n * 若 onRow 抛错则记录到 task.consumerError 并停止后续回调。\n * @param {{ onRow: Function, consumerError?: Error | null }} task\n * @param {any} parsed\n */\nexport function processStreamRows(task, parsed) {\n\tif (!Array.isArray(parsed)) return;\n\tfor (const row of parsed) {\n\t\tif (task.consumerError) break;\n\t\ttry {\n\t\t\ttask.onRow(row);\n\t\t} catch (error) {\n\t\t\ttask.consumerError = toError(error);\n\t\t}\n\t}\n}\n\n/**\n * 最终结算一个任务:清除定时器、更新指标,然后 resolve 或 reject。\n * @param {object} task\n * @param {Error | null} error\n * @param {any} value\n * @param {import(\"./metrics.js\").Metrics | null | undefined} metrics\n * @param {{ resetRowParser?: boolean }} [options]\n */\nexport function settleTask(task, error, value, metrics, { resetRowParser = false } = {}) {\n\tif (task.settled) return;\n\ttask.settled = true;\n\n\tif (resetRowParser) {\n\t\ttask.rowParser?.reset?.();\n\t}\n\n\tif (error) {\n\t\tmetrics?.incrementTasksFailed();\n\t\ttask.reject(toError(error));\n\t\treturn;\n\t}\n\n\tconst duration = task.startTime > 0 ? performance.now() - task.startTime : 0;\n\tmetrics?.incrementTasksSuccess(duration);\n\ttask.resolve(value);\n}\n","import { normalizeSQL } from \"../utils/normalize.js\";\nimport { TOKEN_COLUMN } from \"../constants.js\";\n\nexport { TOKEN_COLUMN } from \"../constants.js\";\n\n/**\n * 构建发送给 sqlite3 进程的完整载荷。\n * 在原始 SQL 末尾追加一条 sentinel 查询,用于标记该任务输出的结束。\n *\n * @param {string} sql - 要执行的 SQL 语句(已规范化时设 skipNormalize=true)\n * @param {string} token - 唯一 sentinel token\n * @param {{ skipNormalize?: boolean }} [options]\n * @returns {string} 追加了 sentinel 查询后的完整载荷\n */\nexport function buildPayload(sql, token, { skipNormalize = false } = {}) {\n\tconst normalized = skipNormalize ? sql : normalizeSQL(sql);\n\tconst suffix = normalized.endsWith(\";\") ? \"\" : \";\";\n\t// 模板字面量在 V8 中会优化为 join,保持原状即可\n\treturn `${normalized}${suffix}\\nSELECT '${token}' AS ${TOKEN_COLUMN};\\n`;\n}\n\n/**\n * 判断 SQL 是否为事务控制语句(BEGIN / COMMIT / ROLLBACK)。\n * WAL batch 不应包裹事务控制语句,否则会破坏事务嵌套层级。\n * @param {string} sql\n * @returns {boolean}\n */\nfunction isTransactionControl(sql) {\n\t// sql 经过 normalizeSQL 后关键词大小写不变;首 charCodeAt 快速失败避免字符串分配。\n\t// 若首字母不是 B/C/R(事务关键字),直接返回 false。\n\tconst f = sql.charCodeAt(0);\n\tif (f === 66 || f === 98) {\n\t\treturn sql === \"BEGIN\" || sql === \"BEGIN;\" || sql.startsWith(\"BEGIN \") || sql.startsWith(\"BEGIN;\");\n\t}\n\tif (f === 67 || f === 99) {\n\t\treturn sql === \"COMMIT\" || sql === \"COMMIT;\" || sql.startsWith(\"COMMIT \") || sql.startsWith(\"COMMIT;\");\n\t}\n\tif (f === 82 || f === 114) {\n\t\treturn sql === \"ROLLBACK\" || sql === \"ROLLBACK;\" || sql.startsWith(\"ROLLBACK \") || sql.startsWith(\"ROLLBACK;\");\n\t}\n\treturn false;\n}\n\n/**\n * 将一批任务合并为单个发送给 sqlite3 进程的载荷字符串。\n * 由 PipelineEngine 和 TaskWorker 共享,避免 25 行重复 payload 构建逻辑。\n *\n * 如果全是 execute 类型且数量 > 1,自动使用 WAL 批量优化:\n * 将多条 INSERT/UPDATE 用 BEGIN/COMMIT 包裹,每条语句后紧跟其 sentinel token。\n *\n * ★ WAL batch sentinel 交错模式\n * 传统格式将所有 SQL 放在一起、所有 sentinel 放在末尾(`BEGIN; T1; T2; COMMIT; tok1; tok2`),\n * 这导致最后一条 SQL 的 sentinel 要等前面所有 SQL 执行完才到达,而全部任务的 startTime\n * 都在 pump 时统一设置,因此后面任务的 elapsed 会累积前面任务的执行时间,在大量 SQL\n * 场景下容易误触超时。\n *\n * 新格式将 sentinel 交错在每条 SQL 之后(`BEGIN; T1; tok1; T2; tok2; COMMIT`),\n * 使得每条 SQL 的 sentinel 紧随其自身执行完毕即到达。结合 handleParsedValue 中\n * 对 next inflight task 的 startTime 前移机制,确保每条任务的 timeout 倒计时\n * 只计算其自身的执行时间,而非 batch 中前面所有任务的累积时间。\n *\n * WAL batch 会自动跳过事务控制语句(BEGIN / COMMIT / ROLLBACK),\n * 避免 BEGIN/COMMIT 被 WAL batch 的 BEGIN/COMMIT 再次包裹导致事务嵌套异常。\n *\n * @param {Array<{ kind: string, sql: string, token: string }>} batch\n * @returns {string}\n */\nexport function buildBatchPayload(batch) {\n\tconst useWalBatch = batch.length > 1 && batch.every((t) => t.kind === \"execute\" && !isTransactionControl(t.sql));\n\tif (useWalBatch) {\n\t\tconst parts = [\"BEGIN;\\n\"];\n\t\tfor (const task of batch) {\n\t\t\tparts.push(task.sql, \"\\n\");\n\t\t\tparts.push(`SELECT '${task.token}' AS ${TOKEN_COLUMN};\\n`);\n\t\t}\n\t\tparts.push(\"COMMIT;\\n\");\n\t\treturn parts.join(\"\");\n\t}\n\n\tconst parts = [];\n\tfor (const task of batch) {\n\t\tparts.push(buildPayload(task.sql, task.token, { skipNormalize: true }));\n\t}\n\treturn parts.join(\"\");\n}\n\nconst TC_FIRST_CHAR = TOKEN_COLUMN.charCodeAt(0);\n\n/**\n * 构建 sentinel 字符串,供 isSentinelRaw 直接比较。\n * 每任务调用一次(而非每 JSON 值),消除模板字符串重复分配。\n * @param {string} token\n * @returns {string}\n */\nfunction buildSentinelStr(token) {\n\treturn `[{\"${TOKEN_COLUMN}\":\"${token}\"}]`;\n}\n\n/**\n * 通过原始字符串模式检测 sentinel 行,避免 JSON.parse。\n * sentinel 原始格式固定为 [{\"__sqlite_executor_token__\":\"TOKEN\"}],\n * token 由 crypto.randomUUID() 生成(hex UUID,不含特殊 JSON 字符),\n * 因此精确字符串匹配即可安全判断。\n *\n * 哨兵字符串在 isSentinelRaw 内部按需构建;外部调用只需传入 token。\n * fast path 首先检查第 4 个字符是否匹配列名首字符,不匹配则快速返回 false。\n *\n * @param {string} raw - 流式解析器提取的原始 JSON 文本\n * @param {string} token - 当前任务的唯一 token\n * @returns {boolean}\n */\nexport function isSentinelRaw(raw, token) {\n\treturn raw.charCodeAt(3) === TC_FIRST_CHAR && raw === buildSentinelStr(token);\n}\n\n/**\n * 检查解析出的 JSON 行是否为当前任务的 sentinel 结束标记行。\n *\n * @param {unknown} value - 已解析的 JSON 值\n * @param {string} token - 当前任务的唯一 token\n * @returns {boolean}\n */\nexport function isSentinelRow(value, token) {\n\treturn Array.isArray(value) && value.length === 1 && value[0]?.[TOKEN_COLUMN] === token;\n}\n","import { settleTask, collectQueryRows, processStreamRows } from \"./settleUtils.js\";\nimport { isSentinelRaw, isSentinelRow, buildBatchPayload } from \"./protocol.js\";\nimport { toError } from \"./parser.js\";\nimport { createTimeoutError } from \"../utils/timeout.js\";\n\n/**\n * 批量结算 pendingFinalize 集合中的所有任务。\n * 由 scheduleFinalizeCheck 的 setImmediate 回调调用。\n *\n * 在结算前排空 pendingStderr 缓冲,将之前无法归因的 stderr\n * 通过零行归因机制正确分配到失败的任务上。\n *\n * @param {Set<object>} tasks - pendingFinalizeTasks 集合\n * @param {(task: object, error: Error | null, value: any) => void} settle\n * @param {() => void} pumpQueue\n * @param {string[]} [pendingStderr] - 待处理的 stderr 缓冲\n */\nexport function finalizePendingTasks(tasks, settle, pumpQueue, pendingStderr, inflight) {\n\tconst hasStderrBuffer = pendingStderr && pendingStderr.length > 0;\n\t// 排空 pendingStderr 缓冲,尝试零行归因\n\tif (hasStderrBuffer) {\n\t\tfor (const chunk of pendingStderr) {\n\t\t\tfor (const t of tasks) {\n\t\t\t\t// 归因给所有零行 query 任务(可能有多个失败 SQL 在同一 batch)\n\t\t\t\tif (t.kind === \"query\" && t.rows.length === 0) {\n\t\t\t\t\tt.stderrText += chunk;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// 仅当无更多 inflight 任务时才清除缓冲(否则保留以供后续零行任务使用)\n\t\tif (!inflight || inflight.count === 0) {\n\t\t\tpendingStderr.length = 0;\n\t\t}\n\t}\n\n\tfor (const task of tasks) {\n\t\tif (task.stderrText) {\n\t\t\tsettle(task, new Error(task.stderrText.trim()), undefined);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (task.consumerError) {\n\t\t\tsettle(task, task.consumerError, undefined);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (task.kind === \"query\") {\n\t\t\tsettle(task, null, task.rows);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsettle(task, null, undefined);\n\t}\n\n\ttasks.clear();\n\tpumpQueue();\n}\n\n/**\n * 处理单任务超时:防重复结算、清除定时器、更新指标、创建超时错误。\n *\n * @param {object} task\n * @param {import(\"./metrics.js\").Metrics | null | undefined} metrics\n * @returns {Error | null} 已创建的 TimeoutError,若任务已结算则返回 null\n */\nexport function prepareTaskTimeout(task, metrics) {\n\tif (task.settled) return null;\n\ttask.timedout = true;\n\tmetrics?.incrementTasksTimeout();\n\treturn createTimeoutError(task.timeout, task.sql);\n}\n\n/**\n * 创建 sweep 定时器管理器。\n * schedule() 启动定期扫描,检查 inflight 任务是否超时;\n * clear() 停止定时器。\n *\n * @param {{\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * sweepIntervalMs: number,\n * handleTaskTimeout: (task: object) => void,\n * }} params\n * @returns {{ schedule: () => void, clear: () => void, getSweepTimer: () => (number | null) }}\n */\nexport function createSweeper({ inflight, sweepIntervalMs, handleTaskTimeout }) {\n\tlet sweepTimer = null;\n\tconst schedule = () => {\n\t\tif (sweepTimer) return;\n\t\tsweepTimer = setTimeout(() => {\n\t\t\tsweepTimer = null;\n\t\t\tconst now = performance.now();\n\t\t\tinflight.forEach((task) => {\n\t\t\t\tif (now - task.startTime > task.timeout) {\n\t\t\t\t\thandleTaskTimeout(task);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (inflight.count > 0) {\n\t\t\t\tschedule();\n\t\t\t}\n\t\t}, sweepIntervalMs).unref();\n\t};\n\tconst clear = () => {\n\t\tclearTimeout(sweepTimer);\n\t\tsweepTimer = null;\n\t};\n\treturn { schedule, clear, getSweepTimer: () => sweepTimer };\n}\n\n/**\n * 创建 pendingFinalize 结算调度器。\n * 通过 setImmediate 延迟一帧执行 finalizePendingTasks,给 stderr chunk 到达的时间窗口。\n * 若 finalizePendingTasks 中有零行 query 等待 stderr,自动重新调度下一轮 finalize。\n *\n * @param {{\n * pendingFinalizeTasks: Set<object>,\n * settleTask: (task: object, error: Error | null, value: any) => void,\n * pumpQueue: () => void,\n * pendingStderr?: string[],\n * inflight?: import(\"./inflightTracker.js\").InflightTracker,\n * }} params\n * @returns {() => void}\n */\nexport function createFinalizeScheduler({ pendingFinalizeTasks, settleTask: settle, pumpQueue, pendingStderr, inflight }) {\n\tlet scheduled = false;\n\tlet immediate = null;\n\tlet cancelled = false;\n\tconst cancel = () => {\n\t\tcancelled = true;\n\t\tif (immediate) {\n\t\t\tclearImmediate(immediate);\n\t\t\timmediate = null;\n\t\t}\n\t};\n\tconst check = () => {\n\t\tif (cancelled) return;\n\t\tif (scheduled) return;\n\t\tif (pendingFinalizeTasks.size === 0) return;\n\t\tscheduled = true;\n\t\timmediate = setImmediate(() => {\n\t\t\timmediate = null;\n\t\t\tif (cancelled) return;\n\t\t\tfinalizePendingTasks(pendingFinalizeTasks, settle, pumpQueue, pendingStderr, inflight);\n\t\t\tscheduled = false;\n\t\t});\n\t};\n\tcheck.cancel = cancel;\n\treturn check;\n}\n\n/**\n * 处理一个完整的 JSON 值(来自 sharedValueParser)。\n * 匹配 sentinel token、收集 query 行数据、触发 stream 回调。\n * PipelineEngine 和 TaskWorker 共享此逻辑。\n *\n * @param {string} raw - 原始 JSON 文本\n * @param {import(\"./inflightTracker.js\").InflightTracker} inflight\n * @param {{\n * afterSentinel: (task: object) => void,\n * rejectAll: (error: Error) => void,\n * }} callbacks\n */\n/**\n * sentinel 到达时将下一个 inflight 任务的 startTime 前移到当前时间,\n * 防止该任务的超时倒计时累积前面任务的执行等待时间。\n *\n * 在大量 SQL 执行场景下,后续任务虽然 SQL 很快,但可能因前面排队任务的\n * 累积执行时间而误触 timeout。此回调确保每个任务的 timeout 从\"前一个任务\n * 完成时刻\"开始计算,而非从\"整批写入 stdin 的时刻\"。\n *\n * @param {import(\"./inflightTracker.js\").InflightTracker} inflight\n */\nfunction advanceNextInflightStartTime(inflight) {\n\tconst next = inflight.first;\n\tif (next && next.startTime > 0) {\n\t\tconst now = performance.now();\n\t\tif (now > next.startTime) {\n\t\t\tnext.startTime = now;\n\t\t}\n\t}\n}\n\nexport function handleParsedValue(raw, inflight, { afterSentinel, rejectAll }) {\n\tconst task = inflight.first;\n\tif (!task) return;\n\n\t// Fast path: 原始字符串精确匹配 sentinel,跳过 JSON.parse\n\tif (isSentinelRaw(raw, task.token)) {\n\t\tinflight.shift();\n\t\tadvanceNextInflightStartTime(inflight);\n\t\tafterSentinel(task);\n\t\treturn;\n\t}\n\n\t// Fast path: 空数组 [],execute 的零行结果,跳过 JSON.parse\n\tif (raw === \"[]\") return;\n\n\tlet parsed;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\trejectAll(new Error(`Invalid JSON from sqlite3: ${toError(error).message}`));\n\t\treturn;\n\t}\n\n\tif (isSentinelRow(parsed, task.token)) {\n\t\tinflight.shift();\n\t\tadvanceNextInflightStartTime(inflight);\n\t\tafterSentinel(task);\n\t\treturn;\n\t}\n\n\tif (task.timedout) return;\n\n\tif (task.kind === \"query\") {\n\t\tcollectQueryRows(task, parsed);\n\t\treturn;\n\t}\n\n\tif (task.kind === \"stream\") {\n\t\tprocessStreamRows(task, parsed);\n\t}\n}\n\n/**\n * 创建一个泵送(pump)函数,将队列中的任务批量发送给 sqlite3 进程。\n *\n * PipelineEngine 和 TaskWorker 共享此工厂,消除 #pumpQueue 方法的重复。\n * 调用方可通过 active 守卫(可选)控制是否允许泵送。\n *\n * @param {{\n * queue: import(\"./queue.js\").Queue,\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * processManager: { draining: boolean, write: (data: string) => void, onDrained: (cb: () => void) => void },\n * sweeper: { schedule: () => void },\n * batchSize: number,\n * maxInflight: number,\n * }} params\n * @returns {() => void} 泵送函数,调用后尝试从队列取出 batch 发送\n */\nexport function createPumpQueue({ queue, inflight, processManager, sweeper, batchSize, maxInflight }) {\n\tlet nextBatchId = 1;\n\treturn function pump() {\n\t\tif (processManager.draining) {\n\t\t\tprocessManager.onDrained(() => pump());\n\t\t\treturn;\n\t\t}\n\t\tif (inflight.count >= maxInflight) return;\n\n\t\tconst batch = [];\n\t\twhile (batch.length < batchSize && !queue.isEmpty() && inflight.count + batch.length < maxInflight) {\n\t\t\tconst task = queue.peek();\n\t\t\tif (task.kind === \"stream\" && (batch.length > 0 || inflight.count > 0)) break;\n\t\t\tqueue.dequeue();\n\t\t\tbatch.push(task);\n\t\t}\n\t\tif (batch.length === 0) return;\n\n\t\tconst now = performance.now();\n\t\tconst payload = buildBatchPayload(batch);\n\t\tconst batchId = nextBatchId++;\n\t\tconst useWalBatch = payload.startsWith(\"BEGIN;\");\n\n\t\tfor (const task of batch) {\n\t\t\ttask.startTime = now;\n\t\t\ttask.batchId = batchId;\n\t\t\ttask.walBatch = useWalBatch;\n\t\t}\n\t\tinflight.push(...batch);\n\t\tsweeper.schedule();\n\t\tprocessManager.write(payload);\n\t};\n}\n\n/**\n * 处理 sentinel token 命中后的任务结算。\n *\n * 此函数提取自 PipelineEngine.#afterSentinel 和 TaskWorker.#afterSentinel,\n * 消除二者间的逻辑重复。统一使用延迟结算策略:\n * - timedout 任务直接跳过(不结算,数据已丢弃)\n * - consumerError 任务立即 reject(用户主动错误无需等待)\n * - 其他任务进入 pendingFinalize 延迟一帧,给 stderr chunk 留到达时间\n *\n * @param {object} task - 已从 inflight shift 的任务\n * @param {{\n * settleTask: (task: object, error: Error | null, value: any) => void,\n * pendingFinalizeTasks: Set<object>,\n * scheduleFinalizeCheck: () => void,\n * pumpQueue: () => void,\n * }} params\n */\nexport function handleSentinelTask(task, { settleTask, pendingFinalizeTasks, scheduleFinalizeCheck, pumpQueue }) {\n\tif (task.timedout) {\n\t\tpumpQueue();\n\t\treturn;\n\t}\n\n\tif (task.consumerError) {\n\t\tsettleTask(task, task.consumerError, undefined);\n\t\tpumpQueue();\n\t\treturn;\n\t}\n\n\t// 无论 stderrText 是否为空,都走 pendingFinalize 延迟结算。\n\t// 原因:Windows 上 sqlite3 的 stderr 输出可能被 OS pipe 拆分为多个 chunk,\n\t// 若在此处立即 reject,后续到达的 stderr chunk 会丢失或被错误地配给下一个 inflight 任务。\n\tpendingFinalizeTasks.add(task);\n\tscheduleFinalizeCheck();\n\tpumpQueue();\n}\n\n/**\n * 处理 sqlite3 的 stderr 输出,将其归因到合适的任务。\n *\n * 提取自 PipelineEngine.handleStderrChunk 和 TaskWorker.#handleStderrChunk,\n * 统一采用 PipelineEngine 的精细归因策略:\n * 1. 零行归因 — pendingFinalize 中 rows.length === 0 的 query 极可能是失败源\n * 2. WAL batch — 整个事务回滚,传播到 batch 内所有任务\n * 3. 非 WAL batch(多任务) — 无法确定来源时缓冲到 pendingStderr,由后续\n * finalizePendingTasks 中的零行归因机制正确归因,避免 stderr 错误地\n * 归因给第一个 inflight 任务(#1957 随机测试报错修复)\n * 4. 非 WAL batch(单任务或 primary 为 pendingFinalize)— 归因给该任务\n *\n * @param {string} chunk - stderr 文本块\n * @param {{\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * pendingFinalizeTasks: Set<object>,\n * logger?: { error?: (msg: string) => void },\n * pendingStderr?: string[],\n * hasFinalizedZeroRowQuery?: boolean,\n * }} params\n */\nexport function handleStderrChunk(chunk, { inflight, pendingFinalizeTasks, logger, pendingStderr, hasFinalizedZeroRowQuery }) {\n\tconst inflightFirst = inflight.first;\n\tconst firstPending = pendingFinalizeTasks.values().next().value;\n\n\t// ── 零行归因(优先)──\n\t// sqlite3 对失败 SQL 只输出 stderr 不输出数据行。\n\t// pendingFinalize 中 rows.length === 0 的 query 全部可能是失败源。\n\t// 此 stderr chunk 归因给所有零行任务(而非仅第一个匹配),\n\t// 确保 batch 中所有失败任务都收到错误消息。\n\tlet zeroRowMatch = false;\n\tfor (const t of pendingFinalizeTasks) {\n\t\tif (t.kind === \"query\" && t.rows.length === 0) {\n\t\t\tt.stderrText += chunk;\n\t\t\tzeroRowMatch = true;\n\t\t}\n\t}\n\tif (zeroRowMatch) return;\n\n\t// ── 选择 primary 任务 ──\n\tconst task = inflightFirst ?? firstPending;\n\n\tif (!task) {\n\t\tlogger?.error?.(chunk.trim());\n\t\treturn;\n\t}\n\n\t// ── 非 batch 任务(standalone):直接归因 ──\n\tif (task.batchId == null) {\n\t\ttask.stderrText += chunk;\n\t\treturn;\n\t}\n\n\t// ── WAL batch:整个事务回滚,所有任务受影响 ──\n\tif (task.walBatch) {\n\t\ttask.stderrText += chunk;\n\t\tfor (const t of pendingFinalizeTasks) {\n\t\t\tif (t !== task) t.stderrText += chunk;\n\t\t}\n\t\tinflight.forEach((t) => {\n\t\t\tif (t !== task) t.stderrText += chunk;\n\t\t});\n\t\treturn;\n\t}\n\n\t// ── 非 WAL batch ──\n\tif (task === inflightFirst) {\n\t\tif (inflight.count > 1) {\n\t\t\t// 多个活跃 inflight 任务:无法确定 stderr 来源。\n\t\t\t// 缓冲,由 finalizePendingTasks 中的零行归因正确匹配。\n\t\t\tpendingStderr?.push(chunk);\n\t\t} else if (pendingFinalizeTasks.size > 0) {\n\t\t\t// 唯一 inflight 任务 + 存在 pending 任务。\n\t\t\t// 检查 pending 中是否有零行 query(可能来自已完成任务的 stderr)。\n\t\t\tlet hasZeroRowQuery = false;\n\t\t\tfor (const t of pendingFinalizeTasks) {\n\t\t\t\tif (t.kind === \"query\" && t.rows.length === 0) {\n\t\t\t\t\thasZeroRowQuery = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasZeroRowQuery) {\n\t\t\t\t// 有零行 query:缓冲,由 finalizePendingTasks 正确归因\n\t\t\t\tpendingStderr?.push(chunk);\n\t\t\t} else if (task.kind === \"query\" && task.rows.length > 0) {\n\t\t\t\t// inflight 任务已有数据行:它是合法查询,stderr 不来自它。\n\t\t\t\tlogger?.error?.(chunk.trim());\n\t\t\t} else if (task.kind === \"query\" && task.rows.length === 0) {\n\t\t\t\t// inflight query 尚无数据行 —— 根据标志位判断 stderr 来源:\n\t\t\t\t// hasFinalizedZeroRowQuery=true → 来自已结算的上一批任务(延迟 stderr #1957)\n\t\t\t\t// hasFinalizedZeroRowQuery=false → 来自当前 inflight 任务(即时归因)\n\t\t\t\tif (hasFinalizedZeroRowQuery) {\n\t\t\t\t\tpendingStderr?.push(chunk);\n\t\t\t\t} else {\n\t\t\t\t\ttask.stderrText += chunk;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 唯一 inflight 任务,pending 中无零行 query:\n\t\t\t\t// stderr 只能来自该 inflight 任务(execute)。\n\t\t\t\ttask.stderrText += chunk;\n\t\t\t}\n\t\t} else if (task.kind === \"query\" && task.rows.length > 0) {\n\t\t\t// 唯一的 inflight 任务已有数据行:它是合法查询,stderr 不来自它。\n\t\t\tlogger?.error?.(chunk.trim());\n\t\t} else if (task.kind === \"query\" && task.rows.length === 0) {\n\t\t\t// 唯一的 inflight query 尚无数据行 —— 根据标志位判断:\n\t\t\t// hasFinalizedZeroRowQuery=true → 来自已结算的上一批任务(延迟 stderr #1957)\n\t\t\t// hasFinalizedZeroRowQuery=false → 来自当前 inflight 任务(即时归因)\n\t\t\tif (hasFinalizedZeroRowQuery) {\n\t\t\t\tpendingStderr?.push(chunk);\n\t\t\t} else {\n\t\t\t\ttask.stderrText += chunk;\n\t\t\t}\n\t\t} else {\n\t\t\t// 唯一的 inflight 任务,无其他待结算任务:可以安全归因\n\t\t\ttask.stderrText += chunk;\n\t\t}\n\t\treturn;\n\t}\n\n\t// ── Primary 是 pendingFinalize 任务(无 inflight)──\n\t// 没有零行 query 来匹配 stderr。此时 stderr 可能来自某个 execute 任务。\n\t// 保守地归因给所有 pendingFinalize 任务(恢复旧行为兜底)。\n\tfor (const t of pendingFinalizeTasks) {\n\t\tt.stderrText += chunk;\n\t}\n}\n\n/**\n * 拒绝所有待处理任务(inflight、队列、pendingFinalize)。\n *\n * 提取自 PipelineEngine.rejectAll 和 TaskWorker.#rejectAll,\n * 消除二者间的逻辑重复。调用方负责清理各自特有的资源\n * (如 sharedValueParser.reset() 或 sweeper.clear())。\n *\n * @param {{\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * queue: import(\"./queue.js\").Queue,\n * pendingFinalizeTasks: Set<object>,\n * settleTask: (task: object, error: Error | null, value: any) => void,\n * error: Error,\n * }} params\n */\nexport function rejectAllTasks({ inflight, queue, pendingFinalizeTasks, settleTask, error }) {\n\t// 1. 取走并清空 inflight\n\tconst all = inflight.toArray();\n\tinflight.clear();\n\n\t// 2. 结算队列中的任务(尚未发送)\n\tlet queued = queue.dequeue();\n\twhile (queued) {\n\t\tsettleTask(queued, error, undefined);\n\t\tqueued = queue.dequeue();\n\t}\n\n\t// 3. 结算 inflight 任务(正在执行)\n\tfor (const task of all) {\n\t\tsettleTask(task, error, undefined);\n\t}\n\n\t// 4. 结算 pendingFinalize 任务(等待延迟结算)\n\tfor (const task of pendingFinalizeTasks) {\n\t\tsettleTask(task, error, undefined);\n\t}\n\tpendingFinalizeTasks.clear();\n}\n","import { ProcessManager } from \"./process.js\";\nimport { Queue } from \"./queue.js\";\nimport { InflightTracker } from \"./inflightTracker.js\";\nimport { createJsonValueParser, toError } from \"./parser.js\";\nimport { settleTask } from \"./settleUtils.js\";\nimport { handleParsedValue, createSweeper, createFinalizeScheduler, createPumpQueue, rejectAllTasks, prepareTaskTimeout, handleSentinelTask, handleStderrChunk } from \"./pipelineUtils.js\";\nimport { DEFAULT_BATCH_SIZE, DEFAULT_MAX_INFLIGHT } from \"../constants.js\";\n\n/**\n * 单个 sqlite3 进程的任务执行器。\n * 内部维护 pending 和 inflight 两个队列,支持管线化(pipelining):\n * 多个任务的 SQL payload 合并为一次 stdin.write() 发送,由 sqlite3 顺序执行后,\n * 在 stdout 解析时按 FIFO 顺序匹配 sentinel token 并逐一完成 Promise。\n *\n * TaskWorker 不关心任务是读还是写——它只负责发送 SQL、解析输出、完成 Promise。\n * 由上层(SQLiteExecutor / ReaderPool)决定如何分发任务。\n */\nexport class TaskWorker {\n\t#processManager;\n\t#pendingQueue = new Queue();\n\t#inflight = new InflightTracker();\n\t#pendingFinalizeTasks = new Set();\n\t#valueParser;\n\t#statementTimeout;\n\t#logger;\n\t#name;\n\t#batchSize;\n\t#maxInflight;\n\t#metrics;\n\t#sweeper;\n\t/** 由 createFinalizeScheduler 创建的闭包,替代 #scheduleFinalizeCheck 方法 */\n\t#scheduleFinalizeCheck;\n\t/** 由 createPumpQueue 创建的泵送函数 */\n\t#pump;\n\n\t/** 多任务非 WAL batch 中无法立即归因的 stderr 缓冲 */\n\t#pendingStderr = [];\n\n\t/**\n\t * @param {{\n\t * binary: string\n\t * database: string\n\t * statementTimeout: number\n\t * logger?: import(\"../index.js\").Logger\n\t * name?: string\n\t * initMode?: \"wal\" | \"none\"\n\t * batchSize?: number\n\t * metrics?: import(\"./metrics.js\").Metrics\n\t * sweepInterval?: number\n\t * }} options\n\t */\n\tconstructor({ binary, database, statementTimeout, logger, name, initMode, batchSize = DEFAULT_BATCH_SIZE, maxInflight = DEFAULT_MAX_INFLIGHT, metrics, sweepInterval = 100 }) {\n\t\tthis.#name = name ?? \"worker\";\n\t\tthis.#statementTimeout = statementTimeout;\n\t\tthis.#logger = logger;\n\t\tthis.#batchSize = batchSize;\n\t\tthis.#maxInflight = maxInflight;\n\t\tthis.#metrics = metrics;\n\n\t\t// 创建共享管道组件\n\t\t// ProcessManager 需在其他管道组件之前创建,因为 createPumpQueue 依赖它\n\t\tthis.#processManager = new ProcessManager({ binary, database, initMode });\n\t\tthis.#processManager.setOnDrainCallback(() => this.#pumpQueue());\n\n\t\tthis.#sweeper = createSweeper({\n\t\t\tinflight: this.#inflight,\n\t\t\tsweepIntervalMs: sweepInterval,\n\t\t\thandleTaskTimeout: (task) => {\n\t\t\t\tconst error = prepareTaskTimeout(task, this.#metrics);\n\t\t\t\tif (error) this.#settleTask(task, error, undefined);\n\t\t\t},\n\t\t});\n\t\tthis.#pump = createPumpQueue({\n\t\t\tqueue: this.#pendingQueue,\n\t\t\tinflight: this.#inflight,\n\t\t\tprocessManager: this.#processManager,\n\t\t\tsweeper: this.#sweeper,\n\t\t\tbatchSize: this.#batchSize,\n\t\t\tmaxInflight: this.#maxInflight,\n\t\t});\n\t\tthis.#scheduleFinalizeCheck = createFinalizeScheduler({\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t\tinflight: this.#inflight,\n\t\t});\n\t\tthis.#valueParser = createJsonValueParser((raw) => {\n\t\t\thandleParsedValue(raw, this.#inflight, {\n\t\t\t\tafterSentinel: (task) => this.#afterSentinel(task),\n\t\t\t\trejectAll: (error) => this.#rejectAll(error),\n\t\t\t});\n\t\t});\n\t\tthis.#startProcess();\n\t}\n\n\tget name() {\n\t\treturn this.#name;\n\t}\n\n\tget idle() {\n\t\treturn this.#inflight.count === 0 && this.#pendingQueue.isEmpty() && this.#pendingFinalizeTasks.size === 0;\n\t}\n\n\tget pendingStatements() {\n\t\treturn this.#pendingQueue.size + this.#inflight.count + this.#pendingFinalizeTasks.size;\n\t}\n\n\t/**\n\t * 接收一个任务配置并加入队列。\n\t * 任务配置应包含:kind, sql, timeout, token, resolve, reject, onRow\n\t * @param {object} config\n\t */\n\tenqueue(config) {\n\t\tconst task = {\n\t\t\tkind: config.kind,\n\t\t\tsql: config.sql,\n\t\t\ttimeout: config.timeout,\n\t\t\ttoken: config.token,\n\t\t\tresolve: config.resolve,\n\t\t\treject: config.reject,\n\t\t\trows: config.kind === \"query\" ? [] : undefined,\n\t\t\tonRow: config.onRow ?? null,\n\t\t\tconsumerError: null,\n\t\t\tstderrText: \"\",\n\t\t\tsettled: false,\n\t\t\tstartTime: 0,\n\t\t};\n\t\tthis.#metrics?.incrementTasksTotal(config.kind);\n\t\tthis.#pendingQueue.enqueue(task);\n\t\tthis.#pumpQueue();\n\t}\n\n\t/** 测试用:获取扫制定时器引用。 */\n\tget _sweepTimer() {\n\t\treturn this.#sweeper?.getSweepTimer() ?? null;\n\t}\n\n\t/** 测试用:获取底层子进程引用。 */\n\tget _process() {\n\t\treturn this.#processManager.process;\n\t}\n\n\t/** 终止进程并清理。 */\n\tkill() {\n\t\tthis.#sweeper.clear();\n\t\tthis.#scheduleFinalizeCheck.cancel?.();\n\t\tthis.#rejectAll(new Error(`${this.#name} is killed`));\n\t\tthis.#processManager.kill();\n\t}\n\n\t// ---- 内部 ----\n\n\t#startProcess() {\n\t\tconst proc = this.#processManager.start();\n\n\t\tproc.stdout.on(\"data\", (chunk) => {\n\t\t\tthis.#valueParser.feed(chunk);\n\t\t});\n\n\t\tproc.stderr.on(\"data\", (chunk) => {\n\t\t\tthis.#handleStderrChunk(chunk);\n\t\t});\n\n\t\tproc.on(\"error\", (error) => {\n\t\t\tif (this.#processManager.process !== proc) return;\n\t\t\tthis.#logger?.error?.(`${this.#name} process error`, error);\n\t\t\tthis.#rejectAll(toError(error));\n\t\t});\n\n\t\tproc.on(\"close\", (code, signal) => {\n\t\t\tif (this.#processManager.process !== proc) return;\n\t\t\tconst err = new Error(`${this.#name} exited unexpectedly (code=${code}, signal=${signal ?? \"none\"})`);\n\t\t\tthis.#rejectAll(err);\n\t\t});\n\t}\n\n\t/**\n\t * 从 pendingQueue 中取出最多 batchSize 个任务,合并 payload 后一次性写入 stdin。\n\t * 实际逻辑委托给 this.#pump(由 createPumpQueue 创建)。\n\t */\n\t#pumpQueue() {\n\t\tthis.#pump();\n\t}\n\n\t/** sentinel token 命中后的统一处理逻辑(委托给共享函数)。 */\n\t#afterSentinel(task) {\n\t\thandleSentinelTask(task, {\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tscheduleFinalizeCheck: () => this.#scheduleFinalizeCheck(),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t});\n\t}\n\n\t#handleStderrChunk(chunk) {\n\t\thandleStderrChunk(chunk, {\n\t\t\tinflight: this.#inflight,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tlogger: this.#logger,\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t});\n\t}\n\n\t#settleTask(task, error, value) {\n\t\tsettleTask(task, error, value, this.#metrics);\n\t}\n\n\t#rejectAll(error) {\n\t\tthis.#sweeper.clear();\n\t\trejectAllTasks({\n\t\t\tinflight: this.#inflight,\n\t\t\tqueue: this.#pendingQueue,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\terror,\n\t\t});\n\t}\n}\n","import { TaskWorker } from \"./taskWorker.js\";\n\n/**\n * 读取器连接池。\n * 维护多个 TaskWorker 实例,每个连接一个独立的 sqlite3 进程。\n * 通过 round-robin 分发只读任务,实现并发读取。\n */\nexport class ReaderPool {\n\t#workers = [];\n\t#rrIndex = 0;\n\n\t/**\n\t * @param {{\n\t * binary: string\n\t * database: string\n\t * poolSize: number\n\t * statementTimeout: number\n\t * logger?: import(\"../index.js\").Logger\n\t * metrics?: import(\"./metrics.js\").Metrics\n\t * }} options\n\t */\n\tconstructor({ binary, database, poolSize, statementTimeout, logger, metrics }) {\n\t\tif (poolSize < 1) throw new RangeError(\"poolSize must be >= 1\");\n\t\tfor (let i = 0; i < poolSize; i++) {\n\t\t\tconst worker = new TaskWorker({\n\t\t\t\tbinary,\n\t\t\t\tdatabase,\n\t\t\t\tstatementTimeout,\n\t\t\t\tlogger,\n\t\t\t\tmetrics,\n\t\t\t\tname: `reader-${i}`,\n\t\t\t\tinitMode: database !== \":memory:\" ? \"none\" : \"none\",\n\t\t\t});\n\t\t\tthis.#workers.push(worker);\n\t\t}\n\t}\n\n\tget size() {\n\t\treturn this.#workers.length;\n\t}\n\n\tget pendingStatements() {\n\t\treturn this.#workers.reduce((sum, w) => sum + w.pendingStatements, 0);\n\t}\n\n\t/**\n\t * Least Busy 选择一个 reader 并执行任务。\n\t * 比较所有 worker 的 pendingStatements,选负载最小的。\n\t * 负载相同时按 round-robin 选,确保公平性。\n\t * @param {object} task\n\t */\n\tenqueue(task) {\n\t\tlet minLoad = Infinity;\n\t\tconst candidates = [];\n\t\tfor (let i = 0; i < this.#workers.length; i++) {\n\t\t\tconst load = this.#workers[i].pendingStatements;\n\t\t\tif (load < minLoad) {\n\t\t\t\tminLoad = load;\n\t\t\t\tcandidates.length = 0;\n\t\t\t\tcandidates.push(i);\n\t\t\t} else if (load === minLoad) {\n\t\t\t\tcandidates.push(i);\n\t\t\t}\n\t\t}\n\t\tconst idx = candidates[this.#rrIndex % candidates.length];\n\t\tthis.#rrIndex = (this.#rrIndex + 1) >>> 0;\n\t\tthis.#workers[idx].enqueue(task);\n\t}\n\n\t/** 测试用:获取内部 worker 列表。 */\n\tget _workers() {\n\t\treturn this.#workers;\n\t}\n\n\t/** 终止所有 reader 进程。 */\n\tkill() {\n\t\tfor (const worker of this.#workers) {\n\t\t\tworker.kill();\n\t\t}\n\t}\n}\n","/**\n * 轻量级运行时指标收集器。\n * 用于追踪 SQL 执行任务的吞吐、耗时、错误、超时和进程重启。\n *\n * 设计原则:\n * - 仅使用数字计数器,避免高频路径上的对象分配\n * - 所有 increment 方法 O(1)、无 throw\n * - 可被多个 TaskWorker / Executor 共享(通过引用传递)\n */\nexport class Metrics {\n\t#tasksTotal = 0;\n\t#tasksSuccess = 0;\n\t#tasksFailed = 0;\n\t#tasksTimeout = 0;\n\t#processRestarts = 0;\n\t#executeCount = 0;\n\t#queryCount = 0;\n\t#streamCount = 0;\n\t#totalDuration = 0;\n\t#startTime = Date.now();\n\n\tget tasksTotal() {\n\t\treturn this.#tasksTotal;\n\t}\n\n\tget tasksSuccess() {\n\t\treturn this.#tasksSuccess;\n\t}\n\n\tget tasksFailed() {\n\t\treturn this.#tasksFailed;\n\t}\n\n\tget tasksTimeout() {\n\t\treturn this.#tasksTimeout;\n\t}\n\n\tget processRestarts() {\n\t\treturn this.#processRestarts;\n\t}\n\n\tget executeCount() {\n\t\treturn this.#executeCount;\n\t}\n\n\tget queryCount() {\n\t\treturn this.#queryCount;\n\t}\n\n\tget streamCount() {\n\t\treturn this.#streamCount;\n\t}\n\n\t/** 累计任务耗时(毫秒),用于计算 avgQueryTime。 */\n\tget totalDuration() {\n\t\treturn this.#totalDuration;\n\t}\n\n\t/** Metrics 实例的创建时间(Unix 时间戳)。 */\n\tget startTime() {\n\t\treturn this.#startTime;\n\t}\n\n\t/**\n\t * 记录一个任务入队。\n\t * @param {\"execute\" | \"query\" | \"stream\"} kind\n\t */\n\tincrementTasksTotal(kind) {\n\t\tthis.#tasksTotal++;\n\t\tif (kind === \"execute\") this.#executeCount++;\n\t\telse if (kind === \"query\") this.#queryCount++;\n\t\telse if (kind === \"stream\") this.#streamCount++;\n\t}\n\n\t/**\n\t * 记录一个任务成功完成。\n\t * @param {number} duration 实际执行耗时(毫秒)\n\t */\n\tincrementTasksSuccess(duration) {\n\t\tthis.#tasksSuccess++;\n\t\tthis.#totalDuration += duration;\n\t}\n\n\t/** 记录一个任务失败。 */\n\tincrementTasksFailed() {\n\t\tthis.#tasksFailed++;\n\t}\n\n\t/** 记录一个任务超时。 */\n\tincrementTasksTimeout() {\n\t\tthis.#tasksTimeout++;\n\t}\n\n\t/** 记录 sqlite3 进程重启次数。 */\n\tincrementProcessRestarts() {\n\t\tthis.#processRestarts++;\n\t}\n\n\t/**\n\t * 返回当前所有指标的只读快照。\n\t * @returns {{\n\t * tasksTotal: number,\n\t * tasksSuccess: number,\n\t * tasksFailed: number,\n\t * tasksTimeout: number,\n\t * processRestarts: number,\n\t * executeCount: number,\n\t * queryCount: number,\n\t * streamCount: number,\n\t * avgTaskDuration: number,\n\t * throughput: number,\n\t * uptime: number,\n\t * }}\n\t */\n\tsnapshot() {\n\t\tconst elapsed = (Date.now() - this.#startTime) / 1000;\n\t\tlet avgTaskDuration;\n\t\tif (this.#tasksSuccess > 0) avgTaskDuration = this.#totalDuration / this.#tasksSuccess;\n\t\telse avgTaskDuration = 0;\n\t\tlet throughput;\n\t\tif (elapsed > 0) throughput = this.#tasksTotal / elapsed;\n\t\telse throughput = 0;\n\t\treturn {\n\t\t\ttasksTotal: this.#tasksTotal,\n\t\t\ttasksSuccess: this.#tasksSuccess,\n\t\t\ttasksFailed: this.#tasksFailed,\n\t\t\ttasksTimeout: this.#tasksTimeout,\n\t\t\tprocessRestarts: this.#processRestarts,\n\t\t\texecuteCount: this.#executeCount,\n\t\t\tqueryCount: this.#queryCount,\n\t\t\tstreamCount: this.#streamCount,\n\t\t\tavgTaskDuration,\n\t\t\tthroughput,\n\t\t\tuptime: elapsed,\n\t\t};\n\t}\n}\n","import { Queue } from \"./queue.js\";\nimport { settleTask } from \"./settleUtils.js\";\n\n/**\n * 事务作用域管理器。\n *\n * 事务内的所有操作绑定到同一个 scopeId,保证不被外部任务交错。\n * 事务外的任务自动暂存到延迟队列,在事务结束后恢复执行。\n */\nexport class TransactionScope {\n\t#deferredQueue = new Queue();\n\t#activeScopeId = null;\n\t#scopeChain = Promise.resolve();\n\n\t/** 当前事务的作用域 ID,无事务时为 null。 */\n\tget scopeId() {\n\t\treturn this.#activeScopeId;\n\t}\n\n\t/** 是否有事务正在执行。 */\n\tget active() {\n\t\treturn this.#activeScopeId !== null;\n\t}\n\n\t/** 延迟队列中的待处理任务数。 */\n\tget pendingStatements() {\n\t\treturn this.#deferredQueue.size;\n\t}\n\n\t/**\n\t * 判断给定 scopeId 的任务是否应当延迟执行。\n\t * @param {symbol | null} scopeId\n\t * @returns {boolean}\n\t */\n\tisDeferred(scopeId) {\n\t\treturn this.#activeScopeId !== null && this.#activeScopeId !== scopeId;\n\t}\n\n\t/** 将任务放入延迟队列。 */\n\tdefer(task) {\n\t\tthis.#deferredQueue.enqueue(task);\n\t}\n\n\t/**\n\t * 进入事务作用域。\n\t * 返回 scopeId 和 release 函数,调用 release 后下一个等待的事务可以执行。\n\t * @returns {Promise<{ scopeId: symbol, release: () => void }>}\n\t */\n\tasync enter() {\n\t\tconst scopeId = Symbol(\"transaction\");\n\t\tlet release = null;\n\t\tconst gate = new Promise((resolve) => { release = resolve; });\n\n\t\tconst previous = this.#scopeChain;\n\t\t// 将前一个 scopeChain 的 reject 吞掉,避免未捕获的 reject 传播。\n\t\t// 前一个事务可能因 ROLLBACK 而 reject,这不应影响当前事务的等待。\n\t\tthis.#scopeChain = gate;\n\t\tawait previous.catch(() => {});\n\n\t\tthis.#activeScopeId = scopeId;\n\t\treturn { scopeId, release };\n\t}\n\n\t/** 退出事务作用域。 */\n\texit() {\n\t\tthis.#activeScopeId = null;\n\t}\n\n\t/**\n\t * 将延迟队列恢复到目标 Queue 的头部。\n\t * @param {import(\"./queue.js\").Queue} targetQueue\n\t */\n\trestoreDeferred(targetQueue) {\n\t\ttargetQueue.prependAll(this.#deferredQueue);\n\t}\n\n\t/**\n\t * 拒绝所有延迟队列中的任务。\n\t * @param {Error} error\n\t */\n\trejectAll(error) {\n\t\tlet task = this.#deferredQueue.dequeue();\n\t\twhile (task) {\n\t\t\tsettleTask(task, error, undefined, null);\n\t\t\ttask = this.#deferredQueue.dequeue();\n\t\t}\n\t}\n}\n","import { Queue } from \"./queue.js\";\nimport { InflightTracker } from \"./inflightTracker.js\";\nimport { createJsonValueParser } from \"./parser.js\";\nimport { settleTask } from \"./settleUtils.js\";\nimport { handleParsedValue, createSweeper, createFinalizeScheduler, createPumpQueue, rejectAllTasks, prepareTaskTimeout, handleSentinelTask, handleStderrChunk } from \"./pipelineUtils.js\";\nimport { DEFAULT_BATCH_SIZE, DEFAULT_MAX_INFLIGHT } from \"../constants.js\";\n\n/**\n * 管线化执行引擎。\n *\n * 维护任务队列、管理 inflight 任务、处理 stdout/stderr 解析、\n * 实现 sentinel token 协议和 stderr 竞态处理。\n *\n * PipelineEngine 不关心事务作用域、读写分离或进程恢复 ——\n * 这些由上层(SQLiteExecutor)负责。\n */\nexport class PipelineEngine {\n\t#queue = new Queue();\n\t#inflight = new InflightTracker();\n\t#pendingFinalizeTasks = new Set();\n\t#sharedValueParser;\n\t#processManager;\n\t#metrics;\n\t#statementTimeout;\n\t#logger;\n\t#batchSize;\n\t#maxInflight;\n\t#onTaskTimeout;\n\t#active = false;\n\t#sweeper;\n\t/** 由 createFinalizeScheduler 创建的闭包,替代 #scheduleFinalizeCheck 方法 */\n\t#scheduleFinalizeCheck;\n\t/** 由 createPumpQueue 创建的泵送函数(不含 active 守卫) */\n\t#pump;\n\n\t/** 多任务非 WAL batch 中无法立即归因的 stderr 缓冲 */\n\t#pendingStderr = [];\n\n\t/**\n\t * 标记此前是否已结算过零行 query 任务(无论成功或失败)。\n\t * 若为 true,则 handleStderrChunk 中零行 inflight query 的 stderr\n\t * 可能是来自已结算任务的延迟/残余 stderr,应缓冲到 #pendingStderr 而非直接归因。\n\t */\n\t#hasFinalizedZeroRowQuery = false;\n\n\t/**\n\t * @param {import(\"./process.js\").ProcessManager} processManager\n\t * @param {{\n\t * metrics: import(\"./metrics.js\").Metrics,\n\t * statementTimeout: number,\n\t * logger?: import(\"../index.js\").Logger,\n\t * batchSize?: number,\n\t * onTaskTimeout?: (task: object) => void,\n\t * }} options\n\t */\n\tconstructor(\n\t\tprocessManager,\n\t\t{\n\t\t\tmetrics,\n\t\t\tstatementTimeout,\n\t\t\tlogger,\n\t\t\tbatchSize = DEFAULT_BATCH_SIZE,\n\t\t\tmaxInflight = DEFAULT_MAX_INFLIGHT,\n\t\t\tonTaskTimeout,\n\t\t\tsweepInterval = 100,\n\t\t},\n\t) {\n\t\tthis.#processManager = processManager;\n\t\tthis.#metrics = metrics;\n\t\tthis.#statementTimeout = statementTimeout;\n\t\tthis.#logger = logger;\n\t\tthis.#batchSize = batchSize;\n\t\tthis.#maxInflight = maxInflight;\n\t\tthis.#onTaskTimeout = onTaskTimeout ?? (() => {});\n\n\t\t// 创建共享管道组件\n\t\tthis.#sweeper = createSweeper({\n\t\t\tinflight: this.#inflight,\n\t\t\tsweepIntervalMs: sweepInterval,\n\t\t\thandleTaskTimeout: (task) => {\n\t\t\t\tconst error = prepareTaskTimeout(task, this.#metrics);\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.#settleTask(task, error, undefined);\n\t\t\t\t\tthis.#onTaskTimeout?.(task);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tthis.#pump = createPumpQueue({\n\t\t\tqueue: this.#queue,\n\t\t\tinflight: this.#inflight,\n\t\t\tprocessManager: this.#processManager,\n\t\t\tsweeper: this.#sweeper,\n\t\t\tbatchSize: this.#batchSize,\n\t\t\tmaxInflight: this.#maxInflight,\n\t\t});\n\t\tthis.#scheduleFinalizeCheck = createFinalizeScheduler({\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t\tinflight: this.#inflight,\n\t\t});\n\t\tthis.#sharedValueParser = createJsonValueParser((raw) => {\n\t\t\thandleParsedValue(raw, this.#inflight, {\n\t\t\t\tafterSentinel: (task) => this.#afterSentinel(task),\n\t\t\t\trejectAll: (error) => this.rejectAll(error),\n\t\t\t});\n\t\t});\n\t\tthis.#processManager.setOnDrainCallback(() => this.#pumpQueue());\n\t}\n\n\t/** 测试用:获取扫制定时器引用。 */\n\tget _sweepTimer() {\n\t\treturn this.#sweeper?.getSweepTimer() ?? null;\n\t}\n\n\t/** 主任务队列(供事务延迟任务恢复使用)。 */\n\tget mainQueue() {\n\t\treturn this.#queue;\n\t}\n\n\t/** 主动触发一次队列发送。 */\n\tpump() {\n\t\tthis.#pumpQueue();\n\t}\n\n\t/** 当前待处理的任务总数(队列中 + 执行中 + pendingFinalize)。 */\n\tget pendingStatements() {\n\t\treturn this.#queue.size + this.#inflight.count + this.#pendingFinalizeTasks.size;\n\t}\n\n\t/**\n\t * 将数据送入 sharedValueParser 解析(供 stream 的 rowParser 回喂数据使用)。\n\t * @param {string} raw\n\t */\n\tfeed(raw) {\n\t\tthis.#sharedValueParser.feed(raw);\n\t}\n\n\t/** 标记引擎可用,允许发送任务。 */\n\tactivate() {\n\t\tthis.#sharedValueParser?.reset();\n\t\tthis.#active = true;\n\t}\n\n\t/** 标记引擎不可用,阻止发送新任务。 */\n\tdeactivate() {\n\t\tthis.#active = false;\n\t}\n\n\t/**\n\t * 入队一个任务。\n\t * 任务对象应包含:kind, sql, timeout, token, onRow, rows, resolve, reject,\n\t * consumerError, stderrText, timer, startTime, rowParser。\n\t * @param {object} task\n\t */\n\tenqueue(task) {\n\t\tthis.#queue.enqueue(task);\n\t\tthis.#pumpQueue();\n\t}\n\n\t/**\n\t * 从队列批量取出任务发送给 sqlite3 进程(active 守卫包装)。\n\t * 实际逻辑委托给 this.#pump(由 createPumpQueue 创建)。\n\t */\n\t#pumpQueue() {\n\t\tif (!this.#active) return;\n\t\tthis.#pump();\n\t}\n\n\t/**\n\t * 处理 sqlite3 的 stdout 输出。\n\t * 对于 stream 类型任务,先通过行流解析器逐行处理,剩余数据转给 JSON 值解析器。\n\t * @param {string} chunk\n\t */\n\thandleStdoutChunk(chunk) {\n\t\tconst task = this.#inflight.first;\n\t\tif (!task) return;\n\n\t\t// 已超时的 stream 任务:禁止继续喂给 rowParser(rowParser.reset 后 finished=false,\n\t\t// 否则会触发 spurious onRow 回调)。数据直接走 sharedValueParser 由\n\t\t// handleParsedValue 中的 task.timedout 短路丢弃。\n\t\tif (task.kind === \"stream\" && task.rowParser && !task.rowParser.finished && !task.timedout) {\n\t\t\tconst leftover = task.rowParser.feed(chunk);\n\t\t\tif (leftover) this.#sharedValueParser.feed(leftover);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#sharedValueParser.feed(chunk);\n\t}\n\n\t/**\n\t * sentinel token 命中后的统一处理逻辑(委托句共享函数)。\n\t */\n\t#afterSentinel(task) {\n\t\thandleSentinelTask(task, {\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tscheduleFinalizeCheck: () => this.#scheduleFinalizeCheck(),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t});\n\t}\n\n\t/**\n\t * 处理 sqlite3 的 stderr 输出(委托给共享函数)。\n\t * @param {string} chunk\n\t */\n\thandleStderrChunk(chunk) {\n\t\thandleStderrChunk(chunk, {\n\t\t\tinflight: this.#inflight,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tlogger: this.#logger,\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t\thasFinalizedZeroRowQuery: this.#hasFinalizedZeroRowQuery,\n\t\t});\n\t}\n\n\t#settleTask(task, error, value) {\n\t\t// 零行 query 任务结算后,其对应的 stderr 可能仍有残余分片在途:\n\t\t// - 成功结算(无错误):stderr 尚未到达\n\t\t// - 失败结算(有错误):部分 stderr 已到达并归因,但同一条错误消息\n\t\t// 可能被 OS 管道拆分,剩余分片仍会在稍后到达(Windows/macOS 常见)\n\t\t// 两种情况下,后续到达的延迟 stderr 都不应归因给新的 inflight query,\n\t\t// 故标记 #hasFinalizedZeroRowQuery 提醒 handleStderrChunk 将其缓冲到\n\t\t// pendingStderr,交由零行归因机制兜底。\n\t\tif (task.kind === \"query\" && task.rows?.length === 0) {\n\t\t\tthis.#hasFinalizedZeroRowQuery = true;\n\t\t}\n\t\tsettleTask(task, error, value, this.#metrics, { resetRowParser: true });\n\t}\n\n\t/**\n\t * 拒绝 inflight 任务以及队列中的所有待处理任务。\n\t * 不清除 deferred 队列(由上层负责)。\n\t * @param {Error} error\n\t */\n\trejectAll(error) {\n\t\tthis.#sharedValueParser.reset();\n\t\trejectAllTasks({\n\t\t\tinflight: this.#inflight,\n\t\t\tqueue: this.#queue,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\terror,\n\t\t});\n\t}\n\n\t/**\n\t * 终止引擎:拒绝所有任务,清空状态。\n\t */\n\tkill() {\n\t\tthis.#active = false;\n\t\tthis.#sweeper.clear();\n\t\tthis.#scheduleFinalizeCheck.cancel?.();\n\t\tthis.rejectAll(new Error(\"PipelineEngine is killed\"));\n\t}\n}\n","import { DEFAULT_STATEMENT_TIMEOUT } from \"../utils/timeout.js\";\nimport { VALID_TRANSACTION_MODES, createTransactionHandle } from \"../transaction/transaction.js\";\nimport { ProcessManager } from \"./process.js\";\nimport { toError } from \"./parser.js\";\nimport { generateToken } from \"../utils/token.js\";\n\nimport { setupStreamParser, AsyncRowBuffer } from \"../stream/stream.js\";\nimport { interpolateFromTemplate } from \"../utils/interpolate.js\";\nimport { normalizeSQLTemplate } from \"../utils/normalize.js\";\nimport { classifySQL } from \"./classifier.js\";\nimport { ReaderPool } from \"./readerPool.js\";\nimport { Metrics } from \"./metrics.js\";\nimport { TransactionScope } from \"./transactionScope.js\";\nimport { PipelineEngine } from \"./pipelineEngine.js\";\n\n/**\n * SQLite 执行器。\n *\n * 通过 stdin/stdout 与 sqlite3 CLI 进程通信,提供 execute/query/stream/transaction API。\n * 内部使用管线化队列批量发送任务,基于 Sentinel token 协议检测单个 SQL 任务的输出边界。\n */\nexport class SQLiteExecutor {\n\t#closed = false;\n\t#proc = null;\n\t#logger;\n\t#statementTimeout;\n\t#autoRestart;\n\t#fatalError = null;\n\t#processManager;\n\t#readerPool = null;\n\t#poolSize;\n\t#binary;\n\t#database;\n\t#metrics;\n\t#pipeline;\n\t#txScope = new TransactionScope();\n\n\t/**\n\t * @param {{\n\t * binary?: string,\n\t * database?: string,\n\t * logger?: import(\"../index.js\").Logger,\n\t * statementTimeout?: number,\n\t * autoRestart?: boolean,\n\t * poolSize?: number,\n\t * metrics?: import(\"./metrics.js\").Metrics,\n\t * }} options\n\t */\n\tconstructor({\n\t\tbinary = \"sqlite3\",\n\t\tdatabase = \":memory:\",\n\t\tlogger,\n\t\tstatementTimeout = DEFAULT_STATEMENT_TIMEOUT,\n\t\tautoRestart = true,\n\t\tpoolSize = 0,\n\t\tmetrics,\n\t} = {}) {\n\t\tthis.#logger = logger;\n\t\tthis.#statementTimeout = this.#normalizeTimeout(statementTimeout);\n\t\tthis.#autoRestart = autoRestart !== false;\n\t\tthis.#binary = binary;\n\t\tthis.#database = database;\n\t\tthis.#poolSize = poolSize;\n\t\tthis.#metrics = metrics ?? new Metrics();\n\n\t\tthis.#processManager = new ProcessManager({ binary, database });\n\t\tthis.#pipeline = new PipelineEngine(this.#processManager, {\n\t\t\tmetrics: this.#metrics,\n\t\t\tstatementTimeout: this.#statementTimeout,\n\t\t\tlogger: this.#logger,\n\t\t\tonTaskTimeout: () => {},\n\t\t});\n\t\tthis.#startProcess();\n\n\t\tif (poolSize > 0 && database !== \":memory:\") {\n\t\t\tthis.#readerPool = new ReaderPool({\n\t\t\t\tbinary,\n\t\t\t\tdatabase,\n\t\t\t\tpoolSize,\n\t\t\t\tstatementTimeout,\n\t\t\t\tlogger,\n\t\t\t\tmetrics: this.#metrics,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** 当前待处理的任务总数(队列中 + 执行中 + reader 队列中) */\n\tget pendingStatements() {\n\t\treturn this.#txScope.pendingStatements + this.#pipeline.pendingStatements + (this.#readerPool?.pendingStatements ?? 0);\n\t}\n\n\t/** 读取器连接池(null 表示未启用读写分离)。 */\n\tget readerPool() {\n\t\treturn this.#readerPool;\n\t}\n\n\t/** 测试用:获取底层子进程引用。 */\n\tget _process() {\n\t\treturn this.#proc;\n\t}\n\n\t/** 运行时指标收集器。 */\n\tget metrics() {\n\t\treturn this.#metrics;\n\t}\n\n\t/**\n\t * 执行 SQL 语句(不返回行数据)。\n\t * 适用于 INSERT / UPDATE / CREATE 等非查询操作。\n\t * @param {string} sql\n\t * @param {any[]} [params]\n\t * @param {{ timeout?: number }} [options]\n\t * @returns {Promise<void>}\n\t */\n\tasync execute(sql, params = [], options = {}) {\n\t\tawait this.#enqueue(\"execute\", sql, params, options, null);\n\t}\n\n\t/**\n\t * 执行查询并返回所有结果行。\n\t * @template T\n\t * @param {string} sql\n\t * @param {any[]} [params]\n\t * @param {{ timeout?: number }} [options]\n\t * @returns {Promise<T[]>}\n\t */\n\tquery(sql, params = [], options = {}) {\n\t\treturn this.#enqueue(\"query\", sql, params, options, null);\n\t}\n\n\t/**\n\t * 流式执行查询,返回 AsyncIterable,可配合 `for await` 逐行消费。\n\t *\n\t * @template T\n\t * @param {string} sql\n\t * @param {any[]} [params]\n\t * @param {{ timeout?: number }} [options]\n\t * @returns {AsyncIterable<T>}\n\t */\n\tstream(sql, params = [], options = {}) {\n\t\tif (!Array.isArray(params)) throw new TypeError(\"params must be an array\");\n\n\t\tconst buffer = new AsyncRowBuffer();\n\n\t\tthis.#enqueue(\n\t\t\t\"stream\",\n\t\t\tsql,\n\t\t\tparams,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\tonRow: (row) => buffer.push(row),\n\t\t\t},\n\t\t\tnull,\n\t\t).then(\n\t\t\t() => buffer.end(),\n\t\t\t(err) => buffer.error(err),\n\t\t);\n\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * 在一个数据库事务中执行用户函数。\n\t * 事务内所有操作共享一个域,不会被外部任务交错。\n\t * 函数成功时自动 COMMIT,抛出异常时自动 ROLLBACK。\n\t * @template T\n\t * @param {(tx: import(\"../index.js\").TransactionHandle) => Promise<T>} fn\n\t * @param {{ mode?: \"DEFERRED\" | \"IMMEDIATE\" | \"EXCLUSIVE\" }} [options]\n\t * @returns {Promise<T>}\n\t */\n\tasync transaction(fn, options = {}) {\n\t\tconst mode = options?.mode ?? \"DEFERRED\";\n\t\tif (!VALID_TRANSACTION_MODES.includes(mode)) {\n\t\t\tthrow new TypeError(`transaction mode must be one of: ${VALID_TRANSACTION_MODES.join(\", \")}`);\n\t\t}\n\n\t\tconst { scopeId, release } = await this.#txScope.enter();\n\n\t\tconst tx = createTransactionHandle(scopeId, {\n\t\t\tenqueue: (kind, sql, params, options, sid) => this.#enqueue(kind, sql, params, options, sid),\n\t\t});\n\n\t\ttry {\n\t\t\tawait tx.execute(`BEGIN ${mode}`);\n\t\t\ttry {\n\t\t\t\tconst result = await fn(tx);\n\t\t\t\tawait tx.execute(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tawait tx.execute(\"ROLLBACK\").catch(() => {});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#txScope.exit();\n\t\t\tthis.#txScope.restoreDeferred(this.#pipeline.mainQueue);\n\t\t\tthis.#pipeline.pump();\n\t\t\trelease();\n\t\t}\n\t}\n\n\t/**\n\t * 关闭执行器,拒绝所有待处理任务,终止 sqlite3 进程。\n\t * @returns {Promise<void>}\n\t */\n\tasync close() {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tthis.#pipeline.kill();\n\t\tthis.#txScope.rejectAll(new Error(\"SQLiteExecutor is closed\"));\n\n\t\tthis.#readerPool?.kill();\n\n\t\t// gracefulShutdown 已等 close 事件,进程一定已退出\n\t\tawait this.#processManager.gracefulShutdown();\n\t\tthis.#processManager.kill();\n\t}\n\n\t/**\n\t * 显式资源管理(Stage 3 TC39):await using。\n\t * 委托给 close(),使得执行器可通过 `await using db = new SQLiteExecutor()` 使用。\n\t * @returns {Promise<void>}\n\t */\n\t[Symbol.asyncDispose]() {\n\t\treturn this.close();\n\t}\n\n\t/**\n\t * 显式资源管理(Stage 3 TC39):using。\n\t * 同步销毁场景下的 fire-and-forget 关闭。\n\t */\n\t[Symbol.dispose]() {\n\t\tvoid this.close();\n\t}\n\n\t#normalizeTimeout(value) {\n\t\tif (!Number.isInteger(value) || value <= 0) {\n\t\t\tthrow new TypeError(\"statementTimeout must be a positive integer\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t#startProcess() {\n\t\tlet proc;\n\t\ttry {\n\t\t\tproc = this.#processManager.start();\n\t\t} catch (error) {\n\t\t\tthis.#fatalError = toError(error);\n\t\t\tthis.#logger?.error?.(\"failed to start sqlite3 process\", this.#fatalError);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!proc.stdout) {\n\t\t\tthis.#fatalError = new Error(`Failed to spawn sqlite3 process: stdio unavailable (binary=${this.#binary})`);\n\t\t\tthis.#processManager.kill();\n\t\t\treturn;\n\t\t}\n\n\t\tproc.stdout.on(\"data\", (chunk) => {\n\t\t\tthis.#pipeline.handleStdoutChunk(chunk);\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (chunk) => {\n\t\t\tthis.#pipeline.handleStderrChunk(chunk);\n\t\t});\n\n\t\tproc.on(\"error\", (error) => {\n\t\t\t/* c8 ignore next */ // 死亡分支:listener 在 #handleProcessFailure 中被 removeAllListeners 清除\n\t\t\tif (this.#proc !== proc) return;\n\t\t\tthis.#logger?.error?.(\"sqlite3 process error\", error);\n\t\t\tthis.#handleProcessFailure(error);\n\t\t});\n\n\t\tproc.on(\"close\", (code, signal) => {\n\t\t\t/* c8 ignore next */ // 死亡分支:listener 在 #handleProcessFailure 中被 removeAllListeners 清除\n\t\t\tif (this.#proc !== proc) return;\n\t\t\tif (this.#closed) return;\n\t\t\t/* c8 ignore next */ // Windows: kill→signal=null, ?? 永远取 \"none\"\n\t\t\tthis.#handleProcessFailure(new Error(`sqlite3 process exited unexpectedly (code=${code}, signal=${signal ?? \"none\"})`));\n\t\t});\n\n\t\tthis.#proc = proc;\n\t\tthis.#pipeline.activate();\n\t}\n\n\t#enqueue(kind, sql, params, options, scopeId) {\n\t\tif (this.#closed) return Promise.reject(new Error(\"SQLiteExecutor is closed\"));\n\t\tif (this.#fatalError) return Promise.reject(this.#fatalError);\n\t\tif (!Array.isArray(params)) return Promise.reject(new TypeError(\"params must be an array\"));\n\n\t\tconst timeout = options?.timeout ?? this.#statementTimeout;\n\t\tconst token = generateToken();\n\t\tconst onRow = options?.onRow ?? null;\n\n\t\tconst template = normalizeSQLTemplate(sql);\n\n\t\tlet formatted;\n\t\tif (params.length === 0 && template.paramCount === 0) {\n\t\t\tformatted = template.normalized;\n\t\t} else {\n\t\t\tformatted = interpolateFromTemplate(template, params);\n\t\t}\n\n\t\tif (scopeId) {\n\t\t\treturn this.#enqueueWriter(kind, formatted, timeout, token, onRow, scopeId);\n\t\t}\n\n\t\tif (this.#readerPool) {\n\t\t\tif (kind === \"stream\" || kind === \"query\") {\n\t\t\t\treturn this.#enqueueReader(kind, formatted, timeout, token, onRow);\n\t\t\t}\n\t\t\tif (kind === \"execute\" && classifySQL(template.normalized) === \"read\") {\n\t\t\t\treturn this.#enqueueReader(kind, formatted, timeout, token, onRow);\n\t\t\t}\n\t\t}\n\n\t\treturn this.#enqueueWriter(kind, formatted, timeout, token, onRow, null);\n\t}\n\n\t#enqueueWriter(kind, sql, timeout, token, onRow, scopeId) {\n\t\tthis.#metrics.incrementTasksTotal(kind);\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst task = {\n\t\t\t\tkind,\n\t\t\t\tsql,\n\t\t\t\ttimeout,\n\t\t\t\ttoken,\n\t\t\t\tonRow,\n\t\t\t\tscopeId,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tconsumerError: null,\n\t\t\t\tstderrText: \"\",\n\t\t\t\tsettled: false,\n\t\t\t\tstartTime: 0,\n\t\t\t\trowParser: null,\n\t\t\t\trows: kind === \"query\" ? [] : null,\n\t\t\t};\n\n\t\t\tif (kind === \"stream\") {\n\t\t\t\ttask.rowParser = setupStreamParser(task, this.#pipeline);\n\t\t\t}\n\n\t\t\tif (this.#txScope.isDeferred(scopeId)) {\n\t\t\t\tthis.#txScope.defer(task);\n\t\t\t} else {\n\t\t\t\tthis.#pipeline.enqueue(task);\n\t\t\t}\n\t\t});\n\t}\n\n\t#enqueueReader(kind, sql, timeout, token, onRow) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.#readerPool.enqueue({\n\t\t\t\tkind,\n\t\t\t\tsql,\n\t\t\t\ttimeout,\n\t\t\t\ttoken,\n\t\t\t\tonRow,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleProcessFailure(error) {\n\t\tconst failure = toError(error);\n\t\tthis.#processManager.kill();\n\t\tthis.#proc = null;\n\n\t\tthis.#pipeline.deactivate();\n\t\tthis.#pipeline.rejectAll(failure);\n\t\tthis.#txScope.rejectAll(failure);\n\n\t\tif (!this.#closed && this.#autoRestart) {\n\t\t\tthis.#metrics.incrementProcessRestarts();\n\t\t\tthis.#startProcess();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#fatalError = failure;\n\t\tthis.#closed = true;\n\t}\n}\n"],"names":["DEFAULT_STATEMENT_TIMEOUT","createTimeoutError","timeout","sql","Error","toError","value","String","CHAR_QUOTE","CHAR_BACKSLASH","CHAR_OPEN_BRACKET","CHAR_CLOSE_BRACKET","CHAR_OPEN_BRACE","CHAR_CLOSE_BRACE","CHAR_COMMA","CHAR_SPACE","CHAR_TAB","CHAR_LF","CHAR_CR","isWhitespaceCode","code","createJsonValueParser","onValue","chunk","consumeUntil","buffer","start","nesting","inString","escaped","index","raw","createRowStreamParser","onRow","started","elementStart","elementEnd","consumed","lookAhead","delimiter","TOKEN_COLUMN","DEFAULT_BATCH_SIZE","DEFAULT_MAX_INFLIGHT","INFLIGHT_COMPACT_THRESHOLD","setupStreamParser","task","pipelineOrFeed","parser","rawRow","row","JSON","_type_of","error","Symbol","_buffer","_index","_done","_error","_pending","AsyncRowBuffer","push","resolve","end","undefined","err","reject","next","Promise","_return","VALID_TRANSACTION_MODES","createTransactionHandle","scopeId","executor","handle","params","options","Array","TypeError","isWindows","os","isExecutable","filePath","fs","getPathExts","ext","process","e","which","command","pathExts","path","fullPath","_iteratorError","file","envPath","pathDirs","_iteratorError1","dir","_iteratorError2","ext1","file1","file2","GRACEFUL_SHUTDOWN_TIMEOUT","_binary","_database","_proc","_initMode","_draining","_writeBuffer","_drainCallbacks","_onDrain","flushBuffer","notifyIfDrained","ProcessManager","_ref","binary","database","initMode","onDrain","_which","setOnDrainCallback","fn","onDrained","callback","_proc_stdin","_proc_stdout","_proc_stderr","_proc_stdin1","args","proc","spawn","write","data","stream","gracefulShutdown","timer","setTimeout","clearTimeout","once","kill","callbacks","cb","_counter","_PREFIX","_PID36","generateToken","_maxSize","_maxKeyLength","_maxValueLength","_map","LRUCache","maxSize","maxKeyLength","maxValueLength","Infinity","Map","Math","get","key","set","firstKey","clear","escapeValue","Date","interpolateFromTemplate","template","segments","paramCount","parts","i","CC_SINGLE_QUOTE","CC_DOUBLE_QUOTE","CC_DASH","CC_SLASH","CC_STAR","CC_NEWLINE","CC_QUESTION","CC_SEMICOLON","CC_SPACE","STATE_NORMAL","STATE_SINGLE_QUOTE","STATE_DOUBLE_QUOTE","STATE_LINE_COMMENT","STATE_BLOCK_COMMENT","_decodeU16","codes","len","batchSize","_normCache","_normalize","needed","outCodes","Uint16Array","writePos","pendingSpace","state","questionPositions","nextCode","normalized","segStart","pos","normalizeSQL","cached","result","normalizeSQLTemplate","READ_ONLY_KINDS","Set","_classifyCache","classifySingle","stmt","trimmed","firstSpace","kind","classifySQL","stmts","s","INITIAL_CAPACITY","SHRINK_THRESHOLD","_items","_head","_tail","_size","_mask","grow","shrinkIfNeeded","Queue","enqueue","dequeue","remove","idx","j","curr","find","predicate","toArray","values","peek","prependAll","other","tmpItems","tmpMask","totalSize","newCap","newItems","writeIdx","i1","isEmpty","oldMask","_tasks","InflightTracker","_key","items","shift","forEach","collectQueryRows","parsed","processStreamRows","settleTask","metrics","resetRowParser","_task_rowParser","duration","performance","buildPayload","token","skipNormalize","suffix","isTransactionControl","f","buildBatchPayload","batch","useWalBatch","t","parts1","task1","TC_FIRST_CHAR","buildSentinelStr","isSentinelRaw","isSentinelRow","_value_","finalizePendingTasks","tasks","settle","pumpQueue","pendingStderr","inflight","hasStderrBuffer","prepareTaskTimeout","createSweeper","param","sweepIntervalMs","handleTaskTimeout","sweepTimer","schedule","now","createFinalizeScheduler","pendingFinalizeTasks","scheduled","immediate","cancelled","cancel","clearImmediate","check","setImmediate","advanceNextInflightStartTime","handleParsedValue","afterSentinel","rejectAll","createPumpQueue","queue","processManager","sweeper","maxInflight","nextBatchId","pump","_inflight","payload","batchId","handleSentinelTask","scheduleFinalizeCheck","handleStderrChunk","logger","hasFinalizedZeroRowQuery","inflightFirst","firstPending","zeroRowMatch","t1","hasZeroRowQuery","t2","_iteratorError3","t3","rejectAllTasks","all","queued","_processManager","_pendingQueue","_pendingFinalizeTasks","_valueParser","_statementTimeout","_logger","_name","_batchSize","_maxInflight","_metrics","_sweeper","_scheduleFinalizeCheck","_pump","_pendingStderr","startProcess","handleStderrChunk1","settleTask1","TaskWorker","statementTimeout","name","sweepInterval","v","config","_config_onRow","_class_private_field_get_getSweepTimer","_class_private_field_get_cancel","_class_private_field_get_error","signal","_workers","_rrIndex","ReaderPool","poolSize","RangeError","worker","sum","w","minLoad","candidates","load","_tasksTotal","_tasksSuccess","_tasksFailed","_tasksTimeout","_processRestarts","_executeCount","_queryCount","_streamCount","_totalDuration","_startTime","Metrics","incrementTasksTotal","incrementTasksSuccess","incrementTasksFailed","incrementTasksTimeout","incrementProcessRestarts","snapshot","elapsed","avgTaskDuration","throughput","_deferredQueue","_activeScopeId","_scopeChain","TransactionScope","isDeferred","defer","enter","release","gate","previous","exit","restoreDeferred","targetQueue","_queue","_sharedValueParser","_onTaskTimeout","_active","_hasFinalizedZeroRowQuery","PipelineEngine","onTaskTimeout","_this2","feed","activate","deactivate","handleStdoutChunk","leftover","_task_rows","_closed","_autoRestart","_fatalError","_readerPool","_poolSize","_pipeline","_txScope","normalizeTimeout","enqueueWriter","enqueueReader","handleProcessFailure","SQLiteExecutor","autoRestart","_class_private_field_get_pendingStatements","execute","query","transaction","_options_mode","mode","tx","sid","close","Number","_options_timeout","_options_onRow","formatted","failure"],"mappings":"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"}
1
+ {"version":3,"file":"esm/index.mjs","sources":["webpack://sqlite-executor/./src/utils/timeout.js","webpack://sqlite-executor/./src/core/parser.js","webpack://sqlite-executor/./src/constants.js","webpack://sqlite-executor/./src/stream/stream.js","webpack://sqlite-executor/./src/transaction/transaction.js","webpack://sqlite-executor/./src/which.js","webpack://sqlite-executor/./src/core/process.js","webpack://sqlite-executor/./src/utils/token.js","webpack://sqlite-executor/./src/core/lruCache.js","webpack://sqlite-executor/./src/utils/escape.js","webpack://sqlite-executor/./src/utils/interpolate.js","webpack://sqlite-executor/./src/utils/constants.js","webpack://sqlite-executor/./src/utils/normalize.js","webpack://sqlite-executor/./src/core/classifier.js","webpack://sqlite-executor/./src/core/queue.js","webpack://sqlite-executor/./src/core/inflightTracker.js","webpack://sqlite-executor/./src/core/settleUtils.js","webpack://sqlite-executor/./src/core/protocol.js","webpack://sqlite-executor/./src/core/pipelineUtils.js","webpack://sqlite-executor/./src/core/taskWorker.js","webpack://sqlite-executor/./src/core/readerPool.js","webpack://sqlite-executor/./src/core/metrics.js","webpack://sqlite-executor/./src/core/transactionScope.js","webpack://sqlite-executor/./src/core/pipelineEngine.js","webpack://sqlite-executor/./src/core/executor.js"],"sourcesContent":["/** 默认 SQL 超时时间(毫秒) */\nexport const DEFAULT_STATEMENT_TIMEOUT = 30_000;\n\n/**\n * 将 Date 格式化为 `YYYY-MM-DD HH:mm:ss.SSS` 格式。\n * @param {Date} date\n * @returns {string}\n */\nfunction formatDateTime(date) {\n\tconst y = date.getFullYear();\n\tconst M = String(date.getMonth() + 1).padStart(2, \"0\");\n\tconst d = String(date.getDate()).padStart(2, \"0\");\n\tconst h = String(date.getHours()).padStart(2, \"0\");\n\tconst m = String(date.getMinutes()).padStart(2, \"0\");\n\tconst s = String(date.getSeconds()).padStart(2, \"0\");\n\tconst ms = String(date.getMilliseconds()).padStart(3, \"0\");\n\treturn `${y}-${M}-${d} ${h}:${m}:${s}.${ms}`;\n}\n\n/**\n * 格式化毫秒数为人类可读的持续时间字符串。\n * @param {number} ms\n * @returns {string}\n */\nfunction formatDuration(ms) {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n\tconst mins = Math.floor(ms / 60_000);\n\tconst secs = ((ms % 60_000) / 1000).toFixed(1);\n\treturn `${mins}m ${secs}s`;\n}\n\n/**\n * 创建一个描述 SQL 超时的 Error 对象。\n *\n * 当提供了 startTime 时,错误信息会包含可读的开始时间、截至时间和超时时间;\n * 否则保持向后兼容的简洁格式。\n *\n * @param {number} timeout - 超时毫秒数\n * @param {string} sql - 超时的 SQL 语句(已标准化)\n * @param {number} [startTime] - 任务开始时的 performance.now() 值;若提供则计算人类可读时间\n * @returns {Error}\n */\nexport function createTimeoutError(timeout, sql, startTime) {\n\tif (startTime !== undefined) {\n\t\tconst elapsed = Math.max(0, performance.now() - startTime);\n\t\tconst startDate = new Date(Date.now() - elapsed);\n\t\tconst deadlineDate = new Date(startDate.getTime() + timeout);\n\t\treturn new Error(\n\t\t\t`SQLite statement timed out after ${formatDuration(timeout)} ` +\n\t\t\t`(start: ${formatDateTime(startDate)}, ` +\n\t\t\t`deadline: ${formatDateTime(deadlineDate)}): ${sql}`,\n\t\t);\n\t}\n\treturn new Error(`SQLite statement timed out after ${timeout}ms: ${sql}`);\n}\n","/**\n * 将任意值统一转为 Error 对象。\n * 如果已是 Error 实例则原样返回,否则将其字符串化后包装为新 Error。\n * @param {unknown} value\n * @returns {Error}\n */\nexport function toError(value) {\n\treturn value instanceof Error ? value : new Error(String(value));\n}\n\nconst CHAR_QUOTE = 34; // \"\nconst CHAR_BACKSLASH = 92; // \\\nconst CHAR_OPEN_BRACKET = 91; // [\nconst CHAR_CLOSE_BRACKET = 93; // ]\nconst CHAR_OPEN_BRACE = 123; // {\nconst CHAR_CLOSE_BRACE = 125; // }\nconst CHAR_COMMA = 44; // ,\nconst CHAR_SPACE = 32; //\nconst CHAR_TAB = 9; // \\t\nconst CHAR_LF = 10; // \\n\nconst CHAR_CR = 13; // \\r\n\n/**\n * 判断字符码是否为空白字符(空格、制表符、换行、回车)。\n * @param {number} code\n * @returns {boolean}\n */\nfunction isWhitespaceCode(code) {\n\treturn code === CHAR_SPACE || code === CHAR_TAB || code === CHAR_LF || code === CHAR_CR;\n}\n\n/**\n * 创建一个 JSON 值解析器,逐字符扫描流式数据,检测完整的顶层 JSON 值\n *(对象或数组),解析出完整的 JSON 文本后通过回调通知。\n *\n * 核心逻辑是一个状态机,维护以下状态:\n * start — 当前正在累积的顶层 JSON 值在 buffer 中的起始位置,-1 表示未开始\n * nesting — 当前嵌套深度(遇到 [ 或 { 递增,遇到 ] 或 } 递减)\n * inString — 是否在字符串内部(字符串内的括号不计入嵌套深度)\n * escaped — 前一个字符是否为反斜杠(用于处理字符串内的转义 \\\" \\\\ 等)\n *\n * 支持流式分块输入,通过 readPos 记录上次扫描位置,避免多次分块间重复扫描已处理数据。\n *\n * 关键优化:空数组 [] 走 fast path,直接跳过 slice 和 onValue 回调。\n *\n * @param {(raw: string) => void} onValue - 每当解析出一个完整 JSON 值时被调用\n * @returns {{\n * feed(chunk: string): void,\n * reset(): void,\n * buffer: string,\n * start: number,\n * readPos: number,\n * nesting: number,\n * inString: boolean,\n * escaped: boolean,\n * }}\n */\nexport function createJsonValueParser(onValue) {\n\treturn {\n\t\t// 累积的未解析原始数据\n\t\tbuffer: \"\",\n\t\t// 当前顶层 JSON 值在 buffer 中的起始索引,-1 表示未开始扫描顶层值\n\t\tstart: -1,\n\t\t// 上次扫描到的位置,下次 feed 从这继续,避免重复扫描\n\t\treadPos: 0,\n\t\t// 嵌套深度:遇到 [ 或 { 递增,遇到 ] 或 } 递减;归零表示一个完整值结束\n\t\tnesting: 0,\n\t\t// 是否在一对双引号内部(字符串内的括号不参与 nesting 计数)\n\t\tinString: false,\n\t\t// 前一个字符是否为反斜杠(处理字符串中的转义序列 \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\uXXXX)\n\t\tescaped: false,\n\t\t// 已累积消费的字节数,用于延迟 buffer 物理裁剪,减少 String 分配和 GC 压力\n\t\t_consumed: 0,\n\t\tfeed(chunk) {\n\t\t\t// 1. 将新数据追加到 buffer 尾部\n\t\t\tthis.buffer += chunk;\n\t\t\tlet consumeUntil = 0;\n\n\t\t\t// 将状态缓存到局部变量,避免热循环中反复访问 this.* 引发的隐藏类查找\n\t\t\tconst buffer = this.buffer;\n\t\t\tlet start = this.start;\n\t\t\tlet nesting = this.nesting;\n\t\t\tlet inString = this.inString;\n\t\t\tlet escaped = this.escaped;\n\n\t\t\t// 2. 从上次处理到的位置继续扫描\n\t\t\tfor (let index = this.readPos; index < buffer.length; index++) {\n\t\t\t\tconst code = buffer.charCodeAt(index);\n\n\t\t\t\t// === 状态 A:未开始解析顶层值,跳过空白,寻找 [ 或 { ===\n\t\t\t\tif (start === -1) {\n\t\t\t\t\tif (isWhitespaceCode(code)) continue;\n\t\t\t\t\tif (code !== CHAR_OPEN_BRACKET && code !== CHAR_OPEN_BRACE) continue;\n\t\t\t\t\t// 找到顶层值的起始位置,初始化嵌套计数\n\t\t\t\t\tstart = index;\n\t\t\t\t\tnesting = 1;\n\t\t\t\t\tinString = false;\n\t\t\t\t\tescaped = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 状态 B:在字符串内部,处理转义序列 ===\n\t\t\t\tif (inString) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\t// 前一个字符是反斜杠,当前字符被转义,重置 escaped\n\t\t\t\t\t\tescaped = false;\n\t\t\t\t\t} else if (code === CHAR_BACKSLASH) {\n\t\t\t\t\t\t// 遇到反斜杠,标记下一个字符为转义状态\n\t\t\t\t\t\tescaped = true;\n\t\t\t\t\t} else if (code === CHAR_QUOTE) {\n\t\t\t\t\t\t// 遇到未转义的双引号,字符串结束\n\t\t\t\t\t\tinString = false;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 状态 C:不在字符串内,遇到双引号则进入字符串 ===\n\t\t\t\tif (code === CHAR_QUOTE) {\n\t\t\t\t\tinString = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 状态 D:不在字符串内,处理嵌套结构 ===\n\t\t\t\tif (code === CHAR_OPEN_BRACKET || code === CHAR_OPEN_BRACE) {\n\t\t\t\t\t// 进入一层嵌套\n\t\t\t\t\tnesting++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (code === CHAR_CLOSE_BRACKET || code === CHAR_CLOSE_BRACE) {\n\t\t\t\t\t// 退出一层嵌套\n\t\t\t\t\tnesting--;\n\t\t\t\t\tif (nesting === 0) {\n\t\t\t\t\t\t// 嵌套归零 → 一个完整的顶层 JSON 值解析完成\n\t\t\t\t\t\t// Fast path: 空数组 [],index === start + 1,无需 slice 和回调\n\t\t\t\t\t\tif (index === start + 1) {\n\t\t\t\t\t\t\tstart = -1;\n\t\t\t\t\t\t\tconsumeUntil = index + 1;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 正常路径:切片出完整 JSON 文本,通过回调通知\n\t\t\t\t\t\tconst raw = buffer.slice(start, index + 1);\n\t\t\t\t\t\tstart = -1;\n\t\t\t\t\t\tonValue(raw);\n\t\t\t\t\t\tconsumeUntil = index + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 将局部状态写回 this,供下次 feed 调用继续使用\n\t\t\tthis.start = start;\n\t\t\tthis.nesting = nesting;\n\t\t\tthis.inString = inString;\n\t\t\tthis.escaped = escaped;\n\n\t\t\t// 3. 清理已消费部分:用 _consumed 记录已消费位置而非每次都物理裁剪 buffer。\n\t\t\t// 避免每个完整值都产生一次 String 分配(buffer.slice),\n\t\t\t// 仅在累积超过 64KB 时一次性物理裁剪,减少 GC 压力。\n\t\t\t// 注意:consumeUntil 是相对 buffer 起始的绝对位置,直接赋值即可。\n\t\t\tif (consumeUntil > 0) {\n\t\t\t\tthis._consumed = consumeUntil;\n\t\t\t\t// 当有未完成的部分值(start !== -1)时,readPos 跳到 buffer 末尾\n\t\t\t\t// 避免下次 feed 重扫已计入 nesting 的 [/{ 字符,\n\t\t\t\t// 同时保留 nested/inString/escaped 状态供继续解析。\n\t\t\t\tthis.readPos = this.start !== -1 ? buffer.length : this._consumed;\n\t\t\t\tif (this._consumed > 65536) {\n\t\t\t\t\tif (this.start !== -1) this.start -= this._consumed;\n\t\t\t\t\tthis.buffer = this.buffer.slice(this._consumed);\n\t\t\t\t\tthis.readPos = this.buffer.length;\n\t\t\t\t\tthis._consumed = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 没有完整值被消费,记录当前位置,下次 feed 从此继续\n\t\t\t\tthis.readPos = buffer.length;\n\t\t\t}\n\t\t},\n\t\treset() {\n\t\t\tthis.buffer = \"\";\n\t\t\tthis._consumed = 0;\n\t\t\tthis.start = -1;\n\t\t\tthis.readPos = 0;\n\t\t\tthis.nesting = 0;\n\t\t\tthis.inString = false;\n\t\t\tthis.escaped = false;\n\t\t},\n\t};\n}\n\n/**\n * 创建一个行流解析器,用于解析 sqlite3 `-json` 模式下输出的 JSON 数组。\n * 不是在数组整体解析完后一次性返回,而是在每个元素到达时逐行回调 `onRow`,\n * 支持分块输入、嵌套对象/数组、转义字符串。\n *\n * 核心状态机比 createJsonValueParser 更复杂,因为需要在数组上下文中\n * 逐个识别元素边界(逗号分隔,] 结束),而不是只匹配顶层括号匹配。\n *\n * 解析流程概览:\n * 1. 跳过空白,等待 [ → 标记 started\n * 2. 跳过空白和逗号,等待元素起始 → 记录 elementStart\n * 3. 扫描元素内容,跟踪 nesting 深度直到归零 → 记录 elementEnd\n * 4. 等待逗号或 ] 确认元素完全结束 → 回调 onRow 并截断已处理部分\n * 5. 遇到 ] → 标记 finished,返回剩余数据\n *\n * @param {(rawRow: string) => void} onRow - 每当解析出一个数组元素时被调用,传入元素的原始 JSON 文本\n * @returns {{\n * feed(chunk: string): string,\n * reset(): void,\n * buffer: string,\n * started: boolean,\n * finished: boolean,\n * inString: boolean,\n * escaped: boolean,\n * elementStart: number,\n * elementEnd: number,\n * nesting: number,\n * readPos: number,\n * }}\n */\nexport function createRowStreamParser(onRow) {\n\treturn {\n\t\tbuffer: \"\",\n\t\t// 是否已遇到数组开始的 [\n\t\tstarted: false,\n\t\t// 是否已遇到数组结束的 ],之后 feed 直接返回输入\n\t\tfinished: false,\n\t\t// 是否在字符串内部\n\t\tinString: false,\n\t\t// 前一个字符是否为反斜杠\n\t\tescaped: false,\n\t\t// 当前元素在 buffer 中的起始位置\n\t\telementStart: -1,\n\t\t// 当前元素在 buffer 中的结束位置(exclusive)\n\t\telementEnd: -1,\n\t\t// 当前元素的嵌套深度(用于处理元素内部的嵌套结构)\n\t\tnesting: 0,\n\t\t// 上次扫描位置\n\t\treadPos: 0,\n\t\t// 已累积消费的字节数,用于延迟 buffer 物理裁剪\n\t\t_consumed: 0,\n\t\tfeed(chunk) {\n\t\t\t// 如果数组已结束,直接返回新数据\n\t\t\tif (this.finished) return chunk;\n\n\t\t\t// 1. 追加新数据到 buffer;将状态缓存到局部变量避免隐藏类查找\n\t\t\tthis.buffer += chunk;\n\n\t\t\t// 使用 let 以便 64KB 物理裁剪时同步更新局部引用\n\t\t\tlet buffer = this.buffer;\n\t\t\tlet started = this.started;\n\t\t\tlet inString = this.inString;\n\t\t\tlet escaped = this.escaped;\n\t\t\tlet elementStart = this.elementStart;\n\t\t\tlet elementEnd = this.elementEnd;\n\t\t\tlet nesting = this.nesting;\n\t\t\tlet consumed = this._consumed;\n\t\t\tlet index = this.readPos;\n\n\t\t\twhile (index < buffer.length) {\n\t\t\t\tconst code = buffer.charCodeAt(index);\n\n\t\t\t\t// === 阶段 1:等待数组开始 [ ===\n\t\t\t\tif (!started) {\n\t\t\t\t\tif (isWhitespaceCode(code)) {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (code !== CHAR_OPEN_BRACKET) {\n\t\t\t\t\t\t// 非 [ 的字符(非空白)直接跳过\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstarted = true;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 2:在字符串内部,处理转义 ===\n\t\t\t\tif (inString) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\tescaped = false;\n\t\t\t\t\t} else if (code === CHAR_BACKSLASH) {\n\t\t\t\t\t\tescaped = true;\n\t\t\t\t\t} else if (code === CHAR_QUOTE) {\n\t\t\t\t\t\tinString = false;\n\t\t\t\t\t}\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 3:不在任何元素内,等待元素起始 ===\n\t\t\t\tif (elementStart === -1) {\n\t\t\t\t\tif (isWhitespaceCode(code) || code === CHAR_COMMA) {\n\t\t\t\t\t\t// 跳过空白和元素间逗号\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (code === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\t\t// 数组结束,标记 finished 并返回剩余数据\n\t\t\t\t\t\tthis.finished = true;\n\t\t\t\t\t\tthis.readPos = 0;\n\t\t\t\t\t\tthis.buffer = \"\";\n\t\t\t\t\t\tthis.started = false;\n\t\t\t\t\t\treturn buffer.slice(index + 1);\n\t\t\t\t\t}\n\t\t\t\t\t// 记录元素起始位置,初始化嵌套计数\n\t\t\t\t\telementStart = index;\n\t\t\t\t\telementEnd = -1;\n\t\t\t\t\tnesting = code === CHAR_OPEN_BRACE || code === CHAR_OPEN_BRACKET ? 1 : 0;\n\t\t\t\t\tinString = code === CHAR_QUOTE;\n\t\t\t\t\tescaped = false;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 4:完整元素等待分隔符 ===\n\t\t\t\tif (elementEnd !== -1) {\n\t\t\t\t\tif (isWhitespaceCode(code)) {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (code === CHAR_COMMA || code === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\t\tonRow(buffer.slice(elementStart, elementEnd));\n\t\t\t\t\t\tconsumed = index + 1;\n\t\t\t\t\t\telementStart = -1;\n\t\t\t\t\t\telementEnd = -1;\n\t\t\t\t\t\tnesting = 0;\n\t\t\t\t\t\tif (code === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\t\t\tthis.finished = true;\n\t\t\t\t\t\t\tthis.buffer = \"\";\n\t\t\t\t\t\t\tthis.started = false;\n\t\t\t\t\t\t\tthis.inString = false;\n\t\t\t\t\t\t\tthis.escaped = false;\n\t\t\t\t\t\t\tthis.elementStart = -1;\n\t\t\t\t\t\t\tthis.elementEnd = -1;\n\t\t\t\t\t\t\tthis.nesting = 0;\n\t\t\t\t\t\t\tthis._consumed = 0;\n\t\t\t\t\t\t\tthis.readPos = 0;\n\t\t\t\t\t\t\treturn buffer.slice(consumed);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tindex = consumed;\n\t\t\t\t\t\tif (consumed > 65536) {\n\t\t\t\t\t\t\tbuffer = buffer.slice(consumed);\n\t\t\t\t\t\t\tthis.buffer = buffer;\n\t\t\t\t\t\t\tthis._consumed = 0;\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\tconsumed = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// === 阶段 5:在元素内,处理字符串、嵌套结构 ===\n\t\t\t\tif (code === CHAR_QUOTE) {\n\t\t\t\t\tinString = true;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (code === CHAR_OPEN_BRACE || code === CHAR_OPEN_BRACKET) {\n\t\t\t\t\tnesting++;\n\t\t\t\t\tindex++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (code === CHAR_CLOSE_BRACE || code === CHAR_CLOSE_BRACKET) {\n\t\t\t\t\tnesting--;\n\t\t\t\t\tif (nesting === 0) {\n\t\t\t\t\t\t// 嵌套归零,标记元素结束位置\n\t\t\t\t\t\telementEnd = index + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\t// 将局部状态写回 this,供下次 feed 调用继续使用\n\t\t\tthis.started = started;\n\t\t\tthis.inString = inString;\n\t\t\tthis.escaped = escaped;\n\t\t\tthis.elementStart = elementStart;\n\t\t\tthis.elementEnd = elementEnd;\n\t\t\tthis.nesting = nesting;\n\t\t\tthis._consumed = consumed;\n\n\t\t\t// 6. buffer 裁剪:用 _consumed 取代逐个元素的 buffer.slice,\n\t\t\t// 每消费一个元素就 slice 一次在高吞吐下会大量分配临时 String。\n\t\t\t// 改为累积消费偏移,仅在本轮末尾做一次物理裁剪。\n\t\t\tif (consumed > 0) {\n\t\t\t\tif (elementStart !== -1) {\n\t\t\t\t\tthis.elementStart -= consumed;\n\t\t\t\t\tif (elementEnd !== -1) this.elementEnd -= consumed;\n\t\t\t\t}\n\t\t\t\tthis.buffer = buffer.slice(consumed);\n\t\t\t\tthis._consumed = 0;\n\t\t\t}\n\t\t\t// 保留原始逻辑:若 elementStart > 0 则将未完成元素对齐到 buffer 头部\n\t\t\tif (this.elementStart > 0) {\n\t\t\t\tthis.buffer = this.buffer.slice(this.elementStart);\n\t\t\t\tif (this.elementEnd !== -1) this.elementEnd -= this.elementStart;\n\t\t\t\tthis.elementStart = 0;\n\t\t\t}\n\n\t\t\tthis.readPos = this.elementStart === 0 ? this.buffer.length : 0;\n\n\t\t\treturn \"\";\n\t\t},\n\t\treset() {\n\t\t\tthis.buffer = \"\";\n\t\t\tthis._consumed = 0;\n\t\t\tthis.started = false;\n\t\t\tthis.finished = false;\n\t\t\tthis.inString = false;\n\t\t\tthis.escaped = false;\n\t\t\tthis.elementStart = -1;\n\t\t\tthis.elementEnd = -1;\n\t\t\tthis.nesting = 0;\n\t\t\tthis.readPos = 0;\n\t\t},\n\t};\n}\n","export const TOKEN_COLUMN = \"__sqlite_executor_token__\";\n\n/** 管线化批量发送的默认 batch 大小 */\nexport const DEFAULT_BATCH_SIZE = 10;\n\n/**\n * 管线最大并发数(inflight 任务上限)。\n * 防止大量任务一次性写入 stdin 撑爆 OS 管道缓冲区\n * (Windows 管道 buffer 仅 4KB,Unix 为 64KB)。\n */\nexport const DEFAULT_MAX_INFLIGHT = 50;\n\n/**\n * Inflight 任务数组压缩阈值。\n * 当 #shiftInflight() 中 #inflightHead 超过此值时,\n * 通过 slice() 压缩 inflightTasks 数组以回收已被消费的前部 null 条目所占内存。\n */\nexport const INFLIGHT_COMPACT_THRESHOLD = 128;\n","import { createRowStreamParser } from \"../core/parser.js\";\nimport { toError } from \"../core/parser.js\";\nimport { TOKEN_COLUMN } from \"../core/protocol.js\";\n\nexport { createRowStreamParser };\n\n/**\n * 为 stream 类型的任务设置行级流解析器。\n * 如果任务类型不是 \"stream\" 则返回 null。\n *\n * 解析器内部逐行解析 JSON 数组元素,每解析出一行就调用 task.onRow()。\n * 如果 onRow 抛异常,会将错误记录到 task.consumerError。\n *\n * sqlite3 `-json` 模式下空结果集不输出 `[]`,\n * 此时行解析器可能错误地消费 sentinel 数组(而非数据数组)。\n * 回调中检测 sentinel 行并回喂给 sharedValueParser 以确保 sentinel 被识别。\n *\n * @param {{ kind: string, onRow?: Function, consumerError?: Error | null, token?: string }} task\n * @param {{ feed: (raw: string) => void }} pipelineOrFeed - 共享 JSON 值解析器的 feed 方法,用于回喂 sentinel 行\n * @returns {ReturnType<typeof createRowStreamParser> | null}\n */\nexport function setupStreamParser(task, pipelineOrFeed = { feed() {} }) {\n\tif (task.kind !== \"stream\") return null;\n\tconst parser = createRowStreamParser((rawRow) => {\n\t\tif (task.consumerError) return;\n\t\ttry {\n\t\t\tconst row = JSON.parse(rawRow);\n\t\t\t// sqlite3 空结果不输出 [],导致 sentinel 被行解析器消费。\n\t\t\t// 若该行包含 TOKEN_COLUMN,回喂给 valueParser 做正式 sentinel 检测。\n\t\t\tif (typeof row === \"object\" && row !== null && TOKEN_COLUMN in row) {\n\t\t\t\tpipelineOrFeed.feed(`[${rawRow}]`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttask.onRow(row);\n\t\t} catch (error) {\n\t\t\ttask.consumerError = toError(error);\n\t\t}\n\t});\n\treturn parser;\n}\n\n/**\n * 将回调驱动的行流桥接到 Async Iterator 协议。\n *\n * stream 使用 onRow 回调消费行数据,\n * 而 stream() 方法返回 AsyncIterable 供 for await 使用。\n * AsyncRowBuffer 在两者之间充当适配器:\n * - push(row) 由 onRow 回调调用\n * - end() 由任务完成时调用\n * - error(err) 由任务失败时调用\n * - next() / [Symbol.asyncIterator]() 供消费者使用\n */\nexport class AsyncRowBuffer {\n\t#buffer = [];\n\t/** 已消费行在 #buffer 中的索引,替代 shift() 避免 O(N) 元素搬运 */\n\t#index = 0;\n\t#done = false;\n\t#error = null;\n\t#pending = null;\n\n\t/** 生产者侧:添加一行数据 */\n\tpush(row) {\n\t\tif (this.#done || this.#error) return;\n\t\tif (this.#pending) {\n\t\t\tconst resolve = this.#pending.resolve;\n\t\t\tthis.#pending = null;\n\t\t\tresolve({ value: row, done: false });\n\t\t} else {\n\t\t\tthis.#buffer.push(row);\n\t\t}\n\t}\n\n\t/** 生产者侧:标记数据流结束 */\n\tend() {\n\t\tthis.#done = true;\n\t\tif (this.#pending) {\n\t\t\tconst resolve = this.#pending.resolve;\n\t\t\tthis.#pending = null;\n\t\t\tresolve({ value: undefined, done: true });\n\t\t}\n\t}\n\n\t/** 生产者侧:标记数据流出错 */\n\terror(err) {\n\t\tthis.#error = err;\n\t\tif (this.#pending) {\n\t\t\tconst reject = this.#pending.reject;\n\t\t\tthis.#pending = null;\n\t\t\treject(err);\n\t\t}\n\t}\n\n\t/** AsyncIterator 协议:获取下一行 */\n\tnext() {\n\t\tif (this.#index < this.#buffer.length) {\n\t\t\treturn Promise.resolve({ value: this.#buffer[this.#index++], done: false });\n\t\t}\n\t\tif (this.#done) {\n\t\t\treturn Promise.resolve({ value: undefined, done: true });\n\t\t}\n\t\tif (this.#error) {\n\t\t\treturn Promise.reject(this.#error);\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.#pending = { resolve, reject };\n\t\t});\n\t}\n\n\t/** for await 提前 break / return 时清理 */\n\treturn() {\n\t\tthis.#done = true;\n\t\tthis.#buffer = [];\n\t\tthis.#index = 0;\n\t\tif (this.#pending) {\n\t\t\tconst resolve = this.#pending.resolve;\n\t\t\tthis.#pending = null;\n\t\t\tresolve({ value: undefined, done: true });\n\t\t}\n\t\treturn Promise.resolve({ value: undefined, done: true });\n\t}\n\n\t[Symbol.asyncIterator]() {\n\t\treturn this;\n\t}\n}\n","import { AsyncRowBuffer } from \"../stream/stream.js\";\n\n/** SQLite 支持的三种事务模式 */\nexport const VALID_TRANSACTION_MODES = [\"DEFERRED\", \"IMMEDIATE\", \"EXCLUSIVE\"];\n\n/**\n * 判断给定的值是否为有效的事务模式。\n * @param {unknown} value\n * @returns {boolean}\n */\nexport function isTransactionMode(value) {\n\treturn VALID_TRANSACTION_MODES.includes(value);\n}\n\n/**\n * 创建一个事务操作句柄。\n * 该句柄的 execute/query/stream 方法会自动携带 scopeId,\n * 使得事务内的所有操作被标记为属于同一事务域。\n *\n * @param {symbol} scopeId - 事务域标识\n * @param {{ enqueue(kind: string, sql: string, params: any[], options: object, scopeId: symbol | null): Promise<any> }} executor\n * @returns {{ execute: Function, query: Function, stream: Function }}\n */\nexport function createTransactionHandle(scopeId, executor) {\n\tconst handle = {\n\t\texecute: (sql, params = [], options = {}) => executor.enqueue(\"execute\", sql, params, options, scopeId),\n\t\tquery: (sql, params = [], options = {}) => executor.enqueue(\"query\", sql, params, options, scopeId),\n\t\tstream: (sql, params = [], options = {}) => {\n\t\t\tif (!Array.isArray(params)) throw new TypeError(\"params must be an array\");\n\t\t\tconst buffer = new AsyncRowBuffer();\n\t\t\texecutor.enqueue(\"stream\", sql, params, { ...options, onRow: (row) => buffer.push(row) }, scopeId)\n\t\t\t\t.then(() => buffer.end(), (err) => buffer.error(err));\n\t\t\treturn buffer;\n\t\t},\n\t};\n\treturn handle;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\nfunction isWindows() {\n\treturn os.platform() === \"win32\";\n}\n\n/**\n * 判断文件是否可执行\n */\nfunction isExecutable(filePath) {\n\ttry {\n\t\tif (isWindows()) {\n\t\t\t// Windows:只要文件存在即可(是否可执行由扩展名判断)\n\t\t\treturn fs.statSync(filePath).isFile();\n\t\t} else {\n\t\t\tfs.accessSync(filePath, fs.constants.X_OK);\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 获取 Windows 下的可执行扩展名\n */\nfunction getPathExts() {\n\tif (!isWindows()) return [\"\"];\n\tconst ext = process.env.PATHEXT || \".EXE;.CMD;.BAT;.COM;.PS1\";\n\treturn ext.split(\";\").map((e) => e.toLowerCase());\n}\n\n/**\n * which 实现\n * @param {string} command\n * @returns {string|null}\n */\nexport function which(command) {\n\tif (!command) return null;\n\n\tconst pathExts = getPathExts();\n\n\t// 如果 command 本身包含路径\n\tif (command.includes(path.sep)) {\n\t\tconst fullPath = path.resolve(command);\n\n\t\tif (isWindows()) {\n\t\t\t// Windows:需要尝试补全扩展名\n\t\t\tif (path.extname(fullPath)) {\n\t\t\t\treturn isExecutable(fullPath) ? fullPath : null;\n\t\t\t}\n\n\t\t\tfor (const ext of pathExts) {\n\t\t\t\tconst file = fullPath + ext;\n\t\t\t\tif (isExecutable(file)) return file;\n\t\t\t}\n\t\t} else {\n\t\t\treturn isExecutable(fullPath) ? fullPath : null;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// 从 PATH 中查找\n\tconst envPath = process.env.PATH || \"\";\n\tconst pathDirs = envPath.split(path.delimiter);\n\n\tfor (const dir of pathDirs) {\n\t\tif (!dir) continue;\n\n\t\tif (isWindows()) {\n\t\t\tfor (const ext of pathExts) {\n\t\t\t\tconst file = path.join(dir, command + ext);\n\t\t\t\tif (isExecutable(file)) return file;\n\t\t\t}\n\t\t} else {\n\t\t\tconst file = path.join(dir, command);\n\t\t\tif (isExecutable(file)) return file;\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { spawn } from \"node:child_process\";\nimport { once } from \"node:events\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { which } from \"../which.js\";\n\n/** @type {number} */\nconst GRACEFUL_SHUTDOWN_TIMEOUT = 5_000;\n\n/**\n * 管理 sqlite3 子进程的生命周期。\n * 负责启动/stderr/stdin/stdout 管道配置,以及进程的终止与清理。\n */\nexport class ProcessManager {\n\t#binary;\n\t#database;\n\t#proc = null;\n\t#initMode;\n\t#draining = false;\n\t/** @type {string[]} draining 期间暂存的写入数据,drain 事件后逐个发送 */\n\t#writeBuffer = [];\n\t/** @type {(() => void)[]} 通过 onDrained() 注册的回调,缓冲排空后一次触发 */\n\t#drainCallbacks = [];\n\t#onDrain;\n\n\t/**\n\t * @param {{ binary?: string, database?: string, initMode?: \"wal\" | \"none\", onDrain?: () => void }} options\n\t */\n\tconstructor({ binary, database, initMode = \"wal\", onDrain } = {}) {\n\t\tthis.#binary = which(binary) ?? binary;\n\t\tthis.#database = database;\n\t\tthis.#initMode = initMode;\n\t\tthis.#onDrain = onDrain ?? (() => {});\n\t}\n\n\t/** drain 状态为 true 时表示 OS pipe 已满,应暂停写入 stdin。 */\n\tget draining() {\n\t\treturn this.#draining;\n\t}\n\n\t/** 注册 drain 回调,当 pipe 重新可写时被调用。 */\n\tsetOnDrainCallback(fn) {\n\t\tthis.#onDrain = fn;\n\t}\n\n\t/**\n\t * 注册一个\"缓冲排空\"回调。\n\t * 若当前无缓冲且非 draining,回调会被立即同步调用;\n\t * 否则暂存,等内部缓冲全部排空、draining 为 false 后一次触发全部回调。\n\t * @param {() => void} callback\n\t */\n\tonDrained(callback) {\n\t\tif (!this.#draining && this.#writeBuffer.length === 0) {\n\t\t\tcallback();\n\t\t\treturn;\n\t\t}\n\t\tthis.#drainCallbacks.push(callback);\n\t}\n\n\tget binary() {\n\t\treturn this.#binary;\n\t}\n\n\tget process() {\n\t\treturn this.#proc;\n\t}\n\n\t/**\n\t * 启动 sqlite3 子进程。\n\t * 使用 `-json` 模式启动。\n\t * 对于文件数据库,initMode=\"wal\" 时自动启用 WAL 模式 + busy_timeout。\n\t * @returns {import(\"node:child_process\").ChildProcess}\n\t */\n\tstart() {\n\t\tif (!this.#binary) {\n\t\t\tthrow new Error(\"sqlite3 binary path is empty. Provide a valid --binary / binary option.\");\n\t\t}\n\t\tif (path.isAbsolute(this.#binary) && !fs.existsSync(this.#binary)) {\n\t\t\tthrow new Error(`sqlite3 binary not found: ${this.#binary}. Make sure sqlite3 is installed or provide a valid --binary / binary option.`);\n\t\t}\n\n\t\tconst args = [\"-json\"];\n\t\tif (this.#database) args.push(this.#database);\n\t\tif (this.#database && this.#database !== \":memory:\" && this.#initMode === \"wal\") {\n\t\t\targs.push(\"-cmd\", \"PRAGMA journal_mode=WAL;\");\n\t\t\targs.push(\"-cmd\", \"PRAGMA busy_timeout=5000;\");\n\t\t}\n\n\t\tconst proc = spawn(this.#binary, args, {\n\t\t\tstdio: \"pipe\",\n\t\t\tshell: false,\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tproc.stdin?.setDefaultEncoding(\"utf-8\");\n\t\tproc.stdout?.setEncoding(\"utf-8\");\n\t\tproc.stderr?.setEncoding(\"utf-8\");\n\n\t\t// 处理 stdin pipe 在进程退出后被关闭时的 EPIPE 错误。\n\t\t// 场景:进程被外部 kill(SIGTERM/KILL)、OS 级进程终止,\n\t\t// close 事件尚未到达事件循环时,pump() 可能尝试写入已关闭的 stdin。\n\t\t// 错误被吃掉,不传播为 uncaughtException。\n\t\t// PipelineEngine 的 pump 会在 close 事件抵达后通过\n\t\t// #handleProcessFailure → #pipeline.rejectAll() 正确拒绝所有待处理任务。\n\t\tproc.stdin?.on(\"error\", () => {\n\t\t\t// EPIPE 是预期的(进程已退出,stdin pipe 被关闭),静默忽略。\n\t\t\t// 任何 stdin 写入错误都不应传播为 uncaughtException。\n\t\t});\n\n\t\tthis.#proc = proc;\n\t\treturn proc;\n\t}\n\n\t/**\n\t * 向子进程的 stdin 写入数据。\n\t *\n\t * 当 Node.js 内部 buffer 超过 highWaterMark(默认 16KB)时 `stream.write()` 返回 false,\n\t * 表示 OS pipe 缓冲区已满,应暂停写入等待 drain 事件。\n\t *\n\t * 旧行为(P0 bug):\n\t * - 在 `#draining = true` 时直接 `return`,静默丢弃后续写入的数据。\n\t *\n\t * 当前行为(修复):\n\t * - `#draining = true` 时,后续 `write()` 调用将数据存入 `#writeBuffer` 暂存。\n\t * - drain 事件触发后:\n\t * 1. 清 `#draining`\n\t * 2. 调 `#flushBuffer()` 逐个发送缓冲中的数据(可能再次触发 draining,剩余数据继续暂存)\n\t * 3. 调 `#notifyIfDrained()` 通知所有 `onDrained` 注册方\n\t * 4. 调 `#onDrain()`(上游 pumpQueue 的入口)\n\t * - 这样在任何 pipe 容量下都不会丢失数据,写入自动节流。\n\t *\n\t * @param {string} data\n\t */\n\twrite(data) {\n\t\tconst stream = this.#proc?.stdin;\n\t\tif (!stream) return;\n\n\t\tif (this.#draining) {\n\t\t\tthis.#writeBuffer.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!stream.write(data)) {\n\t\t\tthis.#draining = true;\n\t\t\tstream.once(\"drain\", () => {\n\t\t\t\tthis.#draining = false;\n\t\t\t\tthis.#flushBuffer();\n\t\t\t\tthis.#notifyIfDrained();\n\t\t\t\tthis.#onDrain();\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * 逐个发送写缓冲区中的数据。\n\t * 每项调用 `this.write()`,若 `stream.write()` 再次返回 false,\n\t * `#draining` 会重新变为 true,剩余数据继续暂存,等待下一次 drain。\n\t */\n\t#flushBuffer() {\n\t\tconst buffer = this.#writeBuffer;\n\t\tthis.#writeBuffer = [];\n\t\tfor (const data of buffer) {\n\t\t\tthis.write(data);\n\t\t}\n\t}\n\n\t/**\n\t * 当缓冲全部排空且 `#draining = false` 时,触发所有 `onDrained` 回调。\n\t * 每个回调最多触发一次(触发后从 `#drainCallbacks` 移除)。\n\t */\n\t#notifyIfDrained() {\n\t\tif (this.#draining) return;\n\t\tconst callbacks = this.#drainCallbacks;\n\t\tthis.#drainCallbacks = [];\n\t\tfor (const cb of callbacks) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\t/**\n\t * 优雅关闭:等待写缓冲区排空,然后向子进程发送 `.quit` 命令并等待其自行退出。\n\t * 如果在超时时间内未退出,则强制 kill。\n\t * @returns {Promise<void>}\n\t */\n\tasync gracefulShutdown() {\n\t\tconst proc = this.#proc;\n\t\tif (!proc) return;\n\n\t\t// 等待当前缓冲数据(由 drain 期间堆积的 write() 调用产生)全部写入 pipe\n\t\tif (this.#draining || this.#writeBuffer.length > 0) {\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\tconst timer = setTimeout(resolve, GRACEFUL_SHUTDOWN_TIMEOUT);\n\t\t\t\tthis.onDrained(() => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tproc.kill();\n\t\t}, GRACEFUL_SHUTDOWN_TIMEOUT).unref();\n\n\t\ttry {\n\t\t\tproc.stdin?.write(\".quit\\n\");\n\t\t\tawait once(proc, \"close\");\n\t\t} catch {\n\t\t\t// 进程可能已被清理,忽略\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\t/**\n\t * 终止子进程并清理所有监听器与管道。\n\t * @returns {import(\"node:child_process\").ChildProcess | null} 被终止的进程引用(如果没有正在运行的进程则为 null)\n\t */\n\tkill() {\n\t\tconst proc = this.#proc;\n\t\tif (!proc) return null;\n\t\tthis.#proc = null;\n\t\tthis.#draining = false;\n\t\tthis.#writeBuffer = [];\n\t\tthis.#drainCallbacks = [];\n\t\tproc.stdout?.removeAllListeners();\n\t\tproc.stderr?.removeAllListeners();\n\t\tproc.removeAllListeners();\n\t\tproc.stdin?.destroy();\n\t\tproc.kill();\n\t\treturn proc;\n\t}\n}\n","let _counter = 0;\nconst _PREFIX = \"__executor_end__\";\nconst _PID36 = process.pid.toString(36);\n\n/**\n * 生成一个唯一的 sentinel token。\n * 使用递增计数器和进程 PID 组合,避免每次分配随机数字符串。\n * 格式:__executor_end__{base36计数器}_{base36 PID}\n * @returns {string}\n */\nexport function generateToken() {\n\t_counter = (_counter + 1) >>> 0; // 保持在 32 位无符号整数范围内\n\n\treturn `${_PREFIX}${_counter.toString(36)}_${_PID36}`;\n}\n","/**\n * 基于 Map 插入顺序的 LRU 缓存。\n *\n * 使用 `get()` 命中时自动将条目提升到末尾;\n * `set()` 在达到容量上限时淘汰最久未访问的条目(首个 key)。\n * 仅缓存字符串 key,长度超过 `maxKeyLength` 的 key 不会被缓存。\n *\n * @template T\n */\nexport class LRUCache {\n\t#maxSize;\n\t#maxKeyLength;\n\t#maxValueLength;\n\t/** @type {Map<string, T>} */\n\t#map = new Map();\n\n\t/**\n\t * @param {{ maxSize?: number, maxKeyLength?: number, maxValueLength?: number }} [options]\n\t * maxSize - 最大缓存条目数(默认 256,自动提升到至少 1)\n\t * maxKeyLength - key 最大长度,超长 key 不缓存(默认 4096)\n\t * maxValueLength - value 字符串/数组的最大长度,超长不缓存(默认 Infinity)\n\t */\n\tconstructor({ maxSize = 256, maxKeyLength = 4096, maxValueLength = Infinity } = {}) {\n\t\tthis.#maxSize = Math.max(1, maxSize);\n\t\tthis.#maxKeyLength = maxKeyLength;\n\t\tthis.#maxValueLength = maxValueLength;\n\t}\n\n\t/**\n\t * 获取缓存值。命中时将条目提升到末尾;未命中或 key 不合法时返回 undefined。\n\t * @param {string} key - 缓存键\n\t * @returns {T | undefined}\n\t */\n\tget(key) {\n\t\tif (typeof key !== \"string\" || key.length > this.#maxKeyLength) return undefined;\n\t\tconst value = this.#map.get(key);\n\t\tif (value === undefined) return undefined;\n\t\tthis.#map.delete(key);\n\t\tthis.#map.set(key, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * 设置缓存值。达到容量上限时淘汰最旧条目。超长 key 不缓存。\n\t * 对字符串/数组类型检查 maxValueLength;其他类型不做长度过滤(如对象)。\n\t * @param {string} key - 缓存键\n\t * @param {T} value - 缓存值\n\t */\n\tset(key, value) {\n\t\tif (typeof key !== \"string\" || key.length > this.#maxKeyLength) return;\n\t\tif (typeof value === \"string\" && value.length > this.#maxValueLength) return;\n\t\tif (Array.isArray(value) && value.length > this.#maxValueLength) return;\n\t\tif (this.#map.size >= this.#maxSize) {\n\t\t\tconst firstKey = this.#map.keys().next().value;\n\t\t\tthis.#map.delete(firstKey);\n\t\t}\n\t\tthis.#map.set(key, value);\n\t}\n\n\t/** 当前缓存条目数。 */\n\tget size() {\n\t\treturn this.#map.size;\n\t}\n\n\t/** 清空缓存。 */\n\tclear() {\n\t\tthis.#map.clear();\n\t}\n}\n","/**\n * 转义 SQLite 参数值为安全字符串。\n * 字符串中的单引号会被双写('')转义;\n * null/undefined 转 \"NULL\";boolean 转 \"TRUE\"/\"FALSE\";\n * Date 转 ISO 字符串带引号;数字/bigint 直转字符串。\n * @param {any} value - 要转义的值\n * @returns {string}\n */\nexport function escapeValue(value) {\n\tif (typeof value === \"string\") {\n\t\t// 绝大多数字符串不含单引号,先检查再 replace 避免无意义的分配\n\t\treturn value.includes(\"'\") ? `'${value.replace(/'/g, \"''\")}'` : `'${value}'`;\n\t}\n\tif (value === null || value === undefined) return \"NULL\";\n\tif (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n\tif (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n\tif (value instanceof Date) return `'${value.toISOString()}'`;\n\tthrow new TypeError(`Unsupported parameter type: ${typeof value}`);\n}\n","import { LRUCache } from \"../core/lruCache.js\";\nimport { escapeValue } from \"./escape.js\";\nimport {\n\tCC_SINGLE_QUOTE,\n\tCC_DOUBLE_QUOTE,\n\tCC_DASH,\n\tCC_SLASH,\n\tCC_STAR,\n\tCC_NEWLINE,\n\tCC_QUESTION,\n\tSTATE_NORMAL,\n\tSTATE_SINGLE_QUOTE,\n\tSTATE_DOUBLE_QUOTE,\n\tSTATE_LINE_COMMENT,\n\tSTATE_BLOCK_COMMENT,\n} from \"./constants.js\";\n\n/** @type {LRUCache<{ segments: string[], paramCount: number }>} */\nconst _interpCache = new LRUCache({ maxSize: 256, maxKeyLength: 4096 });\n\n/**\n * 将 SQL 模板解析为以 `?` 分隔的文本段。\n * @param {string} sql\n * @returns {{ segments: string[], paramCount: number }}\n */\nfunction _parseTemplate(sql) {\n\tconst segments = [];\n\tlet segStart = 0;\n\tlet state = STATE_NORMAL;\n\tlet stateStartPos = -1;\n\n\tfor (let pos = 0; pos < sql.length; pos++) {\n\t\tconst code = sql.charCodeAt(pos);\n\n\t\tif (state === STATE_NORMAL) {\n\t\t\tif (code === CC_SINGLE_QUOTE) {\n\t\t\t\tstate = STATE_SINGLE_QUOTE;\n\t\t\t\tstateStartPos = pos;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_DOUBLE_QUOTE) {\n\t\t\t\tstate = STATE_DOUBLE_QUOTE;\n\t\t\t\tstateStartPos = pos;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_DASH && sql.charCodeAt(pos + 1) === CC_DASH) {\n\t\t\t\tstate = STATE_LINE_COMMENT;\n\t\t\t\tpos++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_SLASH && sql.charCodeAt(pos + 1) === CC_STAR) {\n\t\t\t\tstate = STATE_BLOCK_COMMENT;\n\t\t\t\tstateStartPos = pos;\n\t\t\t\tpos++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_QUESTION) {\n\t\t\t\tsegments.push(sql.slice(segStart, pos));\n\t\t\t\tsegStart = pos + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_SINGLE_QUOTE) {\n\t\t\tif (code === CC_SINGLE_QUOTE) {\n\t\t\t\tif (sql.charCodeAt(pos + 1) === CC_SINGLE_QUOTE) {\n\t\t\t\t\tpos++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tstateStartPos = -1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_DOUBLE_QUOTE) {\n\t\t\tif (code === CC_DOUBLE_QUOTE) {\n\t\t\t\tif (sql.charCodeAt(pos + 1) === CC_DOUBLE_QUOTE) {\n\t\t\t\t\tpos++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tstateStartPos = -1;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_LINE_COMMENT) {\n\t\t\tif (code === CC_NEWLINE) state = STATE_NORMAL;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_BLOCK_COMMENT) {\n\t\t\tif (code === CC_STAR && sql.charCodeAt(pos + 1) === CC_SLASH) {\n\t\t\t\tpos++;\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tstateStartPos = -1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (state === STATE_SINGLE_QUOTE) {\n\t\tthrow new Error(`Unterminated single-quoted string starting at position ${stateStartPos + 1}`);\n\t}\n\n\tif (state === STATE_DOUBLE_QUOTE) {\n\t\tthrow new Error(`Unterminated double-quoted identifier/string starting at position ${stateStartPos + 1}`);\n\t}\n\n\tif (state === STATE_BLOCK_COMMENT) {\n\t\tthrow new Error(`Unterminated block comment starting at position ${stateStartPos + 1}`);\n\t}\n\n\tsegments.push(sql.slice(segStart));\n\treturn { segments, paramCount: segments.length - 1 };\n}\n\n/**\n * 使用预解析的模板替换参数,避免重新扫描 SQL。\n * @param {{ segments: string[], paramCount: number }} template - 由 _parseTemplate 返回的模板\n * @param {any[]} params - 参数数组\n * @returns {string}\n */\nexport function interpolateFromTemplate(template, params) {\n\tconst { segments, paramCount } = template;\n\tif (params.length < paramCount) throw new Error(\"Too few parameters provided\");\n\tif (params.length > paramCount) throw new Error(\"Too many parameters provided\");\n\n\tif (paramCount === 0) return segments[0];\n\n\tconst parts = [segments[0]];\n\tfor (let i = 0; i < params.length; i++) {\n\t\tparts.push(escapeValue(params[i]));\n\t\tparts.push(segments[i + 1]);\n\t}\n\treturn parts.join(\"\");\n}\n\n/**\n * 替换 SQL 语句中的 ? 为转义后的参数。\n * 内部使用 LRU 缓存已解析的模板,避免重复扫描相同 SQL。\n * @param {string} sql - SQL 模板(含 ? 占位符)\n * @param {any[]} params - 参数数组\n * @returns {string}\n */\nexport function interpolateSQL(sql, params) {\n\tif (!sql.includes(\"?\")) {\n\t\tif (params.length > 0) throw new Error(\"Too many parameters provided\");\n\t\treturn sql;\n\t}\n\n\tlet template = _interpCache.get(sql);\n\n\tif (template === undefined) {\n\t\ttemplate = _parseTemplate(sql);\n\t\t_interpCache.set(sql, template);\n\t}\n\n\treturn interpolateFromTemplate(template, params);\n}\n","const CC_SINGLE_QUOTE = 39;\nconst CC_DOUBLE_QUOTE = 34;\nconst CC_DASH = 45;\nconst CC_SLASH = 47;\nconst CC_STAR = 42;\nconst CC_NEWLINE = 10;\nconst CC_QUESTION = 63;\nconst CC_SEMICOLON = 59;\nconst CC_SPACE = 32;\n\nconst STATE_NORMAL = 0;\nconst STATE_SINGLE_QUOTE = 1;\nconst STATE_DOUBLE_QUOTE = 2;\nconst STATE_LINE_COMMENT = 3;\nconst STATE_BLOCK_COMMENT = 4;\n\nexport {\n\tCC_SINGLE_QUOTE,\n\tCC_DOUBLE_QUOTE,\n\tCC_DASH,\n\tCC_SLASH,\n\tCC_STAR,\n\tCC_NEWLINE,\n\tCC_QUESTION,\n\tCC_SEMICOLON,\n\tCC_SPACE,\n\tSTATE_NORMAL,\n\tSTATE_SINGLE_QUOTE,\n\tSTATE_DOUBLE_QUOTE,\n\tSTATE_LINE_COMMENT,\n\tSTATE_BLOCK_COMMENT,\n};\n","import { LRUCache } from \"../core/lruCache.js\";\nimport {\n\tCC_SINGLE_QUOTE,\n\tCC_DOUBLE_QUOTE,\n\tCC_DASH,\n\tCC_SLASH,\n\tCC_STAR,\n\tCC_NEWLINE,\n\tCC_QUESTION,\n\tCC_SEMICOLON,\n\tCC_SPACE,\n\tSTATE_NORMAL,\n\tSTATE_SINGLE_QUOTE,\n\tSTATE_DOUBLE_QUOTE,\n\tSTATE_LINE_COMMENT,\n\tSTATE_BLOCK_COMMENT,\n} from \"./constants.js\";\n\n/**\n * 将 Uint16Array(UCS-2 编码)解码为 JavaScript 字符串。\n * 使用 String.fromCharCode.apply 替代 TextDecoder,避免跨 CPU 字节序问题:\n * - TextDecoder(\"utf-16le\") 在小端 CPU 上正确,但在大端 CPU 上产生乱码\n * - Uint16Array 的底层内存布局依赖 CPU 字节序\n * - String.fromCharCode() 直接从 16 位码元创建字符,与字节序无关\n * @param {Uint16Array} codes\n * @returns {string}\n */\nfunction _decodeU16(codes) {\n\tconst len = codes.length;\n\tif (len === 0) return \"\";\n\t// 1024 是个安全的批处理大小,避免 V8 的 apply 参数栈溢出\n\tconst batchSize = 1024;\n\tif (len <= batchSize) {\n\t\treturn String.fromCharCode.apply(null, codes);\n\t}\n\tconst parts = new Array(Math.ceil(len / batchSize));\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst start = i * batchSize;\n\t\tconst end = Math.min(start + batchSize, len);\n\t\tparts[i] = String.fromCharCode.apply(null, codes.subarray(start, end));\n\t}\n\treturn parts.join(\"\");\n}\n\nconst _normCache = new LRUCache({ maxSize: 256, maxKeyLength: 4096 });\n\nfunction _normalize(sql) {\n\tconst len = sql.length;\n\tconst needed = len + 1;\n\tconst outCodes = new Uint16Array(needed);\n\tlet writePos = 0;\n\tlet pendingSpace = false;\n\tlet state = STATE_NORMAL;\n\tconst questionPositions = [];\n\n\tfor (let i = 0; i < len; i++) {\n\t\tconst code = sql.charCodeAt(i);\n\t\tconst nextCode = sql.charCodeAt(i + 1);\n\n\t\tif (state === STATE_BLOCK_COMMENT) {\n\t\t\tif (code === CC_STAR && nextCode === CC_SLASH) {\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\ti++;\n\t\t\t\tif (writePos > 0) pendingSpace = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_LINE_COMMENT) {\n\t\t\tif (code === CC_NEWLINE) {\n\t\t\t\tstate = STATE_NORMAL;\n\t\t\t\tif (writePos > 0) pendingSpace = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_NORMAL) {\n\t\t\tif (code === CC_DASH && nextCode === CC_DASH) {\n\t\t\t\tstate = STATE_LINE_COMMENT;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (code === CC_SLASH && nextCode === CC_STAR) {\n\t\t\t\tstate = STATE_BLOCK_COMMENT;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (code === 32 || code === 9 || code === 10 || code === 11 || code === 12 || code === 13) {\n\t\t\tif (writePos > 0) pendingSpace = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pendingSpace && writePos > 0) {\n\t\t\toutCodes[writePos++] = CC_SPACE;\n\t\t\tpendingSpace = false;\n\t\t}\n\n\t\tif (code === CC_QUESTION && state === STATE_NORMAL) {\n\t\t\tquestionPositions.push(writePos);\n\t\t}\n\t\toutCodes[writePos++] = code;\n\n\t\tif (state === STATE_NORMAL) {\n\t\t\tif (code === CC_SINGLE_QUOTE) state = STATE_SINGLE_QUOTE;\n\t\t\telse if (code === CC_DOUBLE_QUOTE) state = STATE_DOUBLE_QUOTE;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_SINGLE_QUOTE) {\n\t\t\tif (code === CC_SINGLE_QUOTE && nextCode === CC_SINGLE_QUOTE) {\n\t\t\t\toutCodes[writePos++] = nextCode;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_SINGLE_QUOTE) state = STATE_NORMAL;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (state === STATE_DOUBLE_QUOTE) {\n\t\t\tif (code === CC_DOUBLE_QUOTE && nextCode === CC_DOUBLE_QUOTE) {\n\t\t\t\toutCodes[writePos++] = nextCode;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (code === CC_DOUBLE_QUOTE) state = STATE_NORMAL;\n\t\t}\n\t}\n\n\tlet normalized;\n\tif (writePos === 0) {\n\t\tnormalized = \";\";\n\t} else {\n\t\twhile (writePos > 0 && outCodes[writePos - 1] === CC_SEMICOLON) writePos--;\n\t\toutCodes[writePos++] = CC_SEMICOLON;\n\t\tnormalized = _decodeU16(outCodes.subarray(0, writePos));\n\t}\n\n\tconst paramCount = questionPositions.length;\n\tif (paramCount === 0) {\n\t\treturn { normalized, segments: [normalized], paramCount: 0 };\n\t}\n\n\tconst segments = [];\n\tlet segStart = 0;\n\tfor (const pos of questionPositions) {\n\t\tsegments.push(normalized.slice(segStart, pos));\n\t\tsegStart = pos + 1;\n\t}\n\tsegments.push(normalized.slice(segStart));\n\treturn { normalized, segments, paramCount };\n}\n\nexport function normalizeSQL(sql) {\n\tconst cached = _normCache.get(sql);\n\tif (cached !== undefined) return cached.normalized;\n\tconst result = _normalize(sql);\n\t_normCache.set(sql, result);\n\treturn result.normalized;\n}\n\nexport function normalizeSQLTemplate(sql) {\n\tconst cached = _normCache.get(sql);\n\tif (cached !== undefined) return cached;\n\tconst result = _normalize(sql);\n\t_normCache.set(sql, result);\n\treturn result;\n}\n","import { LRUCache } from \"./lruCache.js\";\n\nconst READ_ONLY_KINDS = new Set([\"SELECT\", \"WITH\", \"VALUES\", \"EXPLAIN\"]);\n\n/**\n * classifySQL 的 LRU 缓存。\n * 以规范化后的 SQL 模板为 key(参数插值前),\n * 使得相同形状的查询即使参数不同也能命中缓存。\n * @type {LRUCache<\"read\" | \"write\">}\n */\nconst _classifyCache = new LRUCache({ maxSize: 256, maxKeyLength: 4096 });\n\nfunction classifySingle(stmt) {\n\tconst trimmed = stmt.trim();\n\t// 使用 indexOf 替代 split(/\\s+/) 避免数组分配\n\tconst firstSpace = trimmed.indexOf(\" \");\n\tconst kind = (firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace)).toUpperCase();\n\treturn READ_ONLY_KINDS.has(kind) ? \"read\" : \"write\";\n}\n\n/**\n * 判断一条 SQL 语句是否为只读操作。\n * 多语句(以 ; 分隔)中若包含任意写语句,整体返回 \"write\"。\n * @param {string} sql\n * @returns {\"read\" | \"write\"}\n */\nexport function classifySQL(sql) {\n\tif (typeof sql !== \"string\") return \"write\";\n\n\tconst cached = _classifyCache.get(sql);\n\tif (cached !== undefined) return cached;\n\n\t// sql 已经过 normalizeSQL 去除首尾空白,但保留 trim() 防御直接调用\n\tconst trimmed = sql.trim();\n\tif (trimmed.length === 0) return \"write\";\n\tlet result;\n\tif (trimmed.includes(\";\")) {\n\t\tconst stmts = trimmed.split(\";\").filter((s) => s.trim().length > 0);\n\t\tif (stmts.length === 0) return \"write\";\n\t\tresult = \"read\";\n\t\tfor (const stmt of stmts) {\n\t\t\tif (classifySingle(stmt) === \"write\") {\n\t\t\t\tresult = \"write\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = classifySingle(trimmed);\n\t}\n\n\t_classifyCache.set(sql, result);\n\treturn result;\n}\n","const INITIAL_CAPACITY = 16;\nconst SHRINK_THRESHOLD = 256; // >= 256 slots → clear() 时收缩到 INITIAL_CAPACITY\n\nexport class Queue {\n\t#items = new Array(INITIAL_CAPACITY);\n\t#head = 0;\n\t#tail = 0;\n\t#size = 0;\n\t#mask = INITIAL_CAPACITY - 1;\n\n\tenqueue(value) {\n\t\tif (this.#size === this.#items.length) {\n\t\t\tthis.#grow();\n\t\t}\n\t\tthis.#items[this.#tail] = value;\n\t\tthis.#tail = (this.#tail + 1) & this.#mask;\n\t\tthis.#size++;\n\t}\n\n\t#grow() {\n\t\tconst oldMask = this.#mask;\n\t\tconst newCap = this.#items.length * 2;\n\t\tthis.#mask = newCap - 1;\n\t\tif (this.#head === 0) {\n\t\t\t// Items are contiguous from index 0; extend in-place without copying.\n\t\t\tthis.#items.length = newCap;\n\t\t\tthis.#tail = this.#size;\n\t\t} else {\n\t\t\tconst newItems = new Array(newCap);\n\t\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\t\tnewItems[i] = this.#items[(this.#head + i) & oldMask];\n\t\t\t}\n\t\t\tthis.#items = newItems;\n\t\t\tthis.#head = 0;\n\t\t\tthis.#tail = this.#size;\n\t\t}\n\t}\n\n\tdequeue() {\n\t\tif (this.#size === 0) return null;\n\t\tconst value = this.#items[this.#head];\n\t\tthis.#items[this.#head] = undefined;\n\t\tthis.#head = (this.#head + 1) & this.#mask;\n\t\tthis.#size--;\n\t\treturn value;\n\t}\n\n\tclear() {\n\t\t// Reuse the existing backing array (avoids allocation + GC pressure on hot paths\n\t\t// such as #restoreDeferred which calls clear() on every exclusive-zone exit).\n\t\t// #mask stays valid: it equals #items.length - 1 and the array length is unchanged.\n\t\tthis.#items.fill(undefined);\n\t\tthis.#head = 0;\n\t\tthis.#tail = 0;\n\t\tthis.#size = 0;\n\t\tthis.#shrinkIfNeeded();\n\t}\n\n\t/**\n\t * 如果 backing array 远超实际需求,收缩到初始容量以释放内存。\n\t * 仅在 clear() 中调用(非热路径),避免热路径上的 GC 压力。\n\t * 在百万级 SQL 的高负载场景下,队列可能膨胀到数十万 slots,\n\t * 任务耗尽后的大数组将长期驻留内存。收缩解决此问题。\n\t */\n\t#shrinkIfNeeded() {\n\t\tif (this.#items.length >= SHRINK_THRESHOLD) {\n\t\t\tthis.#items = new Array(INITIAL_CAPACITY);\n\t\t\tthis.#mask = INITIAL_CAPACITY - 1;\n\t\t}\n\t}\n\n\tremove(value) {\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tconst idx = (this.#head + i) & this.#mask;\n\t\t\tif (this.#items[idx] === value) {\n\t\t\t\tfor (let j = i; j < this.#size - 1; j++) {\n\t\t\t\t\tconst curr = (this.#head + j) & this.#mask;\n\t\t\t\t\tconst next = (this.#head + j + 1) & this.#mask;\n\t\t\t\t\tthis.#items[curr] = this.#items[next];\n\t\t\t\t}\n\t\t\t\tthis.#tail = (this.#tail - 1) & this.#mask;\n\t\t\t\tthis.#items[this.#tail] = undefined;\n\t\t\t\tthis.#size--;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfind(predicate) {\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tconst value = this.#items[(this.#head + i) & this.#mask];\n\t\t\tif (predicate(value)) return value;\n\t\t}\n\t\treturn null;\n\t}\n\n\ttoArray() {\n\t\tconst result = new Array(this.#size);\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tresult[i] = this.#items[(this.#head + i) & this.#mask];\n\t\t}\n\t\treturn result;\n\t}\n\n\t*values() {\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tyield this.#items[(this.#head + i) & this.#mask];\n\t\t}\n\t}\n\n\tpeek() {\n\t\treturn this.#size > 0 ? this.#items[this.#head] : null;\n\t}\n\n\t/**\n\t * 将另一个 Queue 中的所有元素插入到当前队列的前面,保持原始顺序。\n\t * 源队列在操作后被清空。\n\t * 比 toArray() + clear() + 多次 enqueue() 更高效,\n\t * 因为避免了中间数组分配并减少 enqueue 调用开销。\n\t * @param {Queue} other - 源队列(操作后被清空)\n\t */\n\tprependAll(other) {\n\t\tif (other.isEmpty()) return;\n\n\t\t// Fast path: this queue is empty — just swap internals.\n\t\tif (this.#size === 0) {\n\t\t\tconst tmpItems = this.#items;\n\t\t\tconst tmpMask = this.#mask;\n\t\t\tthis.#items = other.#items;\n\t\t\tthis.#head = other.#head;\n\t\t\tthis.#tail = other.#tail;\n\t\t\tthis.#size = other.#size;\n\t\t\tthis.#mask = other.#mask;\n\t\t\tother.#items = tmpItems;\n\t\t\tother.#head = 0;\n\t\t\tother.#tail = 0;\n\t\t\tother.#size = 0;\n\t\t\tother.#mask = tmpMask;\n\t\t\treturn;\n\t\t}\n\n\t\t// General path: merge both queues into a new array so the donor's items\n\t\t// come first, followed by this queue's existing items.\n\t\tconst totalSize = this.#size + other.#size;\n\t\tlet newCap = this.#items.length;\n\t\twhile (newCap < totalSize) newCap *= 2;\n\n\t\tconst newItems = new Array(newCap);\n\t\tlet writeIdx = 0;\n\n\t\tfor (let i = 0; i < other.#size; i++) {\n\t\t\tnewItems[writeIdx++] = other.#items[(other.#head + i) & other.#mask];\n\t\t}\n\t\tfor (let i = 0; i < this.#size; i++) {\n\t\t\tnewItems[writeIdx++] = this.#items[(this.#head + i) & this.#mask];\n\t\t}\n\n\t\tthis.#items = newItems;\n\t\tthis.#head = 0;\n\t\tthis.#tail = totalSize;\n\t\tthis.#size = totalSize;\n\t\tthis.#mask = newCap - 1;\n\n\t\tother.#items.fill(undefined);\n\t\tother.#head = 0;\n\t\tother.#tail = 0;\n\t\tother.#size = 0;\n\t}\n\n\t[Symbol.iterator]() {\n\t\treturn this.values();\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\tisEmpty() {\n\t\treturn this.#size === 0;\n\t}\n}\n","import { INFLIGHT_COMPACT_THRESHOLD } from \"../constants.js\";\n\n/**\n * Inflight 任务数组管理器。\n *\n * 封装了变长数组 + 头指针的 push/shift 操作和自动压缩逻辑,\n * PipelineEngine 和 TaskWorker 共享此类,避免重复实现 inflight 管理。\n *\n * 设计:\n * - shift() 出队时将对应槽位置为 null,仅移动头指针\n * - 头指针超过阈值时通过 slice() 物理回收已消费的前部空间\n * - 不需使用者关心 #tasks / #head 的内部细节\n */\nexport class InflightTracker {\n\t#tasks = [];\n\t#head = 0;\n\n\t/** 当前 inflight 任务数。 */\n\tget count() {\n\t\treturn this.#tasks.length - this.#head;\n\t}\n\n\t/** 第一个(最旧的)inflight 任务,无任务时返回 null。 */\n\tget first() {\n\t\treturn this.#head < this.#tasks.length ? this.#tasks[this.#head] : null;\n\t}\n\n\t/** 将一个或多个任务追加到队尾。 */\n\tpush(...items) {\n\t\tthis.#tasks.push(...items);\n\t}\n\n\t/** 移除并返回第一个 inflight 任务。空时返回 null。 */\n\tshift() {\n\t\tif (this.#tasks.length === this.#head) return null;\n\t\tconst task = this.#tasks[this.#head];\n\t\tthis.#tasks[this.#head] = null;\n\t\tthis.#head++;\n\t\tif (this.#head >= this.#tasks.length) {\n\t\t\tthis.#tasks = [];\n\t\t\tthis.#head = 0;\n\t\t} else if (this.#head > INFLIGHT_COMPACT_THRESHOLD) {\n\t\t\tthis.#tasks = this.#tasks.slice(this.#head);\n\t\t\tthis.#head = 0;\n\t\t}\n\t\treturn task;\n\t}\n\n\t/** 清空所有 inflight 任务。 */\n\tclear() {\n\t\tthis.#tasks = [];\n\t\tthis.#head = 0;\n\t}\n\n\t/** 对每个 inflight 任务调用 fn(task)。 */\n\tforEach(fn) {\n\t\tfor (let i = this.#head; i < this.#tasks.length; i++) {\n\t\t\tfn(this.#tasks[i]);\n\t\t}\n\t}\n\n\t/** 返回所有 inflight 任务的浅拷贝数组(不含 null 槽位)。 */\n\ttoArray() {\n\t\treturn this.#tasks.slice(this.#head);\n\t}\n\n\t/** 测试用:获取内部数组长度。 */\n\tget _tasksLength() {\n\t\treturn this.#tasks.length;\n\t}\n\n\t/** 测试用:获取头指针位置。 */\n\tget _head() {\n\t\treturn this.#head;\n\t}\n}\n","import { toError } from \"./parser.js\";\n\n/**\n * 将解析后的 JSON 数组行收集到 query 任务的结果数组中。\n * @param {{ rows: any[] }} task\n * @param {any} parsed\n */\nexport function collectQueryRows(task, parsed) {\n\tif (Array.isArray(parsed)) {\n\t\t// task.rows 在 query 任务中始终初始化为 [](见 executor.js / taskWorker.js)\n\t\tfor (let i = 0; i < parsed.length; i++) {\n\t\t\ttask.rows.push(parsed[i]);\n\t\t}\n\t}\n}\n\n/**\n * 将解析后的 JSON 数组元素通过 stream 任务的 onRow 逐行回调。\n * 若 onRow 抛错则记录到 task.consumerError 并停止后续回调。\n * @param {{ onRow: Function, consumerError?: Error | null }} task\n * @param {any} parsed\n */\nexport function processStreamRows(task, parsed) {\n\tif (!Array.isArray(parsed)) return;\n\tfor (const row of parsed) {\n\t\tif (task.consumerError) break;\n\t\ttry {\n\t\t\ttask.onRow(row);\n\t\t} catch (error) {\n\t\t\ttask.consumerError = toError(error);\n\t\t}\n\t}\n}\n\n/**\n * 最终结算一个任务:清除定时器、更新指标,然后 resolve 或 reject。\n * @param {object} task\n * @param {Error | null} error\n * @param {any} value\n * @param {import(\"./metrics.js\").Metrics | null | undefined} metrics\n * @param {{ resetRowParser?: boolean }} [options]\n */\nexport function settleTask(task, error, value, metrics, { resetRowParser = false } = {}) {\n\tif (task.settled) return;\n\ttask.settled = true;\n\n\tif (resetRowParser) {\n\t\ttask.rowParser?.reset?.();\n\t}\n\n\tif (error) {\n\t\tmetrics?.incrementTasksFailed();\n\t\ttask.reject(toError(error));\n\t\treturn;\n\t}\n\n\tconst duration = task.startTime > 0 ? performance.now() - task.startTime : 0;\n\tmetrics?.incrementTasksSuccess(duration);\n\ttask.resolve(value);\n}\n","import { normalizeSQL } from \"../utils/normalize.js\";\nimport { TOKEN_COLUMN } from \"../constants.js\";\n\nexport { TOKEN_COLUMN } from \"../constants.js\";\n\n/**\n * 构建发送给 sqlite3 进程的完整载荷。\n * 在原始 SQL 末尾追加一条 sentinel 查询,用于标记该任务输出的结束。\n *\n * @param {string} sql - 要执行的 SQL 语句(已规范化时设 skipNormalize=true)\n * @param {string} token - 唯一 sentinel token\n * @param {{ skipNormalize?: boolean }} [options]\n * @returns {string} 追加了 sentinel 查询后的完整载荷\n */\nexport function buildPayload(sql, token, { skipNormalize = false } = {}) {\n\tconst normalized = skipNormalize ? sql : normalizeSQL(sql);\n\tconst suffix = normalized.endsWith(\";\") ? \"\" : \";\";\n\t// 模板字面量在 V8 中会优化为 join,保持原状即可\n\treturn `${normalized}${suffix}\\nSELECT '${token}' AS ${TOKEN_COLUMN};\\n`;\n}\n\n/**\n * 判断 SQL 是否为事务控制语句(BEGIN / COMMIT / ROLLBACK)。\n * WAL batch 不应包裹事务控制语句,否则会破坏事务嵌套层级。\n * @param {string} sql\n * @returns {boolean}\n */\nfunction isTransactionControl(sql) {\n\t// sql 经过 normalizeSQL 后关键词大小写不变;首 charCodeAt 快速失败避免字符串分配。\n\t// 若首字母不是 B/C/R(事务关键字),直接返回 false。\n\tconst f = sql.charCodeAt(0);\n\tif (f === 66 || f === 98) {\n\t\treturn sql === \"BEGIN\" || sql === \"BEGIN;\" || sql.startsWith(\"BEGIN \") || sql.startsWith(\"BEGIN;\");\n\t}\n\tif (f === 67 || f === 99) {\n\t\treturn sql === \"COMMIT\" || sql === \"COMMIT;\" || sql.startsWith(\"COMMIT \") || sql.startsWith(\"COMMIT;\");\n\t}\n\tif (f === 82 || f === 114) {\n\t\treturn sql === \"ROLLBACK\" || sql === \"ROLLBACK;\" || sql.startsWith(\"ROLLBACK \") || sql.startsWith(\"ROLLBACK;\");\n\t}\n\treturn false;\n}\n\n/**\n * 将一批任务合并为单个发送给 sqlite3 进程的载荷字符串。\n * 由 PipelineEngine 和 TaskWorker 共享,避免 25 行重复 payload 构建逻辑。\n *\n * 如果全是 execute 类型且数量 > 1,自动使用 WAL 批量优化:\n * 将多条 INSERT/UPDATE 用 BEGIN/COMMIT 包裹,每条语句后紧跟其 sentinel token。\n *\n * ★ WAL batch sentinel 交错模式\n * 传统格式将所有 SQL 放在一起、所有 sentinel 放在末尾(`BEGIN; T1; T2; COMMIT; tok1; tok2`),\n * 这导致最后一条 SQL 的 sentinel 要等前面所有 SQL 执行完才到达,而全部任务的 startTime\n * 都在 pump 时统一设置,因此后面任务的 elapsed 会累积前面任务的执行时间,在大量 SQL\n * 场景下容易误触超时。\n *\n * 新格式将 sentinel 交错在每条 SQL 之后(`BEGIN; T1; tok1; T2; tok2; COMMIT`),\n * 使得每条 SQL 的 sentinel 紧随其自身执行完毕即到达。结合 handleParsedValue 中\n * 对 next inflight task 的 startTime 前移机制,确保每条任务的 timeout 倒计时\n * 只计算其自身的执行时间,而非 batch 中前面所有任务的累积时间。\n *\n * WAL batch 会自动跳过事务控制语句(BEGIN / COMMIT / ROLLBACK),\n * 避免 BEGIN/COMMIT 被 WAL batch 的 BEGIN/COMMIT 再次包裹导致事务嵌套异常。\n *\n * @param {Array<{ kind: string, sql: string, token: string }>} batch\n * @returns {string}\n */\nexport function buildBatchPayload(batch) {\n\tconst useWalBatch = batch.length > 1 && batch.every((t) => t.kind === \"execute\" && !isTransactionControl(t.sql));\n\tif (useWalBatch) {\n\t\tconst parts = [\"BEGIN;\\n\"];\n\t\tfor (const task of batch) {\n\t\t\tparts.push(task.sql, \"\\n\");\n\t\t\tparts.push(`SELECT '${task.token}' AS ${TOKEN_COLUMN};\\n`);\n\t\t}\n\t\tparts.push(\"COMMIT;\\n\");\n\t\treturn parts.join(\"\");\n\t}\n\n\tconst parts = [];\n\tfor (const task of batch) {\n\t\tparts.push(buildPayload(task.sql, task.token, { skipNormalize: true }));\n\t}\n\treturn parts.join(\"\");\n}\n\nconst TC_FIRST_CHAR = TOKEN_COLUMN.charCodeAt(0);\n\n/**\n * 构建 sentinel 字符串,供 isSentinelRaw 直接比较。\n * 每任务调用一次(而非每 JSON 值),消除模板字符串重复分配。\n * @param {string} token\n * @returns {string}\n */\nfunction buildSentinelStr(token) {\n\treturn `[{\"${TOKEN_COLUMN}\":\"${token}\"}]`;\n}\n\n/**\n * 通过原始字符串模式检测 sentinel 行,避免 JSON.parse。\n * sentinel 原始格式固定为 [{\"__sqlite_executor_token__\":\"TOKEN\"}],\n * token 由 crypto.randomUUID() 生成(hex UUID,不含特殊 JSON 字符),\n * 因此精确字符串匹配即可安全判断。\n *\n * 哨兵字符串在 isSentinelRaw 内部按需构建;外部调用只需传入 token。\n * fast path 首先检查第 4 个字符是否匹配列名首字符,不匹配则快速返回 false。\n *\n * @param {string} raw - 流式解析器提取的原始 JSON 文本\n * @param {string} token - 当前任务的唯一 token\n * @returns {boolean}\n */\nexport function isSentinelRaw(raw, token) {\n\treturn raw.charCodeAt(3) === TC_FIRST_CHAR && raw === buildSentinelStr(token);\n}\n\n/**\n * 检查解析出的 JSON 行是否为当前任务的 sentinel 结束标记行。\n *\n * @param {unknown} value - 已解析的 JSON 值\n * @param {string} token - 当前任务的唯一 token\n * @returns {boolean}\n */\nexport function isSentinelRow(value, token) {\n\treturn Array.isArray(value) && value.length === 1 && value[0]?.[TOKEN_COLUMN] === token;\n}\n","import { settleTask, collectQueryRows, processStreamRows } from \"./settleUtils.js\";\nimport { isSentinelRaw, isSentinelRow, buildBatchPayload } from \"./protocol.js\";\nimport { toError } from \"./parser.js\";\nimport { createTimeoutError } from \"../utils/timeout.js\";\n\n/**\n * 批量结算 pendingFinalize 集合中的所有任务。\n * 由 scheduleFinalizeCheck 的 setImmediate 回调调用。\n *\n * 在结算前排空 pendingStderr 缓冲,将之前无法归因的 stderr\n * 通过零行归因机制正确分配到失败的任务上。\n *\n * @param {Set<object>} tasks - pendingFinalizeTasks 集合\n * @param {(task: object, error: Error | null, value: any) => void} settle\n * @param {() => void} pumpQueue\n * @param {string[]} [pendingStderr] - 待处理的 stderr 缓冲\n */\nexport function finalizePendingTasks(tasks, settle, pumpQueue, pendingStderr, inflight) {\n\tconst hasStderrBuffer = pendingStderr && pendingStderr.length > 0;\n\t// 排空 pendingStderr 缓冲,尝试零行归因\n\tif (hasStderrBuffer) {\n\t\tfor (const chunk of pendingStderr) {\n\t\t\tfor (const t of tasks) {\n\t\t\t\t// 归因给所有零行 query 任务(可能有多个失败 SQL 在同一 batch)\n\t\t\t\tif (t.kind === \"query\" && t.rows.length === 0) {\n\t\t\t\t\tt.stderrText += chunk;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// 仅当无更多 inflight 任务时才清除缓冲(否则保留以供后续零行任务使用)\n\t\tif (!inflight || inflight.count === 0) {\n\t\t\tpendingStderr.length = 0;\n\t\t}\n\t}\n\n\tfor (const task of tasks) {\n\t\tif (task.stderrText) {\n\t\t\tsettle(task, new Error(task.stderrText.trim()), undefined);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (task.consumerError) {\n\t\t\tsettle(task, task.consumerError, undefined);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (task.kind === \"query\") {\n\t\t\tsettle(task, null, task.rows);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsettle(task, null, undefined);\n\t}\n\n\ttasks.clear();\n\tpumpQueue();\n}\n\n/**\n * 处理单任务超时:防重复结算、清除定时器、更新指标、创建超时错误。\n *\n * @param {object} task\n * @param {import(\"./metrics.js\").Metrics | null | undefined} metrics\n * @returns {Error | null} 已创建的 TimeoutError,若任务已结算则返回 null\n */\nexport function prepareTaskTimeout(task, metrics) {\n\tif (task.settled) return null;\n\ttask.timedout = true;\n\tmetrics?.incrementTasksTimeout();\n\treturn createTimeoutError(task.timeout, task.sql, task.startTime);\n}\n\n/**\n * 创建 sweep 定时器管理器。\n * schedule() 启动定期扫描,检查 inflight 任务是否超时;\n * clear() 停止定时器。\n *\n * @param {{\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * sweepIntervalMs: number,\n * handleTaskTimeout: (task: object) => void,\n * }} params\n * @returns {{ schedule: () => void, clear: () => void, getSweepTimer: () => (number | null) }}\n */\nexport function createSweeper({ inflight, sweepIntervalMs, handleTaskTimeout }) {\n\tlet sweepTimer = null;\n\tconst schedule = () => {\n\t\tif (sweepTimer) return;\n\t\tsweepTimer = setTimeout(() => {\n\t\t\tsweepTimer = null;\n\t\t\tconst now = performance.now();\n\t\t\tinflight.forEach((task) => {\n\t\t\t\tif (now - task.startTime > task.timeout) {\n\t\t\t\t\thandleTaskTimeout(task);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (inflight.count > 0) {\n\t\t\t\tschedule();\n\t\t\t}\n\t\t}, sweepIntervalMs).unref();\n\t};\n\tconst clear = () => {\n\t\tclearTimeout(sweepTimer);\n\t\tsweepTimer = null;\n\t};\n\treturn { schedule, clear, getSweepTimer: () => sweepTimer };\n}\n\n/**\n * 创建 pendingFinalize 结算调度器。\n * 通过 setImmediate 延迟执行 finalizePendingTasks,给 stderr chunk 到达的时间窗口。\n * 无错误信息的零行 query 会额外等待一轮,避免 stdout sentinel 先于 stderr 到达时误报成功。\n *\n * @param {{\n * pendingFinalizeTasks: Set<object>,\n * settleTask: (task: object, error: Error | null, value: any) => void,\n * pumpQueue: () => void,\n * pendingStderr?: string[],\n * inflight?: import(\"./inflightTracker.js\").InflightTracker,\n * }} params\n * @returns {() => void}\n */\nexport function createFinalizeScheduler({ pendingFinalizeTasks, settleTask: settle, pumpQueue, pendingStderr, inflight }) {\n\tlet scheduled = false;\n\tlet immediate = null;\n\tlet cancelled = false;\n\tconst delayedZeroRowQueries = new WeakSet();\n\tconst cancel = () => {\n\t\tcancelled = true;\n\t\tif (immediate) {\n\t\t\tclearImmediate(immediate);\n\t\t\timmediate = null;\n\t\t}\n\t};\n\tconst check = () => {\n\t\tif (cancelled) return;\n\t\tif (scheduled) return;\n\t\tif (pendingFinalizeTasks.size === 0) return;\n\t\tscheduled = true;\n\t\timmediate = setImmediate(() => {\n\t\t\timmediate = null;\n\t\t\tif (cancelled) return;\n\n\t\t\tconst delayedTasks = [];\n\t\t\tconst hasQueryRows = Array.from(pendingFinalizeTasks).some(\n\t\t\t\t(task) => task.kind === \"query\" && task.rows.length > 0,\n\t\t\t);\n\t\t\tif (!pendingStderr?.length && hasQueryRows) {\n\t\t\t\tfor (const task of pendingFinalizeTasks) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttask.kind === \"query\"\n\t\t\t\t\t\t&& task.rows.length === 0\n\t\t\t\t\t\t&& !task.stderrText\n\t\t\t\t\t\t&& !task.consumerError\n\t\t\t\t\t\t&& !delayedZeroRowQueries.has(task)\n\t\t\t\t\t) {\n\t\t\t\t\t\tdelayedZeroRowQueries.add(task);\n\t\t\t\t\t\tdelayedTasks.push(task);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const task of delayedTasks) {\n\t\t\t\t\tpendingFinalizeTasks.delete(task);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfinalizePendingTasks(pendingFinalizeTasks, settle, pumpQueue, pendingStderr, inflight);\n\t\t\tfor (const task of delayedTasks) {\n\t\t\t\tpendingFinalizeTasks.add(task);\n\t\t\t}\n\t\t\tscheduled = false;\n\t\t\tif (delayedTasks.length > 0) check();\n\t\t});\n\t};\n\tcheck.cancel = cancel;\n\treturn check;\n}\n\n/**\n * 处理一个完整的 JSON 值(来自 sharedValueParser)。\n * 匹配 sentinel token、收集 query 行数据、触发 stream 回调。\n * PipelineEngine 和 TaskWorker 共享此逻辑。\n *\n * @param {string} raw - 原始 JSON 文本\n * @param {import(\"./inflightTracker.js\").InflightTracker} inflight\n * @param {{\n * afterSentinel: (task: object) => void,\n * rejectAll: (error: Error) => void,\n * }} callbacks\n */\n/**\n * sentinel 到达时将下一个 inflight 任务的 startTime 前移到当前时间,\n * 防止该任务的超时倒计时累积前面任务的执行等待时间。\n *\n * 在大量 SQL 执行场景下,后续任务虽然 SQL 很快,但可能因前面排队任务的\n * 累积执行时间而误触 timeout。此回调确保每个任务的 timeout 从\"前一个任务\n * 完成时刻\"开始计算,而非从\"整批写入 stdin 的时刻\"。\n *\n * @param {import(\"./inflightTracker.js\").InflightTracker} inflight\n */\nfunction advanceNextInflightStartTime(inflight) {\n\tconst next = inflight.first;\n\tif (next && next.startTime > 0) {\n\t\tconst now = performance.now();\n\t\tif (now > next.startTime) {\n\t\t\tnext.startTime = now;\n\t\t}\n\t}\n}\n\nexport function handleParsedValue(raw, inflight, { afterSentinel, rejectAll }) {\n\tconst task = inflight.first;\n\tif (!task) return;\n\n\t// Fast path: 原始字符串精确匹配 sentinel,跳过 JSON.parse\n\tif (isSentinelRaw(raw, task.token)) {\n\t\tinflight.shift();\n\t\tadvanceNextInflightStartTime(inflight);\n\t\tafterSentinel(task);\n\t\treturn;\n\t}\n\n\t// Fast path: 空数组 [],execute 的零行结果,跳过 JSON.parse\n\tif (raw === \"[]\") return;\n\n\tlet parsed;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\trejectAll(new Error(`Invalid JSON from sqlite3: ${toError(error).message}`));\n\t\treturn;\n\t}\n\n\tif (isSentinelRow(parsed, task.token)) {\n\t\tinflight.shift();\n\t\tadvanceNextInflightStartTime(inflight);\n\t\tafterSentinel(task);\n\t\treturn;\n\t}\n\n\tif (task.timedout) return;\n\n\tif (task.kind === \"query\") {\n\t\tcollectQueryRows(task, parsed);\n\t\treturn;\n\t}\n\n\tif (task.kind === \"stream\") {\n\t\tprocessStreamRows(task, parsed);\n\t}\n}\n\n/**\n * 创建一个泵送(pump)函数,将队列中的任务批量发送给 sqlite3 进程。\n *\n * PipelineEngine 和 TaskWorker 共享此工厂,消除 #pumpQueue 方法的重复。\n * 调用方可通过 active 守卫(可选)控制是否允许泵送。\n *\n * @param {{\n * queue: import(\"./queue.js\").Queue,\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * processManager: { draining: boolean, write: (data: string) => void, onDrained: (cb: () => void) => void },\n * sweeper: { schedule: () => void },\n * batchSize: number,\n * maxInflight: number,\n * }} params\n * @returns {() => void} 泵送函数,调用后尝试从队列取出 batch 发送\n */\nexport function createPumpQueue({ queue, inflight, processManager, sweeper, batchSize, maxInflight }) {\n\tlet nextBatchId = 1;\n\treturn function pump() {\n\t\tif (processManager.draining) {\n\t\t\tprocessManager.onDrained(() => pump());\n\t\t\treturn;\n\t\t}\n\t\tif (inflight.count >= maxInflight) return;\n\n\t\tconst batch = [];\n\t\twhile (batch.length < batchSize && !queue.isEmpty() && inflight.count + batch.length < maxInflight) {\n\t\t\tconst task = queue.peek();\n\t\t\tif (task.kind === \"stream\" && (batch.length > 0 || inflight.count > 0)) break;\n\t\t\tqueue.dequeue();\n\t\t\tbatch.push(task);\n\t\t}\n\t\tif (batch.length === 0) return;\n\n\t\tconst now = performance.now();\n\t\tconst payload = buildBatchPayload(batch);\n\t\tconst batchId = nextBatchId++;\n\t\tconst useWalBatch = payload.startsWith(\"BEGIN;\");\n\n\t\tfor (const task of batch) {\n\t\t\ttask.startTime = now;\n\t\t\ttask.batchId = batchId;\n\t\t\ttask.walBatch = useWalBatch;\n\t\t}\n\t\tinflight.push(...batch);\n\t\tsweeper.schedule();\n\t\tprocessManager.write(payload);\n\t};\n}\n\n/**\n * 处理 sentinel token 命中后的任务结算。\n *\n * 此函数提取自 PipelineEngine.#afterSentinel 和 TaskWorker.#afterSentinel,\n * 消除二者间的逻辑重复。统一使用延迟结算策略:\n * - timedout 任务直接跳过(不结算,数据已丢弃)\n * - consumerError 任务立即 reject(用户主动错误无需等待)\n * - 其他任务进入 pendingFinalize 延迟一帧,给 stderr chunk 留到达时间\n *\n * @param {object} task - 已从 inflight shift 的任务\n * @param {{\n * settleTask: (task: object, error: Error | null, value: any) => void,\n * pendingFinalizeTasks: Set<object>,\n * scheduleFinalizeCheck: () => void,\n * pumpQueue: () => void,\n * }} params\n */\nexport function handleSentinelTask(task, { settleTask, pendingFinalizeTasks, scheduleFinalizeCheck, pumpQueue }) {\n\tif (task.timedout) {\n\t\tpumpQueue();\n\t\treturn;\n\t}\n\n\tif (task.consumerError) {\n\t\tsettleTask(task, task.consumerError, undefined);\n\t\tpumpQueue();\n\t\treturn;\n\t}\n\n\t// 无论 stderrText 是否为空,都走 pendingFinalize 延迟结算。\n\t// 原因:Windows 上 sqlite3 的 stderr 输出可能被 OS pipe 拆分为多个 chunk,\n\t// 若在此处立即 reject,后续到达的 stderr chunk 会丢失或被错误地配给下一个 inflight 任务。\n\tpendingFinalizeTasks.add(task);\n\tscheduleFinalizeCheck();\n\tpumpQueue();\n}\n\n/**\n * 处理 sqlite3 的 stderr 输出,将其归因到合适的任务。\n *\n * 提取自 PipelineEngine.handleStderrChunk 和 TaskWorker.#handleStderrChunk,\n * 统一采用 PipelineEngine 的精细归因策略:\n * 1. 零行归因 — pendingFinalize 中 rows.length === 0 的 query 极可能是失败源\n * 2. WAL batch — 整个事务回滚,传播到 batch 内所有任务\n * 3. 非 WAL batch(多任务) — 无法确定来源时缓冲到 pendingStderr,由后续\n * finalizePendingTasks 中的零行归因机制正确归因,避免 stderr 错误地\n * 归因给第一个 inflight 任务(#1957 随机测试报错修复)\n * 4. 非 WAL batch(单任务或 primary 为 pendingFinalize)— 归因给该任务\n *\n * @param {string} chunk - stderr 文本块\n * @param {{\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * pendingFinalizeTasks: Set<object>,\n * logger?: { error?: (msg: string) => void },\n * pendingStderr?: string[],\n * hasFinalizedZeroRowQuery?: boolean,\n * }} params\n */\nexport function handleStderrChunk(chunk, { inflight, pendingFinalizeTasks, logger, pendingStderr, hasFinalizedZeroRowQuery }) {\n\tconst inflightFirst = inflight.first;\n\tconst firstPending = pendingFinalizeTasks.values().next().value;\n\n\t// ── 零行归因(优先)──\n\t// sqlite3 对失败 SQL 只输出 stderr 不输出数据行。\n\t// pendingFinalize 中 rows.length === 0 的 query 全部可能是失败源。\n\t// 此 stderr chunk 归因给所有零行任务(而非仅第一个匹配),\n\t// 确保 batch 中所有失败任务都收到错误消息。\n\tlet zeroRowMatch = false;\n\tfor (const t of pendingFinalizeTasks) {\n\t\tif (t.kind === \"query\" && t.rows.length === 0) {\n\t\t\tt.stderrText += chunk;\n\t\t\tzeroRowMatch = true;\n\t\t}\n\t}\n\tif (zeroRowMatch) return;\n\n\t// ── 选择 primary 任务 ──\n\tconst task = inflightFirst ?? firstPending;\n\n\tif (!task) {\n\t\tlogger?.error?.(chunk.trim());\n\t\treturn;\n\t}\n\n\t// ── 非 batch 任务(standalone):直接归因 ──\n\tif (task.batchId == null) {\n\t\ttask.stderrText += chunk;\n\t\treturn;\n\t}\n\n\t// ── WAL batch:整个事务回滚,所有任务受影响 ──\n\tif (task.walBatch) {\n\t\ttask.stderrText += chunk;\n\t\tfor (const t of pendingFinalizeTasks) {\n\t\t\tif (t !== task) t.stderrText += chunk;\n\t\t}\n\t\tinflight.forEach((t) => {\n\t\t\tif (t !== task) t.stderrText += chunk;\n\t\t});\n\t\treturn;\n\t}\n\n\t// ── 非 WAL batch ──\n\tif (task === inflightFirst) {\n\t\tif (inflight.count > 1) {\n\t\t\t// 多个活跃 inflight 任务:无法确定 stderr 来源。\n\t\t\t// 缓冲,由 finalizePendingTasks 中的零行归因正确匹配。\n\t\t\tpendingStderr?.push(chunk);\n\t\t} else if (pendingFinalizeTasks.size > 0) {\n\t\t\t// 唯一 inflight 任务 + 存在 pending 任务。\n\t\t\t// 检查 pending 中是否有零行 query(可能来自已完成任务的 stderr)。\n\t\t\tlet hasZeroRowQuery = false;\n\t\t\tfor (const t of pendingFinalizeTasks) {\n\t\t\t\tif (t.kind === \"query\" && t.rows.length === 0) {\n\t\t\t\t\thasZeroRowQuery = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasZeroRowQuery) {\n\t\t\t\t// 有零行 query:缓冲,由 finalizePendingTasks 正确归因\n\t\t\t\tpendingStderr?.push(chunk);\n\t\t\t} else if (task.kind === \"query\" && task.rows.length > 0) {\n\t\t\t\t// inflight 任务已有数据行:它是合法查询,stderr 不来自它。\n\t\t\t\tlogger?.error?.(chunk.trim());\n\t\t\t} else if (task.kind === \"query\" && task.rows.length === 0) {\n\t\t\t\t// inflight query 尚无数据行 —— 根据标志位判断 stderr 来源:\n\t\t\t\t// hasFinalizedZeroRowQuery=true → 来自已结算的上一批任务(延迟 stderr #1957)\n\t\t\t\t// hasFinalizedZeroRowQuery=false → 来自当前 inflight 任务(即时归因)\n\t\t\t\tif (hasFinalizedZeroRowQuery) {\n\t\t\t\t\tpendingStderr?.push(chunk);\n\t\t\t\t} else {\n\t\t\t\t\ttask.stderrText += chunk;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 唯一 inflight 任务,pending 中无零行 query:\n\t\t\t\t// stderr 只能来自该 inflight 任务(execute)。\n\t\t\t\ttask.stderrText += chunk;\n\t\t\t}\n\t\t} else if (task.kind === \"query\" && task.rows.length > 0) {\n\t\t\t// 唯一的 inflight 任务已有数据行:它是合法查询,stderr 不来自它。\n\t\t\tlogger?.error?.(chunk.trim());\n\t\t} else if (task.kind === \"query\" && task.rows.length === 0) {\n\t\t\t// 唯一的 inflight query 尚无数据行 —— 根据标志位判断:\n\t\t\t// hasFinalizedZeroRowQuery=true → 来自已结算的上一批任务(延迟 stderr #1957)\n\t\t\t// hasFinalizedZeroRowQuery=false → 来自当前 inflight 任务(即时归因)\n\t\t\tif (hasFinalizedZeroRowQuery) {\n\t\t\t\tpendingStderr?.push(chunk);\n\t\t\t} else {\n\t\t\t\ttask.stderrText += chunk;\n\t\t\t}\n\t\t} else {\n\t\t\t// 唯一的 inflight 任务,无其他待结算任务:可以安全归因\n\t\t\ttask.stderrText += chunk;\n\t\t}\n\t\treturn;\n\t}\n\n\t// ── Primary 是 pendingFinalize 任务(无 inflight)──\n\t// 没有零行 query 来匹配 stderr。此时 stderr 可能来自某个 execute 任务。\n\t// 保守地归因给所有 pendingFinalize 任务(恢复旧行为兜底)。\n\tfor (const t of pendingFinalizeTasks) {\n\t\tt.stderrText += chunk;\n\t}\n}\n\n/**\n * 拒绝所有待处理任务(inflight、队列、pendingFinalize)。\n *\n * 提取自 PipelineEngine.rejectAll 和 TaskWorker.#rejectAll,\n * 消除二者间的逻辑重复。调用方负责清理各自特有的资源\n * (如 sharedValueParser.reset() 或 sweeper.clear())。\n *\n * @param {{\n * inflight: import(\"./inflightTracker.js\").InflightTracker,\n * queue: import(\"./queue.js\").Queue,\n * pendingFinalizeTasks: Set<object>,\n * settleTask: (task: object, error: Error | null, value: any) => void,\n * error: Error,\n * }} params\n */\nexport function rejectAllTasks({ inflight, queue, pendingFinalizeTasks, settleTask, error }) {\n\t// 1. 取走并清空 inflight\n\tconst all = inflight.toArray();\n\tinflight.clear();\n\n\t// 2. 结算队列中的任务(尚未发送)\n\tlet queued = queue.dequeue();\n\twhile (queued) {\n\t\tsettleTask(queued, error, undefined);\n\t\tqueued = queue.dequeue();\n\t}\n\n\t// 3. 结算 inflight 任务(正在执行)\n\tfor (const task of all) {\n\t\tsettleTask(task, error, undefined);\n\t}\n\n\t// 4. 结算 pendingFinalize 任务(等待延迟结算)\n\tfor (const task of pendingFinalizeTasks) {\n\t\tsettleTask(task, error, undefined);\n\t}\n\tpendingFinalizeTasks.clear();\n}\n","import { ProcessManager } from \"./process.js\";\nimport { Queue } from \"./queue.js\";\nimport { InflightTracker } from \"./inflightTracker.js\";\nimport { createJsonValueParser, toError } from \"./parser.js\";\nimport { settleTask } from \"./settleUtils.js\";\nimport { handleParsedValue, createSweeper, createFinalizeScheduler, createPumpQueue, rejectAllTasks, prepareTaskTimeout, handleSentinelTask, handleStderrChunk } from \"./pipelineUtils.js\";\nimport { DEFAULT_BATCH_SIZE, DEFAULT_MAX_INFLIGHT } from \"../constants.js\";\n\n/**\n * 单个 sqlite3 进程的任务执行器。\n * 内部维护 pending 和 inflight 两个队列,支持管线化(pipelining):\n * 多个任务的 SQL payload 合并为一次 stdin.write() 发送,由 sqlite3 顺序执行后,\n * 在 stdout 解析时按 FIFO 顺序匹配 sentinel token 并逐一完成 Promise。\n *\n * TaskWorker 不关心任务是读还是写——它只负责发送 SQL、解析输出、完成 Promise。\n * 由上层(SQLiteExecutor / ReaderPool)决定如何分发任务。\n */\nexport class TaskWorker {\n\t#processManager;\n\t#pendingQueue = new Queue();\n\t#inflight = new InflightTracker();\n\t#pendingFinalizeTasks = new Set();\n\t#valueParser;\n\t#statementTimeout;\n\t#logger;\n\t#name;\n\t#batchSize;\n\t#maxInflight;\n\t#metrics;\n\t#sweeper;\n\t/** 由 createFinalizeScheduler 创建的闭包,替代 #scheduleFinalizeCheck 方法 */\n\t#scheduleFinalizeCheck;\n\t/** 由 createPumpQueue 创建的泵送函数 */\n\t#pump;\n\n\t/** 多任务非 WAL batch 中无法立即归因的 stderr 缓冲 */\n\t#pendingStderr = [];\n\n\t/**\n\t * @param {{\n\t * binary: string\n\t * database: string\n\t * statementTimeout: number\n\t * logger?: import(\"../index.js\").Logger\n\t * name?: string\n\t * initMode?: \"wal\" | \"none\"\n\t * batchSize?: number\n\t * metrics?: import(\"./metrics.js\").Metrics\n\t * sweepInterval?: number\n\t * }} options\n\t */\n\tconstructor({ binary, database, statementTimeout, logger, name, initMode, batchSize = DEFAULT_BATCH_SIZE, maxInflight = DEFAULT_MAX_INFLIGHT, metrics, sweepInterval = 100 }) {\n\t\tthis.#name = name ?? \"worker\";\n\t\tthis.#statementTimeout = statementTimeout;\n\t\tthis.#logger = logger;\n\t\tthis.#batchSize = batchSize;\n\t\tthis.#maxInflight = maxInflight;\n\t\tthis.#metrics = metrics;\n\n\t\t// 创建共享管道组件\n\t\t// ProcessManager 需在其他管道组件之前创建,因为 createPumpQueue 依赖它\n\t\tthis.#processManager = new ProcessManager({ binary, database, initMode });\n\t\tthis.#processManager.setOnDrainCallback(() => this.#pumpQueue());\n\n\t\tthis.#sweeper = createSweeper({\n\t\t\tinflight: this.#inflight,\n\t\t\tsweepIntervalMs: sweepInterval,\n\t\t\thandleTaskTimeout: (task) => {\n\t\t\t\tconst error = prepareTaskTimeout(task, this.#metrics);\n\t\t\t\tif (error) this.#settleTask(task, error, undefined);\n\t\t\t},\n\t\t});\n\t\tthis.#pump = createPumpQueue({\n\t\t\tqueue: this.#pendingQueue,\n\t\t\tinflight: this.#inflight,\n\t\t\tprocessManager: this.#processManager,\n\t\t\tsweeper: this.#sweeper,\n\t\t\tbatchSize: this.#batchSize,\n\t\t\tmaxInflight: this.#maxInflight,\n\t\t});\n\t\tthis.#scheduleFinalizeCheck = createFinalizeScheduler({\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t\tinflight: this.#inflight,\n\t\t});\n\t\tthis.#valueParser = createJsonValueParser((raw) => {\n\t\t\thandleParsedValue(raw, this.#inflight, {\n\t\t\t\tafterSentinel: (task) => this.#afterSentinel(task),\n\t\t\t\trejectAll: (error) => this.#rejectAll(error),\n\t\t\t});\n\t\t});\n\t\tthis.#startProcess();\n\t}\n\n\tget name() {\n\t\treturn this.#name;\n\t}\n\n\tget idle() {\n\t\treturn this.#inflight.count === 0 && this.#pendingQueue.isEmpty() && this.#pendingFinalizeTasks.size === 0;\n\t}\n\n\tget pendingStatements() {\n\t\treturn this.#pendingQueue.size + this.#inflight.count + this.#pendingFinalizeTasks.size;\n\t}\n\n\t/**\n\t * 接收一个任务配置并加入队列。\n\t * 任务配置应包含:kind, sql, timeout, token, resolve, reject, onRow\n\t * @param {object} config\n\t */\n\tenqueue(config) {\n\t\tconst task = {\n\t\t\tkind: config.kind,\n\t\t\tsql: config.sql,\n\t\t\ttimeout: config.timeout,\n\t\t\ttoken: config.token,\n\t\t\tresolve: config.resolve,\n\t\t\treject: config.reject,\n\t\t\trows: config.kind === \"query\" ? [] : undefined,\n\t\t\tonRow: config.onRow ?? null,\n\t\t\tconsumerError: null,\n\t\t\tstderrText: \"\",\n\t\t\tsettled: false,\n\t\t\tstartTime: 0,\n\t\t};\n\t\tthis.#metrics?.incrementTasksTotal(config.kind);\n\t\tthis.#pendingQueue.enqueue(task);\n\t\tthis.#pumpQueue();\n\t}\n\n\t/** 测试用:获取扫制定时器引用。 */\n\tget _sweepTimer() {\n\t\treturn this.#sweeper?.getSweepTimer() ?? null;\n\t}\n\n\t/** 测试用:获取底层子进程引用。 */\n\tget _process() {\n\t\treturn this.#processManager.process;\n\t}\n\n\t/** 终止进程并清理。 */\n\tkill() {\n\t\tthis.#sweeper.clear();\n\t\tthis.#scheduleFinalizeCheck.cancel?.();\n\t\tthis.#rejectAll(new Error(`${this.#name} is killed`));\n\t\tthis.#processManager.kill();\n\t}\n\n\t// ---- 内部 ----\n\n\t#startProcess() {\n\t\tconst proc = this.#processManager.start();\n\n\t\tproc.stdout.on(\"data\", (chunk) => {\n\t\t\tthis.#valueParser.feed(chunk);\n\t\t});\n\n\t\tproc.stderr.on(\"data\", (chunk) => {\n\t\t\tthis.#handleStderrChunk(chunk);\n\t\t});\n\n\t\tproc.on(\"error\", (error) => {\n\t\t\tif (this.#processManager.process !== proc) return;\n\t\t\tthis.#logger?.error?.(`${this.#name} process error`, error);\n\t\t\tthis.#rejectAll(toError(error));\n\t\t});\n\n\t\tproc.on(\"close\", (code, signal) => {\n\t\t\tif (this.#processManager.process !== proc) return;\n\t\t\tconst err = new Error(`${this.#name} exited unexpectedly (code=${code}, signal=${signal ?? \"none\"})`);\n\t\t\tthis.#rejectAll(err);\n\t\t});\n\t}\n\n\t/**\n\t * 从 pendingQueue 中取出最多 batchSize 个任务,合并 payload 后一次性写入 stdin。\n\t * 实际逻辑委托给 this.#pump(由 createPumpQueue 创建)。\n\t */\n\t#pumpQueue() {\n\t\tthis.#pump();\n\t}\n\n\t/** sentinel token 命中后的统一处理逻辑(委托给共享函数)。 */\n\t#afterSentinel(task) {\n\t\thandleSentinelTask(task, {\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tscheduleFinalizeCheck: () => this.#scheduleFinalizeCheck(),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t});\n\t}\n\n\t#handleStderrChunk(chunk) {\n\t\thandleStderrChunk(chunk, {\n\t\t\tinflight: this.#inflight,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tlogger: this.#logger,\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t});\n\t}\n\n\t#settleTask(task, error, value) {\n\t\tsettleTask(task, error, value, this.#metrics);\n\t}\n\n\t#rejectAll(error) {\n\t\tthis.#sweeper.clear();\n\t\trejectAllTasks({\n\t\t\tinflight: this.#inflight,\n\t\t\tqueue: this.#pendingQueue,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\terror,\n\t\t});\n\t}\n}\n","import { TaskWorker } from \"./taskWorker.js\";\n\n/**\n * 读取器连接池。\n * 维护多个 TaskWorker 实例,每个连接一个独立的 sqlite3 进程。\n * 通过 round-robin 分发只读任务,实现并发读取。\n */\nexport class ReaderPool {\n\t#workers = [];\n\t#rrIndex = 0;\n\n\t/**\n\t * @param {{\n\t * binary: string\n\t * database: string\n\t * poolSize: number\n\t * statementTimeout: number\n\t * logger?: import(\"../index.js\").Logger\n\t * metrics?: import(\"./metrics.js\").Metrics\n\t * }} options\n\t */\n\tconstructor({ binary, database, poolSize, statementTimeout, logger, metrics }) {\n\t\tif (poolSize < 1) throw new RangeError(\"poolSize must be >= 1\");\n\t\tfor (let i = 0; i < poolSize; i++) {\n\t\t\tconst worker = new TaskWorker({\n\t\t\t\tbinary,\n\t\t\t\tdatabase,\n\t\t\t\tstatementTimeout,\n\t\t\t\tlogger,\n\t\t\t\tmetrics,\n\t\t\t\tname: `reader-${i}`,\n\t\t\t\tinitMode: database !== \":memory:\" ? \"none\" : \"none\",\n\t\t\t});\n\t\t\tthis.#workers.push(worker);\n\t\t}\n\t}\n\n\tget size() {\n\t\treturn this.#workers.length;\n\t}\n\n\tget pendingStatements() {\n\t\treturn this.#workers.reduce((sum, w) => sum + w.pendingStatements, 0);\n\t}\n\n\t/**\n\t * Least Busy 选择一个 reader 并执行任务。\n\t * 比较所有 worker 的 pendingStatements,选负载最小的。\n\t * 负载相同时按 round-robin 选,确保公平性。\n\t * @param {object} task\n\t */\n\tenqueue(task) {\n\t\tlet minLoad = Infinity;\n\t\tconst candidates = [];\n\t\tfor (let i = 0; i < this.#workers.length; i++) {\n\t\t\tconst load = this.#workers[i].pendingStatements;\n\t\t\tif (load < minLoad) {\n\t\t\t\tminLoad = load;\n\t\t\t\tcandidates.length = 0;\n\t\t\t\tcandidates.push(i);\n\t\t\t} else if (load === minLoad) {\n\t\t\t\tcandidates.push(i);\n\t\t\t}\n\t\t}\n\t\tconst idx = candidates[this.#rrIndex % candidates.length];\n\t\tthis.#rrIndex = (this.#rrIndex + 1) >>> 0;\n\t\tthis.#workers[idx].enqueue(task);\n\t}\n\n\t/** 测试用:获取内部 worker 列表。 */\n\tget _workers() {\n\t\treturn this.#workers;\n\t}\n\n\t/** 终止所有 reader 进程。 */\n\tkill() {\n\t\tfor (const worker of this.#workers) {\n\t\t\tworker.kill();\n\t\t}\n\t}\n}\n","/**\n * 轻量级运行时指标收集器。\n * 用于追踪 SQL 执行任务的吞吐、耗时、错误、超时和进程重启。\n *\n * 设计原则:\n * - 仅使用数字计数器,避免高频路径上的对象分配\n * - 所有 increment 方法 O(1)、无 throw\n * - 可被多个 TaskWorker / Executor 共享(通过引用传递)\n */\nexport class Metrics {\n\t#tasksTotal = 0;\n\t#tasksSuccess = 0;\n\t#tasksFailed = 0;\n\t#tasksTimeout = 0;\n\t#processRestarts = 0;\n\t#executeCount = 0;\n\t#queryCount = 0;\n\t#streamCount = 0;\n\t#totalDuration = 0;\n\t#startTime = Date.now();\n\n\tget tasksTotal() {\n\t\treturn this.#tasksTotal;\n\t}\n\n\tget tasksSuccess() {\n\t\treturn this.#tasksSuccess;\n\t}\n\n\tget tasksFailed() {\n\t\treturn this.#tasksFailed;\n\t}\n\n\tget tasksTimeout() {\n\t\treturn this.#tasksTimeout;\n\t}\n\n\tget processRestarts() {\n\t\treturn this.#processRestarts;\n\t}\n\n\tget executeCount() {\n\t\treturn this.#executeCount;\n\t}\n\n\tget queryCount() {\n\t\treturn this.#queryCount;\n\t}\n\n\tget streamCount() {\n\t\treturn this.#streamCount;\n\t}\n\n\t/** 累计任务耗时(毫秒),用于计算 avgQueryTime。 */\n\tget totalDuration() {\n\t\treturn this.#totalDuration;\n\t}\n\n\t/** Metrics 实例的创建时间(Unix 时间戳)。 */\n\tget startTime() {\n\t\treturn this.#startTime;\n\t}\n\n\t/**\n\t * 记录一个任务入队。\n\t * @param {\"execute\" | \"query\" | \"stream\"} kind\n\t */\n\tincrementTasksTotal(kind) {\n\t\tthis.#tasksTotal++;\n\t\tif (kind === \"execute\") this.#executeCount++;\n\t\telse if (kind === \"query\") this.#queryCount++;\n\t\telse if (kind === \"stream\") this.#streamCount++;\n\t}\n\n\t/**\n\t * 记录一个任务成功完成。\n\t * @param {number} duration 实际执行耗时(毫秒)\n\t */\n\tincrementTasksSuccess(duration) {\n\t\tthis.#tasksSuccess++;\n\t\tthis.#totalDuration += duration;\n\t}\n\n\t/** 记录一个任务失败。 */\n\tincrementTasksFailed() {\n\t\tthis.#tasksFailed++;\n\t}\n\n\t/** 记录一个任务超时。 */\n\tincrementTasksTimeout() {\n\t\tthis.#tasksTimeout++;\n\t}\n\n\t/** 记录 sqlite3 进程重启次数。 */\n\tincrementProcessRestarts() {\n\t\tthis.#processRestarts++;\n\t}\n\n\t/**\n\t * 返回当前所有指标的只读快照。\n\t * @returns {{\n\t * tasksTotal: number,\n\t * tasksSuccess: number,\n\t * tasksFailed: number,\n\t * tasksTimeout: number,\n\t * processRestarts: number,\n\t * executeCount: number,\n\t * queryCount: number,\n\t * streamCount: number,\n\t * avgTaskDuration: number,\n\t * throughput: number,\n\t * uptime: number,\n\t * }}\n\t */\n\tsnapshot() {\n\t\tconst elapsed = (Date.now() - this.#startTime) / 1000;\n\t\tlet avgTaskDuration;\n\t\tif (this.#tasksSuccess > 0) avgTaskDuration = this.#totalDuration / this.#tasksSuccess;\n\t\telse avgTaskDuration = 0;\n\t\tlet throughput;\n\t\tif (elapsed > 0) throughput = this.#tasksTotal / elapsed;\n\t\telse throughput = 0;\n\t\treturn {\n\t\t\ttasksTotal: this.#tasksTotal,\n\t\t\ttasksSuccess: this.#tasksSuccess,\n\t\t\ttasksFailed: this.#tasksFailed,\n\t\t\ttasksTimeout: this.#tasksTimeout,\n\t\t\tprocessRestarts: this.#processRestarts,\n\t\t\texecuteCount: this.#executeCount,\n\t\t\tqueryCount: this.#queryCount,\n\t\t\tstreamCount: this.#streamCount,\n\t\t\tavgTaskDuration,\n\t\t\tthroughput,\n\t\t\tuptime: elapsed,\n\t\t};\n\t}\n}\n","import { Queue } from \"./queue.js\";\nimport { settleTask } from \"./settleUtils.js\";\n\n/**\n * 事务作用域管理器。\n *\n * 事务内的所有操作绑定到同一个 scopeId,保证不被外部任务交错。\n * 事务外的任务自动暂存到延迟队列,在事务结束后恢复执行。\n */\nexport class TransactionScope {\n\t#deferredQueue = new Queue();\n\t#activeScopeId = null;\n\t#scopeChain = Promise.resolve();\n\n\t/** 当前事务的作用域 ID,无事务时为 null。 */\n\tget scopeId() {\n\t\treturn this.#activeScopeId;\n\t}\n\n\t/** 是否有事务正在执行。 */\n\tget active() {\n\t\treturn this.#activeScopeId !== null;\n\t}\n\n\t/** 延迟队列中的待处理任务数。 */\n\tget pendingStatements() {\n\t\treturn this.#deferredQueue.size;\n\t}\n\n\t/**\n\t * 判断给定 scopeId 的任务是否应当延迟执行。\n\t * @param {symbol | null} scopeId\n\t * @returns {boolean}\n\t */\n\tisDeferred(scopeId) {\n\t\treturn this.#activeScopeId !== null && this.#activeScopeId !== scopeId;\n\t}\n\n\t/** 将任务放入延迟队列。 */\n\tdefer(task) {\n\t\tthis.#deferredQueue.enqueue(task);\n\t}\n\n\t/**\n\t * 进入事务作用域。\n\t * 返回 scopeId 和 release 函数,调用 release 后下一个等待的事务可以执行。\n\t * @returns {Promise<{ scopeId: symbol, release: () => void }>}\n\t */\n\tasync enter() {\n\t\tconst scopeId = Symbol(\"transaction\");\n\t\tlet release = null;\n\t\tconst gate = new Promise((resolve) => { release = resolve; });\n\n\t\tconst previous = this.#scopeChain;\n\t\t// 将前一个 scopeChain 的 reject 吞掉,避免未捕获的 reject 传播。\n\t\t// 前一个事务可能因 ROLLBACK 而 reject,这不应影响当前事务的等待。\n\t\tthis.#scopeChain = gate;\n\t\tawait previous.catch(() => {});\n\n\t\tthis.#activeScopeId = scopeId;\n\t\treturn { scopeId, release };\n\t}\n\n\t/** 退出事务作用域。 */\n\texit() {\n\t\tthis.#activeScopeId = null;\n\t}\n\n\t/**\n\t * 将延迟队列恢复到目标 Queue 的头部。\n\t * @param {import(\"./queue.js\").Queue} targetQueue\n\t */\n\trestoreDeferred(targetQueue) {\n\t\ttargetQueue.prependAll(this.#deferredQueue);\n\t}\n\n\t/**\n\t * 拒绝所有延迟队列中的任务。\n\t * @param {Error} error\n\t */\n\trejectAll(error) {\n\t\tlet task = this.#deferredQueue.dequeue();\n\t\twhile (task) {\n\t\t\tsettleTask(task, error, undefined, null);\n\t\t\ttask = this.#deferredQueue.dequeue();\n\t\t}\n\t}\n}\n","import { Queue } from \"./queue.js\";\nimport { InflightTracker } from \"./inflightTracker.js\";\nimport { createJsonValueParser } from \"./parser.js\";\nimport { settleTask } from \"./settleUtils.js\";\nimport { handleParsedValue, createSweeper, createFinalizeScheduler, createPumpQueue, rejectAllTasks, prepareTaskTimeout, handleSentinelTask, handleStderrChunk } from \"./pipelineUtils.js\";\nimport { DEFAULT_BATCH_SIZE, DEFAULT_MAX_INFLIGHT } from \"../constants.js\";\n\n/**\n * 管线化执行引擎。\n *\n * 维护任务队列、管理 inflight 任务、处理 stdout/stderr 解析、\n * 实现 sentinel token 协议和 stderr 竞态处理。\n *\n * PipelineEngine 不关心事务作用域、读写分离或进程恢复 ——\n * 这些由上层(SQLiteExecutor)负责。\n */\nexport class PipelineEngine {\n\t#queue = new Queue();\n\t#inflight = new InflightTracker();\n\t#pendingFinalizeTasks = new Set();\n\t#sharedValueParser;\n\t#processManager;\n\t#metrics;\n\t#statementTimeout;\n\t#logger;\n\t#batchSize;\n\t#maxInflight;\n\t#onTaskTimeout;\n\t#active = false;\n\t#sweeper;\n\t/** 由 createFinalizeScheduler 创建的闭包,替代 #scheduleFinalizeCheck 方法 */\n\t#scheduleFinalizeCheck;\n\t/** 由 createPumpQueue 创建的泵送函数(不含 active 守卫) */\n\t#pump;\n\n\t/** 多任务非 WAL batch 中无法立即归因的 stderr 缓冲 */\n\t#pendingStderr = [];\n\n\t/**\n\t * 标记此前是否已结算过零行 query 任务(无论成功或失败)。\n\t * 若为 true,则 handleStderrChunk 中零行 inflight query 的 stderr\n\t * 可能是来自已结算任务的延迟/残余 stderr,应缓冲到 #pendingStderr 而非直接归因。\n\t */\n\t#hasFinalizedZeroRowQuery = false;\n\n\t/**\n\t * @param {import(\"./process.js\").ProcessManager} processManager\n\t * @param {{\n\t * metrics: import(\"./metrics.js\").Metrics,\n\t * statementTimeout: number,\n\t * logger?: import(\"../index.js\").Logger,\n\t * batchSize?: number,\n\t * onTaskTimeout?: (task: object) => void,\n\t * }} options\n\t */\n\tconstructor(\n\t\tprocessManager,\n\t\t{\n\t\t\tmetrics,\n\t\t\tstatementTimeout,\n\t\t\tlogger,\n\t\t\tbatchSize = DEFAULT_BATCH_SIZE,\n\t\t\tmaxInflight = DEFAULT_MAX_INFLIGHT,\n\t\t\tonTaskTimeout,\n\t\t\tsweepInterval = 100,\n\t\t},\n\t) {\n\t\tthis.#processManager = processManager;\n\t\tthis.#metrics = metrics;\n\t\tthis.#statementTimeout = statementTimeout;\n\t\tthis.#logger = logger;\n\t\tthis.#batchSize = batchSize;\n\t\tthis.#maxInflight = maxInflight;\n\t\tthis.#onTaskTimeout = onTaskTimeout ?? (() => {});\n\n\t\t// 创建共享管道组件\n\t\tthis.#sweeper = createSweeper({\n\t\t\tinflight: this.#inflight,\n\t\t\tsweepIntervalMs: sweepInterval,\n\t\t\thandleTaskTimeout: (task) => {\n\t\t\t\tconst error = prepareTaskTimeout(task, this.#metrics);\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.#settleTask(task, error, undefined);\n\t\t\t\t\tthis.#onTaskTimeout?.(task);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tthis.#pump = createPumpQueue({\n\t\t\tqueue: this.#queue,\n\t\t\tinflight: this.#inflight,\n\t\t\tprocessManager: this.#processManager,\n\t\t\tsweeper: this.#sweeper,\n\t\t\tbatchSize: this.#batchSize,\n\t\t\tmaxInflight: this.#maxInflight,\n\t\t});\n\t\tthis.#scheduleFinalizeCheck = createFinalizeScheduler({\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t\tinflight: this.#inflight,\n\t\t});\n\t\tthis.#sharedValueParser = createJsonValueParser((raw) => {\n\t\t\thandleParsedValue(raw, this.#inflight, {\n\t\t\t\tafterSentinel: (task) => this.#afterSentinel(task),\n\t\t\t\trejectAll: (error) => this.rejectAll(error),\n\t\t\t});\n\t\t});\n\t\tthis.#processManager.setOnDrainCallback(() => this.#pumpQueue());\n\t}\n\n\t/** 测试用:获取扫制定时器引用。 */\n\tget _sweepTimer() {\n\t\treturn this.#sweeper?.getSweepTimer() ?? null;\n\t}\n\n\t/** 主任务队列(供事务延迟任务恢复使用)。 */\n\tget mainQueue() {\n\t\treturn this.#queue;\n\t}\n\n\t/** 主动触发一次队列发送。 */\n\tpump() {\n\t\tthis.#pumpQueue();\n\t}\n\n\t/** 当前待处理的任务总数(队列中 + 执行中 + pendingFinalize)。 */\n\tget pendingStatements() {\n\t\treturn this.#queue.size + this.#inflight.count + this.#pendingFinalizeTasks.size;\n\t}\n\n\t/**\n\t * 将数据送入 sharedValueParser 解析(供 stream 的 rowParser 回喂数据使用)。\n\t * @param {string} raw\n\t */\n\tfeed(raw) {\n\t\tthis.#sharedValueParser.feed(raw);\n\t}\n\n\t/** 标记引擎可用,允许发送任务。 */\n\tactivate() {\n\t\tthis.#sharedValueParser?.reset();\n\t\tthis.#active = true;\n\t}\n\n\t/** 标记引擎不可用,阻止发送新任务。 */\n\tdeactivate() {\n\t\tthis.#active = false;\n\t}\n\n\t/**\n\t * 入队一个任务。\n\t * 任务对象应包含:kind, sql, timeout, token, onRow, rows, resolve, reject,\n\t * consumerError, stderrText, timer, startTime, rowParser。\n\t * @param {object} task\n\t */\n\tenqueue(task) {\n\t\tthis.#queue.enqueue(task);\n\t\tthis.#pumpQueue();\n\t}\n\n\t/**\n\t * 从队列批量取出任务发送给 sqlite3 进程(active 守卫包装)。\n\t * 实际逻辑委托给 this.#pump(由 createPumpQueue 创建)。\n\t */\n\t#pumpQueue() {\n\t\tif (!this.#active) return;\n\t\tthis.#pump();\n\t}\n\n\t/**\n\t * 处理 sqlite3 的 stdout 输出。\n\t * 对于 stream 类型任务,先通过行流解析器逐行处理,剩余数据转给 JSON 值解析器。\n\t * @param {string} chunk\n\t */\n\thandleStdoutChunk(chunk) {\n\t\tconst task = this.#inflight.first;\n\t\tif (!task) return;\n\n\t\t// 已超时的 stream 任务:禁止继续喂给 rowParser(rowParser.reset 后 finished=false,\n\t\t// 否则会触发 spurious onRow 回调)。数据直接走 sharedValueParser 由\n\t\t// handleParsedValue 中的 task.timedout 短路丢弃。\n\t\tif (task.kind === \"stream\" && task.rowParser && !task.rowParser.finished && !task.timedout) {\n\t\t\tconst leftover = task.rowParser.feed(chunk);\n\t\t\tif (leftover) this.#sharedValueParser.feed(leftover);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#sharedValueParser.feed(chunk);\n\t}\n\n\t/**\n\t * sentinel token 命中后的统一处理逻辑(委托句共享函数)。\n\t */\n\t#afterSentinel(task) {\n\t\thandleSentinelTask(task, {\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tscheduleFinalizeCheck: () => this.#scheduleFinalizeCheck(),\n\t\t\tpumpQueue: () => this.#pumpQueue(),\n\t\t});\n\t}\n\n\t/**\n\t * 处理 sqlite3 的 stderr 输出(委托给共享函数)。\n\t * @param {string} chunk\n\t */\n\thandleStderrChunk(chunk) {\n\t\thandleStderrChunk(chunk, {\n\t\t\tinflight: this.#inflight,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tlogger: this.#logger,\n\t\t\tpendingStderr: this.#pendingStderr,\n\t\t\thasFinalizedZeroRowQuery: this.#hasFinalizedZeroRowQuery,\n\t\t});\n\t}\n\n\t#settleTask(task, error, value) {\n\t\t// 零行 query 任务结算后,其对应的 stderr 可能仍有残余分片在途:\n\t\t// - 成功结算(无错误):stderr 尚未到达\n\t\t// - 失败结算(有错误):部分 stderr 已到达并归因,但同一条错误消息\n\t\t// 可能被 OS 管道拆分,剩余分片仍会在稍后到达(Windows/macOS 常见)\n\t\t// 两种情况下,后续到达的延迟 stderr 都不应归因给新的 inflight query,\n\t\t// 故标记 #hasFinalizedZeroRowQuery 提醒 handleStderrChunk 将其缓冲到\n\t\t// pendingStderr,交由零行归因机制兜底。\n\t\tif (task.kind === \"query\" && task.rows?.length === 0) {\n\t\t\tthis.#hasFinalizedZeroRowQuery = true;\n\t\t}\n\t\tsettleTask(task, error, value, this.#metrics, { resetRowParser: true });\n\t}\n\n\t/**\n\t * 拒绝 inflight 任务以及队列中的所有待处理任务。\n\t * 不清除 deferred 队列(由上层负责)。\n\t * @param {Error} error\n\t */\n\trejectAll(error) {\n\t\tthis.#sharedValueParser.reset();\n\t\trejectAllTasks({\n\t\t\tinflight: this.#inflight,\n\t\t\tqueue: this.#queue,\n\t\t\tpendingFinalizeTasks: this.#pendingFinalizeTasks,\n\t\t\tsettleTask: (t, e, v) => this.#settleTask(t, e, v),\n\t\t\terror,\n\t\t});\n\t}\n\n\t/**\n\t * 终止引擎:拒绝所有任务,清空状态。\n\t */\n\tkill() {\n\t\tthis.#active = false;\n\t\tthis.#sweeper.clear();\n\t\tthis.#scheduleFinalizeCheck.cancel?.();\n\t\tthis.rejectAll(new Error(\"PipelineEngine is killed\"));\n\t}\n}\n","import { DEFAULT_STATEMENT_TIMEOUT } from \"../utils/timeout.js\";\nimport { VALID_TRANSACTION_MODES, createTransactionHandle } from \"../transaction/transaction.js\";\nimport { ProcessManager } from \"./process.js\";\nimport { toError } from \"./parser.js\";\nimport { generateToken } from \"../utils/token.js\";\n\nimport { setupStreamParser, AsyncRowBuffer } from \"../stream/stream.js\";\nimport { interpolateFromTemplate } from \"../utils/interpolate.js\";\nimport { normalizeSQLTemplate } from \"../utils/normalize.js\";\nimport { classifySQL } from \"./classifier.js\";\nimport { ReaderPool } from \"./readerPool.js\";\nimport { Metrics } from \"./metrics.js\";\nimport { TransactionScope } from \"./transactionScope.js\";\nimport { PipelineEngine } from \"./pipelineEngine.js\";\n\n/**\n * SQLite 执行器。\n *\n * 通过 stdin/stdout 与 sqlite3 CLI 进程通信,提供 execute/query/stream/transaction API。\n * 内部使用管线化队列批量发送任务,基于 Sentinel token 协议检测单个 SQL 任务的输出边界。\n */\nexport class SQLiteExecutor {\n\t#closed = false;\n\t#proc = null;\n\t#logger;\n\t#statementTimeout;\n\t#autoRestart;\n\t#fatalError = null;\n\t#processManager;\n\t#readerPool = null;\n\t#poolSize;\n\t#binary;\n\t#database;\n\t#metrics;\n\t#pipeline;\n\t#txScope = new TransactionScope();\n\n\t/**\n\t * @param {{\n\t * binary?: string,\n\t * database?: string,\n\t * logger?: import(\"../index.js\").Logger,\n\t * statementTimeout?: number,\n\t * autoRestart?: boolean,\n\t * poolSize?: number,\n\t * metrics?: import(\"./metrics.js\").Metrics,\n\t * }} options\n\t */\n\tconstructor({\n\t\tbinary = \"sqlite3\",\n\t\tdatabase = \":memory:\",\n\t\tlogger,\n\t\tstatementTimeout = DEFAULT_STATEMENT_TIMEOUT,\n\t\tautoRestart = true,\n\t\tpoolSize = 0,\n\t\tmetrics,\n\t} = {}) {\n\t\tthis.#logger = logger;\n\t\tthis.#statementTimeout = this.#normalizeTimeout(statementTimeout);\n\t\tthis.#autoRestart = autoRestart !== false;\n\t\tthis.#binary = binary;\n\t\tthis.#database = database;\n\t\tthis.#poolSize = poolSize;\n\t\tthis.#metrics = metrics ?? new Metrics();\n\n\t\tthis.#processManager = new ProcessManager({ binary, database });\n\t\tthis.#pipeline = new PipelineEngine(this.#processManager, {\n\t\t\tmetrics: this.#metrics,\n\t\t\tstatementTimeout: this.#statementTimeout,\n\t\t\tlogger: this.#logger,\n\t\t\tonTaskTimeout: () => {},\n\t\t});\n\t\tthis.#startProcess();\n\n\t\tif (poolSize > 0 && database !== \":memory:\") {\n\t\t\tthis.#readerPool = new ReaderPool({\n\t\t\t\tbinary,\n\t\t\t\tdatabase,\n\t\t\t\tpoolSize,\n\t\t\t\tstatementTimeout,\n\t\t\t\tlogger,\n\t\t\t\tmetrics: this.#metrics,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** 当前待处理的任务总数(队列中 + 执行中 + reader 队列中) */\n\tget pendingStatements() {\n\t\treturn this.#txScope.pendingStatements + this.#pipeline.pendingStatements + (this.#readerPool?.pendingStatements ?? 0);\n\t}\n\n\t/** 读取器连接池(null 表示未启用读写分离)。 */\n\tget readerPool() {\n\t\treturn this.#readerPool;\n\t}\n\n\t/** 测试用:获取底层子进程引用。 */\n\tget _process() {\n\t\treturn this.#proc;\n\t}\n\n\t/** 运行时指标收集器。 */\n\tget metrics() {\n\t\treturn this.#metrics;\n\t}\n\n\t/**\n\t * 执行 SQL 语句(不返回行数据)。\n\t * 适用于 INSERT / UPDATE / CREATE 等非查询操作。\n\t * @param {string} sql\n\t * @param {any[]} [params]\n\t * @param {{ timeout?: number }} [options]\n\t * @returns {Promise<void>}\n\t */\n\tasync execute(sql, params = [], options = {}) {\n\t\tawait this.#enqueue(\"execute\", sql, params, options, null);\n\t}\n\n\t/**\n\t * 执行查询并返回所有结果行。\n\t * @template T\n\t * @param {string} sql\n\t * @param {any[]} [params]\n\t * @param {{ timeout?: number }} [options]\n\t * @returns {Promise<T[]>}\n\t */\n\tquery(sql, params = [], options = {}) {\n\t\treturn this.#enqueue(\"query\", sql, params, options, null);\n\t}\n\n\t/**\n\t * 流式执行查询,返回 AsyncIterable,可配合 `for await` 逐行消费。\n\t *\n\t * @template T\n\t * @param {string} sql\n\t * @param {any[]} [params]\n\t * @param {{ timeout?: number }} [options]\n\t * @returns {AsyncIterable<T>}\n\t */\n\tstream(sql, params = [], options = {}) {\n\t\tif (!Array.isArray(params)) throw new TypeError(\"params must be an array\");\n\n\t\tconst buffer = new AsyncRowBuffer();\n\n\t\tthis.#enqueue(\n\t\t\t\"stream\",\n\t\t\tsql,\n\t\t\tparams,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\tonRow: (row) => buffer.push(row),\n\t\t\t},\n\t\t\tnull,\n\t\t).then(\n\t\t\t() => buffer.end(),\n\t\t\t(err) => buffer.error(err),\n\t\t);\n\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * 在一个数据库事务中执行用户函数。\n\t * 事务内所有操作共享一个域,不会被外部任务交错。\n\t * 函数成功时自动 COMMIT,抛出异常时自动 ROLLBACK。\n\t * @template T\n\t * @param {(tx: import(\"../index.js\").TransactionHandle) => Promise<T>} fn\n\t * @param {{ mode?: \"DEFERRED\" | \"IMMEDIATE\" | \"EXCLUSIVE\" }} [options]\n\t * @returns {Promise<T>}\n\t */\n\tasync transaction(fn, options = {}) {\n\t\tconst mode = options?.mode ?? \"DEFERRED\";\n\t\tif (!VALID_TRANSACTION_MODES.includes(mode)) {\n\t\t\tthrow new TypeError(`transaction mode must be one of: ${VALID_TRANSACTION_MODES.join(\", \")}`);\n\t\t}\n\n\t\tconst { scopeId, release } = await this.#txScope.enter();\n\n\t\tconst tx = createTransactionHandle(scopeId, {\n\t\t\tenqueue: (kind, sql, params, options, sid) => this.#enqueue(kind, sql, params, options, sid),\n\t\t});\n\n\t\ttry {\n\t\t\tawait tx.execute(`BEGIN ${mode}`);\n\t\t\ttry {\n\t\t\t\tconst result = await fn(tx);\n\t\t\t\tawait tx.execute(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tawait tx.execute(\"ROLLBACK\").catch(() => {});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#txScope.exit();\n\t\t\tthis.#txScope.restoreDeferred(this.#pipeline.mainQueue);\n\t\t\tthis.#pipeline.pump();\n\t\t\trelease();\n\t\t}\n\t}\n\n\t/**\n\t * 关闭执行器,拒绝所有待处理任务,终止 sqlite3 进程。\n\t * @returns {Promise<void>}\n\t */\n\tasync close() {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tthis.#pipeline.kill();\n\t\tthis.#txScope.rejectAll(new Error(\"SQLiteExecutor is closed\"));\n\n\t\tthis.#readerPool?.kill();\n\n\t\t// gracefulShutdown 已等 close 事件,进程一定已退出\n\t\tawait this.#processManager.gracefulShutdown();\n\t\tthis.#processManager.kill();\n\t}\n\n\t/**\n\t * 显式资源管理(Stage 3 TC39):await using。\n\t * 委托给 close(),使得执行器可通过 `await using db = new SQLiteExecutor()` 使用。\n\t * @returns {Promise<void>}\n\t */\n\t[Symbol.asyncDispose]() {\n\t\treturn this.close();\n\t}\n\n\t/**\n\t * 显式资源管理(Stage 3 TC39):using。\n\t * 同步销毁场景下的 fire-and-forget 关闭。\n\t */\n\t[Symbol.dispose]() {\n\t\tvoid this.close();\n\t}\n\n\t#normalizeTimeout(value) {\n\t\tif (!Number.isInteger(value) || value <= 0) {\n\t\t\tthrow new TypeError(\"statementTimeout must be a positive integer\");\n\t\t}\n\t\treturn value;\n\t}\n\n\t#startProcess() {\n\t\tlet proc;\n\t\ttry {\n\t\t\tproc = this.#processManager.start();\n\t\t} catch (error) {\n\t\t\tthis.#fatalError = toError(error);\n\t\t\tthis.#logger?.error?.(\"failed to start sqlite3 process\", this.#fatalError);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!proc.stdout) {\n\t\t\tthis.#fatalError = new Error(`Failed to spawn sqlite3 process: stdio unavailable (binary=${this.#binary})`);\n\t\t\tthis.#processManager.kill();\n\t\t\treturn;\n\t\t}\n\n\t\tproc.stdout.on(\"data\", (chunk) => {\n\t\t\tthis.#pipeline.handleStdoutChunk(chunk);\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (chunk) => {\n\t\t\tthis.#pipeline.handleStderrChunk(chunk);\n\t\t});\n\n\t\tproc.on(\"error\", (error) => {\n\t\t\t/* c8 ignore next */ // 死亡分支:listener 在 #handleProcessFailure 中被 removeAllListeners 清除\n\t\t\tif (this.#proc !== proc) return;\n\t\t\tthis.#logger?.error?.(\"sqlite3 process error\", error);\n\t\t\tthis.#handleProcessFailure(error);\n\t\t});\n\n\t\tproc.on(\"close\", (code, signal) => {\n\t\t\t/* c8 ignore next */ // 死亡分支:listener 在 #handleProcessFailure 中被 removeAllListeners 清除\n\t\t\tif (this.#proc !== proc) return;\n\t\t\tif (this.#closed) return;\n\t\t\t/* c8 ignore next */ // Windows: kill→signal=null, ?? 永远取 \"none\"\n\t\t\tthis.#handleProcessFailure(new Error(`sqlite3 process exited unexpectedly (code=${code}, signal=${signal ?? \"none\"})`));\n\t\t});\n\n\t\tthis.#proc = proc;\n\t\tthis.#pipeline.activate();\n\t}\n\n\t#enqueue(kind, sql, params, options, scopeId) {\n\t\tif (this.#closed) return Promise.reject(new Error(\"SQLiteExecutor is closed\"));\n\t\tif (this.#fatalError) return Promise.reject(this.#fatalError);\n\t\tif (!Array.isArray(params)) return Promise.reject(new TypeError(\"params must be an array\"));\n\n\t\tconst timeout = options?.timeout ?? this.#statementTimeout;\n\t\tconst token = generateToken();\n\t\tconst onRow = options?.onRow ?? null;\n\n\t\tconst template = normalizeSQLTemplate(sql);\n\n\t\tlet formatted;\n\t\tif (params.length === 0 && template.paramCount === 0) {\n\t\t\tformatted = template.normalized;\n\t\t} else {\n\t\t\tformatted = interpolateFromTemplate(template, params);\n\t\t}\n\n\t\tif (scopeId) {\n\t\t\treturn this.#enqueueWriter(kind, formatted, timeout, token, onRow, scopeId);\n\t\t}\n\n\t\tif (this.#readerPool) {\n\t\t\tif (kind === \"stream\" || kind === \"query\") {\n\t\t\t\treturn this.#enqueueReader(kind, formatted, timeout, token, onRow);\n\t\t\t}\n\t\t\tif (kind === \"execute\" && classifySQL(template.normalized) === \"read\") {\n\t\t\t\treturn this.#enqueueReader(kind, formatted, timeout, token, onRow);\n\t\t\t}\n\t\t}\n\n\t\treturn this.#enqueueWriter(kind, formatted, timeout, token, onRow, null);\n\t}\n\n\t#enqueueWriter(kind, sql, timeout, token, onRow, scopeId) {\n\t\tthis.#metrics.incrementTasksTotal(kind);\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst task = {\n\t\t\t\tkind,\n\t\t\t\tsql,\n\t\t\t\ttimeout,\n\t\t\t\ttoken,\n\t\t\t\tonRow,\n\t\t\t\tscopeId,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\tconsumerError: null,\n\t\t\t\tstderrText: \"\",\n\t\t\t\tsettled: false,\n\t\t\t\tstartTime: 0,\n\t\t\t\trowParser: null,\n\t\t\t\trows: kind === \"query\" ? [] : null,\n\t\t\t};\n\n\t\t\tif (kind === \"stream\") {\n\t\t\t\ttask.rowParser = setupStreamParser(task, this.#pipeline);\n\t\t\t}\n\n\t\t\tif (this.#txScope.isDeferred(scopeId)) {\n\t\t\t\tthis.#txScope.defer(task);\n\t\t\t} else {\n\t\t\t\tthis.#pipeline.enqueue(task);\n\t\t\t}\n\t\t});\n\t}\n\n\t#enqueueReader(kind, sql, timeout, token, onRow) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.#readerPool.enqueue({\n\t\t\t\tkind,\n\t\t\t\tsql,\n\t\t\t\ttimeout,\n\t\t\t\ttoken,\n\t\t\t\tonRow,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleProcessFailure(error) {\n\t\tconst failure = toError(error);\n\t\tthis.#processManager.kill();\n\t\tthis.#proc = null;\n\n\t\tthis.#pipeline.deactivate();\n\t\tthis.#pipeline.rejectAll(failure);\n\t\tthis.#txScope.rejectAll(failure);\n\n\t\tif (!this.#closed && this.#autoRestart) {\n\t\t\tthis.#metrics.incrementProcessRestarts();\n\t\t\tthis.#startProcess();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#fatalError = failure;\n\t\tthis.#closed = true;\n\t}\n}\n"],"names":["DEFAULT_STATEMENT_TIMEOUT","formatDateTime","date","y","M","String","d","h","m","s","ms","formatDuration","mins","Math","secs","createTimeoutError","timeout","sql","startTime","undefined","elapsed","performance","startDate","Date","deadlineDate","Error","toError","value","CHAR_QUOTE","CHAR_BACKSLASH","CHAR_OPEN_BRACKET","CHAR_CLOSE_BRACKET","CHAR_OPEN_BRACE","CHAR_CLOSE_BRACE","CHAR_COMMA","CHAR_SPACE","CHAR_TAB","CHAR_LF","CHAR_CR","isWhitespaceCode","code","createJsonValueParser","onValue","chunk","consumeUntil","buffer","start","nesting","inString","escaped","index","raw","createRowStreamParser","onRow","started","elementStart","elementEnd","consumed","TOKEN_COLUMN","DEFAULT_BATCH_SIZE","DEFAULT_MAX_INFLIGHT","INFLIGHT_COMPACT_THRESHOLD","setupStreamParser","task","pipelineOrFeed","parser","rawRow","row","JSON","_type_of","error","Symbol","_buffer","_index","_done","_error","_pending","AsyncRowBuffer","push","resolve","end","err","reject","next","Promise","_return","VALID_TRANSACTION_MODES","createTransactionHandle","scopeId","executor","handle","params","options","Array","TypeError","isWindows","os","isExecutable","filePath","fs","getPathExts","ext","process","e","which","command","pathExts","path","fullPath","_iteratorError","file","envPath","pathDirs","_iteratorError1","dir","_iteratorError2","ext1","file1","file2","GRACEFUL_SHUTDOWN_TIMEOUT","_binary","_database","_proc","_initMode","_draining","_writeBuffer","_drainCallbacks","_onDrain","flushBuffer","notifyIfDrained","ProcessManager","_ref","binary","database","initMode","onDrain","_which","setOnDrainCallback","fn","onDrained","callback","_proc_stdin","_proc_stdout","_proc_stderr","_proc_stdin1","args","proc","spawn","write","data","stream","gracefulShutdown","timer","setTimeout","clearTimeout","once","kill","callbacks","cb","_counter","_PREFIX","_PID36","generateToken","_maxSize","_maxKeyLength","_maxValueLength","_map","LRUCache","maxSize","maxKeyLength","maxValueLength","Infinity","Map","get","key","set","firstKey","clear","escapeValue","interpolateFromTemplate","template","segments","paramCount","parts","i","CC_SINGLE_QUOTE","CC_DOUBLE_QUOTE","CC_DASH","CC_SLASH","CC_STAR","CC_NEWLINE","CC_QUESTION","CC_SEMICOLON","CC_SPACE","STATE_NORMAL","STATE_SINGLE_QUOTE","STATE_DOUBLE_QUOTE","STATE_LINE_COMMENT","STATE_BLOCK_COMMENT","_decodeU16","codes","len","batchSize","_normCache","_normalize","needed","outCodes","Uint16Array","writePos","pendingSpace","state","questionPositions","nextCode","normalized","segStart","pos","normalizeSQL","cached","result","normalizeSQLTemplate","READ_ONLY_KINDS","Set","_classifyCache","classifySingle","stmt","trimmed","firstSpace","kind","classifySQL","stmts","INITIAL_CAPACITY","SHRINK_THRESHOLD","_items","_head","_tail","_size","_mask","grow","shrinkIfNeeded","Queue","enqueue","dequeue","remove","idx","j","curr","find","predicate","toArray","values","peek","prependAll","other","tmpItems","tmpMask","totalSize","newCap","newItems","writeIdx","i1","isEmpty","oldMask","_tasks","InflightTracker","_key","items","shift","forEach","collectQueryRows","parsed","processStreamRows","settleTask","metrics","resetRowParser","_task_rowParser","duration","buildPayload","token","skipNormalize","suffix","isTransactionControl","f","buildBatchPayload","batch","useWalBatch","t","parts1","task1","TC_FIRST_CHAR","buildSentinelStr","isSentinelRaw","isSentinelRow","_value_","finalizePendingTasks","tasks","settle","pumpQueue","pendingStderr","inflight","hasStderrBuffer","prepareTaskTimeout","createSweeper","param","sweepIntervalMs","handleTaskTimeout","sweepTimer","schedule","now","createFinalizeScheduler","pendingFinalizeTasks","scheduled","immediate","cancelled","delayedZeroRowQueries","WeakSet","cancel","clearImmediate","check","setImmediate","delayedTasks","hasQueryRows","task2","advanceNextInflightStartTime","handleParsedValue","afterSentinel","rejectAll","createPumpQueue","queue","processManager","sweeper","maxInflight","nextBatchId","pump","_inflight","payload","batchId","handleSentinelTask","scheduleFinalizeCheck","handleStderrChunk","logger","hasFinalizedZeroRowQuery","inflightFirst","firstPending","zeroRowMatch","t1","hasZeroRowQuery","t2","_iteratorError3","t3","rejectAllTasks","all","queued","_processManager","_pendingQueue","_pendingFinalizeTasks","_valueParser","_statementTimeout","_logger","_name","_batchSize","_maxInflight","_metrics","_sweeper","_scheduleFinalizeCheck","_pump","_pendingStderr","startProcess","handleStderrChunk1","settleTask1","TaskWorker","statementTimeout","name","sweepInterval","v","config","_config_onRow","_class_private_field_get_getSweepTimer","_class_private_field_get_cancel","_class_private_field_get_error","signal","_workers","_rrIndex","ReaderPool","poolSize","RangeError","worker","sum","w","minLoad","candidates","load","_tasksTotal","_tasksSuccess","_tasksFailed","_tasksTimeout","_processRestarts","_executeCount","_queryCount","_streamCount","_totalDuration","_startTime","Metrics","incrementTasksTotal","incrementTasksSuccess","incrementTasksFailed","incrementTasksTimeout","incrementProcessRestarts","snapshot","avgTaskDuration","throughput","_deferredQueue","_activeScopeId","_scopeChain","TransactionScope","isDeferred","defer","enter","release","gate","previous","exit","restoreDeferred","targetQueue","_queue","_sharedValueParser","_onTaskTimeout","_active","_hasFinalizedZeroRowQuery","PipelineEngine","onTaskTimeout","_this2","feed","activate","deactivate","handleStdoutChunk","leftover","_task_rows","_closed","_autoRestart","_fatalError","_readerPool","_poolSize","_pipeline","_txScope","normalizeTimeout","enqueueWriter","enqueueReader","handleProcessFailure","SQLiteExecutor","autoRestart","_class_private_field_get_pendingStatements","execute","query","transaction","_options_mode","mode","tx","sid","close","Number","_options_timeout","_options_onRow","formatted","failure"],"mappings":"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"}