@nimbus-cqrs/eventsourcingdb 2.5.0 → 3.0.0-beta.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.
Files changed (87) hide show
  1. package/README.md +82 -46
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -0
  6. package/{esm → dist}/lib/client.d.ts +28 -17
  7. package/{esm → dist}/lib/client.d.ts.map +1 -1
  8. package/{esm → dist}/lib/client.js +25 -19
  9. package/dist/lib/client.js.map +1 -0
  10. package/dist/lib/consumerRunner.d.ts +62 -0
  11. package/dist/lib/consumerRunner.d.ts.map +1 -0
  12. package/dist/lib/consumerRunner.js +386 -0
  13. package/dist/lib/consumerRunner.js.map +1 -0
  14. package/dist/lib/eventConsumer.d.ts +94 -0
  15. package/dist/lib/eventConsumer.d.ts.map +1 -0
  16. package/dist/lib/eventConsumer.js +2 -0
  17. package/dist/lib/eventConsumer.js.map +1 -0
  18. package/{esm → dist}/lib/eventMapping.d.ts +1 -1
  19. package/dist/lib/eventMapping.d.ts.map +1 -0
  20. package/{esm → dist}/lib/eventMapping.js +2 -1
  21. package/dist/lib/eventMapping.js.map +1 -0
  22. package/dist/lib/eventObserver.d.ts +158 -0
  23. package/dist/lib/eventObserver.d.ts.map +1 -0
  24. package/dist/lib/eventObserver.js +339 -0
  25. package/dist/lib/eventObserver.js.map +1 -0
  26. package/dist/lib/observerRegistry.d.ts +39 -0
  27. package/dist/lib/observerRegistry.d.ts.map +1 -0
  28. package/dist/lib/observerRegistry.js +56 -0
  29. package/dist/lib/observerRegistry.js.map +1 -0
  30. package/{esm → dist}/lib/readEvents.d.ts.map +1 -1
  31. package/{esm → dist}/lib/readEvents.js +3 -2
  32. package/dist/lib/readEvents.js.map +1 -0
  33. package/{esm → dist}/lib/tracing.d.ts.map +1 -1
  34. package/{esm → dist}/lib/tracing.js +2 -1
  35. package/dist/lib/tracing.js.map +1 -0
  36. package/dist/lib/writeEvents.d.ts +29 -0
  37. package/dist/lib/writeEvents.d.ts.map +1 -0
  38. package/dist/lib/writeEvents.js +47 -0
  39. package/dist/lib/writeEvents.js.map +1 -0
  40. package/package.json +32 -13
  41. package/src/index.ts +7 -0
  42. package/src/lib/client.ts +166 -0
  43. package/src/lib/consumerRunner.ts +592 -0
  44. package/src/lib/eventConsumer.ts +95 -0
  45. package/src/lib/eventMapping.ts +115 -0
  46. package/src/lib/eventObserver.ts +620 -0
  47. package/src/lib/observerRegistry.ts +69 -0
  48. package/src/lib/readEvents.ts +28 -0
  49. package/src/lib/tracing.ts +295 -0
  50. package/src/lib/writeEvents.ts +72 -0
  51. package/esm/_dnt.polyfills.d.ts +0 -7
  52. package/esm/_dnt.polyfills.d.ts.map +0 -1
  53. package/esm/_dnt.polyfills.js +0 -1
  54. package/esm/_dnt.shims.d.ts +0 -2
  55. package/esm/_dnt.shims.d.ts.map +0 -1
  56. package/esm/_dnt.shims.js +0 -57
  57. package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts +0 -700
  58. package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +0 -1
  59. package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.js +0 -903
  60. package/esm/deps/jsr.io/@std/ulid/1.0.0/_util.d.ts +0 -14
  61. package/esm/deps/jsr.io/@std/ulid/1.0.0/_util.d.ts.map +0 -1
  62. package/esm/deps/jsr.io/@std/ulid/1.0.0/_util.js +0 -65
  63. package/esm/deps/jsr.io/@std/ulid/1.0.0/decode_time.d.ts +0 -20
  64. package/esm/deps/jsr.io/@std/ulid/1.0.0/decode_time.d.ts.map +0 -1
  65. package/esm/deps/jsr.io/@std/ulid/1.0.0/decode_time.js +0 -43
  66. package/esm/deps/jsr.io/@std/ulid/1.0.0/mod.d.ts +0 -44
  67. package/esm/deps/jsr.io/@std/ulid/1.0.0/mod.d.ts.map +0 -1
  68. package/esm/deps/jsr.io/@std/ulid/1.0.0/mod.js +0 -47
  69. package/esm/deps/jsr.io/@std/ulid/1.0.0/monotonic_ulid.d.ts +0 -44
  70. package/esm/deps/jsr.io/@std/ulid/1.0.0/monotonic_ulid.d.ts.map +0 -1
  71. package/esm/deps/jsr.io/@std/ulid/1.0.0/monotonic_ulid.js +0 -51
  72. package/esm/deps/jsr.io/@std/ulid/1.0.0/ulid.d.ts +0 -31
  73. package/esm/deps/jsr.io/@std/ulid/1.0.0/ulid.d.ts.map +0 -1
  74. package/esm/deps/jsr.io/@std/ulid/1.0.0/ulid.js +0 -37
  75. package/esm/index.d.ts +0 -7
  76. package/esm/index.d.ts.map +0 -1
  77. package/esm/index.js +0 -6
  78. package/esm/lib/eventMapping.d.ts.map +0 -1
  79. package/esm/lib/eventObserver.d.ts +0 -133
  80. package/esm/lib/eventObserver.d.ts.map +0 -1
  81. package/esm/lib/eventObserver.js +0 -299
  82. package/esm/lib/writeEvents.d.ts +0 -11
  83. package/esm/lib/writeEvents.d.ts.map +0 -1
  84. package/esm/lib/writeEvents.js +0 -28
  85. package/esm/package.json +0 -3
  86. /package/{esm → dist}/lib/readEvents.d.ts +0 -0
  87. /package/{esm → dist}/lib/tracing.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/lib/tracing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Event } from '@nimbus-cqrs/core';
2
+ import type { Event as EventSourcingDBEvent, Precondition } from 'eventsourcingdb';
3
+ /**
4
+ * Writes one or more Nimbus events to EventSourcingDB. Each event is
5
+ * converted into an EventSourcingDB event candidate before being persisted.
6
+ *
7
+ * Returns the written EventSourcingDB events including the fields assigned
8
+ * by the server (`id`, `time`, `hash`, ...). The `id` of the last written
9
+ * event is the new revision of the subject and can be used with the
10
+ * `isSubjectOnEventId` precondition for subsequent writes.
11
+ *
12
+ * The SDK never retries a write on its own. Errors are passed through:
13
+ * - A `DbApiError` (from `eventsourcingdb`) when the server rejects the
14
+ * write, e.g. with `code === ErrorCode.preconditionViolated` when a
15
+ * precondition does not hold.
16
+ * - An `OutcomeUnknownError` when the write may have been stored although
17
+ * the response was lost (stalled connection, abort after sending, ...).
18
+ * Its `cause` holds the original error. Read the subject back before
19
+ * writing again.
20
+ *
21
+ * @param events - The Nimbus events to write.
22
+ * @param preconditions - Optional preconditions that must be met for the write to succeed.
23
+ * @param signal - An optional abort signal to cancel the write. Aborting
24
+ * after the request has been sent does not undo the write; the call then
25
+ * throws an `OutcomeUnknownError`.
26
+ * @returns The written EventSourcingDB events.
27
+ */
28
+ export declare const writeEvents: (events: Event[], preconditions?: Precondition[], signal?: AbortSignal) => Promise<EventSourcingDBEvent[]>;
29
+ //# sourceMappingURL=writeEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeEvents.d.ts","sourceRoot":"","sources":["../../src/lib/writeEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAER,KAAK,IAAI,oBAAoB,EAC7B,YAAY,EACf,MAAM,iBAAiB,CAAC;AAazB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW,GACpB,QAAQ,KAAK,EAAE,EACf,gBAAgB,YAAY,EAAE,EAC9B,SAAS,WAAW,KACrB,OAAO,CAAC,oBAAoB,EAAE,CAuBhC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { context, propagation } from '@opentelemetry/api';
2
+ import { getEventSourcingDBClient } from "./client.js";
3
+ import { nimbusEventToEventSourcingDBEventCandidate } from "./eventMapping.js";
4
+ import { eventSizeBytes, withSpan } from "./tracing.js";
5
+ const textEncoder = new TextEncoder();
6
+ /**
7
+ * Returns the UTF-8 byte length of a serialized Nimbus event.
8
+ */
9
+ const getEventSizeBytes = (event) => textEncoder.encode(JSON.stringify(event)).length;
10
+ /**
11
+ * Writes one or more Nimbus events to EventSourcingDB. Each event is
12
+ * converted into an EventSourcingDB event candidate before being persisted.
13
+ *
14
+ * Returns the written EventSourcingDB events including the fields assigned
15
+ * by the server (`id`, `time`, `hash`, ...). The `id` of the last written
16
+ * event is the new revision of the subject and can be used with the
17
+ * `isSubjectOnEventId` precondition for subsequent writes.
18
+ *
19
+ * The SDK never retries a write on its own. Errors are passed through:
20
+ * - A `DbApiError` (from `eventsourcingdb`) when the server rejects the
21
+ * write, e.g. with `code === ErrorCode.preconditionViolated` when a
22
+ * precondition does not hold.
23
+ * - An `OutcomeUnknownError` when the write may have been stored although
24
+ * the response was lost (stalled connection, abort after sending, ...).
25
+ * Its `cause` holds the original error. Read the subject back before
26
+ * writing again.
27
+ *
28
+ * @param events - The Nimbus events to write.
29
+ * @param preconditions - Optional preconditions that must be met for the write to succeed.
30
+ * @param signal - An optional abort signal to cancel the write. Aborting
31
+ * after the request has been sent does not undo the write; the call then
32
+ * throws an `OutcomeUnknownError`.
33
+ * @returns The written EventSourcingDB events.
34
+ */
35
+ export const writeEvents = (events, preconditions, signal) => {
36
+ return withSpan('writeEvents', async () => {
37
+ const eventSourcingDBClient = getEventSourcingDBClient();
38
+ const carrier = {};
39
+ propagation.inject(context.active(), carrier);
40
+ const eventCandidates = events.map((event) => {
41
+ eventSizeBytes.record(getEventSizeBytes(event));
42
+ return nimbusEventToEventSourcingDBEventCandidate(event, carrier.traceparent, carrier.tracestate);
43
+ });
44
+ return await eventSourcingDBClient.writeEvents(eventCandidates, preconditions, signal);
45
+ });
46
+ };
47
+ //# sourceMappingURL=writeEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeEvents.js","sourceRoot":"","sources":["../../src/lib/writeEvents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAM1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,0CAA0C,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAU,EAAE,CAC/C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,MAAe,EACf,aAA8B,EAC9B,MAAoB,EACW,EAAE;IACjC,OAAO,QAAQ,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,qBAAqB,GAAG,wBAAwB,EAAE,CAAC;QAEzD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,eAAe,GAAqB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3D,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YAEhD,OAAO,0CAA0C,CAC7C,KAAK,EACL,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,UAAU,CACrB,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,qBAAqB,CAAC,WAAW,CAC1C,eAAe,EACf,aAAa,EACb,MAAM,CACT,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nimbus-cqrs/eventsourcingdb",
3
- "version": "2.5.0",
3
+ "version": "3.0.0-beta.1",
4
4
  "description": "Simplify Event-Driven Applications - EventSourcingDB integration for the Nimbus framework.",
5
5
  "keywords": [
6
6
  "nimbus",
@@ -13,34 +13,53 @@
13
13
  "event-store",
14
14
  "event-stream"
15
15
  ],
16
+ "license": "Apache-2.0",
16
17
  "author": "Daniel Gördes <d.goerdes@overlap.at> (https://overlap.at)",
17
18
  "homepage": "https://nimbus.overlap.at",
18
19
  "repository": {
19
20
  "type": "git",
20
- "url": "https://github.com/overlap-dev/Nimbus"
21
+ "url": "https://github.com/overlap-dev/Nimbus",
22
+ "directory": "packages/eventsourcingdb"
21
23
  },
22
- "license": "Apache-2.0",
23
24
  "bugs": {
24
25
  "url": "https://github.com/overlap-dev/Nimbus/issues"
25
26
  },
26
- "module": "./esm/index.js",
27
+ "type": "module",
27
28
  "exports": {
28
29
  ".": {
29
- "import": "./esm/index.js"
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.js"
30
32
  }
31
33
  },
32
- "scripts": {},
34
+ "files": [
35
+ "dist",
36
+ "src",
37
+ "!src/**/*.test.ts",
38
+ "!src/**/*.metrics_worker.ts"
39
+ ],
33
40
  "engines": {
34
- "node": ">=20"
41
+ "node": ">=24"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
35
45
  },
36
46
  "dependencies": {
47
+ "@nimbus-cqrs/core": "^3.0.0-beta.1",
37
48
  "@opentelemetry/api": "^1.9.1",
38
- "eventsourcingdb": "^1.9.1",
39
- "zod": "^4.4.3",
40
- "@nimbus-cqrs/core": "^2.5.0"
49
+ "ulid": "^3.0.2"
50
+ },
51
+ "peerDependencies": {
52
+ "eventsourcingdb": "^2.0.0"
41
53
  },
42
54
  "devDependencies": {
43
- "@types/node": "^22.0.0"
55
+ "@opentelemetry/sdk-metrics": "^3.0.0",
56
+ "@types/node": "^26.6.5",
57
+ "eventsourcingdb": "^2.2.3",
58
+ "typescript": "^5.9.3"
44
59
  },
45
- "_generatedBy": "dnt@dev"
46
- }
60
+ "scripts": {
61
+ "build": "tsc -p tsconfig.build.json",
62
+ "check": "tsc --noEmit",
63
+ "test": "node --test --test-force-exit"
64
+ }
65
+ }
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './lib/client.ts';
2
+ export * from './lib/eventConsumer.ts';
3
+ export * from './lib/eventMapping.ts';
4
+ export * from './lib/eventObserver.ts';
5
+ export * from './lib/observerRegistry.ts';
6
+ export * from './lib/readEvents.ts';
7
+ export * from './lib/writeEvents.ts';
@@ -0,0 +1,166 @@
1
+ import { GenericException, getLogger } from '@nimbus-cqrs/core';
2
+ import { Client } from 'eventsourcingdb';
3
+ import { type EventObserver, initEventObserver } from './eventObserver.ts';
4
+
5
+ let eventSourcingDBClient: Client | null = null;
6
+
7
+ /**
8
+ * Configuration options for setting up the EventSourcingDB client.
9
+ */
10
+ export type SetupEventSourcingDBClientInput = {
11
+ /**
12
+ * The URL of the EventSourcingDB server.
13
+ */
14
+ url: URL;
15
+ /**
16
+ * The API token for authenticating with EventSourcingDB.
17
+ */
18
+ apiToken: string;
19
+ /**
20
+ * The stall timeout in milliseconds. A request fails with a
21
+ * `ConnectionStalledError` once nothing arrives from the server for
22
+ * this long. Every item received (events, rows, heartbeats) resets the
23
+ * timer, so long-running streams are never cut off while they are
24
+ * healthy. Defaults to 30000ms (the SDK default).
25
+ */
26
+ stallTimeout?: number;
27
+ /**
28
+ * An optional array of event observers to observe events.
29
+ */
30
+ eventObservers?: EventObserver[];
31
+ };
32
+
33
+ /**
34
+ * Initialize and configure the EventSourcingDB client.
35
+ *
36
+ * This function creates a singleton client instance, verifies connectivity by pinging
37
+ * the server, and validates the provided API token. It should be called once at
38
+ * application startup before using {@link getEventSourcingDBClient}.
39
+ *
40
+ * Optionally, you can provide event observers. They are started one after
41
+ * another once the client is initialized. Each one loads its consumers'
42
+ * checkpoints before the function resolves, so a checkpoint store that
43
+ * cannot be reached fails the setup.
44
+ *
45
+ * @param {SetupEventSourcingDBClientInput} options - The configuration options
46
+ * @param {URL} options.url - The URL of the EventSourcingDB server
47
+ * @param {string} options.apiToken - The API token for authentication
48
+ * @param {number} [options.stallTimeout] - Optional stall timeout in milliseconds (defaults to 30000)
49
+ * @param {EventObserver[]} [options.eventObservers] - Optional array of event observers
50
+ *
51
+ * @throws {GenericException} If the connection to EventSourcingDB fails
52
+ * @throws {GenericException} If the API token is invalid
53
+ * @throws {GenericException} If an event observer cannot be started
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * import { InMemoryCheckpointStore } from '@nimbus-cqrs/core';
58
+ * import { setupEventSourcingDBClient } from '@nimbus-cqrs/eventsourcingdb';
59
+ *
60
+ * await setupEventSourcingDBClient({
61
+ * url: new URL(process.env.ESDB_URL ?? ''),
62
+ * apiToken: process.env.ESDB_API_TOKEN ?? '',
63
+ * eventObservers: [
64
+ * {
65
+ * name: 'users',
66
+ * subject: '/users',
67
+ * recursive: true,
68
+ * checkpointStore: new InMemoryCheckpointStore(),
69
+ * consumers: [
70
+ * {
71
+ * name: 'users.projection',
72
+ * handles: (event) => event.type.startsWith('io.nimbus.users.'),
73
+ * handle: async (event) => {
74
+ * console.log('Received event:', event);
75
+ * },
76
+ * },
77
+ * ],
78
+ * connectionRetryOptions: {
79
+ * maxRetries: 3,
80
+ * initialRetryDelayMs: 3000,
81
+ * },
82
+ * handlerRetryOptions: {
83
+ * maxRetries: 3,
84
+ * initialRetryDelayMs: 3000,
85
+ * },
86
+ * },
87
+ * ],
88
+ * });
89
+ * ```
90
+ */
91
+ export const setupEventSourcingDBClient = async ({
92
+ url,
93
+ apiToken,
94
+ stallTimeout,
95
+ eventObservers,
96
+ }: SetupEventSourcingDBClientInput): Promise<void> => {
97
+ eventSourcingDBClient = new Client(
98
+ url,
99
+ apiToken,
100
+ stallTimeout !== undefined ? { stallTimeout } : undefined,
101
+ );
102
+
103
+ try {
104
+ await eventSourcingDBClient.ping();
105
+ } catch (error) {
106
+ getLogger().critical({
107
+ category: 'Nimbus',
108
+ message: 'Could not connect to EventSourcingDB',
109
+ error: error as Error,
110
+ });
111
+ throw new GenericException('Could not connect to EventSourcingDB');
112
+ }
113
+
114
+ try {
115
+ await eventSourcingDBClient.verifyApiToken();
116
+ } catch (error) {
117
+ getLogger().error({
118
+ category: 'Nimbus',
119
+ message: 'Invalid API token. Please check your API token.',
120
+ error: error as Error,
121
+ });
122
+ throw new GenericException(
123
+ 'Invalid API token. Please check your API token.',
124
+ );
125
+ }
126
+
127
+ getLogger().info({
128
+ category: 'Nimbus',
129
+ message: 'EventSourcingDB client initialized successfully',
130
+ });
131
+
132
+ if (eventObservers?.length) {
133
+ // Sequential on purpose: observers register in declaration order
134
+ // and the first one that cannot start fails the setup.
135
+ for (const eventObserver of eventObservers) {
136
+ await initEventObserver(eventObserver); // NOSONAR
137
+ }
138
+ }
139
+ };
140
+
141
+ /**
142
+ * Get the EventSourcingDB client instance.
143
+ *
144
+ * Returns the singleton client instance that was created by {@link setupEventSourcingDBClient}.
145
+ * This function must be called after the client has been initialized.
146
+ *
147
+ * @returns {Client} The EventSourcingDB client instance
148
+ *
149
+ * @throws {GenericException} If the client has not been initialized via setupEventSourcingDBClient
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * import { getEventSourcingDBClient } from '@nimbus-cqrs/eventsourcingdb';
154
+ *
155
+ * const client = getEventSourcingDBClient();
156
+ * ```
157
+ */
158
+ export const getEventSourcingDBClient = (): Client => {
159
+ if (!eventSourcingDBClient) {
160
+ throw new GenericException(
161
+ 'EventSourcingDB client not yet initialized. Please call setupEventSourcingDBClient() first.',
162
+ );
163
+ }
164
+
165
+ return eventSourcingDBClient;
166
+ };