effect-dynamodb 1.21.0 → 1.23.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 (69) hide show
  1. package/README.md +2 -0
  2. package/dist/Aggregate.d.ts +9 -4
  3. package/dist/Aggregate.d.ts.map +1 -1
  4. package/dist/Aggregate.js +644 -219
  5. package/dist/Aggregate.js.map +1 -1
  6. package/dist/Batch.d.ts +7 -0
  7. package/dist/Batch.d.ts.map +1 -1
  8. package/dist/Batch.js +132 -7
  9. package/dist/Batch.js.map +1 -1
  10. package/dist/Collection.d.ts.map +1 -1
  11. package/dist/Collection.js +18 -32
  12. package/dist/Collection.js.map +1 -1
  13. package/dist/DynamoClient.d.ts +40 -3
  14. package/dist/DynamoClient.d.ts.map +1 -1
  15. package/dist/DynamoClient.js +72 -20
  16. package/dist/DynamoClient.js.map +1 -1
  17. package/dist/Entity.d.ts +138 -55
  18. package/dist/Entity.d.ts.map +1 -1
  19. package/dist/Entity.js +3061 -626
  20. package/dist/Entity.js.map +1 -1
  21. package/dist/EventStore.d.ts +30 -8
  22. package/dist/EventStore.d.ts.map +1 -1
  23. package/dist/EventStore.js +203 -155
  24. package/dist/EventStore.js.map +1 -1
  25. package/dist/Query.d.ts +75 -3
  26. package/dist/Query.d.ts.map +1 -1
  27. package/dist/Query.js +228 -30
  28. package/dist/Query.js.map +1 -1
  29. package/dist/Transaction.d.ts +13 -2
  30. package/dist/Transaction.d.ts.map +1 -1
  31. package/dist/Transaction.js +48 -38
  32. package/dist/Transaction.js.map +1 -1
  33. package/dist/index.d.ts +3 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/internal/BoundCrud.d.ts +31 -20
  38. package/dist/internal/BoundCrud.d.ts.map +1 -1
  39. package/dist/internal/BoundCrud.js +1 -1
  40. package/dist/internal/BoundCrud.js.map +1 -1
  41. package/dist/internal/BoundQuery.d.ts +47 -2
  42. package/dist/internal/BoundQuery.d.ts.map +1 -1
  43. package/dist/internal/BoundQuery.js +182 -18
  44. package/dist/internal/BoundQuery.js.map +1 -1
  45. package/dist/internal/EntityCombinators.d.ts +32 -10
  46. package/dist/internal/EntityCombinators.d.ts.map +1 -1
  47. package/dist/internal/EntityCombinators.js +16 -7
  48. package/dist/internal/EntityCombinators.js.map +1 -1
  49. package/dist/internal/EntityOps.d.ts +44 -10
  50. package/dist/internal/EntityOps.d.ts.map +1 -1
  51. package/dist/internal/EntityOps.js +48 -5
  52. package/dist/internal/EntityOps.js.map +1 -1
  53. package/dist/internal/Expr.d.ts +23 -0
  54. package/dist/internal/Expr.d.ts.map +1 -1
  55. package/dist/internal/Expr.js +84 -9
  56. package/dist/internal/Expr.js.map +1 -1
  57. package/dist/internal/ItemSize.d.ts +38 -0
  58. package/dist/internal/ItemSize.d.ts.map +1 -0
  59. package/dist/internal/ItemSize.js +62 -0
  60. package/dist/internal/ItemSize.js.map +1 -0
  61. package/dist/internal/TransactWriteOps.d.ts +112 -19
  62. package/dist/internal/TransactWriteOps.d.ts.map +1 -1
  63. package/dist/internal/TransactWriteOps.js +210 -33
  64. package/dist/internal/TransactWriteOps.js.map +1 -1
  65. package/dist/internal/TransactableOps.d.ts +33 -14
  66. package/dist/internal/TransactableOps.d.ts.map +1 -1
  67. package/dist/internal/TransactableOps.js +46 -19
  68. package/dist/internal/TransactableOps.js.map +1 -1
  69. package/package.json +2 -2
@@ -13,7 +13,8 @@
13
13
  * Built on the existing library primitives (DynamoSchema, KeyComposer, Query,
14
14
  * DynamoClient, Marshaller).
15
15
  */
16
- import { AdditionalItemConditionFailed, AppendTooLarge, DuplicateCommand, TransactionCancelled, ValidationError, VersionConflict } from "@effect-dynamodb/schema/Errors.js";
16
+ import * as DynamoSchema from "@effect-dynamodb/schema/DynamoSchema.js";
17
+ import { AdditionalItemConditionFailed, AppendTooLarge, type ConcurrentModification, DuplicateCommand, type OptimisticLockError, TransactionCancelled, type UniqueConstraintViolation, ValidationError, VersionConflict } from "@effect-dynamodb/schema/Errors.js";
17
18
  import { type Duration, Effect, Option, Pipeable, Schedule, Schema } from "effect";
18
19
  import { DynamoClient, type DynamoClientError } from "./DynamoClient.js";
19
20
  import { type TransactWriteOp } from "./internal/TransactWriteOps.js";
@@ -104,8 +105,9 @@ export interface SnapshotSettings {
104
105
  * command to this aggregate?" asks). It is invisible to `read` / `readFrom` /
105
106
  * `currentVersion`, which filter on the event entity type.
106
107
  *
107
- * **Casing:** the sentinel sort key is composed with the schema's casing (default
108
- * `"lowercase"`), so command ids that differ only in case collide. Use
108
+ * **Casing:** the sentinel sort key is composed with the stream's key casing
109
+ * (its `casing`, else the schema's — default `"lowercase"`), so under a folding
110
+ * casing command ids that differ only in case collide. Use
109
111
  * case-insensitively-unique ids (UUID / ULID). The raw id is stored as the
110
112
  * `commandId` attribute regardless.
111
113
  */
@@ -129,16 +131,25 @@ export interface AppendOptions<TMetadata> {
129
131
  * op union `Transaction.transactWrite` accepts (`EntityPut`, `EntityDelete`,
130
132
  * `Transaction.check(...)`).
131
133
  *
132
- * Conditional failures on these items are reported as
133
- * `AdditionalItemConditionFailed` (carrying the 0-based indices into this
134
- * array), never as `VersionConflict`.
134
+ * A put of a versioned or unique-constrained entity is written exactly as
135
+ * the entity's own `put` writes it (#133) — reading the item, continuing a
136
+ * replaced item's version and history, rotating its sentinels — and an
137
+ * append whose read raced a concurrent write is written again.
138
+ *
139
+ * A failure of an item's OWN condition (`.condition()`, `create()`,
140
+ * `Transaction.check`) is reported as `AdditionalItemConditionFailed`
141
+ * (carrying the 0-based indices into this array), never as
142
+ * `VersionConflict`. A guarded put the caller set no condition on fails as
143
+ * the entity's put would: `UniqueConstraintViolation`, a history
144
+ * `ValidationError`, or — a race lost on every attempt —
145
+ * `OptimisticLockError` / `ConcurrentModification`.
135
146
  */
136
147
  readonly additionalItems?: ReadonlyArray<TransactWriteOp>;
137
148
  /** Opt in to exactly-once command processing — see {@link AppendIdempotency}. */
138
149
  readonly idempotency?: AppendIdempotency;
139
150
  }
140
151
  /** Error channel of {@link EventStream.append}. */
141
- export type AppendError = VersionConflict | DuplicateCommand | AdditionalItemConditionFailed | AppendTooLarge | DynamoClientError | ValidationError | TransactionCancelled;
152
+ export type AppendError = VersionConflict | DuplicateCommand | AdditionalItemConditionFailed | AppendTooLarge | DynamoClientError | ValidationError | TransactionCancelled | UniqueConstraintViolation | OptimisticLockError | ConcurrentModification;
142
153
  type StreamIdInput<T extends ReadonlyArray<string>> = {
143
154
  readonly [K in T[number]]: string;
144
155
  };
@@ -233,6 +244,16 @@ export interface EventStream<TEvent, TStreamIdFields extends ReadonlyArray<strin
233
244
  * })
234
245
  * ```
235
246
  *
247
+ * `casing` overrides the key casing for this stream, as an index's or a vector
248
+ * index's `casing` does: the stream name, stream-id values and command ids in
249
+ * its keys all take it. When omitted, the stream name is lower-cased and the
250
+ * rest of the key follows the schema's casing — the layout streams have always
251
+ * had. Setting `casing` on a stream that already holds data moves its keys
252
+ * (unless the result happens to match), so its events, snapshot and idempotency
253
+ * sentinels are no longer read. The `__edd_e__` discriminators
254
+ * (`<stream>.event` etc.) are always lower-cased. In the next major, omitting
255
+ * `casing` will mean the schema's casing, as it does for indexes.
256
+ *
236
257
  * @throws `[EDD-9027]` when `snapshot.every` is not a positive integer.
237
258
  */
238
259
  export declare const makeStream: <const TEvents extends ReadonlyArray<Schema.Top>, TTable extends Table, const TStreamName extends string, const TStreamId extends {
@@ -244,6 +265,7 @@ export declare const makeStream: <const TEvents extends ReadonlyArray<Schema.Top
244
265
  readonly streamId: TStreamId;
245
266
  readonly metadata?: TMetadata;
246
267
  readonly snapshot?: TSnapshot;
268
+ readonly casing?: DynamoSchema.Casing | undefined;
247
269
  }) => EventStream<Schema.Schema.Type<TEvents[number]>, TStreamId["composite"], TMetadata extends Schema.Top ? Schema.Schema.Type<TMetadata> : undefined, TSnapshot extends SnapshotConfig<infer TStateSchema> ? Schema.Schema.Type<TStateSchema> : never>;
248
270
  /**
249
271
  * An EventStream whose operations have `DynamoClient` and `TableConfig` already
@@ -350,7 +372,7 @@ export interface IdempotentCommandOptions<TMetadata> extends CommandOptions<TMet
350
372
  type CommandOptionsArgs<TMetadata, TConfig extends CommandHandlerOptions | undefined> = TConfig extends {
351
373
  readonly idempotency: object;
352
374
  } ? [options: IdempotentCommandOptions<TMetadata>] : [options?: CommandOptions<TMetadata> | undefined];
353
- type CommandHandlerErrors<E> = E | VersionConflict | DuplicateCommand | AdditionalItemConditionFailed | AppendTooLarge | DynamoClientError | ValidationError | TransactionCancelled;
375
+ type CommandHandlerErrors<E> = E | VersionConflict | DuplicateCommand | AdditionalItemConditionFailed | AppendTooLarge | DynamoClientError | ValidationError | TransactionCancelled | UniqueConstraintViolation | OptimisticLockError | ConcurrentModification;
354
376
  type CommandHandler<State, Command, TEvent, E, TStreamIdFields extends ReadonlyArray<string>, TMetadata, TConfig extends CommandHandlerOptions | undefined = undefined> = (streamId: StreamIdInput<TStreamIdFields>, command: Command, ...options: CommandOptionsArgs<TMetadata, TConfig>) => Effect.Effect<CommandHandlerResult<State, TEvent>, CommandHandlerErrors<E>, DynamoClient | TableConfig>;
355
377
  type BoundCommandHandler<State, Command, TEvent, E, TStreamIdFields extends ReadonlyArray<string>, TMetadata, TConfig extends CommandHandlerOptions | undefined = undefined> = (streamId: StreamIdInput<TStreamIdFields>, command: Command, ...options: CommandOptionsArgs<TMetadata, TConfig>) => Effect.Effect<CommandHandlerResult<State, TEvent>, CommandHandlerErrors<E>, never>;
356
378
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,YAAY,MAAM,yCAAyC,CAAA;AAEvE,OAAO,EACL,6BAA6B,EAC7B,cAAc,EACd,KAAK,sBAAsB,EAC3B,gBAAgB,EAGhB,KAAK,mBAAmB,EAExB,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,eAAe,EACf,eAAe,EAChB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAEL,KAAK,QAAQ,EACb,MAAM,EAEN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACP,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAOL,KAAK,eAAe,EAErB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,EAA2B,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAMlF;;;;;;GAMG;AACH,MAAM,WAAW,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK;IACvD,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3F,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,CAAA;IACtD,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,GACnE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACnC,SAAS,GAAG,SAAS,CAAA;AAuBzB,8CAA8C;AAC9C,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAClC;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAE,SAAQ,YAAY,CAAC,KAAK,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACtB;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ,CAAC,KAAK;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;IACrE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACpC;AAED,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAA;CAC1C;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa,CAAC,SAAS;IACtC,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IACzD,iFAAiF;IACjF,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAA;CACzC;AAED,mDAAmD;AACnD,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,gBAAgB,GAChB,6BAA6B,GAC7B,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,oBAAoB,GACpB,yBAAyB,GACzB,mBAAmB,GACnB,sBAAsB,CAAA;AAM1B,KAAK,aAAa,CAAC,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,IAAI;IACpD,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;CAClC,CAAA;AAMD,QAAA,MAAM,iBAAiB,EAAE,OAAO,MAAkD,CAAA;AAClF,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAA;AAMxD;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAC1B,MAAM,EACN,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAC7C,SAAS,EACT,MAAM,GAAG,KAAK,CACd,SAAQ,QAAQ,CAAC,QAAQ;IACzB,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAA;IAEhC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,gBAAgB,GAAG,SAAS,CAAA;IAErD;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,CACX,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,EAAE,YAAY,GAAG,WAAW,CAAC,CAAA;IAEvF;;;;;;OAMG;IACH,YAAY,CACV,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,MAAM,CAAC,MAAM,CACd,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAC/B,iBAAiB,GAAG,eAAe,EACnC,YAAY,GAAG,WAAW,CAC3B,CAAA;IAED,MAAM,CACJ,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,GAC7C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,GAAG,WAAW,CAAC,CAAA;IAE/E,IAAI,CACF,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7D,iBAAiB,GAAG,eAAe,EACnC,YAAY,GAAG,WAAW,CAC3B,CAAA;IAED,QAAQ,CACN,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7D,iBAAiB,GAAG,eAAe,EACnC,YAAY,GAAG,WAAW,CAC3B,CAAA;IAED,cAAc,CACZ,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,EAAE,YAAY,GAAG,WAAW,CAAC,CAAA;IAEzF,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,CACJ,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;KAC/D,CAAA;CACF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,eAAO,MAAM,UAAU,GACrB,KAAK,CAAC,OAAO,SAAS,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAC/C,MAAM,SAAS,KAAK,EACpB,KAAK,CAAC,WAAW,SAAS,MAAM,EAChC,KAAK,CAAC,SAAS,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,EACrE,SAAS,SAAS,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,SAAS,EACpD,SAAS,SAAS,cAAc,GAAG,SAAS,GAAG,SAAS,EACxD,QAAQ;IACR,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAA;CAClD,KAAG,WAAW,CACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACnC,SAAS,CAAC,WAAW,CAAC,EACtB,SAAS,SAAS,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,EACxE,SAAS,SAAS,cAAc,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAyuBhG,CAAA;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,gBAAgB,CAC/B,MAAM,EACN,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAC7C,SAAS,EACT,MAAM,GAAG,KAAK,CACd,SAAQ,QAAQ,CAAC,QAAQ;IACzB,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAA;IAEhC,8CAA8C;IAC9C,QAAQ,CAAC,cAAc,EAAE,gBAAgB,GAAG,SAAS,CAAA;IAErD,qFAAqF;IACrF,aAAa,CACX,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,EAAE,KAAK,CAAC,CAAA;IAElE,4CAA4C;IAC5C,YAAY,CACV,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,iBAAiB,GAAG,eAAe,EAAE,KAAK,CAAC,CAAA;IAE7F,MAAM,CACJ,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,eAAe,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,GAC7C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;IAE1D,IAAI,CACF,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7D,iBAAiB,GAAG,eAAe,EACnC,KAAK,CACN,CAAA;IAED,QAAQ,CACN,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7D,iBAAiB,GAAG,eAAe,EACnC,KAAK,CACN,CAAA;IAED,cAAc,CACZ,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,EAAE,KAAK,CAAC,CAAA;IAEpE,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,CACJ,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GACvC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;KAC/D,CAAA;IAED,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,KACpD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;CAChC;AAMD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,GAAI,MAAM,EAAE,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAC3F,QAAQ,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,KAC9D,MAAM,CAAC,MAAM,CACd,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,EAC5D,KAAK,EACL,YAAY,GAAG,WAAW,CA4BxB,CAAA;AAMJ;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,SAAS,CAAA;IAEjF,iFAAiF;IACjF,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAA;CACrE;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc,CAAC,SAAS;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;CAC1D;AAED,kGAAkG;AAClG,MAAM,WAAW,wBAAwB,CAAC,SAAS,CAAE,SAAQ,cAAc,CAAC,SAAS,CAAC;IACpF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,KAAK,kBAAkB,CACrB,SAAS,EACT,OAAO,SAAS,qBAAqB,GAAG,SAAS,IAC/C,OAAO,SAAS;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChD,CAAC,OAAO,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC,GAC9C,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AAErD,KAAK,oBAAoB,CAAC,CAAC,IACvB,CAAC,GACD,eAAe,GACf,gBAAgB,GAChB,6BAA6B,GAC7B,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,oBAAoB,GACpB,yBAAyB,GACzB,mBAAmB,GACnB,sBAAsB,CAAA;AAE1B,KAAK,cAAc,CACjB,KAAK,EACL,OAAO,EACP,MAAM,EACN,CAAC,EACD,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAC7C,SAAS,EACT,OAAO,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,IAC3D,CACF,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,OAAO,EAChB,GAAG,OAAO,EAAE,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,KAC/C,MAAM,CAAC,MAAM,CAChB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,EACnC,oBAAoB,CAAC,CAAC,CAAC,EACvB,YAAY,GAAG,WAAW,CAC3B,CAAA;AAED,KAAK,mBAAmB,CACtB,KAAK,EACL,OAAO,EACP,MAAM,EACN,CAAC,EACD,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAC7C,SAAS,EACT,OAAO,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,IAC3D,CACF,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,OAAO,EAChB,GAAG,OAAO,EAAE,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,KAC/C,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AA0JvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,cAAc,EAAE;IAE3B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EAC7F,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAC3C,OAAO,CAAC,EAAE,OAAO,GAChB;QACD,CAAC,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,SAAS,KAAK,EAC7E,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,GACnE,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;QACtF,CAAC,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,SAAS,KAAK,EAC7E,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,GAC9D,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;KAClF,CAAA;IAGD,CACE,KAAK,EACL,OAAO,EACP,MAAM,EACN,CAAC,EACD,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAC7C,SAAS,EACT,MAAM,SAAS,KAAK,EACpB,KAAK,CAAC,OAAO,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EAEnE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAC3C,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,EACpE,OAAO,CAAC,EAAE,OAAO,GAChB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;IAGtF,CACE,KAAK,EACL,OAAO,EACP,MAAM,EACN,CAAC,EACD,eAAe,SAAS,aAAa,CAAC,MAAM,CAAC,EAC7C,SAAS,EACT,MAAM,SAAS,KAAK,EACpB,KAAK,CAAC,OAAO,SAAS,qBAAqB,GAAG,SAAS,GAAG,SAAS,EAEnE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAC3C,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,EAC/D,OAAO,CAAC,EAAE,OAAO,GAChB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;CAOxD,CAAA;AAM3B;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE;IACjB,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;IACxF,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;CAUrF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE;IACrB,CAAC,CAAC,EACA,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACpC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC5B,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACpC,CAAC,CAAA;CAcL,CAAA"}
@@ -19,7 +19,7 @@ import { AdditionalItemConditionFailed, AppendTooLarge, DuplicateCommand, isAwsC
19
19
  import * as KeyComposer from "@effect-dynamodb/schema/KeyComposer.js";
20
20
  import { DateTime, Effect, Function, Option, Pipeable, Schedule, Schema, } from "effect";
21
21
  import { DynamoClient } from "./DynamoClient.js";
22
- import { buildTransactWriteItems, } from "./internal/TransactWriteOps.js";
22
+ import { buildTransactWriteItems, GUARDED_TRANSACTION_ATTEMPTS, judgeCancellation, refuseOversizedTransaction, refuseRepeatedItems, transactItemTarget, } from "./internal/TransactWriteOps.js";
23
23
  import { fromAttributeMap, toAttributeMap } from "./Marshaller.js";
24
24
  import * as Query from "./Query.js";
25
25
  import { resolveTtlAttributeName } from "./Table.js";
@@ -85,19 +85,46 @@ const EventStreamTypeId = Symbol.for("effect-dynamodb/EventStream");
85
85
  * })
86
86
  * ```
87
87
  *
88
+ * `casing` overrides the key casing for this stream, as an index's or a vector
89
+ * index's `casing` does: the stream name, stream-id values and command ids in
90
+ * its keys all take it. When omitted, the stream name is lower-cased and the
91
+ * rest of the key follows the schema's casing — the layout streams have always
92
+ * had. Setting `casing` on a stream that already holds data moves its keys
93
+ * (unless the result happens to match), so its events, snapshot and idempotency
94
+ * sentinels are no longer read. The `__edd_e__` discriminators
95
+ * (`<stream>.event` etc.) are always lower-cased. In the next major, omitting
96
+ * `casing` will mean the schema's casing, as it does for indexes.
97
+ *
88
98
  * @throws `[EDD-9027]` when `snapshot.every` is not a positive integer.
89
99
  */
90
100
  export const makeStream = (config) => {
91
101
  const schema = config.table.schema;
92
- const entityType = `${config.streamName.toLowerCase()}.event`;
93
- const snapshotEntityType = `${config.streamName.toLowerCase()}.snapshot`;
102
+ /**
103
+ * `__edd_e__` discriminator values. Always lower-cased, whatever the casing:
104
+ * they are matched exactly by every stream read, so they never vary with the
105
+ * stream's or the schema's casing.
106
+ */
107
+ const typeLabel = config.streamName.toLowerCase();
108
+ const entityType = `${typeLabel}.event`;
109
+ const snapshotEntityType = `${typeLabel}.snapshot`;
94
110
  /**
95
111
  * Entity type of the command-dedup sentinel. Distinct from `entityType` so the
96
112
  * sentinel is filtered out of every event query (`read`, `readFrom`,
97
113
  * `currentVersion` all constrain `__edd_e__`), and it sorts before the event
98
114
  * keys (`.command` < `.event`) so it also falls outside `readFrom` ranges.
99
115
  */
100
- const commandEntityType = `${config.streamName.toLowerCase()}.command`;
116
+ const commandEntityType = `${typeLabel}.command`;
117
+ /**
118
+ * Stream keys. With `casing` set, the stream name goes to the key composer as
119
+ * written and that casing applies to the whole key, as an index's `casing`
120
+ * does. Without it, the name is lower-cased first and the schema's casing
121
+ * applies — the layout every stream has been written with so far.
122
+ */
123
+ const keyOptions = config.casing === undefined ? undefined : { casing: config.casing };
124
+ const keyLabel = config.casing === undefined ? typeLabel : config.streamName;
125
+ const eventKeyLabel = `${keyLabel}.event`;
126
+ const snapshotKeyLabel = `${keyLabel}.snapshot`;
127
+ const commandKeyLabel = `${keyLabel}.command`;
101
128
  const compositeFields = config.streamId.composite;
102
129
  // -------------------------------------------------------------------------
103
130
  // Snapshot config validation (EDD-9027) — fail fast at definition time.
@@ -121,16 +148,16 @@ export const makeStream = (config) => {
121
148
  // ---------------------------------------------------------------------------
122
149
  const composeStreamPk = (streamId) => {
123
150
  const composites = KeyComposer.extractComposites(compositeFields, streamId);
124
- return DynamoSchema.composeKey(schema, config.streamName.toLowerCase(), composites);
151
+ return DynamoSchema.composeKey(schema, keyLabel, composites, keyOptions);
125
152
  };
126
- const composeEventSk = (version) => DynamoSchema.composeEventVersionKey(schema, entityType, version);
153
+ const composeEventSk = (version) => DynamoSchema.composeEventVersionKey(schema, eventKeyLabel, version, keyOptions);
127
154
  /**
128
155
  * Every event SK begins with this; nothing else in the stream partition does.
129
156
  * Bounding event reads to it excludes the snapshot item at the key-condition
130
157
  * level, which matters because DynamoDB applies `Limit` *before*
131
158
  * `FilterExpression` — a filtered-out snapshot would still burn a `Limit` slot.
132
159
  */
133
- const eventSkPrefix = DynamoSchema.composeEventVersionKeyPrefix(schema, entityType);
160
+ const eventSkPrefix = DynamoSchema.composeEventVersionKeyPrefix(schema, eventKeyLabel, keyOptions);
134
161
  /** Inclusive upper bound of the event SK range (10-digit padding maximum). */
135
162
  const maxEventSk = composeEventSk(DynamoSchema.MAX_EVENT_VERSION);
136
163
  /**
@@ -138,7 +165,7 @@ export const makeStream = (config) => {
138
165
  * `<stream>.event_1#…`), so it can never collide with an event SK, and it
139
166
  * sorts after every event in the partition.
140
167
  */
141
- const snapshotSk = DynamoSchema.composeKey(schema, snapshotEntityType, []);
168
+ const snapshotSk = DynamoSchema.composeKey(schema, snapshotKeyLabel, [], keyOptions);
142
169
  const composeStreamIdString = (streamId) => compositeFields.map((f) => streamId[f]).join("#");
143
170
  // ---------------------------------------------------------------------------
144
171
  // Codec helpers — write encodes, read decodes (symmetry with Entity/Aggregate)
@@ -283,164 +310,185 @@ export const makeStream = (config) => {
283
310
  },
284
311
  };
285
312
  }));
286
- // Caller-owned items, compiled through the same builder
287
- // `Transaction.transactWrite` uses, so the two APIs cannot drift.
288
- const { items: additionalItems, provenance: additionalProvenance } = yield* buildTransactWriteItems(additionalOps, "EventStore.append.additionalItems");
289
- // Authoritative cap check: one additional op can compile to several items
290
- // (#113), so the pre-flight lower bound above is not sufficient. Reporting
291
- // the EXPANDED count is the point — "you passed 40 items" when the caller
292
- // passed 30 ops is baffling without it.
293
- if (fixedItems + additionalItems.length > TRANSACT_WRITE_ITEMS_LIMIT) {
294
- return yield* new AppendTooLarge({
295
- streamName: config.streamName,
296
- streamId: streamIdStr,
297
- count: fixedItems + additionalItems.length,
298
- limit: TRANSACT_WRITE_ITEMS_LIMIT,
299
- });
300
- }
301
- // Version-contiguity guard: `attribute_not_exists(pk)` on the event puts
302
- // only rejects STALE expected versions (the target slot already exists).
303
- // An AHEAD expectedVersion (e.g. 10 when the stream is at 3) would
304
- // silently write from version 11, leaving a permanent gap. When
305
- // expectedVersion > 0, require the event at exactly `expectedVersion` to
306
- // exist so the appended range is contiguous with the stream head. Its
307
- // failure surfaces as a ConditionalCheckFailed cancellation reason,
308
- // mapping to VersionConflict below just like a stale-version Put failure.
309
- //
310
- // Only when events are actually being written: the guard exists to stop an
311
- // AHEAD expectedVersion opening a permanent gap, and a zero-event append
312
- // (pure `additionalItems` / sentinel side-write) writes no version and so
313
- // can open no gap.
314
- const contiguityCheck = needsContiguityCheck
315
- ? [
316
- {
317
- ConditionCheck: {
318
- TableName: tableName,
319
- Key: toAttributeMap({ pk, sk: composeEventSk(expectedVersion) }),
320
- ConditionExpression: "attribute_exists(pk)",
321
- },
322
- },
323
- ]
324
- : [];
325
- // Item layout is load-bearing — cancellation reasons are positional:
326
- // [0, C) version-contiguity ConditionCheck (C is 0 or 1)
327
- // [C, C + E) event puts
328
- // [C + E, C + E + A) additional ITEMS (caller op order preserved)
329
- // C + E + A idempotency sentinel (last, so adding it never
330
- // shifts the additional-item indices the caller sees)
331
- //
332
- // `A` is the count of EMITTED items, which is >= the number of caller ops:
333
- // a `unique` / `retain` put expands into its item plus sentinels plus a
334
- // snapshot (#113). The 1:1 "item index == caller index" assumption is gone,
335
- // so the reason mapping below goes through `additionalProvenance` — the
336
- // caller-facing `indices` on `AdditionalItemConditionFailed` are still
337
- // indices into the caller's `additionalItems` array, unchanged.
338
- const transactItems = [
339
- ...contiguityCheck,
340
- ...eventItems,
341
- ...additionalItems,
342
- ];
343
- const checkCount = contiguityCheck.length;
344
- const eventCount = eventItems.length;
345
- const additionalCount = additionalItems.length;
346
- const sentinelIndex = idempotency !== undefined ? transactItems.length : -1;
347
- if (idempotency !== undefined) {
348
- const sentinel = {
349
- pk,
350
- sk: DynamoSchema.composeKey(schema, commandEntityType, [idempotency.commandId]),
351
- __edd_e__: commandEntityType,
352
- streamId: streamIdStr,
353
- commandId: idempotency.commandId,
354
- version: expectedVersion + events.length,
355
- timestamp: now,
356
- };
357
- if (idempotency.ttl !== undefined) {
358
- const ttlSeconds = yield* Effect.try({
359
- try: () => normalizeTtlSeconds(idempotency.ttl),
360
- catch: (cause) => new ValidationError({
361
- entityType: commandEntityType,
362
- operation: "EventStore.append.idempotency.ttl",
363
- cause,
364
- }),
313
+ // A guarded put among the additional items reads its item; a race with
314
+ // that read cancels the append, which is then built and written again.
315
+ let lost;
316
+ for (let attempt = 0; attempt < GUARDED_TRANSACTION_ATTEMPTS; attempt++) {
317
+ // Caller-owned items, compiled through the same builder
318
+ // `Transaction.transactWrite` uses, so the two APIs cannot drift.
319
+ const additional = yield* buildTransactWriteItems(additionalOps, "EventStore.append.additionalItems");
320
+ const additionalItems = additional.items;
321
+ // Authoritative cap check: one additional op can compile to several items
322
+ // (#113), so the pre-flight lower bound above is not sufficient. Reporting
323
+ // the EXPANDED count is the point — "you passed 40 items" when the caller
324
+ // passed 30 ops is baffling without it.
325
+ if (fixedItems + additionalItems.length > TRANSACT_WRITE_ITEMS_LIMIT) {
326
+ return yield* new AppendTooLarge({
327
+ streamName: config.streamName,
328
+ streamId: streamIdStr,
329
+ count: fixedItems + additionalItems.length,
330
+ limit: TRANSACT_WRITE_ITEMS_LIMIT,
365
331
  });
366
- sentinel[resolveTtlAttributeName(tableConfig)] =
367
- DateTime.toEpochSeconds(nowDateTime) + ttlSeconds;
368
332
  }
369
- transactItems.push({
370
- Put: {
371
- TableName: tableName,
372
- Item: toAttributeMap(sentinel),
373
- ConditionExpression: "attribute_not_exists(pk)",
374
- },
375
- });
376
- }
377
- yield* client.transactWriteItems({ TransactItems: transactItems }).pipe(Effect.mapError((error) => {
378
- if (!isAwsTransactionCancelled(error.cause)) {
379
- return error;
380
- }
381
- const reasons = (error.cause.CancellationReasons ?? []).map((r) => ({
382
- code: r?.Code,
383
- message: r?.Message,
384
- }));
385
- const failedAt = (index) => index >= 0 && reasons[index]?.code === "ConditionalCheckFailed";
386
- // Precedence is ordered by how terminal the caller's response should
387
- // be: a duplicate can never succeed on retry, a version conflict
388
- // invites a re-read, and only then is the caller's own condition the
389
- // most specific explanation left.
390
- if (idempotency !== undefined && failedAt(sentinelIndex)) {
391
- return new DuplicateCommand({
392
- streamName: config.streamName,
333
+ // Version-contiguity guard: `attribute_not_exists(pk)` on the event puts
334
+ // only rejects STALE expected versions (the target slot already exists).
335
+ // An AHEAD expectedVersion (e.g. 10 when the stream is at 3) would
336
+ // silently write from version 11, leaving a permanent gap. When
337
+ // expectedVersion > 0, require the event at exactly `expectedVersion` to
338
+ // exist so the appended range is contiguous with the stream head. Its
339
+ // failure surfaces as a ConditionalCheckFailed cancellation reason,
340
+ // mapping to VersionConflict below just like a stale-version Put failure.
341
+ //
342
+ // Only when events are actually being written: the guard exists to stop an
343
+ // AHEAD expectedVersion opening a permanent gap, and a zero-event append
344
+ // (pure `additionalItems` / sentinel side-write) writes no version and so
345
+ // can open no gap.
346
+ const contiguityCheck = needsContiguityCheck
347
+ ? [
348
+ {
349
+ ConditionCheck: {
350
+ TableName: tableName,
351
+ Key: toAttributeMap({ pk, sk: composeEventSk(expectedVersion) }),
352
+ ConditionExpression: "attribute_exists(pk)",
353
+ },
354
+ },
355
+ ]
356
+ : [];
357
+ // Item layout is load-bearing — cancellation reasons are positional:
358
+ // [0, C) version-contiguity ConditionCheck (C is 0 or 1)
359
+ // [C, C + E) event puts
360
+ // [C + E, C + E + A) additional ITEMS (caller op order preserved)
361
+ // C + E + A idempotency sentinel (last, so adding it never
362
+ // shifts the additional-item indices the caller sees)
363
+ //
364
+ // `A` is the count of EMITTED items, which is >= the number of caller ops:
365
+ // a guarded put (#133) expands into its item plus its sentinel
366
+ // reservations and releases plus a snapshot. The 1:1 "item index == caller
367
+ // index" assumption is gone, so the reason mapping below goes through
368
+ // `judgeCancellation` — the caller-facing `indices` on
369
+ // `AdditionalItemConditionFailed` are still indices into the caller's
370
+ // `additionalItems` array, unchanged.
371
+ const transactItems = [
372
+ ...contiguityCheck,
373
+ ...eventItems,
374
+ ...additionalItems,
375
+ ];
376
+ const checkCount = contiguityCheck.length;
377
+ const eventCount = eventItems.length;
378
+ const sentinelIndex = idempotency !== undefined ? transactItems.length : -1;
379
+ if (idempotency !== undefined) {
380
+ const sentinel = {
381
+ pk,
382
+ sk: DynamoSchema.composeKey(schema, commandKeyLabel, [idempotency.commandId], keyOptions),
383
+ __edd_e__: commandEntityType,
393
384
  streamId: streamIdStr,
394
385
  commandId: idempotency.commandId,
386
+ version: expectedVersion + events.length,
387
+ timestamp: now,
388
+ };
389
+ if (idempotency.ttl !== undefined) {
390
+ const ttlSeconds = yield* Effect.try({
391
+ try: () => normalizeTtlSeconds(idempotency.ttl),
392
+ catch: (cause) => new ValidationError({
393
+ entityType: commandEntityType,
394
+ operation: "EventStore.append.idempotency.ttl",
395
+ cause,
396
+ }),
397
+ });
398
+ sentinel[resolveTtlAttributeName(tableConfig)] =
399
+ DateTime.toEpochSeconds(nowDateTime) + ttlSeconds;
400
+ }
401
+ transactItems.push({
402
+ Put: {
403
+ TableName: tableName,
404
+ Item: toAttributeMap(sentinel),
405
+ ConditionExpression: "attribute_not_exists(pk)",
406
+ },
395
407
  });
396
408
  }
397
- // The contiguity ConditionCheck and the event puts both mean "the
398
- // stream is not where you said it was", so they share one verdict.
399
- for (let i = 0; i < checkCount + eventCount; i++) {
400
- if (failedAt(i)) {
401
- return new VersionConflict({
409
+ // Checked before anything is sent: one op per item — an additional item
410
+ // repeating an event, the contiguity check or the idempotency sentinel
411
+ // is refused, as additional items repeating each other are — and the
412
+ // whole transaction within DynamoDB's 4 MB (#133).
413
+ const additionalStart = checkCount + eventCount;
414
+ const streamItemSource = (i) => i < checkCount
415
+ ? "the version-contiguity check"
416
+ : i < additionalStart
417
+ ? `the event at version ${expectedVersion + i - checkCount + 1}`
418
+ : "the idempotency sentinel";
419
+ const targets = transactItems.map((item, i) => i >= additionalStart && i < additionalStart + additionalItems.length
420
+ ? additional.targets[i - additionalStart]
421
+ : transactItemTarget(item, tableName, ["pk", "sk"], entityType, streamItemSource(i)));
422
+ yield* refuseRepeatedItems(targets, "EventStore.append");
423
+ yield* refuseOversizedTransaction(transactItems, targets, "EventStore.append");
424
+ const outcome = yield* client.transactWriteItems({ TransactItems: transactItems }).pipe(Effect.as(undefined), Effect.catch((error) => {
425
+ if (!isAwsTransactionCancelled(error.cause)) {
426
+ return Effect.fail(error);
427
+ }
428
+ const rawReasons = error.cause.CancellationReasons ?? [];
429
+ const reasons = rawReasons.map((r) => ({
430
+ code: r?.Code,
431
+ message: r?.Message,
432
+ }));
433
+ const failedAt = (index) => index >= 0 && reasons[index]?.code === "ConditionalCheckFailed";
434
+ // Precedence is ordered by how terminal the caller's response should
435
+ // be: a duplicate can never succeed on retry, a version conflict
436
+ // invites a re-read, and only then are the additional items judged.
437
+ if (idempotency !== undefined && failedAt(sentinelIndex)) {
438
+ return Effect.fail(new DuplicateCommand({
402
439
  streamName: config.streamName,
403
440
  streamId: streamIdStr,
404
- expectedVersion,
405
- });
441
+ commandId: idempotency.commandId,
442
+ }));
406
443
  }
407
- }
408
- // Attribute each failed additional ITEM back to the caller OP that
409
- // produced it. Several items can belong to one op (its main item, its
410
- // sentinels, its snapshot), so indices are deduped — a caller who
411
- // passed one op must never see it reported twice.
412
- const failedOps = new Set();
413
- for (let i = 0; i < additionalCount; i++) {
414
- if (!failedAt(checkCount + eventCount + i))
415
- continue;
416
- const from = additionalProvenance[i];
417
- // A reason with no provenance entry cannot be justified positionally;
418
- // fall through to TransactionCancelled rather than guess.
419
- if (from !== undefined)
420
- failedOps.add(from.opIndex);
421
- }
422
- const failedAdditional = Array.from(failedOps).sort((a, b) => a - b);
423
- if (failedAdditional.length > 0) {
424
- return new AdditionalItemConditionFailed({
425
- streamName: config.streamName,
426
- streamId: streamIdStr,
427
- indices: failedAdditional,
444
+ // The contiguity ConditionCheck and the event puts both mean "the
445
+ // stream is not where you said it was", so they share one verdict.
446
+ for (let i = 0; i < checkCount + eventCount; i++) {
447
+ if (failedAt(i)) {
448
+ return Effect.fail(new VersionConflict({
449
+ streamName: config.streamName,
450
+ streamId: streamIdStr,
451
+ expectedVersion,
452
+ }));
453
+ }
454
+ }
455
+ // The additional items, attributed back to the caller OPS that
456
+ // produced them (several items can belong to one op). Only an op's
457
+ // own condition is `AdditionalItemConditionFailed`: a guarded put
458
+ // the caller set no condition on reports what the entity's own put
459
+ // would — a taken unique value, a history conflict — or, having
460
+ // lost a race to a concurrent write, is written again (#133).
461
+ const judged = judgeCancellation(additional, rawReasons, checkCount + eventCount);
462
+ if (judged?._tag === "fail")
463
+ return Effect.fail(judged.error);
464
+ if (judged?._tag === "conditions") {
465
+ return Effect.fail(new AdditionalItemConditionFailed({
466
+ streamName: config.streamName,
467
+ streamId: streamIdStr,
468
+ indices: judged.opIndices,
469
+ reasons,
470
+ }));
471
+ }
472
+ if (judged?._tag === "retry")
473
+ return Effect.succeed(judged.error);
474
+ // No conditional failure we can positionally justify (throttling,
475
+ // TransactionConflict, or a truncated/absent reason list) — never
476
+ // guess a VersionConflict.
477
+ return Effect.fail(new TransactionCancelled({
478
+ operation: "TransactWriteItems",
428
479
  reasons,
429
- });
480
+ cause: error.cause,
481
+ }));
482
+ }));
483
+ if (outcome === undefined) {
484
+ return {
485
+ version: expectedVersion + events.length,
486
+ events,
487
+ };
430
488
  }
431
- // No conditional failure we can positionally justify (throttling,
432
- // TransactionConflict, or a truncated/absent reason list) — never
433
- // guess a VersionConflict.
434
- return new TransactionCancelled({
435
- operation: "TransactWriteItems",
436
- reasons,
437
- cause: error.cause,
438
- });
439
- }));
440
- return {
441
- version: expectedVersion + events.length,
442
- events,
443
- };
489
+ lost = outcome;
490
+ }
491
+ return yield* Effect.fail(lost);
444
492
  });
445
493
  // ---------------------------------------------------------------------------
446
494
  // read