@prodforcode/event-forge-typeorm 1.2.0 → 1.5.0
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/dist/entities/inbox-message.entity.d.ts +5 -0
- package/dist/entities/inbox-message.entity.d.ts.map +1 -1
- package/dist/entities/inbox-message.entity.js +25 -0
- package/dist/entities/inbox-message.entity.js.map +1 -1
- package/dist/migrations/1.2.0-001-AddInboxMetadataColumn.d.ts +3 -0
- package/dist/migrations/1.2.0-001-AddInboxMetadataColumn.d.ts.map +1 -0
- package/dist/migrations/1.2.0-001-AddInboxMetadataColumn.js +20 -0
- package/dist/migrations/1.2.0-001-AddInboxMetadataColumn.js.map +1 -0
- package/dist/migrations/1.5.0-001-AddInboxRecoveryFields.d.ts +3 -0
- package/dist/migrations/1.5.0-001-AddInboxRecoveryFields.d.ts.map +1 -0
- package/dist/migrations/1.5.0-001-AddInboxRecoveryFields.js +63 -0
- package/dist/migrations/1.5.0-001-AddInboxRecoveryFields.js.map +1 -0
- package/dist/repositories/typeorm-inbox.repository.d.ts +5 -2
- package/dist/repositories/typeorm-inbox.repository.d.ts.map +1 -1
- package/dist/repositories/typeorm-inbox.repository.js +71 -3
- package/dist/repositories/typeorm-inbox.repository.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,6 +5,7 @@ export declare class InboxMessageEntity implements InboxMessage {
|
|
|
5
5
|
source: string;
|
|
6
6
|
eventType: string;
|
|
7
7
|
payload: Record<string, unknown>;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
8
9
|
status: InboxMessageStatus;
|
|
9
10
|
processedAt?: Date;
|
|
10
11
|
errorMessage?: string;
|
|
@@ -13,5 +14,9 @@ export declare class InboxMessageEntity implements InboxMessage {
|
|
|
13
14
|
scheduledAt?: Date;
|
|
14
15
|
createdAt: Date;
|
|
15
16
|
receivedAt: Date;
|
|
17
|
+
updatedAt: Date;
|
|
18
|
+
recoveryAttempts: number;
|
|
19
|
+
lastRecoveredAt?: Date;
|
|
20
|
+
recoveryReason?: string;
|
|
16
21
|
}
|
|
17
22
|
//# sourceMappingURL=inbox-message.entity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-message.entity.d.ts","sourceRoot":"","sources":["../../src/entities/inbox-message.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-message.entity.d.ts","sourceRoot":"","sources":["../../src/entities/inbox-message.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAejF,qBAMa,kBAAmB,YAAW,YAAY;IAErD,EAAE,EAAE,MAAM,CAAC;IAGX,SAAS,EAAE,MAAM,CAAC;IAGlB,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,EAAE,MAAM,CAAC;IAGlB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAOnC,MAAM,EAAE,kBAAkB,CAAC;IAG3B,WAAW,CAAC,EAAE,IAAI,CAAC;IAGnB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,MAAM,CAAC;IAGnB,UAAU,EAAE,MAAM,CAAC;IAGnB,WAAW,CAAC,EAAE,IAAI,CAAC;IAGnB,SAAS,EAAE,IAAI,CAAC;IAGhB,UAAU,EAAE,IAAI,CAAC;IAGjB,SAAS,EAAE,IAAI,CAAC;IAGhB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,eAAe,CAAC,EAAE,IAAI,CAAC;IAGvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -18,6 +18,7 @@ let InboxMessageEntity = class InboxMessageEntity {
|
|
|
18
18
|
source;
|
|
19
19
|
eventType;
|
|
20
20
|
payload;
|
|
21
|
+
metadata;
|
|
21
22
|
status;
|
|
22
23
|
processedAt;
|
|
23
24
|
errorMessage;
|
|
@@ -26,6 +27,10 @@ let InboxMessageEntity = class InboxMessageEntity {
|
|
|
26
27
|
scheduledAt;
|
|
27
28
|
createdAt;
|
|
28
29
|
receivedAt;
|
|
30
|
+
updatedAt;
|
|
31
|
+
recoveryAttempts;
|
|
32
|
+
lastRecoveredAt;
|
|
33
|
+
recoveryReason;
|
|
29
34
|
};
|
|
30
35
|
exports.InboxMessageEntity = InboxMessageEntity;
|
|
31
36
|
__decorate([
|
|
@@ -48,6 +53,10 @@ __decorate([
|
|
|
48
53
|
(0, typeorm_1.Column)({ type: 'jsonb' }),
|
|
49
54
|
__metadata("design:type", Object)
|
|
50
55
|
], InboxMessageEntity.prototype, "payload", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
(0, typeorm_1.Column)({ type: 'jsonb', nullable: true }),
|
|
58
|
+
__metadata("design:type", Object)
|
|
59
|
+
], InboxMessageEntity.prototype, "metadata", void 0);
|
|
51
60
|
__decorate([
|
|
52
61
|
(0, typeorm_1.Column)({
|
|
53
62
|
type: 'enum',
|
|
@@ -84,6 +93,22 @@ __decorate([
|
|
|
84
93
|
(0, typeorm_1.CreateDateColumn)({ name: 'received_at' }),
|
|
85
94
|
__metadata("design:type", Date)
|
|
86
95
|
], InboxMessageEntity.prototype, "receivedAt", void 0);
|
|
96
|
+
__decorate([
|
|
97
|
+
(0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }),
|
|
98
|
+
__metadata("design:type", Date)
|
|
99
|
+
], InboxMessageEntity.prototype, "updatedAt", void 0);
|
|
100
|
+
__decorate([
|
|
101
|
+
(0, typeorm_1.Column)({ name: 'recovery_attempts', type: 'int', default: 0 }),
|
|
102
|
+
__metadata("design:type", Number)
|
|
103
|
+
], InboxMessageEntity.prototype, "recoveryAttempts", void 0);
|
|
104
|
+
__decorate([
|
|
105
|
+
(0, typeorm_1.Column)({ name: 'last_recovered_at', type: 'timestamptz', nullable: true }),
|
|
106
|
+
__metadata("design:type", Date)
|
|
107
|
+
], InboxMessageEntity.prototype, "lastRecoveredAt", void 0);
|
|
108
|
+
__decorate([
|
|
109
|
+
(0, typeorm_1.Column)({ name: 'recovery_reason', type: 'text', nullable: true }),
|
|
110
|
+
__metadata("design:type", String)
|
|
111
|
+
], InboxMessageEntity.prototype, "recoveryReason", void 0);
|
|
87
112
|
exports.InboxMessageEntity = InboxMessageEntity = __decorate([
|
|
88
113
|
(0, typeorm_1.Entity)('inbox_messages'),
|
|
89
114
|
(0, typeorm_1.Index)('idx_inbox_unique', ['messageId', 'source'], { unique: true }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-message.entity.js","sourceRoot":"","sources":["../../src/entities/inbox-message.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oEAAiF;AACjF,
|
|
1
|
+
{"version":3,"file":"inbox-message.entity.js","sourceRoot":"","sources":["../../src/entities/inbox-message.entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1.2.0-001-AddInboxMetadataColumn.d.ts","sourceRoot":"","sources":["../../src/migrations/1.2.0-001-AddInboxMetadataColumn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAWlD,eAAO,MAAM,SAAS,EAAE,SAiBvB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migration = void 0;
|
|
4
|
+
exports.migration = {
|
|
5
|
+
version: '1.2.0-001',
|
|
6
|
+
name: 'AddInboxMetadataColumn',
|
|
7
|
+
async up(queryRunner) {
|
|
8
|
+
await queryRunner.query(`
|
|
9
|
+
ALTER TABLE inbox_messages
|
|
10
|
+
ADD COLUMN IF NOT EXISTS metadata jsonb DEFAULT NULL;
|
|
11
|
+
`);
|
|
12
|
+
},
|
|
13
|
+
async down(queryRunner) {
|
|
14
|
+
await queryRunner.query(`
|
|
15
|
+
ALTER TABLE inbox_messages
|
|
16
|
+
DROP COLUMN IF EXISTS metadata;
|
|
17
|
+
`);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=1.2.0-001-AddInboxMetadataColumn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1.2.0-001-AddInboxMetadataColumn.js","sourceRoot":"","sources":["../../src/migrations/1.2.0-001-AddInboxMetadataColumn.ts"],"names":[],"mappings":";;;AAaa,QAAA,SAAS,GAAc;IAClC,OAAO,EAAE,WAAW;IACpB,IAAI,EAAE,wBAAwB;IAE9B,KAAK,CAAC,EAAE,CAAC,WAAwB;QAC/B,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAwB;QACjC,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1.5.0-001-AddInboxRecoveryFields.d.ts","sourceRoot":"","sources":["../../src/migrations/1.5.0-001-AddInboxRecoveryFields.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAgBlD,eAAO,MAAM,SAAS,EAAE,SA4EvB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migration = void 0;
|
|
4
|
+
exports.migration = {
|
|
5
|
+
version: '1.5.0-001',
|
|
6
|
+
name: 'AddInboxRecoveryFields',
|
|
7
|
+
async up(queryRunner) {
|
|
8
|
+
await queryRunner.query(`
|
|
9
|
+
ALTER TABLE inbox_messages
|
|
10
|
+
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE;
|
|
11
|
+
`);
|
|
12
|
+
await queryRunner.query(`
|
|
13
|
+
UPDATE inbox_messages SET updated_at = created_at WHERE updated_at IS NULL;
|
|
14
|
+
`);
|
|
15
|
+
await queryRunner.query(`
|
|
16
|
+
ALTER TABLE inbox_messages
|
|
17
|
+
ALTER COLUMN updated_at SET DEFAULT NOW();
|
|
18
|
+
`);
|
|
19
|
+
await queryRunner.query(`
|
|
20
|
+
ALTER TABLE inbox_messages
|
|
21
|
+
ADD COLUMN IF NOT EXISTS recovery_attempts INTEGER NOT NULL DEFAULT 0;
|
|
22
|
+
`);
|
|
23
|
+
await queryRunner.query(`
|
|
24
|
+
ALTER TABLE inbox_messages
|
|
25
|
+
ADD COLUMN IF NOT EXISTS last_recovered_at TIMESTAMP WITH TIME ZONE;
|
|
26
|
+
`);
|
|
27
|
+
await queryRunner.query(`
|
|
28
|
+
ALTER TABLE inbox_messages
|
|
29
|
+
ADD COLUMN IF NOT EXISTS recovery_reason TEXT;
|
|
30
|
+
`);
|
|
31
|
+
await queryRunner.query(`
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_inbox_recovery_sweep
|
|
33
|
+
ON inbox_messages (status, updated_at)
|
|
34
|
+
WHERE status = 'processing';
|
|
35
|
+
`);
|
|
36
|
+
await queryRunner.query(`
|
|
37
|
+
CREATE OR REPLACE FUNCTION update_inbox_updated_at()
|
|
38
|
+
RETURNS TRIGGER AS $$
|
|
39
|
+
BEGIN
|
|
40
|
+
NEW.updated_at = NOW();
|
|
41
|
+
RETURN NEW;
|
|
42
|
+
END;
|
|
43
|
+
$$ LANGUAGE plpgsql;
|
|
44
|
+
`);
|
|
45
|
+
await queryRunner.query(`
|
|
46
|
+
DROP TRIGGER IF EXISTS trg_inbox_updated_at ON inbox_messages;
|
|
47
|
+
CREATE TRIGGER trg_inbox_updated_at
|
|
48
|
+
BEFORE UPDATE ON inbox_messages
|
|
49
|
+
FOR EACH ROW
|
|
50
|
+
EXECUTE FUNCTION update_inbox_updated_at();
|
|
51
|
+
`);
|
|
52
|
+
},
|
|
53
|
+
async down(queryRunner) {
|
|
54
|
+
await queryRunner.query(`DROP TRIGGER IF EXISTS trg_inbox_updated_at ON inbox_messages;`);
|
|
55
|
+
await queryRunner.query(`DROP FUNCTION IF EXISTS update_inbox_updated_at;`);
|
|
56
|
+
await queryRunner.query(`DROP INDEX IF EXISTS idx_inbox_recovery_sweep;`);
|
|
57
|
+
await queryRunner.query(`ALTER TABLE inbox_messages DROP COLUMN IF EXISTS recovery_reason;`);
|
|
58
|
+
await queryRunner.query(`ALTER TABLE inbox_messages DROP COLUMN IF EXISTS last_recovered_at;`);
|
|
59
|
+
await queryRunner.query(`ALTER TABLE inbox_messages DROP COLUMN IF EXISTS recovery_attempts;`);
|
|
60
|
+
await queryRunner.query(`ALTER TABLE inbox_messages DROP COLUMN IF EXISTS updated_at;`);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=1.5.0-001-AddInboxRecoveryFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1.5.0-001-AddInboxRecoveryFields.js","sourceRoot":"","sources":["../../src/migrations/1.5.0-001-AddInboxRecoveryFields.ts"],"names":[],"mappings":";;;AAkBa,QAAA,SAAS,GAAc;IAClC,OAAO,EAAE,WAAW;IACpB,IAAI,EAAE,wBAAwB;IAE9B,KAAK,CAAC,EAAE,CAAC,WAAwB;QAE/B,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;KAEvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;;KAGvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;;;KAIvB,CAAC,CAAC;QAGH,MAAM,WAAW,CAAC,KAAK,CAAC;;;;;;;;KAQvB,CAAC,CAAC;QAEH,MAAM,WAAW,CAAC,KAAK,CAAC;;;;;;KAMvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAwB;QACjC,MAAM,WAAW,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAC1F,MAAM,WAAW,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC5E,MAAM,WAAW,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC1E,MAAM,WAAW,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QAC7F,MAAM,WAAW,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC/F,MAAM,WAAW,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC/F,MAAM,WAAW,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAC1F,CAAC;CACF,CAAC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { CreateInboxMessageDto, IInboxRepository, RecordInboxMessageResult } from '@prodforcode/event-forge-core';
|
|
1
|
+
import { CreateInboxMessageDto, IInboxRepository, InboxMessage, RecordInboxMessageResult } from '@prodforcode/event-forge-core';
|
|
2
2
|
import { DataSource } from 'typeorm';
|
|
3
3
|
export declare class TypeOrmInboxRepository implements IInboxRepository {
|
|
4
4
|
private readonly repository;
|
|
5
5
|
constructor(dataSource: DataSource);
|
|
6
6
|
record(dto: CreateInboxMessageDto): Promise<RecordInboxMessageResult>;
|
|
7
7
|
exists(messageId: string, source: string): Promise<boolean>;
|
|
8
|
-
markProcessing(id: string): Promise<
|
|
8
|
+
markProcessing(id: string): Promise<boolean>;
|
|
9
9
|
markProcessed(id: string): Promise<void>;
|
|
10
10
|
markFailed(id: string, error: string, permanent?: boolean, scheduledAt?: Date): Promise<void>;
|
|
11
11
|
deleteOlderThan(date: Date): Promise<number>;
|
|
12
|
+
findStuckProcessing(cutoffDate: Date, limit: number): Promise<InboxMessage[]>;
|
|
13
|
+
resetForRetry(id: string, reason: string): Promise<boolean>;
|
|
14
|
+
markPermanentlyFailedRecovery(id: string, reason: string): Promise<void>;
|
|
12
15
|
}
|
|
13
16
|
//# sourceMappingURL=typeorm-inbox.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-inbox.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/typeorm-inbox.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"typeorm-inbox.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/typeorm-inbox.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EAEZ,wBAAwB,EACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAwB,MAAM,SAAS,CAAC;AAS3D,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;gBAEhD,UAAU,EAAE,UAAU;IAI5B,MAAM,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAmFrE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa5C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,UAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3F,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAS5C,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAY7E,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3D,6BAA6B,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB/E"}
|
|
@@ -17,6 +17,13 @@ class TypeOrmInboxRepository {
|
|
|
17
17
|
},
|
|
18
18
|
});
|
|
19
19
|
if (existing) {
|
|
20
|
+
if (existing.status === event_forge_core_1.InboxMessageStatus.PROCESSING ||
|
|
21
|
+
existing.status === event_forge_core_1.InboxMessageStatus.FAILED) {
|
|
22
|
+
return {
|
|
23
|
+
message: existing,
|
|
24
|
+
isDuplicate: false,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
20
27
|
return {
|
|
21
28
|
message: existing,
|
|
22
29
|
isDuplicate: true,
|
|
@@ -27,6 +34,7 @@ class TypeOrmInboxRepository {
|
|
|
27
34
|
source: dto.source,
|
|
28
35
|
eventType: dto.eventType,
|
|
29
36
|
payload: dto.payload,
|
|
37
|
+
metadata: dto.metadata ?? undefined,
|
|
30
38
|
status: event_forge_core_1.InboxMessageStatus.RECEIVED,
|
|
31
39
|
retryCount: 0,
|
|
32
40
|
maxRetries: dto.maxRetries ?? 3,
|
|
@@ -49,6 +57,13 @@ class TypeOrmInboxRepository {
|
|
|
49
57
|
if (!existing) {
|
|
50
58
|
throw new Error(`Race condition: Duplicate key error but message not found for messageId=${dto.messageId}, source=${dto.source}`);
|
|
51
59
|
}
|
|
60
|
+
if (existing.status === event_forge_core_1.InboxMessageStatus.PROCESSING ||
|
|
61
|
+
existing.status === event_forge_core_1.InboxMessageStatus.FAILED) {
|
|
62
|
+
return {
|
|
63
|
+
message: existing,
|
|
64
|
+
isDuplicate: false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
52
67
|
return {
|
|
53
68
|
message: existing,
|
|
54
69
|
isDuplicate: true,
|
|
@@ -67,9 +82,16 @@ class TypeOrmInboxRepository {
|
|
|
67
82
|
return count > 0;
|
|
68
83
|
}
|
|
69
84
|
async markProcessing(id) {
|
|
70
|
-
await this.repository
|
|
71
|
-
|
|
72
|
-
|
|
85
|
+
const result = await this.repository
|
|
86
|
+
.createQueryBuilder()
|
|
87
|
+
.update(inbox_message_entity_1.InboxMessageEntity)
|
|
88
|
+
.set({ status: event_forge_core_1.InboxMessageStatus.PROCESSING })
|
|
89
|
+
.where('id = :id AND status IN (:...statuses)', {
|
|
90
|
+
id,
|
|
91
|
+
statuses: [event_forge_core_1.InboxMessageStatus.RECEIVED, event_forge_core_1.InboxMessageStatus.FAILED],
|
|
92
|
+
})
|
|
93
|
+
.execute();
|
|
94
|
+
return (result.affected ?? 0) > 0;
|
|
73
95
|
}
|
|
74
96
|
async markProcessed(id) {
|
|
75
97
|
await this.repository.update(id, {
|
|
@@ -100,6 +122,52 @@ class TypeOrmInboxRepository {
|
|
|
100
122
|
});
|
|
101
123
|
return result.affected ?? 0;
|
|
102
124
|
}
|
|
125
|
+
async findStuckProcessing(cutoffDate, limit) {
|
|
126
|
+
const entities = await this.repository.find({
|
|
127
|
+
where: {
|
|
128
|
+
status: event_forge_core_1.InboxMessageStatus.PROCESSING,
|
|
129
|
+
updatedAt: (0, typeorm_1.LessThan)(cutoffDate),
|
|
130
|
+
},
|
|
131
|
+
take: limit,
|
|
132
|
+
order: { updatedAt: 'ASC' },
|
|
133
|
+
});
|
|
134
|
+
return entities;
|
|
135
|
+
}
|
|
136
|
+
async resetForRetry(id, reason) {
|
|
137
|
+
const result = await this.repository
|
|
138
|
+
.createQueryBuilder()
|
|
139
|
+
.update(inbox_message_entity_1.InboxMessageEntity)
|
|
140
|
+
.set({
|
|
141
|
+
status: event_forge_core_1.InboxMessageStatus.FAILED,
|
|
142
|
+
recoveryReason: reason,
|
|
143
|
+
lastRecoveredAt: new Date(),
|
|
144
|
+
errorMessage: `Recovered: ${reason}`,
|
|
145
|
+
recoveryAttempts: () => 'recovery_attempts + 1',
|
|
146
|
+
})
|
|
147
|
+
.where('id = :id AND status = :status', {
|
|
148
|
+
id,
|
|
149
|
+
status: event_forge_core_1.InboxMessageStatus.PROCESSING,
|
|
150
|
+
})
|
|
151
|
+
.execute();
|
|
152
|
+
return (result.affected ?? 0) > 0;
|
|
153
|
+
}
|
|
154
|
+
async markPermanentlyFailedRecovery(id, reason) {
|
|
155
|
+
await this.repository
|
|
156
|
+
.createQueryBuilder()
|
|
157
|
+
.update(inbox_message_entity_1.InboxMessageEntity)
|
|
158
|
+
.set({
|
|
159
|
+
status: event_forge_core_1.InboxMessageStatus.PERMANENTLY_FAILED,
|
|
160
|
+
recoveryReason: reason,
|
|
161
|
+
lastRecoveredAt: new Date(),
|
|
162
|
+
errorMessage: `Recovery exhausted: ${reason}`,
|
|
163
|
+
recoveryAttempts: () => 'recovery_attempts + 1',
|
|
164
|
+
})
|
|
165
|
+
.where('id = :id AND status = :status', {
|
|
166
|
+
id,
|
|
167
|
+
status: event_forge_core_1.InboxMessageStatus.PROCESSING,
|
|
168
|
+
})
|
|
169
|
+
.execute();
|
|
170
|
+
}
|
|
103
171
|
}
|
|
104
172
|
exports.TypeOrmInboxRepository = TypeOrmInboxRepository;
|
|
105
173
|
//# sourceMappingURL=typeorm-inbox.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-inbox.repository.js","sourceRoot":"","sources":["../../src/repositories/typeorm-inbox.repository.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"typeorm-inbox.repository.js","sourceRoot":"","sources":["../../src/repositories/typeorm-inbox.repository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prodforcode/event-forge-typeorm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "TypeORM adapter for Universal Inbox-Outbox Pattern (PostgreSQL)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"commander": "^14.0.2",
|
|
25
25
|
"typeorm": "^0.3.17",
|
|
26
|
-
"@prodforcode/event-forge-core": "1.
|
|
26
|
+
"@prodforcode/event-forge-core": "1.5.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/better-sqlite3": "^7.6.8",
|