node-cqrs 1.0.0 → 1.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -1
- package/README.md +115 -101
- package/dist/cjs/AbstractProjection.js +43 -18
- package/dist/cjs/AbstractProjection.js.map +1 -1
- package/dist/cjs/AggregateCommandHandler.js +27 -13
- package/dist/cjs/AggregateCommandHandler.js.map +1 -1
- package/dist/cjs/CqrsContainerBuilder.js +6 -1
- package/dist/cjs/CqrsContainerBuilder.js.map +1 -1
- package/dist/cjs/EventDispatchPipeline.js +12 -2
- package/dist/cjs/EventDispatchPipeline.js.map +1 -1
- package/dist/cjs/EventDispatcher.js +39 -10
- package/dist/cjs/EventDispatcher.js.map +1 -1
- package/dist/cjs/EventStore.js +7 -2
- package/dist/cjs/EventStore.js.map +1 -1
- package/dist/cjs/SagaEventHandler.js +54 -40
- package/dist/cjs/SagaEventHandler.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryEventStorage.js +39 -24
- package/dist/cjs/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryMessageBus.js +11 -5
- package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/cjs/interfaces/IDispatchPipelineProcessor.js.map +1 -1
- package/dist/cjs/interfaces/IMessageMeta.js +3 -0
- package/dist/cjs/interfaces/IMessageMeta.js.map +1 -0
- package/dist/cjs/interfaces/IObservable.js.map +1 -1
- package/dist/cjs/interfaces/index.js +1 -0
- package/dist/cjs/interfaces/index.js.map +1 -1
- package/dist/cjs/mongodb/AbstractMongoAccessor.js +51 -0
- package/dist/cjs/mongodb/AbstractMongoAccessor.js.map +1 -0
- package/dist/cjs/mongodb/AbstractMongoObjectProjection.js +26 -0
- package/dist/cjs/mongodb/AbstractMongoObjectProjection.js.map +1 -0
- package/dist/cjs/mongodb/AbstractMongoView.js +57 -0
- package/dist/cjs/mongodb/AbstractMongoView.js.map +1 -0
- package/dist/cjs/mongodb/IContainer.js +3 -0
- package/dist/cjs/mongodb/IContainer.js.map +1 -0
- package/dist/cjs/mongodb/MongoEventLocker.js +104 -0
- package/dist/cjs/mongodb/MongoEventLocker.js.map +1 -0
- package/dist/cjs/mongodb/MongoEventStorage.js +200 -0
- package/dist/cjs/mongodb/MongoEventStorage.js.map +1 -0
- package/dist/cjs/mongodb/MongoObjectStorage.js +101 -0
- package/dist/cjs/mongodb/MongoObjectStorage.js.map +1 -0
- package/dist/cjs/mongodb/MongoObjectView.js +41 -0
- package/dist/cjs/mongodb/MongoObjectView.js.map +1 -0
- package/dist/cjs/mongodb/MongoProjectionDataParams.js +3 -0
- package/dist/cjs/mongodb/MongoProjectionDataParams.js.map +1 -0
- package/dist/cjs/mongodb/MongoViewLocker.js +136 -0
- package/dist/cjs/mongodb/MongoViewLocker.js.map +1 -0
- package/dist/cjs/mongodb/index.js +28 -0
- package/dist/cjs/mongodb/index.js.map +1 -0
- package/dist/cjs/mongodb/registerExitCleanup.js +28 -0
- package/dist/cjs/mongodb/registerExitCleanup.js.map +1 -0
- package/dist/cjs/mongodb/utils/getEventId.js +14 -0
- package/dist/cjs/mongodb/utils/getEventId.js.map +1 -0
- package/dist/cjs/mongodb/utils/index.js +18 -0
- package/dist/cjs/mongodb/utils/index.js.map +1 -0
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js +21 -8
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js +2 -2
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqGateway.js +89 -64
- package/dist/cjs/rabbitmq/RabbitMqGateway.js.map +1 -1
- package/dist/cjs/redis/AbstractRedisAccessor.js +51 -0
- package/dist/cjs/redis/AbstractRedisAccessor.js.map +1 -0
- package/dist/cjs/redis/AbstractRedisProjection.js +26 -0
- package/dist/cjs/redis/AbstractRedisProjection.js.map +1 -0
- package/dist/cjs/redis/IContainer.js +3 -0
- package/dist/cjs/redis/IContainer.js.map +1 -0
- package/dist/cjs/redis/RedisEventLocker.js +96 -0
- package/dist/cjs/redis/RedisEventLocker.js.map +1 -0
- package/dist/cjs/redis/RedisObjectStorage.js +125 -0
- package/dist/cjs/redis/RedisObjectStorage.js.map +1 -0
- package/dist/cjs/redis/RedisProjectionDataParams.js +3 -0
- package/dist/cjs/redis/RedisProjectionDataParams.js.map +1 -0
- package/dist/cjs/redis/RedisView.js +81 -0
- package/dist/cjs/redis/RedisView.js.map +1 -0
- package/dist/cjs/redis/RedisViewLocker.js +111 -0
- package/dist/cjs/redis/RedisViewLocker.js.map +1 -0
- package/dist/cjs/redis/index.js +30 -0
- package/dist/cjs/redis/index.js.map +1 -0
- package/dist/cjs/redis/utils/getEventId.js +14 -0
- package/dist/cjs/redis/utils/getEventId.js.map +1 -0
- package/dist/cjs/redis/utils/index.js +18 -0
- package/dist/cjs/redis/utils/index.js.map +1 -0
- package/dist/cjs/sqlite/AbstractSqliteView.js.map +1 -1
- package/dist/cjs/sqlite/SqliteEventStorage.js +215 -0
- package/dist/cjs/sqlite/SqliteEventStorage.js.map +1 -0
- package/dist/cjs/sqlite/SqliteObjectStorage.js +6 -6
- package/dist/cjs/sqlite/SqliteObjectStorage.js.map +1 -1
- package/dist/cjs/sqlite/SqliteObjectView.js.map +1 -1
- package/dist/cjs/sqlite/index.js +1 -0
- package/dist/cjs/sqlite/index.js.map +1 -1
- package/dist/cjs/sqlite/utils/bufferToGuid.js +9 -0
- package/dist/cjs/sqlite/utils/bufferToGuid.js.map +1 -0
- package/dist/cjs/sqlite/utils/getEventId.js +2 -5
- package/dist/cjs/sqlite/utils/getEventId.js.map +1 -1
- package/dist/cjs/sqlite/utils/guid.js +1 -1
- package/dist/cjs/sqlite/utils/guid.js.map +1 -1
- package/dist/cjs/sqlite/utils/index.js +1 -0
- package/dist/cjs/sqlite/utils/index.js.map +1 -1
- package/dist/cjs/telemetry/index.js +20 -0
- package/dist/cjs/telemetry/index.js.map +1 -0
- package/dist/cjs/telemetry/recordSpanError.js +19 -0
- package/dist/cjs/telemetry/recordSpanError.js.map +1 -0
- package/dist/cjs/telemetry/spanAttributes.js +26 -0
- package/dist/cjs/telemetry/spanAttributes.js.map +1 -0
- package/dist/cjs/telemetry/spanContext.js +25 -0
- package/dist/cjs/telemetry/spanContext.js.map +1 -0
- package/dist/cjs/utils/MapAssertable.js +25 -1
- package/dist/cjs/utils/MapAssertable.js.map +1 -1
- package/dist/esm/AbstractProjection.js +32 -7
- package/dist/esm/AbstractProjection.js.map +1 -1
- package/dist/esm/AggregateCommandHandler.js +22 -8
- package/dist/esm/AggregateCommandHandler.js.map +1 -1
- package/dist/esm/CqrsContainerBuilder.js +6 -1
- package/dist/esm/CqrsContainerBuilder.js.map +1 -1
- package/dist/esm/EventDispatchPipeline.js +12 -2
- package/dist/esm/EventDispatchPipeline.js.map +1 -1
- package/dist/esm/EventDispatcher.js +33 -4
- package/dist/esm/EventDispatcher.js.map +1 -1
- package/dist/esm/EventStore.js +7 -2
- package/dist/esm/EventStore.js.map +1 -1
- package/dist/esm/SagaEventHandler.js +42 -28
- package/dist/esm/SagaEventHandler.js.map +1 -1
- package/dist/esm/in-memory/InMemoryEventStorage.js +25 -10
- package/dist/esm/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/esm/in-memory/InMemoryMessageBus.js +11 -5
- package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/esm/interfaces/IDispatchPipelineProcessor.js.map +1 -1
- package/dist/esm/interfaces/IMessageMeta.js +2 -0
- package/dist/esm/interfaces/IMessageMeta.js.map +1 -0
- package/dist/esm/interfaces/IObservable.js.map +1 -1
- package/dist/esm/interfaces/index.js +1 -0
- package/dist/esm/interfaces/index.js.map +1 -1
- package/dist/esm/mongodb/AbstractMongoAccessor.js +47 -0
- package/dist/esm/mongodb/AbstractMongoAccessor.js.map +1 -0
- package/dist/esm/mongodb/AbstractMongoObjectProjection.js +22 -0
- package/dist/esm/mongodb/AbstractMongoObjectProjection.js.map +1 -0
- package/dist/esm/mongodb/AbstractMongoView.js +53 -0
- package/dist/esm/mongodb/AbstractMongoView.js.map +1 -0
- package/dist/esm/mongodb/IContainer.js +2 -0
- package/dist/esm/mongodb/IContainer.js.map +1 -0
- package/dist/esm/mongodb/MongoEventLocker.js +100 -0
- package/dist/esm/mongodb/MongoEventLocker.js.map +1 -0
- package/dist/esm/mongodb/MongoEventStorage.js +196 -0
- package/dist/esm/mongodb/MongoEventStorage.js.map +1 -0
- package/dist/esm/mongodb/MongoObjectStorage.js +97 -0
- package/dist/esm/mongodb/MongoObjectStorage.js.map +1 -0
- package/dist/esm/mongodb/MongoObjectView.js +37 -0
- package/dist/esm/mongodb/MongoObjectView.js.map +1 -0
- package/dist/esm/mongodb/MongoProjectionDataParams.js +2 -0
- package/dist/esm/mongodb/MongoProjectionDataParams.js.map +1 -0
- package/dist/esm/mongodb/MongoViewLocker.js +132 -0
- package/dist/esm/mongodb/MongoViewLocker.js.map +1 -0
- package/dist/esm/mongodb/index.js +12 -0
- package/dist/esm/mongodb/index.js.map +1 -0
- package/dist/esm/mongodb/registerExitCleanup.js +24 -0
- package/dist/esm/mongodb/registerExitCleanup.js.map +1 -0
- package/dist/esm/mongodb/utils/getEventId.js +10 -0
- package/dist/esm/mongodb/utils/getEventId.js.map +1 -0
- package/dist/esm/mongodb/utils/index.js +2 -0
- package/dist/esm/mongodb/utils/index.js.map +1 -0
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js +21 -8
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqEventBus.js +2 -2
- package/dist/esm/rabbitmq/RabbitMqEventBus.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqGateway.js +69 -44
- package/dist/esm/rabbitmq/RabbitMqGateway.js.map +1 -1
- package/dist/esm/redis/AbstractRedisAccessor.js +47 -0
- package/dist/esm/redis/AbstractRedisAccessor.js.map +1 -0
- package/dist/esm/redis/AbstractRedisProjection.js +22 -0
- package/dist/esm/redis/AbstractRedisProjection.js.map +1 -0
- package/dist/esm/redis/IContainer.js +2 -0
- package/dist/esm/redis/IContainer.js.map +1 -0
- package/dist/esm/redis/RedisEventLocker.js +92 -0
- package/dist/esm/redis/RedisEventLocker.js.map +1 -0
- package/dist/esm/redis/RedisObjectStorage.js +121 -0
- package/dist/esm/redis/RedisObjectStorage.js.map +1 -0
- package/dist/esm/redis/RedisProjectionDataParams.js +2 -0
- package/dist/esm/redis/RedisProjectionDataParams.js.map +1 -0
- package/dist/esm/redis/RedisView.js +77 -0
- package/dist/esm/redis/RedisView.js.map +1 -0
- package/dist/esm/redis/RedisViewLocker.js +107 -0
- package/dist/esm/redis/RedisViewLocker.js.map +1 -0
- package/dist/esm/redis/index.js +14 -0
- package/dist/esm/redis/index.js.map +1 -0
- package/dist/esm/redis/utils/getEventId.js +10 -0
- package/dist/esm/redis/utils/getEventId.js.map +1 -0
- package/dist/esm/redis/utils/index.js +2 -0
- package/dist/esm/redis/utils/index.js.map +1 -0
- package/dist/esm/sqlite/AbstractSqliteView.js.map +1 -1
- package/dist/esm/sqlite/SqliteEventStorage.js +211 -0
- package/dist/esm/sqlite/SqliteEventStorage.js.map +1 -0
- package/dist/esm/sqlite/SqliteObjectStorage.js +7 -7
- package/dist/esm/sqlite/SqliteObjectStorage.js.map +1 -1
- package/dist/esm/sqlite/SqliteObjectView.js.map +1 -1
- package/dist/esm/sqlite/index.js +1 -0
- package/dist/esm/sqlite/index.js.map +1 -1
- package/dist/esm/sqlite/utils/bufferToGuid.js +5 -0
- package/dist/esm/sqlite/utils/bufferToGuid.js.map +1 -0
- package/dist/esm/sqlite/utils/getEventId.js +2 -2
- package/dist/esm/sqlite/utils/getEventId.js.map +1 -1
- package/dist/esm/sqlite/utils/guid.js +1 -1
- package/dist/esm/sqlite/utils/guid.js.map +1 -1
- package/dist/esm/sqlite/utils/index.js +1 -0
- package/dist/esm/sqlite/utils/index.js.map +1 -1
- package/dist/esm/telemetry/index.js +4 -0
- package/dist/esm/telemetry/index.js.map +1 -0
- package/dist/esm/telemetry/recordSpanError.js +16 -0
- package/dist/esm/telemetry/recordSpanError.js.map +1 -0
- package/dist/esm/telemetry/spanAttributes.js +23 -0
- package/dist/esm/telemetry/spanAttributes.js.map +1 -0
- package/dist/esm/telemetry/spanContext.js +22 -0
- package/dist/esm/telemetry/spanContext.js.map +1 -0
- package/dist/esm/utils/MapAssertable.js +25 -1
- package/dist/esm/utils/MapAssertable.js.map +1 -1
- package/dist/types/AbstractProjection.d.ts +3 -1
- package/dist/types/AggregateCommandHandler.d.ts +3 -3
- package/dist/types/EventDispatchPipeline.d.ts +3 -1
- package/dist/types/EventDispatcher.d.ts +9 -1
- package/dist/types/EventStore.d.ts +4 -2
- package/dist/types/SagaEventHandler.d.ts +3 -3
- package/dist/types/in-memory/InMemoryEventStorage.d.ts +2 -1
- package/dist/types/in-memory/InMemoryMessageBus.d.ts +3 -3
- package/dist/types/interfaces/ICommandBus.d.ts +3 -2
- package/dist/types/interfaces/IContainer.d.ts +7 -0
- package/dist/types/interfaces/IDispatchPipelineProcessor.d.ts +2 -0
- package/dist/types/interfaces/IEventDispatcher.d.ts +3 -0
- package/dist/types/interfaces/IMessageMeta.d.ts +4 -0
- package/dist/types/interfaces/IObservable.d.ts +2 -1
- package/dist/types/interfaces/index.d.ts +1 -0
- package/dist/types/mongodb/AbstractMongoAccessor.d.ts +26 -0
- package/dist/types/mongodb/AbstractMongoObjectProjection.d.ts +8 -0
- package/dist/types/mongodb/AbstractMongoView.d.ts +25 -0
- package/dist/types/mongodb/IContainer.d.ts +11 -0
- package/dist/types/mongodb/MongoEventLocker.d.ts +47 -0
- package/dist/types/mongodb/MongoEventStorage.d.ts +27 -0
- package/dist/types/mongodb/MongoObjectStorage.d.ts +26 -0
- package/dist/types/mongodb/MongoObjectView.d.ts +16 -0
- package/dist/types/mongodb/MongoProjectionDataParams.d.ts +14 -0
- package/dist/types/mongodb/MongoViewLocker.d.ts +43 -0
- package/dist/types/mongodb/index.d.ts +11 -0
- package/dist/types/mongodb/registerExitCleanup.d.ts +10 -0
- package/dist/types/mongodb/utils/getEventId.d.ts +5 -0
- package/dist/types/mongodb/utils/index.d.ts +1 -0
- package/dist/types/rabbitmq/IContainer.d.ts +2 -2
- package/dist/types/rabbitmq/RabbitMqCommandBus.d.ts +5 -4
- package/dist/types/rabbitmq/RabbitMqEventBus.d.ts +2 -2
- package/dist/types/rabbitmq/RabbitMqGateway.d.ts +4 -4
- package/dist/types/redis/AbstractRedisAccessor.d.ts +26 -0
- package/dist/types/redis/AbstractRedisProjection.d.ts +8 -0
- package/dist/types/redis/IContainer.d.ts +7 -0
- package/dist/types/redis/RedisEventLocker.d.ts +36 -0
- package/dist/types/redis/RedisObjectStorage.d.ts +26 -0
- package/dist/types/redis/RedisProjectionDataParams.d.ts +21 -0
- package/dist/types/redis/RedisView.d.ts +33 -0
- package/dist/types/redis/RedisViewLocker.d.ts +35 -0
- package/dist/types/redis/index.d.ts +13 -0
- package/dist/types/redis/utils/getEventId.d.ts +5 -0
- package/dist/types/redis/utils/index.d.ts +1 -0
- package/dist/types/sqlite/AbstractSqliteView.d.ts +2 -2
- package/dist/types/sqlite/SqliteEventStorage.d.ts +18 -0
- package/dist/types/sqlite/SqliteObjectStorage.d.ts +7 -7
- package/dist/types/sqlite/SqliteObjectView.d.ts +7 -7
- package/dist/types/sqlite/index.d.ts +1 -0
- package/dist/types/sqlite/utils/bufferToGuid.d.ts +4 -0
- package/dist/types/sqlite/utils/getEventId.d.ts +1 -1
- package/dist/types/sqlite/utils/guid.d.ts +2 -1
- package/dist/types/sqlite/utils/index.d.ts +1 -0
- package/dist/types/telemetry/index.d.ts +3 -0
- package/dist/types/telemetry/recordSpanError.d.ts +6 -0
- package/dist/types/telemetry/spanAttributes.d.ts +14 -0
- package/dist/types/telemetry/spanContext.d.ts +12 -0
- package/dist/types/utils/MapAssertable.d.ts +8 -0
- package/package.json +43 -13
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqliteEventStorage = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const index_ts_1 = require("../utils/index.js");
|
|
6
|
+
const index_ts_2 = require("../errors/index.js");
|
|
7
|
+
const AbstractSqliteAccessor_ts_1 = require("./AbstractSqliteAccessor.js");
|
|
8
|
+
const index_ts_3 = require("./utils/index.js");
|
|
9
|
+
function extractMeta(envelope) {
|
|
10
|
+
const { event: _event, ignoreConcurrencyError: _ignore, ...rest } = envelope;
|
|
11
|
+
if (Object.keys(rest).length === 0)
|
|
12
|
+
return null;
|
|
13
|
+
return rest;
|
|
14
|
+
}
|
|
15
|
+
class SqliteEventStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAccessor {
|
|
16
|
+
#insertEventQuery;
|
|
17
|
+
#insertSagaRefQuery;
|
|
18
|
+
#checkConcurrencyQuery;
|
|
19
|
+
#getRowidQuery;
|
|
20
|
+
#getAggregateEventsQuery;
|
|
21
|
+
#getSagaEventsQuery;
|
|
22
|
+
#getSagaRefsQuery;
|
|
23
|
+
#getEventsByTypesQuery;
|
|
24
|
+
initialize(db) {
|
|
25
|
+
db.pragma('foreign_keys = ON');
|
|
26
|
+
db.exec(`CREATE TABLE IF NOT EXISTS tbl_events (
|
|
27
|
+
id BLOB PRIMARY KEY,
|
|
28
|
+
aggregate_id BLOB,
|
|
29
|
+
aggregate_version INTEGER,
|
|
30
|
+
type TEXT NOT NULL,
|
|
31
|
+
data JSON NOT NULL,
|
|
32
|
+
meta JSON
|
|
33
|
+
)`);
|
|
34
|
+
db.exec(`CREATE TABLE IF NOT EXISTS tbl_event_sagas (
|
|
35
|
+
saga_descriptor TEXT NOT NULL,
|
|
36
|
+
origin_id BLOB NOT NULL,
|
|
37
|
+
event_id BLOB NOT NULL,
|
|
38
|
+
PRIMARY KEY (saga_descriptor, origin_id, event_id),
|
|
39
|
+
FOREIGN KEY (event_id) REFERENCES tbl_events(id)
|
|
40
|
+
)`);
|
|
41
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_events_aggregate_id ON tbl_events (aggregate_id)');
|
|
42
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_event_sagas_event_id ON tbl_event_sagas (event_id)');
|
|
43
|
+
this.#insertEventQuery = db.prepare(`
|
|
44
|
+
INSERT INTO tbl_events (id, aggregate_id, aggregate_version, type, data, meta)
|
|
45
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
46
|
+
`);
|
|
47
|
+
this.#insertSagaRefQuery = db.prepare(`
|
|
48
|
+
INSERT INTO tbl_event_sagas (saga_descriptor, origin_id, event_id)
|
|
49
|
+
VALUES (?, ?, ?)
|
|
50
|
+
`);
|
|
51
|
+
this.#checkConcurrencyQuery = db.prepare(`
|
|
52
|
+
SELECT 1 FROM tbl_events
|
|
53
|
+
WHERE aggregate_id = ? AND aggregate_version = ?
|
|
54
|
+
LIMIT 1
|
|
55
|
+
`);
|
|
56
|
+
this.#getRowidQuery = db.prepare(`
|
|
57
|
+
SELECT rowid FROM tbl_events WHERE id = ?
|
|
58
|
+
`);
|
|
59
|
+
this.#getAggregateEventsQuery = db.prepare(`
|
|
60
|
+
WITH tail AS (
|
|
61
|
+
SELECT id AS tail_id
|
|
62
|
+
FROM tbl_events
|
|
63
|
+
WHERE aggregate_id = @aggregateId
|
|
64
|
+
AND (@afterVersion IS NULL OR aggregate_version > @afterVersion)
|
|
65
|
+
ORDER BY rowid DESC
|
|
66
|
+
LIMIT 1
|
|
67
|
+
)
|
|
68
|
+
SELECT e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
|
|
69
|
+
FROM tbl_events e, tail
|
|
70
|
+
WHERE e.aggregate_id = @aggregateId
|
|
71
|
+
AND (@afterVersion IS NULL OR e.aggregate_version > @afterVersion)
|
|
72
|
+
AND (
|
|
73
|
+
@eventTypes IS NULL
|
|
74
|
+
OR e.type IN (SELECT value FROM json_each(@eventTypes))
|
|
75
|
+
OR (@tail = 'last' AND e.id = tail.tail_id)
|
|
76
|
+
)
|
|
77
|
+
ORDER BY e.rowid
|
|
78
|
+
`);
|
|
79
|
+
this.#getSagaEventsQuery = db.prepare(`
|
|
80
|
+
SELECT e.id, e.aggregate_id, e.aggregate_version, e.type, e.data, e.meta, e.rowid
|
|
81
|
+
FROM tbl_events e
|
|
82
|
+
LEFT JOIN tbl_event_sagas sr
|
|
83
|
+
ON sr.event_id = e.id
|
|
84
|
+
AND sr.saga_descriptor = @sagaDescriptor
|
|
85
|
+
AND sr.origin_id = @originId
|
|
86
|
+
WHERE e.rowid >= @originRowid AND e.rowid < @beforeRowid
|
|
87
|
+
AND (e.id = @originId OR sr.event_id IS NOT NULL)
|
|
88
|
+
ORDER BY e.rowid
|
|
89
|
+
`);
|
|
90
|
+
this.#getSagaRefsQuery = db.prepare(`
|
|
91
|
+
SELECT saga_descriptor, origin_id
|
|
92
|
+
FROM tbl_event_sagas
|
|
93
|
+
WHERE event_id = ?
|
|
94
|
+
`);
|
|
95
|
+
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
|
|
100
|
+
`);
|
|
101
|
+
}
|
|
102
|
+
// eslint-disable-next-line class-methods-use-this
|
|
103
|
+
getNewId() {
|
|
104
|
+
return (0, node_crypto_1.randomUUID)().replaceAll('-', '');
|
|
105
|
+
}
|
|
106
|
+
async commitEvents(events, options) {
|
|
107
|
+
await this.assertConnection();
|
|
108
|
+
const metaJson = options?.meta ? JSON.stringify(options.meta) : null;
|
|
109
|
+
this.db.transaction(() => {
|
|
110
|
+
for (const event of events) {
|
|
111
|
+
if (!options?.ignoreConcurrencyError && event.aggregateId && event.aggregateVersion !== undefined) {
|
|
112
|
+
const conflict = this.#checkConcurrencyQuery.get((0, index_ts_3.guid)(event.aggregateId), event.aggregateVersion);
|
|
113
|
+
if (conflict)
|
|
114
|
+
throw new index_ts_2.ConcurrencyError(`Duplicate aggregateVersion ${event.aggregateVersion} for aggregate ${event.aggregateId}`);
|
|
115
|
+
}
|
|
116
|
+
const { sagaOrigins, id, ...eventData } = event;
|
|
117
|
+
(0, index_ts_1.assertString)(id, 'event.id');
|
|
118
|
+
const eventId = (0, index_ts_3.guid)(id);
|
|
119
|
+
this.#insertEventQuery.run(eventId, event.aggregateId !== undefined ? (0, index_ts_3.guid)(event.aggregateId) : null, event.aggregateVersion ?? null, event.type, JSON.stringify(eventData), metaJson);
|
|
120
|
+
if (sagaOrigins) {
|
|
121
|
+
for (const [descriptor, originId] of Object.entries(sagaOrigins)) {
|
|
122
|
+
this.#insertSagaRefQuery.run(descriptor, (0, index_ts_3.guid)(originId), eventId);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
})();
|
|
127
|
+
return events;
|
|
128
|
+
}
|
|
129
|
+
async *getAggregateEvents(aggregateId, options) {
|
|
130
|
+
await this.assertConnection();
|
|
131
|
+
const rows = this.#getAggregateEventsQuery.all({
|
|
132
|
+
aggregateId: (0, index_ts_3.guid)(aggregateId),
|
|
133
|
+
afterVersion: options?.snapshot?.aggregateVersion ?? null,
|
|
134
|
+
eventTypes: options?.eventTypes
|
|
135
|
+
? JSON.stringify(options.eventTypes)
|
|
136
|
+
: null,
|
|
137
|
+
tail: options?.tail ?? null
|
|
138
|
+
});
|
|
139
|
+
for (const row of rows)
|
|
140
|
+
yield this.#reconstructEvent(row);
|
|
141
|
+
}
|
|
142
|
+
async *getSagaEvents(sagaId, { beforeEvent }) {
|
|
143
|
+
await this.assertConnection();
|
|
144
|
+
(0, index_ts_1.assertString)(beforeEvent?.id, 'beforeEvent.id');
|
|
145
|
+
const { sagaDescriptor, originEventId } = (0, index_ts_1.parseSagaId)(sagaId);
|
|
146
|
+
if (beforeEvent.sagaOrigins?.[sagaDescriptor] !== originEventId)
|
|
147
|
+
throw new TypeError('beforeEvent.sagaOrigins does not match sagaId');
|
|
148
|
+
const originRowid = this.#getRowidQuery.get((0, index_ts_3.guid)(originEventId));
|
|
149
|
+
if (!originRowid)
|
|
150
|
+
throw new Error(`origin event ${originEventId} not found`);
|
|
151
|
+
const beforeRowid = this.#getRowidQuery.get((0, index_ts_3.guid)(beforeEvent.id));
|
|
152
|
+
if (!beforeRowid)
|
|
153
|
+
throw new Error(`beforeEvent ${beforeEvent.id} not found`);
|
|
154
|
+
const rows = this.#getSagaEventsQuery.all({
|
|
155
|
+
sagaDescriptor,
|
|
156
|
+
originId: (0, index_ts_3.guid)(originEventId),
|
|
157
|
+
originRowid: originRowid.rowid,
|
|
158
|
+
beforeRowid: beforeRowid.rowid
|
|
159
|
+
});
|
|
160
|
+
for (const row of rows)
|
|
161
|
+
yield this.#reconstructEvent(row);
|
|
162
|
+
}
|
|
163
|
+
async *getEventsByTypes(eventTypes, options) {
|
|
164
|
+
await this.assertConnection();
|
|
165
|
+
const lastEventId = options?.afterEvent?.id;
|
|
166
|
+
if (options?.afterEvent)
|
|
167
|
+
(0, index_ts_1.assertString)(options.afterEvent.id, 'options.afterEvent.id');
|
|
168
|
+
let afterRowid = 0;
|
|
169
|
+
if (lastEventId) {
|
|
170
|
+
const row = this.#getRowidQuery.get((0, index_ts_3.guid)(lastEventId));
|
|
171
|
+
if (!row)
|
|
172
|
+
return;
|
|
173
|
+
afterRowid = row.rowid;
|
|
174
|
+
}
|
|
175
|
+
const rows = this.#getEventsByTypesQuery.all(afterRowid);
|
|
176
|
+
for (const row of rows) {
|
|
177
|
+
if (eventTypes.includes(row.type))
|
|
178
|
+
yield this.#reconstructEvent(row);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async process(batch) {
|
|
182
|
+
const events = [];
|
|
183
|
+
for (const item of batch) {
|
|
184
|
+
if (!item.event)
|
|
185
|
+
throw new Error('Event batch does not contain `event`');
|
|
186
|
+
events.push(item.event);
|
|
187
|
+
}
|
|
188
|
+
const meta = extractMeta(batch[0]);
|
|
189
|
+
const ignoreConcurrencyError = batch[0]?.ignoreConcurrencyError;
|
|
190
|
+
await this.commitEvents(events, { ignoreConcurrencyError, meta });
|
|
191
|
+
return batch;
|
|
192
|
+
}
|
|
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
|
+
}
|
|
214
|
+
exports.SqliteEventStorage = SqliteEventStorage;
|
|
215
|
+
//# sourceMappingURL=SqliteEventStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SqliteEventStorage.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteEventStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,7 @@ class SqliteObjectStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcce
|
|
|
44
44
|
`);
|
|
45
45
|
}
|
|
46
46
|
async get(id) {
|
|
47
|
-
(0, assert_ts_1.
|
|
47
|
+
(0, assert_ts_1.assertDefined)(id, 'id');
|
|
48
48
|
await this.assertConnection();
|
|
49
49
|
const r = this.#getQuery.get((0, index_ts_1.guid)(id));
|
|
50
50
|
if (!r)
|
|
@@ -52,14 +52,14 @@ class SqliteObjectStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcce
|
|
|
52
52
|
return JSON.parse(r.data);
|
|
53
53
|
}
|
|
54
54
|
getSync(id) {
|
|
55
|
-
(0, assert_ts_1.
|
|
55
|
+
(0, assert_ts_1.assertDefined)(id, 'id');
|
|
56
56
|
const r = this.#getQuery.get((0, index_ts_1.guid)(id));
|
|
57
57
|
if (!r)
|
|
58
58
|
return undefined;
|
|
59
59
|
return JSON.parse(r.data);
|
|
60
60
|
}
|
|
61
61
|
async create(id, data) {
|
|
62
|
-
(0, assert_ts_1.
|
|
62
|
+
(0, assert_ts_1.assertDefined)(id, 'id');
|
|
63
63
|
await this.assertConnection();
|
|
64
64
|
this.#createSync(id, data);
|
|
65
65
|
}
|
|
@@ -69,7 +69,7 @@ class SqliteObjectStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcce
|
|
|
69
69
|
throw new Error(`Record '${id}' could not be created`);
|
|
70
70
|
}
|
|
71
71
|
async update(id, update) {
|
|
72
|
-
(0, assert_ts_1.
|
|
72
|
+
(0, assert_ts_1.assertDefined)(id, 'id');
|
|
73
73
|
(0, assert_ts_1.assertFunction)(update, 'update');
|
|
74
74
|
await this.assertConnection();
|
|
75
75
|
this.#updateSync(id, update);
|
|
@@ -94,7 +94,7 @@ class SqliteObjectStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcce
|
|
|
94
94
|
throw new Error(`Record '${id}' could not be updated`);
|
|
95
95
|
}
|
|
96
96
|
async updateEnforcingNew(id, update) {
|
|
97
|
-
(0, assert_ts_1.
|
|
97
|
+
(0, assert_ts_1.assertDefined)(id, 'id');
|
|
98
98
|
(0, assert_ts_1.assertFunction)(update, 'update');
|
|
99
99
|
await this.assertConnection();
|
|
100
100
|
const record = this.#getQuery.get((0, index_ts_1.guid)(id));
|
|
@@ -104,7 +104,7 @@ class SqliteObjectStorage extends AbstractSqliteAccessor_ts_1.AbstractSqliteAcce
|
|
|
104
104
|
this.#createSync(id, update());
|
|
105
105
|
}
|
|
106
106
|
async delete(id) {
|
|
107
|
-
(0, assert_ts_1.
|
|
107
|
+
(0, assert_ts_1.assertDefined)(id, 'id');
|
|
108
108
|
await this.assertConnection();
|
|
109
109
|
const r = this.#deleteQuery.run((0, index_ts_1.guid)(id));
|
|
110
110
|
return r.changes === 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteObjectStorage.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteObjectStorage.ts"],"names":[],"mappings":";;;AACA,+CAAwC;AAGxC,2EAAqE;AACrE,
|
|
1
|
+
{"version":3,"file":"SqliteObjectStorage.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteObjectStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteObjectView.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteObjectView.ts"],"names":[],"mappings":";;;AAAA,mEAA6D;AAE7D,qEAA+D;AAE/D,kDAAkD;AAElD;;GAEG;AACH,MAAa,gBAA0B,SAAQ,0CAAkB;IAEhE,oBAAoB,CAA+B;IAEnD,YAAY,OAEX;QACA,IAAA,wBAAY,EAAC,OAAO,EAAE,eAAe,EAAE,yBAAyB,CAAC,CAAC;QAClE,IAAA,wBAAY,EAAC,OAAO,EAAE,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAE9D,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,oBAAoB,GAAG,IAAI,4CAAmB,CAAU;YAC5D,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;YAC1D,SAAS,EAAE,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,aAAa,EAAE;SAChE,CAAC,CAAC;IACJ,CAAC;IAED,qFAAqF;IAC3E,UAAU,CAAC,EAAY;QAChC,yEAAyE;IAC1E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"SqliteObjectView.js","sourceRoot":"","sources":["../../../src/sqlite/SqliteObjectView.ts"],"names":[],"mappings":";;;AAAA,mEAA6D;AAE7D,qEAA+D;AAE/D,kDAAkD;AAElD;;GAEG;AACH,MAAa,gBAA0B,SAAQ,0CAAkB;IAEhE,oBAAoB,CAA+B;IAEnD,YAAY,OAEX;QACA,IAAA,wBAAY,EAAC,OAAO,EAAE,eAAe,EAAE,yBAAyB,CAAC,CAAC;QAClE,IAAA,wBAAY,EAAC,OAAO,EAAE,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAE9D,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,oBAAoB,GAAG,IAAI,4CAAmB,CAAU;YAC5D,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;YAC1D,SAAS,EAAE,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,aAAa,EAAE;SAChE,CAAC,CAAC;IACJ,CAAC;IAED,qFAAqF;IAC3E,UAAU,CAAC,EAAY;QAChC,yEAAyE;IAC1E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAc;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1B,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,EAAc;QACrB,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAc,EAAE,IAAa;QACzC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAc,EAAE,MAA+B;QAC3D,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,EAAc,EAAE,MAAgC;QACxE,MAAM,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAc;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;CACD;AAlDD,4CAkDC"}
|
package/dist/cjs/sqlite/index.js
CHANGED
|
@@ -19,6 +19,7 @@ __exportStar(require("./AbstractSqliteAccessor.js"), exports);
|
|
|
19
19
|
__exportStar(require("./AbstractSqliteObjectProjection.js"), exports);
|
|
20
20
|
__exportStar(require("./AbstractSqliteView.js"), exports);
|
|
21
21
|
__exportStar(require("./SqliteEventLocker.js"), exports);
|
|
22
|
+
__exportStar(require("./SqliteEventStorage.js"), exports);
|
|
22
23
|
__exportStar(require("./SqliteObjectStorage.js"), exports);
|
|
23
24
|
__exportStar(require("./SqliteObjectView.js"), exports);
|
|
24
25
|
__exportStar(require("./SqliteViewLocker.js"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sqlite/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2BAAyB;AAEzB,8DAA4C;AAC5C,sEAAoD;AACpD,0DAAwC;AACxC,yDAAuC;AACvC,2DAAyC;AACzC,wDAAsC;AACtC,wDAAsC;AACtC,mDAAiC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sqlite/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2BAAyB;AAEzB,8DAA4C;AAC5C,sEAAoD;AACpD,0DAAwC;AACxC,yDAAuC;AACvC,0DAAwC;AACxC,2DAAyC;AACzC,wDAAsC;AACtC,wDAAsC;AACtC,mDAAiC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bufferToGuid = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Convert Buffer (BLOB) back to a hex string (no dashes)
|
|
6
|
+
*/
|
|
7
|
+
const bufferToGuid = (buf) => buf.toString('hex');
|
|
8
|
+
exports.bufferToGuid = bufferToGuid;
|
|
9
|
+
//# sourceMappingURL=bufferToGuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bufferToGuid.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/bufferToGuid.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACI,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAA5D,QAAA,YAAY,gBAAgD"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.getEventId = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
5
|
const guid_ts_1 = require("./guid.js");
|
|
8
|
-
const md5_1 = __importDefault(require("md5"));
|
|
9
6
|
/**
|
|
10
7
|
* Get assigned or generate new event ID from event content
|
|
11
8
|
*/
|
|
12
|
-
const getEventId = (event) => (0, guid_ts_1.guid)(typeof event.id === 'string' ? event.id : (0,
|
|
9
|
+
const getEventId = (event) => (0, guid_ts_1.guid)(typeof event.id === 'string' ? event.id : (0, node_crypto_1.createHash)('md5').update(JSON.stringify(event)).digest('hex'));
|
|
13
10
|
exports.getEventId = getEventId;
|
|
14
11
|
//# sourceMappingURL=getEventId.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getEventId.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/getEventId.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getEventId.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/getEventId.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,uCAAiC;AAEjC;;GAEG;AACI,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CACnD,IAAA,cAAI,EAAC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAA,wBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AADlG,QAAA,UAAU,cACwF"}
|
|
@@ -4,6 +4,6 @@ exports.guid = void 0;
|
|
|
4
4
|
/**
|
|
5
5
|
* Convert Guid to Buffer for storing in Sqlite BLOB
|
|
6
6
|
*/
|
|
7
|
-
const guid = (str) => Buffer.from(str.replaceAll('-', ''), 'hex');
|
|
7
|
+
const guid = (str) => Buffer.from(String(str).replaceAll('-', ''), 'hex');
|
|
8
8
|
exports.guid = guid;
|
|
9
9
|
//# sourceMappingURL=guid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guid.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/guid.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"guid.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/guid.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACI,MAAM,IAAI,GAAG,CAAC,GAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAAhF,QAAA,IAAI,QAA4E"}
|
|
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./bufferToGuid.js"), exports);
|
|
17
18
|
__exportStar(require("./guid.js"), exports);
|
|
18
19
|
__exportStar(require("./getEventId.js"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,kDAAgC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sqlite/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,4CAA0B;AAC1B,kDAAgC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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("./recordSpanError.js"), exports);
|
|
18
|
+
__exportStar(require("./spanAttributes.js"), exports);
|
|
19
|
+
__exportStar(require("./spanContext.js"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,sDAAoC;AACpC,mDAAiC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.recordSpanError = recordSpanError;
|
|
4
|
+
/** SpanStatusCode.ERROR — inlined to avoid a runtime dependency on @opentelemetry/api */
|
|
5
|
+
const SPAN_STATUS_ERROR = 2;
|
|
6
|
+
/**
|
|
7
|
+
* Records the error on the provided span and marks the span status as ERROR.
|
|
8
|
+
* No-op when span is undefined.
|
|
9
|
+
*/
|
|
10
|
+
function recordSpanError(span, error) {
|
|
11
|
+
if (!span)
|
|
12
|
+
return;
|
|
13
|
+
span.recordException(error);
|
|
14
|
+
span.setStatus({
|
|
15
|
+
code: SPAN_STATUS_ERROR,
|
|
16
|
+
message: error instanceof Error ? error.message : String(error)
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=recordSpanError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordSpanError.js","sourceRoot":"","sources":["../../../src/telemetry/recordSpanError.ts"],"names":[],"mappings":";;AASA,0CASC;AAhBD,yFAAyF;AACzF,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAsB,EAAE,KAAc;IACrE,IAAI,CAAC,IAAI;QACR,OAAO;IAER,IAAI,CAAC,eAAe,CAAC,KAAY,CAAC,CAAC;IACnC,IAAI,CAAC,SAAS,CAAC;QACd,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAC/D,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.spanAttributes = spanAttributes;
|
|
4
|
+
const isSpanAttributeValue = (v) => typeof v === 'string'
|
|
5
|
+
|| typeof v === 'number'
|
|
6
|
+
|| typeof v === 'boolean';
|
|
7
|
+
/**
|
|
8
|
+
* Builds a `{ attributes }` object for use in `tracer.startSpan()` options,
|
|
9
|
+
* prefixing each key with `cqrs.<prefix>`.
|
|
10
|
+
* Entries with non-primitive values (not string/number/boolean) are omitted.
|
|
11
|
+
* An optional `keys` array limits which properties are included.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* tracer.startSpan('send', spanAttributes('command', cmd, ['type', 'aggregateId']), ctx)
|
|
15
|
+
*/
|
|
16
|
+
function spanAttributes(prefix, attrs, keys = Object.keys(attrs)) {
|
|
17
|
+
const attributes = {};
|
|
18
|
+
for (const key of keys) {
|
|
19
|
+
const value = attrs[key];
|
|
20
|
+
if (!isSpanAttributeValue(value))
|
|
21
|
+
continue;
|
|
22
|
+
attributes[`cqrs.${prefix}.${String(key)}`] = value;
|
|
23
|
+
}
|
|
24
|
+
return { attributes };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=spanAttributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spanAttributes.js","sourceRoot":"","sources":["../../../src/telemetry/spanAttributes.ts"],"names":[],"mappings":";;AAgBA,wCAiBC;AA/BD,MAAM,oBAAoB,GAAG,CAAC,CAAU,EAA2B,EAAE,CACpE,OAAO,CAAC,KAAK,QAAQ;OAClB,OAAO,CAAC,KAAK,QAAQ;OACrB,OAAO,CAAC,KAAK,SAAS,CAAC;AAE3B;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC7B,MAAc,EACd,KAAQ,EACR,OAAuB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAIzC,MAAM,UAAU,GAAuC,EAAE,CAAC;IAE1D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAC/B,SAAS;QAEV,UAAU,CAAC,QAAQ,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.spanContext = spanContext;
|
|
4
|
+
const node_module_1 = require("node:module");
|
|
5
|
+
let _api;
|
|
6
|
+
function getOtelApi() {
|
|
7
|
+
if (!_api) {
|
|
8
|
+
const _require = typeof require !== 'undefined' ? require : (0, node_module_1.createRequire)(`${process.cwd()}/`);
|
|
9
|
+
_api = _require('@opentelemetry/api');
|
|
10
|
+
}
|
|
11
|
+
return _api;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns the OTel context to use as the parent for a new span.
|
|
15
|
+
* If `meta.span` is present it is set as the active span on the current context;
|
|
16
|
+
* otherwise the current active context is returned unchanged.
|
|
17
|
+
*
|
|
18
|
+
* Imports `@opentelemetry/api` lazily so the core library has no hard runtime
|
|
19
|
+
* dependency on it — the browser bundle and environments without OTel stay lean.
|
|
20
|
+
*/
|
|
21
|
+
function spanContext(meta) {
|
|
22
|
+
const { trace, context } = getOtelApi();
|
|
23
|
+
return meta?.span ? trace.setSpan(context.active(), meta.span) : context.active();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=spanContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spanContext.js","sourceRoot":"","sources":["../../../src/telemetry/spanContext.ts"],"names":[],"mappings":";;AAqBA,kCAGC;AAvBD,6CAA4C;AAE5C,IAAI,IAAqD,CAAC;AAE1D,SAAS,UAAU;IAClB,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,2BAAa,EAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/F,IAAI,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAK,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,WAAW,CAAC,IAAsB;IACjD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACxC,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -3,15 +3,39 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MapAssertable = void 0;
|
|
4
4
|
class MapAssertable extends Map {
|
|
5
5
|
#usageCounter = new Map();
|
|
6
|
+
#factories = new Map();
|
|
6
7
|
/**
|
|
7
8
|
* Ensures the key exists in the map, creating it with the factory if needed, and increments its usage counter.
|
|
8
9
|
*/
|
|
9
10
|
assert(key, factory) {
|
|
10
|
-
if (!this.has(key))
|
|
11
|
+
if (!this.has(key) && !this.#factories.has(key))
|
|
11
12
|
this.set(key, factory());
|
|
12
13
|
this.#usageCounter.set(key, (this.#usageCounter.get(key) ?? 0) + 1);
|
|
14
|
+
return this.get(key);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Stores a factory that will be called lazily on first `get()`.
|
|
18
|
+
* If the entry is released before being accessed, the factory is never invoked.
|
|
19
|
+
*/
|
|
20
|
+
setLazy(key, factory) {
|
|
21
|
+
this.delete(key);
|
|
22
|
+
this.#factories.set(key, factory);
|
|
23
|
+
}
|
|
24
|
+
get(key) {
|
|
25
|
+
const factory = this.#factories.get(key);
|
|
26
|
+
if (factory) {
|
|
27
|
+
this.#factories.delete(key);
|
|
28
|
+
this.set(key, factory());
|
|
29
|
+
}
|
|
13
30
|
return super.get(key);
|
|
14
31
|
}
|
|
32
|
+
has(key) {
|
|
33
|
+
return super.has(key) || this.#factories.has(key);
|
|
34
|
+
}
|
|
35
|
+
delete(key) {
|
|
36
|
+
this.#factories.delete(key);
|
|
37
|
+
return super.delete(key);
|
|
38
|
+
}
|
|
15
39
|
/**
|
|
16
40
|
* Decrements the usage counter for the key and removes it from the map if no longer used.
|
|
17
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapAssertable.js","sourceRoot":"","sources":["../../../src/utils/MapAssertable.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"MapAssertable.js","sourceRoot":"","sources":["../../../src/utils/MapAssertable.ts"],"names":[],"mappings":";;;AAEA,MAAa,aAAoB,SAAQ,GAAS;IAEjD,aAAa,GAAG,IAAI,GAAG,EAAa,CAAC;IACrC,UAAU,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEtC;;OAEG;IACH,MAAM,CAAC,GAAM,EAAE,OAAgB;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,GAAM,EAAE,OAAgB;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAEQ,GAAG,CAAC,GAAM;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAEQ,GAAG,CAAC,GAAM;QAClB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAEQ,MAAM,CAAC,GAAM;QACrB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,GAAM;QACb,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;aACI,CAAC;YACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;CACD;AAzDD,sCAyDC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe } from "./Event.js";
|
|
2
2
|
import { InMemoryView } from "./in-memory/InMemoryView.js";
|
|
3
|
+
import { recordSpanError, spanAttributes, spanContext } from "./telemetry/index.js";
|
|
3
4
|
import { isViewLocker, isEventLocker } from "./interfaces/index.js";
|
|
4
5
|
import { getClassName, validateHandlers, getHandler, subscribe, getMessageHandlerNames, assertFunction } from "./utils/index.js";
|
|
5
6
|
/**
|
|
@@ -17,6 +18,8 @@ export class AbstractProjection {
|
|
|
17
18
|
#viewLocker;
|
|
18
19
|
#eventLocker;
|
|
19
20
|
_logger;
|
|
21
|
+
#serviceName;
|
|
22
|
+
#tracer;
|
|
20
23
|
/**
|
|
21
24
|
* The default view associated with the projection.
|
|
22
25
|
* Can optionally implement IViewLocker and/or IEventLocker.
|
|
@@ -50,11 +53,13 @@ export class AbstractProjection {
|
|
|
50
53
|
set _eventLocker(value) {
|
|
51
54
|
this.#eventLocker = value;
|
|
52
55
|
}
|
|
53
|
-
constructor({ view, viewLocker, eventLocker, logger } = {}) {
|
|
56
|
+
constructor({ view, viewLocker, eventLocker, tracerFactory, logger } = {}) {
|
|
54
57
|
validateHandlers(this);
|
|
55
58
|
this.#view = view;
|
|
56
59
|
this.#viewLocker = viewLocker;
|
|
57
60
|
this.#eventLocker = eventLocker;
|
|
61
|
+
this.#serviceName = getClassName(this);
|
|
62
|
+
this.#tracer = tracerFactory?.(this.#serviceName);
|
|
58
63
|
this._logger = logger && 'child' in logger ?
|
|
59
64
|
logger.child({ service: getClassName(this) }) :
|
|
60
65
|
logger;
|
|
@@ -75,7 +80,17 @@ export class AbstractProjection {
|
|
|
75
80
|
await this._viewLocker.once('ready');
|
|
76
81
|
this._logger?.debug(`view is ready, processing ${describe(event)}`);
|
|
77
82
|
}
|
|
78
|
-
|
|
83
|
+
const span = this.#tracer?.startSpan(`${this.#serviceName}.project ${event.type}`, spanAttributes('projection', event, ['type', 'aggregateId']), spanContext(meta));
|
|
84
|
+
try {
|
|
85
|
+
await this._project(event, meta);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
recordSpanError(span, error);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
span?.end();
|
|
93
|
+
}
|
|
79
94
|
}
|
|
80
95
|
/**
|
|
81
96
|
* Determines whether an event should be recorded as the last projected event (restore checkpoint).
|
|
@@ -109,11 +124,21 @@ export class AbstractProjection {
|
|
|
109
124
|
* won't be performed by another projection instance.
|
|
110
125
|
* */
|
|
111
126
|
async restore(eventStore) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
this.
|
|
127
|
+
const span = this.#tracer?.startSpan(`${this.#serviceName}.restore`);
|
|
128
|
+
try {
|
|
129
|
+
if (this._viewLocker)
|
|
130
|
+
await this._viewLocker.lock();
|
|
131
|
+
await this._restore(eventStore);
|
|
132
|
+
if (this._viewLocker)
|
|
133
|
+
this._viewLocker.unlock();
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
recordSpanError(span, error);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
span?.end();
|
|
141
|
+
}
|
|
117
142
|
}
|
|
118
143
|
/** Restore view state from not-yet-projected events */
|
|
119
144
|
async _restore(eventStore) {
|