@nimbus-cqrs/eventsourcingdb 2.4.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.
- package/README.md +82 -46
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/{esm → dist}/lib/client.d.ts +28 -17
- package/{esm → dist}/lib/client.d.ts.map +1 -1
- package/{esm → dist}/lib/client.js +25 -19
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/consumerRunner.d.ts +62 -0
- package/dist/lib/consumerRunner.d.ts.map +1 -0
- package/dist/lib/consumerRunner.js +386 -0
- package/dist/lib/consumerRunner.js.map +1 -0
- package/dist/lib/eventConsumer.d.ts +94 -0
- package/dist/lib/eventConsumer.d.ts.map +1 -0
- package/dist/lib/eventConsumer.js +2 -0
- package/dist/lib/eventConsumer.js.map +1 -0
- package/{esm → dist}/lib/eventMapping.d.ts +1 -1
- package/dist/lib/eventMapping.d.ts.map +1 -0
- package/{esm → dist}/lib/eventMapping.js +2 -1
- package/dist/lib/eventMapping.js.map +1 -0
- package/dist/lib/eventObserver.d.ts +158 -0
- package/dist/lib/eventObserver.d.ts.map +1 -0
- package/dist/lib/eventObserver.js +339 -0
- package/dist/lib/eventObserver.js.map +1 -0
- package/dist/lib/observerRegistry.d.ts +39 -0
- package/dist/lib/observerRegistry.d.ts.map +1 -0
- package/dist/lib/observerRegistry.js +56 -0
- package/dist/lib/observerRegistry.js.map +1 -0
- package/{esm → dist}/lib/readEvents.d.ts.map +1 -1
- package/{esm → dist}/lib/readEvents.js +3 -2
- package/dist/lib/readEvents.js.map +1 -0
- package/{esm → dist}/lib/tracing.d.ts +3 -0
- package/dist/lib/tracing.d.ts.map +1 -0
- package/{esm → dist}/lib/tracing.js +5 -1
- package/dist/lib/tracing.js.map +1 -0
- package/dist/lib/writeEvents.d.ts +29 -0
- package/dist/lib/writeEvents.d.ts.map +1 -0
- package/dist/lib/writeEvents.js +47 -0
- package/dist/lib/writeEvents.js.map +1 -0
- package/package.json +32 -13
- package/src/index.ts +7 -0
- package/src/lib/client.ts +166 -0
- package/src/lib/consumerRunner.ts +592 -0
- package/src/lib/eventConsumer.ts +95 -0
- package/src/lib/eventMapping.ts +115 -0
- package/src/lib/eventObserver.ts +620 -0
- package/src/lib/observerRegistry.ts +69 -0
- package/src/lib/readEvents.ts +28 -0
- package/src/lib/tracing.ts +295 -0
- package/src/lib/writeEvents.ts +72 -0
- package/esm/_dnt.polyfills.d.ts +0 -7
- package/esm/_dnt.polyfills.d.ts.map +0 -1
- package/esm/_dnt.polyfills.js +0 -1
- package/esm/_dnt.shims.d.ts +0 -2
- package/esm/_dnt.shims.d.ts.map +0 -1
- package/esm/_dnt.shims.js +0 -57
- package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts +0 -700
- package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.js +0 -903
- package/esm/deps/jsr.io/@std/ulid/1.0.0/_util.d.ts +0 -14
- package/esm/deps/jsr.io/@std/ulid/1.0.0/_util.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/ulid/1.0.0/_util.js +0 -65
- package/esm/deps/jsr.io/@std/ulid/1.0.0/decode_time.d.ts +0 -20
- package/esm/deps/jsr.io/@std/ulid/1.0.0/decode_time.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/ulid/1.0.0/decode_time.js +0 -43
- package/esm/deps/jsr.io/@std/ulid/1.0.0/mod.d.ts +0 -44
- package/esm/deps/jsr.io/@std/ulid/1.0.0/mod.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/ulid/1.0.0/mod.js +0 -47
- package/esm/deps/jsr.io/@std/ulid/1.0.0/monotonic_ulid.d.ts +0 -44
- package/esm/deps/jsr.io/@std/ulid/1.0.0/monotonic_ulid.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/ulid/1.0.0/monotonic_ulid.js +0 -51
- package/esm/deps/jsr.io/@std/ulid/1.0.0/ulid.d.ts +0 -31
- package/esm/deps/jsr.io/@std/ulid/1.0.0/ulid.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/ulid/1.0.0/ulid.js +0 -37
- package/esm/index.d.ts +0 -7
- package/esm/index.d.ts.map +0 -1
- package/esm/index.js +0 -6
- package/esm/lib/eventMapping.d.ts.map +0 -1
- package/esm/lib/eventObserver.d.ts +0 -133
- package/esm/lib/eventObserver.d.ts.map +0 -1
- package/esm/lib/eventObserver.js +0 -291
- package/esm/lib/tracing.d.ts.map +0 -1
- package/esm/lib/writeEvents.d.ts +0 -11
- package/esm/lib/writeEvents.d.ts.map +0 -1
- package/esm/lib/writeEvents.js +0 -31
- package/esm/package.json +0 -3
- /package/{esm → dist}/lib/readEvents.d.ts +0 -0
package/esm/lib/eventObserver.js
DELETED
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
import { calculateBackoffDelay as coreCalculateBackoffDelay, getLogger, withRetry, } from '@nimbus-cqrs/core';
|
|
2
|
-
import { SpanStatusCode } from '@opentelemetry/api';
|
|
3
|
-
import { getEventSourcingDBClient } from './client.js';
|
|
4
|
-
import { isEventData } from './eventMapping.js';
|
|
5
|
-
import { observerConnectionReconnectsCounter, observerConnectionRetryAttemptsCounter, observerEventsHandledCounter, observerHandlerRetryAttemptsCounter, observerHandlingDuration, withObserveEventSpan, } from './tracing.js';
|
|
6
|
-
const DEFAULT_RETRY_OPTIONS = {
|
|
7
|
-
maxRetries: 3,
|
|
8
|
-
initialRetryDelayMs: 3000,
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Returns a promise that resolves after the given number of milliseconds.
|
|
12
|
-
*/
|
|
13
|
-
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
-
/**
|
|
15
|
-
* Calculates an exponential backoff delay with jitter for a given
|
|
16
|
-
* retry attempt. The jitter adds up to 30% of the base delay to
|
|
17
|
-
* avoid thundering-herd effects.
|
|
18
|
-
*
|
|
19
|
-
* @param initialDelayMs - The base delay in milliseconds before
|
|
20
|
-
* exponential scaling.
|
|
21
|
-
* @param attempt - The zero-based retry attempt number.
|
|
22
|
-
* @returns The backoff delay in milliseconds.
|
|
23
|
-
*
|
|
24
|
-
* @deprecated Import {@link calculateBackoffDelay} from
|
|
25
|
-
* `@nimbus-cqrs/core` instead. This wrapper keeps the historical
|
|
26
|
-
* 30% jitter default used by EventSourcingDB observers.
|
|
27
|
-
*/
|
|
28
|
-
export const calculateBackoffDelay = (initialDelayMs, attempt) => coreCalculateBackoffDelay(initialDelayMs, attempt, {
|
|
29
|
-
jitterFactor: 0.3,
|
|
30
|
-
maxDelayMs: Infinity,
|
|
31
|
-
});
|
|
32
|
-
/**
|
|
33
|
-
* Resolves connection retry options, preferring
|
|
34
|
-
* {@link EventObserver.connectionRetryOptions} over the deprecated
|
|
35
|
-
* {@link EventObserver.retryOptions}.
|
|
36
|
-
*/
|
|
37
|
-
const resolveConnectionRetryOptions = (eventObserver) => ({
|
|
38
|
-
maxRetries: eventObserver.connectionRetryOptions?.maxRetries ??
|
|
39
|
-
eventObserver.retryOptions?.maxRetries ??
|
|
40
|
-
DEFAULT_RETRY_OPTIONS.maxRetries,
|
|
41
|
-
initialRetryDelayMs: eventObserver.connectionRetryOptions?.initialRetryDelayMs ??
|
|
42
|
-
eventObserver.retryOptions?.initialRetryDelayMs ??
|
|
43
|
-
DEFAULT_RETRY_OPTIONS.initialRetryDelayMs,
|
|
44
|
-
});
|
|
45
|
-
/**
|
|
46
|
-
* Resolves handler retry options from {@link EventObserver.handlerRetryOptions}.
|
|
47
|
-
*/
|
|
48
|
-
const resolveHandlerRetryOptions = (eventObserver) => ({
|
|
49
|
-
maxRetries: eventObserver.handlerRetryOptions?.maxRetries ??
|
|
50
|
-
DEFAULT_RETRY_OPTIONS.maxRetries,
|
|
51
|
-
initialRetryDelayMs: eventObserver.handlerRetryOptions?.initialRetryDelayMs ??
|
|
52
|
-
DEFAULT_RETRY_OPTIONS.initialRetryDelayMs,
|
|
53
|
-
});
|
|
54
|
-
/**
|
|
55
|
-
* Logs an informational message when an event observer connects or
|
|
56
|
-
* reconnects to EventSourcingDB. When {@link retryCount} is greater
|
|
57
|
-
* than zero the message indicates a successful reconnection.
|
|
58
|
-
*
|
|
59
|
-
* @param subject - The observed subject.
|
|
60
|
-
* @param retryCount - The number of retries that preceded this
|
|
61
|
-
* connection (0 for the initial connection).
|
|
62
|
-
* @param data - Additional context logged alongside the message.
|
|
63
|
-
*/
|
|
64
|
-
const logObserverConnection = (subject, retryCount, data) => {
|
|
65
|
-
const retryLabel = retryCount === 1 ? 'retry' : 'retries';
|
|
66
|
-
const message = retryCount > 0
|
|
67
|
-
? `Reconnected event observer for subject "${subject}" after ${retryCount} ${retryLabel}`
|
|
68
|
-
: `Observing events for subject "${subject}"`;
|
|
69
|
-
getLogger().info({ category: 'Nimbus', message, data });
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* Handles a connection / stream error by logging it and waiting with
|
|
73
|
-
* exponential backoff before the next reconnect attempt. When the
|
|
74
|
-
* maximum number of retries is exceeded a critical log entry is
|
|
75
|
-
* emitted and no further retries are attempted.
|
|
76
|
-
*
|
|
77
|
-
* @param error - The error that caused the observer to disconnect.
|
|
78
|
-
* @param subject - The observed subject.
|
|
79
|
-
* @param retryCount - The current (1-based) retry attempt number.
|
|
80
|
-
* @param maxRetries - The maximum number of allowed retries.
|
|
81
|
-
* @param initialRetryDelayMs - The base delay used for exponential
|
|
82
|
-
* backoff calculation.
|
|
83
|
-
* @returns `true` if the observer should retry, `false` if retries
|
|
84
|
-
* are exhausted.
|
|
85
|
-
*/
|
|
86
|
-
const handleConnectionError = async (error, subject, retryCount, maxRetries, initialRetryDelayMs) => {
|
|
87
|
-
if (retryCount > maxRetries) {
|
|
88
|
-
getLogger().critical({
|
|
89
|
-
category: 'Nimbus',
|
|
90
|
-
message: `Failed to observe events for subject "${subject}" after ${maxRetries} ${maxRetries === 1 ? 'retry' : 'retries'}.`,
|
|
91
|
-
});
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
observerConnectionRetryAttemptsCounter.add(1, { subject });
|
|
95
|
-
const backoffDelay = calculateBackoffDelay(initialRetryDelayMs, retryCount - 1);
|
|
96
|
-
getLogger().error({
|
|
97
|
-
category: 'Nimbus',
|
|
98
|
-
message: `Error observing events for subject "${subject}" (retry ${retryCount}/${maxRetries}), retrying in ${backoffDelay}ms`,
|
|
99
|
-
error: error,
|
|
100
|
-
});
|
|
101
|
-
await delay(backoffDelay);
|
|
102
|
-
return true;
|
|
103
|
-
};
|
|
104
|
-
const recordHandlerMetrics = (metricLabels, status, startTime) => {
|
|
105
|
-
observerEventsHandledCounter.add(1, { ...metricLabels, status });
|
|
106
|
-
observerHandlingDuration.record((performance.now() - startTime) / 1000, metricLabels);
|
|
107
|
-
};
|
|
108
|
-
/**
|
|
109
|
-
* Invokes the event handler with in-place retries. Does not reconnect
|
|
110
|
-
* the observe stream. When all retries are exhausted, calls
|
|
111
|
-
* {@link EventObserver.onHandlerError} or logs critically, then
|
|
112
|
-
* returns without throwing so the observer can skip the event.
|
|
113
|
-
*/
|
|
114
|
-
const handleEventWithRetry = async (eventObserver, event, handlerRetryOptions, span, startTime) => {
|
|
115
|
-
const { maxRetries, initialRetryDelayMs } = handlerRetryOptions;
|
|
116
|
-
const metricLabels = {
|
|
117
|
-
subject: eventObserver.subject,
|
|
118
|
-
event_type: event.type,
|
|
119
|
-
};
|
|
120
|
-
try {
|
|
121
|
-
await withRetry(() => eventObserver.eventHandler(event), {
|
|
122
|
-
maxRetries,
|
|
123
|
-
initialDelayMs: initialRetryDelayMs,
|
|
124
|
-
maxDelayMs: Infinity,
|
|
125
|
-
jitterFactor: 0.3,
|
|
126
|
-
onRetry: ({ error, attempt, delayMs }) => {
|
|
127
|
-
observerHandlerRetryAttemptsCounter.add(1, metricLabels);
|
|
128
|
-
span.addEvent('retry', {
|
|
129
|
-
attempt,
|
|
130
|
-
delay_ms: delayMs,
|
|
131
|
-
});
|
|
132
|
-
getLogger().error({
|
|
133
|
-
category: 'Nimbus',
|
|
134
|
-
message: `Error handling event "${event.id}" (${event.type}) for subject "${eventObserver.subject}" (retry ${attempt}/${maxRetries}), retrying in ${delayMs}ms`,
|
|
135
|
-
error,
|
|
136
|
-
...(isEventData(event.data)
|
|
137
|
-
? {
|
|
138
|
-
correlationId: event.data.nimbusMeta.correlationid,
|
|
139
|
-
}
|
|
140
|
-
: {}),
|
|
141
|
-
});
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
recordHandlerMetrics(metricLabels, 'success', startTime);
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
const handlerError = error instanceof Error
|
|
148
|
-
? error
|
|
149
|
-
: new Error(String(error));
|
|
150
|
-
recordHandlerMetrics(metricLabels, 'skipped', startTime);
|
|
151
|
-
span.setStatus({
|
|
152
|
-
code: SpanStatusCode.ERROR,
|
|
153
|
-
message: handlerError.message,
|
|
154
|
-
});
|
|
155
|
-
span.recordException(handlerError);
|
|
156
|
-
await handleHandlerExhausted(eventObserver, event, handlerError, maxRetries);
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
/**
|
|
160
|
-
* Handles exhausted handler retries by invoking
|
|
161
|
-
* {@link EventObserver.onHandlerError} or emitting a critical log.
|
|
162
|
-
*/
|
|
163
|
-
const handleHandlerExhausted = async (eventObserver, event, handlerError, maxRetries) => {
|
|
164
|
-
if (eventObserver.onHandlerError) {
|
|
165
|
-
try {
|
|
166
|
-
await eventObserver.onHandlerError(handlerError, event);
|
|
167
|
-
}
|
|
168
|
-
catch (err) {
|
|
169
|
-
// Isolate user callback failures so the poison
|
|
170
|
-
// event is still skipped and observation continues.
|
|
171
|
-
const callbackError = err instanceof Error
|
|
172
|
-
? err
|
|
173
|
-
: new Error(String(err));
|
|
174
|
-
getLogger().critical({
|
|
175
|
-
category: 'Nimbus',
|
|
176
|
-
message: `onHandlerError failed for event "${event.id}" (${event.type}) for subject "${eventObserver.subject}". Skipping event.`,
|
|
177
|
-
error: callbackError,
|
|
178
|
-
...(isEventData(event.data)
|
|
179
|
-
? {
|
|
180
|
-
correlationId: event.data.nimbusMeta.correlationid,
|
|
181
|
-
}
|
|
182
|
-
: {}),
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
getLogger().critical({
|
|
188
|
-
category: 'Nimbus',
|
|
189
|
-
message: `Failed to handle event "${event.id}" (${event.type}) for subject "${eventObserver.subject}" after ${maxRetries} ${maxRetries === 1 ? 'retry' : 'retries'}. Skipping event.`,
|
|
190
|
-
error: handlerError,
|
|
191
|
-
...(isEventData(event.data)
|
|
192
|
-
? {
|
|
193
|
-
correlationId: event.data.nimbusMeta.correlationid,
|
|
194
|
-
}
|
|
195
|
-
: {}),
|
|
196
|
-
});
|
|
197
|
-
};
|
|
198
|
-
/**
|
|
199
|
-
* Starts observing events for the given {@link EventObserver} with
|
|
200
|
-
* automatic reconnection on stream failure and separate in-place
|
|
201
|
-
* retries for handler failures.
|
|
202
|
-
*
|
|
203
|
-
* Events are consumed from the stream and each one is passed to the
|
|
204
|
-
* observer's event handler inside an OpenTelemetry span. If the event
|
|
205
|
-
* carries a `traceparent`, the span is linked to the original writer's
|
|
206
|
-
* trace for end-to-end distributed tracing.
|
|
207
|
-
*
|
|
208
|
-
* Handler failures are retried without reconnecting. After handler
|
|
209
|
-
* retries are exhausted the event is skipped (lower bound advanced)
|
|
210
|
-
* so observation can continue. When the connection drops, exponential
|
|
211
|
-
* backoff with jitter is applied up to the configured maximum number
|
|
212
|
-
* of connection retries.
|
|
213
|
-
*
|
|
214
|
-
* @param eventObserver - The event observer configuration.
|
|
215
|
-
* @returns A promise that resolves when the observe stream ends or
|
|
216
|
-
* connection retries are exhausted.
|
|
217
|
-
*/
|
|
218
|
-
export const observeWithRetry = async (eventObserver) => {
|
|
219
|
-
const connectionRetryOptions = resolveConnectionRetryOptions(eventObserver);
|
|
220
|
-
const handlerRetryOptions = resolveHandlerRetryOptions(eventObserver);
|
|
221
|
-
let connectionRetryCount = 0;
|
|
222
|
-
let lastProcessedEventId;
|
|
223
|
-
while (true) {
|
|
224
|
-
try {
|
|
225
|
-
// Resolve the client on every attempt so a re-initialized
|
|
226
|
-
// singleton is picked up after reconnecting to EventSourcingDB.
|
|
227
|
-
const eventSourcingDBClient = getEventSourcingDBClient();
|
|
228
|
-
// Once we have a concrete position, use it as lower bound and
|
|
229
|
-
// drop fromLatestEvent; otherwise fall back to the original options.
|
|
230
|
-
const lowerBound = lastProcessedEventId
|
|
231
|
-
? { id: lastProcessedEventId, type: 'exclusive' }
|
|
232
|
-
: eventObserver.lowerBound;
|
|
233
|
-
const fromLatestEvent = lastProcessedEventId
|
|
234
|
-
? undefined
|
|
235
|
-
: eventObserver.fromLatestEvent;
|
|
236
|
-
logObserverConnection(eventObserver.subject, connectionRetryCount, {
|
|
237
|
-
recursive: eventObserver.recursive ?? false,
|
|
238
|
-
lowerBound,
|
|
239
|
-
fromLatestEvent,
|
|
240
|
-
});
|
|
241
|
-
for await (const event of eventSourcingDBClient.observeEvents(eventObserver.subject, {
|
|
242
|
-
recursive: eventObserver.recursive ?? false,
|
|
243
|
-
...(lowerBound ? { lowerBound } : {}),
|
|
244
|
-
...(fromLatestEvent ? { fromLatestEvent } : {}),
|
|
245
|
-
})) {
|
|
246
|
-
// Stream is healthy once events flow again. Count a successful
|
|
247
|
-
// reconnect only here so failed reconnect attempts are excluded.
|
|
248
|
-
if (connectionRetryCount > 0) {
|
|
249
|
-
observerConnectionReconnectsCounter.add(1, {
|
|
250
|
-
subject: eventObserver.subject,
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
connectionRetryCount = 0;
|
|
254
|
-
const traceContext = event.traceparent
|
|
255
|
-
? {
|
|
256
|
-
traceparent: event.traceparent,
|
|
257
|
-
tracestate: event.tracestate,
|
|
258
|
-
}
|
|
259
|
-
: undefined;
|
|
260
|
-
const startTime = performance.now();
|
|
261
|
-
await withObserveEventSpan(event, eventObserver.subject, traceContext, async (span) => {
|
|
262
|
-
await handleEventWithRetry(eventObserver, event, handlerRetryOptions, span, startTime);
|
|
263
|
-
});
|
|
264
|
-
// Advance after success or skip so poison events do not block
|
|
265
|
-
// the stream and reconnects resume past the last attempted event.
|
|
266
|
-
lastProcessedEventId = event.id;
|
|
267
|
-
}
|
|
268
|
-
// If the loop completes normally (stream ended), we're done
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
catch (error) {
|
|
272
|
-
connectionRetryCount++;
|
|
273
|
-
const shouldRetry = await handleConnectionError(error, eventObserver.subject, connectionRetryCount, connectionRetryOptions.maxRetries, connectionRetryOptions.initialRetryDelayMs);
|
|
274
|
-
if (!shouldRetry) {
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
/**
|
|
281
|
-
* Initializes an event observer by starting the observation loop in
|
|
282
|
-
* the background (non-blocking). The observer will keep running and
|
|
283
|
-
* reconnecting according to its connection retry options until the
|
|
284
|
-
* stream ends or connection retries are exhausted. Handler failures
|
|
285
|
-
* are retried separately and do not stop the observer.
|
|
286
|
-
*
|
|
287
|
-
* @param eventObserver - The event observer configuration.
|
|
288
|
-
*/
|
|
289
|
-
export const initEventObserver = (eventObserver) => {
|
|
290
|
-
observeWithRetry(eventObserver);
|
|
291
|
-
};
|
package/esm/lib/tracing.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/lib/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,IAAI,EAIZ,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,MAAM,qCAA4B,CAAC;AAEhD,eAAO,MAAM,SAAS,oBAAoB,CAAC;AAmB3C;;GAEG;AACH,eAAO,MAAM,cAAc,iFAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,+EAMxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,iFAOpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mCAAmC,+EAM/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sCAAsC,+EAMlD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mCAAmC,+EAM/C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EACtB,WAAW,MAAM,EACjB,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,eAAe,YAAY,KAC5B,OAAO,CAAC,CAAC,CA6DX,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAClC,OAAO;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACpD,iBAAiB,MAAM,EACvB,cAAc,YAAY,GAAG,SAAS,EACtC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAC/B,OAAO,CAAC,CAAC,CA8BX,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAuB,sBAAsB,CAAC,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GACxC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CA0C/B"}
|
package/esm/lib/writeEvents.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Event } from '@nimbus-cqrs/core';
|
|
2
|
-
import type { 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
|
-
* @param events - The Nimbus events to write.
|
|
8
|
-
* @param preconditions - Optional preconditions that must be met for the write to succeed.
|
|
9
|
-
*/
|
|
10
|
-
export declare const writeEvents: (events: Event[], preconditions?: Precondition[]) => Promise<void>;
|
|
11
|
-
//# sourceMappingURL=writeEvents.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"writeEvents.d.ts","sourceRoot":"","sources":["../../src/lib/writeEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qDAAqD,CAAC;AAEjF,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAapE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACpB,QAAQ,KAAK,EAAE,EACf,gBAAgB,YAAY,EAAE,KAC/B,OAAO,CAAC,IAAI,CAyBd,CAAC"}
|
package/esm/lib/writeEvents.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
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
|
-
* @param events - The Nimbus events to write.
|
|
15
|
-
* @param preconditions - Optional preconditions that must be met for the write to succeed.
|
|
16
|
-
*/
|
|
17
|
-
export const writeEvents = (events, preconditions) => {
|
|
18
|
-
return withSpan('writeEvents', async () => {
|
|
19
|
-
const eventSourcingDBClient = getEventSourcingDBClient();
|
|
20
|
-
const carrier = {};
|
|
21
|
-
propagation.inject(context.active(), carrier);
|
|
22
|
-
const eventCandidates = events.map((event) => {
|
|
23
|
-
eventSizeBytes.record(getEventSizeBytes(event), {
|
|
24
|
-
subject: event.subject,
|
|
25
|
-
event_type: event.type,
|
|
26
|
-
});
|
|
27
|
-
return nimbusEventToEventSourcingDBEventCandidate(event, carrier['traceparent'], carrier['tracestate']);
|
|
28
|
-
});
|
|
29
|
-
await eventSourcingDBClient.writeEvents(eventCandidates, preconditions);
|
|
30
|
-
});
|
|
31
|
-
};
|
package/esm/package.json
DELETED
|
File without changes
|