@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.
Files changed (123) hide show
  1. package/application/application.d.ts +1 -1
  2. package/application/application.js +1 -1
  3. package/application/providers.d.ts +20 -2
  4. package/application/providers.js +34 -7
  5. package/audit/module.d.ts +5 -0
  6. package/audit/module.js +9 -1
  7. package/authentication/client/authentication.service.d.ts +1 -0
  8. package/authentication/client/authentication.service.js +3 -2
  9. package/authentication/server/module.d.ts +5 -0
  10. package/authentication/server/module.js +9 -1
  11. package/authentication/tests/authentication.api-controller.test.js +1 -1
  12. package/authentication/tests/authentication.api-request-token.provider.test.js +1 -1
  13. package/authentication/tests/authentication.client-service.test.js +1 -1
  14. package/circuit-breaker/circuit-breaker.d.ts +6 -4
  15. package/circuit-breaker/postgres/circuit-breaker.d.ts +1 -0
  16. package/circuit-breaker/postgres/circuit-breaker.js +8 -5
  17. package/circuit-breaker/postgres/module.d.ts +1 -0
  18. package/circuit-breaker/postgres/module.js +5 -1
  19. package/circuit-breaker/tests/circuit-breaker.test.js +20 -0
  20. package/document-management/server/configure.js +5 -1
  21. package/document-management/server/module.d.ts +1 -1
  22. package/document-management/server/module.js +1 -1
  23. package/document-management/server/services/document-management-ancillary.service.js +1 -1
  24. package/document-management/tests/ai-config-hierarchy.test.js +0 -5
  25. package/document-management/tests/document-management-ai-overrides.test.js +0 -1
  26. package/document-management/tests/document-validation-ai-overrides.test.js +0 -1
  27. package/examples/document-management/main.d.ts +1 -0
  28. package/examples/document-management/main.js +14 -11
  29. package/key-value-store/postgres/module.d.ts +1 -0
  30. package/key-value-store/postgres/module.js +5 -1
  31. package/lock/postgres/module.d.ts +1 -0
  32. package/lock/postgres/module.js +5 -1
  33. package/mail/module.d.ts +5 -1
  34. package/mail/module.js +11 -6
  35. package/module/modules/web-server.module.js +2 -3
  36. package/notification/server/module.d.ts +1 -0
  37. package/notification/server/module.js +5 -1
  38. package/notification/tests/notification-api.test.js +5 -1
  39. package/notification/tests/notification-flow.test.js +8 -5
  40. package/orm/decorators.d.ts +22 -5
  41. package/orm/decorators.js +10 -1
  42. package/orm/server/bootstrap.d.ts +11 -0
  43. package/orm/server/bootstrap.js +31 -0
  44. package/orm/server/drizzle/schema-converter.d.ts +3 -1
  45. package/orm/server/drizzle/schema-converter.js +85 -56
  46. package/orm/server/encryption.d.ts +0 -1
  47. package/orm/server/encryption.js +1 -4
  48. package/orm/server/extension.d.ts +14 -0
  49. package/orm/server/extension.js +27 -0
  50. package/orm/server/index.d.ts +3 -6
  51. package/orm/server/index.js +3 -6
  52. package/orm/server/migration.d.ts +18 -0
  53. package/orm/server/migration.js +58 -0
  54. package/orm/server/repository.d.ts +2 -1
  55. package/orm/server/repository.js +19 -9
  56. package/orm/server/transaction.d.ts +6 -10
  57. package/orm/server/transaction.js +25 -26
  58. package/orm/server/transactional.js +3 -3
  59. package/orm/tests/database-extension.test.js +63 -0
  60. package/orm/tests/database-migration.test.js +83 -0
  61. package/orm/tests/encryption.test.js +3 -4
  62. package/orm/tests/repository-compound-primary-key.test.d.ts +2 -0
  63. package/orm/tests/repository-compound-primary-key.test.js +234 -0
  64. package/orm/tests/schema-generation.test.d.ts +1 -0
  65. package/orm/tests/schema-generation.test.js +52 -5
  66. package/orm/utils.d.ts +17 -2
  67. package/orm/utils.js +49 -1
  68. package/package.json +5 -4
  69. package/rate-limit/postgres/module.d.ts +1 -0
  70. package/rate-limit/postgres/module.js +5 -1
  71. package/reflection/decorator-data.js +11 -12
  72. package/task-queue/README.md +2 -10
  73. package/task-queue/postgres/drizzle/0000_great_gwen_stacy.sql +84 -0
  74. package/task-queue/postgres/drizzle/meta/0000_snapshot.json +250 -89
  75. package/task-queue/postgres/drizzle/meta/_journal.json +2 -2
  76. package/task-queue/postgres/module.d.ts +1 -0
  77. package/task-queue/postgres/module.js +6 -1
  78. package/task-queue/postgres/schemas.d.ts +15 -6
  79. package/task-queue/postgres/schemas.js +4 -3
  80. package/task-queue/postgres/task-queue.d.ts +18 -15
  81. package/task-queue/postgres/task-queue.js +797 -499
  82. package/task-queue/postgres/task.model.d.ts +20 -9
  83. package/task-queue/postgres/task.model.js +65 -39
  84. package/task-queue/task-context.d.ts +12 -7
  85. package/task-queue/task-context.js +8 -6
  86. package/task-queue/task-queue.d.ts +364 -43
  87. package/task-queue/task-queue.js +153 -41
  88. package/task-queue/tests/coverage-branch.test.d.ts +1 -0
  89. package/task-queue/tests/coverage-branch.test.js +395 -0
  90. package/task-queue/tests/coverage-enhancement.test.d.ts +1 -0
  91. package/task-queue/tests/coverage-enhancement.test.js +150 -0
  92. package/task-queue/tests/dag.test.d.ts +1 -0
  93. package/task-queue/tests/dag.test.js +188 -0
  94. package/task-queue/tests/dependencies.test.js +165 -47
  95. package/task-queue/tests/enqueue-batch.test.d.ts +1 -0
  96. package/task-queue/tests/enqueue-batch.test.js +125 -0
  97. package/task-queue/tests/fan-out-spawning.test.d.ts +1 -0
  98. package/task-queue/tests/fan-out-spawning.test.js +94 -0
  99. package/task-queue/tests/idempotent-replacement.test.d.ts +1 -0
  100. package/task-queue/tests/idempotent-replacement.test.js +114 -0
  101. package/task-queue/tests/missing-idempotent-tasks.test.d.ts +1 -0
  102. package/task-queue/tests/missing-idempotent-tasks.test.js +39 -0
  103. package/task-queue/tests/queue.test.js +294 -49
  104. package/task-queue/tests/shutdown.test.d.ts +1 -0
  105. package/task-queue/tests/shutdown.test.js +41 -0
  106. package/task-queue/tests/transactions.test.d.ts +1 -0
  107. package/task-queue/tests/transactions.test.js +47 -0
  108. package/task-queue/tests/worker.test.js +63 -15
  109. package/task-queue/tests/zombie-parent.test.d.ts +1 -0
  110. package/task-queue/tests/zombie-parent.test.js +45 -0
  111. package/task-queue/tests/zombie-recovery.test.d.ts +1 -0
  112. package/task-queue/tests/zombie-recovery.test.js +51 -0
  113. package/test5.js +5 -5
  114. package/testing/integration-setup.d.ts +4 -4
  115. package/testing/integration-setup.js +56 -29
  116. package/text/localization.service.js +2 -2
  117. package/utils/file-reader.js +1 -2
  118. package/utils/timing.d.ts +2 -2
  119. package/task-queue/postgres/drizzle/0000_simple_invisible_woman.sql +0 -74
  120. package/task-queue/tests/complex.test.js +0 -306
  121. package/task-queue/tests/extensive-dependencies.test.js +0 -234
  122. /package/{task-queue/tests/complex.test.d.ts → orm/tests/database-extension.test.d.ts} +0 -0
  123. /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": "4a091e17-ecca-4dcc-9681-ee533ba465a9",
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
- "tags": {
50
- "name": "tags",
51
- "type": "text[]",
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": true
53
+ "notNull": false
60
54
  },
61
- "schedule_after_tags": {
62
- "name": "schedule_after_tags",
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
- "dependency_join_mode": {
74
- "name": "dependency_join_mode",
75
- "type": "dependency_join_mode",
76
- "typeSchema": "task_queue",
67
+ "priority": {
68
+ "name": "priority",
69
+ "type": "integer",
77
70
  "primaryKey": false,
78
71
  "notNull": true
79
72
  },
80
- "dependency_trigger_statuses": {
81
- "name": "dependency_trigger_statuses",
82
- "type": "task_status[]",
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
- "priority": {
88
- "name": "priority",
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
- "task_parent_id_idx": {
186
- "name": "task_parent_id_idx",
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
- "task_status_visibility_deadline_idx": {
201
- "name": "task_status_visibility_deadline_idx",
187
+ "task_namespace_complete_timestamp_partial_idx": {
188
+ "name": "task_namespace_complete_timestamp_partial_idx",
202
189
  "columns": [
203
190
  {
204
- "expression": "status",
191
+ "expression": "namespace",
205
192
  "isExpression": false,
206
193
  "asc": true,
207
194
  "nulls": "last"
208
195
  },
209
196
  {
210
- "expression": "visibility_deadline",
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
- "task_status_complete_timestamp_idx": {
222
- "name": "task_status_complete_timestamp_idx",
209
+ "task_namespace_start_timestamp_partial_idx": {
210
+ "name": "task_namespace_start_timestamp_partial_idx",
223
211
  "columns": [
224
212
  {
225
- "expression": "status",
213
+ "expression": "namespace",
226
214
  "isExpression": false,
227
215
  "asc": true,
228
216
  "nulls": "last"
229
217
  },
230
218
  {
231
- "expression": "complete_timestamp",
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
- "task_schedule_after_tags_idx": {
243
- "name": "task_schedule_after_tags_idx",
231
+ "task_namespace_visibility_deadline_partial_idx": {
232
+ "name": "task_namespace_visibility_deadline_partial_idx",
244
233
  "columns": [
245
234
  {
246
- "expression": "schedule_after_tags",
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": "gin",
250
+ "method": "btree",
255
251
  "with": {}
256
252
  },
257
- "task_complete_after_tags_idx": {
258
- "name": "task_complete_after_tags_idx",
253
+ "task_namespace_time_to_live_partial_idx": {
254
+ "name": "task_namespace_time_to_live_partial_idx",
259
255
  "columns": [
260
256
  {
261
- "expression": "complete_after_tags",
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": "gin",
272
+ "method": "btree",
270
273
  "with": {}
271
274
  },
272
- "task_tags_idx": {
273
- "name": "task_tags_idx",
275
+ "task_namespace_priority_age_timestamp_partial_idx": {
276
+ "name": "task_namespace_priority_age_timestamp_partial_idx",
274
277
  "columns": [
275
278
  {
276
- "expression": "tags",
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": "gin",
294
+ "method": "btree",
285
295
  "with": {}
286
296
  },
287
- "task_namespace_status_schedule_timestamp_priority_idx": {
288
- "name": "task_namespace_status_schedule_timestamp_priority_idx",
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": "status",
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
- "task_parent_id_task_id_fk": {
323
- "name": "task_parent_id_task_id_fk",
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
- "tags": {
395
- "name": "tags",
396
- "type": "text[]",
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": true
458
+ "notNull": false
405
459
  },
406
- "schedule_after_tags": {
407
- "name": "schedule_after_tags",
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
- "dependency_join_mode": {
419
- "name": "dependency_join_mode",
420
- "type": "dependency_join_mode",
421
- "typeSchema": "task_queue",
472
+ "priority": {
473
+ "name": "priority",
474
+ "type": "integer",
422
475
  "primaryKey": false,
423
476
  "notNull": true
424
477
  },
425
- "dependency_trigger_statuses": {
426
- "name": "dependency_trigger_statuses",
427
- "type": "task_status[]",
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
- "priority": {
433
- "name": "priority",
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.dependency_join_mode": {
562
- "name": "dependency_join_mode",
714
+ "task_queue.task_dependency_type": {
715
+ "name": "task_dependency_type",
563
716
  "schema": "task_queue",
564
717
  "values": [
565
- "and",
566
- "or"
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
- "dead"
733
+ "waiting-children",
734
+ "paused",
735
+ "retrying",
736
+ "timed-out",
737
+ "expired",
738
+ "skipped",
739
+ "orphaned"
579
740
  ]
580
741
  }
581
742
  },
@@ -5,8 +5,8 @@
5
5
  {
6
6
  "idx": 0,
7
7
  "version": "7",
8
- "when": 1769034172474,
9
- "tag": "0000_simple_invisible_woman",
8
+ "when": 1772048658458,
9
+ "tag": "0000_great_gwen_stacy",
10
10
  "breakpoints": true
11
11
  }
12
12
  ]
@@ -2,6 +2,7 @@ import { Injector } from '../../injector/injector.js';
2
2
  import { type DatabaseConfig } from '../../orm/server/index.js';
3
3
  export declare class PostgresTaskQueueModuleConfig {
4
4
  database?: DatabaseConfig;
5
+ autoMigrate?: boolean;
5
6
  }
6
7
  /**
7
8
  * configure queue module
@@ -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;