node-cqrs 1.2.0-beta.0 → 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.
Files changed (82) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +29 -9
  3. package/dist/cjs/postgresql/AbstractPostgresqlAccessor.js +83 -0
  4. package/dist/cjs/postgresql/AbstractPostgresqlAccessor.js.map +1 -0
  5. package/dist/cjs/postgresql/AbstractPostgresqlObjectProjection.js +36 -0
  6. package/dist/cjs/postgresql/AbstractPostgresqlObjectProjection.js.map +1 -0
  7. package/dist/cjs/postgresql/AbstractPostgresqlView.js +53 -0
  8. package/dist/cjs/postgresql/AbstractPostgresqlView.js.map +1 -0
  9. package/dist/cjs/postgresql/IContainer.js +3 -0
  10. package/dist/cjs/postgresql/IContainer.js.map +1 -0
  11. package/dist/cjs/postgresql/PostgresqlConnection.js +3 -0
  12. package/dist/cjs/postgresql/PostgresqlConnection.js.map +1 -0
  13. package/dist/cjs/postgresql/PostgresqlEventLocker.js +127 -0
  14. package/dist/cjs/postgresql/PostgresqlEventLocker.js.map +1 -0
  15. package/dist/cjs/postgresql/PostgresqlEventStorage.js +315 -0
  16. package/dist/cjs/postgresql/PostgresqlEventStorage.js.map +1 -0
  17. package/dist/cjs/postgresql/PostgresqlObjectStorage.js +137 -0
  18. package/dist/cjs/postgresql/PostgresqlObjectStorage.js.map +1 -0
  19. package/dist/cjs/postgresql/PostgresqlObjectView.js +46 -0
  20. package/dist/cjs/postgresql/PostgresqlObjectView.js.map +1 -0
  21. package/dist/cjs/postgresql/PostgresqlProjectionDataParams.js +3 -0
  22. package/dist/cjs/postgresql/PostgresqlProjectionDataParams.js.map +1 -0
  23. package/dist/cjs/postgresql/PostgresqlViewLocker.js +151 -0
  24. package/dist/cjs/postgresql/PostgresqlViewLocker.js.map +1 -0
  25. package/dist/cjs/postgresql/index.js +29 -0
  26. package/dist/cjs/postgresql/index.js.map +1 -0
  27. package/dist/cjs/postgresql/utils/getEventId.js +14 -0
  28. package/dist/cjs/postgresql/utils/getEventId.js.map +1 -0
  29. package/dist/cjs/postgresql/utils/index.js +19 -0
  30. package/dist/cjs/postgresql/utils/index.js.map +1 -0
  31. package/dist/cjs/postgresql/utils/quoteIdentifier.js +14 -0
  32. package/dist/cjs/postgresql/utils/quoteIdentifier.js.map +1 -0
  33. package/dist/cjs/sqlite/SqliteEventStorage.js +66 -36
  34. package/dist/cjs/sqlite/SqliteEventStorage.js.map +1 -1
  35. package/dist/esm/postgresql/AbstractPostgresqlAccessor.js +79 -0
  36. package/dist/esm/postgresql/AbstractPostgresqlAccessor.js.map +1 -0
  37. package/dist/esm/postgresql/AbstractPostgresqlObjectProjection.js +32 -0
  38. package/dist/esm/postgresql/AbstractPostgresqlObjectProjection.js.map +1 -0
  39. package/dist/esm/postgresql/AbstractPostgresqlView.js +49 -0
  40. package/dist/esm/postgresql/AbstractPostgresqlView.js.map +1 -0
  41. package/dist/esm/postgresql/IContainer.js +2 -0
  42. package/dist/esm/postgresql/IContainer.js.map +1 -0
  43. package/dist/esm/postgresql/PostgresqlConnection.js +2 -0
  44. package/dist/esm/postgresql/PostgresqlConnection.js.map +1 -0
  45. package/dist/esm/postgresql/PostgresqlEventLocker.js +123 -0
  46. package/dist/esm/postgresql/PostgresqlEventLocker.js.map +1 -0
  47. package/dist/esm/postgresql/PostgresqlEventStorage.js +311 -0
  48. package/dist/esm/postgresql/PostgresqlEventStorage.js.map +1 -0
  49. package/dist/esm/postgresql/PostgresqlObjectStorage.js +133 -0
  50. package/dist/esm/postgresql/PostgresqlObjectStorage.js.map +1 -0
  51. package/dist/esm/postgresql/PostgresqlObjectView.js +42 -0
  52. package/dist/esm/postgresql/PostgresqlObjectView.js.map +1 -0
  53. package/dist/esm/postgresql/PostgresqlProjectionDataParams.js +2 -0
  54. package/dist/esm/postgresql/PostgresqlProjectionDataParams.js.map +1 -0
  55. package/dist/esm/postgresql/PostgresqlViewLocker.js +147 -0
  56. package/dist/esm/postgresql/PostgresqlViewLocker.js.map +1 -0
  57. package/dist/esm/postgresql/index.js +13 -0
  58. package/dist/esm/postgresql/index.js.map +1 -0
  59. package/dist/esm/postgresql/utils/getEventId.js +10 -0
  60. package/dist/esm/postgresql/utils/getEventId.js.map +1 -0
  61. package/dist/esm/postgresql/utils/index.js +3 -0
  62. package/dist/esm/postgresql/utils/index.js.map +1 -0
  63. package/dist/esm/postgresql/utils/quoteIdentifier.js +11 -0
  64. package/dist/esm/postgresql/utils/quoteIdentifier.js.map +1 -0
  65. package/dist/esm/sqlite/SqliteEventStorage.js +66 -36
  66. package/dist/esm/sqlite/SqliteEventStorage.js.map +1 -1
  67. package/dist/types/postgresql/AbstractPostgresqlAccessor.d.ts +29 -0
  68. package/dist/types/postgresql/AbstractPostgresqlObjectProjection.d.ts +12 -0
  69. package/dist/types/postgresql/AbstractPostgresqlView.d.ts +23 -0
  70. package/dist/types/postgresql/IContainer.d.ts +12 -0
  71. package/dist/types/postgresql/PostgresqlConnection.d.ts +7 -0
  72. package/dist/types/postgresql/PostgresqlEventLocker.d.ts +39 -0
  73. package/dist/types/postgresql/PostgresqlEventStorage.d.ts +23 -0
  74. package/dist/types/postgresql/PostgresqlObjectStorage.d.ts +29 -0
  75. package/dist/types/postgresql/PostgresqlObjectView.d.ts +19 -0
  76. package/dist/types/postgresql/PostgresqlProjectionDataParams.d.ts +14 -0
  77. package/dist/types/postgresql/PostgresqlViewLocker.d.ts +41 -0
  78. package/dist/types/postgresql/index.d.ts +12 -0
  79. package/dist/types/postgresql/utils/getEventId.d.ts +5 -0
  80. package/dist/types/postgresql/utils/index.d.ts +2 -0
  81. package/dist/types/postgresql/utils/quoteIdentifier.d.ts +1 -0
  82. 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 e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
69
- FROM tbl_events e, tail
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 e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
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 id, aggregate_id, aggregate_version, type, data, meta, rowid
97
- FROM tbl_events
98
- WHERE rowid > ?
99
- ORDER BY rowid
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 this.#reconstructEvent(row);
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 this.#reconstructEvent(row);
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 this.#reconstructEvent(row);
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":"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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IContainer.js","sourceRoot":"","sources":["../../../src/postgresql/IContainer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PostgresqlConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresqlConnection.js","sourceRoot":"","sources":["../../../src/postgresql/PostgresqlConnection.ts"],"names":[],"mappings":""}