@tstdl/base 0.93.141 → 0.93.142
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/authentication/client/authentication.service.d.ts +1 -0
- package/authentication/client/authentication.service.js +3 -2
- package/circuit-breaker/circuit-breaker.d.ts +6 -4
- package/circuit-breaker/postgres/circuit-breaker.d.ts +1 -0
- package/circuit-breaker/postgres/circuit-breaker.js +8 -5
- package/circuit-breaker/tests/circuit-breaker.test.js +20 -0
- package/examples/document-management/main.js +2 -2
- package/notification/tests/notification-api.test.js +5 -1
- package/notification/tests/notification-flow.test.js +9 -6
- package/orm/decorators.d.ts +17 -4
- package/orm/decorators.js +9 -0
- package/orm/server/bootstrap.d.ts +11 -0
- package/orm/server/bootstrap.js +31 -0
- package/orm/server/drizzle/schema-converter.d.ts +3 -1
- package/orm/server/drizzle/schema-converter.js +71 -29
- package/orm/server/extension.d.ts +14 -0
- package/orm/server/extension.js +27 -0
- package/orm/server/index.d.ts +2 -0
- package/orm/server/index.js +2 -0
- package/orm/server/migration.d.ts +2 -3
- package/orm/server/migration.js +7 -21
- package/orm/server/repository.d.ts +1 -0
- package/orm/server/repository.js +19 -9
- package/orm/server/transaction.d.ts +1 -0
- package/orm/server/transaction.js +3 -0
- package/orm/tests/database-extension.test.js +63 -0
- package/orm/tests/database-migration.test.js +7 -6
- package/orm/tests/repository-compound-primary-key.test.d.ts +2 -0
- package/orm/tests/repository-compound-primary-key.test.js +234 -0
- package/orm/tests/schema-generation.test.d.ts +1 -0
- package/orm/tests/schema-generation.test.js +52 -5
- package/package.json +4 -4
- package/task-queue/README.md +0 -1
- package/task-queue/postgres/drizzle/0000_great_gwen_stacy.sql +84 -0
- package/task-queue/postgres/drizzle/meta/0000_snapshot.json +151 -68
- package/task-queue/postgres/drizzle/meta/_journal.json +2 -2
- package/task-queue/postgres/module.js +2 -1
- package/task-queue/postgres/schemas.d.ts +6 -0
- package/task-queue/postgres/task-queue.d.ts +18 -5
- package/task-queue/postgres/task-queue.js +593 -372
- package/task-queue/postgres/task.model.d.ts +9 -5
- package/task-queue/postgres/task.model.js +26 -26
- package/task-queue/task-context.d.ts +10 -5
- package/task-queue/task-context.js +5 -3
- package/task-queue/task-queue.d.ts +339 -35
- package/task-queue/task-queue.js +135 -31
- package/task-queue/tests/coverage-branch.test.js +45 -57
- package/task-queue/tests/coverage-enhancement.test.js +123 -117
- package/task-queue/tests/{extensive-dependencies.test.js → dag.test.js} +61 -32
- package/task-queue/tests/dependencies.test.js +139 -21
- package/task-queue/tests/enqueue-batch.test.js +125 -0
- package/task-queue/tests/fan-out-spawning.test.js +43 -2
- package/task-queue/tests/idempotent-replacement.test.js +54 -1
- package/task-queue/tests/missing-idempotent-tasks.test.js +9 -8
- package/task-queue/tests/queue.test.js +261 -25
- package/task-queue/tests/shutdown.test.js +41 -0
- package/task-queue/tests/transactions.test.d.ts +1 -0
- package/task-queue/tests/transactions.test.js +47 -0
- package/task-queue/tests/worker.test.js +46 -13
- package/task-queue/tests/zombie-parent.test.js +1 -1
- package/task-queue/tests/zombie-recovery.test.js +3 -3
- package/testing/integration-setup.js +5 -3
- package/utils/timing.d.ts +2 -2
- package/task-queue/postgres/drizzle/0000_wakeful_sunspot.sql +0 -82
- package/task-queue/tests/cascading-cancellations.test.js +0 -38
- package/task-queue/tests/complex.test.js +0 -122
- package/task-queue/tests/dag-dependencies.test.js +0 -41
- /package/{task-queue/tests/cascading-cancellations.test.d.ts → orm/tests/database-extension.test.d.ts} +0 -0
- /package/task-queue/tests/{complex.test.d.ts → dag.test.d.ts} +0 -0
- /package/task-queue/tests/{dag-dependencies.test.d.ts → enqueue-batch.test.d.ts} +0 -0
- /package/task-queue/tests/{extensive-dependencies.test.d.ts → shutdown.test.d.ts} +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
CREATE TYPE "task_queue"."task_dependency_type" AS ENUM('schedule', 'complete', 'child');--> statement-breakpoint
|
|
2
|
+
CREATE TYPE "task_queue"."task_status" AS ENUM('pending', 'running', 'completed', 'cancelled', 'dead', 'waiting', 'waiting-children', 'paused', 'retrying', 'timed-out', 'expired', 'skipped', 'orphaned');--> statement-breakpoint
|
|
3
|
+
CREATE TABLE "task_queue"."task" (
|
|
4
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
5
|
+
"namespace" text NOT NULL,
|
|
6
|
+
"type" text NOT NULL,
|
|
7
|
+
"status" "task_queue"."task_status" NOT NULL,
|
|
8
|
+
"idempotency_key" text,
|
|
9
|
+
"trace_id" text,
|
|
10
|
+
"parent_id" uuid,
|
|
11
|
+
"tags" text[] NOT NULL,
|
|
12
|
+
"fail_fast" boolean NOT NULL,
|
|
13
|
+
"priority" integer NOT NULL,
|
|
14
|
+
"unresolved_schedule_dependencies" integer NOT NULL,
|
|
15
|
+
"unresolved_complete_dependencies" integer NOT NULL,
|
|
16
|
+
"token" uuid,
|
|
17
|
+
"creation_timestamp" timestamp with time zone NOT NULL,
|
|
18
|
+
"priority_age_timestamp" timestamp with time zone NOT NULL,
|
|
19
|
+
"schedule_timestamp" timestamp with time zone NOT NULL,
|
|
20
|
+
"start_timestamp" timestamp with time zone,
|
|
21
|
+
"time_to_live" timestamp with time zone,
|
|
22
|
+
"visibility_deadline" timestamp with time zone,
|
|
23
|
+
"complete_timestamp" timestamp with time zone,
|
|
24
|
+
"tries" integer NOT NULL,
|
|
25
|
+
"progress" double precision NOT NULL,
|
|
26
|
+
"data" jsonb,
|
|
27
|
+
"state" jsonb,
|
|
28
|
+
"result" jsonb,
|
|
29
|
+
"error" jsonb,
|
|
30
|
+
CONSTRAINT "task_namespace_idempotency_key_unique" UNIQUE("namespace","idempotency_key")
|
|
31
|
+
);
|
|
32
|
+
--> statement-breakpoint
|
|
33
|
+
CREATE TABLE "task_queue"."task_archive" (
|
|
34
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
35
|
+
"namespace" text NOT NULL,
|
|
36
|
+
"type" text NOT NULL,
|
|
37
|
+
"status" "task_queue"."task_status" NOT NULL,
|
|
38
|
+
"idempotency_key" text,
|
|
39
|
+
"trace_id" text,
|
|
40
|
+
"parent_id" uuid,
|
|
41
|
+
"tags" text[] NOT NULL,
|
|
42
|
+
"fail_fast" boolean NOT NULL,
|
|
43
|
+
"priority" integer NOT NULL,
|
|
44
|
+
"unresolved_schedule_dependencies" integer NOT NULL,
|
|
45
|
+
"unresolved_complete_dependencies" integer NOT NULL,
|
|
46
|
+
"token" uuid,
|
|
47
|
+
"creation_timestamp" timestamp with time zone NOT NULL,
|
|
48
|
+
"priority_age_timestamp" timestamp with time zone NOT NULL,
|
|
49
|
+
"schedule_timestamp" timestamp with time zone NOT NULL,
|
|
50
|
+
"start_timestamp" timestamp with time zone,
|
|
51
|
+
"time_to_live" timestamp with time zone,
|
|
52
|
+
"visibility_deadline" timestamp with time zone,
|
|
53
|
+
"complete_timestamp" timestamp with time zone,
|
|
54
|
+
"tries" integer NOT NULL,
|
|
55
|
+
"progress" double precision NOT NULL,
|
|
56
|
+
"data" jsonb,
|
|
57
|
+
"state" jsonb,
|
|
58
|
+
"result" jsonb,
|
|
59
|
+
"error" jsonb
|
|
60
|
+
);
|
|
61
|
+
--> statement-breakpoint
|
|
62
|
+
CREATE TABLE "task_queue"."task_dependency" (
|
|
63
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
64
|
+
"task_id" uuid NOT NULL,
|
|
65
|
+
"dependency_task_id" uuid NOT NULL,
|
|
66
|
+
"type" "task_queue"."task_dependency_type" NOT NULL,
|
|
67
|
+
"required_statuses" "task_queue"."task_status"[] NOT NULL,
|
|
68
|
+
CONSTRAINT "task_dependency_task_id_dependency_task_id_type_unique" UNIQUE("task_id","dependency_task_id","type")
|
|
69
|
+
);
|
|
70
|
+
--> statement-breakpoint
|
|
71
|
+
ALTER TABLE "task_queue"."task" ADD CONSTRAINT "task_parentId_task_fkey" FOREIGN KEY ("parent_id") REFERENCES "task_queue"."task"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
72
|
+
ALTER TABLE "task_queue"."task_dependency" ADD CONSTRAINT "task_dependency_dependencyTaskId_task_fkey" FOREIGN KEY ("dependency_task_id") REFERENCES "task_queue"."task"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
73
|
+
ALTER TABLE "task_queue"."task_dependency" ADD CONSTRAINT "task_dependency_taskId_task_fkey" FOREIGN KEY ("task_id") REFERENCES "task_queue"."task"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
74
|
+
CREATE INDEX "task_parent_id_partial_idx" ON "task_queue"."task" USING btree ("parent_id") WHERE "task_queue"."task"."parent_id" is not null;--> statement-breakpoint
|
|
75
|
+
CREATE INDEX "task_namespace_complete_timestamp_partial_idx" ON "task_queue"."task" USING btree ("namespace","complete_timestamp") WHERE "task_queue"."task"."status" in ('completed', 'cancelled', 'dead', 'timed-out', 'expired', 'skipped', 'orphaned');--> statement-breakpoint
|
|
76
|
+
CREATE INDEX "task_namespace_start_timestamp_partial_idx" ON "task_queue"."task" USING btree ("namespace","start_timestamp") WHERE "task_queue"."task"."status" = 'running';--> statement-breakpoint
|
|
77
|
+
CREATE INDEX "task_namespace_visibility_deadline_partial_idx" ON "task_queue"."task" USING btree ("namespace","visibility_deadline") WHERE "task_queue"."task"."status" = 'running';--> statement-breakpoint
|
|
78
|
+
CREATE INDEX "task_namespace_time_to_live_partial_idx" ON "task_queue"."task" USING btree ("namespace","time_to_live") WHERE "task_queue"."task"."status" in ('pending', 'retrying', 'waiting', 'waiting-children');--> statement-breakpoint
|
|
79
|
+
CREATE INDEX "task_namespace_priority_age_timestamp_partial_idx" ON "task_queue"."task" USING btree ("namespace","priority_age_timestamp") WHERE "task_queue"."task"."status" in ('pending', 'retrying');--> statement-breakpoint
|
|
80
|
+
CREATE INDEX "task_namespace_type_priority_schedule_timestamp_partial_idx" ON "task_queue"."task" USING btree ("namespace","type","priority","schedule_timestamp") WHERE "task_queue"."task"."status" in ('pending', 'retrying');--> statement-breakpoint
|
|
81
|
+
CREATE INDEX "task_namespace_priority_schedule_timestamp_partial_idx" ON "task_queue"."task" USING btree ("namespace","priority","schedule_timestamp") WHERE "task_queue"."task"."status" in ('pending', 'retrying');--> statement-breakpoint
|
|
82
|
+
CREATE INDEX "task_namespace_tags_idx" ON "task_queue"."task" USING gin ("namespace","tags");--> statement-breakpoint
|
|
83
|
+
CREATE INDEX "task_archive_namespace_complete_timestamp_idx" ON "task_queue"."task_archive" USING btree ("namespace","complete_timestamp");--> statement-breakpoint
|
|
84
|
+
CREATE INDEX "task_dependency_dependency_task_id_type_idx" ON "task_queue"."task_dependency" USING btree ("dependency_task_id","type");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"id": "
|
|
2
|
+
"id": "aaf1f877-e250-4660-bd3d-9ba1bfacd10c",
|
|
3
3
|
"prevId": "00000000-0000-0000-0000-000000000000",
|
|
4
4
|
"version": "7",
|
|
5
5
|
"dialect": "postgresql",
|
|
@@ -46,6 +46,12 @@
|
|
|
46
46
|
"primaryKey": false,
|
|
47
47
|
"notNull": false
|
|
48
48
|
},
|
|
49
|
+
"parent_id": {
|
|
50
|
+
"name": "parent_id",
|
|
51
|
+
"type": "uuid",
|
|
52
|
+
"primaryKey": false,
|
|
53
|
+
"notNull": false
|
|
54
|
+
},
|
|
49
55
|
"tags": {
|
|
50
56
|
"name": "tags",
|
|
51
57
|
"type": "text[]",
|
|
@@ -159,17 +165,11 @@
|
|
|
159
165
|
"type": "jsonb",
|
|
160
166
|
"primaryKey": false,
|
|
161
167
|
"notNull": false
|
|
162
|
-
},
|
|
163
|
-
"parent_id": {
|
|
164
|
-
"name": "parent_id",
|
|
165
|
-
"type": "uuid",
|
|
166
|
-
"primaryKey": false,
|
|
167
|
-
"notNull": false
|
|
168
168
|
}
|
|
169
169
|
},
|
|
170
170
|
"indexes": {
|
|
171
|
-
"
|
|
172
|
-
"name": "
|
|
171
|
+
"task_parent_id_partial_idx": {
|
|
172
|
+
"name": "task_parent_id_partial_idx",
|
|
173
173
|
"columns": [
|
|
174
174
|
{
|
|
175
175
|
"expression": "parent_id",
|
|
@@ -179,15 +179,60 @@
|
|
|
179
179
|
}
|
|
180
180
|
],
|
|
181
181
|
"isUnique": false,
|
|
182
|
+
"where": "\"task_queue\".\"task\".\"parent_id\" is not null",
|
|
183
|
+
"concurrently": false,
|
|
184
|
+
"method": "btree",
|
|
185
|
+
"with": {}
|
|
186
|
+
},
|
|
187
|
+
"task_namespace_complete_timestamp_partial_idx": {
|
|
188
|
+
"name": "task_namespace_complete_timestamp_partial_idx",
|
|
189
|
+
"columns": [
|
|
190
|
+
{
|
|
191
|
+
"expression": "namespace",
|
|
192
|
+
"isExpression": false,
|
|
193
|
+
"asc": true,
|
|
194
|
+
"nulls": "last"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"expression": "complete_timestamp",
|
|
198
|
+
"isExpression": false,
|
|
199
|
+
"asc": true,
|
|
200
|
+
"nulls": "last"
|
|
201
|
+
}
|
|
202
|
+
],
|
|
203
|
+
"isUnique": false,
|
|
204
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('completed', 'cancelled', 'dead', 'timed-out', 'expired', 'skipped', 'orphaned')",
|
|
205
|
+
"concurrently": false,
|
|
206
|
+
"method": "btree",
|
|
207
|
+
"with": {}
|
|
208
|
+
},
|
|
209
|
+
"task_namespace_start_timestamp_partial_idx": {
|
|
210
|
+
"name": "task_namespace_start_timestamp_partial_idx",
|
|
211
|
+
"columns": [
|
|
212
|
+
{
|
|
213
|
+
"expression": "namespace",
|
|
214
|
+
"isExpression": false,
|
|
215
|
+
"asc": true,
|
|
216
|
+
"nulls": "last"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"expression": "start_timestamp",
|
|
220
|
+
"isExpression": false,
|
|
221
|
+
"asc": true,
|
|
222
|
+
"nulls": "last"
|
|
223
|
+
}
|
|
224
|
+
],
|
|
225
|
+
"isUnique": false,
|
|
226
|
+
"where": "\"task_queue\".\"task\".\"status\" = 'running'",
|
|
182
227
|
"concurrently": false,
|
|
183
228
|
"method": "btree",
|
|
184
229
|
"with": {}
|
|
185
230
|
},
|
|
186
|
-
"
|
|
187
|
-
"name": "
|
|
231
|
+
"task_namespace_visibility_deadline_partial_idx": {
|
|
232
|
+
"name": "task_namespace_visibility_deadline_partial_idx",
|
|
188
233
|
"columns": [
|
|
189
234
|
{
|
|
190
|
-
"expression": "
|
|
235
|
+
"expression": "namespace",
|
|
191
236
|
"isExpression": false,
|
|
192
237
|
"asc": true,
|
|
193
238
|
"nulls": "last"
|
|
@@ -200,48 +245,57 @@
|
|
|
200
245
|
}
|
|
201
246
|
],
|
|
202
247
|
"isUnique": false,
|
|
248
|
+
"where": "\"task_queue\".\"task\".\"status\" = 'running'",
|
|
203
249
|
"concurrently": false,
|
|
204
250
|
"method": "btree",
|
|
205
251
|
"with": {}
|
|
206
252
|
},
|
|
207
|
-
"
|
|
208
|
-
"name": "
|
|
253
|
+
"task_namespace_time_to_live_partial_idx": {
|
|
254
|
+
"name": "task_namespace_time_to_live_partial_idx",
|
|
209
255
|
"columns": [
|
|
210
256
|
{
|
|
211
|
-
"expression": "
|
|
257
|
+
"expression": "namespace",
|
|
212
258
|
"isExpression": false,
|
|
213
259
|
"asc": true,
|
|
214
260
|
"nulls": "last"
|
|
215
261
|
},
|
|
216
262
|
{
|
|
217
|
-
"expression": "
|
|
263
|
+
"expression": "time_to_live",
|
|
218
264
|
"isExpression": false,
|
|
219
265
|
"asc": true,
|
|
220
266
|
"nulls": "last"
|
|
221
267
|
}
|
|
222
268
|
],
|
|
223
269
|
"isUnique": false,
|
|
270
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying', 'waiting', 'waiting-children')",
|
|
224
271
|
"concurrently": false,
|
|
225
272
|
"method": "btree",
|
|
226
273
|
"with": {}
|
|
227
274
|
},
|
|
228
|
-
"
|
|
229
|
-
"name": "
|
|
275
|
+
"task_namespace_priority_age_timestamp_partial_idx": {
|
|
276
|
+
"name": "task_namespace_priority_age_timestamp_partial_idx",
|
|
230
277
|
"columns": [
|
|
231
278
|
{
|
|
232
|
-
"expression": "
|
|
279
|
+
"expression": "namespace",
|
|
280
|
+
"isExpression": false,
|
|
281
|
+
"asc": true,
|
|
282
|
+
"nulls": "last"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"expression": "priority_age_timestamp",
|
|
233
286
|
"isExpression": false,
|
|
234
287
|
"asc": true,
|
|
235
288
|
"nulls": "last"
|
|
236
289
|
}
|
|
237
290
|
],
|
|
238
291
|
"isUnique": false,
|
|
292
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying')",
|
|
239
293
|
"concurrently": false,
|
|
240
|
-
"method": "
|
|
294
|
+
"method": "btree",
|
|
241
295
|
"with": {}
|
|
242
296
|
},
|
|
243
|
-
"
|
|
244
|
-
"name": "
|
|
297
|
+
"task_namespace_type_priority_schedule_timestamp_partial_idx": {
|
|
298
|
+
"name": "task_namespace_type_priority_schedule_timestamp_partial_idx",
|
|
245
299
|
"columns": [
|
|
246
300
|
{
|
|
247
301
|
"expression": "namespace",
|
|
@@ -250,7 +304,13 @@
|
|
|
250
304
|
"nulls": "last"
|
|
251
305
|
},
|
|
252
306
|
{
|
|
253
|
-
"expression": "
|
|
307
|
+
"expression": "type",
|
|
308
|
+
"isExpression": false,
|
|
309
|
+
"asc": true,
|
|
310
|
+
"nulls": "last"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"expression": "priority",
|
|
254
314
|
"isExpression": false,
|
|
255
315
|
"asc": true,
|
|
256
316
|
"nulls": "last"
|
|
@@ -260,32 +320,74 @@
|
|
|
260
320
|
"isExpression": false,
|
|
261
321
|
"asc": true,
|
|
262
322
|
"nulls": "last"
|
|
323
|
+
}
|
|
324
|
+
],
|
|
325
|
+
"isUnique": false,
|
|
326
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying')",
|
|
327
|
+
"concurrently": false,
|
|
328
|
+
"method": "btree",
|
|
329
|
+
"with": {}
|
|
330
|
+
},
|
|
331
|
+
"task_namespace_priority_schedule_timestamp_partial_idx": {
|
|
332
|
+
"name": "task_namespace_priority_schedule_timestamp_partial_idx",
|
|
333
|
+
"columns": [
|
|
334
|
+
{
|
|
335
|
+
"expression": "namespace",
|
|
336
|
+
"isExpression": false,
|
|
337
|
+
"asc": true,
|
|
338
|
+
"nulls": "last"
|
|
263
339
|
},
|
|
264
340
|
{
|
|
265
341
|
"expression": "priority",
|
|
266
342
|
"isExpression": false,
|
|
267
343
|
"asc": true,
|
|
268
344
|
"nulls": "last"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"expression": "schedule_timestamp",
|
|
348
|
+
"isExpression": false,
|
|
349
|
+
"asc": true,
|
|
350
|
+
"nulls": "last"
|
|
269
351
|
}
|
|
270
352
|
],
|
|
271
353
|
"isUnique": false,
|
|
354
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying')",
|
|
272
355
|
"concurrently": false,
|
|
273
356
|
"method": "btree",
|
|
274
357
|
"with": {}
|
|
358
|
+
},
|
|
359
|
+
"task_namespace_tags_idx": {
|
|
360
|
+
"name": "task_namespace_tags_idx",
|
|
361
|
+
"columns": [
|
|
362
|
+
{
|
|
363
|
+
"expression": "namespace",
|
|
364
|
+
"isExpression": false,
|
|
365
|
+
"asc": true,
|
|
366
|
+
"nulls": "last"
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
"expression": "tags",
|
|
370
|
+
"isExpression": false,
|
|
371
|
+
"asc": true,
|
|
372
|
+
"nulls": "last"
|
|
373
|
+
}
|
|
374
|
+
],
|
|
375
|
+
"isUnique": false,
|
|
376
|
+
"concurrently": false,
|
|
377
|
+
"method": "gin",
|
|
378
|
+
"with": {}
|
|
275
379
|
}
|
|
276
380
|
},
|
|
277
381
|
"foreignKeys": {
|
|
278
|
-
"
|
|
279
|
-
"name": "
|
|
382
|
+
"task_parentId_task_fkey": {
|
|
383
|
+
"name": "task_parentId_task_fkey",
|
|
280
384
|
"tableFrom": "task",
|
|
281
385
|
"tableTo": "task",
|
|
282
386
|
"schemaTo": "task_queue",
|
|
283
387
|
"columnsFrom": [
|
|
284
|
-
"namespace",
|
|
285
388
|
"parent_id"
|
|
286
389
|
],
|
|
287
390
|
"columnsTo": [
|
|
288
|
-
"namespace",
|
|
289
391
|
"id"
|
|
290
392
|
],
|
|
291
393
|
"onDelete": "no action",
|
|
@@ -294,14 +396,6 @@
|
|
|
294
396
|
},
|
|
295
397
|
"compositePrimaryKeys": {},
|
|
296
398
|
"uniqueConstraints": {
|
|
297
|
-
"task_namespace_id_unique": {
|
|
298
|
-
"name": "task_namespace_id_unique",
|
|
299
|
-
"nullsNotDistinct": false,
|
|
300
|
-
"columns": [
|
|
301
|
-
"namespace",
|
|
302
|
-
"id"
|
|
303
|
-
]
|
|
304
|
-
},
|
|
305
399
|
"task_namespace_idempotency_key_unique": {
|
|
306
400
|
"name": "task_namespace_idempotency_key_unique",
|
|
307
401
|
"nullsNotDistinct": false,
|
|
@@ -357,6 +451,12 @@
|
|
|
357
451
|
"primaryKey": false,
|
|
358
452
|
"notNull": false
|
|
359
453
|
},
|
|
454
|
+
"parent_id": {
|
|
455
|
+
"name": "parent_id",
|
|
456
|
+
"type": "uuid",
|
|
457
|
+
"primaryKey": false,
|
|
458
|
+
"notNull": false
|
|
459
|
+
},
|
|
360
460
|
"tags": {
|
|
361
461
|
"name": "tags",
|
|
362
462
|
"type": "text[]",
|
|
@@ -470,12 +570,6 @@
|
|
|
470
570
|
"type": "jsonb",
|
|
471
571
|
"primaryKey": false,
|
|
472
572
|
"notNull": false
|
|
473
|
-
},
|
|
474
|
-
"parent_id": {
|
|
475
|
-
"name": "parent_id",
|
|
476
|
-
"type": "uuid",
|
|
477
|
-
"primaryKey": false,
|
|
478
|
-
"notNull": false
|
|
479
573
|
}
|
|
480
574
|
},
|
|
481
575
|
"indexes": {
|
|
@@ -519,12 +613,6 @@
|
|
|
519
613
|
"notNull": true,
|
|
520
614
|
"default": "gen_random_uuid()"
|
|
521
615
|
},
|
|
522
|
-
"namespace": {
|
|
523
|
-
"name": "namespace",
|
|
524
|
-
"type": "text",
|
|
525
|
-
"primaryKey": false,
|
|
526
|
-
"notNull": true
|
|
527
|
-
},
|
|
528
616
|
"task_id": {
|
|
529
617
|
"name": "task_id",
|
|
530
618
|
"type": "uuid",
|
|
@@ -553,15 +641,9 @@
|
|
|
553
641
|
}
|
|
554
642
|
},
|
|
555
643
|
"indexes": {
|
|
556
|
-
"
|
|
557
|
-
"name": "
|
|
644
|
+
"task_dependency_dependency_task_id_type_idx": {
|
|
645
|
+
"name": "task_dependency_dependency_task_id_type_idx",
|
|
558
646
|
"columns": [
|
|
559
|
-
{
|
|
560
|
-
"expression": "namespace",
|
|
561
|
-
"isExpression": false,
|
|
562
|
-
"asc": true,
|
|
563
|
-
"nulls": "last"
|
|
564
|
-
},
|
|
565
647
|
{
|
|
566
648
|
"expression": "dependency_task_id",
|
|
567
649
|
"isExpression": false,
|
|
@@ -582,33 +664,29 @@
|
|
|
582
664
|
}
|
|
583
665
|
},
|
|
584
666
|
"foreignKeys": {
|
|
585
|
-
"
|
|
586
|
-
"name": "
|
|
667
|
+
"task_dependency_dependencyTaskId_task_fkey": {
|
|
668
|
+
"name": "task_dependency_dependencyTaskId_task_fkey",
|
|
587
669
|
"tableFrom": "task_dependency",
|
|
588
670
|
"tableTo": "task",
|
|
589
671
|
"schemaTo": "task_queue",
|
|
590
672
|
"columnsFrom": [
|
|
591
|
-
"namespace",
|
|
592
673
|
"dependency_task_id"
|
|
593
674
|
],
|
|
594
675
|
"columnsTo": [
|
|
595
|
-
"namespace",
|
|
596
676
|
"id"
|
|
597
677
|
],
|
|
598
678
|
"onDelete": "cascade",
|
|
599
679
|
"onUpdate": "no action"
|
|
600
680
|
},
|
|
601
|
-
"
|
|
602
|
-
"name": "
|
|
681
|
+
"task_dependency_taskId_task_fkey": {
|
|
682
|
+
"name": "task_dependency_taskId_task_fkey",
|
|
603
683
|
"tableFrom": "task_dependency",
|
|
604
684
|
"tableTo": "task",
|
|
605
685
|
"schemaTo": "task_queue",
|
|
606
686
|
"columnsFrom": [
|
|
607
|
-
"namespace",
|
|
608
687
|
"task_id"
|
|
609
688
|
],
|
|
610
689
|
"columnsTo": [
|
|
611
|
-
"namespace",
|
|
612
690
|
"id"
|
|
613
691
|
],
|
|
614
692
|
"onDelete": "cascade",
|
|
@@ -617,11 +695,10 @@
|
|
|
617
695
|
},
|
|
618
696
|
"compositePrimaryKeys": {},
|
|
619
697
|
"uniqueConstraints": {
|
|
620
|
-
"
|
|
621
|
-
"name": "
|
|
698
|
+
"task_dependency_task_id_dependency_task_id_type_unique": {
|
|
699
|
+
"name": "task_dependency_task_id_dependency_task_id_type_unique",
|
|
622
700
|
"nullsNotDistinct": false,
|
|
623
701
|
"columns": [
|
|
624
|
-
"namespace",
|
|
625
702
|
"task_id",
|
|
626
703
|
"dependency_task_id",
|
|
627
704
|
"type"
|
|
@@ -639,7 +716,8 @@
|
|
|
639
716
|
"schema": "task_queue",
|
|
640
717
|
"values": [
|
|
641
718
|
"schedule",
|
|
642
|
-
"complete"
|
|
719
|
+
"complete",
|
|
720
|
+
"child"
|
|
643
721
|
]
|
|
644
722
|
},
|
|
645
723
|
"task_queue.task_status": {
|
|
@@ -653,7 +731,12 @@
|
|
|
653
731
|
"dead",
|
|
654
732
|
"waiting",
|
|
655
733
|
"waiting-children",
|
|
656
|
-
"paused"
|
|
734
|
+
"paused",
|
|
735
|
+
"retrying",
|
|
736
|
+
"timed-out",
|
|
737
|
+
"expired",
|
|
738
|
+
"skipped",
|
|
739
|
+
"orphaned"
|
|
657
740
|
]
|
|
658
741
|
}
|
|
659
742
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { inject } from '../../injector/index.js';
|
|
2
2
|
import { Injector } from '../../injector/injector.js';
|
|
3
|
-
import { Database, migrate, registerDatabaseMigration } from '../../orm/server/index.js';
|
|
3
|
+
import { Database, migrate, registerDatabaseExtension, registerDatabaseMigration } from '../../orm/server/index.js';
|
|
4
4
|
import { TaskQueueProvider } from '../provider.js';
|
|
5
5
|
import { TaskQueue } from '../task-queue.js';
|
|
6
6
|
import { PostgresTaskQueue } from './task-queue.js';
|
|
@@ -18,6 +18,7 @@ export function configurePostgresTaskQueue({ injector, ...config } = {}) {
|
|
|
18
18
|
targetInjector.registerSingleton(TaskQueueProvider, { useToken: PostgresTaskQueueProvider });
|
|
19
19
|
targetInjector.registerSingleton(TaskQueue, { useToken: PostgresTaskQueue });
|
|
20
20
|
if (config.autoMigrate != false) {
|
|
21
|
+
registerDatabaseExtension('btree_gin', { injector });
|
|
21
22
|
registerDatabaseMigration('PostgresTaskQueue', migratePostgresTaskQueueSchema, { injector });
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -3,6 +3,7 @@ export declare const taskQueueSchema: import("../../orm/server/index.js").Databa
|
|
|
3
3
|
export declare const taskDependencyType: import("../../orm/enums.js").PgEnumFromEnumeration<{
|
|
4
4
|
readonly Schedule: "schedule";
|
|
5
5
|
readonly Complete: "complete";
|
|
6
|
+
readonly Child: "child";
|
|
6
7
|
}>;
|
|
7
8
|
export declare const taskStatus: import("../../orm/enums.js").PgEnumFromEnumeration<{
|
|
8
9
|
readonly Pending: "pending";
|
|
@@ -13,6 +14,11 @@ export declare const taskStatus: import("../../orm/enums.js").PgEnumFromEnumerat
|
|
|
13
14
|
readonly Waiting: "waiting";
|
|
14
15
|
readonly WaitingChildren: "waiting-children";
|
|
15
16
|
readonly Paused: "paused";
|
|
17
|
+
readonly Retrying: "retrying";
|
|
18
|
+
readonly TimedOut: "timed-out";
|
|
19
|
+
readonly Expired: "expired";
|
|
20
|
+
readonly Skipped: "skipped";
|
|
21
|
+
readonly Orphaned: "orphaned";
|
|
16
22
|
}>;
|
|
17
23
|
export declare const task: import("../../orm/server/types.js").PgTableFromType<typeof PostgresTask, "task_queue">;
|
|
18
24
|
export declare const taskArchive: import("../../orm/server/types.js").PgTableFromType<typeof PostgresTaskArchive, "task_queue">;
|
|
@@ -3,7 +3,7 @@ import { afterResolve } from '../../injector/index.js';
|
|
|
3
3
|
import type { Query } from '../../orm/index.js';
|
|
4
4
|
import { type Transaction } from '../../orm/server/index.js';
|
|
5
5
|
import type { OneOrMany } from '../../schema/index.js';
|
|
6
|
-
import { TaskQueue, type EnqueueManyItem, type EnqueueManyOptions, type EnqueueOneOptions, type Task, type TaskQueueWaitOptions, type TaskQueueWaitResult } from '../task-queue.js';
|
|
6
|
+
import { TaskQueue, TaskStatus, type EnqueueManyItem, type EnqueueManyOptions, type EnqueueOneOptions, type Task, type TaskQueueWaitOptions, type TaskQueueWaitResult } from '../task-queue.js';
|
|
7
7
|
import type { TaskData, TaskDefinitionMap, TaskOfType, TaskResult, TasksResults, TasksStates, TaskState, TaskTypes } from '../types.js';
|
|
8
8
|
export declare class PostgresTaskQueue<Definitions extends TaskDefinitionMap = TaskDefinitionMap> extends TaskQueue<Definitions> {
|
|
9
9
|
#private;
|
|
@@ -21,7 +21,6 @@ export declare class PostgresTaskQueue<Definitions extends TaskDefinitionMap = T
|
|
|
21
21
|
readonly rateLimit: number;
|
|
22
22
|
readonly rateInterval: number;
|
|
23
23
|
readonly idempotencyWindow: number;
|
|
24
|
-
readonly globalConcurrency: number | null;
|
|
25
24
|
[afterResolve](): void;
|
|
26
25
|
enqueue<Type extends TaskTypes<Definitions>>(type: Type, data: TaskData<Definitions, Type>, options?: EnqueueOneOptions): Promise<TaskOfType<Definitions, Type>>;
|
|
27
26
|
enqueueMany<Type extends TaskTypes<Definitions>>(items: EnqueueManyItem<Definitions, Type>[], options?: EnqueueManyOptions & {
|
|
@@ -31,12 +30,17 @@ export declare class PostgresTaskQueue<Definitions extends TaskDefinitionMap = T
|
|
|
31
30
|
returnTasks: true;
|
|
32
31
|
}): Promise<TaskOfType<Definitions, Type>[]>;
|
|
33
32
|
enqueueMany<Type extends TaskTypes<Definitions>>(items: EnqueueManyItem<Definitions, Type>[], options?: EnqueueManyOptions): Promise<TaskOfType<Definitions, Type>[] | undefined>;
|
|
33
|
+
private incrementCounters;
|
|
34
34
|
has(id: string, options?: {
|
|
35
35
|
transaction?: Transaction;
|
|
36
36
|
}): Promise<boolean>;
|
|
37
37
|
countByTags(tags: OneOrMany<string>, options?: {
|
|
38
38
|
transaction?: Transaction;
|
|
39
39
|
}): Promise<number>;
|
|
40
|
+
count(options?: {
|
|
41
|
+
status?: TaskStatus;
|
|
42
|
+
transaction?: Transaction;
|
|
43
|
+
}): Promise<number>;
|
|
40
44
|
getTask<Type extends TaskTypes<Definitions> = TaskTypes<Definitions>>(id: string, options?: {
|
|
41
45
|
transaction?: Transaction;
|
|
42
46
|
}): Promise<TaskOfType<Definitions, Type> | undefined>;
|
|
@@ -107,21 +111,30 @@ export declare class PostgresTaskQueue<Definitions extends TaskDefinitionMap = T
|
|
|
107
111
|
transaction?: Transaction;
|
|
108
112
|
}): Promise<void>;
|
|
109
113
|
private resolveDependencies;
|
|
110
|
-
private
|
|
111
|
-
private transitionTask;
|
|
114
|
+
private resolveDependenciesMany;
|
|
112
115
|
maintenance(options?: {
|
|
113
116
|
transaction?: Transaction;
|
|
114
117
|
}): Promise<void>;
|
|
118
|
+
private performArchival;
|
|
119
|
+
private performArchivePurge;
|
|
120
|
+
private processExpirations;
|
|
121
|
+
private processZombieRetries;
|
|
122
|
+
private processZombieExhaustions;
|
|
123
|
+
private processHardTimeouts;
|
|
124
|
+
private processPriorityAging;
|
|
115
125
|
restart(id: string, options?: {
|
|
116
126
|
resetState?: boolean;
|
|
117
127
|
transaction?: Transaction;
|
|
118
128
|
}): Promise<void>;
|
|
119
|
-
notify(): void;
|
|
129
|
+
notify(namespace?: string): void;
|
|
120
130
|
getConsumer<Type extends TaskTypes<Definitions>>(cancellationSignal: CancellationSignal, options?: {
|
|
121
131
|
forceDequeue?: boolean;
|
|
122
132
|
types?: Type[];
|
|
123
133
|
}): AsyncIterableIterator<TaskOfType<Definitions, Type>>;
|
|
124
134
|
private maintenanceLoop;
|
|
135
|
+
private lowFrequencyMaintenanceLoop;
|
|
136
|
+
private mediumFrequencyMaintenanceLoop;
|
|
137
|
+
private highFrequencyMaintenanceLoop;
|
|
125
138
|
getBatchConsumer<Type extends TaskTypes<Definitions>>(size: number, cancellationSignal: CancellationSignal, options?: {
|
|
126
139
|
forceDequeue?: boolean;
|
|
127
140
|
types?: Type[];
|