@tstdl/base 0.93.140 → 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/application/application.d.ts +1 -1
- package/application/application.js +1 -1
- package/application/providers.d.ts +20 -2
- package/application/providers.js +34 -7
- package/audit/module.d.ts +5 -0
- package/audit/module.js +9 -1
- package/authentication/client/authentication.service.d.ts +1 -0
- package/authentication/client/authentication.service.js +3 -2
- package/authentication/server/module.d.ts +5 -0
- package/authentication/server/module.js +9 -1
- package/authentication/tests/authentication.api-controller.test.js +1 -1
- package/authentication/tests/authentication.api-request-token.provider.test.js +1 -1
- package/authentication/tests/authentication.client-service.test.js +1 -1
- 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/postgres/module.d.ts +1 -0
- package/circuit-breaker/postgres/module.js +5 -1
- package/circuit-breaker/tests/circuit-breaker.test.js +20 -0
- package/document-management/server/configure.js +5 -1
- package/document-management/server/module.d.ts +1 -1
- package/document-management/server/module.js +1 -1
- package/document-management/server/services/document-management-ancillary.service.js +1 -1
- package/document-management/tests/ai-config-hierarchy.test.js +0 -5
- package/document-management/tests/document-management-ai-overrides.test.js +0 -1
- package/document-management/tests/document-validation-ai-overrides.test.js +0 -1
- package/examples/document-management/main.d.ts +1 -0
- package/examples/document-management/main.js +14 -11
- package/key-value-store/postgres/module.d.ts +1 -0
- package/key-value-store/postgres/module.js +5 -1
- package/lock/postgres/module.d.ts +1 -0
- package/lock/postgres/module.js +5 -1
- package/mail/module.d.ts +5 -1
- package/mail/module.js +11 -6
- package/module/modules/web-server.module.js +2 -3
- package/notification/server/module.d.ts +1 -0
- package/notification/server/module.js +5 -1
- package/notification/tests/notification-api.test.js +5 -1
- package/notification/tests/notification-flow.test.js +8 -5
- package/orm/decorators.d.ts +22 -5
- package/orm/decorators.js +10 -1
- 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 +85 -56
- package/orm/server/encryption.d.ts +0 -1
- package/orm/server/encryption.js +1 -4
- package/orm/server/extension.d.ts +14 -0
- package/orm/server/extension.js +27 -0
- package/orm/server/index.d.ts +3 -6
- package/orm/server/index.js +3 -6
- package/orm/server/migration.d.ts +18 -0
- package/orm/server/migration.js +58 -0
- package/orm/server/repository.d.ts +2 -1
- package/orm/server/repository.js +19 -9
- package/orm/server/transaction.d.ts +6 -10
- package/orm/server/transaction.js +25 -26
- package/orm/server/transactional.js +3 -3
- package/orm/tests/database-extension.test.js +63 -0
- package/orm/tests/database-migration.test.js +83 -0
- package/orm/tests/encryption.test.js +3 -4
- 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/orm/utils.d.ts +17 -2
- package/orm/utils.js +49 -1
- package/package.json +5 -4
- package/rate-limit/postgres/module.d.ts +1 -0
- package/rate-limit/postgres/module.js +5 -1
- package/reflection/decorator-data.js +11 -12
- package/task-queue/README.md +2 -10
- package/task-queue/postgres/drizzle/0000_great_gwen_stacy.sql +84 -0
- package/task-queue/postgres/drizzle/meta/0000_snapshot.json +250 -89
- package/task-queue/postgres/drizzle/meta/_journal.json +2 -2
- package/task-queue/postgres/module.d.ts +1 -0
- package/task-queue/postgres/module.js +6 -1
- package/task-queue/postgres/schemas.d.ts +15 -6
- package/task-queue/postgres/schemas.js +4 -3
- package/task-queue/postgres/task-queue.d.ts +18 -15
- package/task-queue/postgres/task-queue.js +797 -499
- package/task-queue/postgres/task.model.d.ts +20 -9
- package/task-queue/postgres/task.model.js +65 -39
- package/task-queue/task-context.d.ts +12 -7
- package/task-queue/task-context.js +8 -6
- package/task-queue/task-queue.d.ts +364 -43
- package/task-queue/task-queue.js +153 -41
- package/task-queue/tests/coverage-branch.test.d.ts +1 -0
- package/task-queue/tests/coverage-branch.test.js +395 -0
- package/task-queue/tests/coverage-enhancement.test.d.ts +1 -0
- package/task-queue/tests/coverage-enhancement.test.js +150 -0
- package/task-queue/tests/dag.test.d.ts +1 -0
- package/task-queue/tests/dag.test.js +188 -0
- package/task-queue/tests/dependencies.test.js +165 -47
- package/task-queue/tests/enqueue-batch.test.d.ts +1 -0
- package/task-queue/tests/enqueue-batch.test.js +125 -0
- package/task-queue/tests/fan-out-spawning.test.d.ts +1 -0
- package/task-queue/tests/fan-out-spawning.test.js +94 -0
- package/task-queue/tests/idempotent-replacement.test.d.ts +1 -0
- package/task-queue/tests/idempotent-replacement.test.js +114 -0
- package/task-queue/tests/missing-idempotent-tasks.test.d.ts +1 -0
- package/task-queue/tests/missing-idempotent-tasks.test.js +39 -0
- package/task-queue/tests/queue.test.js +294 -49
- package/task-queue/tests/shutdown.test.d.ts +1 -0
- 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 +63 -15
- package/task-queue/tests/zombie-parent.test.d.ts +1 -0
- package/task-queue/tests/zombie-parent.test.js +45 -0
- package/task-queue/tests/zombie-recovery.test.d.ts +1 -0
- package/task-queue/tests/zombie-recovery.test.js +51 -0
- package/test5.js +5 -5
- package/testing/integration-setup.d.ts +4 -4
- package/testing/integration-setup.js +56 -29
- package/text/localization.service.js +2 -2
- package/utils/file-reader.js +1 -2
- package/utils/timing.d.ts +2 -2
- package/task-queue/postgres/drizzle/0000_simple_invisible_woman.sql +0 -74
- package/task-queue/tests/complex.test.js +0 -306
- package/task-queue/tests/extensive-dependencies.test.js +0 -234
- /package/{task-queue/tests/complex.test.d.ts → orm/tests/database-extension.test.d.ts} +0 -0
- /package/{task-queue/tests/extensive-dependencies.test.d.ts → orm/tests/database-migration.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,20 +46,14 @@
|
|
|
46
46
|
"primaryKey": false,
|
|
47
47
|
"notNull": false
|
|
48
48
|
},
|
|
49
|
-
"
|
|
50
|
-
"name": "
|
|
51
|
-
"type": "
|
|
52
|
-
"primaryKey": false,
|
|
53
|
-
"notNull": true
|
|
54
|
-
},
|
|
55
|
-
"complete_after_tags": {
|
|
56
|
-
"name": "complete_after_tags",
|
|
57
|
-
"type": "text[]",
|
|
49
|
+
"parent_id": {
|
|
50
|
+
"name": "parent_id",
|
|
51
|
+
"type": "uuid",
|
|
58
52
|
"primaryKey": false,
|
|
59
|
-
"notNull":
|
|
53
|
+
"notNull": false
|
|
60
54
|
},
|
|
61
|
-
"
|
|
62
|
-
"name": "
|
|
55
|
+
"tags": {
|
|
56
|
+
"name": "tags",
|
|
63
57
|
"type": "text[]",
|
|
64
58
|
"primaryKey": false,
|
|
65
59
|
"notNull": true
|
|
@@ -70,22 +64,20 @@
|
|
|
70
64
|
"primaryKey": false,
|
|
71
65
|
"notNull": true
|
|
72
66
|
},
|
|
73
|
-
"
|
|
74
|
-
"name": "
|
|
75
|
-
"type": "
|
|
76
|
-
"typeSchema": "task_queue",
|
|
67
|
+
"priority": {
|
|
68
|
+
"name": "priority",
|
|
69
|
+
"type": "integer",
|
|
77
70
|
"primaryKey": false,
|
|
78
71
|
"notNull": true
|
|
79
72
|
},
|
|
80
|
-
"
|
|
81
|
-
"name": "
|
|
82
|
-
"type": "
|
|
83
|
-
"typeSchema": "task_queue",
|
|
73
|
+
"unresolved_schedule_dependencies": {
|
|
74
|
+
"name": "unresolved_schedule_dependencies",
|
|
75
|
+
"type": "integer",
|
|
84
76
|
"primaryKey": false,
|
|
85
77
|
"notNull": true
|
|
86
78
|
},
|
|
87
|
-
"
|
|
88
|
-
"name": "
|
|
79
|
+
"unresolved_complete_dependencies": {
|
|
80
|
+
"name": "unresolved_complete_dependencies",
|
|
89
81
|
"type": "integer",
|
|
90
82
|
"primaryKey": false,
|
|
91
83
|
"notNull": true
|
|
@@ -173,17 +165,11 @@
|
|
|
173
165
|
"type": "jsonb",
|
|
174
166
|
"primaryKey": false,
|
|
175
167
|
"notNull": false
|
|
176
|
-
},
|
|
177
|
-
"parent_id": {
|
|
178
|
-
"name": "parent_id",
|
|
179
|
-
"type": "uuid",
|
|
180
|
-
"primaryKey": false,
|
|
181
|
-
"notNull": false
|
|
182
168
|
}
|
|
183
169
|
},
|
|
184
170
|
"indexes": {
|
|
185
|
-
"
|
|
186
|
-
"name": "
|
|
171
|
+
"task_parent_id_partial_idx": {
|
|
172
|
+
"name": "task_parent_id_partial_idx",
|
|
187
173
|
"columns": [
|
|
188
174
|
{
|
|
189
175
|
"expression": "parent_id",
|
|
@@ -193,99 +179,123 @@
|
|
|
193
179
|
}
|
|
194
180
|
],
|
|
195
181
|
"isUnique": false,
|
|
182
|
+
"where": "\"task_queue\".\"task\".\"parent_id\" is not null",
|
|
196
183
|
"concurrently": false,
|
|
197
184
|
"method": "btree",
|
|
198
185
|
"with": {}
|
|
199
186
|
},
|
|
200
|
-
"
|
|
201
|
-
"name": "
|
|
187
|
+
"task_namespace_complete_timestamp_partial_idx": {
|
|
188
|
+
"name": "task_namespace_complete_timestamp_partial_idx",
|
|
202
189
|
"columns": [
|
|
203
190
|
{
|
|
204
|
-
"expression": "
|
|
191
|
+
"expression": "namespace",
|
|
205
192
|
"isExpression": false,
|
|
206
193
|
"asc": true,
|
|
207
194
|
"nulls": "last"
|
|
208
195
|
},
|
|
209
196
|
{
|
|
210
|
-
"expression": "
|
|
197
|
+
"expression": "complete_timestamp",
|
|
211
198
|
"isExpression": false,
|
|
212
199
|
"asc": true,
|
|
213
200
|
"nulls": "last"
|
|
214
201
|
}
|
|
215
202
|
],
|
|
216
203
|
"isUnique": false,
|
|
204
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('completed', 'cancelled', 'dead', 'timed-out', 'expired', 'skipped', 'orphaned')",
|
|
217
205
|
"concurrently": false,
|
|
218
206
|
"method": "btree",
|
|
219
207
|
"with": {}
|
|
220
208
|
},
|
|
221
|
-
"
|
|
222
|
-
"name": "
|
|
209
|
+
"task_namespace_start_timestamp_partial_idx": {
|
|
210
|
+
"name": "task_namespace_start_timestamp_partial_idx",
|
|
223
211
|
"columns": [
|
|
224
212
|
{
|
|
225
|
-
"expression": "
|
|
213
|
+
"expression": "namespace",
|
|
226
214
|
"isExpression": false,
|
|
227
215
|
"asc": true,
|
|
228
216
|
"nulls": "last"
|
|
229
217
|
},
|
|
230
218
|
{
|
|
231
|
-
"expression": "
|
|
219
|
+
"expression": "start_timestamp",
|
|
232
220
|
"isExpression": false,
|
|
233
221
|
"asc": true,
|
|
234
222
|
"nulls": "last"
|
|
235
223
|
}
|
|
236
224
|
],
|
|
237
225
|
"isUnique": false,
|
|
226
|
+
"where": "\"task_queue\".\"task\".\"status\" = 'running'",
|
|
238
227
|
"concurrently": false,
|
|
239
228
|
"method": "btree",
|
|
240
229
|
"with": {}
|
|
241
230
|
},
|
|
242
|
-
"
|
|
243
|
-
"name": "
|
|
231
|
+
"task_namespace_visibility_deadline_partial_idx": {
|
|
232
|
+
"name": "task_namespace_visibility_deadline_partial_idx",
|
|
244
233
|
"columns": [
|
|
245
234
|
{
|
|
246
|
-
"expression": "
|
|
235
|
+
"expression": "namespace",
|
|
236
|
+
"isExpression": false,
|
|
237
|
+
"asc": true,
|
|
238
|
+
"nulls": "last"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"expression": "visibility_deadline",
|
|
247
242
|
"isExpression": false,
|
|
248
243
|
"asc": true,
|
|
249
244
|
"nulls": "last"
|
|
250
245
|
}
|
|
251
246
|
],
|
|
252
247
|
"isUnique": false,
|
|
248
|
+
"where": "\"task_queue\".\"task\".\"status\" = 'running'",
|
|
253
249
|
"concurrently": false,
|
|
254
|
-
"method": "
|
|
250
|
+
"method": "btree",
|
|
255
251
|
"with": {}
|
|
256
252
|
},
|
|
257
|
-
"
|
|
258
|
-
"name": "
|
|
253
|
+
"task_namespace_time_to_live_partial_idx": {
|
|
254
|
+
"name": "task_namespace_time_to_live_partial_idx",
|
|
259
255
|
"columns": [
|
|
260
256
|
{
|
|
261
|
-
"expression": "
|
|
257
|
+
"expression": "namespace",
|
|
258
|
+
"isExpression": false,
|
|
259
|
+
"asc": true,
|
|
260
|
+
"nulls": "last"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"expression": "time_to_live",
|
|
262
264
|
"isExpression": false,
|
|
263
265
|
"asc": true,
|
|
264
266
|
"nulls": "last"
|
|
265
267
|
}
|
|
266
268
|
],
|
|
267
269
|
"isUnique": false,
|
|
270
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying', 'waiting', 'waiting-children')",
|
|
268
271
|
"concurrently": false,
|
|
269
|
-
"method": "
|
|
272
|
+
"method": "btree",
|
|
270
273
|
"with": {}
|
|
271
274
|
},
|
|
272
|
-
"
|
|
273
|
-
"name": "
|
|
275
|
+
"task_namespace_priority_age_timestamp_partial_idx": {
|
|
276
|
+
"name": "task_namespace_priority_age_timestamp_partial_idx",
|
|
274
277
|
"columns": [
|
|
275
278
|
{
|
|
276
|
-
"expression": "
|
|
279
|
+
"expression": "namespace",
|
|
280
|
+
"isExpression": false,
|
|
281
|
+
"asc": true,
|
|
282
|
+
"nulls": "last"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"expression": "priority_age_timestamp",
|
|
277
286
|
"isExpression": false,
|
|
278
287
|
"asc": true,
|
|
279
288
|
"nulls": "last"
|
|
280
289
|
}
|
|
281
290
|
],
|
|
282
291
|
"isUnique": false,
|
|
292
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying')",
|
|
283
293
|
"concurrently": false,
|
|
284
|
-
"method": "
|
|
294
|
+
"method": "btree",
|
|
285
295
|
"with": {}
|
|
286
296
|
},
|
|
287
|
-
"
|
|
288
|
-
"name": "
|
|
297
|
+
"task_namespace_type_priority_schedule_timestamp_partial_idx": {
|
|
298
|
+
"name": "task_namespace_type_priority_schedule_timestamp_partial_idx",
|
|
289
299
|
"columns": [
|
|
290
300
|
{
|
|
291
301
|
"expression": "namespace",
|
|
@@ -294,7 +304,13 @@
|
|
|
294
304
|
"nulls": "last"
|
|
295
305
|
},
|
|
296
306
|
{
|
|
297
|
-
"expression": "
|
|
307
|
+
"expression": "type",
|
|
308
|
+
"isExpression": false,
|
|
309
|
+
"asc": true,
|
|
310
|
+
"nulls": "last"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"expression": "priority",
|
|
298
314
|
"isExpression": false,
|
|
299
315
|
"asc": true,
|
|
300
316
|
"nulls": "last"
|
|
@@ -304,23 +320,67 @@
|
|
|
304
320
|
"isExpression": false,
|
|
305
321
|
"asc": true,
|
|
306
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"
|
|
307
339
|
},
|
|
308
340
|
{
|
|
309
341
|
"expression": "priority",
|
|
310
342
|
"isExpression": false,
|
|
311
343
|
"asc": true,
|
|
312
344
|
"nulls": "last"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"expression": "schedule_timestamp",
|
|
348
|
+
"isExpression": false,
|
|
349
|
+
"asc": true,
|
|
350
|
+
"nulls": "last"
|
|
313
351
|
}
|
|
314
352
|
],
|
|
315
353
|
"isUnique": false,
|
|
354
|
+
"where": "\"task_queue\".\"task\".\"status\" in ('pending', 'retrying')",
|
|
316
355
|
"concurrently": false,
|
|
317
356
|
"method": "btree",
|
|
318
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": {}
|
|
319
379
|
}
|
|
320
380
|
},
|
|
321
381
|
"foreignKeys": {
|
|
322
|
-
"
|
|
323
|
-
"name": "
|
|
382
|
+
"task_parentId_task_fkey": {
|
|
383
|
+
"name": "task_parentId_task_fkey",
|
|
324
384
|
"tableFrom": "task",
|
|
325
385
|
"tableTo": "task",
|
|
326
386
|
"schemaTo": "task_queue",
|
|
@@ -391,20 +451,14 @@
|
|
|
391
451
|
"primaryKey": false,
|
|
392
452
|
"notNull": false
|
|
393
453
|
},
|
|
394
|
-
"
|
|
395
|
-
"name": "
|
|
396
|
-
"type": "
|
|
397
|
-
"primaryKey": false,
|
|
398
|
-
"notNull": true
|
|
399
|
-
},
|
|
400
|
-
"complete_after_tags": {
|
|
401
|
-
"name": "complete_after_tags",
|
|
402
|
-
"type": "text[]",
|
|
454
|
+
"parent_id": {
|
|
455
|
+
"name": "parent_id",
|
|
456
|
+
"type": "uuid",
|
|
403
457
|
"primaryKey": false,
|
|
404
|
-
"notNull":
|
|
458
|
+
"notNull": false
|
|
405
459
|
},
|
|
406
|
-
"
|
|
407
|
-
"name": "
|
|
460
|
+
"tags": {
|
|
461
|
+
"name": "tags",
|
|
408
462
|
"type": "text[]",
|
|
409
463
|
"primaryKey": false,
|
|
410
464
|
"notNull": true
|
|
@@ -415,22 +469,20 @@
|
|
|
415
469
|
"primaryKey": false,
|
|
416
470
|
"notNull": true
|
|
417
471
|
},
|
|
418
|
-
"
|
|
419
|
-
"name": "
|
|
420
|
-
"type": "
|
|
421
|
-
"typeSchema": "task_queue",
|
|
472
|
+
"priority": {
|
|
473
|
+
"name": "priority",
|
|
474
|
+
"type": "integer",
|
|
422
475
|
"primaryKey": false,
|
|
423
476
|
"notNull": true
|
|
424
477
|
},
|
|
425
|
-
"
|
|
426
|
-
"name": "
|
|
427
|
-
"type": "
|
|
428
|
-
"typeSchema": "task_queue",
|
|
478
|
+
"unresolved_schedule_dependencies": {
|
|
479
|
+
"name": "unresolved_schedule_dependencies",
|
|
480
|
+
"type": "integer",
|
|
429
481
|
"primaryKey": false,
|
|
430
482
|
"notNull": true
|
|
431
483
|
},
|
|
432
|
-
"
|
|
433
|
-
"name": "
|
|
484
|
+
"unresolved_complete_dependencies": {
|
|
485
|
+
"name": "unresolved_complete_dependencies",
|
|
434
486
|
"type": "integer",
|
|
435
487
|
"primaryKey": false,
|
|
436
488
|
"notNull": true
|
|
@@ -518,12 +570,6 @@
|
|
|
518
570
|
"type": "jsonb",
|
|
519
571
|
"primaryKey": false,
|
|
520
572
|
"notNull": false
|
|
521
|
-
},
|
|
522
|
-
"parent_id": {
|
|
523
|
-
"name": "parent_id",
|
|
524
|
-
"type": "uuid",
|
|
525
|
-
"primaryKey": false,
|
|
526
|
-
"notNull": false
|
|
527
573
|
}
|
|
528
574
|
},
|
|
529
575
|
"indexes": {
|
|
@@ -555,15 +601,123 @@
|
|
|
555
601
|
"policies": {},
|
|
556
602
|
"checkConstraints": {},
|
|
557
603
|
"isRLSEnabled": false
|
|
604
|
+
},
|
|
605
|
+
"task_queue.task_dependency": {
|
|
606
|
+
"name": "task_dependency",
|
|
607
|
+
"schema": "task_queue",
|
|
608
|
+
"columns": {
|
|
609
|
+
"id": {
|
|
610
|
+
"name": "id",
|
|
611
|
+
"type": "uuid",
|
|
612
|
+
"primaryKey": true,
|
|
613
|
+
"notNull": true,
|
|
614
|
+
"default": "gen_random_uuid()"
|
|
615
|
+
},
|
|
616
|
+
"task_id": {
|
|
617
|
+
"name": "task_id",
|
|
618
|
+
"type": "uuid",
|
|
619
|
+
"primaryKey": false,
|
|
620
|
+
"notNull": true
|
|
621
|
+
},
|
|
622
|
+
"dependency_task_id": {
|
|
623
|
+
"name": "dependency_task_id",
|
|
624
|
+
"type": "uuid",
|
|
625
|
+
"primaryKey": false,
|
|
626
|
+
"notNull": true
|
|
627
|
+
},
|
|
628
|
+
"type": {
|
|
629
|
+
"name": "type",
|
|
630
|
+
"type": "task_dependency_type",
|
|
631
|
+
"typeSchema": "task_queue",
|
|
632
|
+
"primaryKey": false,
|
|
633
|
+
"notNull": true
|
|
634
|
+
},
|
|
635
|
+
"required_statuses": {
|
|
636
|
+
"name": "required_statuses",
|
|
637
|
+
"type": "task_status[]",
|
|
638
|
+
"typeSchema": "task_queue",
|
|
639
|
+
"primaryKey": false,
|
|
640
|
+
"notNull": true
|
|
641
|
+
}
|
|
642
|
+
},
|
|
643
|
+
"indexes": {
|
|
644
|
+
"task_dependency_dependency_task_id_type_idx": {
|
|
645
|
+
"name": "task_dependency_dependency_task_id_type_idx",
|
|
646
|
+
"columns": [
|
|
647
|
+
{
|
|
648
|
+
"expression": "dependency_task_id",
|
|
649
|
+
"isExpression": false,
|
|
650
|
+
"asc": true,
|
|
651
|
+
"nulls": "last"
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
"expression": "type",
|
|
655
|
+
"isExpression": false,
|
|
656
|
+
"asc": true,
|
|
657
|
+
"nulls": "last"
|
|
658
|
+
}
|
|
659
|
+
],
|
|
660
|
+
"isUnique": false,
|
|
661
|
+
"concurrently": false,
|
|
662
|
+
"method": "btree",
|
|
663
|
+
"with": {}
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
"foreignKeys": {
|
|
667
|
+
"task_dependency_dependencyTaskId_task_fkey": {
|
|
668
|
+
"name": "task_dependency_dependencyTaskId_task_fkey",
|
|
669
|
+
"tableFrom": "task_dependency",
|
|
670
|
+
"tableTo": "task",
|
|
671
|
+
"schemaTo": "task_queue",
|
|
672
|
+
"columnsFrom": [
|
|
673
|
+
"dependency_task_id"
|
|
674
|
+
],
|
|
675
|
+
"columnsTo": [
|
|
676
|
+
"id"
|
|
677
|
+
],
|
|
678
|
+
"onDelete": "cascade",
|
|
679
|
+
"onUpdate": "no action"
|
|
680
|
+
},
|
|
681
|
+
"task_dependency_taskId_task_fkey": {
|
|
682
|
+
"name": "task_dependency_taskId_task_fkey",
|
|
683
|
+
"tableFrom": "task_dependency",
|
|
684
|
+
"tableTo": "task",
|
|
685
|
+
"schemaTo": "task_queue",
|
|
686
|
+
"columnsFrom": [
|
|
687
|
+
"task_id"
|
|
688
|
+
],
|
|
689
|
+
"columnsTo": [
|
|
690
|
+
"id"
|
|
691
|
+
],
|
|
692
|
+
"onDelete": "cascade",
|
|
693
|
+
"onUpdate": "no action"
|
|
694
|
+
}
|
|
695
|
+
},
|
|
696
|
+
"compositePrimaryKeys": {},
|
|
697
|
+
"uniqueConstraints": {
|
|
698
|
+
"task_dependency_task_id_dependency_task_id_type_unique": {
|
|
699
|
+
"name": "task_dependency_task_id_dependency_task_id_type_unique",
|
|
700
|
+
"nullsNotDistinct": false,
|
|
701
|
+
"columns": [
|
|
702
|
+
"task_id",
|
|
703
|
+
"dependency_task_id",
|
|
704
|
+
"type"
|
|
705
|
+
]
|
|
706
|
+
}
|
|
707
|
+
},
|
|
708
|
+
"policies": {},
|
|
709
|
+
"checkConstraints": {},
|
|
710
|
+
"isRLSEnabled": false
|
|
558
711
|
}
|
|
559
712
|
},
|
|
560
713
|
"enums": {
|
|
561
|
-
"task_queue.
|
|
562
|
-
"name": "
|
|
714
|
+
"task_queue.task_dependency_type": {
|
|
715
|
+
"name": "task_dependency_type",
|
|
563
716
|
"schema": "task_queue",
|
|
564
717
|
"values": [
|
|
565
|
-
"
|
|
566
|
-
"
|
|
718
|
+
"schedule",
|
|
719
|
+
"complete",
|
|
720
|
+
"child"
|
|
567
721
|
]
|
|
568
722
|
},
|
|
569
723
|
"task_queue.task_status": {
|
|
@@ -574,8 +728,15 @@
|
|
|
574
728
|
"running",
|
|
575
729
|
"completed",
|
|
576
730
|
"cancelled",
|
|
731
|
+
"dead",
|
|
577
732
|
"waiting",
|
|
578
|
-
"
|
|
733
|
+
"waiting-children",
|
|
734
|
+
"paused",
|
|
735
|
+
"retrying",
|
|
736
|
+
"timed-out",
|
|
737
|
+
"expired",
|
|
738
|
+
"skipped",
|
|
739
|
+
"orphaned"
|
|
579
740
|
]
|
|
580
741
|
}
|
|
581
742
|
},
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { inject } from '../../injector/index.js';
|
|
2
2
|
import { Injector } from '../../injector/injector.js';
|
|
3
|
-
import { Database, migrate } 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';
|
|
7
7
|
import { PostgresTaskQueueProvider } from './task-queue.provider.js';
|
|
8
8
|
export class PostgresTaskQueueModuleConfig {
|
|
9
9
|
database;
|
|
10
|
+
autoMigrate;
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* configure queue module
|
|
@@ -16,6 +17,10 @@ export function configurePostgresTaskQueue({ injector, ...config } = {}) {
|
|
|
16
17
|
targetInjector.register(PostgresTaskQueueModuleConfig, { useValue: config });
|
|
17
18
|
targetInjector.registerSingleton(TaskQueueProvider, { useToken: PostgresTaskQueueProvider });
|
|
18
19
|
targetInjector.registerSingleton(TaskQueue, { useToken: PostgresTaskQueue });
|
|
20
|
+
if (config.autoMigrate != false) {
|
|
21
|
+
registerDatabaseExtension('btree_gin', { injector });
|
|
22
|
+
registerDatabaseMigration('PostgresTaskQueue', migratePostgresTaskQueueSchema, { injector });
|
|
23
|
+
}
|
|
19
24
|
}
|
|
20
25
|
export async function migratePostgresTaskQueueSchema() {
|
|
21
26
|
const connection = inject(PostgresTaskQueueModuleConfig, undefined, { optional: true })?.database?.connection;
|