@volontariapp/database 1.10.0-snap-67b30c3 → 1.11.0-snap-f78fc7e
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/CHANGELOG.md +6 -0
- package/dist/outbox/consumers/outbox.consumer.d.ts +6 -4
- package/dist/outbox/consumers/outbox.consumer.d.ts.map +1 -1
- package/dist/outbox/consumers/outbox.consumer.js +31 -12
- package/dist/outbox/consumers/outbox.consumer.js.map +1 -1
- package/dist/outbox/dispatchers/outbox.dispatcher.d.ts +13 -0
- package/dist/outbox/dispatchers/outbox.dispatcher.d.ts.map +1 -0
- package/dist/outbox/dispatchers/outbox.dispatcher.js +47 -0
- package/dist/outbox/dispatchers/outbox.dispatcher.js.map +1 -0
- package/dist/outbox/index.d.ts +1 -0
- package/dist/outbox/index.d.ts.map +1 -1
- package/dist/outbox/index.js +1 -0
- package/dist/outbox/index.js.map +1 -1
- package/dist/outbox/runners/outbox.runner.d.ts +3 -1
- package/dist/outbox/runners/outbox.runner.d.ts.map +1 -1
- package/dist/outbox/runners/outbox.runner.js +4 -2
- package/dist/outbox/runners/outbox.runner.js.map +1 -1
- package/dist/test/outbox/consumers/outbox.consumer.int.spec.d.ts.map +1 -0
- package/dist/test/outbox/{outbox.consumer.int.spec.js → consumers/outbox.consumer.int.spec.js} +45 -13
- package/dist/test/outbox/consumers/outbox.consumer.int.spec.js.map +1 -0
- package/dist/test/outbox/consumers/outbox.consumer.unit.spec.d.ts.map +1 -0
- package/dist/test/outbox/{outbox.consumer.unit.spec.js → consumers/outbox.consumer.unit.spec.js} +52 -16
- package/dist/test/outbox/consumers/outbox.consumer.unit.spec.js.map +1 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.d.ts +2 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.d.ts.map +1 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.js +62 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.int.spec.js.map +1 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.d.ts +2 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.d.ts.map +1 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.js +71 -0
- package/dist/test/outbox/dispatchers/outbox.dispatcher.unit.spec.js.map +1 -0
- package/dist/test/outbox/models/outbox.model.unit.spec.d.ts.map +1 -0
- package/dist/test/outbox/{outbox.model.unit.spec.js → models/outbox.model.unit.spec.js} +2 -2
- package/dist/test/outbox/models/outbox.model.unit.spec.js.map +1 -0
- package/dist/test/outbox/outbox.runner.int.spec.js +3 -1
- package/dist/test/outbox/outbox.runner.int.spec.js.map +1 -1
- package/dist/test/outbox/outbox.runner.unit.spec.js +3 -1
- package/dist/test/outbox/outbox.runner.unit.spec.js.map +1 -1
- package/dist/test/outbox/writers/outbox-extended.writer.int.spec.d.ts +2 -0
- package/dist/test/outbox/writers/outbox-extended.writer.int.spec.d.ts.map +1 -0
- package/dist/test/{core/outbox-extended.int.spec.js → outbox/writers/outbox-extended.writer.int.spec.js} +8 -8
- package/dist/test/outbox/writers/outbox-extended.writer.int.spec.js.map +1 -0
- package/dist/test/outbox/writers/outbox.writer.int.spec.d.ts +2 -0
- package/dist/test/outbox/writers/outbox.writer.int.spec.d.ts.map +1 -0
- package/dist/test/{core/outbox.int.spec.js → outbox/writers/outbox.writer.int.spec.js} +14 -14
- package/dist/test/outbox/writers/outbox.writer.int.spec.js.map +1 -0
- package/dist/test/outbox/writers/outbox.writer.unit.spec.d.ts.map +1 -0
- package/dist/test/outbox/{outbox.writer.unit.spec.js → writers/outbox.writer.unit.spec.js} +7 -7
- package/dist/test/outbox/writers/outbox.writer.unit.spec.js.map +1 -0
- package/dist/test/utils/helpers/outbox-repository-mock.helper.d.ts +7 -0
- package/dist/test/utils/helpers/outbox-repository-mock.helper.d.ts.map +1 -0
- package/dist/test/utils/helpers/{outbox-writer-mock.helper.js → outbox-repository-mock.helper.js} +2 -2
- package/dist/test/utils/helpers/outbox-repository-mock.helper.js.map +1 -0
- package/dist/test/utils/index.d.ts +1 -1
- package/dist/test/utils/index.d.ts.map +1 -1
- package/dist/test/utils/index.js +1 -1
- package/dist/test/utils/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/test/core/outbox-extended.int.spec.d.ts +0 -2
- package/dist/test/core/outbox-extended.int.spec.d.ts.map +0 -1
- package/dist/test/core/outbox-extended.int.spec.js.map +0 -1
- package/dist/test/core/outbox.int.spec.d.ts +0 -2
- package/dist/test/core/outbox.int.spec.d.ts.map +0 -1
- package/dist/test/core/outbox.int.spec.js.map +0 -1
- package/dist/test/outbox/outbox.consumer.int.spec.d.ts.map +0 -1
- package/dist/test/outbox/outbox.consumer.int.spec.js.map +0 -1
- package/dist/test/outbox/outbox.consumer.unit.spec.d.ts.map +0 -1
- package/dist/test/outbox/outbox.consumer.unit.spec.js.map +0 -1
- package/dist/test/outbox/outbox.model.unit.spec.d.ts.map +0 -1
- package/dist/test/outbox/outbox.model.unit.spec.js.map +0 -1
- package/dist/test/outbox/outbox.writer.unit.spec.d.ts.map +0 -1
- package/dist/test/outbox/outbox.writer.unit.spec.js.map +0 -1
- package/dist/test/utils/helpers/outbox-writer-mock.helper.d.ts +0 -7
- package/dist/test/utils/helpers/outbox-writer-mock.helper.d.ts.map +0 -1
- package/dist/test/utils/helpers/outbox-writer-mock.helper.js.map +0 -1
- /package/dist/test/outbox/{outbox.consumer.int.spec.d.ts → consumers/outbox.consumer.int.spec.d.ts} +0 -0
- /package/dist/test/outbox/{outbox.consumer.unit.spec.d.ts → consumers/outbox.consumer.unit.spec.d.ts} +0 -0
- /package/dist/test/outbox/{outbox.model.unit.spec.d.ts → models/outbox.model.unit.spec.d.ts} +0 -0
- /package/dist/test/outbox/{outbox.writer.unit.spec.d.ts → writers/outbox.writer.unit.spec.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,14 +2,16 @@ import type { BaseRepository } from '../../core/base.repository.js';
|
|
|
2
2
|
import type { OutboxEntity } from '../entities/outbox.entity.js';
|
|
3
3
|
import type { OutboxModel } from '../models/outbox.model.js';
|
|
4
4
|
import type { Logger } from '@volontariapp/logger';
|
|
5
|
+
import type { OutboxDispatcher } from '../dispatchers/outbox.dispatcher.js';
|
|
5
6
|
export declare class OutboxConsumer<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
|
|
6
|
-
|
|
7
|
+
protected readonly logger: Logger;
|
|
7
8
|
protected readonly repository: BaseRepository<TOutboxModel, TOutboxEntity, string>;
|
|
8
9
|
protected readonly batchSize: number;
|
|
9
|
-
|
|
10
|
+
protected readonly outboxDispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>;
|
|
11
|
+
constructor(logger: Logger, repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, batchSize: number, outboxDispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>);
|
|
10
12
|
fetchPendingItems(): Promise<TOutboxEntity[]>;
|
|
11
13
|
private normalizeRows;
|
|
12
|
-
processItems(): void
|
|
13
|
-
|
|
14
|
+
processItems(entities: TOutboxEntity[]): Promise<void>;
|
|
15
|
+
markItemsAsCompleted(entities: TOutboxEntity[]): Promise<void>;
|
|
14
16
|
}
|
|
15
17
|
//# sourceMappingURL=outbox.consumer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.consumer.d.ts","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.consumer.d.ts","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,qBAAa,cAAc,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAE5F,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACjC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;gBAH/D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;IAO9E,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2CnD,OAAO,CAAC,aAAa;IA2Bf,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtD,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrE"}
|
|
@@ -4,10 +4,12 @@ export class OutboxConsumer {
|
|
|
4
4
|
logger;
|
|
5
5
|
repository;
|
|
6
6
|
batchSize;
|
|
7
|
-
|
|
7
|
+
outboxDispatcher;
|
|
8
|
+
constructor(logger, repository, batchSize, outboxDispatcher) {
|
|
8
9
|
this.logger = logger;
|
|
9
10
|
this.repository = repository;
|
|
10
11
|
this.batchSize = batchSize;
|
|
12
|
+
this.outboxDispatcher = outboxDispatcher;
|
|
11
13
|
if (this.batchSize <= 0) {
|
|
12
14
|
throw new InvalidOutboxSizeError();
|
|
13
15
|
}
|
|
@@ -24,13 +26,13 @@ export class OutboxConsumer {
|
|
|
24
26
|
updatedAt: () => 'NOW()',
|
|
25
27
|
})
|
|
26
28
|
.where(`id IN (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
SELECT "id"
|
|
30
|
+
FROM "${tableName}"
|
|
31
|
+
WHERE "status" = :pending
|
|
32
|
+
ORDER BY "created_at" ASC
|
|
33
|
+
LIMIT :limit
|
|
34
|
+
FOR UPDATE SKIP LOCKED
|
|
35
|
+
)`, { pending: OutboxStatus.PENDING, limit: this.batchSize })
|
|
34
36
|
.returning('*')
|
|
35
37
|
.execute();
|
|
36
38
|
const rawRows = this.normalizeRows(updateResult.raw);
|
|
@@ -66,11 +68,28 @@ export class OutboxConsumer {
|
|
|
66
68
|
};
|
|
67
69
|
});
|
|
68
70
|
}
|
|
69
|
-
processItems() {
|
|
70
|
-
|
|
71
|
+
async processItems(entities) {
|
|
72
|
+
for (const item of entities) {
|
|
73
|
+
try {
|
|
74
|
+
this.logger.info(`Pushing outbox item ${item.id.toString()}`);
|
|
75
|
+
await Promise.resolve();
|
|
76
|
+
await this.outboxDispatcher.markAsCompleted(item);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.logger.error(`Error pushing outbox item ${item.id.toString()}`, { error });
|
|
80
|
+
await this.outboxDispatcher.markAsFailed(item, error instanceof Error ? error.message : String(error));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
71
83
|
}
|
|
72
|
-
|
|
73
|
-
this.logger.debug('Marking outbox items as
|
|
84
|
+
async markItemsAsCompleted(entities) {
|
|
85
|
+
this.logger.debug('Marking outbox items as completed', { ids: entities.map((e) => e.id) });
|
|
86
|
+
for (const item of entities) {
|
|
87
|
+
if (item.status !== OutboxStatus.PROCESSING) {
|
|
88
|
+
this.logger.warn(`Skipping outbox item ${item.id.toString()}`, { status: item.status });
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
await this.outboxDispatcher.markAsCompleted(item);
|
|
92
|
+
}
|
|
74
93
|
}
|
|
75
94
|
}
|
|
76
95
|
//# sourceMappingURL=outbox.consumer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.consumer.js","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.consumer.js","sourceRoot":"","sources":["../../../src/outbox/consumers/outbox.consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Logger } from '@volontariapp/logger';
|
|
2
|
+
import type { BaseRepository } from '../../core/base.repository.js';
|
|
3
|
+
import type { OutboxEntity } from '../entities/outbox.entity.js';
|
|
4
|
+
import type { OutboxModel } from '../models/outbox.model.js';
|
|
5
|
+
export declare class OutboxDispatcher<ToutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
|
|
6
|
+
private readonly logger;
|
|
7
|
+
private readonly repository;
|
|
8
|
+
constructor(logger: Logger, repository: BaseRepository<ToutboxModel, TOutboxEntity, string>);
|
|
9
|
+
markAsProcessing(entity: TOutboxEntity): Promise<TOutboxEntity | null>;
|
|
10
|
+
markAsFailed(entity: TOutboxEntity, error?: string): Promise<TOutboxEntity | null>;
|
|
11
|
+
markAsCompleted(entity: TOutboxEntity): Promise<TOutboxEntity | null>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=outbox.dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.dispatcher.d.ts","sourceRoot":"","sources":["../../../src/outbox/dispatchers/outbox.dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,qBAAa,gBAAgB,CAC3B,YAAY,SAAS,WAAW,EAChC,aAAa,SAAS,YAAY;IAGhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC;IAGlF,gBAAgB,CAAC,MAAM,EAAE,aAAa;IAetC,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM;IAgBlD,eAAe,CAAC,MAAM,EAAE,aAAa;CActC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { OutboxStatus } from '../types/outbox.status.js';
|
|
2
|
+
export class OutboxDispatcher {
|
|
3
|
+
logger;
|
|
4
|
+
repository;
|
|
5
|
+
constructor(logger, repository) {
|
|
6
|
+
this.logger = logger;
|
|
7
|
+
this.repository = repository;
|
|
8
|
+
}
|
|
9
|
+
markAsProcessing(entity) {
|
|
10
|
+
if (entity.status !== OutboxStatus.PENDING) {
|
|
11
|
+
this.logger.warn('Attempted to mark entity as processed, but it is not in PENDING status.', {
|
|
12
|
+
status: entity.status,
|
|
13
|
+
id: entity.id,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
this.logger.info(`Marking outbox entity ${entity.id} as processing`);
|
|
17
|
+
entity.status = OutboxStatus.PROCESSING;
|
|
18
|
+
entity.updatedAt = new Date();
|
|
19
|
+
return this.repository.update(entity.id, entity);
|
|
20
|
+
}
|
|
21
|
+
markAsFailed(entity, error) {
|
|
22
|
+
if (entity.status !== OutboxStatus.PROCESSING) {
|
|
23
|
+
this.logger.warn('Attempted to mark entity as failed, but it is not in PROCESSING status.', {
|
|
24
|
+
status: entity.status,
|
|
25
|
+
id: entity.id,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
this.logger.error(`Marking outbox entity ${entity.id} as failed`, { error });
|
|
29
|
+
entity.status = OutboxStatus.FAILED;
|
|
30
|
+
entity.lastError = error;
|
|
31
|
+
entity.updatedAt = new Date();
|
|
32
|
+
return this.repository.update(entity.id, entity);
|
|
33
|
+
}
|
|
34
|
+
markAsCompleted(entity) {
|
|
35
|
+
if (entity.status !== OutboxStatus.PROCESSING) {
|
|
36
|
+
this.logger.warn('Attempted to mark entity as done, but it is not in PROCESSING status.', {
|
|
37
|
+
status: entity.status,
|
|
38
|
+
id: entity.id,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
this.logger.info(`Marking outbox entity ${entity.id} as done`);
|
|
42
|
+
entity.status = OutboxStatus.COMPLETED;
|
|
43
|
+
entity.updatedAt = new Date();
|
|
44
|
+
return this.repository.update(entity.id, entity);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=outbox.dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.dispatcher.js","sourceRoot":"","sources":["../../../src/outbox/dispatchers/outbox.dispatcher.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,OAAO,gBAAgB;IAKR;IACA;IAFnB,YACmB,MAAc,EACd,UAA+D;QAD/D,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAqD;IAC/E,CAAC;IAEJ,gBAAgB,CAAC,MAAqB;QACpC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,EAAE;gBAC1F,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErE,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC;QACxC,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,YAAY,CAAC,MAAqB,EAAE,KAAc;QAChD,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,EAAE;gBAC1F,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7E,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACpC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,eAAe,CAAC,MAAqB;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uEAAuE,EAAE;gBACxF,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,EAAE,EAAE,MAAM,CAAC,EAAE;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;QAE/D,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC;QACvC,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CACF"}
|
package/dist/outbox/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export * from './models/jobs-outbox.model.js';
|
|
|
7
7
|
export * from './models/outbox.model.js';
|
|
8
8
|
export * from './writers/outbox.writer.js';
|
|
9
9
|
export * from './consumers/outbox.consumer.js';
|
|
10
|
+
export * from './dispatchers/outbox.dispatcher.js';
|
|
10
11
|
export * from './runners/outbox.runner.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC"}
|
package/dist/outbox/index.js
CHANGED
|
@@ -7,5 +7,6 @@ export * from './models/jobs-outbox.model.js';
|
|
|
7
7
|
export * from './models/outbox.model.js';
|
|
8
8
|
export * from './writers/outbox.writer.js';
|
|
9
9
|
export * from './consumers/outbox.consumer.js';
|
|
10
|
+
export * from './dispatchers/outbox.dispatcher.js';
|
|
10
11
|
export * from './runners/outbox.runner.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/outbox/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AAEzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,4BAA4B,CAAC;AAE3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { OutboxRunnerConfig } from '@volontariapp/config';
|
|
2
|
+
import type { OutboxDispatcher } from '../dispatchers/outbox.dispatcher.js';
|
|
2
3
|
import type { OutboxEntity, OutboxModel } from '../index.js';
|
|
3
4
|
import type { BaseRepository } from '../../core/base.repository.js';
|
|
4
5
|
export declare class OutboxRunner<TOutboxModel extends OutboxModel, TOutboxEntity extends OutboxEntity> {
|
|
@@ -8,7 +9,8 @@ export declare class OutboxRunner<TOutboxModel extends OutboxModel, TOutboxEntit
|
|
|
8
9
|
private loopPromise?;
|
|
9
10
|
private readonly logger;
|
|
10
11
|
private readonly consumer;
|
|
11
|
-
|
|
12
|
+
private readonly dispatcher;
|
|
13
|
+
constructor(repository: BaseRepository<TOutboxModel, TOutboxEntity, string>, config: OutboxRunnerConfig, dispatcher: OutboxDispatcher<TOutboxModel, TOutboxEntity>);
|
|
12
14
|
get isRunning(): boolean;
|
|
13
15
|
start(): void;
|
|
14
16
|
private runLoop;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.runner.d.ts","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,qBAAa,YAAY,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;
|
|
1
|
+
{"version":3,"file":"outbox.runner.d.ts","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,qBAAa,YAAY,CAAC,YAAY,SAAS,WAAW,EAAE,aAAa,SAAS,YAAY;IAS1F,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAgB;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgD;gBAGxD,UAAU,EAAE,cAAc,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAC/D,MAAM,EAAE,kBAAkB,EAC3C,UAAU,EAAE,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC;IAe3D,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,KAAK,IAAI,IAAI;YAaC,OAAO;IAoBf,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
|
|
@@ -8,11 +8,13 @@ export class OutboxRunner {
|
|
|
8
8
|
loopPromise;
|
|
9
9
|
logger;
|
|
10
10
|
consumer;
|
|
11
|
-
|
|
11
|
+
dispatcher;
|
|
12
|
+
constructor(repository, config, dispatcher) {
|
|
12
13
|
this.repository = repository;
|
|
13
14
|
this.config = config;
|
|
14
15
|
this.logger = new Logger(config.logger);
|
|
15
|
-
this.
|
|
16
|
+
this.dispatcher = dispatcher;
|
|
17
|
+
this.consumer = new OutboxConsumer(this.logger, this.repository, config.batchSize, this.dispatcher);
|
|
16
18
|
}
|
|
17
19
|
get isRunning() {
|
|
18
20
|
return !!this.abortController && !this.abortController.signal.aborted;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.runner.js","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.runner.js","sourceRoot":"","sources":["../../../src/outbox/runners/outbox.runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.consumer.int.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.int.spec.ts"],"names":[],"mappings":""}
|
package/dist/test/outbox/{outbox.consumer.int.spec.js → consumers/outbox.consumer.int.spec.js}
RENAMED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { describe, it, expect, beforeAll } from '@jest/globals';
|
|
2
|
-
import { testDataSource, setupIntegrationTest } from '
|
|
3
|
-
import { OutboxModel } from '
|
|
4
|
-
import { OutboxConsumer } from '
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { testDataSource, setupIntegrationTest } from '../../utils/index.js';
|
|
3
|
+
import { OutboxModel } from '../../../outbox/models/outbox.model.js';
|
|
4
|
+
import { OutboxConsumer } from '../../../outbox/consumers/outbox.consumer.js';
|
|
5
|
+
import { OutboxDispatcher } from '../../../outbox/dispatchers/outbox.dispatcher.js';
|
|
6
|
+
import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
|
|
7
|
+
import { makeOutboxEvent } from '../../utils/helpers/outbox-event.helper.js';
|
|
8
|
+
import { TestOutboxRepository } from '../../utils/repositories/outbox-test.repository.js';
|
|
9
|
+
import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
|
|
9
10
|
describe('OutboxConsumer (Integration)', () => {
|
|
10
11
|
let repository;
|
|
11
12
|
let loggerMock;
|
|
@@ -25,7 +26,8 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
25
26
|
status: OutboxStatus.PENDING,
|
|
26
27
|
});
|
|
27
28
|
await repo.save([event1, event2]);
|
|
28
|
-
const
|
|
29
|
+
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
30
|
+
const singleConsumer = new OutboxConsumer(loggerMock, repository, 1, dispatcher);
|
|
29
31
|
const items = await singleConsumer.fetchPendingItems();
|
|
30
32
|
expect(items).toHaveLength(1);
|
|
31
33
|
expect(items[0].status).toBe(OutboxStatus.PROCESSING);
|
|
@@ -41,8 +43,9 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
41
43
|
status: OutboxStatus.PENDING,
|
|
42
44
|
}));
|
|
43
45
|
await repo.save(events);
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
+
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
47
|
+
const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
48
|
+
const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
46
49
|
const [results1, results2] = await Promise.all([
|
|
47
50
|
consumer1.fetchPendingItems(),
|
|
48
51
|
consumer2.fetchPendingItems(),
|
|
@@ -63,9 +66,10 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
63
66
|
status: OutboxStatus.PENDING,
|
|
64
67
|
}));
|
|
65
68
|
await repo.save(events);
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
+
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
70
|
+
const consumer1 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
71
|
+
const consumer2 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
72
|
+
const consumer3 = new OutboxConsumer(loggerMock, repository, 5, dispatcher);
|
|
69
73
|
const [results1, results2, results3] = await Promise.all([
|
|
70
74
|
consumer1.fetchPendingItems(),
|
|
71
75
|
consumer2.fetchPendingItems(),
|
|
@@ -79,5 +83,33 @@ describe('OutboxConsumer (Integration)', () => {
|
|
|
79
83
|
const totalProcessed = await repo.countBy({ status: OutboxStatus.PROCESSING });
|
|
80
84
|
expect(totalProcessed).toBe(10);
|
|
81
85
|
});
|
|
86
|
+
it('markItemsAsCompleted() should mark items as COMPLETED in database', async () => {
|
|
87
|
+
const repo = testDataSource.getRepository(OutboxModel);
|
|
88
|
+
const event = makeOutboxEvent({
|
|
89
|
+
id: '00000000-0000-0000-0000-000000000100',
|
|
90
|
+
status: OutboxStatus.PROCESSING,
|
|
91
|
+
});
|
|
92
|
+
await repo.save(event);
|
|
93
|
+
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
94
|
+
const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher);
|
|
95
|
+
const entity = await repository.findOneOrFail({ id: event.id });
|
|
96
|
+
await consumer.markItemsAsCompleted([entity]);
|
|
97
|
+
const dbItem = await repo.findOneBy({ id: event.id });
|
|
98
|
+
expect(dbItem?.status).toBe(OutboxStatus.COMPLETED);
|
|
99
|
+
});
|
|
100
|
+
it('processItems() should process items and mark them as COMPLETED in database', async () => {
|
|
101
|
+
const repo = testDataSource.getRepository(OutboxModel);
|
|
102
|
+
const event = makeOutboxEvent({
|
|
103
|
+
id: '00000000-0000-0000-0000-000000000101',
|
|
104
|
+
status: OutboxStatus.PROCESSING,
|
|
105
|
+
});
|
|
106
|
+
await repo.save(event);
|
|
107
|
+
const dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
108
|
+
const consumer = new OutboxConsumer(loggerMock, repository, 10, dispatcher);
|
|
109
|
+
const entity = await repository.findOneOrFail({ id: event.id });
|
|
110
|
+
await consumer.processItems([entity]);
|
|
111
|
+
const dbItem = await repo.findOneBy({ id: event.id });
|
|
112
|
+
expect(dbItem?.status).toBe(OutboxStatus.COMPLETED);
|
|
113
|
+
});
|
|
82
114
|
});
|
|
83
115
|
//# sourceMappingURL=outbox.consumer.int.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.consumer.int.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAuB,MAAM,2CAA2C,CAAC;AAEhG,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,UAAgC,CAAC;IACrC,IAAI,UAA0B,CAAC;IAE/B,oBAAoB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,GAAG,cAAc,EAAE,CAAC;QAC9B,UAAU,GAAG,IAAI,oBAAoB,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,eAAe,CAAC;YAC7B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,CAAC;YAC7B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAmB,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAC7D,eAAe,CAAC;YACd,EAAE,EAAE,qCAAqC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC9E,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CACH,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAGxB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAmB,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,SAAS,CAAC,iBAAiB,EAAE;YAC7B,SAAS,CAAC,iBAAiB,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAGjC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7D,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAErC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAC7D,eAAe,CAAC;YACd,EAAE,EAAE,qCAAqC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC9E,MAAM,EAAE,YAAY,CAAC,OAAO;SAC7B,CAAC,CACH,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAmB,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAErF,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,SAAS,CAAC,iBAAiB,EAAE;YAC7B,SAAS,CAAC,iBAAiB,EAAE;YAC7B,SAAS,CAAC,iBAAiB,EAAE;SAC9B,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QACjF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAEjF,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC;YAC5B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAmB,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC;YAC5B,EAAE,EAAE,sCAAsC;YAC1C,MAAM,EAAE,YAAY,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAmB,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,UAAmB,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.consumer.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.unit.spec.ts"],"names":[],"mappings":""}
|
package/dist/test/outbox/{outbox.consumer.unit.spec.js → consumers/outbox.consumer.unit.spec.js}
RENAMED
|
@@ -1,37 +1,40 @@
|
|
|
1
1
|
import { describe, expect, it, beforeEach, jest } from '@jest/globals';
|
|
2
|
-
import { OutboxConsumer } from '
|
|
3
|
-
import { OutboxModel } from '
|
|
2
|
+
import { OutboxConsumer } from '../../../outbox/consumers/outbox.consumer.js';
|
|
3
|
+
import { OutboxModel } from '../../../outbox/models/outbox.model.js';
|
|
4
4
|
import { InvalidOutboxSizeError } from '@volontariapp/errors';
|
|
5
|
-
import { OutboxStatus } from '
|
|
6
|
-
import { makeLoggerMock } from '
|
|
7
|
-
import { makeQueryRunnerMock } from '
|
|
5
|
+
import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
|
|
6
|
+
import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
|
|
7
|
+
import { makeQueryRunnerMock } from '../../utils/helpers/query-runner-mock.helper.js';
|
|
8
8
|
describe('OutboxConsumer (Unit)', () => {
|
|
9
9
|
let consumer;
|
|
10
|
+
let dispatcherMock;
|
|
10
11
|
let repositoryMock;
|
|
11
12
|
let queryRunnerMock;
|
|
12
13
|
let loggerMock;
|
|
13
14
|
beforeEach(() => {
|
|
14
15
|
loggerMock = makeLoggerMock();
|
|
15
|
-
const
|
|
16
|
-
queryRunnerMock =
|
|
16
|
+
const { queryRunnerMock: qrMock } = makeQueryRunnerMock();
|
|
17
|
+
queryRunnerMock = qrMock;
|
|
17
18
|
repositoryMock = {
|
|
18
19
|
metadata: {
|
|
19
20
|
target: OutboxModel,
|
|
20
21
|
tableName: 'outbox',
|
|
21
22
|
},
|
|
22
|
-
executeInTransaction(work)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
executeInTransaction: jest.fn((work) => work(queryRunnerMock)),
|
|
24
|
+
toEntities: jest.fn((models) => models),
|
|
25
|
+
update: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
dispatcherMock = {
|
|
28
|
+
markAsCompleted: jest.fn(),
|
|
29
|
+
markAsFailed: jest.fn(),
|
|
30
|
+
markAsProcessing: jest.fn(),
|
|
28
31
|
};
|
|
29
|
-
consumer = new OutboxConsumer(loggerMock, repositoryMock, 10);
|
|
32
|
+
consumer = new OutboxConsumer(loggerMock, repositoryMock, 10, dispatcherMock);
|
|
30
33
|
});
|
|
31
34
|
describe('constructor', () => {
|
|
32
35
|
it('should throw InvalidOutboxSizeError if batchSize <= 0', () => {
|
|
33
|
-
expect(() => new OutboxConsumer(loggerMock, repositoryMock, 0)).toThrow(InvalidOutboxSizeError);
|
|
34
|
-
expect(() => new OutboxConsumer(loggerMock, repositoryMock, -1)).toThrow(InvalidOutboxSizeError);
|
|
36
|
+
expect(() => new OutboxConsumer(loggerMock, repositoryMock, 0, dispatcherMock)).toThrow(InvalidOutboxSizeError);
|
|
37
|
+
expect(() => new OutboxConsumer(loggerMock, repositoryMock, -1, dispatcherMock)).toThrow(InvalidOutboxSizeError);
|
|
35
38
|
});
|
|
36
39
|
});
|
|
37
40
|
describe('fetchPendingItems', () => {
|
|
@@ -82,5 +85,38 @@ describe('OutboxConsumer (Unit)', () => {
|
|
|
82
85
|
expect(result).toHaveLength(2);
|
|
83
86
|
});
|
|
84
87
|
});
|
|
88
|
+
describe('processItems', () => {
|
|
89
|
+
it('should process items and mark them as completed', async () => {
|
|
90
|
+
const entities = [{ id: '1' }, { id: '2' }];
|
|
91
|
+
await consumer.processItems(entities);
|
|
92
|
+
expect(dispatcherMock.markAsCompleted).toHaveBeenCalledTimes(2);
|
|
93
|
+
expect(dispatcherMock.markAsCompleted).toHaveBeenCalledWith(entities[0]);
|
|
94
|
+
expect(dispatcherMock.markAsCompleted).toHaveBeenCalledWith(entities[1]);
|
|
95
|
+
});
|
|
96
|
+
it('should mark items as failed if processing throws error', async () => {
|
|
97
|
+
const entities = [{ id: '1' }];
|
|
98
|
+
const error = new Error('Test error');
|
|
99
|
+
dispatcherMock.markAsCompleted.mockImplementationOnce(() => {
|
|
100
|
+
throw error;
|
|
101
|
+
});
|
|
102
|
+
await consumer.processItems(entities);
|
|
103
|
+
expect(dispatcherMock.markAsFailed).toHaveBeenCalledWith(entities[0], 'Test error');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('markItemsAsCompleted', () => {
|
|
107
|
+
it('should mark processing items as completed', async () => {
|
|
108
|
+
const entities = [
|
|
109
|
+
{ id: '1', status: OutboxStatus.PROCESSING },
|
|
110
|
+
{ id: '2', status: OutboxStatus.PENDING },
|
|
111
|
+
];
|
|
112
|
+
const dispatcherSpy = dispatcherMock.markAsCompleted;
|
|
113
|
+
await consumer.markItemsAsCompleted(entities);
|
|
114
|
+
expect(dispatcherSpy).toHaveBeenCalledTimes(1);
|
|
115
|
+
expect(dispatcherSpy).toHaveBeenCalledWith(entities[0]);
|
|
116
|
+
expect(loggerMock.warn).toHaveBeenCalledWith('Skipping outbox item 2', {
|
|
117
|
+
status: OutboxStatus.PENDING,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
85
121
|
});
|
|
86
122
|
//# sourceMappingURL=outbox.consumer.unit.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.consumer.unit.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/consumers/outbox.consumer.unit.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.dispatcher.int.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/dispatchers/outbox.dispatcher.int.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll } from '@jest/globals';
|
|
2
|
+
import { testDataSource, setupIntegrationTest } from '../../utils/index.js';
|
|
3
|
+
import { OutboxModel } from '../../../outbox/models/outbox.model.js';
|
|
4
|
+
import { OutboxDispatcher } from '../../../outbox/dispatchers/outbox.dispatcher.js';
|
|
5
|
+
import { OutboxStatus } from '../../../outbox/types/outbox.status.js';
|
|
6
|
+
import { TestOutboxRepository } from '../../utils/repositories/outbox-test.repository.js';
|
|
7
|
+
import { makeLoggerMock } from '../../utils/helpers/logger-mock.helper.js';
|
|
8
|
+
describe('OutboxDispatcher (Integration)', () => {
|
|
9
|
+
let dispatcher;
|
|
10
|
+
let repository;
|
|
11
|
+
const loggerMock = makeLoggerMock();
|
|
12
|
+
setupIntegrationTest([OutboxModel]);
|
|
13
|
+
beforeAll(() => {
|
|
14
|
+
repository = new TestOutboxRepository(testDataSource.getRepository(OutboxModel));
|
|
15
|
+
dispatcher = new OutboxDispatcher(loggerMock, repository);
|
|
16
|
+
});
|
|
17
|
+
it('markAsProcessing() should update status in database', async () => {
|
|
18
|
+
const repo = testDataSource.getRepository(OutboxModel);
|
|
19
|
+
const model = new OutboxModel();
|
|
20
|
+
model.id = '00000000-0000-0000-0000-000000000001';
|
|
21
|
+
model.type = 'test';
|
|
22
|
+
model.emitter = 'test';
|
|
23
|
+
model.status = OutboxStatus.PENDING;
|
|
24
|
+
model.updatedAt = new Date();
|
|
25
|
+
await repo.save(model);
|
|
26
|
+
const entity = await repository.findOneOrFail({ id: model.id });
|
|
27
|
+
await dispatcher.markAsProcessing(entity);
|
|
28
|
+
const updated = await repo.findOneBy({ id: model.id });
|
|
29
|
+
expect(updated?.status).toBe(OutboxStatus.PROCESSING);
|
|
30
|
+
});
|
|
31
|
+
it('markAsFailed() should update status and lastError in database', async () => {
|
|
32
|
+
const repo = testDataSource.getRepository(OutboxModel);
|
|
33
|
+
const model = new OutboxModel();
|
|
34
|
+
model.id = '00000000-0000-0000-0000-000000000002';
|
|
35
|
+
model.type = 'test';
|
|
36
|
+
model.emitter = 'test';
|
|
37
|
+
model.status = OutboxStatus.PROCESSING;
|
|
38
|
+
model.updatedAt = new Date();
|
|
39
|
+
await repo.save(model);
|
|
40
|
+
const entity = await repository.findOneOrFail({ id: model.id });
|
|
41
|
+
const error = 'Failure reason';
|
|
42
|
+
await dispatcher.markAsFailed(entity, error);
|
|
43
|
+
const updated = await repo.findOneBy({ id: model.id });
|
|
44
|
+
expect(updated?.status).toBe(OutboxStatus.FAILED);
|
|
45
|
+
expect(updated?.lastError).toBe(error);
|
|
46
|
+
});
|
|
47
|
+
it('markAsCompleted() should update status to COMPLETED in database', async () => {
|
|
48
|
+
const repo = testDataSource.getRepository(OutboxModel);
|
|
49
|
+
const model = new OutboxModel();
|
|
50
|
+
model.id = '00000000-0000-0000-0000-000000000003';
|
|
51
|
+
model.type = 'test';
|
|
52
|
+
model.emitter = 'test';
|
|
53
|
+
model.status = OutboxStatus.PROCESSING;
|
|
54
|
+
model.updatedAt = new Date();
|
|
55
|
+
await repo.save(model);
|
|
56
|
+
const entity = await repository.findOneOrFail({ id: model.id });
|
|
57
|
+
await dispatcher.markAsCompleted(entity);
|
|
58
|
+
const updated = await repo.findOneBy({ id: model.id });
|
|
59
|
+
expect(updated?.status).toBe(OutboxStatus.COMPLETED);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=outbox.dispatcher.int.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.dispatcher.int.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/dispatchers/outbox.dispatcher.int.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.dispatcher.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/dispatchers/outbox.dispatcher.unit.spec.ts"],"names":[],"mappings":""}
|