@tstdl/base 0.93.92 → 0.93.94

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 (42) hide show
  1. package/authentication/client/authentication.service.js +3 -2
  2. package/document-management/server/services/document-validation.service.js +5 -5
  3. package/document-management/server/services/document-workflow.service.js +2 -2
  4. package/orm/sqls/sqls.d.ts +6 -6
  5. package/package.json +2 -2
  6. package/task-queue/enqueue-batch.d.ts +16 -11
  7. package/task-queue/enqueue-batch.js +2 -2
  8. package/task-queue/index.d.ts +2 -1
  9. package/task-queue/index.js +2 -1
  10. package/task-queue/postgres/drizzle/{0000_thin_black_panther.sql → 0000_simple_invisible_woman.sql} +5 -5
  11. package/task-queue/postgres/drizzle/meta/0000_snapshot.json +11 -11
  12. package/task-queue/postgres/drizzle/meta/_journal.json +2 -2
  13. package/task-queue/postgres/module.js +2 -2
  14. package/task-queue/postgres/schemas.d.ts +1 -1
  15. package/task-queue/postgres/schemas.js +2 -2
  16. package/task-queue/postgres/task-queue.d.ts +101 -47
  17. package/task-queue/postgres/task-queue.js +149 -139
  18. package/task-queue/postgres/task-queue.provider.d.ts +3 -4
  19. package/task-queue/postgres/task-queue.provider.js +2 -2
  20. package/task-queue/postgres/task.model.d.ts +5 -5
  21. package/task-queue/postgres/task.model.js +5 -5
  22. package/task-queue/provider.d.ts +2 -2
  23. package/task-queue/task-context.d.ts +38 -18
  24. package/task-queue/task-context.js +35 -13
  25. package/task-queue/task-queue.d.ts +160 -132
  26. package/task-queue/task-queue.js +8 -8
  27. package/task-queue/tests/complex.test.js +36 -29
  28. package/task-queue/tests/dependencies.test.js +17 -17
  29. package/task-queue/tests/enqueue-item.test.d.ts +1 -0
  30. package/task-queue/tests/enqueue-item.test.js +12 -0
  31. package/task-queue/tests/queue-generic.test.d.ts +1 -0
  32. package/task-queue/tests/queue-generic.test.js +8 -0
  33. package/task-queue/tests/queue.test.js +50 -50
  34. package/task-queue/tests/task-context.test.d.ts +1 -0
  35. package/task-queue/tests/task-context.test.js +7 -0
  36. package/task-queue/tests/task-union.test.d.ts +1 -0
  37. package/task-queue/tests/task-union.test.js +18 -0
  38. package/task-queue/tests/typing.test.d.ts +1 -0
  39. package/task-queue/tests/typing.test.js +9 -0
  40. package/task-queue/tests/worker.test.js +16 -16
  41. package/task-queue/types.d.ts +48 -0
  42. package/task-queue/types.js +1 -0
@@ -1,7 +1,6 @@
1
- import { TaskQueueProvider, type QueueConfig } from '../../task-queue/index.js';
2
- import type { ObjectLiteral } from '../../types/index.js';
3
- import { PostgresQueue } from './task-queue.js';
1
+ import { TaskQueueProvider, type QueueConfig, type TaskDefinitionMap } from '../../task-queue/index.js';
2
+ import { PostgresTaskQueue } from './task-queue.js';
4
3
  export declare class PostgresTaskQueueProvider extends TaskQueueProvider {
5
4
  #private;
6
- get<Data extends ObjectLiteral, State extends ObjectLiteral, Result extends ObjectLiteral>(namespace: string, config?: QueueConfig): PostgresQueue<Data, State, Result>;
5
+ get<Definitions extends TaskDefinitionMap = TaskDefinitionMap>(namespace: string, config?: QueueConfig): PostgresTaskQueue<Definitions>;
7
6
  }
@@ -8,11 +8,11 @@ import { Singleton } from '../../injector/decorators.js';
8
8
  import { inject } from '../../injector/inject.js';
9
9
  import { Injector } from '../../injector/injector.js';
10
10
  import { TaskQueueProvider } from '../../task-queue/index.js';
11
- import { PostgresQueue } from './task-queue.js';
11
+ import { PostgresTaskQueue } from './task-queue.js';
12
12
  let PostgresTaskQueueProvider = class PostgresTaskQueueProvider extends TaskQueueProvider {
13
13
  #injector = inject(Injector);
14
14
  get(namespace, config) {
15
- return this.#injector.resolve((PostgresQueue), { ...config, namespace });
15
+ return this.#injector.resolve((PostgresTaskQueue), { ...config, namespace });
16
16
  }
17
17
  };
18
18
  PostgresTaskQueueProvider = __decorate([
@@ -1,10 +1,10 @@
1
1
  import { BaseEntity, type Json, type Timestamp } from '../../orm/index.js';
2
2
  import type { ObjectLiteral, TypedOmit } from '../../types/types.js';
3
- import { DependencyJoinMode, type Task, TaskState } from '../task-queue.js';
4
- export declare abstract class PostgresTaskBase<Data extends ObjectLiteral = ObjectLiteral, State extends ObjectLiteral = ObjectLiteral, Result extends ObjectLiteral = ObjectLiteral> extends BaseEntity implements TypedOmit<Task<Data, State, Result>, 'parentId'> {
3
+ import { DependencyJoinMode, type Task, TaskStatus } from '../task-queue.js';
4
+ export declare abstract class PostgresTaskBase<Data extends ObjectLiteral = ObjectLiteral, State extends ObjectLiteral = ObjectLiteral, Result extends ObjectLiteral = ObjectLiteral> extends BaseEntity implements TypedOmit<Task, 'parentId'> {
5
5
  namespace: string;
6
6
  type: string;
7
- status: TaskState;
7
+ status: TaskStatus;
8
8
  idempotencyKey: string | null;
9
9
  traceId: string | null;
10
10
  tags: string[];
@@ -12,7 +12,7 @@ export declare abstract class PostgresTaskBase<Data extends ObjectLiteral = Obje
12
12
  scheduleAfterTags: string[];
13
13
  failFast: boolean;
14
14
  dependencyJoinMode: DependencyJoinMode;
15
- dependencyTriggerStates: TaskState[];
15
+ dependencyTriggerStatuses: TaskStatus[];
16
16
  priority: number;
17
17
  token: string | null;
18
18
  creationTimestamp: Timestamp;
@@ -29,7 +29,7 @@ export declare abstract class PostgresTaskBase<Data extends ObjectLiteral = Obje
29
29
  result: Json<Result> | null;
30
30
  error: Json<ObjectLiteral> | null;
31
31
  }
32
- export declare class PostgresTask<Data extends ObjectLiteral = ObjectLiteral, State extends ObjectLiteral = ObjectLiteral, Result extends ObjectLiteral = ObjectLiteral> extends PostgresTaskBase<Data, State, Result> implements Task<Data, State, Result> {
32
+ export declare class PostgresTask<Data extends ObjectLiteral = ObjectLiteral, State extends ObjectLiteral = ObjectLiteral, Result extends ObjectLiteral = ObjectLiteral> extends PostgresTaskBase<Data, State, Result> implements Task {
33
33
  static readonly entityName = "Task";
34
34
  parentId: string | null;
35
35
  }
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  import { BaseEntity, Index, JsonProperty, Reference, Table, TimestampProperty, Unique, UuidProperty } from '../../orm/index.js';
11
11
  import { Array as ArrayProperty, BooleanProperty, Enumeration, Integer, NumberProperty, StringProperty } from '../../schema/index.js';
12
- import { DependencyJoinMode, TaskState } from '../task-queue.js';
12
+ import { DependencyJoinMode, TaskStatus } from '../task-queue.js';
13
13
  export class PostgresTaskBase extends BaseEntity {
14
14
  namespace;
15
15
  type;
@@ -21,7 +21,7 @@ export class PostgresTaskBase extends BaseEntity {
21
21
  scheduleAfterTags;
22
22
  failFast;
23
23
  dependencyJoinMode;
24
- dependencyTriggerStates;
24
+ dependencyTriggerStatuses;
25
25
  priority;
26
26
  token;
27
27
  creationTimestamp;
@@ -47,7 +47,7 @@ __decorate([
47
47
  __metadata("design:type", String)
48
48
  ], PostgresTaskBase.prototype, "type", void 0);
49
49
  __decorate([
50
- Enumeration(TaskState),
50
+ Enumeration(TaskStatus),
51
51
  __metadata("design:type", String)
52
52
  ], PostgresTaskBase.prototype, "status", void 0);
53
53
  __decorate([
@@ -79,9 +79,9 @@ __decorate([
79
79
  __metadata("design:type", String)
80
80
  ], PostgresTaskBase.prototype, "dependencyJoinMode", void 0);
81
81
  __decorate([
82
- Enumeration(TaskState, { array: true }),
82
+ Enumeration(TaskStatus, { array: true }),
83
83
  __metadata("design:type", Array)
84
- ], PostgresTaskBase.prototype, "dependencyTriggerStates", void 0);
84
+ ], PostgresTaskBase.prototype, "dependencyTriggerStatuses", void 0);
85
85
  __decorate([
86
86
  Integer(),
87
87
  __metadata("design:type", Number)
@@ -1,5 +1,5 @@
1
- import type { ObjectLiteral } from '../types/index.js';
2
1
  import type { TaskQueue, QueueConfig } from './task-queue.js';
2
+ import type { TaskDefinitionMap } from './types.js';
3
3
  export declare abstract class TaskQueueProvider {
4
- abstract get<Data extends ObjectLiteral, State extends ObjectLiteral, Result extends ObjectLiteral>(key: string, config?: QueueConfig): TaskQueue<Data, State, Result>;
4
+ abstract get<Definitions extends TaskDefinitionMap = TaskDefinitionMap>(key: string, config?: QueueConfig): TaskQueue<Definitions>;
5
5
  }
@@ -1,38 +1,58 @@
1
1
  import type { CancellationSignal, CancellationToken } from '../cancellation/index.js';
2
2
  import type { Logger } from '../logger/index.js';
3
3
  import type { Transaction } from '../orm/server/index.js';
4
- import { type EnqueueManyItem, type EnqueueOptions, TaskQueue, type Task } from './task-queue.js';
5
- export declare class TaskContext<Data, State = unknown, Result = unknown> {
4
+ import { TaskQueue, type EnqueueManyItem, type EnqueueOptions } from './task-queue.js';
5
+ import type { TaskData, TaskDefinitionMap, TaskOfType, TaskResult, TaskState, TaskTypes, TasksStates } from './types.js';
6
+ export declare class TaskContext<Definitions extends TaskDefinitionMap, Type extends TaskTypes<Definitions>> {
6
7
  #private;
7
- constructor(queue: TaskQueue<Data, State, Result>, task: Task<Data, State, Result>, signal: CancellationToken, logger: Logger);
8
+ constructor(queue: TaskQueue<Definitions>, task: TaskOfType<Definitions, Type>, signal: CancellationToken, logger: Logger);
8
9
  get id(): string;
9
- get data(): Data;
10
+ get type(): Type;
11
+ get parentId(): string | null;
12
+ get tags(): string[];
13
+ get completeAfterTags(): string[];
14
+ get scheduleAfterTags(): string[];
15
+ get data(): TaskData<Definitions, Type>;
16
+ get state(): TaskState<Definitions, Type> | null;
10
17
  get attempt(): number;
11
18
  get triesLeft(): number;
12
19
  get signal(): CancellationSignal;
13
20
  get logger(): Logger;
14
- complete(result?: Result, transaction?: Transaction): Promise<void>;
21
+ complete(result?: TaskResult<Definitions, Type>, options?: {
22
+ transaction?: Transaction;
23
+ }): Promise<void>;
15
24
  checkpoint(options: {
16
25
  progress?: number;
17
- state?: State;
26
+ state?: TaskState<Definitions, Type>;
27
+ transaction?: Transaction;
18
28
  }): Promise<void>;
19
- spawn(type: string, data: Data, options?: Omit<EnqueueOptions, 'parentId'>): Promise<Task<Data, State, Result>>;
20
- spawn<D, S, R>(queue: TaskQueue<D, S, R>, type: string, data: D, options?: Omit<EnqueueOptions, 'parentId'>): Promise<Task<D, S, R>>;
21
- spawnMany(items: EnqueueManyItem<Data>[]): Promise<Task<Data, State, Result>[]>;
22
- spawnMany<D = Data, S = any, R = any>(queue: TaskQueue<D, S, R>, items: EnqueueManyItem<D>[]): Promise<Task<D, S, R>[]>;
29
+ spawn<Type extends TaskTypes<Definitions>>(type: Type, data: TaskData<Definitions, Type>, options?: Omit<EnqueueOptions, 'parentId'>): Promise<TaskOfType<Definitions, Type>>;
30
+ spawn<OtherDefinitions extends TaskDefinitionMap, T extends TaskTypes<OtherDefinitions>>(queue: TaskQueue<OtherDefinitions>, type: T, data: OtherDefinitions[T]['data'], options?: Omit<EnqueueOptions, 'parentId'>): Promise<TaskOfType<OtherDefinitions, T>>;
31
+ spawnMany<Type extends TaskTypes<Definitions>>(items: EnqueueManyItem<Definitions, Type>[]): Promise<TaskOfType<Definitions, Type>[]>;
32
+ spawnMany<OtherDefinitions extends TaskDefinitionMap, Type extends TaskTypes<OtherDefinitions>>(queue: TaskQueue<OtherDefinitions>, items: EnqueueManyItem<OtherDefinitions, Type>[]): Promise<TaskOfType<OtherDefinitions, Type>[]>;
23
33
  /** Stop execution and reschedule the task for later without incrementing tries if possible */
24
- reschedule(timestamp: number): Promise<void>;
25
- reschedule(options: {
34
+ reschedule(timestamp: number, options?: {
35
+ transaction?: Transaction;
36
+ }): Promise<void>;
37
+ reschedule(rescheduleOptions: {
26
38
  delay: number;
39
+ transaction?: Transaction;
40
+ }): Promise<void>;
41
+ fail(error: unknown, options?: {
42
+ fatal?: boolean;
43
+ transaction?: Transaction;
27
44
  }): Promise<void>;
28
- fail(error: any, fatal?: boolean, transaction?: Transaction): Promise<void>;
29
45
  }
30
- export declare class BatchTaskContext<Data, State, Result> {
46
+ export declare class BatchTaskContext<Definitions extends TaskDefinitionMap, Type extends TaskTypes<Definitions>> {
31
47
  #private;
32
- constructor(queue: TaskQueue<Data, State, Result>, tasks: Task<Data, State, Result>[], signal: CancellationToken, logger: Logger);
33
- get tasks(): Task<Data, State, Result>[];
48
+ constructor(queue: TaskQueue<Definitions>, tasks: TaskOfType<Definitions, Type>[], signal: CancellationToken, logger: Logger);
49
+ get tasks(): TaskOfType<Definitions, Type>[];
34
50
  get signal(): CancellationSignal;
35
51
  get logger(): Logger;
36
- for(task: Task<Data, State, Result>): TaskContext<Data, State, Result>;
37
- checkpointAll(progresses?: number[], states?: State[]): Promise<void>;
52
+ for<Type extends TaskTypes<Definitions>>(task: TaskOfType<Definitions, Type>): TaskContext<Definitions, Type>;
53
+ checkpointAll(options?: {
54
+ progresses?: number[];
55
+ states?: TasksStates<TaskOfType<Definitions, Type>[]>;
56
+ transaction?: Transaction;
57
+ }): Promise<void>;
38
58
  }
@@ -15,9 +15,27 @@ export class TaskContext {
15
15
  get id() {
16
16
  return this.#task.id;
17
17
  }
18
+ get type() {
19
+ return this.#task.type;
20
+ }
21
+ get parentId() {
22
+ return this.#task.parentId;
23
+ }
24
+ get tags() {
25
+ return this.#task.tags;
26
+ }
27
+ get completeAfterTags() {
28
+ return this.#task.completeAfterTags;
29
+ }
30
+ get scheduleAfterTags() {
31
+ return this.#task.scheduleAfterTags;
32
+ }
18
33
  get data() {
19
34
  return this.#task.data;
20
35
  }
36
+ get state() {
37
+ return this.#task.state;
38
+ }
21
39
  get attempt() {
22
40
  return this.#task.tries;
23
41
  }
@@ -30,8 +48,8 @@ export class TaskContext {
30
48
  get logger() {
31
49
  return this.#logger;
32
50
  }
33
- async complete(result, transaction) {
34
- await this.#queue.complete(this.#task, result, transaction);
51
+ async complete(result, options) {
52
+ await this.#queue.complete(this.#task, { result, ...options });
35
53
  }
36
54
  async checkpoint(options) {
37
55
  const updatedTask = await this.#queue.touch(this.#task, options);
@@ -44,10 +62,14 @@ export class TaskContext {
44
62
  }
45
63
  }
46
64
  async spawn(queueOrType, typeOrData, dataOrOptionsOrNothing, optionsOrNothing) {
47
- if (isInstanceOf(queueOrType, TaskQueue)) {
48
- return await queueOrType.enqueue(typeOrData, dataOrOptionsOrNothing, { ...optionsOrNothing, parentId: this.#task.id });
65
+ const isForOtherQueue = isInstanceOf(queueOrType, TaskQueue);
66
+ const type = (isForOtherQueue ? typeOrData : queueOrType);
67
+ const data = isForOtherQueue ? dataOrOptionsOrNothing : typeOrData;
68
+ const options = (isForOtherQueue ? optionsOrNothing : dataOrOptionsOrNothing);
69
+ if (isForOtherQueue) {
70
+ return await queueOrType.enqueue(type, data, { ...options, parentId: this.#task.id });
49
71
  }
50
- return await this.#queue.enqueue(queueOrType, typeOrData, { ...dataOrOptionsOrNothing, parentId: this.#task.id });
72
+ return await this.#queue.enqueue(type, data, { ...options, parentId: this.#task.id });
51
73
  }
52
74
  async spawnMany(queueOrItems, itemsOrNothing) {
53
75
  const isForOtherQueue = isInstanceOf(queueOrItems, TaskQueue);
@@ -58,15 +80,15 @@ export class TaskContext {
58
80
  return await this.#queue.enqueueMany(items, { returnTasks: true });
59
81
  }
60
82
  async reschedule(timestampOrDelay) {
61
- const timestamp = isNumber(timestampOrDelay)
62
- ? timestampOrDelay
63
- : currentTimestamp() + timestampOrDelay.delay;
83
+ const isTimestamp = isNumber(timestampOrDelay);
84
+ const timestamp = isTimestamp ? timestampOrDelay : (currentTimestamp() + timestampOrDelay.delay);
85
+ const transaction = isTimestamp ? undefined : timestampOrDelay.transaction;
64
86
  this.#logger.debug(`Rescheduling task for ${new Date(timestamp).toISOString()}.`);
65
- await this.#queue.reschedule(this.#task.id, timestamp);
87
+ await this.#queue.reschedule(this.#task.id, timestamp, { transaction });
66
88
  this.#signal.set();
67
89
  }
68
- async fail(error, fatal, transaction) {
69
- await this.#queue.fail(this.#task, error, fatal, transaction);
90
+ async fail(error, options) {
91
+ await this.#queue.fail(this.#task, error, options);
70
92
  this.#signal.set();
71
93
  }
72
94
  }
@@ -93,8 +115,8 @@ export class BatchTaskContext {
93
115
  for(task) {
94
116
  return new TaskContext(this.#queue, task, this.#signal, this.#logger);
95
117
  }
96
- async checkpointAll(progresses, states) {
97
- const validIds = await this.#queue.touchMany(this.#tasks, progresses, states);
118
+ async checkpointAll(options) {
119
+ const validIds = await this.#queue.touchMany(this.#tasks, options);
98
120
  if (validIds.length < this.#tasks.length) {
99
121
  this.#logger.warn(`${this.#tasks.length - validIds.length} tasks in batch lost their lease during checkpoint`);
100
122
  }