node-cqrs 1.2.0-beta.1 → 1.3.0-alpha.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/CHANGELOG.md +5 -17
- package/README.md +29 -9
- package/dist/cjs/postgresql/AbstractPostgresqlAccessor.js +83 -0
- package/dist/cjs/postgresql/AbstractPostgresqlAccessor.js.map +1 -0
- package/dist/cjs/postgresql/AbstractPostgresqlObjectProjection.js +36 -0
- package/dist/cjs/postgresql/AbstractPostgresqlObjectProjection.js.map +1 -0
- package/dist/cjs/postgresql/AbstractPostgresqlView.js +53 -0
- package/dist/cjs/postgresql/AbstractPostgresqlView.js.map +1 -0
- package/dist/cjs/postgresql/IContainer.js +3 -0
- package/dist/cjs/postgresql/IContainer.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlConnection.js +3 -0
- package/dist/cjs/postgresql/PostgresqlConnection.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlEventLocker.js +127 -0
- package/dist/cjs/postgresql/PostgresqlEventLocker.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlEventStorage.js +315 -0
- package/dist/cjs/postgresql/PostgresqlEventStorage.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlObjectStorage.js +137 -0
- package/dist/cjs/postgresql/PostgresqlObjectStorage.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlObjectView.js +46 -0
- package/dist/cjs/postgresql/PostgresqlObjectView.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlProjectionDataParams.js +3 -0
- package/dist/cjs/postgresql/PostgresqlProjectionDataParams.js.map +1 -0
- package/dist/cjs/postgresql/PostgresqlViewLocker.js +151 -0
- package/dist/cjs/postgresql/PostgresqlViewLocker.js.map +1 -0
- package/dist/cjs/postgresql/index.js +29 -0
- package/dist/cjs/postgresql/index.js.map +1 -0
- package/dist/cjs/postgresql/utils/getEventId.js +14 -0
- package/dist/cjs/postgresql/utils/getEventId.js.map +1 -0
- package/dist/cjs/postgresql/utils/index.js +19 -0
- package/dist/cjs/postgresql/utils/index.js.map +1 -0
- package/dist/cjs/postgresql/utils/quoteIdentifier.js +14 -0
- package/dist/cjs/postgresql/utils/quoteIdentifier.js.map +1 -0
- package/dist/cjs/sqlite/SqliteEventStorage.js +66 -36
- package/dist/cjs/sqlite/SqliteEventStorage.js.map +1 -1
- package/dist/esm/postgresql/AbstractPostgresqlAccessor.js +79 -0
- package/dist/esm/postgresql/AbstractPostgresqlAccessor.js.map +1 -0
- package/dist/esm/postgresql/AbstractPostgresqlObjectProjection.js +32 -0
- package/dist/esm/postgresql/AbstractPostgresqlObjectProjection.js.map +1 -0
- package/dist/esm/postgresql/AbstractPostgresqlView.js +49 -0
- package/dist/esm/postgresql/AbstractPostgresqlView.js.map +1 -0
- package/dist/esm/postgresql/IContainer.js +2 -0
- package/dist/esm/postgresql/IContainer.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlConnection.js +2 -0
- package/dist/esm/postgresql/PostgresqlConnection.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlEventLocker.js +123 -0
- package/dist/esm/postgresql/PostgresqlEventLocker.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlEventStorage.js +311 -0
- package/dist/esm/postgresql/PostgresqlEventStorage.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlObjectStorage.js +133 -0
- package/dist/esm/postgresql/PostgresqlObjectStorage.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlObjectView.js +42 -0
- package/dist/esm/postgresql/PostgresqlObjectView.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlProjectionDataParams.js +2 -0
- package/dist/esm/postgresql/PostgresqlProjectionDataParams.js.map +1 -0
- package/dist/esm/postgresql/PostgresqlViewLocker.js +147 -0
- package/dist/esm/postgresql/PostgresqlViewLocker.js.map +1 -0
- package/dist/esm/postgresql/index.js +13 -0
- package/dist/esm/postgresql/index.js.map +1 -0
- package/dist/esm/postgresql/utils/getEventId.js +10 -0
- package/dist/esm/postgresql/utils/getEventId.js.map +1 -0
- package/dist/esm/postgresql/utils/index.js +3 -0
- package/dist/esm/postgresql/utils/index.js.map +1 -0
- package/dist/esm/postgresql/utils/quoteIdentifier.js +11 -0
- package/dist/esm/postgresql/utils/quoteIdentifier.js.map +1 -0
- package/dist/esm/sqlite/SqliteEventStorage.js +66 -36
- package/dist/esm/sqlite/SqliteEventStorage.js.map +1 -1
- package/dist/types/postgresql/AbstractPostgresqlAccessor.d.ts +29 -0
- package/dist/types/postgresql/AbstractPostgresqlObjectProjection.d.ts +12 -0
- package/dist/types/postgresql/AbstractPostgresqlView.d.ts +23 -0
- package/dist/types/postgresql/IContainer.d.ts +12 -0
- package/dist/types/postgresql/PostgresqlConnection.d.ts +7 -0
- package/dist/types/postgresql/PostgresqlEventLocker.d.ts +39 -0
- package/dist/types/postgresql/PostgresqlEventStorage.d.ts +23 -0
- package/dist/types/postgresql/PostgresqlObjectStorage.d.ts +29 -0
- package/dist/types/postgresql/PostgresqlObjectView.d.ts +19 -0
- package/dist/types/postgresql/PostgresqlProjectionDataParams.d.ts +14 -0
- package/dist/types/postgresql/PostgresqlViewLocker.d.ts +41 -0
- package/dist/types/postgresql/index.d.ts +12 -0
- package/dist/types/postgresql/utils/getEventId.d.ts +5 -0
- package/dist/types/postgresql/utils/index.d.ts +2 -0
- package/dist/types/postgresql/utils/quoteIdentifier.d.ts +1 -0
- package/package.json +20 -5
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostgresqlViewLocker = void 0;
|
|
4
|
+
const index_ts_1 = require("../utils/index.js");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const AbstractPostgresqlAccessor_ts_1 = require("./AbstractPostgresqlAccessor.js");
|
|
8
|
+
const index_ts_2 = require("./utils/index.js");
|
|
9
|
+
const delay = (0, util_1.promisify)(setTimeout);
|
|
10
|
+
/**
|
|
11
|
+
* PostgreSQL-backed implementation of IViewLocker.
|
|
12
|
+
*
|
|
13
|
+
* Uses a row with token + locked_till semantics to acquire a distributed view lock.
|
|
14
|
+
* The lock is automatically prolonged at half the TTL interval to prevent expiration
|
|
15
|
+
* while processing is in progress.
|
|
16
|
+
*/
|
|
17
|
+
class PostgresqlViewLocker extends AbstractPostgresqlAccessor_ts_1.AbstractPostgresqlAccessor {
|
|
18
|
+
static DEFAULT_VIEW_LOCK_TTL = 120_000;
|
|
19
|
+
static DEFAULT_TABLE = 'ncqrs_view_locks';
|
|
20
|
+
#projectionName;
|
|
21
|
+
#schemaVersion;
|
|
22
|
+
#viewLockTableName;
|
|
23
|
+
#viewLockTtl;
|
|
24
|
+
#logger;
|
|
25
|
+
#lockToken;
|
|
26
|
+
#lockMarker;
|
|
27
|
+
#lockProlongationTimeout;
|
|
28
|
+
constructor(o) {
|
|
29
|
+
super(o);
|
|
30
|
+
(0, index_ts_1.assertString)(o.projectionName, 'o.projectionName');
|
|
31
|
+
(0, index_ts_1.assertString)(o.schemaVersion, 'o.schemaVersion');
|
|
32
|
+
if (o.viewLockTableName !== undefined)
|
|
33
|
+
(0, index_ts_1.assertString)(o.viewLockTableName, 'o.viewLockTableName');
|
|
34
|
+
if (o.viewLockTtl !== undefined)
|
|
35
|
+
(0, index_ts_1.assertNonNegativeInteger)(o.viewLockTtl, 'o.viewLockTtl');
|
|
36
|
+
this.#projectionName = o.projectionName;
|
|
37
|
+
this.#schemaVersion = o.schemaVersion;
|
|
38
|
+
this.#viewLockTableName = (0, index_ts_2.quoteIdentifier)(o.viewLockTableName ?? PostgresqlViewLocker.DEFAULT_TABLE);
|
|
39
|
+
this.#viewLockTtl = o.viewLockTtl ?? PostgresqlViewLocker.DEFAULT_VIEW_LOCK_TTL;
|
|
40
|
+
this.#logger = o.logger && 'child' in o.logger ?
|
|
41
|
+
o.logger.child({ service: this.constructor.name }) :
|
|
42
|
+
o.logger;
|
|
43
|
+
}
|
|
44
|
+
async initialize(db) {
|
|
45
|
+
await db.query(`
|
|
46
|
+
CREATE TABLE IF NOT EXISTS ${this.#viewLockTableName} (
|
|
47
|
+
projection_name text NOT NULL,
|
|
48
|
+
schema_version text NOT NULL,
|
|
49
|
+
locked_till timestamptz NULL,
|
|
50
|
+
lock_token text NULL,
|
|
51
|
+
last_event text NULL,
|
|
52
|
+
PRIMARY KEY (projection_name, schema_version)
|
|
53
|
+
)
|
|
54
|
+
`);
|
|
55
|
+
await db.query(`
|
|
56
|
+
CREATE INDEX IF NOT EXISTS ${(0, index_ts_2.quoteIdentifier)(`${this.#tableNameForIndex()}_locked_till_idx`)}
|
|
57
|
+
ON ${this.#viewLockTableName} (locked_till)
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
60
|
+
get ready() {
|
|
61
|
+
return !this.#lockMarker;
|
|
62
|
+
}
|
|
63
|
+
async lock() {
|
|
64
|
+
this.#lockMarker = new index_ts_1.Deferred();
|
|
65
|
+
this.#lockToken = (0, node_crypto_1.randomUUID)();
|
|
66
|
+
await this.assertConnection();
|
|
67
|
+
let lockAcquired = false;
|
|
68
|
+
while (!lockAcquired) {
|
|
69
|
+
const lockedTill = new Date(Date.now() + this.#viewLockTtl);
|
|
70
|
+
const upsertResult = await this.connection.query(`
|
|
71
|
+
INSERT INTO ${this.#viewLockTableName} AS view_lock
|
|
72
|
+
(projection_name, schema_version, locked_till, lock_token)
|
|
73
|
+
VALUES ($1, $2, $3, $4)
|
|
74
|
+
ON CONFLICT (projection_name, schema_version)
|
|
75
|
+
DO UPDATE SET
|
|
76
|
+
locked_till = excluded.locked_till,
|
|
77
|
+
lock_token = excluded.lock_token
|
|
78
|
+
WHERE
|
|
79
|
+
view_lock.locked_till IS NULL
|
|
80
|
+
OR view_lock.locked_till < NOW()
|
|
81
|
+
`, [this.#projectionName, this.#schemaVersion, lockedTill, this.#lockToken]);
|
|
82
|
+
lockAcquired = upsertResult.rowCount === 1;
|
|
83
|
+
if (!lockAcquired) {
|
|
84
|
+
this.#logger?.debug(`"${this.#projectionName}" is locked by another process`);
|
|
85
|
+
await delay(this.#viewLockTtl / 2);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.#logger?.debug(`"${this.#projectionName}" lock obtained for ${this.#viewLockTtl}ms`);
|
|
89
|
+
this.scheduleLockProlongation();
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
scheduleLockProlongation() {
|
|
93
|
+
const ms = this.#viewLockTtl / 2;
|
|
94
|
+
this.#lockProlongationTimeout = setTimeout(() => this.prolongLock(), ms);
|
|
95
|
+
this.#lockProlongationTimeout.unref();
|
|
96
|
+
this.#logger?.debug(`"${this.#projectionName}" lock refresh scheduled in ${ms}ms`);
|
|
97
|
+
}
|
|
98
|
+
cancelLockProlongation() {
|
|
99
|
+
clearTimeout(this.#lockProlongationTimeout);
|
|
100
|
+
this.#logger?.debug(`"${this.#projectionName}" lock refresh canceled`);
|
|
101
|
+
}
|
|
102
|
+
async prolongLock() {
|
|
103
|
+
await this.assertConnection();
|
|
104
|
+
const lockedTill = new Date(Date.now() + this.#viewLockTtl);
|
|
105
|
+
const result = await this.connection.query(`
|
|
106
|
+
UPDATE ${this.#viewLockTableName}
|
|
107
|
+
SET
|
|
108
|
+
locked_till = $1
|
|
109
|
+
WHERE
|
|
110
|
+
projection_name = $2
|
|
111
|
+
AND schema_version = $3
|
|
112
|
+
AND lock_token = $4
|
|
113
|
+
AND locked_till IS NOT NULL
|
|
114
|
+
`, [lockedTill, this.#projectionName, this.#schemaVersion, this.#lockToken]);
|
|
115
|
+
if (result.rowCount !== 1)
|
|
116
|
+
throw new Error(`"${this.#projectionName}" lock could not be prolonged`);
|
|
117
|
+
this.#logger?.debug(`"${this.#projectionName}" lock prolonged for ${this.#viewLockTtl}ms`);
|
|
118
|
+
this.scheduleLockProlongation();
|
|
119
|
+
}
|
|
120
|
+
async unlock() {
|
|
121
|
+
this.#lockMarker?.resolve();
|
|
122
|
+
this.#lockMarker = undefined;
|
|
123
|
+
this.cancelLockProlongation();
|
|
124
|
+
await this.assertConnection();
|
|
125
|
+
const result = await this.connection.query(`
|
|
126
|
+
UPDATE ${this.#viewLockTableName}
|
|
127
|
+
SET
|
|
128
|
+
locked_till = NULL,
|
|
129
|
+
lock_token = NULL
|
|
130
|
+
WHERE
|
|
131
|
+
projection_name = $1
|
|
132
|
+
AND schema_version = $2
|
|
133
|
+
AND lock_token = $3
|
|
134
|
+
`, [this.#projectionName, this.#schemaVersion, this.#lockToken]);
|
|
135
|
+
this.#lockToken = undefined;
|
|
136
|
+
if (result.rowCount === 1)
|
|
137
|
+
this.#logger?.debug(`"${this.#projectionName}" lock released`);
|
|
138
|
+
else
|
|
139
|
+
this.#logger?.warn(`"${this.#projectionName}" lock didn't exist`);
|
|
140
|
+
}
|
|
141
|
+
once(event) {
|
|
142
|
+
if (event !== 'ready')
|
|
143
|
+
throw new TypeError(`Unexpected event: ${event}`);
|
|
144
|
+
return this.#lockMarker?.promise ?? Promise.resolve();
|
|
145
|
+
}
|
|
146
|
+
#tableNameForIndex() {
|
|
147
|
+
return this.#viewLockTableName.replaceAll('"', '').replaceAll('.', '_');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.PostgresqlViewLocker = PostgresqlViewLocker;
|
|
151
|
+
//# sourceMappingURL=PostgresqlViewLocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresqlViewLocker.js","sourceRoot":"","sources":["../../../src/postgresql/PostgresqlViewLocker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
require("./IContainer.js");
|
|
18
|
+
__exportStar(require("./AbstractPostgresqlAccessor.js"), exports);
|
|
19
|
+
__exportStar(require("./AbstractPostgresqlObjectProjection.js"), exports);
|
|
20
|
+
__exportStar(require("./AbstractPostgresqlView.js"), exports);
|
|
21
|
+
__exportStar(require("./PostgresqlConnection.js"), exports);
|
|
22
|
+
__exportStar(require("./PostgresqlEventStorage.js"), exports);
|
|
23
|
+
__exportStar(require("./PostgresqlEventLocker.js"), exports);
|
|
24
|
+
__exportStar(require("./PostgresqlObjectStorage.js"), exports);
|
|
25
|
+
__exportStar(require("./PostgresqlObjectView.js"), exports);
|
|
26
|
+
__exportStar(require("./PostgresqlProjectionDataParams.js"), exports);
|
|
27
|
+
__exportStar(require("./PostgresqlViewLocker.js"), exports);
|
|
28
|
+
__exportStar(require("./utils/index.js"), exports);
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/postgresql/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2BAAyB;AAEzB,kEAAgD;AAChD,0EAAwD;AACxD,8DAA4C;AAC5C,4DAA0C;AAC1C,8DAA4C;AAC5C,6DAA2C;AAC3C,+DAA6C;AAC7C,4DAA0C;AAC1C,sEAAoD;AACpD,4DAA0C;AAC1C,mDAAiC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEventId = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
/**
|
|
6
|
+
* Get assigned or generate a deterministic event ID as a hex string.
|
|
7
|
+
*/
|
|
8
|
+
const getEventId = (event) => {
|
|
9
|
+
if (typeof event.id === 'string')
|
|
10
|
+
return event.id;
|
|
11
|
+
return (0, node_crypto_1.createHash)('md5').update(JSON.stringify(event)).digest('hex');
|
|
12
|
+
};
|
|
13
|
+
exports.getEventId = getEventId;
|
|
14
|
+
//# sourceMappingURL=getEventId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEventId.js","sourceRoot":"","sources":["../../../../src/postgresql/utils/getEventId.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAGzC;;GAEG;AACI,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE;IACnD,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,EAAE,CAAC;IAEjB,OAAO,IAAA,wBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC,CAAC;AALW,QAAA,UAAU,cAKrB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./getEventId.js"), exports);
|
|
18
|
+
__exportStar(require("./quoteIdentifier.js"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/postgresql/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,uDAAqC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.quoteIdentifier = quoteIdentifier;
|
|
4
|
+
const assert_ts_1 = require("../../utils/assert.js");
|
|
5
|
+
const IDENTIFIER_PART_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
6
|
+
function quoteIdentifier(identifier) {
|
|
7
|
+
(0, assert_ts_1.assertString)(identifier, 'identifier');
|
|
8
|
+
return identifier.split('.').map(part => {
|
|
9
|
+
if (!IDENTIFIER_PART_PATTERN.test(part))
|
|
10
|
+
throw new TypeError(`Invalid PostgreSQL identifier: ${identifier}`);
|
|
11
|
+
return `"${part}"`;
|
|
12
|
+
}).join('.');
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=quoteIdentifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quoteIdentifier.js","sourceRoot":"","sources":["../../../../src/postgresql/utils/quoteIdentifier.ts"],"names":[],"mappings":";;AAIA,0CASC;AAbD,qDAAqD;AAErD,MAAM,uBAAuB,GAAG,0BAA0B,CAAC;AAE3D,SAAgB,eAAe,CAAC,UAAkB;IACjD,IAAA,wBAAY,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEvC,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACvC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAErE,OAAO,IAAI,IAAI,GAAG,CAAC;IACpB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -12,6 +12,16 @@ function extractMeta(envelope) {
|
|
|
12
12
|
return null;
|
|
13
13
|
return rest;
|
|
14
14
|
}
|
|
15
|
+
function reconstructEvent(row) {
|
|
16
|
+
const data = JSON.parse(row.data);
|
|
17
|
+
const event = {
|
|
18
|
+
id: (0, index_ts_3.bufferToGuid)(row.id),
|
|
19
|
+
...data
|
|
20
|
+
};
|
|
21
|
+
if (row.saga_origins)
|
|
22
|
+
event.sagaOrigins = JSON.parse(row.saga_origins);
|
|
23
|
+
return event;
|
|
24
|
+
}
|
|
15
25
|
class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAccessor {
|
|
16
26
|
#insertEventQuery;
|
|
17
27
|
#insertSagaRefQuery;
|
|
@@ -19,7 +29,6 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
19
29
|
#getRowidQuery;
|
|
20
30
|
#getAggregateEventsQuery;
|
|
21
31
|
#getSagaEventsQuery;
|
|
22
|
-
#getSagaRefsQuery;
|
|
23
32
|
#getEventsByTypesQuery;
|
|
24
33
|
initialize(db) {
|
|
25
34
|
db.pragma('foreign_keys = ON');
|
|
@@ -65,8 +74,23 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
65
74
|
ORDER BY rowid DESC
|
|
66
75
|
LIMIT 1
|
|
67
76
|
)
|
|
68
|
-
SELECT
|
|
69
|
-
|
|
77
|
+
SELECT
|
|
78
|
+
e.id,
|
|
79
|
+
e.aggregate_id,
|
|
80
|
+
e.aggregate_version,
|
|
81
|
+
e.type,
|
|
82
|
+
e.data,
|
|
83
|
+
e.meta,
|
|
84
|
+
e.rowid,
|
|
85
|
+
NULLIF(
|
|
86
|
+
json_group_object(sr.saga_descriptor, lower(hex(sr.origin_id)))
|
|
87
|
+
FILTER (WHERE sr.saga_descriptor IS NOT NULL),
|
|
88
|
+
'{}'
|
|
89
|
+
) AS saga_origins
|
|
90
|
+
FROM tbl_events e
|
|
91
|
+
CROSS JOIN tail
|
|
92
|
+
LEFT JOIN tbl_event_sagas sr
|
|
93
|
+
ON sr.event_id = e.id
|
|
70
94
|
WHERE e.aggregate_id = @aggregateId
|
|
71
95
|
AND (@afterVersion IS NULL OR e.aggregate_version > @afterVersion)
|
|
72
96
|
AND (
|
|
@@ -74,29 +98,55 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
74
98
|
OR e.type IN (SELECT value FROM json_each(@eventTypes))
|
|
75
99
|
OR (@tail = 'last' AND e.id = tail.tail_id)
|
|
76
100
|
)
|
|
101
|
+
GROUP BY e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
|
|
77
102
|
ORDER BY e.rowid
|
|
78
103
|
`);
|
|
79
104
|
this.#getSagaEventsQuery = db.prepare(`
|
|
80
|
-
SELECT
|
|
105
|
+
SELECT
|
|
106
|
+
e.id,
|
|
107
|
+
e.aggregate_id,
|
|
108
|
+
e.aggregate_version,
|
|
109
|
+
e.type,
|
|
110
|
+
e.data,
|
|
111
|
+
e.meta,
|
|
112
|
+
e.rowid,
|
|
113
|
+
NULLIF(
|
|
114
|
+
json_group_object(all_sr.saga_descriptor, lower(hex(all_sr.origin_id)))
|
|
115
|
+
FILTER (WHERE all_sr.saga_descriptor IS NOT NULL),
|
|
116
|
+
'{}'
|
|
117
|
+
) AS saga_origins
|
|
81
118
|
FROM tbl_events e
|
|
82
119
|
LEFT JOIN tbl_event_sagas sr
|
|
83
120
|
ON sr.event_id = e.id
|
|
84
121
|
AND sr.saga_descriptor = @sagaDescriptor
|
|
85
122
|
AND sr.origin_id = @originId
|
|
123
|
+
LEFT JOIN tbl_event_sagas all_sr
|
|
124
|
+
ON all_sr.event_id = e.id
|
|
86
125
|
WHERE e.rowid >= @originRowid AND e.rowid < @beforeRowid
|
|
87
126
|
AND (e.id = @originId OR sr.event_id IS NOT NULL)
|
|
127
|
+
GROUP BY e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
|
|
88
128
|
ORDER BY e.rowid
|
|
89
129
|
`);
|
|
90
|
-
this.#getSagaRefsQuery = db.prepare(`
|
|
91
|
-
SELECT saga_descriptor, origin_id
|
|
92
|
-
FROM tbl_event_sagas
|
|
93
|
-
WHERE event_id = ?
|
|
94
|
-
`);
|
|
95
130
|
this.#getEventsByTypesQuery = db.prepare(`
|
|
96
|
-
SELECT
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
131
|
+
SELECT
|
|
132
|
+
e.id,
|
|
133
|
+
e.aggregate_id,
|
|
134
|
+
e.aggregate_version,
|
|
135
|
+
e.type,
|
|
136
|
+
e.data,
|
|
137
|
+
e.meta,
|
|
138
|
+
e.rowid,
|
|
139
|
+
NULLIF(
|
|
140
|
+
json_group_object(sr.saga_descriptor, lower(hex(sr.origin_id)))
|
|
141
|
+
FILTER (WHERE sr.saga_descriptor IS NOT NULL),
|
|
142
|
+
'{}'
|
|
143
|
+
) AS saga_origins
|
|
144
|
+
FROM tbl_events e
|
|
145
|
+
LEFT JOIN tbl_event_sagas sr
|
|
146
|
+
ON sr.event_id = e.id
|
|
147
|
+
WHERE e.rowid > ?
|
|
148
|
+
GROUP BY e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
|
|
149
|
+
ORDER BY e.rowid
|
|
100
150
|
`);
|
|
101
151
|
}
|
|
102
152
|
// eslint-disable-next-line class-methods-use-this
|
|
@@ -137,7 +187,7 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
137
187
|
tail: options?.tail ?? null
|
|
138
188
|
});
|
|
139
189
|
for (const row of rows)
|
|
140
|
-
yield
|
|
190
|
+
yield reconstructEvent(row);
|
|
141
191
|
}
|
|
142
192
|
async *getSagaEvents(sagaId, { beforeEvent }) {
|
|
143
193
|
await this.assertConnection();
|
|
@@ -158,7 +208,7 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
158
208
|
beforeRowid: beforeRowid.rowid
|
|
159
209
|
});
|
|
160
210
|
for (const row of rows)
|
|
161
|
-
yield
|
|
211
|
+
yield reconstructEvent(row);
|
|
162
212
|
}
|
|
163
213
|
async *getEventsByTypes(eventTypes, options) {
|
|
164
214
|
await this.assertConnection();
|
|
@@ -175,7 +225,7 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
175
225
|
const rows = this.#getEventsByTypesQuery.all(afterRowid);
|
|
176
226
|
for (const row of rows) {
|
|
177
227
|
if (eventTypes.includes(row.type))
|
|
178
|
-
yield
|
|
228
|
+
yield reconstructEvent(row);
|
|
179
229
|
}
|
|
180
230
|
}
|
|
181
231
|
async process(batch) {
|
|
@@ -190,26 +240,6 @@ class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcces
|
|
|
190
240
|
await this.commitEvents(events, { ignoreConcurrencyError, meta });
|
|
191
241
|
return batch;
|
|
192
242
|
}
|
|
193
|
-
#getSagaOriginsForEvent(eventIdBuf) {
|
|
194
|
-
const refs = this.#getSagaRefsQuery.all(eventIdBuf);
|
|
195
|
-
if (refs.length === 0)
|
|
196
|
-
return {};
|
|
197
|
-
const sagaOrigins = {};
|
|
198
|
-
for (const ref of refs)
|
|
199
|
-
sagaOrigins[ref.saga_descriptor] = (0, index_ts_3.bufferToGuid)(ref.origin_id);
|
|
200
|
-
return sagaOrigins;
|
|
201
|
-
}
|
|
202
|
-
#reconstructEvent(row) {
|
|
203
|
-
const data = JSON.parse(row.data);
|
|
204
|
-
const sagaOrigins = this.#getSagaOriginsForEvent(row.id);
|
|
205
|
-
const event = {
|
|
206
|
-
id: (0, index_ts_3.bufferToGuid)(row.id),
|
|
207
|
-
...data
|
|
208
|
-
};
|
|
209
|
-
if (Object.keys(sagaOrigins).length > 0)
|
|
210
|
-
event.sagaOrigins = sagaOrigins;
|
|
211
|
-
return event;
|
|
212
|
-
}
|
|
213
243
|
}
|
|
214
244
|
exports.SqliteEventStorage = SqliteEventStorage;
|
|
215
245
|
//# sourceMappingURL=SqliteEventStorage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteEventStorage.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteEventStorage.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAezC,gDAA8D;AAC9D,iDAAsD;AACtD,2EAAqE;AACrE,+CAAsD;
|
|
1
|
+
{"version":3,"file":"SqliteEventStorage.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteEventStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { Lock } from "../utils/index.js";
|
|
3
|
+
const transactionConnectionStorage = new AsyncLocalStorage();
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for accessing a PostgreSQL connection.
|
|
6
|
+
*
|
|
7
|
+
* Manages the connection lifecycle, ensuring initialization via `assertConnection`.
|
|
8
|
+
* Supports providing a query-capable connection directly or a factory function for lazy initialization.
|
|
9
|
+
*
|
|
10
|
+
* Subclasses must implement the `initialize` method for specific setup tasks.
|
|
11
|
+
*/
|
|
12
|
+
export class AbstractPostgresqlAccessor {
|
|
13
|
+
db;
|
|
14
|
+
#dbFactory;
|
|
15
|
+
#initLocker = new Lock();
|
|
16
|
+
#initialized = false;
|
|
17
|
+
constructor(c) {
|
|
18
|
+
if (!c.viewModelPostgresqlDb && !c.viewModelPostgresqlDbFactory)
|
|
19
|
+
throw new TypeError('either viewModelPostgresqlDb or viewModelPostgresqlDbFactory argument required');
|
|
20
|
+
this.db = c.viewModelPostgresqlDb;
|
|
21
|
+
this.#dbFactory = c.viewModelPostgresqlDbFactory;
|
|
22
|
+
}
|
|
23
|
+
get connection() {
|
|
24
|
+
return transactionConnectionStorage.getStore() ?? this.db;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Ensures that the PostgreSQL connection is initialized.
|
|
28
|
+
* Uses a lock to prevent race conditions during concurrent initialization attempts.
|
|
29
|
+
* If the connection is not already set, it creates one using the provided factory
|
|
30
|
+
* and then calls the `initialize` method.
|
|
31
|
+
*
|
|
32
|
+
* This method is idempotent and safe to call multiple times.
|
|
33
|
+
*/
|
|
34
|
+
async assertConnection() {
|
|
35
|
+
if (this.#initialized)
|
|
36
|
+
return;
|
|
37
|
+
try {
|
|
38
|
+
await this.#initLocker.acquire();
|
|
39
|
+
if (this.#initialized)
|
|
40
|
+
return;
|
|
41
|
+
if (!this.db)
|
|
42
|
+
this.db = await this.#dbFactory();
|
|
43
|
+
await this.initialize(this.db);
|
|
44
|
+
this.#initialized = true;
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
this.#initLocker.release();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async runInTransaction(callback) {
|
|
51
|
+
await this.assertConnection();
|
|
52
|
+
if (transactionConnectionStorage.getStore())
|
|
53
|
+
return callback();
|
|
54
|
+
const transactionConnection = await this.getTransactionConnection();
|
|
55
|
+
await transactionConnection.query('BEGIN');
|
|
56
|
+
try {
|
|
57
|
+
const result = await transactionConnectionStorage.run(transactionConnection, callback);
|
|
58
|
+
await transactionConnection.query('COMMIT');
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
await transactionConnection.query('ROLLBACK');
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
if ('release' in transactionConnection)
|
|
67
|
+
transactionConnection.release();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async getTransactionConnection() {
|
|
71
|
+
if (AbstractPostgresqlAccessor.isConnectionPool(this.db))
|
|
72
|
+
return this.db.connect();
|
|
73
|
+
return this.db;
|
|
74
|
+
}
|
|
75
|
+
static isConnectionPool(db) {
|
|
76
|
+
return typeof db?.connect === 'function';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=AbstractPostgresqlAccessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractPostgresqlAccessor.js","sourceRoot":"","sources":["../../../src/postgresql/AbstractPostgresqlAccessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAWzC,MAAM,4BAA4B,GAAG,IAAI,iBAAiB,EAAwB,CAAC;AAEnF;;;;;;;GAOG;AACH,MAAM,OAAgB,0BAA0B;IAErC,EAAE,CAAmC;IACtC,UAAU,CAA2E;IACrF,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAClC,YAAY,GAAG,KAAK,CAAC;IAErB,YAAY,CAAsF;QACjG,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,4BAA4B;YAC9D,MAAM,IAAI,SAAS,CAAC,gFAAgF,CAAC,CAAC;QAEvG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,qBAAqB,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,4BAA4B,CAAC;IAClD,CAAC;IAID,IAAc,UAAU;QACvB,OAAO,4BAA4B,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAG,CAAC;IAC5D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB;QACrB,IAAI,IAAI,CAAC,YAAY;YACpB,OAAO;QAER,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,YAAY;gBACpB,OAAO;YAER,IAAI,CAAC,IAAI,CAAC,EAAE;gBACX,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,UAAW,EAAE,CAAC;YAEpC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;gBACO,CAAC;YACR,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAI,QAA8B;QACvD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,IAAI,4BAA4B,CAAC,QAAQ,EAAE;YAC1C,OAAO,QAAQ,EAAE,CAAC;QAEnB,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEpE,MAAM,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YACvF,MAAM,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC;QACf,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACd,MAAM,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC;QACb,CAAC;gBACO,CAAC;YACR,IAAI,SAAS,IAAI,qBAAqB;gBACrC,qBAAqB,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACrC,IAAI,0BAA0B,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QAE1B,OAAO,IAAI,CAAC,EAAG,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,EAAoC;QACnE,OAAO,OAAQ,EAA2C,EAAE,OAAO,KAAK,UAAU,CAAC;IACpF,CAAC;CACD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AbstractProjection } from "../AbstractProjection.js";
|
|
2
|
+
import { PostgresqlObjectView } from "./PostgresqlObjectView.js";
|
|
3
|
+
export class AbstractPostgresqlObjectProjection extends AbstractProjection {
|
|
4
|
+
static get tableName() {
|
|
5
|
+
throw new Error('tableName is not defined');
|
|
6
|
+
}
|
|
7
|
+
static get schemaVersion() {
|
|
8
|
+
throw new Error('schemaVersion is not defined');
|
|
9
|
+
}
|
|
10
|
+
constructor({ eventLockTableName, eventLockTtl, logger, postgresqlObjectStorageMaxRetries, viewLockTableName, viewLockTtl, viewModelPostgresqlDb, viewModelPostgresqlDbFactory }) {
|
|
11
|
+
super({ logger });
|
|
12
|
+
this.view = new PostgresqlObjectView({
|
|
13
|
+
schemaVersion: new.target.schemaVersion,
|
|
14
|
+
projectionName: new.target.name,
|
|
15
|
+
viewModelPostgresqlDb,
|
|
16
|
+
viewModelPostgresqlDbFactory,
|
|
17
|
+
tableNamePrefix: new.target.tableName,
|
|
18
|
+
eventLockTableName,
|
|
19
|
+
eventLockTtl,
|
|
20
|
+
postgresqlObjectStorageMaxRetries,
|
|
21
|
+
viewLockTableName,
|
|
22
|
+
viewLockTtl,
|
|
23
|
+
logger
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async project(event, meta) {
|
|
27
|
+
if (this._viewLocker && !this._viewLocker.ready)
|
|
28
|
+
await this._viewLocker.once('ready');
|
|
29
|
+
await this.view.runInTransaction(() => super.project(event, meta));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=AbstractPostgresqlObjectProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractPostgresqlObjectProjection.js","sourceRoot":"","sources":["../../../src/postgresql/AbstractPostgresqlObjectProjection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAkBjE,MAAM,OAAgB,kCAAsC,SAAQ,kBAA2C;IAE9G,MAAM,KAAK,SAAS;QACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,aAAa;QACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,EACX,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACN,iCAAiC,EACjC,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,4BAA4B,EACM;QAClC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAElB,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAoB,CAAC;YACpC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;YACvC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;YAC/B,qBAAqB;YACrB,4BAA4B;YAC5B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;YACrC,kBAAkB;YAClB,YAAY;YACZ,iCAAiC;YACjC,iBAAiB;YACjB,WAAW;YACX,MAAM;SACN,CAAC,CAAC;IACJ,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,IAA0B;QAC/D,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK;YAC9C,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;CACD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { assertString } from "../utils/assert.js";
|
|
2
|
+
import { AbstractPostgresqlAccessor } from "./AbstractPostgresqlAccessor.js";
|
|
3
|
+
import { PostgresqlEventLocker } from "./PostgresqlEventLocker.js";
|
|
4
|
+
import { PostgresqlViewLocker } from "./PostgresqlViewLocker.js";
|
|
5
|
+
/**
|
|
6
|
+
* Base class for PostgreSQL-backed projection views with restore locking and last-processed-event tracking.
|
|
7
|
+
*/
|
|
8
|
+
export class AbstractPostgresqlView extends AbstractPostgresqlAccessor {
|
|
9
|
+
schemaVersion;
|
|
10
|
+
viewLocker;
|
|
11
|
+
eventLocker;
|
|
12
|
+
logger;
|
|
13
|
+
get ready() {
|
|
14
|
+
return this.viewLocker.ready;
|
|
15
|
+
}
|
|
16
|
+
constructor(options) {
|
|
17
|
+
assertString(options.projectionName, 'projectionName');
|
|
18
|
+
assertString(options.schemaVersion, 'schemaVersion');
|
|
19
|
+
super(options);
|
|
20
|
+
this.schemaVersion = options.schemaVersion;
|
|
21
|
+
this.viewLocker = new PostgresqlViewLocker(options);
|
|
22
|
+
this.eventLocker = new PostgresqlEventLocker(options);
|
|
23
|
+
this.logger = options.logger && 'child' in options.logger ?
|
|
24
|
+
options.logger.child({ serviceName: new.target.name }) :
|
|
25
|
+
options.logger;
|
|
26
|
+
}
|
|
27
|
+
async lock() {
|
|
28
|
+
return this.viewLocker.lock();
|
|
29
|
+
}
|
|
30
|
+
async unlock() {
|
|
31
|
+
await this.viewLocker.unlock();
|
|
32
|
+
}
|
|
33
|
+
once(event) {
|
|
34
|
+
return this.viewLocker.once(event);
|
|
35
|
+
}
|
|
36
|
+
getLastEvent() {
|
|
37
|
+
return this.eventLocker.getLastEvent();
|
|
38
|
+
}
|
|
39
|
+
tryMarkAsProjecting(event) {
|
|
40
|
+
return this.eventLocker.tryMarkAsProjecting(event);
|
|
41
|
+
}
|
|
42
|
+
markAsProjected(event) {
|
|
43
|
+
return this.eventLocker.markAsProjected(event);
|
|
44
|
+
}
|
|
45
|
+
markAsLastEvent(event) {
|
|
46
|
+
return this.eventLocker.markAsLastEvent(event);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=AbstractPostgresqlView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractPostgresqlView.js","sourceRoot":"","sources":["../../../src/postgresql/AbstractPostgresqlView.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAoC,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAmC,MAAM,2BAA2B,CAAC;AAElG;;GAEG;AACH,MAAM,OAAgB,sBAAuB,SAAQ,0BAA0B;IAE3D,aAAa,CAAS;IACtB,UAAU,CAAuB;IACjC,WAAW,CAAwB;IAC5C,MAAM,CAAsB;IAEtC,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,YAAY,OAEiB;QAC5B,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACvD,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,KAAc;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAED,mBAAmB,CAAC,KAAa;QAChC,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,eAAe,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,eAAe,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IContainer.js","sourceRoot":"","sources":["../../../src/postgresql/IContainer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresqlConnection.js","sourceRoot":"","sources":["../../../src/postgresql/PostgresqlConnection.ts"],"names":[],"mappings":""}
|