@kronos-ts/postgres 0.3.3 → 0.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/errors.d.ts +3 -3
- package/dist/errors.js +3 -3
- package/dist/postgres-event-scheduler.d.ts.map +1 -1
- package/dist/postgres-event-scheduler.js +1 -0
- package/dist/postgres-event-scheduler.js.map +1 -1
- package/dist/postgres-event-store.d.ts +2 -7
- package/dist/postgres-event-store.d.ts.map +1 -1
- package/dist/postgres-event-store.js +13 -12
- package/dist/postgres-event-store.js.map +1 -1
- package/dist/postgres-transaction-manager.d.ts +20 -1
- package/dist/postgres-transaction-manager.d.ts.map +1 -1
- package/dist/postgres-transaction-manager.js +38 -2
- package/dist/postgres-transaction-manager.js.map +1 -1
- package/dist/postgres.d.ts +8 -0
- package/dist/postgres.d.ts.map +1 -1
- package/dist/postgres.js +1 -1
- package/dist/postgres.js.map +1 -1
- package/dist/schema.d.ts +0 -36
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +13 -78
- package/dist/schema.js.map +1 -1
- package/package.json +4 -4
- package/src/errors.ts +3 -3
- package/src/postgres-event-scheduler.ts +1 -0
- package/src/postgres-event-store.ts +24 -14
- package/src/postgres-transaction-manager.ts +67 -1
- package/src/postgres.ts +9 -1
- package/src/schema.ts +13 -79
package/dist/errors.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQLSTATE
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* SQLSTATE-style code tagged onto the error when a DCB append condition is
|
|
3
|
+
* violated. The conflict check in `checkAndInsert` detects the violation and
|
|
4
|
+
* attaches this code (per D-12.12: a dedicated code, never error-text parsing).
|
|
5
5
|
*
|
|
6
6
|
* `KR001` lives in the Postgres user-defined SQLSTATE range (KX–ZZ).
|
|
7
7
|
* It is intentionally distinct from:
|
package/dist/errors.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQLSTATE
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* SQLSTATE-style code tagged onto the error when a DCB append condition is
|
|
3
|
+
* violated. The conflict check in `checkAndInsert` detects the violation and
|
|
4
|
+
* attaches this code (per D-12.12: a dedicated code, never error-text parsing).
|
|
5
5
|
*
|
|
6
6
|
* `KR001` lives in the Postgres user-defined SQLSTATE range (KX–ZZ).
|
|
7
7
|
* It is intentionally distinct from:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-event-scheduler.d.ts","sourceRoot":"","sources":["../src/postgres-event-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAIH,OAAO,KAAK,EACV,cAAc,EAGd,SAAS,EACV,MAAM,sBAAsB,CAAA;AAM7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,aAAa,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,2EAA2E;IAC3E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAaD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,4BAA4B,GACnC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"postgres-event-scheduler.d.ts","sourceRoot":"","sources":["../src/postgres-event-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAIH,OAAO,KAAK,EACV,cAAc,EAGd,SAAS,EACV,MAAM,sBAAsB,CAAA;AAM7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,cAAc,CAAA;AAE/E,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,aAAa,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,2EAA2E;IAC3E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAaD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,4BAA4B,GACnC,sBAAsB,CAqMxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-event-scheduler.js","sourceRoot":"","sources":["../src/postgres-event-scheduler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-event-scheduler.js","sourceRoot":"","sources":["../src/postgres-event-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,13 +22,8 @@
|
|
|
22
22
|
* - Wake-up via LISTEN/NOTIFY on `kronos_events_${tables.events}` channel
|
|
23
23
|
* - Fallback to 250ms polling if LISTEN is not supported
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* direct parameterised SQL for the conflict check + INSERT rather than
|
|
28
|
-
* calling the SP. The SP's dynamic-SQL approach has complex $N-rebinding
|
|
29
|
-
* requirements (criteria_params JSONB → USING binding) that are cleaner to
|
|
30
|
-
* handle in TypeScript. Plan 06's review may revisit whether the SP
|
|
31
|
-
* provides a meaningful benefit.
|
|
25
|
+
* The conflict check + INSERT run as direct parameterised SQL inside the
|
|
26
|
+
* append transaction (see checkAndInsert), not via a stored procedure.
|
|
32
27
|
*/
|
|
33
28
|
import type { EventStore } from "@kronos-ts/eventsourcing";
|
|
34
29
|
import type { EventMessage } from "@kronos-ts/messaging";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-event-store.d.ts","sourceRoot":"","sources":["../src/postgres-event-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"postgres-event-store.d.ts","sourceRoot":"","sources":["../src/postgres-event-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,0BAA0B,CAAA;AAMjC,OAAO,KAAK,EACV,YAAY,EAMb,MAAM,sBAAsB,CAAA;AAS7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,cAAc,CAAA;AAK/E,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,aAAa,CAAA;AAIlE,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5E;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,UAAU,CAghBZ"}
|
|
@@ -22,13 +22,8 @@
|
|
|
22
22
|
* - Wake-up via LISTEN/NOTIFY on `kronos_events_${tables.events}` channel
|
|
23
23
|
* - Fallback to 250ms polling if LISTEN is not supported
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* direct parameterised SQL for the conflict check + INSERT rather than
|
|
28
|
-
* calling the SP. The SP's dynamic-SQL approach has complex $N-rebinding
|
|
29
|
-
* requirements (criteria_params JSONB → USING binding) that are cleaner to
|
|
30
|
-
* handle in TypeScript. Plan 06's review may revisit whether the SP
|
|
31
|
-
* provides a meaningful benefit.
|
|
25
|
+
* The conflict check + INSERT run as direct parameterised SQL inside the
|
|
26
|
+
* append transaction (see checkAndInsert), not via a stored procedure.
|
|
32
27
|
*/
|
|
33
28
|
import { markerAt } from "@kronos-ts/eventsourcing";
|
|
34
29
|
import { createMessageStream, globalSequenceToken, FIRST_TOKEN, getOrBeginActiveTransaction, onAfterCommit, } from "@kronos-ts/messaging";
|
|
@@ -109,14 +104,16 @@ export function createPostgresEventStore(config) {
|
|
|
109
104
|
const type = eventTypeOf(e);
|
|
110
105
|
const payload = e.payload ?? {};
|
|
111
106
|
const metadata = e.metadata ?? {};
|
|
112
|
-
const rows = await tx.query(`INSERT INTO ${tables.events} (event_id, type, tags, payload, metadata)
|
|
113
|
-
VALUES ($1, $2, $3, $4, $5)
|
|
107
|
+
const rows = await tx.query(`INSERT INTO ${tables.events} (event_id, type, tags, payload, metadata, version, message_timestamp)
|
|
108
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
114
109
|
RETURNING sequence_position, transaction_id`, [
|
|
115
110
|
e.identifier,
|
|
116
111
|
type,
|
|
117
112
|
encodedTags,
|
|
118
113
|
JSON.stringify(payload),
|
|
119
114
|
JSON.stringify(metadata),
|
|
115
|
+
e.version,
|
|
116
|
+
e.timestamp,
|
|
120
117
|
]);
|
|
121
118
|
const row = rows[0];
|
|
122
119
|
if (!row)
|
|
@@ -134,7 +131,7 @@ export function createPostgresEventStore(config) {
|
|
|
134
131
|
const start = condition.start ?? 0n;
|
|
135
132
|
const built = buildCriteriaWhere(condition.criteria, 2); // $1 = start
|
|
136
133
|
const sql = `
|
|
137
|
-
SELECT sequence_position, type, tags, payload, metadata
|
|
134
|
+
SELECT sequence_position, event_id, type, tags, payload, metadata, version, message_timestamp
|
|
138
135
|
FROM ${tables.events}
|
|
139
136
|
WHERE sequence_position >= $1 AND (${built.where})
|
|
140
137
|
ORDER BY sequence_position ASC
|
|
@@ -388,7 +385,7 @@ export function createPostgresEventStore(config) {
|
|
|
388
385
|
sql = `
|
|
389
386
|
SELECT sequence_position::text AS sequence_position,
|
|
390
387
|
transaction_id::text AS transaction_id,
|
|
391
|
-
type, tags, payload, metadata
|
|
388
|
+
event_id, type, tags, payload, metadata, version, message_timestamp
|
|
392
389
|
FROM ${tables.events}
|
|
393
390
|
WHERE sequence_position > $1::bigint
|
|
394
391
|
AND transaction_id < pg_snapshot_xmin(pg_current_snapshot())
|
|
@@ -408,7 +405,7 @@ export function createPostgresEventStore(config) {
|
|
|
408
405
|
sql = `
|
|
409
406
|
SELECT sequence_position::text AS sequence_position,
|
|
410
407
|
transaction_id::text AS transaction_id,
|
|
411
|
-
type, tags, payload, metadata
|
|
408
|
+
event_id, type, tags, payload, metadata, version, message_timestamp
|
|
412
409
|
FROM ${tables.events}
|
|
413
410
|
WHERE (transaction_id, sequence_position) > ($1::xid8, $2::bigint)
|
|
414
411
|
AND transaction_id < pg_snapshot_xmin(pg_current_snapshot())
|
|
@@ -508,10 +505,14 @@ function decodeEvent(row) {
|
|
|
508
505
|
: { key: t, value: "" };
|
|
509
506
|
});
|
|
510
507
|
return {
|
|
508
|
+
kind: "event",
|
|
509
|
+
identifier: row.event_id,
|
|
511
510
|
name: qn,
|
|
511
|
+
version: row.version,
|
|
512
512
|
tags,
|
|
513
513
|
payload: decodeJsonb(row.payload),
|
|
514
514
|
metadata: decodeJsonb(row.metadata),
|
|
515
|
+
timestamp: Number(row.message_timestamp),
|
|
515
516
|
};
|
|
516
517
|
}
|
|
517
518
|
// Adapter-agnostic JSONB decoding: pgAdapter/postgresAdapter return parsed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-event-store.js","sourceRoot":"","sources":["../src/postgres-event-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-event-store.js","sourceRoot":"","sources":["../src/postgres-event-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,26 @@
|
|
|
14
14
|
import { type TransactionManager } from "@kronos-ts/messaging";
|
|
15
15
|
import type { PostgresAdapter, PostgresAdapterTransaction } from "./adapter.js";
|
|
16
16
|
import { IsolationLevel } from "./adapter.js";
|
|
17
|
-
|
|
17
|
+
/** Tuning for the safety timeouts applied to every UoW-scoped transaction. */
|
|
18
|
+
export interface PostgresTransactionManagerOptions {
|
|
19
|
+
/**
|
|
20
|
+
* `idle_in_transaction_session_timeout` (ms) applied via `SET LOCAL` on every
|
|
21
|
+
* transaction. A UoW that begins a tx but stalls before commit/rollback would
|
|
22
|
+
* otherwise hold its connection — and pin `pg_snapshot_xmin`, which gates the
|
|
23
|
+
* gap-free tailing query in the event store — open indefinitely, stalling all
|
|
24
|
+
* streaming processors until the process restarts. This bounds that window:
|
|
25
|
+
* postgres aborts the idle transaction and the connection (and xmin) is freed.
|
|
26
|
+
* Default 30000 (30s). Set 0 to disable (postgres default — no timeout).
|
|
27
|
+
*/
|
|
28
|
+
readonly idleInTransactionTimeoutMs?: number;
|
|
29
|
+
/**
|
|
30
|
+
* `statement_timeout` (ms) applied via `SET LOCAL` on every transaction.
|
|
31
|
+
* Bounds a single hung statement inside the tx. Default 0 (disabled) — large
|
|
32
|
+
* appends / replays can legitimately run long, so opt in per deployment.
|
|
33
|
+
*/
|
|
34
|
+
readonly statementTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function postgresTransactionManager(adapter: PostgresAdapter, isolationLevel?: IsolationLevel, options?: PostgresTransactionManagerOptions): TransactionManager<PostgresAdapterTransaction>;
|
|
18
37
|
/**
|
|
19
38
|
* Run `fn` inside a postgres tx, joining a UoW-scoped tx if one is active
|
|
20
39
|
* (or installed lazily), otherwise opening an ad-hoc tx via `adapter.transaction`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-transaction-manager.d.ts","sourceRoot":"","sources":["../src/postgres-transaction-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAsB7C,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,eAAe,EACxB,cAAc,GAAE,cAA8C,
|
|
1
|
+
{"version":3,"file":"postgres-transaction-manager.d.ts","sourceRoot":"","sources":["../src/postgres-transaction-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA+B,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAsB7C,8EAA8E;AAC9E,MAAM,WAAW,iCAAiC;IAChD;;;;;;;;OAQG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CACrC;AAID,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,eAAe,EACxB,cAAc,GAAE,cAA8C,EAC9D,OAAO,GAAE,iCAAsC,GAC9C,kBAAkB,CAAC,0BAA0B,CAAC,CAyFhD;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,CAAC,EAAE,EAAE,0BAA0B,KAAK,OAAO,CAAC,CAAC,CAAC,EAClD,cAAc,GAAE,cAA8C,GAC7D,OAAO,CAAC,CAAC,CAAC,CAIZ"}
|
|
@@ -21,7 +21,22 @@ import { IsolationLevel } from "./adapter.js";
|
|
|
21
21
|
const TX_CONTROL = Symbol("kronos.postgresTxControl");
|
|
22
22
|
/** Marker error: signals an intentional rollback so the .catch can suppress it. */
|
|
23
23
|
const ROLLBACK_MARKER = "__kronos_postgres_tx_rollback__";
|
|
24
|
-
|
|
24
|
+
const DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS = 30_000;
|
|
25
|
+
export function postgresTransactionManager(adapter, isolationLevel = IsolationLevel.READ_COMMITTED, options = {}) {
|
|
26
|
+
const idleTimeoutMs = normalizeTimeoutMs(options.idleInTransactionTimeoutMs ?? DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS);
|
|
27
|
+
const statementTimeoutMs = normalizeTimeoutMs(options.statementTimeoutMs ?? 0);
|
|
28
|
+
// GUCs cannot be parameterized ($1) — the value is a config-supplied integer,
|
|
29
|
+
// normalized to a non-negative whole number, so inlining is injection-safe.
|
|
30
|
+
// SET LOCAL auto-resets at COMMIT/ROLLBACK, so it never leaks onto pooled
|
|
31
|
+
// connections.
|
|
32
|
+
async function applyTimeouts(tx) {
|
|
33
|
+
if (idleTimeoutMs > 0) {
|
|
34
|
+
await tx.query(`SET LOCAL idle_in_transaction_session_timeout = ${idleTimeoutMs}`);
|
|
35
|
+
}
|
|
36
|
+
if (statementTimeoutMs > 0) {
|
|
37
|
+
await tx.query(`SET LOCAL statement_timeout = ${statementTimeoutMs}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
25
40
|
return {
|
|
26
41
|
async begin() {
|
|
27
42
|
let captureTx;
|
|
@@ -36,6 +51,9 @@ export function postgresTransactionManager(adapter, isolationLevel = IsolationLe
|
|
|
36
51
|
});
|
|
37
52
|
const txPromise = adapter
|
|
38
53
|
.transaction(isolationLevel, async (tx) => {
|
|
54
|
+
// Arm the per-transaction safety timeouts before handing the tx to
|
|
55
|
+
// the UoW, so even the very first awaited statement is bounded.
|
|
56
|
+
await applyTimeouts(tx);
|
|
39
57
|
captureTx(tx);
|
|
40
58
|
await completion;
|
|
41
59
|
})
|
|
@@ -45,7 +63,18 @@ export function postgresTransactionManager(adapter, isolationLevel = IsolationLe
|
|
|
45
63
|
return;
|
|
46
64
|
throw err;
|
|
47
65
|
});
|
|
48
|
-
|
|
66
|
+
// If the transaction callback fails before it hands back the tx — BEGIN
|
|
67
|
+
// itself failing, or arming the safety timeouts throwing — `captureTx`
|
|
68
|
+
// never runs and `txReady` would never resolve. Race it against
|
|
69
|
+
// `txPromise` so an early failure rejects begin() instead of hanging it
|
|
70
|
+
// forever. In the happy path `txPromise` stays pending (parked on
|
|
71
|
+
// `completion` until commit/rollback), so `txReady` always wins.
|
|
72
|
+
const tx = (await Promise.race([txReady, txPromise]));
|
|
73
|
+
if (tx === undefined) {
|
|
74
|
+
// txPromise settled first by resolving — the tx ended before begin()
|
|
75
|
+
// returned, so the handle is unusable. Surface rather than return it.
|
|
76
|
+
throw new Error("postgresTransactionManager: transaction ended before begin() completed");
|
|
77
|
+
}
|
|
49
78
|
tx[TX_CONTROL] = { resolveCommit, rejectRollback, txPromise };
|
|
50
79
|
return tx;
|
|
51
80
|
},
|
|
@@ -69,6 +98,13 @@ export function postgresTransactionManager(adapter, isolationLevel = IsolationLe
|
|
|
69
98
|
},
|
|
70
99
|
};
|
|
71
100
|
}
|
|
101
|
+
/** Coerce a config timeout to a non-negative whole number of milliseconds.
|
|
102
|
+
* Non-finite or negative values disable the timeout (treated as 0). */
|
|
103
|
+
function normalizeTimeoutMs(value) {
|
|
104
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
105
|
+
return 0;
|
|
106
|
+
return Math.floor(value);
|
|
107
|
+
}
|
|
72
108
|
/**
|
|
73
109
|
* Run `fn` inside a postgres tx, joining a UoW-scoped tx if one is active
|
|
74
110
|
* (or installed lazily), otherwise opening an ad-hoc tx via `adapter.transaction`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-transaction-manager.js","sourceRoot":"","sources":["../src/postgres-transaction-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,2BAA2B,EAA2B,MAAM,sBAAsB,CAAA;AAE3F,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C;;;;GAIG;AACH,MAAM,UAAU,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAA;AAYrD,mFAAmF;AACnF,MAAM,eAAe,GAAG,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"postgres-transaction-manager.js","sourceRoot":"","sources":["../src/postgres-transaction-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/postgres.d.ts
CHANGED
|
@@ -46,6 +46,14 @@ export interface PostgresConfig {
|
|
|
46
46
|
readonly pollIntervalMs?: number;
|
|
47
47
|
readonly batchSize?: number;
|
|
48
48
|
};
|
|
49
|
+
/** Safety timeouts applied via `SET LOCAL` to every UoW-scoped transaction.
|
|
50
|
+
* Guards against a stalled UoW holding a connection — and pinning
|
|
51
|
+
* `pg_snapshot_xmin`, which would stall all streaming tailing — open until
|
|
52
|
+
* restart. Defaults: 30s idle-in-transaction, statement timeout disabled. */
|
|
53
|
+
readonly transaction?: {
|
|
54
|
+
readonly idleInTransactionTimeoutMs?: number;
|
|
55
|
+
readonly statementTimeoutMs?: number;
|
|
56
|
+
};
|
|
49
57
|
}
|
|
50
58
|
export declare function postgres(config: PostgresConfig): (app: App) => void;
|
|
51
59
|
//# sourceMappingURL=postgres.d.ts.map
|
package/dist/postgres.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAMzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAQnD,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnF,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC;uCACmC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC;4CACwC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC/C,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;QAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAC5B,CAAA;CACF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAgEnE"}
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAMzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAQnD,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnF,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC;uCACmC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC;4CACwC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC/C,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;QAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAC5B,CAAA;IACD;;;kFAG8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;QAC5C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KACrC,CAAA;CACF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAgEnE"}
|
package/dist/postgres.js
CHANGED
|
@@ -37,7 +37,7 @@ export function postgres(config) {
|
|
|
37
37
|
const { adapter, resilience } = config;
|
|
38
38
|
const bootstrap = config.bootstrap ?? true;
|
|
39
39
|
const tables = config.tableNames ?? DEFAULT_TABLE_NAMES;
|
|
40
|
-
const txManager = postgresTransactionManager(adapter);
|
|
40
|
+
const txManager = postgresTransactionManager(adapter, undefined, config.transaction);
|
|
41
41
|
return (app) => {
|
|
42
42
|
app.set("eventStore", ({ serializer, tagResolver }) => createPostgresEventStore({ adapter, serializer, tagResolver, tableNames: tables }));
|
|
43
43
|
app.set("snapshotStore", ({ serializer }) => createPostgresSnapshotStore({ adapter, serializer, tableNames: tables }));
|
package/dist/postgres.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EACL,kCAAkC,EAClC,WAAW,GACZ,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAA;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,EACL,4BAA4B,GAE7B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAmB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -92,39 +92,6 @@ export interface BootstrapSchemaOptions {
|
|
|
92
92
|
/** Override `kronos_events` / `kronos_snapshots`. */
|
|
93
93
|
readonly tableNames?: TableNames;
|
|
94
94
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Append-with-DCB-check stored procedure.
|
|
97
|
-
*
|
|
98
|
-
* Called from `createPostgresEventStore.appendEvents` (Plan 04 Task 3)
|
|
99
|
-
* after advisory-lock acquisition. The SP is the single SQL statement
|
|
100
|
-
* that BOTH performs the conflict check AND inserts the new events —
|
|
101
|
-
* keeping them atomic without round-tripping a separate SELECT.
|
|
102
|
-
*
|
|
103
|
-
* Inputs (positional):
|
|
104
|
-
* $1 marker_position bigint — the AppendCondition.marker.position
|
|
105
|
-
* $2 has_condition boolean — false ⇒ skip the conflict check
|
|
106
|
-
* $3 criteria_where_sql text — Plan 04's criteria-sql builder output
|
|
107
|
-
* $4 criteria_params jsonb — parameter array for criteria_where_sql
|
|
108
|
-
* $5 event_ids uuid[] — N event identifiers (EventMessage.identifier, UUID v7)
|
|
109
|
-
* $6 event_types text[] — N event types (one per event)
|
|
110
|
-
* $7 event_tags text[][] — N tag arrays
|
|
111
|
-
* $8 event_payloads jsonb[] — N JSONB payloads
|
|
112
|
-
* $9 event_metadata jsonb[] — N metadata maps
|
|
113
|
-
*
|
|
114
|
-
* Returns: TABLE(out_position bigint, out_xid xid8) — one row per inserted event.
|
|
115
|
-
* The last row carries the consistency marker.
|
|
116
|
-
*
|
|
117
|
-
* On conflict: RAISE EXCEPTION USING ERRCODE = 'KR001' (D-12.12).
|
|
118
|
-
* On duplicate event_id (UNIQUE violation): Postgres raises SQLSTATE 23505;
|
|
119
|
-
* caller treats as idempotent no-op or surfaces per consumer policy.
|
|
120
|
-
*
|
|
121
|
-
* NOTE: dynamic-SQL is used (EXECUTE) because the criteria WHERE clause is
|
|
122
|
-
* parameter-shaped and varies per call. SQL injection is mitigated by the
|
|
123
|
-
* fact that criteria_where_sql is produced by buildCriteriaWhere — a typed
|
|
124
|
-
* builder that NEVER concatenates user data into the WHERE string (all user
|
|
125
|
-
* data flows through criteria_params as JSONB).
|
|
126
|
-
*/
|
|
127
|
-
export declare function buildAppendStoredProcedureDDL(tables: TableNames): string;
|
|
128
95
|
/**
|
|
129
96
|
* Idempotently create the event-store schema.
|
|
130
97
|
*
|
|
@@ -135,9 +102,6 @@ export declare function buildAppendStoredProcedureDDL(tables: TableNames): strin
|
|
|
135
102
|
* The lock is RELEASED in a finally block — partial-DDL-then-throw must
|
|
136
103
|
* NEVER leak a session lock that would block all subsequent bootstraps
|
|
137
104
|
* on the same connection.
|
|
138
|
-
*
|
|
139
|
-
* The append stored procedure is applied as part of bootstrap so that
|
|
140
|
-
* the SP is always up-to-date with the schema version.
|
|
141
105
|
*/
|
|
142
106
|
export declare function bootstrapSchema(adapter: SchemaBootstrapAdapter, options?: BootstrapSchemaOptions): Promise<void>;
|
|
143
107
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAgB,CAAA;AAErD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAgB,CAAA;AAErD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA+B9D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAMhE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAUjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAcvE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAIzE;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzD;AAED,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
package/dist/schema.js
CHANGED
|
@@ -33,6 +33,17 @@ export function buildEventsTableDDL(tables) {
|
|
|
33
33
|
// event_id is sourced from EventMessage.identifier (UUID v7 per quick 260511-mks).
|
|
34
34
|
// UNIQUE auto-creates a btree; v7's time-ordered prefix keeps it compact under
|
|
35
35
|
// append load (a v4 random UUID would fragment the leaf pages over time).
|
|
36
|
+
//
|
|
37
|
+
// version + message_timestamp persist the EventMessage's own `version` and authored
|
|
38
|
+
// `timestamp` (epoch ms) so source()/open() reconstruct the full EventMessage contract,
|
|
39
|
+
// matching the in-memory, axon-server, and kronosdb engines. message_timestamp is the
|
|
40
|
+
// authored time — distinct from recorded_at (DB insert time). This mirrors the
|
|
41
|
+
// scheduled-events table, which already carries both columns.
|
|
42
|
+
//
|
|
43
|
+
// MIGRATION: this is CREATE-only. `CREATE TABLE IF NOT EXISTS` does NOT add columns to a
|
|
44
|
+
// pre-existing table, and the columns are NOT NULL, so an events table created before
|
|
45
|
+
// these columns existed must be hand-migrated (ALTER TABLE ... ADD COLUMN) or reset
|
|
46
|
+
// before upgrading — there is no automatic in-place migration.
|
|
36
47
|
return `CREATE TABLE IF NOT EXISTS ${tables.events} (
|
|
37
48
|
sequence_position BIGSERIAL PRIMARY KEY,
|
|
38
49
|
event_id UUID NOT NULL UNIQUE,
|
|
@@ -41,6 +52,8 @@ export function buildEventsTableDDL(tables) {
|
|
|
41
52
|
tags TEXT[] NOT NULL DEFAULT '{}',
|
|
42
53
|
payload JSONB NOT NULL,
|
|
43
54
|
metadata JSONB NOT NULL DEFAULT '{}',
|
|
55
|
+
version TEXT NOT NULL,
|
|
56
|
+
message_timestamp BIGINT NOT NULL,
|
|
44
57
|
recorded_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
45
58
|
) WITH (
|
|
46
59
|
autovacuum_freeze_min_age = 10000000,
|
|
@@ -130,80 +143,6 @@ export function buildScheduledEventsIndexesDDL(tables) {
|
|
|
130
143
|
ON ${tables.scheduled} (fire_at)
|
|
131
144
|
WHERE status = 'pending';`;
|
|
132
145
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Append-with-DCB-check stored procedure.
|
|
135
|
-
*
|
|
136
|
-
* Called from `createPostgresEventStore.appendEvents` (Plan 04 Task 3)
|
|
137
|
-
* after advisory-lock acquisition. The SP is the single SQL statement
|
|
138
|
-
* that BOTH performs the conflict check AND inserts the new events —
|
|
139
|
-
* keeping them atomic without round-tripping a separate SELECT.
|
|
140
|
-
*
|
|
141
|
-
* Inputs (positional):
|
|
142
|
-
* $1 marker_position bigint — the AppendCondition.marker.position
|
|
143
|
-
* $2 has_condition boolean — false ⇒ skip the conflict check
|
|
144
|
-
* $3 criteria_where_sql text — Plan 04's criteria-sql builder output
|
|
145
|
-
* $4 criteria_params jsonb — parameter array for criteria_where_sql
|
|
146
|
-
* $5 event_ids uuid[] — N event identifiers (EventMessage.identifier, UUID v7)
|
|
147
|
-
* $6 event_types text[] — N event types (one per event)
|
|
148
|
-
* $7 event_tags text[][] — N tag arrays
|
|
149
|
-
* $8 event_payloads jsonb[] — N JSONB payloads
|
|
150
|
-
* $9 event_metadata jsonb[] — N metadata maps
|
|
151
|
-
*
|
|
152
|
-
* Returns: TABLE(out_position bigint, out_xid xid8) — one row per inserted event.
|
|
153
|
-
* The last row carries the consistency marker.
|
|
154
|
-
*
|
|
155
|
-
* On conflict: RAISE EXCEPTION USING ERRCODE = 'KR001' (D-12.12).
|
|
156
|
-
* On duplicate event_id (UNIQUE violation): Postgres raises SQLSTATE 23505;
|
|
157
|
-
* caller treats as idempotent no-op or surfaces per consumer policy.
|
|
158
|
-
*
|
|
159
|
-
* NOTE: dynamic-SQL is used (EXECUTE) because the criteria WHERE clause is
|
|
160
|
-
* parameter-shaped and varies per call. SQL injection is mitigated by the
|
|
161
|
-
* fact that criteria_where_sql is produced by buildCriteriaWhere — a typed
|
|
162
|
-
* builder that NEVER concatenates user data into the WHERE string (all user
|
|
163
|
-
* data flows through criteria_params as JSONB).
|
|
164
|
-
*/
|
|
165
|
-
export function buildAppendStoredProcedureDDL(tables) {
|
|
166
|
-
return `CREATE OR REPLACE FUNCTION kronos_append_with_check(
|
|
167
|
-
marker_position bigint,
|
|
168
|
-
has_condition boolean,
|
|
169
|
-
criteria_where_sql text,
|
|
170
|
-
criteria_params jsonb,
|
|
171
|
-
event_ids uuid[],
|
|
172
|
-
event_types text[],
|
|
173
|
-
event_tags text[][],
|
|
174
|
-
event_payloads jsonb[],
|
|
175
|
-
event_metadata jsonb[]
|
|
176
|
-
) RETURNS TABLE(out_position bigint, out_xid xid8) AS $$
|
|
177
|
-
DECLARE
|
|
178
|
-
conflict_count bigint;
|
|
179
|
-
i integer;
|
|
180
|
-
BEGIN
|
|
181
|
-
IF has_condition THEN
|
|
182
|
-
EXECUTE format(
|
|
183
|
-
'SELECT count(*) FROM ${tables.events} WHERE sequence_position > $1 AND (%s)',
|
|
184
|
-
criteria_where_sql
|
|
185
|
-
)
|
|
186
|
-
USING marker_position, criteria_params
|
|
187
|
-
INTO conflict_count;
|
|
188
|
-
|
|
189
|
-
IF conflict_count > 0 THEN
|
|
190
|
-
RAISE EXCEPTION 'Append condition violated: % conflicting event(s) after position %',
|
|
191
|
-
conflict_count, marker_position
|
|
192
|
-
USING ERRCODE = 'KR001';
|
|
193
|
-
END IF;
|
|
194
|
-
END IF;
|
|
195
|
-
|
|
196
|
-
FOR i IN 1 .. array_length(event_types, 1) LOOP
|
|
197
|
-
-- event_id UNIQUE constraint surfaces duplicates as SQLSTATE 23505 (D-12.12);
|
|
198
|
-
-- caller (Plan 04 Task 3) maps that to AppendConditionError or idempotent skip.
|
|
199
|
-
INSERT INTO ${tables.events} (event_id, type, tags, payload, metadata)
|
|
200
|
-
VALUES (event_ids[i], event_types[i], event_tags[i:i][1], event_payloads[i], event_metadata[i])
|
|
201
|
-
RETURNING sequence_position, transaction_id INTO out_position, out_xid;
|
|
202
|
-
RETURN NEXT;
|
|
203
|
-
END LOOP;
|
|
204
|
-
END;
|
|
205
|
-
$$ LANGUAGE plpgsql;`;
|
|
206
|
-
}
|
|
207
146
|
/**
|
|
208
147
|
* Idempotently create the event-store schema.
|
|
209
148
|
*
|
|
@@ -214,9 +153,6 @@ $$ LANGUAGE plpgsql;`;
|
|
|
214
153
|
* The lock is RELEASED in a finally block — partial-DDL-then-throw must
|
|
215
154
|
* NEVER leak a session lock that would block all subsequent bootstraps
|
|
216
155
|
* on the same connection.
|
|
217
|
-
*
|
|
218
|
-
* The append stored procedure is applied as part of bootstrap so that
|
|
219
|
-
* the SP is always up-to-date with the schema version.
|
|
220
156
|
*/
|
|
221
157
|
export async function bootstrapSchema(adapter, options = {}) {
|
|
222
158
|
const tables = options.tableNames ?? DEFAULT_TABLE_NAMES;
|
|
@@ -230,7 +166,6 @@ export async function bootstrapSchema(adapter, options = {}) {
|
|
|
230
166
|
await adapter.query(buildSnapshotsTableDDL(tables));
|
|
231
167
|
await adapter.query(buildScheduledEventsTableDDL(tables));
|
|
232
168
|
await adapter.query(buildScheduledEventsIndexesDDL(tables));
|
|
233
|
-
await adapter.query(buildAppendStoredProcedureDDL(tables));
|
|
234
169
|
}
|
|
235
170
|
finally {
|
|
236
171
|
// Release even on partial-DDL failure. The error (if any) propagates
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,eAAe;IACvB,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,yBAAyB;CACrC,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAW,CAAC,MAAM,CAAA;AAErD,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,mFAAmF;IACnF,+EAA+E;IAC/E,0EAA0E;IAC1E,OAAO,8BAA8B,MAAM,CAAC,MAAM
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,eAAe;IACvB,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,yBAAyB;CACrC,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAW,CAAC,MAAM,CAAA;AAErD,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,mFAAmF;IACnF,+EAA+E;IAC/E,0EAA0E;IAC1E,EAAE;IACF,oFAAoF;IACpF,wFAAwF;IACxF,sFAAsF;IACtF,+EAA+E;IAC/E,8DAA8D;IAC9D,EAAE;IACF,yFAAyF;IACzF,sFAAsF;IACtF,oFAAoF;IACpF,+DAA+D;IAC/D,OAAO,8BAA8B,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;GAejD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAkB;IACtD,OAAO,qCAAqC,MAAM,CAAC,MAAM;OACpD,MAAM,CAAC,MAAM;;6BAES,MAAM,CAAC,MAAM;OACnC,MAAM,CAAC,MAAM,2CAA2C,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAkB;IACvD,OAAO,8BAA8B,MAAM,CAAC,SAAS;;;;;;;;GAQpD,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAkB;IAC7D,OAAO,8BAA8B,MAAM,CAAC,SAAS;;;;;;;;;;;;GAYpD,CAAA;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAkB;IAC/D,OAAO,8BAA8B,MAAM,CAAC,SAAS;OAChD,MAAM,CAAC,SAAS;4BACK,CAAA;AAC5B,CAAC;AAiBD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA+B,EAC/B,UAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAA;IAExD,uEAAuE;IACvE,qEAAqE;IACrE,sBAAsB;IACtB,MAAM,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAE5E,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAA;QAChD,MAAM,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAA;QAClD,MAAM,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;QACnD,MAAM,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAA;QACzD,MAAM,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7D,CAAC;YAAS,CAAC;QACT,qEAAqE;QACrE,+CAA+C;QAC/C,MAAM,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAChF,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kronos-ts/postgres",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "PostgreSQL extension for Kronos — event store and snapshot store adapters.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -68,9 +68,9 @@
|
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"@kronos-ts/common": "0.1.1",
|
|
71
|
-
"@kronos-ts/app": "0.
|
|
72
|
-
"@kronos-ts/eventsourcing": "0.2.
|
|
73
|
-
"@kronos-ts/messaging": "0.
|
|
71
|
+
"@kronos-ts/app": "0.4.0",
|
|
72
|
+
"@kronos-ts/eventsourcing": "0.2.2",
|
|
73
|
+
"@kronos-ts/messaging": "0.6.0"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"pg": ">=8.0.0",
|
package/src/errors.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQLSTATE
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* SQLSTATE-style code tagged onto the error when a DCB append condition is
|
|
3
|
+
* violated. The conflict check in `checkAndInsert` detects the violation and
|
|
4
|
+
* attaches this code (per D-12.12: a dedicated code, never error-text parsing).
|
|
5
5
|
*
|
|
6
6
|
* `KR001` lives in the Postgres user-defined SQLSTATE range (KX–ZZ).
|
|
7
7
|
* It is intentionally distinct from:
|
|
@@ -191,6 +191,7 @@ export function createPostgresEventScheduler(
|
|
|
191
191
|
|
|
192
192
|
function reconstructEvent(row: ScheduleRow): EventMessage {
|
|
193
193
|
return {
|
|
194
|
+
kind: "event",
|
|
194
195
|
identifier: row.schedule_id,
|
|
195
196
|
name: qualifiedNameFromString(row.type),
|
|
196
197
|
payload: decodeJsonbValue(row.payload),
|
|
@@ -22,13 +22,8 @@
|
|
|
22
22
|
* - Wake-up via LISTEN/NOTIFY on `kronos_events_${tables.events}` channel
|
|
23
23
|
* - Fallback to 250ms polling if LISTEN is not supported
|
|
24
24
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* direct parameterised SQL for the conflict check + INSERT rather than
|
|
28
|
-
* calling the SP. The SP's dynamic-SQL approach has complex $N-rebinding
|
|
29
|
-
* requirements (criteria_params JSONB → USING binding) that are cleaner to
|
|
30
|
-
* handle in TypeScript. Plan 06's review may revisit whether the SP
|
|
31
|
-
* provides a meaningful benefit.
|
|
25
|
+
* The conflict check + INSERT run as direct parameterised SQL inside the
|
|
26
|
+
* append transaction (see checkAndInsert), not via a stored procedure.
|
|
32
27
|
*/
|
|
33
28
|
|
|
34
29
|
import type {
|
|
@@ -168,8 +163,8 @@ export function createPostgresEventStore(
|
|
|
168
163
|
const metadata = e.metadata ?? {}
|
|
169
164
|
|
|
170
165
|
const rows = await tx.query<{ sequence_position: string; transaction_id: string }>(
|
|
171
|
-
`INSERT INTO ${tables.events} (event_id, type, tags, payload, metadata)
|
|
172
|
-
VALUES ($1, $2, $3, $4, $5)
|
|
166
|
+
`INSERT INTO ${tables.events} (event_id, type, tags, payload, metadata, version, message_timestamp)
|
|
167
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
173
168
|
RETURNING sequence_position, transaction_id`,
|
|
174
169
|
[
|
|
175
170
|
e.identifier,
|
|
@@ -177,6 +172,8 @@ export function createPostgresEventStore(
|
|
|
177
172
|
encodedTags,
|
|
178
173
|
JSON.stringify(payload),
|
|
179
174
|
JSON.stringify(metadata),
|
|
175
|
+
e.version,
|
|
176
|
+
e.timestamp,
|
|
180
177
|
],
|
|
181
178
|
)
|
|
182
179
|
const row = rows[0]
|
|
@@ -196,17 +193,20 @@ export function createPostgresEventStore(
|
|
|
196
193
|
const start = condition.start ?? 0n
|
|
197
194
|
const built = buildCriteriaWhere(condition.criteria, 2) // $1 = start
|
|
198
195
|
const sql = `
|
|
199
|
-
SELECT sequence_position, type, tags, payload, metadata
|
|
196
|
+
SELECT sequence_position, event_id, type, tags, payload, metadata, version, message_timestamp
|
|
200
197
|
FROM ${tables.events}
|
|
201
198
|
WHERE sequence_position >= $1 AND (${built.where})
|
|
202
199
|
ORDER BY sequence_position ASC
|
|
203
200
|
`
|
|
204
201
|
const rows = await adapter.query<{
|
|
205
202
|
sequence_position: string
|
|
203
|
+
event_id: string
|
|
206
204
|
type: string
|
|
207
205
|
tags: string[]
|
|
208
206
|
payload: unknown
|
|
209
207
|
metadata: unknown
|
|
208
|
+
version: string
|
|
209
|
+
message_timestamp: string | number
|
|
210
210
|
}>(sql, [start, ...built.params])
|
|
211
211
|
|
|
212
212
|
const events: EventMessage[] = rows.map((r) => decodeEvent(r))
|
|
@@ -482,7 +482,7 @@ export function createPostgresEventStore(
|
|
|
482
482
|
sql = `
|
|
483
483
|
SELECT sequence_position::text AS sequence_position,
|
|
484
484
|
transaction_id::text AS transaction_id,
|
|
485
|
-
type, tags, payload, metadata
|
|
485
|
+
event_id, type, tags, payload, metadata, version, message_timestamp
|
|
486
486
|
FROM ${tables.events}
|
|
487
487
|
WHERE sequence_position > $1::bigint
|
|
488
488
|
AND transaction_id < pg_snapshot_xmin(pg_current_snapshot())
|
|
@@ -501,7 +501,7 @@ export function createPostgresEventStore(
|
|
|
501
501
|
sql = `
|
|
502
502
|
SELECT sequence_position::text AS sequence_position,
|
|
503
503
|
transaction_id::text AS transaction_id,
|
|
504
|
-
type, tags, payload, metadata
|
|
504
|
+
event_id, type, tags, payload, metadata, version, message_timestamp
|
|
505
505
|
FROM ${tables.events}
|
|
506
506
|
WHERE (transaction_id, sequence_position) > ($1::xid8, $2::bigint)
|
|
507
507
|
AND transaction_id < pg_snapshot_xmin(pg_current_snapshot())
|
|
@@ -515,10 +515,13 @@ export function createPostgresEventStore(
|
|
|
515
515
|
const rows = await adapter.query<{
|
|
516
516
|
sequence_position: string
|
|
517
517
|
transaction_id: string
|
|
518
|
+
event_id: string
|
|
518
519
|
type: string
|
|
519
520
|
tags: string[]
|
|
520
521
|
payload: unknown
|
|
521
522
|
metadata: unknown
|
|
523
|
+
version: string
|
|
524
|
+
message_timestamp: string | number
|
|
522
525
|
}>(sql, queryParams)
|
|
523
526
|
|
|
524
527
|
for (const r of rows) {
|
|
@@ -609,6 +612,9 @@ function decodeEvent(row: {
|
|
|
609
612
|
payload: unknown
|
|
610
613
|
metadata: unknown
|
|
611
614
|
sequence_position: string
|
|
615
|
+
event_id: string
|
|
616
|
+
version: string
|
|
617
|
+
message_timestamp: string | number
|
|
612
618
|
}): EventMessage {
|
|
613
619
|
const qn = qualifiedNameFromString(row.type)
|
|
614
620
|
const tags = row.tags.map((t) => {
|
|
@@ -618,11 +624,15 @@ function decodeEvent(row: {
|
|
|
618
624
|
: { key: t, value: "" }
|
|
619
625
|
})
|
|
620
626
|
return {
|
|
627
|
+
kind: "event",
|
|
628
|
+
identifier: row.event_id,
|
|
621
629
|
name: qn,
|
|
630
|
+
version: row.version,
|
|
622
631
|
tags,
|
|
623
632
|
payload: decodeJsonb(row.payload),
|
|
624
|
-
metadata: decodeJsonb(row.metadata),
|
|
625
|
-
|
|
633
|
+
metadata: decodeJsonb(row.metadata) as EventMessage["metadata"],
|
|
634
|
+
timestamp: Number(row.message_timestamp),
|
|
635
|
+
}
|
|
626
636
|
}
|
|
627
637
|
|
|
628
638
|
// Adapter-agnostic JSONB decoding: pgAdapter/postgresAdapter return parsed
|
|
@@ -36,10 +36,51 @@ interface ManagedPostgresTransaction extends PostgresAdapterTransaction {
|
|
|
36
36
|
/** Marker error: signals an intentional rollback so the .catch can suppress it. */
|
|
37
37
|
const ROLLBACK_MARKER = "__kronos_postgres_tx_rollback__"
|
|
38
38
|
|
|
39
|
+
/** Tuning for the safety timeouts applied to every UoW-scoped transaction. */
|
|
40
|
+
export interface PostgresTransactionManagerOptions {
|
|
41
|
+
/**
|
|
42
|
+
* `idle_in_transaction_session_timeout` (ms) applied via `SET LOCAL` on every
|
|
43
|
+
* transaction. A UoW that begins a tx but stalls before commit/rollback would
|
|
44
|
+
* otherwise hold its connection — and pin `pg_snapshot_xmin`, which gates the
|
|
45
|
+
* gap-free tailing query in the event store — open indefinitely, stalling all
|
|
46
|
+
* streaming processors until the process restarts. This bounds that window:
|
|
47
|
+
* postgres aborts the idle transaction and the connection (and xmin) is freed.
|
|
48
|
+
* Default 30000 (30s). Set 0 to disable (postgres default — no timeout).
|
|
49
|
+
*/
|
|
50
|
+
readonly idleInTransactionTimeoutMs?: number
|
|
51
|
+
/**
|
|
52
|
+
* `statement_timeout` (ms) applied via `SET LOCAL` on every transaction.
|
|
53
|
+
* Bounds a single hung statement inside the tx. Default 0 (disabled) — large
|
|
54
|
+
* appends / replays can legitimately run long, so opt in per deployment.
|
|
55
|
+
*/
|
|
56
|
+
readonly statementTimeoutMs?: number
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS = 30_000
|
|
60
|
+
|
|
39
61
|
export function postgresTransactionManager(
|
|
40
62
|
adapter: PostgresAdapter,
|
|
41
63
|
isolationLevel: IsolationLevel = IsolationLevel.READ_COMMITTED,
|
|
64
|
+
options: PostgresTransactionManagerOptions = {},
|
|
42
65
|
): TransactionManager<PostgresAdapterTransaction> {
|
|
66
|
+
const idleTimeoutMs = normalizeTimeoutMs(
|
|
67
|
+
options.idleInTransactionTimeoutMs ?? DEFAULT_IDLE_IN_TRANSACTION_TIMEOUT_MS,
|
|
68
|
+
)
|
|
69
|
+
const statementTimeoutMs = normalizeTimeoutMs(options.statementTimeoutMs ?? 0)
|
|
70
|
+
|
|
71
|
+
// GUCs cannot be parameterized ($1) — the value is a config-supplied integer,
|
|
72
|
+
// normalized to a non-negative whole number, so inlining is injection-safe.
|
|
73
|
+
// SET LOCAL auto-resets at COMMIT/ROLLBACK, so it never leaks onto pooled
|
|
74
|
+
// connections.
|
|
75
|
+
async function applyTimeouts(tx: PostgresAdapterTransaction): Promise<void> {
|
|
76
|
+
if (idleTimeoutMs > 0) {
|
|
77
|
+
await tx.query(`SET LOCAL idle_in_transaction_session_timeout = ${idleTimeoutMs}`)
|
|
78
|
+
}
|
|
79
|
+
if (statementTimeoutMs > 0) {
|
|
80
|
+
await tx.query(`SET LOCAL statement_timeout = ${statementTimeoutMs}`)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
43
84
|
return {
|
|
44
85
|
async begin(): Promise<PostgresAdapterTransaction> {
|
|
45
86
|
let captureTx!: (tx: PostgresAdapterTransaction) => void
|
|
@@ -56,6 +97,9 @@ export function postgresTransactionManager(
|
|
|
56
97
|
|
|
57
98
|
const txPromise = adapter
|
|
58
99
|
.transaction(isolationLevel, async (tx) => {
|
|
100
|
+
// Arm the per-transaction safety timeouts before handing the tx to
|
|
101
|
+
// the UoW, so even the very first awaited statement is bounded.
|
|
102
|
+
await applyTimeouts(tx)
|
|
59
103
|
captureTx(tx)
|
|
60
104
|
await completion
|
|
61
105
|
})
|
|
@@ -68,7 +112,22 @@ export function postgresTransactionManager(
|
|
|
68
112
|
},
|
|
69
113
|
)
|
|
70
114
|
|
|
71
|
-
|
|
115
|
+
// If the transaction callback fails before it hands back the tx — BEGIN
|
|
116
|
+
// itself failing, or arming the safety timeouts throwing — `captureTx`
|
|
117
|
+
// never runs and `txReady` would never resolve. Race it against
|
|
118
|
+
// `txPromise` so an early failure rejects begin() instead of hanging it
|
|
119
|
+
// forever. In the happy path `txPromise` stays pending (parked on
|
|
120
|
+
// `completion` until commit/rollback), so `txReady` always wins.
|
|
121
|
+
const tx = (await Promise.race([txReady, txPromise])) as
|
|
122
|
+
| ManagedPostgresTransaction
|
|
123
|
+
| undefined
|
|
124
|
+
if (tx === undefined) {
|
|
125
|
+
// txPromise settled first by resolving — the tx ended before begin()
|
|
126
|
+
// returned, so the handle is unusable. Surface rather than return it.
|
|
127
|
+
throw new Error(
|
|
128
|
+
"postgresTransactionManager: transaction ended before begin() completed",
|
|
129
|
+
)
|
|
130
|
+
}
|
|
72
131
|
tx[TX_CONTROL] = { resolveCommit, rejectRollback, txPromise }
|
|
73
132
|
return tx
|
|
74
133
|
},
|
|
@@ -94,6 +153,13 @@ export function postgresTransactionManager(
|
|
|
94
153
|
}
|
|
95
154
|
}
|
|
96
155
|
|
|
156
|
+
/** Coerce a config timeout to a non-negative whole number of milliseconds.
|
|
157
|
+
* Non-finite or negative values disable the timeout (treated as 0). */
|
|
158
|
+
function normalizeTimeoutMs(value: number): number {
|
|
159
|
+
if (!Number.isFinite(value) || value <= 0) return 0
|
|
160
|
+
return Math.floor(value)
|
|
161
|
+
}
|
|
162
|
+
|
|
97
163
|
/**
|
|
98
164
|
* Run `fn` inside a postgres tx, joining a UoW-scoped tx if one is active
|
|
99
165
|
* (or installed lazily), otherwise opening an ad-hoc tx via `adapter.transaction`.
|
package/src/postgres.ts
CHANGED
|
@@ -60,6 +60,14 @@ export interface PostgresConfig {
|
|
|
60
60
|
readonly pollIntervalMs?: number
|
|
61
61
|
readonly batchSize?: number
|
|
62
62
|
}
|
|
63
|
+
/** Safety timeouts applied via `SET LOCAL` to every UoW-scoped transaction.
|
|
64
|
+
* Guards against a stalled UoW holding a connection — and pinning
|
|
65
|
+
* `pg_snapshot_xmin`, which would stall all streaming tailing — open until
|
|
66
|
+
* restart. Defaults: 30s idle-in-transaction, statement timeout disabled. */
|
|
67
|
+
readonly transaction?: {
|
|
68
|
+
readonly idleInTransactionTimeoutMs?: number
|
|
69
|
+
readonly statementTimeoutMs?: number
|
|
70
|
+
}
|
|
63
71
|
}
|
|
64
72
|
|
|
65
73
|
export function postgres(config: PostgresConfig): (app: App) => void {
|
|
@@ -67,7 +75,7 @@ export function postgres(config: PostgresConfig): (app: App) => void {
|
|
|
67
75
|
const bootstrap = config.bootstrap ?? true
|
|
68
76
|
const tables = config.tableNames ?? DEFAULT_TABLE_NAMES
|
|
69
77
|
|
|
70
|
-
const txManager = postgresTransactionManager(adapter)
|
|
78
|
+
const txManager = postgresTransactionManager(adapter, undefined, config.transaction)
|
|
71
79
|
|
|
72
80
|
return (app: App) => {
|
|
73
81
|
app.set("eventStore", ({ serializer, tagResolver }) =>
|
package/src/schema.ts
CHANGED
|
@@ -42,6 +42,17 @@ export function buildEventsTableDDL(tables: TableNames): string {
|
|
|
42
42
|
// event_id is sourced from EventMessage.identifier (UUID v7 per quick 260511-mks).
|
|
43
43
|
// UNIQUE auto-creates a btree; v7's time-ordered prefix keeps it compact under
|
|
44
44
|
// append load (a v4 random UUID would fragment the leaf pages over time).
|
|
45
|
+
//
|
|
46
|
+
// version + message_timestamp persist the EventMessage's own `version` and authored
|
|
47
|
+
// `timestamp` (epoch ms) so source()/open() reconstruct the full EventMessage contract,
|
|
48
|
+
// matching the in-memory, axon-server, and kronosdb engines. message_timestamp is the
|
|
49
|
+
// authored time — distinct from recorded_at (DB insert time). This mirrors the
|
|
50
|
+
// scheduled-events table, which already carries both columns.
|
|
51
|
+
//
|
|
52
|
+
// MIGRATION: this is CREATE-only. `CREATE TABLE IF NOT EXISTS` does NOT add columns to a
|
|
53
|
+
// pre-existing table, and the columns are NOT NULL, so an events table created before
|
|
54
|
+
// these columns existed must be hand-migrated (ALTER TABLE ... ADD COLUMN) or reset
|
|
55
|
+
// before upgrading — there is no automatic in-place migration.
|
|
45
56
|
return `CREATE TABLE IF NOT EXISTS ${tables.events} (
|
|
46
57
|
sequence_position BIGSERIAL PRIMARY KEY,
|
|
47
58
|
event_id UUID NOT NULL UNIQUE,
|
|
@@ -50,6 +61,8 @@ export function buildEventsTableDDL(tables: TableNames): string {
|
|
|
50
61
|
tags TEXT[] NOT NULL DEFAULT '{}',
|
|
51
62
|
payload JSONB NOT NULL,
|
|
52
63
|
metadata JSONB NOT NULL DEFAULT '{}',
|
|
64
|
+
version TEXT NOT NULL,
|
|
65
|
+
message_timestamp BIGINT NOT NULL,
|
|
53
66
|
recorded_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
54
67
|
) WITH (
|
|
55
68
|
autovacuum_freeze_min_age = 10000000,
|
|
@@ -159,81 +172,6 @@ export interface BootstrapSchemaOptions {
|
|
|
159
172
|
readonly tableNames?: TableNames
|
|
160
173
|
}
|
|
161
174
|
|
|
162
|
-
/**
|
|
163
|
-
* Append-with-DCB-check stored procedure.
|
|
164
|
-
*
|
|
165
|
-
* Called from `createPostgresEventStore.appendEvents` (Plan 04 Task 3)
|
|
166
|
-
* after advisory-lock acquisition. The SP is the single SQL statement
|
|
167
|
-
* that BOTH performs the conflict check AND inserts the new events —
|
|
168
|
-
* keeping them atomic without round-tripping a separate SELECT.
|
|
169
|
-
*
|
|
170
|
-
* Inputs (positional):
|
|
171
|
-
* $1 marker_position bigint — the AppendCondition.marker.position
|
|
172
|
-
* $2 has_condition boolean — false ⇒ skip the conflict check
|
|
173
|
-
* $3 criteria_where_sql text — Plan 04's criteria-sql builder output
|
|
174
|
-
* $4 criteria_params jsonb — parameter array for criteria_where_sql
|
|
175
|
-
* $5 event_ids uuid[] — N event identifiers (EventMessage.identifier, UUID v7)
|
|
176
|
-
* $6 event_types text[] — N event types (one per event)
|
|
177
|
-
* $7 event_tags text[][] — N tag arrays
|
|
178
|
-
* $8 event_payloads jsonb[] — N JSONB payloads
|
|
179
|
-
* $9 event_metadata jsonb[] — N metadata maps
|
|
180
|
-
*
|
|
181
|
-
* Returns: TABLE(out_position bigint, out_xid xid8) — one row per inserted event.
|
|
182
|
-
* The last row carries the consistency marker.
|
|
183
|
-
*
|
|
184
|
-
* On conflict: RAISE EXCEPTION USING ERRCODE = 'KR001' (D-12.12).
|
|
185
|
-
* On duplicate event_id (UNIQUE violation): Postgres raises SQLSTATE 23505;
|
|
186
|
-
* caller treats as idempotent no-op or surfaces per consumer policy.
|
|
187
|
-
*
|
|
188
|
-
* NOTE: dynamic-SQL is used (EXECUTE) because the criteria WHERE clause is
|
|
189
|
-
* parameter-shaped and varies per call. SQL injection is mitigated by the
|
|
190
|
-
* fact that criteria_where_sql is produced by buildCriteriaWhere — a typed
|
|
191
|
-
* builder that NEVER concatenates user data into the WHERE string (all user
|
|
192
|
-
* data flows through criteria_params as JSONB).
|
|
193
|
-
*/
|
|
194
|
-
export function buildAppendStoredProcedureDDL(tables: TableNames): string {
|
|
195
|
-
return `CREATE OR REPLACE FUNCTION kronos_append_with_check(
|
|
196
|
-
marker_position bigint,
|
|
197
|
-
has_condition boolean,
|
|
198
|
-
criteria_where_sql text,
|
|
199
|
-
criteria_params jsonb,
|
|
200
|
-
event_ids uuid[],
|
|
201
|
-
event_types text[],
|
|
202
|
-
event_tags text[][],
|
|
203
|
-
event_payloads jsonb[],
|
|
204
|
-
event_metadata jsonb[]
|
|
205
|
-
) RETURNS TABLE(out_position bigint, out_xid xid8) AS $$
|
|
206
|
-
DECLARE
|
|
207
|
-
conflict_count bigint;
|
|
208
|
-
i integer;
|
|
209
|
-
BEGIN
|
|
210
|
-
IF has_condition THEN
|
|
211
|
-
EXECUTE format(
|
|
212
|
-
'SELECT count(*) FROM ${tables.events} WHERE sequence_position > $1 AND (%s)',
|
|
213
|
-
criteria_where_sql
|
|
214
|
-
)
|
|
215
|
-
USING marker_position, criteria_params
|
|
216
|
-
INTO conflict_count;
|
|
217
|
-
|
|
218
|
-
IF conflict_count > 0 THEN
|
|
219
|
-
RAISE EXCEPTION 'Append condition violated: % conflicting event(s) after position %',
|
|
220
|
-
conflict_count, marker_position
|
|
221
|
-
USING ERRCODE = 'KR001';
|
|
222
|
-
END IF;
|
|
223
|
-
END IF;
|
|
224
|
-
|
|
225
|
-
FOR i IN 1 .. array_length(event_types, 1) LOOP
|
|
226
|
-
-- event_id UNIQUE constraint surfaces duplicates as SQLSTATE 23505 (D-12.12);
|
|
227
|
-
-- caller (Plan 04 Task 3) maps that to AppendConditionError or idempotent skip.
|
|
228
|
-
INSERT INTO ${tables.events} (event_id, type, tags, payload, metadata)
|
|
229
|
-
VALUES (event_ids[i], event_types[i], event_tags[i:i][1], event_payloads[i], event_metadata[i])
|
|
230
|
-
RETURNING sequence_position, transaction_id INTO out_position, out_xid;
|
|
231
|
-
RETURN NEXT;
|
|
232
|
-
END LOOP;
|
|
233
|
-
END;
|
|
234
|
-
$$ LANGUAGE plpgsql;`
|
|
235
|
-
}
|
|
236
|
-
|
|
237
175
|
/**
|
|
238
176
|
* Idempotently create the event-store schema.
|
|
239
177
|
*
|
|
@@ -244,9 +182,6 @@ $$ LANGUAGE plpgsql;`
|
|
|
244
182
|
* The lock is RELEASED in a finally block — partial-DDL-then-throw must
|
|
245
183
|
* NEVER leak a session lock that would block all subsequent bootstraps
|
|
246
184
|
* on the same connection.
|
|
247
|
-
*
|
|
248
|
-
* The append stored procedure is applied as part of bootstrap so that
|
|
249
|
-
* the SP is always up-to-date with the schema version.
|
|
250
185
|
*/
|
|
251
186
|
export async function bootstrapSchema(
|
|
252
187
|
adapter: SchemaBootstrapAdapter,
|
|
@@ -265,7 +200,6 @@ export async function bootstrapSchema(
|
|
|
265
200
|
await adapter.query(buildSnapshotsTableDDL(tables))
|
|
266
201
|
await adapter.query(buildScheduledEventsTableDDL(tables))
|
|
267
202
|
await adapter.query(buildScheduledEventsIndexesDDL(tables))
|
|
268
|
-
await adapter.query(buildAppendStoredProcedureDDL(tables))
|
|
269
203
|
} finally {
|
|
270
204
|
// Release even on partial-DDL failure. The error (if any) propagates
|
|
271
205
|
// to the caller after the lock has been freed.
|