@weifuwujs/tasks 0.9.0

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.
Files changed (50) hide show
  1. package/README.md +170 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +319 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +4 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/postgres.d.ts +3 -0
  11. package/dist/postgres.d.ts.map +1 -0
  12. package/dist/postgres.js +2 -0
  13. package/dist/postgres.js.map +1 -0
  14. package/dist/redis.d.ts +3 -0
  15. package/dist/redis.d.ts.map +1 -0
  16. package/dist/redis.js +2 -0
  17. package/dist/redis.js.map +1 -0
  18. package/dist/sqlite.d.ts +3 -0
  19. package/dist/sqlite.d.ts.map +1 -0
  20. package/dist/sqlite.js +2 -0
  21. package/dist/sqlite.js.map +1 -0
  22. package/dist/stores/memory.d.ts +6 -0
  23. package/dist/stores/memory.d.ts.map +1 -0
  24. package/dist/stores/memory.js +169 -0
  25. package/dist/stores/memory.js.map +1 -0
  26. package/dist/stores/postgres.d.ts +22 -0
  27. package/dist/stores/postgres.d.ts.map +1 -0
  28. package/dist/stores/postgres.js +233 -0
  29. package/dist/stores/postgres.js.map +1 -0
  30. package/dist/stores/redis.d.ts +21 -0
  31. package/dist/stores/redis.d.ts.map +1 -0
  32. package/dist/stores/redis.js +340 -0
  33. package/dist/stores/redis.js.map +1 -0
  34. package/dist/stores/sqlite.d.ts +13 -0
  35. package/dist/stores/sqlite.d.ts.map +1 -0
  36. package/dist/stores/sqlite.js +216 -0
  37. package/dist/stores/sqlite.js.map +1 -0
  38. package/dist/tasks.d.ts +11 -0
  39. package/dist/tasks.d.ts.map +1 -0
  40. package/dist/tasks.js +214 -0
  41. package/dist/tasks.js.map +1 -0
  42. package/dist/testing.d.ts +13 -0
  43. package/dist/testing.d.ts.map +1 -0
  44. package/dist/testing.js +211 -0
  45. package/dist/testing.js.map +1 -0
  46. package/dist/types.d.ts +158 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +3 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # 任务队列(`@weifuwujs/tasks`)
2
+
3
+ 后台任务的最小完整形态:**至少一次**投递 + **幂等键**去重 + **指数退避/死信** + **优雅停止**,
4
+ 四驱动(memory/sqlite/postgres/redis)共用同一套契约测试。适合发欢迎邮件、生成报表、清理数据这类
5
+ "失败要重试、重复要无害"的工作。
6
+
7
+ 不适合的:秒级定时精度、cron 表达式、跨任务的分布式锁(见文末"边界")。
8
+
9
+ ## 十分钟接入
10
+
11
+ ```ts tasks
12
+ import { createApp } from '@weifuwujs/weifuwu'
13
+ import { createTasks } from '@weifuwujs/tasks'
14
+ import { sqliteTaskStore } from '@weifuwujs/tasks/sqlite'
15
+
16
+ const store = sqliteTaskStore('data/tasks.db') // 构造即迁移(幂等)
17
+ const tasks = createTasks({ store })
18
+
19
+ tasks.handle('welcome-email', async (payload: { email: string }) => {
20
+ console.log('send welcome to', payload.email)
21
+ })
22
+
23
+ const app = createApp()
24
+ tasks.install(app) // 启动 worker;app.close()/SIGTERM 时优雅停止
25
+
26
+ await tasks.enqueue(
27
+ 'welcome-email',
28
+ { email: 'a@example.com' },
29
+ { idempotencyKey: 'welcome:user-1' },
30
+ )
31
+ ```
32
+
33
+ 四步:**选驱动** → `createTasks` → `handle` → `install(app)`。之后 `enqueue` 只落库,
34
+ 由进程内 worker 轮询执行;不需要额外的调度器。
35
+
36
+ ## API 速览
37
+
38
+ `createTasks(options)`
39
+
40
+ | 选项 | 默认 | 说明 |
41
+ | --- | --- | --- |
42
+ | `store` | 必填 | 四驱动之一或你自己的 `TaskStore` |
43
+ | `concurrency` | `1` | 单进程并发执行数 |
44
+ | `pollIntervalMs` | `1000` | 轮询间隔 |
45
+ | `visibilityTimeoutMs` | `60000` | 可见性超时:执行中崩溃后多久可被重领 |
46
+ | `retry` | `{ baseMs: 1000, maxMs: 900000 }` | 指数退避(`base * 2^(attempt-1)`,封顶) |
47
+ | `warnAfterMs` | `30000` | 单任务超时**只告警不中断** |
48
+ | `autoStart` | `true` | 进程内 worker 默认开启;测试可关 |
49
+ | `now` / `workerId` / `logger` | — | 注入时钟、worker 标识、日志器 |
50
+
51
+ `tasks` 实例:`handle` / `enqueue` / `every` / `install` / `start` / `stop` / `runOnce` / `drain` /
52
+ `retry` / `list` / `prune` / `pendingNames`。
53
+
54
+ `enqueue(name, payload?, options?)` → `{ id, created, task }`:
55
+ `options = { runAt?, delay?, idempotencyKey?, maxAttempts? }`;`created: false` 表示幂等命中(返回已有任务,不覆盖)。
56
+
57
+ ## 四驱动
58
+
59
+ | 驱动 | 入口 | 建表 | 说明 |
60
+ | --- | --- | --- | --- |
61
+ | memory | `@weifuwujs/tasks` | 无需 | 单进程测试/演示 |
62
+ | sqlite | `@weifuwujs/tasks/sqlite` | `weifuwu-tasks migrate --store sqlite:data/tasks.db` | 默认生产驱动;单进程写(多进程用 PG) |
63
+ | postgres | `@weifuwujs/tasks/postgres` | `weifuwu-tasks migrate --store postgres://…` | `FOR UPDATE SKIP LOCKED`,多进程安全;默认读 `DATABASE_URL` |
64
+ | redis | `@weifuwujs/tasks/redis` | 无需(`tasks migrate` 为 no-op 提示) | ZSET + 单段 Lua 原子领取;默认读 `REDIS_URL` |
65
+
66
+ 切换驱动只改一行:
67
+
68
+ ```ts
69
+ createTasks({ store: postgresTaskStore(process.env.DATABASE_URL!) })
70
+ ```
71
+
72
+ ### 自定义驱动
73
+
74
+ 实现 `TaskStore` 接口后,用同一套契约测试验证(memory/sqlite/postgres/redis 四驱动跑的就是它):
75
+
76
+ ```ts tasks-custom
77
+ import { memoryTaskStore } from '@weifuwujs/tasks'
78
+ import { tasksStoreContract } from '@weifuwujs/tasks/testing'
79
+
80
+ // 你的驱动实现 TaskStore 后,用同一套契约验证
81
+ tasksStoreContract('my-store', () => memoryTaskStore())
82
+ ```
83
+
84
+ ## 至少一次与幂等
85
+
86
+ - **attempts 在领取时 +1**:即使进程硬崩溃、`complete` 从未执行,本次尝试也被计数,不会无限重跑;
87
+ - **锁过期回队**:`running` 超过 `visibilityTimeoutMs` 未完成 → 回 `pending` 重领;
88
+ attempts 已达 `maxAttempts` → 置 `dead`(`lastError: visibility timeout exceeded`);
89
+ - **失败退避**:`fail(id, { error, retryAt })` 带 `retryAt` → `pending` + 指数退避;`retryAt: null` → `dead`;
90
+ - **幂等键**:`enqueue` 携 `idempotencyKey` 时,重复投递返回已有任务(`created: false`),**不覆盖原任务**。
91
+ 分布式下四驱动都用唯一约束/Lua/HSETNX 保证原子;
92
+ - **未知 handler**:任务保持 `pending` 并告警一次(不判死),等代码部署补齐后再执行。
93
+
94
+ 推荐幂等键命名:`<动作>:<业务主键>`(如 `welcome:<userId>`)。
95
+
96
+ ### auth 接线 recipe:欢迎邮件
97
+
98
+ 注册成功发一封欢迎邮件,重复触发(hooks 重投、注册重试)只发一次:
99
+
100
+ ```ts tasks-auth
101
+ import { createAuth } from '@weifuwujs/auth'
102
+ import { sqliteAuthStore } from '@weifuwujs/auth/sqlite'
103
+ import { createTasks } from '@weifuwujs/tasks'
104
+ import { sqliteTaskStore } from '@weifuwujs/tasks/sqlite'
105
+
106
+ const tasks = createTasks({ store: sqliteTaskStore('data/tasks.db') })
107
+ tasks.handle('welcome-email', async (payload: { userId: string }) => {
108
+ // 接你的邮件服务;失败会按退避重试,幂等键保证只发一次
109
+ console.log('welcome', payload.userId)
110
+ })
111
+
112
+ export const auth = createAuth({
113
+ store: sqliteAuthStore('data/auth.db'),
114
+ hooks: {
115
+ onRegister: (user) => {
116
+ void tasks.enqueue(
117
+ 'welcome-email',
118
+ { userId: user.id },
119
+ { idempotencyKey: `welcome:${user.id}` },
120
+ )
121
+ },
122
+ },
123
+ })
124
+ ```
125
+
126
+ 完整可跑版本见 `test/tasks-recipes.test.ts`。
127
+
128
+ ## 生命周期
129
+
130
+ - `tasks.install(app)`:进程内 worker 随应用启动;`app.close()`(含 CLI 的 SIGINT/SIGTERM)时优雅停止:
131
+ 停止取新任务,超时未完成的任务**归还**(`release`,保留下次重试,不丢);
132
+ - `tasks work`:独立 worker 进程,加载与 `weifuwu start` 相同的构建产物:
133
+
134
+ ```bash
135
+ weifuwu-tasks work # 常驻 worker(Ctrl+C / SIGTERM 停止)
136
+ weifuwu-tasks work --store postgres://…
137
+ ```
138
+
139
+ - 多进程部署:web 进程设 `autoStart: false`,worker 进程跑 `tasks work`(或单独进程 `createTasks().start()`)。
140
+
141
+ ## CLI 运维
142
+
143
+ ```bash
144
+ weifuwu-tasks migrate --store sqlite:data/tasks.db # 建表(幂等)
145
+ weifuwu-tasks list --status dead --json # 查看(--name/--limit/--json)
146
+ weifuwu-tasks retry <id> # 手动重驱死信
147
+ weifuwu-tasks retry --all-dead
148
+ weifuwu-tasks prune --older-than 7d # 清理 done/dead(默认 7d)
149
+ ```
150
+
151
+ `--store` 与 auth 同惯例:`sqlite:<path>`(默认 `sqlite:data/tasks.db`)、`postgres://…`、`redis://…`。
152
+
153
+ ## 测试辅助(`/testing`)
154
+
155
+ 自定义 `TaskStore` 驱动与内置四驱动共跑同一套契约:
156
+
157
+ ```ts
158
+ import { tasksStoreContract } from '@weifuwujs/tasks/testing'
159
+
160
+ tasksStoreContract('my-store', () => myTaskStore())
161
+ // 第三个参数可选:{ skip: true } 或 { skip: '未实现清理' }
162
+ ```
163
+
164
+ 契约覆盖:enqueue/get/幂等键、claim 原子性与 attempts、退避/死信、锁过期回收、prune 边界。
165
+
166
+ ## 边界(不做与规模)
167
+
168
+ - **不做**:cron 表达式、任务优先级、跨任务分布式锁、强杀超时任务(`warnAfterMs` 只告警);
169
+ redis/sqlite 驱动不承诺多进程精确调度(redis 领取原子,但 list/prune 为 O(n) 扫描);
170
+ - **规模假设**:P1 面向中小规模(单表/单 ZSET,数万级任务);更大规模再谈分片与索引(P2)。
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,319 @@
1
+ #!/usr/bin/env node
2
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
3
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
4
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
5
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
6
+ });
7
+ }
8
+ return path;
9
+ };
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { join, resolve } from 'node:path';
12
+ import { pathToFileURL } from 'node:url';
13
+ function parseArgs(argv) {
14
+ const command = argv[0] ?? 'help';
15
+ let root = process.cwd();
16
+ let store;
17
+ const rest = [];
18
+ for (let index = 1; index < argv.length; index++) {
19
+ const arg = argv[index];
20
+ if (arg === '--root' || arg.startsWith('--root=')) {
21
+ const value = arg.includes('=') ? arg.slice(arg.indexOf('=') + 1) : argv[++index];
22
+ if (!value)
23
+ throw new Error('--root 需要提供一个值');
24
+ root = resolve(value);
25
+ }
26
+ else if (arg === '--store' || arg.startsWith('--store=')) {
27
+ const value = arg.includes('=') ? arg.slice(arg.indexOf('=') + 1) : argv[++index];
28
+ if (!value)
29
+ throw new Error('--store 需要提供一个值');
30
+ store = value;
31
+ }
32
+ else {
33
+ rest.push(arg);
34
+ }
35
+ }
36
+ return { command, root, store, rest };
37
+ }
38
+ /** tasks 子命令 flag(从 rest 解析,不进全局选项表)。 */
39
+ function parseTaskFlags(args) {
40
+ const values = new Map();
41
+ const booleans = new Set();
42
+ const positionals = [];
43
+ const valueFlags = new Set(['status', 'name', 'limit', 'older-than']);
44
+ const booleanFlags = new Set(['json', 'all-dead']);
45
+ for (let index = 0; index < args.length; index++) {
46
+ const arg = args[index];
47
+ if (!arg.startsWith('--')) {
48
+ positionals.push(arg);
49
+ continue;
50
+ }
51
+ const eq = arg.indexOf('=');
52
+ const key = eq === -1 ? arg.slice(2) : arg.slice(2, eq);
53
+ if (valueFlags.has(key)) {
54
+ const value = eq === -1 ? args[++index] : arg.slice(eq + 1);
55
+ if (!value)
56
+ throw new Error(`--${key} 需要提供一个值`);
57
+ values.set(key, value);
58
+ }
59
+ else if (booleanFlags.has(key)) {
60
+ booleans.add(key);
61
+ }
62
+ else {
63
+ throw new Error(`未知选项:--${key}`);
64
+ }
65
+ }
66
+ return { values, booleans, positionals };
67
+ }
68
+ function parseDuration(input) {
69
+ const units = {
70
+ ms: 1,
71
+ s: 1_000,
72
+ m: 60_000,
73
+ h: 3_600_000,
74
+ d: 86_400_000,
75
+ };
76
+ const match = /^(\d+)(ms|s|m|h|d)$/.exec(input);
77
+ if (!match) {
78
+ throw new Error(`--older-than 需要形如 7d/24h/30m 的时长(收到:${input})`);
79
+ }
80
+ return Number(match[1]) * units[match[2]];
81
+ }
82
+ /** 四驱动统一数据源:`--store`(默认 `sqlite:data/tasks.db`)。 */
83
+ async function openTaskStore(options) {
84
+ const spec = options.store ?? 'sqlite:data/tasks.db';
85
+ if (spec.startsWith('sqlite:')) {
86
+ const path = resolve(options.root, spec.slice('sqlite:'.length));
87
+ const { sqliteTaskStore } = await import("./stores/sqlite.js");
88
+ const store = sqliteTaskStore(path);
89
+ return { store, close: async () => store.close() };
90
+ }
91
+ if (spec.startsWith('postgres://') || spec.startsWith('postgresql://')) {
92
+ const { postgresTaskStore } = await import("./stores/postgres.js");
93
+ const store = postgresTaskStore(spec);
94
+ return { store, close: () => store.close() };
95
+ }
96
+ if (spec.startsWith('redis://') || spec.startsWith('rediss://')) {
97
+ const { redisTaskStore } = await import("./stores/redis.js");
98
+ const store = redisTaskStore(spec);
99
+ return { store, close: () => store.close() };
100
+ }
101
+ throw new Error(`无法识别的 --store:${spec}(支持 sqlite:<path>、postgres://… 与 redis://…)`);
102
+ }
103
+ /** .env 系列加载(优先级低 → 高:`.env` < `.env.local` < `.env.${mode}` < `.env.${mode}.local`)。 */
104
+ function loadEnvFiles(root, mode) {
105
+ const merged = {};
106
+ for (const file of ['.env', '.env.local', `.env.${mode}`, `.env.${mode}.local`]) {
107
+ const path = join(root, file);
108
+ if (!existsSync(path))
109
+ continue;
110
+ for (const line of readFileSync(path, 'utf8').split(/\r?\n/)) {
111
+ const trimmed = line.trim();
112
+ if (!trimmed || trimmed.startsWith('#'))
113
+ continue;
114
+ const match = /^(?:export\s+)?([^=\s]+)\s*=\s*(.*)$/.exec(trimmed);
115
+ if (!match)
116
+ continue;
117
+ let value = match[2].trim();
118
+ if ((value.startsWith('"') && value.endsWith('"')) ||
119
+ (value.startsWith("'") && value.endsWith("'"))) {
120
+ value = value.slice(1, -1);
121
+ }
122
+ merged[match[1]] = value;
123
+ }
124
+ }
125
+ for (const [key, value] of Object.entries(merged))
126
+ process.env[key] ??= value;
127
+ }
128
+ /** `tasks work`:专用 worker 进程(加载构建产物,常驻至 SIGTERM/SIGINT)。 */
129
+ async function tasksWork(options) {
130
+ process.env.NODE_ENV ??= 'production';
131
+ loadEnvFiles(options.root, process.env.NODE_ENV ?? 'production');
132
+ const entry = resolve(options.root, 'build/server/index.js');
133
+ if (!existsSync(entry)) {
134
+ throw new Error('未找到 build/server/index.js,请先运行 `weifuwu build`');
135
+ }
136
+ const module = (await import(__rewriteRelativeImportExtension(pathToFileURL(entry).href)));
137
+ const app = module.default ?? module.app;
138
+ const closeApp = app?.close;
139
+ let closing = false;
140
+ const shutdown = () => {
141
+ if (closing)
142
+ return;
143
+ closing = true;
144
+ process.exitCode = 0;
145
+ const guard = setTimeout(() => process.exit(0), 2_000);
146
+ void (async () => {
147
+ if (typeof closeApp === 'function') {
148
+ await Promise.race([
149
+ closeApp.call(app).catch((error) => console.error(error)),
150
+ new Promise((resolveDelay) => setTimeout(resolveDelay, 1_000)),
151
+ ]);
152
+ }
153
+ clearTimeout(guard);
154
+ process.exit(0);
155
+ })();
156
+ };
157
+ process.on('SIGINT', shutdown);
158
+ process.on('SIGTERM', shutdown);
159
+ // 无监听句柄时保持进程存活;SIGTERM 由 shutdown 退出
160
+ setInterval(() => { }, 2 ** 31 - 1);
161
+ console.log('tasks worker 已启动(Ctrl+C / SIGTERM 停止)');
162
+ }
163
+ async function tasksList(options, args) {
164
+ const flags = parseTaskFlags(args);
165
+ const statuses = flags.values
166
+ .get('status')
167
+ ?.split(',')
168
+ .map((status) => status.trim())
169
+ .filter(Boolean);
170
+ const limitRaw = flags.values.get('limit');
171
+ const { store, close } = await openTaskStore(options);
172
+ try {
173
+ const tasks = await store.list({
174
+ statuses: statuses && statuses.length > 0 ? statuses : undefined,
175
+ name: flags.values.get('name'),
176
+ limit: limitRaw ? Number.parseInt(limitRaw, 10) : undefined,
177
+ });
178
+ if (flags.booleans.has('json')) {
179
+ console.log(JSON.stringify(tasks, null, 2));
180
+ return;
181
+ }
182
+ if (tasks.length === 0) {
183
+ console.log('(无任务)');
184
+ return;
185
+ }
186
+ for (const task of tasks) {
187
+ console.log([
188
+ task.id,
189
+ task.status.padEnd(8),
190
+ `${task.attempts}/${task.maxAttempts}`,
191
+ task.name,
192
+ task.runAt.toISOString(),
193
+ task.lastError ?? '',
194
+ ].join(' '));
195
+ }
196
+ }
197
+ finally {
198
+ await close();
199
+ }
200
+ }
201
+ async function tasksRetry(options, args) {
202
+ const flags = parseTaskFlags(args);
203
+ const { store, close } = await openTaskStore(options);
204
+ try {
205
+ const now = new Date();
206
+ if (flags.booleans.has('all-dead')) {
207
+ const dead = await store.list({ statuses: ['dead'] });
208
+ let count = 0;
209
+ for (const task of dead)
210
+ if (await store.retry(task.id, now))
211
+ count += 1;
212
+ console.log(`已重驱 ${count} 个死信`);
213
+ return;
214
+ }
215
+ if (flags.positionals.length === 0) {
216
+ throw new Error('用法:weifuwu-tasks retry <id…> 或 --all-dead');
217
+ }
218
+ let count = 0;
219
+ for (const id of flags.positionals) {
220
+ if (await store.retry(id, now))
221
+ count += 1;
222
+ else
223
+ console.log(`跳过(非 dead 或不存在):${id}`);
224
+ }
225
+ console.log(`已重驱 ${count} 个任务`);
226
+ }
227
+ finally {
228
+ await close();
229
+ }
230
+ }
231
+ async function tasksPrune(options, args) {
232
+ const flags = parseTaskFlags(args);
233
+ const raw = flags.values.get('older-than') ?? '7d';
234
+ const olderThanMs = parseDuration(raw);
235
+ const statuses = flags.values
236
+ .get('status')
237
+ ?.split(',')
238
+ .map((status) => status.trim())
239
+ .filter(Boolean);
240
+ const { store, close } = await openTaskStore(options);
241
+ try {
242
+ const removed = await store.prune({
243
+ now: new Date(),
244
+ olderThanMs,
245
+ statuses: statuses && statuses.length > 0 ? statuses : undefined,
246
+ });
247
+ console.log(`已清理 ${removed} 个任务`);
248
+ }
249
+ finally {
250
+ await close();
251
+ }
252
+ }
253
+ async function tasksCommand(options) {
254
+ const sub = options.command;
255
+ const args = options.rest;
256
+ switch (sub) {
257
+ case 'migrate': {
258
+ const spec = options.store ?? 'sqlite:data/tasks.db';
259
+ const { store, close } = await openTaskStore(options);
260
+ try {
261
+ await store.migrate?.();
262
+ if (spec.startsWith('sqlite:')) {
263
+ console.log(`tasks 迁移完成:${resolve(options.root, spec.slice('sqlite:'.length))}`);
264
+ }
265
+ else if (spec.startsWith('redis')) {
266
+ console.log('tasks 迁移完成:redis(无 schema,键首次写入时创建)');
267
+ }
268
+ else {
269
+ console.log('tasks 迁移完成:postgres');
270
+ }
271
+ }
272
+ finally {
273
+ await close();
274
+ }
275
+ return;
276
+ }
277
+ case 'work':
278
+ await tasksWork(options);
279
+ return;
280
+ case 'list':
281
+ await tasksList(options, args);
282
+ return;
283
+ case 'retry':
284
+ await tasksRetry(options, args);
285
+ return;
286
+ case 'prune':
287
+ await tasksPrune(options, args);
288
+ return;
289
+ default:
290
+ throw new Error(`未知 tasks 子命令:${sub ?? '(空)'}(可用:migrate/work/list/retry/prune)`);
291
+ }
292
+ }
293
+ function printHelp() {
294
+ console.log(`用法:weifuwu-tasks <命令> [选项]
295
+
296
+ 命令:
297
+ migrate 迁移 tasks 数据表(sqlite/postgres/redis)
298
+ work 启动专用 worker 进程(加载 build/server/index.js,常驻至 SIGTERM)
299
+ list 列出任务(--status、--name、--limit、--json)
300
+ retry 重驱任务(<id…> 或 --all-dead)
301
+ prune 清理历史任务(--older-than 7d、--status)
302
+
303
+ 选项:
304
+ --root <dir> 项目根目录,默认当前目录
305
+ --store <url> 数据源,默认 sqlite:data/tasks.db(支持 sqlite:<path>、postgres://…、redis://…)
306
+ `);
307
+ }
308
+ const options = parseArgs(process.argv.slice(2));
309
+ try {
310
+ if (options.command === 'help')
311
+ printHelp();
312
+ else
313
+ await tasksCommand(options);
314
+ }
315
+ catch (error) {
316
+ console.error(error instanceof Error ? error.message : error);
317
+ process.exit(1);
318
+ }
319
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { createTasks } from './tasks.ts';
2
+ export { memoryTaskStore } from './stores/memory.ts';
3
+ export type { ClaimOptions, CloseableApp, CreateTasksOptions, EnqueueInput, EnqueueOptions, EnqueueResult, FailInput, ListFilter, PruneOptions, Task, TaskContext, TaskHandler, TaskLogger, TaskStatus, TaskStore, Tasks, } from './types.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,KAAK,GACN,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createTasks } from "./tasks.js";
2
+ export { memoryTaskStore } from "./stores/memory.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { postgresTaskStore } from './stores/postgres.ts';
2
+ export type { PostgresTaskStore } from './stores/postgres.ts';
3
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { postgresTaskStore } from "./stores/postgres.js";
2
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { redisTaskStore } from './stores/redis.ts';
2
+ export type { RedisTaskStore, RedisTaskStoreOptions } from './stores/redis.ts';
3
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/redis.js ADDED
@@ -0,0 +1,2 @@
1
+ export { redisTaskStore } from "./stores/redis.js";
2
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { sqliteTaskStore } from './stores/sqlite.ts';
2
+ export type { SqliteTaskStore } from './stores/sqlite.ts';
3
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
package/dist/sqlite.js ADDED
@@ -0,0 +1,2 @@
1
+ export { sqliteTaskStore } from "./stores/sqlite.js";
2
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { TaskStore } from '../types.ts';
2
+ /**
3
+ * 内存驱动:dev/test 用(单进程;不作生产承诺)。
4
+ */
5
+ export declare function memoryTaskStore(): TaskStore;
6
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/stores/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAQV,SAAS,EACV,MAAM,aAAa,CAAA;AAQpB;;GAEG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAkK3C"}