@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.
- package/authentication/client/authentication.service.js +3 -2
- package/document-management/server/services/document-validation.service.js +5 -5
- package/document-management/server/services/document-workflow.service.js +2 -2
- package/orm/sqls/sqls.d.ts +6 -6
- package/package.json +2 -2
- package/task-queue/enqueue-batch.d.ts +16 -11
- package/task-queue/enqueue-batch.js +2 -2
- package/task-queue/index.d.ts +2 -1
- package/task-queue/index.js +2 -1
- package/task-queue/postgres/drizzle/{0000_thin_black_panther.sql → 0000_simple_invisible_woman.sql} +5 -5
- package/task-queue/postgres/drizzle/meta/0000_snapshot.json +11 -11
- package/task-queue/postgres/drizzle/meta/_journal.json +2 -2
- package/task-queue/postgres/module.js +2 -2
- package/task-queue/postgres/schemas.d.ts +1 -1
- package/task-queue/postgres/schemas.js +2 -2
- package/task-queue/postgres/task-queue.d.ts +101 -47
- package/task-queue/postgres/task-queue.js +149 -139
- package/task-queue/postgres/task-queue.provider.d.ts +3 -4
- package/task-queue/postgres/task-queue.provider.js +2 -2
- package/task-queue/postgres/task.model.d.ts +5 -5
- package/task-queue/postgres/task.model.js +5 -5
- package/task-queue/provider.d.ts +2 -2
- package/task-queue/task-context.d.ts +38 -18
- package/task-queue/task-context.js +35 -13
- package/task-queue/task-queue.d.ts +160 -132
- package/task-queue/task-queue.js +8 -8
- package/task-queue/tests/complex.test.js +36 -29
- package/task-queue/tests/dependencies.test.js +17 -17
- package/task-queue/tests/enqueue-item.test.d.ts +1 -0
- package/task-queue/tests/enqueue-item.test.js +12 -0
- package/task-queue/tests/queue-generic.test.d.ts +1 -0
- package/task-queue/tests/queue-generic.test.js +8 -0
- package/task-queue/tests/queue.test.js +50 -50
- package/task-queue/tests/task-context.test.d.ts +1 -0
- package/task-queue/tests/task-context.test.js +7 -0
- package/task-queue/tests/task-union.test.d.ts +1 -0
- package/task-queue/tests/task-union.test.js +18 -0
- package/task-queue/tests/typing.test.d.ts +1 -0
- package/task-queue/tests/typing.test.js +9 -0
- package/task-queue/tests/worker.test.js +16 -16
- package/task-queue/types.d.ts +48 -0
- package/task-queue/types.js +1 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { TaskQueueProvider, type QueueConfig } from '../../task-queue/index.js';
|
|
2
|
-
import
|
|
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<
|
|
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 {
|
|
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((
|
|
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,
|
|
4
|
-
export declare abstract class PostgresTaskBase<Data extends ObjectLiteral = ObjectLiteral, State extends ObjectLiteral = ObjectLiteral, Result extends ObjectLiteral = ObjectLiteral> extends BaseEntity implements TypedOmit<Task
|
|
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:
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
82
|
+
Enumeration(TaskStatus, { array: true }),
|
|
83
83
|
__metadata("design:type", Array)
|
|
84
|
-
], PostgresTaskBase.prototype, "
|
|
84
|
+
], PostgresTaskBase.prototype, "dependencyTriggerStatuses", void 0);
|
|
85
85
|
__decorate([
|
|
86
86
|
Integer(),
|
|
87
87
|
__metadata("design:type", Number)
|
package/task-queue/provider.d.ts
CHANGED
|
@@ -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<
|
|
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
|
|
5
|
-
|
|
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<
|
|
8
|
+
constructor(queue: TaskQueue<Definitions>, task: TaskOfType<Definitions, Type>, signal: CancellationToken, logger: Logger);
|
|
8
9
|
get id(): string;
|
|
9
|
-
get
|
|
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?:
|
|
21
|
+
complete(result?: TaskResult<Definitions, Type>, options?: {
|
|
22
|
+
transaction?: Transaction;
|
|
23
|
+
}): Promise<void>;
|
|
15
24
|
checkpoint(options: {
|
|
16
25
|
progress?: number;
|
|
17
|
-
state?:
|
|
26
|
+
state?: TaskState<Definitions, Type>;
|
|
27
|
+
transaction?: Transaction;
|
|
18
28
|
}): Promise<void>;
|
|
19
|
-
spawn(type:
|
|
20
|
-
spawn<
|
|
21
|
-
spawnMany(items: EnqueueManyItem<
|
|
22
|
-
spawnMany<
|
|
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
|
|
25
|
-
|
|
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<
|
|
46
|
+
export declare class BatchTaskContext<Definitions extends TaskDefinitionMap, Type extends TaskTypes<Definitions>> {
|
|
31
47
|
#private;
|
|
32
|
-
constructor(queue: TaskQueue<
|
|
33
|
-
get tasks():
|
|
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:
|
|
37
|
-
checkpointAll(
|
|
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,
|
|
34
|
-
await this.#queue.complete(this.#task, result,
|
|
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
|
-
|
|
48
|
-
|
|
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(
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
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,
|
|
69
|
-
await this.#queue.fail(this.#task, error,
|
|
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(
|
|
97
|
-
const validIds = await this.#queue.touchMany(this.#tasks,
|
|
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
|
}
|