effect-dynamodb 1.27.0 → 1.29.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 (61) hide show
  1. package/dist/Batch.d.ts.map +1 -1
  2. package/dist/Batch.js +3 -2
  3. package/dist/Batch.js.map +1 -1
  4. package/dist/Entity.d.ts +24 -1
  5. package/dist/Entity.d.ts.map +1 -1
  6. package/dist/Entity.js +33 -17
  7. package/dist/Entity.js.map +1 -1
  8. package/dist/EventStore.d.ts +66 -5
  9. package/dist/EventStore.d.ts.map +1 -1
  10. package/dist/EventStore.js +100 -2
  11. package/dist/EventStore.js.map +1 -1
  12. package/dist/Transaction.d.ts.map +1 -1
  13. package/dist/Transaction.js +5 -2
  14. package/dist/Transaction.js.map +1 -1
  15. package/dist/change-feed/ChangeFeed.d.ts +203 -0
  16. package/dist/change-feed/ChangeFeed.d.ts.map +1 -0
  17. package/dist/change-feed/ChangeFeed.js +498 -0
  18. package/dist/change-feed/ChangeFeed.js.map +1 -0
  19. package/dist/change-feed/CheckpointStore.d.ts +113 -0
  20. package/dist/change-feed/CheckpointStore.d.ts.map +1 -0
  21. package/dist/change-feed/CheckpointStore.js +247 -0
  22. package/dist/change-feed/CheckpointStore.js.map +1 -0
  23. package/dist/change-feed/DynamoStreamsClient.d.ts +71 -0
  24. package/dist/change-feed/DynamoStreamsClient.d.ts.map +1 -0
  25. package/dist/change-feed/DynamoStreamsClient.js +92 -0
  26. package/dist/change-feed/DynamoStreamsClient.js.map +1 -0
  27. package/dist/change-feed/Errors.d.ts +84 -0
  28. package/dist/change-feed/Errors.d.ts.map +1 -0
  29. package/dist/change-feed/Errors.js +40 -0
  30. package/dist/change-feed/Errors.js.map +1 -0
  31. package/dist/change-feed/index.d.ts +36 -0
  32. package/dist/change-feed/index.d.ts.map +1 -0
  33. package/dist/change-feed/index.js +36 -0
  34. package/dist/change-feed/index.js.map +1 -0
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/internal/EntityOps.d.ts +7 -2
  40. package/dist/internal/EntityOps.d.ts.map +1 -1
  41. package/dist/internal/EntityOps.js.map +1 -1
  42. package/dist/internal/EventProjection.d.ts +782 -0
  43. package/dist/internal/EventProjection.d.ts.map +1 -0
  44. package/dist/internal/EventProjection.js +608 -0
  45. package/dist/internal/EventProjection.js.map +1 -0
  46. package/dist/internal/MultiProjection.d.ts +255 -0
  47. package/dist/internal/MultiProjection.d.ts.map +1 -0
  48. package/dist/internal/MultiProjection.js +377 -0
  49. package/dist/internal/MultiProjection.js.map +1 -0
  50. package/dist/internal/ProjectionEngine.d.ts +253 -0
  51. package/dist/internal/ProjectionEngine.d.ts.map +1 -0
  52. package/dist/internal/ProjectionEngine.js +837 -0
  53. package/dist/internal/ProjectionEngine.js.map +1 -0
  54. package/dist/internal/TransactWriteOps.d.ts.map +1 -1
  55. package/dist/internal/TransactWriteOps.js +12 -3
  56. package/dist/internal/TransactWriteOps.js.map +1 -1
  57. package/dist/internal/TransactableOps.d.ts +44 -1
  58. package/dist/internal/TransactableOps.d.ts.map +1 -1
  59. package/dist/internal/TransactableOps.js +52 -2
  60. package/dist/internal/TransactableOps.js.map +1 -1
  61. package/package.json +14 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventProjection.d.ts","sourceRoot":"","sources":["../../src/internal/EventProjection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,608 @@
1
+ /**
2
+ * EventStore projections (#151) — read models folded from a change feed that
3
+ * take their order from the event store, not from delivery.
4
+ *
5
+ * DynamoDB Streams orders records per item only, and a transaction's records
6
+ * carry no grouping or order, so a stream's events reach a consumer in any
7
+ * order. A projection groups a batch's events by row, sorts and
8
+ * deduplicates them, reads from the store only the versions the batch lacks
9
+ * (one strongly consistent `readFrom`), folds, and writes the read-model row
10
+ * once, conditioned on the checkpoint it read. See
11
+ * `docs/designs/eventstore-projections.md`.
12
+ *
13
+ * Re-exported from `EventStore`; this module only type-imports it.
14
+ *
15
+ * @internal
16
+ */
17
+ import { StreamRecordIdentifierMissing, } from "@effect-dynamodb/schema/Errors.js";
18
+ import { Duration, Effect, Option, Pipeable, Result, Stream, } from "effect";
19
+ import * as Query from "../Query.js";
20
+ import { imageEntityType } from "./Packed.js";
21
+ import { addressed, keyId, makeEngine, modelFields, retrySchedule, } from "./ProjectionEngine.js";
22
+ /** @internal `revision`, resolved. */
23
+ export const resolveRevision = (revision) => revision === undefined
24
+ ? undefined
25
+ : typeof revision === "string"
26
+ ? { field: revision, initial: 1 }
27
+ : { field: revision.field, initial: revision.initial ?? 1 };
28
+ const identify = (record, index, options) => {
29
+ const [itemIdentifier, member] = "identifier" in options
30
+ ? [options.identifier(record), "identifier"]
31
+ : options.source === "lambda"
32
+ ? [record.dynamodb?.SequenceNumber, "dynamodb.SequenceNumber"]
33
+ : [record.eventID, "eventID"];
34
+ return typeof itemIdentifier === "string" && itemIdentifier.length > 0
35
+ ? Effect.succeed(itemIdentifier)
36
+ : Effect.fail(new StreamRecordIdentifierMissing({ index, member }));
37
+ };
38
+ /**
39
+ * The partial batch response (`ReportBatchItemFailures`) for `failedRecords`:
40
+ * each identified by `dynamodb.SequenceNumber` for a Lambda event source
41
+ * mapping, by `eventID` for an EventBridge Pipe, or by your own `identifier`
42
+ * accessor.
43
+ *
44
+ * Lambda checkpoints at the lowest reported sequence number and redelivers
45
+ * every record from there, so reporting the earliest failed record of each
46
+ * row is enough. A record without an identifier fails with
47
+ * `StreamRecordIdentifierMissing` — an empty one would fail the whole batch
48
+ * silently — so fail the invocation, and the source redelivers the batch.
49
+ */
50
+ export const batchResponse = (failedRecords, options) => Effect.forEach(failedRecords, (record, i) => identify(record, i, options)).pipe(Effect.map((ids) => ({ batchItemFailures: ids.map((itemIdentifier) => ({ itemIdentifier })) })));
51
+ const markerIndex = (operation, streams) => {
52
+ const index = new Map();
53
+ for (const entry of streams) {
54
+ const existing = index.get(entry[1].eventMarker);
55
+ if (existing !== undefined) {
56
+ throw new Error(`[EDD-9082] ${operation}: "${existing[0]}" and "${entry[0]}" both store events as ` +
57
+ `"${entry[1].eventMarker}", so their images can't be told apart. Give the streams ` +
58
+ "distinct names.");
59
+ }
60
+ index.set(entry[1].eventMarker, entry);
61
+ }
62
+ return index;
63
+ };
64
+ /**
65
+ * One decoder for several streams' change-feed images. Name the streams in a
66
+ * record; `decode(image)` dispatches on the image's `__edd_e__` and returns
67
+ * `{ stream: <name>, event }`, or `Option.none()` for anything that is not one
68
+ * of their events (snapshots, idempotency sentinels, entities, other streams).
69
+ * The image is decoded by that stream's `decodeStreamImage`, so it accepts the
70
+ * same shapes (DynamoDB JSON with `B` as base64 or bytes, or unmarshalled).
71
+ *
72
+ * Two streams storing events under the same marker throw `[EDD-9082]`.
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * const decode = EventStore.decoder({ Order: OrderEvents, Payment: PaymentEvents })
77
+ * const decoded = yield* decode(record.dynamodb.NewImage)
78
+ * if (Option.isSome(decoded) && decoded.value.stream === "Order") { ... }
79
+ * ```
80
+ */
81
+ export const decoder = (streams) => {
82
+ const index = markerIndex("EventStore.decoder", Object.entries(streams));
83
+ return (image) => {
84
+ const entry = typeof image === "object" && image !== null && !Array.isArray(image)
85
+ ? index.get(imageEntityType(image) ?? "")
86
+ : undefined;
87
+ if (entry === undefined)
88
+ return Effect.succeed(Option.none());
89
+ const [name, stream] = entry;
90
+ return stream
91
+ .decodeStreamImage(image)
92
+ .pipe(Effect.map((event) => Option.map(event, (e) => ({ stream: name, event: e }))));
93
+ };
94
+ };
95
+ /**
96
+ * The filter pattern that selects the `INSERT`s of these streams' event items
97
+ * — `JSON.stringify` it into `FilterCriteria.Filters[].Pattern` of a Lambda
98
+ * event source mapping or an EventBridge Pipe. Snapshots, idempotency
99
+ * sentinels and other items are filtered out before the function runs.
100
+ */
101
+ export const eventFilterPattern = (streams) => {
102
+ const list = Array.isArray(streams)
103
+ ? streams
104
+ : Object.values(streams);
105
+ const markers = [...new Set(list.map((s) => s.eventMarker))];
106
+ return { eventName: ["INSERT"], dynamodb: { NewImage: { __edd_e__: { S: markers } } } };
107
+ };
108
+ // ---------------------------------------------------------------------------
109
+ // EventProjection
110
+ // ---------------------------------------------------------------------------
111
+ const EventProjectionTypeId = Symbol.for("effect-dynamodb/EventProjection");
112
+ /**
113
+ * @internal How a projection takes part in a multi-projection batch: one
114
+ * route per source stream — its decode (under the bound context for a bound
115
+ * projection) and its `applyBatch`.
116
+ */
117
+ export const ProjectionRoutes = Symbol.for("effect-dynamodb/EventProjection/Routes");
118
+ /** @internal Refusals shared by `projection` and `multiProjection` (`[EDD-9081]`). */
119
+ export const refuseReadModel = (label, readModel, options) => {
120
+ const refuse = (problem) => {
121
+ throw new Error(`[EDD-9081] ${label}: ${problem}`);
122
+ };
123
+ if (readModel.versioned) {
124
+ refuse("the read model is `versioned`. The projection's checkpoint is the row's version, and a " +
125
+ "versioned put adds its own lock — use a plain entity with a numeric checkpoint field " +
126
+ "(and `revision` for a write counter).");
127
+ }
128
+ if (readModel.softDelete) {
129
+ refuse("the read model has `softDelete`; projections remove rows with `removal` tombstones.");
130
+ }
131
+ if (readModel.timeSeries) {
132
+ refuse("the read model is a `timeSeries` entity, written by `append`, not `put`.");
133
+ }
134
+ const declared = modelFields(readModel.model);
135
+ for (const f of options.fields) {
136
+ if (declared !== undefined && !declared.includes(f)) {
137
+ refuse(`"${f}" is not a field of the read model.`);
138
+ }
139
+ }
140
+ const multiItem = readModel
141
+ ._multiItemWriteFeatures;
142
+ if ((options.removal || options.outbox) && multiItem !== undefined && multiItem.length > 0) {
143
+ refuse(`\`${options.removal ? "removal" : "outbox"}\` writes the row's item itself, which a read ` +
144
+ `model with ${multiItem.join(", ")} can't take (its extra items would not be maintained).`);
145
+ }
146
+ if (options.outbox && options.revision === undefined) {
147
+ refuse("`outbox` orders a row's effects by its `revision`: declare one.");
148
+ }
149
+ };
150
+ /** @internal An outbox config, resolved. */
151
+ export const resolveOutbox = (outbox) => outbox === undefined
152
+ ? undefined
153
+ : {
154
+ schema: outbox.schema,
155
+ effects: outbox.effects,
156
+ table: outbox.table,
157
+ pk: outbox.keys?.pk ?? "pk",
158
+ sk: outbox.keys?.sk ?? "sk",
159
+ index: outbox.index,
160
+ claimFor: Duration.fromInputUnsafe(outbox.claimFor ?? "30 seconds"),
161
+ };
162
+ /**
163
+ * Define a change-feed projection of `stream` into `readModel` — rows keyed by
164
+ * `key(streamId, event)` (one per stream instance when the key ignores the
165
+ * event), each folded from `initial(streamId, event)` through `evolve`, its
166
+ * checkpoint kept in `checkpoint`. See {@link EventProjection} for the
167
+ * operations.
168
+ *
169
+ * The read model must be a plain entity: `versioned` (the checkpoint is the
170
+ * version), `softDelete` (removal is `removal` tombstones) and `timeSeries`
171
+ * read models throw `[EDD-9081]`, as do a field the model lacks, a
172
+ * non-integer offset, `removal` / `outbox` on a read model with `unique`
173
+ * constraints, and `outbox` without `revision`.
174
+ *
175
+ * @example
176
+ * ```ts
177
+ * const OrderSummaryProjection = EventStore.projection({
178
+ * stream: OrderEvents,
179
+ * readModel: OrderSummaries,
180
+ * key: (id) => ({ orderId: id.orderId }),
181
+ * initial: (id) => ({ orderId: id.orderId, status: "open", total: 0, version: 0 }),
182
+ * evolve: (state, event) => Effect.succeed(next(state, event.data)),
183
+ * checkpoint: "version",
184
+ * })
185
+ * ```
186
+ */
187
+ export const projection = (config) => {
188
+ const { stream, readModel } = config;
189
+ const label = `EventStore.projection("${stream.streamName}" → "${readModel.entityType}")`;
190
+ const field = (typeof config.checkpoint === "string" ? config.checkpoint : config.checkpoint.field);
191
+ const offset = typeof config.checkpoint === "string" ? 0 : (config.checkpoint.offset ?? 0);
192
+ const revision = resolveRevision(config.revision);
193
+ refuseReadModel(label, readModel, {
194
+ fields: [field, ...(revision === undefined ? [] : [revision.field])],
195
+ removal: config.removal !== undefined,
196
+ outbox: config.outbox !== undefined,
197
+ revision: revision?.field,
198
+ });
199
+ if (!Number.isInteger(offset)) {
200
+ throw new Error(`[EDD-9081] ${label}: the checkpoint offset ${offset} is not an integer.`);
201
+ }
202
+ const source = {
203
+ name: "projection",
204
+ stream: stream,
205
+ key: config.key,
206
+ evolve: (state, event) => config.evolve(state, event),
207
+ mode: "fold",
208
+ terminal: config.terminal,
209
+ };
210
+ const engine = makeEngine({
211
+ label,
212
+ readModel: readModel,
213
+ sources: [source],
214
+ initial: (_key, context) => config.initial(context.streamId, context.event),
215
+ checkpoints: { kind: "scalar", field, offset },
216
+ revision,
217
+ toItem: config.toItem,
218
+ toItemContext: (key, work) => ({ streamId: work[0]?.streamId, key }),
219
+ retry: retrySchedule(config.retry),
220
+ removal: config.removal === undefined
221
+ ? undefined
222
+ : {
223
+ ttl: config.removal.ttl === undefined
224
+ ? undefined
225
+ : Duration.fromInputUnsafe(config.removal.ttl),
226
+ },
227
+ outbox: resolveOutbox(config.outbox),
228
+ });
229
+ const keyOf = (streamId, event) => engine.call("key", () => addressed(config.key(streamId, event)));
230
+ /** A row's engine result, as this projection reports it. */
231
+ const appliedOf = (streamIdStr, result) => {
232
+ const instance = result.instances[0];
233
+ return {
234
+ streamId: streamIdStr,
235
+ key: result.key,
236
+ applied: (instance?.applied ?? []),
237
+ rejected: (instance?.rejected ?? []),
238
+ alreadyApplied: (instance?.alreadyApplied ?? []),
239
+ state: result.state,
240
+ version: instance?.version ?? 0,
241
+ removed: result.removed,
242
+ enqueued: result.enqueued,
243
+ undelivered: Option.none(),
244
+ };
245
+ };
246
+ /** After a write with effects, drain the row when the caller passed `deliver`. */
247
+ const deliverAfter = (applied, deliver) => deliver === undefined || config.outbox === undefined || applied.enqueued === 0
248
+ ? Effect.succeed(applied)
249
+ : engine.drain(applied.key, deliver).pipe(Effect.map((drained) => ({
250
+ ...applied,
251
+ undelivered: drained.undelivered,
252
+ })));
253
+ const applyBatch = (events, options) => Effect.gen(function* () {
254
+ // By stream instance, in order of first delivery.
255
+ const streams = new Map();
256
+ events.forEach((event, position) => {
257
+ const group = streams.get(event.streamId);
258
+ if (group === undefined)
259
+ streams.set(event.streamId, [[position, event]]);
260
+ else
261
+ group.push([position, event]);
262
+ });
263
+ /** Positions of the events that address no row. */
264
+ const ignored = [];
265
+ // Then by row; each row's task is ordered by its first delivered event.
266
+ const tasks = [];
267
+ for (const [streamIdStr, group] of streams) {
268
+ const positions = group.map(([position]) => position);
269
+ // A stream id that does not parse, or a `key` that throws, fails the
270
+ // whole stream instance: its events can't be placed in rows.
271
+ const rows = yield* Effect.result(Effect.gen(function* () {
272
+ const streamId = (yield* stream.parseStreamId(streamIdStr));
273
+ const byRow = new Map();
274
+ for (const [position, event] of group) {
275
+ const key = yield* keyOf(streamId, event);
276
+ if (Option.isNone(key)) {
277
+ ignored.push(position);
278
+ continue;
279
+ }
280
+ const id = keyId(key.value);
281
+ const row = byRow.get(id);
282
+ if (row === undefined) {
283
+ byRow.set(id, { key: key.value, positions: [position], events: [event] });
284
+ }
285
+ else {
286
+ row.positions.push(position);
287
+ row.events.push(event);
288
+ }
289
+ }
290
+ return { streamId, rows: [...byRow.values()] };
291
+ }));
292
+ if (Result.isFailure(rows)) {
293
+ const error = rows.failure;
294
+ tasks.push({
295
+ first: positions[0],
296
+ run: Effect.succeed({
297
+ _tag: "Failed",
298
+ streamId: streamIdStr,
299
+ key: undefined,
300
+ positions,
301
+ error,
302
+ }),
303
+ });
304
+ continue;
305
+ }
306
+ const { streamId } = rows.success;
307
+ const delivered = new Set(group.map(([, event]) => event.version));
308
+ for (const row of rows.success.rows) {
309
+ // Sorted by version, one event per version (a redelivery is a duplicate).
310
+ const ordered = [...row.events]
311
+ .sort((a, b) => a.version - b.version)
312
+ .filter((e, i, sorted) => i === 0 || sorted[i - 1].version !== e.version);
313
+ const work = {
314
+ source,
315
+ streamIdStr,
316
+ streamId,
317
+ events: ordered,
318
+ top: 0,
319
+ delivered,
320
+ };
321
+ tasks.push({
322
+ first: row.positions[0],
323
+ run: Effect.result(engine.applyRow(row.key, [work]).pipe(Effect.flatMap((result) => deliverAfter(appliedOf(streamIdStr, result), options?.deliver)))).pipe(Effect.map((result) => Result.isSuccess(result)
324
+ ? { _tag: "Applied", positions: row.positions, ...result.success }
325
+ : {
326
+ _tag: "Failed",
327
+ streamId: streamIdStr,
328
+ key: row.key,
329
+ positions: row.positions,
330
+ error: result.failure,
331
+ })),
332
+ });
333
+ }
334
+ }
335
+ tasks.sort((a, b) => a.first - b.first);
336
+ const outcomes = yield* Effect.forEach(tasks, (task) => task.run, {
337
+ concurrency: options?.concurrency ?? 10,
338
+ });
339
+ return {
340
+ outcomes,
341
+ failedPositions: outcomes
342
+ .filter((o) => o._tag === "Failed")
343
+ .map((o) => o.positions[0])
344
+ .sort((a, b) => a - b),
345
+ ignored: ignored.sort((a, b) => a - b),
346
+ };
347
+ });
348
+ /**
349
+ * `applyBatch([event])`, the row's failure in the error channel — wrapped in
350
+ * an `Option` when `key` returns one (none: the event addresses no row).
351
+ */
352
+ const apply = (event) => Effect.gen(function* () {
353
+ const streamId = (yield* stream.parseStreamId(event.streamId));
354
+ const key = yield* engine.call("key", () => config.key(streamId, event));
355
+ const optional = Option.isOption(key);
356
+ if (optional && Option.isNone(key))
357
+ return Option.none();
358
+ const { outcomes } = yield* applyBatch([event]);
359
+ const outcome = outcomes[0];
360
+ if (outcome._tag === "Failed")
361
+ return yield* Effect.fail(outcome.error);
362
+ const { _tag, positions, ...applied } = outcome;
363
+ return optional ? Option.some(applied) : applied;
364
+ });
365
+ const joinStreamId = (streamId) => stream.streamIdFields.map((f) => streamId[f]).join("#");
366
+ const catchUp = (streamId) => Effect.gen(function* () {
367
+ // The latest event that addresses a row — usually the head, one page.
368
+ const pages = yield* Query.paginate(stream.query
369
+ .events(streamId)
370
+ .pipe(Query.reverse, Query.pageSize(25), (q) => Query.consistentRead(q)));
371
+ const latest = yield* pages.pipe(Stream.flatMap((page) => Stream.fromIterable(page)), Stream.mapEffect((event) => keyOf(streamId, event).pipe(Effect.map((key) => Option.map(key, (k) => [event, k])))), Stream.filter((found) => Option.isSome(found)), Stream.map((found) => Option.getOrThrow(found)), Stream.runHead);
372
+ if (Option.isNone(latest)) {
373
+ return {
374
+ key: Option.none(),
375
+ applied: [],
376
+ rejected: [],
377
+ state: Option.none(),
378
+ version: 0,
379
+ removed: false,
380
+ };
381
+ }
382
+ const [head, key] = latest.value;
383
+ const result = (yield* engine.applyRow(key, [
384
+ {
385
+ source,
386
+ streamIdStr: joinStreamId(streamId),
387
+ streamId,
388
+ events: undefined,
389
+ top: head.version,
390
+ delivered: new Set(),
391
+ },
392
+ ]));
393
+ const applied = appliedOf(joinStreamId(streamId), result);
394
+ return {
395
+ key: Option.some(key),
396
+ applied: applied.applied,
397
+ rejected: applied.rejected,
398
+ state: applied.state,
399
+ version: applied.version,
400
+ removed: applied.removed,
401
+ };
402
+ });
403
+ const rebuild = (streamId) => Effect.gen(function* () {
404
+ const events = (yield* stream.read(streamId, { consistentRead: true }));
405
+ const delivered = new Set(events.map((e) => e.version));
406
+ const rows = new Map();
407
+ for (const event of events) {
408
+ const key = yield* keyOf(streamId, event);
409
+ if (Option.isNone(key))
410
+ continue;
411
+ const id = keyId(key.value);
412
+ const row = rows.get(id);
413
+ if (row === undefined)
414
+ rows.set(id, { key: key.value, events: [event] });
415
+ else
416
+ row.events.push(event);
417
+ }
418
+ const rebuilt = yield* Effect.forEach([...rows.values()], ({ key, events: rowEvents }) => engine.applyRow(key, [
419
+ {
420
+ source,
421
+ streamIdStr: joinStreamId(streamId),
422
+ streamId,
423
+ events: rowEvents,
424
+ top: rowEvents[rowEvents.length - 1].version,
425
+ delivered,
426
+ },
427
+ ], { fromScratch: true }).pipe(Effect.map((result) => {
428
+ const applied = appliedOf(joinStreamId(streamId), result);
429
+ return {
430
+ key,
431
+ state: applied.state,
432
+ version: applied.version,
433
+ rejected: applied.rejected,
434
+ removed: applied.removed,
435
+ };
436
+ })), { concurrency: 10 });
437
+ return { rows: rebuilt };
438
+ });
439
+ const processBatch = (records, options) => runBatch(`${label}.processBatch`, records, options, [
440
+ {
441
+ name: "projection",
442
+ stream: stream,
443
+ decode: (image) => stream.decodeStreamImage(image),
444
+ applyBatch: (events, applyOptions) => applyBatch(events, applyOptions),
445
+ },
446
+ ]).pipe(Effect.map(({ outcomes, unrouted: _, ...rest }) => ({
447
+ ...rest,
448
+ outcomes: outcomes.projection,
449
+ })));
450
+ const outboxRequired = (operation) => Effect.die(new Error(`[EDD-9081] ${label}.${operation}: the projection declares no \`outbox\`.`));
451
+ return {
452
+ [EventProjectionTypeId]: EventProjectionTypeId,
453
+ pipe() {
454
+ // eslint-disable-next-line prefer-rest-params
455
+ return Pipeable.pipeArguments(this, arguments);
456
+ },
457
+ stream,
458
+ entityType: readModel.entityType,
459
+ [ProjectionRoutes]: (name) => [
460
+ {
461
+ name,
462
+ stream: stream,
463
+ decode: (image) => stream.decodeStreamImage(image),
464
+ applyBatch: (events, applyOptions) => applyBatch(events, applyOptions),
465
+ },
466
+ ],
467
+ applyBatch,
468
+ apply,
469
+ catchUp,
470
+ rebuild,
471
+ processBatch,
472
+ drain: (key, deliver) => config.outbox === undefined ? outboxRequired("drain") : engine.drain(key, deliver),
473
+ drainPending: (deliver) => config.outbox === undefined ? outboxRequired("drainPending") : engine.drainPending(deliver),
474
+ };
475
+ };
476
+ /** The default `image` accessor: the `NewImage` of an `INSERT`. */
477
+ const insertImage = (record) => record.eventName !== undefined && record.eventName !== "INSERT"
478
+ ? undefined
479
+ : record.dynamodb?.NewImage;
480
+ /**
481
+ * @internal Decode a batch once, route each event to the projections of its
482
+ * stream, apply each projection's events, and build one partial batch
483
+ * response — shared by {@link processBatch} and `projection.processBatch`.
484
+ */
485
+ export const runBatch = (operation, records, options, routes,
486
+ /** Streams decoded without a projection: their events are returned as `unrouted`. */
487
+ decodeOnly = []) => {
488
+ return Effect.gen(function* () {
489
+ // One decode per stream, however many projections read it.
490
+ const streams = new Map();
491
+ for (const route of routes) {
492
+ const readers = streams.get(route.stream);
493
+ if (readers === undefined)
494
+ streams.set(route.stream, [route]);
495
+ else
496
+ readers.push(route);
497
+ }
498
+ // `streams` may name a stream a projection reads too: it is decoded once,
499
+ // applied, and returned as `unrouted` as well.
500
+ // The same stream bound or unbound shares its event schema; a different
501
+ // stream with the same marker stays a conflict (`[EDD-9082]`).
502
+ const schemaOf = (stream) => stream.eventSchema;
503
+ const routedSchemas = new Map([...streams.keys()].map((stream) => [stream.eventMarker, schemaOf(stream)]));
504
+ const decodeOnlyStreams = decodeOnly.filter(([, stream]) => !streams.has(stream) &&
505
+ !(routedSchemas.has(stream.eventMarker) &&
506
+ routedSchemas.get(stream.eventMarker) === schemaOf(stream)));
507
+ /** A marker's stream: the projections that read it, or its name when it has none. */
508
+ const byMarker = markerIndex(operation, [
509
+ ...[...streams.keys()].map((stream) => [stream.streamName, stream]),
510
+ ...decodeOnlyStreams,
511
+ ]);
512
+ /** The names `streams` gives, by event marker. */
513
+ const unroutedNames = new Map(decodeOnly.map(([name, stream]) => [stream.eventMarker, name]));
514
+ const unrouted = [];
515
+ const image = options.image ?? insertImage;
516
+ /** Each projection's events, and the record each came from. */
517
+ const routed = new Map(routes.map((route) => [route.name, { events: [], recordOf: [] }]));
518
+ const decodeFailures = [];
519
+ const failed = new Set();
520
+ for (const [i, record] of records.entries()) {
521
+ const recordImage = image(record);
522
+ if (recordImage === undefined)
523
+ continue;
524
+ const entry = typeof recordImage === "object" && recordImage !== null && !Array.isArray(recordImage)
525
+ ? byMarker.get(imageEntityType(recordImage) ?? "")
526
+ : undefined;
527
+ // Not an event of any stream named: nothing to apply.
528
+ if (entry === undefined)
529
+ continue;
530
+ const readers = streams.get(entry[1]);
531
+ const decoded = yield* Effect.result(readers === undefined
532
+ ? entry[1].decodeStreamImage(recordImage)
533
+ : readers[0].decode(recordImage));
534
+ if (Result.isFailure(decoded)) {
535
+ decodeFailures.push({ record, error: decoded.failure });
536
+ if (options.onDecodeFailure !== "skip")
537
+ failed.add(i);
538
+ }
539
+ else if (Option.isSome(decoded.success)) {
540
+ const name = unroutedNames.get(entry[1].eventMarker);
541
+ if (name !== undefined) {
542
+ unrouted.push({ position: i, stream: name, event: decoded.success.value });
543
+ }
544
+ for (const route of readers ?? []) {
545
+ const target = routed.get(route.name);
546
+ target.events.push(route.tag === undefined
547
+ ? decoded.success.value
548
+ : { stream: route.tag, event: decoded.success.value });
549
+ target.recordOf.push(i);
550
+ }
551
+ }
552
+ }
553
+ const outcomes = {};
554
+ // One `applyBatch` per projection, however many of its sources routed here.
555
+ const projections = [...new Map(routes.map((route) => [route.name, route])).values()];
556
+ for (const route of projections) {
557
+ const { events, recordOf } = routed.get(route.name);
558
+ if (events.length === 0) {
559
+ outcomes[route.name] = [];
560
+ continue;
561
+ }
562
+ const batch = yield* route.applyBatch(events, {
563
+ ...(options.concurrency === undefined ? {} : { concurrency: options.concurrency }),
564
+ ...(options.deliver === undefined ? {} : { deliver: options.deliver }),
565
+ });
566
+ for (const position of batch.failedPositions)
567
+ failed.add(recordOf[position]);
568
+ // Positions index the records, not the decoded events.
569
+ outcomes[route.name] = batch.outcomes.map((outcome) => ({
570
+ ...outcome,
571
+ positions: outcome.positions.map((position) => recordOf[position]),
572
+ }));
573
+ }
574
+ const failedRecords = [...failed].sort((a, b) => a - b).map((i) => records[i]);
575
+ const response = yield* batchResponse(failedRecords, ("identifier" in options && options.identifier !== undefined
576
+ ? { identifier: options.identifier }
577
+ : { source: options.source }));
578
+ return { unrouted, outcomes, decodeFailures, failedRecords, response };
579
+ });
580
+ };
581
+ /**
582
+ * Process one change-feed batch for several projections — the usual shape
583
+ * when one table's feed carries several streams. Each record is decoded once
584
+ * and routed to every projection of its stream; records of other streams and
585
+ * items are skipped, as acknowledged. Each projection applies its events
586
+ * (see {@link EventProjection.applyBatch}), and one partial batch response
587
+ * names the earliest record of every failed row across all of them, plus the
588
+ * records that failed to decode (unless `onDecodeFailure: "skip"`). Outcome
589
+ * `positions` index `records`.
590
+ *
591
+ * Records are read as `StreamRecord`s, identified per `source`, or through
592
+ * `image` / `identifier` accessors for a shape of your own (a Pipe input
593
+ * template's). A failed record without an identifier fails the call with
594
+ * `StreamRecordIdentifierMissing`. `streams` names streams to decode without a
595
+ * projection: their events come back as `unrouted`. Two streams storing
596
+ * events under one marker die with `[EDD-9082]`.
597
+ *
598
+ * @example
599
+ * ```ts
600
+ * const result = yield* EventStore.processBatch(event.Records, {
601
+ * projections: { summaries: OrderSummaryProjection, balances: BalanceProjection },
602
+ * source: "lambda",
603
+ * })
604
+ * return result.response
605
+ * ```
606
+ */
607
+ export const processBatch = (records, options) => runBatch("EventStore.processBatch", records, options, Object.entries(options.projections).flatMap(([name, projection]) => projection[ProjectionRoutes](name)), Object.entries((options.streams ?? {})));
608
+ //# sourceMappingURL=EventProjection.js.map