sqlite-executor 4.0.5 → 4.0.7
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.
- package/dist/cjs/core/inflightTracker.d.cts +33 -0
- package/dist/cjs/core/lruCache.d.cts +8 -1
- package/dist/cjs/core/metrics.d.cts +4 -4
- package/dist/cjs/core/pipelineUtils.d.cts +196 -0
- package/dist/cjs/core/readerPool.d.cts +2 -2
- package/dist/cjs/index.cjs +1366 -979
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/utils/interpolate.d.cts +11 -0
- package/dist/cjs/utils/normalize.d.cts +24 -0
- package/dist/cjs/utils/timeout.d.cts +2 -1
- package/dist/esm/core/inflightTracker.d.mts +33 -0
- package/dist/esm/core/lruCache.d.mts +8 -1
- package/dist/esm/core/metrics.d.mts +4 -4
- package/dist/esm/core/pipelineUtils.d.mts +196 -0
- package/dist/esm/core/readerPool.d.mts +2 -2
- package/dist/esm/index.mjs +1368 -981
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/utils/interpolate.d.mts +11 -0
- package/dist/esm/utils/normalize.d.mts +24 -0
- package/dist/esm/utils/timeout.d.mts +2 -1
- package/package.json +31 -1
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
import type { SQLTemplate } from "./normalize";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 使用预解析的模板替换参数,避免重新扫描 SQL。
|
|
5
|
+
*
|
|
6
|
+
* @param template - 由 `normalizeSQLTemplate` 返回的预解析模板
|
|
7
|
+
* @param params - 要插值的参数数组
|
|
8
|
+
* @returns 插值后的完整 SQL 字符串
|
|
9
|
+
*/
|
|
10
|
+
export function interpolateFromTemplate(template: SQLTemplate, params: any[]): string;
|
|
11
|
+
|
|
1
12
|
/**
|
|
2
13
|
* 替换 SQL 语句中的 `?` 占位符为转义后的参数值。
|
|
3
14
|
*
|
|
@@ -5,3 +5,27 @@
|
|
|
5
5
|
* @returns 规范化后的 SQL 语句
|
|
6
6
|
*/
|
|
7
7
|
export function normalizeSQL(sql: string): string;
|
|
8
|
+
|
|
9
|
+
export interface SQLTemplate {
|
|
10
|
+
/** 规范化后的完整 SQL 字符串 */
|
|
11
|
+
normalized: string;
|
|
12
|
+
/**
|
|
13
|
+
* 以 `?` 为分隔符的片段数组。
|
|
14
|
+
* - segments[0] 为第一个 `?` 之前的部分
|
|
15
|
+
* - segments[n] 为第 n 个 `?` 之后、第 n+1 个 `?` 之前的部分
|
|
16
|
+
* - 最后一个元素为最后一个 `?` 之后的部分
|
|
17
|
+
* - 无 `?` 时 segments 为 [normalized]
|
|
18
|
+
*/
|
|
19
|
+
segments: string[];
|
|
20
|
+
/** `?` 占位符的数量 */
|
|
21
|
+
paramCount: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 单次扫描同时完成 SQL 规范化和 `?` 占位符追踪。
|
|
26
|
+
* 避免 `normalizeSQL` + `_parseTemplate` 两次扫描的重复开销。
|
|
27
|
+
*
|
|
28
|
+
* @param sql - 原始 SQL 语句
|
|
29
|
+
* @returns 包含规范化结果和占位符信息的模板对象
|
|
30
|
+
*/
|
|
31
|
+
export function normalizeSQLTemplate(sql: string): SQLTemplate;
|
|
@@ -3,9 +3,10 @@ export const DEFAULT_STATEMENT_TIMEOUT: 30000;
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* 创建包含 SQL 上下文的超时错误。
|
|
6
|
+
* 注意:sql 应已由调用方完成规范化,本函数不再内部调用 normalizeSQL。
|
|
6
7
|
*
|
|
7
8
|
* @param timeout - 超时时间(毫秒)
|
|
8
|
-
* @param sql - 超时发生时正在执行的 SQL
|
|
9
|
+
* @param sql - 超时发生时正在执行的 SQL 语句(已规范化)
|
|
9
10
|
* @returns 包含超时时间和 SQL 信息的 Error 实例
|
|
10
11
|
*/
|
|
11
12
|
export function createTimeoutError(timeout: number, sql: string): Error;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inflight 任务数组管理器。
|
|
3
|
+
*
|
|
4
|
+
* 封装了变长数组 + 头指针的 push/shift 操作和自动压缩逻辑,
|
|
5
|
+
* PipelineEngine 和 TaskWorker 共享此类,避免重复实现 inflight 管理。
|
|
6
|
+
*
|
|
7
|
+
* 设计:
|
|
8
|
+
* - shift() 出队时将对应槽位置为 null,仅移动头指针
|
|
9
|
+
* - 头指针超过阈值时通过 slice() 物理回收已消费的前部空间
|
|
10
|
+
* - 不需使用者关心 #tasks / #head 的内部细节
|
|
11
|
+
*/
|
|
12
|
+
export declare class InflightTracker {
|
|
13
|
+
/** 当前 inflight 任务数。 */
|
|
14
|
+
get count(): number;
|
|
15
|
+
|
|
16
|
+
/** 第一个(最旧的)inflight 任务,无任务时返回 null。 */
|
|
17
|
+
get first(): object | null;
|
|
18
|
+
|
|
19
|
+
/** 将一个或多个任务追加到队尾。 */
|
|
20
|
+
push(...items: object[]): void;
|
|
21
|
+
|
|
22
|
+
/** 移除并返回第一个 inflight 任务。空时返回 null。 */
|
|
23
|
+
shift(): object | null;
|
|
24
|
+
|
|
25
|
+
/** 清空所有 inflight 任务。 */
|
|
26
|
+
clear(): void;
|
|
27
|
+
|
|
28
|
+
/** 对每个 inflight 任务调用 fn(task)。 */
|
|
29
|
+
forEach(fn: (task: object) => void): void;
|
|
30
|
+
|
|
31
|
+
/** 返回所有 inflight 任务的浅拷贝数组(不含 null 槽位)。 */
|
|
32
|
+
toArray(): object[];
|
|
33
|
+
}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/** 基于 Map 插入顺序的 LRU 缓存。 */
|
|
2
2
|
export declare class LRUCache<T> {
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* 创建 LRUCache 实例。
|
|
5
|
+
* @param options 可选项。
|
|
6
|
+
* @param options.maxSize 最大缓存条目数,默认为 100。
|
|
7
|
+
* @param options.maxKeyLength 超长 key 的最大长度,默认为 100。超过该长度的 key 不会被缓存。
|
|
8
|
+
* @param options.maxValueLength 超长 value 的最大长度,默认为 Infinity。超过该长度的 value 不会被缓存。
|
|
9
|
+
*/
|
|
10
|
+
constructor(options?: { maxSize?: number; maxKeyLength?: number, maxValueLength?: number });
|
|
4
11
|
|
|
5
12
|
/** 获取缓存值,命中时提升到末尾。未命中或 key 不合法时返回 undefined。 */
|
|
6
13
|
get(key: string): T | undefined;
|
|
@@ -16,10 +16,10 @@ export interface MetricsSnapshot {
|
|
|
16
16
|
queryCount: number;
|
|
17
17
|
/** stream 操作执行次数 */
|
|
18
18
|
streamCount: number;
|
|
19
|
-
/**
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
|
|
19
|
+
/** 所有成功任务的平均耗时(毫秒) */
|
|
20
|
+
avgTaskDuration: number;
|
|
21
|
+
/** 每秒处理任务数(含 execute/query/stream) */
|
|
22
|
+
throughput: number;
|
|
23
23
|
/** 运行时长(秒) */
|
|
24
24
|
uptime: number;
|
|
25
25
|
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { InflightTracker } from "./inflightTracker.mts";
|
|
2
|
+
import { Metrics } from "./metrics.mts";
|
|
3
|
+
|
|
4
|
+
// ─── finalizePendingTasks ───
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 批量结算 pendingFinalize 集合中的所有任务。
|
|
8
|
+
* 由 scheduleFinalizeCheck 的 setImmediate 回调调用。
|
|
9
|
+
*
|
|
10
|
+
* @param tasks - pendingFinalizeTasks 集合
|
|
11
|
+
* @param settle - 结算回调,形式为 (task, error, value) => void
|
|
12
|
+
* @param pumpQueue - 泵送回调,结算后触发队列发送
|
|
13
|
+
*/
|
|
14
|
+
export function finalizePendingTasks(
|
|
15
|
+
tasks: Set<object>,
|
|
16
|
+
settle: (task: object, error: Error | null, value: any) => void,
|
|
17
|
+
pumpQueue: () => void,
|
|
18
|
+
): void;
|
|
19
|
+
|
|
20
|
+
// ─── prepareTaskTimeout ───
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 处理单任务超时:防重复结算、清除定时器、更新指标、创建超时错误。
|
|
24
|
+
*
|
|
25
|
+
* @param task - 任务对象
|
|
26
|
+
* @param metrics - 可选的指标收集器
|
|
27
|
+
* @returns 已创建的 TimeoutError;若任务已结算则返回 null
|
|
28
|
+
*/
|
|
29
|
+
export function prepareTaskTimeout(
|
|
30
|
+
task: object,
|
|
31
|
+
metrics: Metrics | null | undefined,
|
|
32
|
+
): Error | null;
|
|
33
|
+
|
|
34
|
+
// ─── createSweeper ───
|
|
35
|
+
|
|
36
|
+
export interface Sweeper {
|
|
37
|
+
/** 启动 sweep 定时器(如果尚未启动)。 */
|
|
38
|
+
schedule: () => void;
|
|
39
|
+
/** 停止 sweep 定时器。 */
|
|
40
|
+
clear: () => void;
|
|
41
|
+
/** 获取当前 sweep 定时器引用(测试用)。 */
|
|
42
|
+
getSweepTimer: () => number | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface SweeperOptions {
|
|
46
|
+
/** inflight 任务跟踪器 */
|
|
47
|
+
inflight: InflightTracker;
|
|
48
|
+
/** 超时扫描间隔(毫秒) */
|
|
49
|
+
sweepIntervalMs: number;
|
|
50
|
+
/** 超时任务处理回调 */
|
|
51
|
+
handleTaskTimeout: (task: object) => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 创建 sweep 定时器管理器。
|
|
56
|
+
* schedule() 启动定期扫描,检查 inflight 任务是否超时;
|
|
57
|
+
* clear() 停止定时器。
|
|
58
|
+
*/
|
|
59
|
+
export function createSweeper(options: SweeperOptions): Sweeper;
|
|
60
|
+
|
|
61
|
+
// ─── createFinalizeScheduler ───
|
|
62
|
+
|
|
63
|
+
export interface FinalizeSchedulerOptions {
|
|
64
|
+
/** pendingFinalize 任务集合 */
|
|
65
|
+
pendingFinalizeTasks: Set<object>;
|
|
66
|
+
/** 结算回调,形式为 (task, error, value) => void */
|
|
67
|
+
settleTask: (task: object, error: Error | null, value: any) => void;
|
|
68
|
+
/** 泵送回调,结算后触发队列发送 */
|
|
69
|
+
pumpQueue: () => void;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 创建 pendingFinalize 结算调度器。
|
|
74
|
+
* 通过 setImmediate 延迟一帧执行 finalizePendingTasks,给 stderr chunk 到达的时间窗口。
|
|
75
|
+
*
|
|
76
|
+
* @returns 调度函数,调用后将在下一帧执行 finalizePendingTasks
|
|
77
|
+
*/
|
|
78
|
+
export function createFinalizeScheduler(options: FinalizeSchedulerOptions): () => void;
|
|
79
|
+
|
|
80
|
+
// ─── handleParsedValue ───
|
|
81
|
+
|
|
82
|
+
export interface ParsedValueCallbacks {
|
|
83
|
+
/**
|
|
84
|
+
* sentinel token 命中后的回调。
|
|
85
|
+
* inflight.shift() 已在调用前执行,此处负责后续处理(pendingFinalize 等)。
|
|
86
|
+
*/
|
|
87
|
+
afterSentinel: (task: object) => void;
|
|
88
|
+
/**
|
|
89
|
+
* JSON 解析失败时的回调,用于拒绝所有 inflight 任务。
|
|
90
|
+
*/
|
|
91
|
+
rejectAll: (error: Error) => void;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 处理一个完整的 JSON 值(来自 sharedValueParser)。
|
|
96
|
+
* 匹配 sentinel token、收集 query 行数据、触发 stream 回调。
|
|
97
|
+
* PipelineEngine 和 TaskWorker 共享此逻辑。
|
|
98
|
+
*
|
|
99
|
+
* @param raw - 原始 JSON 文本
|
|
100
|
+
* @param inflight - inflight 任务跟踪器
|
|
101
|
+
* @param callbacks - afterSentinel 和 rejectAll 回调
|
|
102
|
+
*/
|
|
103
|
+
export function handleParsedValue(
|
|
104
|
+
raw: string,
|
|
105
|
+
inflight: InflightTracker,
|
|
106
|
+
callbacks: ParsedValueCallbacks,
|
|
107
|
+
): void;
|
|
108
|
+
|
|
109
|
+
// ─── handleSentinelTask ───
|
|
110
|
+
|
|
111
|
+
export interface SentinelTaskOptions {
|
|
112
|
+
/** 结算回调,形式为 (task, error, value) => void */
|
|
113
|
+
settleTask: (task: object, error: Error | null, value: any) => void;
|
|
114
|
+
/** pendingFinalize 任务集合 */
|
|
115
|
+
pendingFinalizeTasks: Set<object>;
|
|
116
|
+
/** 触发延迟结算的回调 */
|
|
117
|
+
scheduleFinalizeCheck: () => void;
|
|
118
|
+
/** 泵送回调 */
|
|
119
|
+
pumpQueue: () => void;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 处理 sentinel token 命中后的任务结算。
|
|
124
|
+
* PipelineEngine 和 TaskWorker 共享此逻辑,统一延迟结算策略。
|
|
125
|
+
*
|
|
126
|
+
* @param task - 已从 inflight shift 的任务
|
|
127
|
+
* @param options - 回调集合
|
|
128
|
+
*/
|
|
129
|
+
export function handleSentinelTask(task: object, options: SentinelTaskOptions): void;
|
|
130
|
+
|
|
131
|
+
// ─── handleStderrChunk ───
|
|
132
|
+
|
|
133
|
+
export interface StderrChunkOptions {
|
|
134
|
+
/** inflight 任务跟踪器 */
|
|
135
|
+
inflight: InflightTracker;
|
|
136
|
+
/** pendingFinalize 任务集合 */
|
|
137
|
+
pendingFinalizeTasks: Set<object>;
|
|
138
|
+
/** 可选的日志记录器 */
|
|
139
|
+
logger?: { error?: (msg: string) => void };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 处理 sqlite3 的 stderr 输出,将其归因到合适的任务。
|
|
144
|
+
* PipelineEngine 和 TaskWorker 共享此逻辑。
|
|
145
|
+
*
|
|
146
|
+
* @param chunk - stderr 文本块
|
|
147
|
+
* @param options - 上下文依赖
|
|
148
|
+
*/
|
|
149
|
+
export function handleStderrChunk(chunk: string, options: StderrChunkOptions): void;
|
|
150
|
+
|
|
151
|
+
// ─── createPumpQueue ───
|
|
152
|
+
|
|
153
|
+
export interface PumpQueueOptions {
|
|
154
|
+
/** 待发送的任务队列 */
|
|
155
|
+
queue: import("./queue.js").Queue;
|
|
156
|
+
/** inflight 任务跟踪器 */
|
|
157
|
+
inflight: InflightTracker;
|
|
158
|
+
/** 子进程管理器(提供 draining 判断、write 写入、onDrained 注册) */
|
|
159
|
+
processManager: { draining: boolean; write: (data: string) => void; onDrained: (cb: () => void) => void };
|
|
160
|
+
/** sweep 定时器管理器 */
|
|
161
|
+
sweeper: Sweeper;
|
|
162
|
+
/** 批量发送大小 */
|
|
163
|
+
batchSize: number;
|
|
164
|
+
/** inflight 上限 */
|
|
165
|
+
maxInflight: number;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* 创建泵送函数,将队列中的任务批量发送给 sqlite3 进程。
|
|
170
|
+
* PipelineEngine 和 TaskWorker 共享此工厂,消除 #pumpQueue 方法的重复。
|
|
171
|
+
*
|
|
172
|
+
* @returns 泵送函数,调用后尝试从队列取出 batch 发送
|
|
173
|
+
*/
|
|
174
|
+
export function createPumpQueue(options: PumpQueueOptions): () => void;
|
|
175
|
+
|
|
176
|
+
// ─── rejectAllTasks ───
|
|
177
|
+
|
|
178
|
+
export interface RejectAllOptions {
|
|
179
|
+
/** inflight 任务跟踪器 */
|
|
180
|
+
inflight: InflightTracker;
|
|
181
|
+
/** 待发送的任务队列 */
|
|
182
|
+
queue: import("./queue.js").Queue;
|
|
183
|
+
/** pendingFinalize 任务集合 */
|
|
184
|
+
pendingFinalizeTasks: Set<object>;
|
|
185
|
+
/** 结算回调,形式为 (task, error, value) => void */
|
|
186
|
+
settleTask: (task: object, error: Error | null, value: any) => void;
|
|
187
|
+
/** 拒绝原因 */
|
|
188
|
+
error: Error;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 拒绝所有待处理任务(inflight、队列、pendingFinalize)。
|
|
193
|
+
* 提取自 PipelineEngine.rejectAll 和 TaskWorker.#rejectAll,
|
|
194
|
+
* 消除二者间的逻辑重复。
|
|
195
|
+
*/
|
|
196
|
+
export function rejectAllTasks(options: RejectAllOptions): void;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 只读 Worker 连接池。
|
|
3
3
|
*
|
|
4
4
|
* 管理多个 TaskWorker 实例,所有 worker 共享同一数据库文件。
|
|
5
|
-
*
|
|
5
|
+
* 通过 Least Busy(最小负载)分配读任务,实现读操作的水平扩展。
|
|
6
6
|
*
|
|
7
7
|
* 注意:ReaderPool 中的 worker 不初始化 WAL 模式(`initMode: "none"`),
|
|
8
8
|
* 直接继承数据库文件头中的 journal 模式,避免与 writer 竞争 WAL 初始化锁。
|
|
@@ -30,7 +30,7 @@ export class ReaderPool {
|
|
|
30
30
|
get pendingStatements(): number;
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* 分发一个读任务到负载最小的 Worker(Least Busy)。
|
|
34
34
|
* @param task - 任务配置对象
|
|
35
35
|
*/
|
|
36
36
|
enqueue(task: object): void;
|