@farukada/aws-langgraph-dynamodb-ts 0.4.0 → 0.6.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 (75) hide show
  1. package/README.md +3 -3
  2. package/dist/checkpointer/actions/put-writes.d.ts +4 -4
  3. package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
  4. package/dist/checkpointer/actions/put-writes.js +22 -25
  5. package/dist/checkpointer/actions/put-writes.js.map +1 -1
  6. package/dist/checkpointer/internal/item-writer.d.ts +18 -9
  7. package/dist/checkpointer/internal/item-writer.d.ts.map +1 -1
  8. package/dist/checkpointer/internal/item-writer.js +28 -11
  9. package/dist/checkpointer/internal/item-writer.js.map +1 -1
  10. package/dist/checkpointer/internal/special-write-cleanup.d.ts +18 -0
  11. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +1 -0
  12. package/dist/checkpointer/internal/special-write-cleanup.js +108 -0
  13. package/dist/checkpointer/internal/special-write-cleanup.js.map +1 -0
  14. package/dist/factory/factory.d.ts +2 -0
  15. package/dist/factory/factory.d.ts.map +1 -1
  16. package/dist/factory/factory.js.map +1 -1
  17. package/dist/history/actions/clear.js +1 -1
  18. package/dist/history/actions/clear.js.map +1 -1
  19. package/dist/history/internal/append-saga.js +24 -21
  20. package/dist/history/internal/append-saga.js.map +1 -1
  21. package/dist/history/internal/message-transaction.d.ts +11 -6
  22. package/dist/history/internal/message-transaction.d.ts.map +1 -1
  23. package/dist/history/internal/message-transaction.js +40 -13
  24. package/dist/history/internal/message-transaction.js.map +1 -1
  25. package/dist/history/internal/query.d.ts +5 -1
  26. package/dist/history/internal/query.d.ts.map +1 -1
  27. package/dist/history/internal/query.js +5 -2
  28. package/dist/history/internal/query.js.map +1 -1
  29. package/dist/history/internal/session-count.d.ts +20 -0
  30. package/dist/history/internal/session-count.d.ts.map +1 -0
  31. package/dist/history/internal/session-count.js +58 -0
  32. package/dist/history/internal/session-count.js.map +1 -0
  33. package/dist/history/internal/session-update.d.ts +4 -1
  34. package/dist/history/internal/session-update.d.ts.map +1 -1
  35. package/dist/history/internal/session-update.js +22 -2
  36. package/dist/history/internal/session-update.js.map +1 -1
  37. package/dist/shared/codec/s3/offloader.js +1 -1
  38. package/dist/shared/codec/s3/offloader.js.map +1 -1
  39. package/dist/shared/dynamodb/batch-write.d.ts +11 -1
  40. package/dist/shared/dynamodb/batch-write.d.ts.map +1 -1
  41. package/dist/shared/dynamodb/batch-write.js +22 -3
  42. package/dist/shared/dynamodb/batch-write.js.map +1 -1
  43. package/dist/shared/dynamodb/cancellation.d.ts +7 -0
  44. package/dist/shared/dynamodb/cancellation.d.ts.map +1 -0
  45. package/dist/shared/dynamodb/cancellation.js +8 -0
  46. package/dist/shared/dynamodb/cancellation.js.map +1 -0
  47. package/dist/shared/dynamodb/retry-classifier.d.ts.map +1 -1
  48. package/dist/shared/dynamodb/retry-classifier.js +2 -1
  49. package/dist/shared/dynamodb/retry-classifier.js.map +1 -1
  50. package/dist/shared/errors/errors.d.ts +6 -1
  51. package/dist/shared/errors/errors.d.ts.map +1 -1
  52. package/dist/shared/errors/errors.js +8 -2
  53. package/dist/shared/errors/errors.js.map +1 -1
  54. package/dist/store/actions/list-namespaces.d.ts.map +1 -1
  55. package/dist/store/actions/list-namespaces.js +10 -2
  56. package/dist/store/actions/list-namespaces.js.map +1 -1
  57. package/dist/store/actions/put.d.ts +5 -7
  58. package/dist/store/actions/put.d.ts.map +1 -1
  59. package/dist/store/actions/put.js +7 -28
  60. package/dist/store/actions/put.js.map +1 -1
  61. package/dist/store/internal/filter.d.ts.map +1 -1
  62. package/dist/store/internal/filter.js +6 -2
  63. package/dist/store/internal/filter.js.map +1 -1
  64. package/dist/store/internal/index-reconcile.d.ts.map +1 -1
  65. package/dist/store/internal/index-reconcile.js +1 -0
  66. package/dist/store/internal/index-reconcile.js.map +1 -1
  67. package/dist/store/internal/persist.d.ts +11 -0
  68. package/dist/store/internal/persist.d.ts.map +1 -0
  69. package/dist/store/internal/persist.js +38 -0
  70. package/dist/store/internal/persist.js.map +1 -0
  71. package/dist/store/internal/write-verify.d.ts +12 -0
  72. package/dist/store/internal/write-verify.d.ts.map +1 -0
  73. package/dist/store/internal/write-verify.js +28 -0
  74. package/dist/store/internal/write-verify.js.map +1 -0
  75. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"message-transaction.d.ts","sourceRoot":"","sources":["../../../src/history/internal/message-transaction.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,eAAe,EAAE,EACxB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"message-transaction.d.ts","sourceRoot":"","sources":["../../../src/history/internal/message-transaction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAuCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,eAAe,EAAE,EACxB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -3,31 +3,58 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.writeMessageChunk = writeMessageChunk;
4
4
  const node_crypto_1 = require("node:crypto");
5
5
  const constants_1 = require("../../shared/constants");
6
+ const cancellation_1 = require("../../shared/dynamodb/cancellation");
6
7
  const retry_1 = require("../../shared/dynamodb/retry");
7
8
  const session_update_1 = require("./session-update");
8
- /**
9
- * Atomically write a chunk of message items together with the session-metadata
10
- * count update in one {@link https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html | TransactWriteItems}
11
- * call, so `messageCount` can never disagree with the messages that landed. A
12
- * single `ClientRequestToken` is reused across retries so a re-sent commit (e.g.
13
- * after a lost response) is idempotent and never double-applies the count `ADD`.
14
- * The transaction always touches the session's shared metadata row, so
15
- * concurrent appends to the same session contend on it; retries use
16
- * {@link MESSAGE_APPEND_RETRY_MAX_ATTEMPTS} rather than the default budget so a
17
- * burst of concurrent callers can drain via backoff instead of erroring.
18
- */
19
- async function writeMessageChunk(context, items, fields, retry = {}) {
20
- const input = {
9
+ /** True when a TransactWriteItems cancellation was caused solely by the SESSION update's ttl condition (always TransactItems index 0 — see buildInput below), not by any message item. */
10
+ function isTtlConditionLoss(error) {
11
+ const reasons = (0, cancellation_1.getCancellationReasons)(error);
12
+ return (reasons?.[0]?.Code === 'ConditionalCheckFailed' &&
13
+ reasons.slice(1).every((reason) => reason.Code === 'None'));
14
+ }
15
+ function buildInput(context, items, fields) {
16
+ return {
21
17
  TransactItems: [
22
18
  (0, session_update_1.buildSessionUpdateItem)(context.tableName, fields),
23
19
  ...items.map((item) => ({ Put: { TableName: context.tableName, Item: item } })),
24
20
  ],
25
21
  ClientRequestToken: (0, node_crypto_1.randomUUID)(),
26
22
  };
23
+ }
24
+ async function attempt(context, items, fields, retry) {
25
+ const input = buildInput(context, items, fields);
27
26
  await (0, retry_1.withDynamoDBRetry)(() => context.client.transactWrite(input), {
28
27
  maxAttempts: constants_1.MESSAGE_APPEND_RETRY_MAX_ATTEMPTS,
29
28
  rng: retry.rng,
30
29
  signal: retry.signal,
31
30
  });
32
31
  }
32
+ /**
33
+ * Atomically write a chunk of message items together with the session-metadata
34
+ * count update in one {@link https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html | TransactWriteItems}
35
+ * call, so `messageCount` can never disagree with the messages that landed. A
36
+ * single `ClientRequestToken` is used per attempt so a re-sent commit (e.g.
37
+ * after a lost response) is idempotent and never double-applies the count
38
+ * `ADD`. When `fields.forceTtlRefresh` is set, the session update carries a
39
+ * monotonic ConditionExpression (see session-update.ts); if — and only if —
40
+ * that specific condition loses a race against a concurrent caller who just
41
+ * healed the same anchor, this retries the identical chunk once with
42
+ * `forceTtlRefresh: false` (safe: `if_not_exists` then converges to whatever
43
+ * already won) rather than losing the message writes to a benign ttl race. A
44
+ * cancellation caused by any other item (a genuine message-row conflict) is
45
+ * not retried here — it propagates for the normal transient-conflict retry
46
+ * budget inside `withDynamoDBRetry` to handle, or to the caller otherwise.
47
+ */
48
+ async function writeMessageChunk(context, items, fields, retry = {}) {
49
+ try {
50
+ await attempt(context, items, fields, retry);
51
+ }
52
+ catch (error) {
53
+ if (fields.forceTtlRefresh && isTtlConditionLoss(error)) {
54
+ await attempt(context, items, { ...fields, forceTtlRefresh: false }, retry);
55
+ return;
56
+ }
57
+ throw error;
58
+ }
59
+ }
33
60
  //# sourceMappingURL=message-transaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-transaction.js","sourceRoot":"","sources":["../../../src/history/internal/message-transaction.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,sDAA2E;AAC3E,uDAAgE;AAEhE,qDAAoF;AASpF;;;;;;;;;;GAUG;AACI,KAAK,4BACV,OAAuB,EACvB,KAAwB,EACxB,MAA2B,EAC3B,KAAK,GAAsB,EAAE;IAE7B,MAAM,KAAK,GAAG;QACZ,aAAa,EAAE;YACb,IAAA,uCAAsB,EAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;YACjD,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SAChF;QACD,kBAAkB,EAAE,IAAA,wBAAU,GAAE;KACjC,CAAC;IACF,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QACjE,WAAW,EAAE,6CAAiC;QAC9C,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"message-transaction.js","sourceRoot":"","sources":["../../../src/history/internal/message-transaction.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,sDAA2E;AAC3E,qEAA4E;AAC5E,uDAAgE;AAEhE,qDAI0B;AAS1B,0LAA0L;AAC1L,SAAS,kBAAkB,CAAC,KAAY;IACtC,MAAM,OAAO,GAAG,IAAA,qCAAsB,EAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CACL,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,wBAAwB;QAC/C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,OAAuB,EACvB,KAAwB,EACxB,MAA2B;IAE3B,OAAO;QACL,aAAa,EAAE;YACb,IAAA,uCAAsB,EAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;YACjD,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SAChF;QACD,kBAAkB,EAAE,IAAA,wBAAU,GAAE;KACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAuB,EACvB,KAAwB,EACxB,MAA2B,EAC3B,KAAwB;IAExB,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QACjE,WAAW,EAAE,6CAAiC;QAC9C,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACI,KAAK,4BACV,OAAuB,EACvB,KAAwB,EACxB,MAA2B,EAC3B,KAAK,GAAsB,EAAE;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC,KAAc,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,6 +1,10 @@
1
1
  import type { QueryCommandInput } from '@aws-sdk/lib-dynamodb';
2
+ /** Options for {@link sessionItemsQuery}. */
3
+ export interface SessionItemsQueryOptions {
4
+ consistent?: boolean;
5
+ }
2
6
  /** Query input selecting every item in a session's partition (messages + metadata). */
3
- export declare function sessionItemsQuery(tableName: string, sessionId: string): QueryCommandInput;
7
+ export declare function sessionItemsQuery(tableName: string, sessionId: string, options?: SessionItemsQueryOptions): QueryCommandInput;
4
8
  /** Query input selecting a session's message items in chronological order. */
5
9
  export declare function messageQuery(tableName: string, sessionId: string): QueryCommandInput;
6
10
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/history/internal/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAOzF;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAWpF"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/history/internal/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CASnB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAWpF"}
@@ -4,13 +4,16 @@ exports.sessionItemsQuery = sessionItemsQuery;
4
4
  exports.messageQuery = messageQuery;
5
5
  const keys_1 = require("./keys");
6
6
  /** Query input selecting every item in a session's partition (messages + metadata). */
7
- function sessionItemsQuery(tableName, sessionId) {
8
- return {
7
+ function sessionItemsQuery(tableName, sessionId, options = {}) {
8
+ const params = {
9
9
  TableName: tableName,
10
10
  KeyConditionExpression: '#pk = :pk',
11
11
  ExpressionAttributeNames: { '#pk': 'PK' },
12
12
  ExpressionAttributeValues: { ':pk': (0, keys_1.sessionPartition)(sessionId) },
13
13
  };
14
+ if (options.consistent)
15
+ params.ConsistentRead = true;
16
+ return params;
14
17
  }
15
18
  /** Query input selecting a session's message items in chronological order. */
16
19
  function messageQuery(tableName, sessionId) {
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/history/internal/query.ts"],"names":[],"mappings":";;;;AAEA,iCAAgE;AAEhE,uFAAuF;AACvF,2BAAkC,SAAiB,EAAE,SAAiB;IACpE,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,sBAAsB,EAAE,WAAW;QACnC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QACzC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE;KAClE,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sBAA6B,SAAiB,EAAE,SAAiB;IAC/D,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,sBAAsB,EAAE,sCAAsC;QAC9D,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACtD,yBAAyB,EAAE;YACzB,KAAK,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC;YAClC,MAAM,EAAE,IAAA,2BAAoB,GAAE;SAC/B;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/history/internal/query.ts"],"names":[],"mappings":";;;;AAEA,iCAAgE;AAOhE,uFAAuF;AACvF,2BACE,SAAiB,EACjB,SAAiB,EACjB,OAAO,GAA6B,EAAE;IAEtC,MAAM,MAAM,GAAsB;QAChC,SAAS,EAAE,SAAS;QACpB,sBAAsB,EAAE,WAAW;QACnC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QACzC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE;KAClE,CAAC;IACF,IAAI,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,sBAA6B,SAAiB,EAAE,SAAiB;IAC/D,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,sBAAsB,EAAE,sCAAsC;QAC9D,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACtD,yBAAyB,EAAE;YACzB,KAAK,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC;YAClC,MAAM,EAAE,IAAA,2BAAoB,GAAE;SAC/B;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { HistoryContext } from './setup';
2
+ /**
3
+ * Subtract a previously-added count from the session, leaving it consistent.
4
+ * Guarded so a concurrently-deleted SESSION row is never resurrected as a
5
+ * permanent, ttl-less junk row: if the row is already gone there is nothing
6
+ * to revert, so that specific condition failure is swallowed rather than
7
+ * surfaced — this runs only from an already-in-progress rollback, where a
8
+ * spurious error for a no-op would misrepresent what happened.
9
+ *
10
+ * Deliberately does not revert a `forceTtlRefresh`-driven ttl SET from an
11
+ * earlier committed chunk: the healed anchor is never shorter than what
12
+ * was there before, so leaving it in place after a rollback only means the
13
+ * session's metadata row outlives its content a bit longer than ideal —
14
+ * self-healing (the next successful append, or DynamoDB's own TTL sweep,
15
+ * resolves it), unlike reverting, which would need to re-check for a
16
+ * concurrent legitimate extension to avoid regressing it. See README.md's
17
+ * "TTL expiry" section.
18
+ */
19
+ export declare function revertSessionCount(context: HistoryContext, sessionId: string, delta: number): Promise<void>;
20
+ //# sourceMappingURL=session-count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-count.d.ts","sourceRoot":"","sources":["../../../src/history/internal/session-count.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAe9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.revertSessionCount = revertSessionCount;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const cancellation_1 = require("../../shared/dynamodb/cancellation");
6
+ const retry_1 = require("../../shared/dynamodb/retry");
7
+ const keys_1 = require("./keys");
8
+ /**
9
+ * True when a TransactWriteItems cancellation was caused by a
10
+ * ConditionalCheckFailed reason. Named distinctly from
11
+ * checkpointer/actions/put-writes.ts's isConditionalCheckFailed, which
12
+ * checks a different thing entirely (a raw PutItem exception name, not a
13
+ * transaction cancellation reason) — this function had that same name
14
+ * until now, a real trap for whoever read one assuming it was the other.
15
+ */
16
+ function isCancelledByCondition(error) {
17
+ const reasons = (0, cancellation_1.getCancellationReasons)(error);
18
+ return reasons?.[0]?.Code === 'ConditionalCheckFailed';
19
+ }
20
+ /**
21
+ * Subtract a previously-added count from the session, leaving it consistent.
22
+ * Guarded so a concurrently-deleted SESSION row is never resurrected as a
23
+ * permanent, ttl-less junk row: if the row is already gone there is nothing
24
+ * to revert, so that specific condition failure is swallowed rather than
25
+ * surfaced — this runs only from an already-in-progress rollback, where a
26
+ * spurious error for a no-op would misrepresent what happened.
27
+ *
28
+ * Deliberately does not revert a `forceTtlRefresh`-driven ttl SET from an
29
+ * earlier committed chunk: the healed anchor is never shorter than what
30
+ * was there before, so leaving it in place after a rollback only means the
31
+ * session's metadata row outlives its content a bit longer than ideal —
32
+ * self-healing (the next successful append, or DynamoDB's own TTL sweep,
33
+ * resolves it), unlike reverting, which would need to re-check for a
34
+ * concurrent legitimate extension to avoid regressing it. See README.md's
35
+ * "TTL expiry" section.
36
+ */
37
+ async function revertSessionCount(context, sessionId, delta) {
38
+ if (delta === 0)
39
+ return;
40
+ const update = {
41
+ TableName: context.tableName,
42
+ Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
43
+ UpdateExpression: 'ADD #count :neg',
44
+ ConditionExpression: 'attribute_exists(PK)',
45
+ ExpressionAttributeNames: { '#count': 'messageCount' },
46
+ ExpressionAttributeValues: { ':neg': -delta },
47
+ };
48
+ const input = { TransactItems: [{ Update: update }], ClientRequestToken: (0, node_crypto_1.randomUUID)() };
49
+ try {
50
+ await (0, retry_1.withDynamoDBRetry)(() => context.client.transactWrite(input));
51
+ }
52
+ catch (error) {
53
+ if (isCancelledByCondition(error))
54
+ return;
55
+ throw error;
56
+ }
57
+ }
58
+ //# sourceMappingURL=session-count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-count.js","sourceRoot":"","sources":["../../../src/history/internal/session-count.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,qEAA4E;AAC5E,uDAAgE;AAChE,iCAA4D;AAG5D;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,KAAY;IAC1C,MAAM,OAAO,GAAG,IAAA,qCAAsB,EAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,wBAAwB,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,6BACV,OAAuB,EACvB,SAAiB,EACjB,KAAa;IAEb,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO;IACxB,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;QAC9D,gBAAgB,EAAE,iBAAiB;QACnC,mBAAmB,EAAE,sBAAsB;QAC3C,wBAAwB,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;QACtD,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE;KAC9C,CAAC;IACF,MAAM,KAAK,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,IAAA,wBAAU,GAAE,EAAE,CAAC;IACxF,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,sBAAsB,CAAC,KAAc,CAAC;YAAE,OAAO;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -19,7 +19,10 @@ export interface SessionUpdateFields {
19
19
  * `forceTtlRefresh` is set (because {@link resolveTtlAnchor} found the persisted
20
20
  * anchor missing or already expired), the `ttl` clause instead does a plain
21
21
  * `SET`, so the SESSION row's own stale attribute actually heals instead of
22
- * being permanently blocked by `if_not_exists`.
22
+ * being permanently blocked by `if_not_exists`. When forceTtlRefresh is set,
23
+ * the SET is additionally guarded by a ConditionExpression so a concurrent
24
+ * caller's already-healed anchor can never be regressed backward — see
25
+ * message-transaction.ts for how a lost race is retried without forcing.
23
26
  */
24
27
  export declare function buildSessionUpdateItem(tableName: string, fields: SessionUpdateFields): HistoryTransactItem;
25
28
  //# sourceMappingURL=session-update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-update.d.ts","sourceRoot":"","sources":["../../../src/history/internal/session-update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAI7F,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAElG,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,GAC1B,mBAAmB,CAiCrB"}
1
+ {"version":3,"file":"session-update.d.ts","sourceRoot":"","sources":["../../../src/history/internal/session-update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAI7F,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAElG,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,GAC1B,mBAAmB,CAiDrB"}
@@ -11,7 +11,10 @@ const keys_1 = require("./keys");
11
11
  * `forceTtlRefresh` is set (because {@link resolveTtlAnchor} found the persisted
12
12
  * anchor missing or already expired), the `ttl` clause instead does a plain
13
13
  * `SET`, so the SESSION row's own stale attribute actually heals instead of
14
- * being permanently blocked by `if_not_exists`.
14
+ * being permanently blocked by `if_not_exists`. When forceTtlRefresh is set,
15
+ * the SET is additionally guarded by a ConditionExpression so a concurrent
16
+ * caller's already-healed anchor can never be regressed backward — see
17
+ * message-transaction.ts for how a lost race is retried without forcing.
15
18
  */
16
19
  function buildSessionUpdateItem(tableName, fields) {
17
20
  const names = {
@@ -32,16 +35,33 @@ function buildSessionUpdateItem(tableName, fields) {
32
35
  values[':title'] = fields.title;
33
36
  sets.push('#title = if_not_exists(#title, :title)');
34
37
  }
38
+ let conditionExpression;
35
39
  if (fields.ttlTimestamp !== undefined) {
36
40
  names['#ttl'] = 'ttl';
37
41
  values[':ttl'] = fields.ttlTimestamp;
38
- sets.push(fields.forceTtlRefresh ? '#ttl = :ttl' : '#ttl = if_not_exists(#ttl, :ttl)');
42
+ if (fields.forceTtlRefresh) {
43
+ sets.push('#ttl = :ttl');
44
+ /**
45
+ * Guards the force-overwrite so a concurrent caller's already-healed,
46
+ * equal-or-later anchor can never be regressed backward by this one.
47
+ * `<=` (not `<`): two concurrent healers of the same stale anchor
48
+ * typically compute the identical target timestamp, and `<=` lets
49
+ * the second one succeed by re-applying the same value instead of
50
+ * failing the condition and paying a full transaction retry for a
51
+ * write that was never actually a regression.
52
+ */
53
+ conditionExpression = 'attribute_not_exists(#ttl) OR #ttl <= :ttl';
54
+ }
55
+ else {
56
+ sets.push('#ttl = if_not_exists(#ttl, :ttl)');
57
+ }
39
58
  }
40
59
  return {
41
60
  Update: {
42
61
  TableName: tableName,
43
62
  Key: { PK: (0, keys_1.sessionPartition)(fields.sessionId), SK: keys_1.SESSION_SORT_KEY },
44
63
  UpdateExpression: `ADD #count :n SET ${sets.join(', ')}`,
64
+ ...(conditionExpression ? { ConditionExpression: conditionExpression } : {}),
45
65
  ExpressionAttributeNames: names,
46
66
  ExpressionAttributeValues: values,
47
67
  },
@@ -1 +1 @@
1
- {"version":3,"file":"session-update.js","sourceRoot":"","sources":["../../../src/history/internal/session-update.ts"],"names":[],"mappings":";;;AAEA,iCAA4D;AAe5D;;;;;;;;;;GAUG;AACH,gCACE,SAAiB,EACjB,MAA2B;IAE3B,MAAM,KAAK,GAA2B;QACpC,QAAQ,EAAE,cAAc;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,WAAW;KACpB,CAAC;IACF,MAAM,MAAM,GAAyC;QACnD,IAAI,EAAE,MAAM,CAAC,KAAK;QAClB,IAAI,EAAE,MAAM,CAAC,GAAG;QAChB,IAAI,EAAE,MAAM,CAAC,GAAG;QAChB,MAAM,EAAE,MAAM,CAAC,SAAS;KACzB,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,4BAA4B,EAAE,kCAAkC,CAAC,CAAC;IAC3F,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC;IACzF,CAAC;IACD,OAAO;QACL,MAAM,EAAE;YACN,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;YACrE,gBAAgB,EAAE,qBAAqB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxD,wBAAwB,EAAE,KAAK;YAC/B,yBAAyB,EAAE,MAAM;SAClC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"session-update.js","sourceRoot":"","sources":["../../../src/history/internal/session-update.ts"],"names":[],"mappings":";;;AAEA,iCAA4D;AAe5D;;;;;;;;;;;;;GAaG;AACH,gCACE,SAAiB,EACjB,MAA2B;IAE3B,MAAM,KAAK,GAA2B;QACpC,QAAQ,EAAE,cAAc;QACxB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,WAAW;KACpB,CAAC;IACF,MAAM,MAAM,GAAyC;QACnD,IAAI,EAAE,MAAM,CAAC,KAAK;QAClB,IAAI,EAAE,MAAM,CAAC,GAAG;QAChB,IAAI,EAAE,MAAM,CAAC,GAAG;QAChB,MAAM,EAAE,MAAM,CAAC,SAAS;KACzB,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,4BAA4B,EAAE,kCAAkC,CAAC,CAAC;IAC3F,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,mBAAuC,CAAC;IAC5C,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;QACrC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzB;;;;;;;;eAQG;YACH,mBAAmB,GAAG,4CAA4C,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE;YACN,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;YACrE,gBAAgB,EAAE,qBAAqB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxD,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,wBAAwB,EAAE,KAAK;YAC/B,yBAAyB,EAAE,MAAM;SAClC;KACF,CAAC;AACJ,CAAC"}
@@ -32,7 +32,7 @@ class S3Offloader {
32
32
  if (!this.clientPromise) {
33
33
  const cfg = this.config.clientConfig ?? {};
34
34
  this.clientPromise = (this.config.createS3Client
35
- ? Promise.resolve(this.config.createS3Client(cfg))
35
+ ? Promise.resolve(this.config.createS3Client({ maxAttempts: 1, ...cfg }))
36
36
  : (0, client_1.createDefaultS3Client)(cfg)).then((client) => {
37
37
  this.resolvedClient = client;
38
38
  return client;
@@ -1 +1 @@
1
- {"version":3,"file":"offloader.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/offloader.ts"],"names":[],"mappings":";;;AAEA,+CAAoG;AACpG,qCAAiD;AACjD,qCAAuD;AACvD,qCAAyC;AACzC,2CAAkD;AAClD,6CAA4D;AAE5D;;;GAGG;AACH;IACU,aAAa,CAAgC;IAC7C,cAAc,CAAuB;IAC5B,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,GAAG,CAAS;IACZ,WAAW,CAAU;IACrB,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,iCAAqB,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,sCAA0B,CAAC;QAC1E,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,oBAAoB,IAAI,0BAAc,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,GAAG,CACnB,IAAI,CAAC,MAAM,CAAC,cAAc;gBACxB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAClD,CAAC,CAAC,IAAA,8BAAqB,EAAC,GAAG,CAAC,CAC/B,CAAC,IAAI,CACJ,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;gBAC7B,OAAO,MAAM,CAAC;YAChB,CAAC,EACD,CAAC,KAAY,EAAE,EAAE;gBACf,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,MAAM,KAAK,CAAC;YACd,CAAC,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,8DAA8D;IAC9D,aAAa,CAAC,IAAgB;QAC5B,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC;IAC5C,CAAC;IAED,gDAAgD;IAChD,QAAQ,CAAC,KAAwB;QAC/B,OAAO,IAAA,mBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,IAAgB;QACxC,MAAM,IAAA,yBAAY,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,UAAU;YACvB,GAAG;YACH,IAAI;YACJ,oBAAoB,EAAE,IAAI,CAAC,GAAG;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAA,2BAAc,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,OAAO,IAAA,sBAAa,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,mBAAmB,CAAC,OAAe;QACvC,OAAO,IAAA,+BAAmB,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/F,CAAC;IAED,4DAA4D;IAC5D,OAAO;QACL,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC;CACF"}
1
+ {"version":3,"file":"offloader.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/offloader.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,17 @@ import type { WriteRequest } from './types';
7
7
  * chunk's failure — order-independent writes (deletes/puts) should never
8
8
  * lose "later" chunks just because an earlier one failed. If any chunk fails,
9
9
  * throws {@link BatchWriteAllIncompleteError} reporting exactly how many
10
- * chunks succeeded vs. failed once every chunk has been attempted.
10
+ * chunks succeeded vs. failed, and exactly how many individual writes
11
+ * persisted, once every chunk has been attempted.
12
+ *
13
+ * This is this function's ONLY throw site. Two callers —
14
+ * checkpointer/internal/special-write-cleanup.ts and
15
+ * history/internal/append-saga.ts — type-assert a caught error straight to
16
+ * {@link BatchWriteAllIncompleteError} on that guarantee (not `instanceof`,
17
+ * banned repo-wide) instead of narrowing it, since this project enforces
18
+ * 100% branch coverage and a defensive else-branch here would be
19
+ * unreachable, hence untestable. Adding another throw path to this function
20
+ * requires updating both call sites.
11
21
  */
12
22
  export declare function batchWriteAll(client: DynamoDBDocument, tableName: string, requests: WriteRequest[], options?: DrainOptions): Promise<void>;
13
23
  //# sourceMappingURL=batch-write.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"batch-write.d.ts","sourceRoot":"","sources":["../../../src/shared/dynamodb/batch-write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"batch-write.d.ts","sourceRoot":"","sources":["../../../src/shared/dynamodb/batch-write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAO5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -4,30 +4,49 @@ exports.batchWriteAll = batchWriteAll;
4
4
  const constants_1 = require("../constants");
5
5
  const errors_1 = require("../errors/errors");
6
6
  const drain_unprocessed_1 = require("./drain-unprocessed");
7
+ /** True when `error` is a {@link BatchWriteIncompleteError} — checked by name, not `instanceof`. */
8
+ function isBatchWriteIncomplete(error) {
9
+ return error.name === 'BatchWriteIncompleteError';
10
+ }
7
11
  /**
8
12
  * Write an arbitrary number of requests, chunked into batches of 25 (the
9
13
  * BatchWriteItem limit). Every chunk is attempted regardless of an earlier
10
14
  * chunk's failure — order-independent writes (deletes/puts) should never
11
15
  * lose "later" chunks just because an earlier one failed. If any chunk fails,
12
16
  * throws {@link BatchWriteAllIncompleteError} reporting exactly how many
13
- * chunks succeeded vs. failed once every chunk has been attempted.
17
+ * chunks succeeded vs. failed, and exactly how many individual writes
18
+ * persisted, once every chunk has been attempted.
19
+ *
20
+ * This is this function's ONLY throw site. Two callers —
21
+ * checkpointer/internal/special-write-cleanup.ts and
22
+ * history/internal/append-saga.ts — type-assert a caught error straight to
23
+ * {@link BatchWriteAllIncompleteError} on that guarantee (not `instanceof`,
24
+ * banned repo-wide) instead of narrowing it, since this project enforces
25
+ * 100% branch coverage and a defensive else-branch here would be
26
+ * unreachable, hence untestable. Adding another throw path to this function
27
+ * requires updating both call sites.
14
28
  */
15
29
  async function batchWriteAll(client, tableName, requests, options = {}) {
16
30
  const totalChunks = Math.ceil(requests.length / constants_1.BATCH_WRITE_MAX);
17
31
  let succeededChunks = 0;
32
+ let succeededCount = 0;
18
33
  const failedChunks = [];
19
34
  for (let offset = 0; offset < requests.length; offset += constants_1.BATCH_WRITE_MAX) {
20
35
  const chunk = requests.slice(offset, offset + constants_1.BATCH_WRITE_MAX);
21
36
  try {
22
37
  await (0, drain_unprocessed_1.drainUnprocessedWrites)(client, tableName, chunk, options);
23
38
  succeededChunks += 1;
39
+ succeededCount += chunk.length;
24
40
  }
25
41
  catch (error) {
26
- failedChunks.push(error);
42
+ const err = error;
43
+ failedChunks.push(err);
44
+ if (isBatchWriteIncomplete(err))
45
+ succeededCount += err.succeededCount;
27
46
  }
28
47
  }
29
48
  if (failedChunks.length > 0) {
30
- throw new errors_1.BatchWriteAllIncompleteError(succeededChunks, totalChunks, failedChunks);
49
+ throw new errors_1.BatchWriteAllIncompleteError(succeededChunks, totalChunks, failedChunks, succeededCount);
31
50
  }
32
51
  }
33
52
  //# sourceMappingURL=batch-write.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"batch-write.js","sourceRoot":"","sources":["../../../src/shared/dynamodb/batch-write.ts"],"names":[],"mappings":";;;AAEA,4CAA+C;AAC/C,6CAAgE;AAChE,2DAA2E;AAG3E;;;;;;;GAOG;AACI,KAAK,wBACV,MAAwB,EACxB,SAAiB,EACjB,QAAwB,EACxB,OAAO,GAAiB,EAAE;IAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,2BAAe,CAAC,CAAC;IACjE,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,YAAY,GAAY,EAAE,CAAC;IACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,2BAAe,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,2BAAe,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,IAAA,0CAAsB,EAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAChE,eAAe,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAc,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,qCAA4B,CAAC,eAAe,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"batch-write.js","sourceRoot":"","sources":["../../../src/shared/dynamodb/batch-write.ts"],"names":[],"mappings":";;;AAEA,4CAA+C;AAC/C,6CAA2F;AAC3F,2DAA2E;AAG3E,oGAAoG;AACpG,SAAS,sBAAsB,CAAC,KAAY;IAC1C,OAAO,KAAK,CAAC,IAAI,KAAK,2BAA2B,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,wBACV,MAAwB,EACxB,SAAiB,EACjB,QAAwB,EACxB,OAAO,GAAiB,EAAE;IAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,2BAAe,CAAC,CAAC;IACjE,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,YAAY,GAAY,EAAE,CAAC;IACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,2BAAe,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,2BAAe,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,IAAA,0CAAsB,EAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAChE,eAAe,IAAI,CAAC,CAAC;YACrB,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAc,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,sBAAsB,CAAC,GAAG,CAAC;gBAAE,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC;QACxE,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,qCAA4B,CACpC,eAAe,EACf,WAAW,EACX,YAAY,EACZ,cAAc,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** One entry of a TransactWriteItems/TransactionCanceledException's CancellationReasons. */
2
+ export interface CancellationReason {
3
+ Code?: string;
4
+ }
5
+ /** Extract `CancellationReasons` from a transaction-cancellation error, if present. */
6
+ export declare function getCancellationReasons(error: Error): CancellationReason[] | undefined;
7
+ //# sourceMappingURL=cancellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../../../src/shared/dynamodb/cancellation.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAErF"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCancellationReasons = getCancellationReasons;
4
+ /** Extract `CancellationReasons` from a transaction-cancellation error, if present. */
5
+ function getCancellationReasons(error) {
6
+ return error.CancellationReasons;
7
+ }
8
+ //# sourceMappingURL=cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../../src/shared/dynamodb/cancellation.ts"],"names":[],"mappings":";;;AAKA,uFAAuF;AACvF,gCAAuC,KAAY;IACjD,OAAQ,KAAwD,CAAC,mBAAmB,CAAC;AACvF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"retry-classifier.d.ts","sourceRoot":"","sources":["../../../src/shared/dynamodb/retry-classifier.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAiBrD,CAAC;AAwDF,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAK1F"}
1
+ {"version":3,"file":"retry-classifier.d.ts","sourceRoot":"","sources":["../../../src/shared/dynamodb/retry-classifier.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAiBrD,CAAC;AAmDF,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAK1F"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_RETRYABLE_ERRORS = void 0;
4
4
  exports.isRetryableError = isRetryableError;
5
+ const cancellation_1 = require("./cancellation");
5
6
  const MAX_CAUSE_DEPTH = 32;
6
7
  /**
7
8
  * Default retryable transient signals. TransactionCanceledException is
@@ -43,7 +44,7 @@ const TRANSIENT_CANCELLATION_REASONS = [
43
44
  * applies. A bare cancellation with no reasons is treated as non-retryable.
44
45
  */
45
46
  function transactionCancellationRetryable(error) {
46
- const reasons = error.CancellationReasons;
47
+ const reasons = (0, cancellation_1.getCancellationReasons)(error);
47
48
  if (!reasons)
48
49
  return undefined;
49
50
  return reasons.every((reason) => reason.Code === undefined || TRANSIENT_CANCELLATION_REASONS.includes(reason.Code));
@@ -1 +1 @@
1
- {"version":3,"file":"retry-classifier.js","sourceRoot":"","sources":["../../../src/shared/dynamodb/retry-classifier.ts"],"names":[],"mappings":";;;;AAAA,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;GAIG;AACU,QAAA,wBAAwB,GAAsB;IACzD,wCAAwC;IACxC,qBAAqB;IACrB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,8BAA8B;IAC9B,gCAAgC;IAChC,gBAAgB;IAChB,yBAAyB;IACzB,YAAY;IACZ,cAAc;IACd,WAAW;IACX,OAAO;IACP,WAAW;IACX,iBAAiB;IACjB,cAAc;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,8BAA8B,GAAsB;IACxD,MAAM;IACN,qBAAqB;IACrB,iBAAiB;IACjB,+BAA+B;CAChC,CAAC;AAOF;;;;GAIG;AACH,SAAS,gCAAgC,CAAC,KAAY;IACpD,MAAM,OAAO,GAAI,KAAwD,CAAC,mBAAmB,CAAC;IAC9F,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAClB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,8BAA8B,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC9F,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAY;IAClC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,IAAW,EAAE,KAAa,EAAQ,EAAE;QAChD,IAAI,KAAK,GAAG,eAAe,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3F,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,IAMd,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,0BAAiC,KAAY,EAAE,eAAkC;IAC/E,MAAM,YAAY,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnG,CAAC"}
1
+ {"version":3,"file":"retry-classifier.js","sourceRoot":"","sources":["../../../src/shared/dynamodb/retry-classifier.ts"],"names":[],"mappings":";;;;AAAA,iDAAwD;AAExD,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;GAIG;AACU,QAAA,wBAAwB,GAAsB;IACzD,wCAAwC;IACxC,qBAAqB;IACrB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,8BAA8B;IAC9B,gCAAgC;IAChC,gBAAgB;IAChB,yBAAyB;IACzB,YAAY;IACZ,cAAc;IACd,WAAW;IACX,OAAO;IACP,WAAW;IACX,iBAAiB;IACjB,cAAc;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,8BAA8B,GAAsB;IACxD,MAAM;IACN,qBAAqB;IACrB,iBAAiB;IACjB,+BAA+B;CAChC,CAAC;AAEF;;;;GAIG;AACH,SAAS,gCAAgC,CAAC,KAAY;IACpD,MAAM,OAAO,GAAG,IAAA,qCAAsB,EAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAClB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,8BAA8B,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC9F,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAY;IAClC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,IAAW,EAAE,KAAa,EAAQ,EAAE;QAChD,IAAI,KAAK,GAAG,eAAe,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3F,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,IAMd,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,0BAAiC,KAAY,EAAE,eAAkC;IAC/E,MAAM,YAAY,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACnG,CAAC"}
@@ -40,12 +40,17 @@ export declare class BatchWriteIncompleteError extends DynamoDbLangGraphError {
40
40
  * it. `failedChunks` holds each failing chunk's own error (commonly a
41
41
  * {@link BatchWriteIncompleteError}); every chunk not represented there
42
42
  * drained successfully and its writes persist — there is no rollback.
43
+ * `succeededCount` is the exact number of individual write requests
44
+ * confirmed persisted across every chunk (full chunks plus any failed
45
+ * chunk's own partial drain), more precise than `succeededChunks` alone
46
+ * when a chunk partially drains before exhausting its retries.
43
47
  */
44
48
  export declare class BatchWriteAllIncompleteError extends DynamoDbLangGraphError {
45
49
  readonly succeededChunks: number;
46
50
  readonly totalChunks: number;
47
51
  readonly failedChunks: Error[];
48
- constructor(succeededChunks: number, totalChunks: number, failedChunks: Error[]);
52
+ readonly succeededCount: number;
53
+ constructor(succeededChunks: number, totalChunks: number, failedChunks: Error[], succeededCount?: number);
49
54
  }
50
55
  /**
51
56
  * A compensating rollback failed after an append-saga chunk error, so the
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/shared/errors/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,mEAAmE;AACnE,qBAAa,eAAgB,SAAQ,sBAAsB;IACzD,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAG1C;CACF;AAED,2EAA2E;AAC3E,qBAAa,aAAc,SAAQ,sBAAsB;IACvD,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAGzC;CACF;AAED,wDAAwD;AACxD,qBAAa,mBAAoB,SAAQ,sBAAsB;IAC7D,YAAY,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAG5D;CACF;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,YAAY,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAOrC;CACF;AAED,sDAAsD;AACtD,qBAAa,UAAW,SAAQ,sBAAsB;IACpD,YAAY,OAAO,SAAsB,EAGxC;CACF;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IACnE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC;IAErC,YAAY,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAS/E;CACF;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IACtE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;IAE/B,YAAY,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAY9E;CACF;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,sBAAsB;IACjE,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAE9B,YAAY,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAS7C;CACF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/shared/errors/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,mEAAmE;AACnE,qBAAa,eAAgB,SAAQ,sBAAsB;IACzD,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAG1C;CACF;AAED,2EAA2E;AAC3E,qBAAa,aAAc,SAAQ,sBAAsB;IACvD,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAGzC;CACF;AAED,wDAAwD;AACxD,qBAAa,mBAAoB,SAAQ,sBAAsB;IAC7D,YAAY,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAG5D;CACF;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,YAAY,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAOrC;CACF;AAED,sDAAsD;AACtD,qBAAa,UAAW,SAAQ,sBAAsB;IACpD,YAAY,OAAO,SAAsB,EAGxC;CACF;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IACnE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC;IAErC,YAAY,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAS/E;CACF;AAED;;;;;;;;;;GAUG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IACtE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,YACE,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,KAAK,EAAE,EACrB,cAAc,SAAI,EAcnB;CACF;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,sBAAsB;IACjE,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAE9B,YAAY,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAS7C;CACF"}
@@ -70,18 +70,24 @@ exports.BatchWriteIncompleteError = BatchWriteIncompleteError;
70
70
  * it. `failedChunks` holds each failing chunk's own error (commonly a
71
71
  * {@link BatchWriteIncompleteError}); every chunk not represented there
72
72
  * drained successfully and its writes persist — there is no rollback.
73
+ * `succeededCount` is the exact number of individual write requests
74
+ * confirmed persisted across every chunk (full chunks plus any failed
75
+ * chunk's own partial drain), more precise than `succeededChunks` alone
76
+ * when a chunk partially drains before exhausting its retries.
73
77
  */
74
78
  class BatchWriteAllIncompleteError extends base_error_1.DynamoDbLangGraphError {
75
79
  succeededChunks;
76
80
  totalChunks;
77
81
  failedChunks;
78
- constructor(succeededChunks, totalChunks, failedChunks) {
82
+ succeededCount;
83
+ constructor(succeededChunks, totalChunks, failedChunks, succeededCount = 0) {
79
84
  super(`batchWriteAll did not fully drain: ${succeededChunks}/${totalChunks} chunk(s) succeeded, ` +
80
- `${failedChunks.length} failed. Writes in succeeded chunks already persisted.`, error_code_1.ErrorCode.BATCH_WRITE_INCOMPLETE, {}, failedChunks[0]);
85
+ `${failedChunks.length} chunk(s) failed. ${succeededCount} write(s) persisted before the failure.`, error_code_1.ErrorCode.BATCH_WRITE_INCOMPLETE, {}, failedChunks[0]);
81
86
  this.name = 'BatchWriteAllIncompleteError';
82
87
  this.succeededChunks = succeededChunks;
83
88
  this.totalChunks = totalChunks;
84
89
  this.failedChunks = failedChunks;
90
+ this.succeededCount = succeededCount;
85
91
  }
86
92
  }
87
93
  exports.BatchWriteAllIncompleteError = BatchWriteAllIncompleteError;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/shared/errors/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/shared/errors/errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-namespaces.d.ts","sourceRoot":"","sources":["../../../src/store/actions/list-namespaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAQ/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWtD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,uBAAuB,GAC1B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAsBrB"}
1
+ {"version":3,"file":"list-namespaces.d.ts","sourceRoot":"","sources":["../../../src/store/actions/list-namespaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAQ/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAmBtD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,uBAAuB,GAC1B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAsBrB"}
@@ -11,9 +11,17 @@ const validation_1 = require("../internal/validation");
11
11
  function namespaceSource(context, op) {
12
12
  const root = (0, namespace_match_1.prefixRoot)(op.matchConditions);
13
13
  if (root.length > 0) {
14
- return (0, paginate_1.paginateQuery)({ client: context.client, params: (0, query_1.scopedQuery)(context.tableName, root) });
14
+ return (0, paginate_1.paginateQuery)({
15
+ client: context.client,
16
+ params: (0, query_1.scopedQuery)(context.tableName, root),
17
+ maxItems: context.maxScanItems,
18
+ });
15
19
  }
16
- return (0, scan_1.paginateScan)({ client: context.client, params: (0, query_1.storeScan)(context.tableName) });
20
+ return (0, scan_1.paginateScan)({
21
+ client: context.client,
22
+ params: (0, query_1.storeScan)(context.tableName),
23
+ maxItems: context.maxScanItems,
24
+ });
17
25
  }
18
26
  /**
19
27
  * List distinct namespaces (truncated to `maxDepth`) that satisfy every match
@@ -1 +1 @@
1
- {"version":3,"file":"list-namespaces.js","sourceRoot":"","sources":["../../../src/store/actions/list-namespaces.ts"],"names":[],"mappings":";;;AAEA,6DAA+D;AAC/D,qDAA0D;AAC1D,yDAA4D;AAC5D,2CAAuD;AACvD,iEAAwF;AACxF,6CAA2D;AAE3D,uDAAwD;AAExD,SAAS,eAAe,CAAC,OAAqB,EAAE,EAA2B;IACzE,MAAM,IAAI,GAAG,IAAA,4BAAU,EAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAA,wBAAa,EAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAA,mBAAW,EAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAA,mBAAY,EAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAA,iBAAS,EAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACI,KAAK,yBACV,OAAqB,EACrB,EAA2B;IAE3B,IAAA,2BAAc,EAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,IAAA,+BAAiB,EAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IACE,EAAE,CAAC,eAAe;YAClB,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAA,gCAAc,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAC9E,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAA,+BAAa,EAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,0BAAmB,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,0BAAmB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"list-namespaces.js","sourceRoot":"","sources":["../../../src/store/actions/list-namespaces.ts"],"names":[],"mappings":";;;AAEA,6DAA+D;AAC/D,qDAA0D;AAC1D,yDAA4D;AAC5D,2CAAuD;AACvD,iEAAwF;AACxF,6CAA2D;AAE3D,uDAAwD;AAExD,SAAS,eAAe,CAAC,OAAqB,EAAE,EAA2B;IACzE,MAAM,IAAI,GAAG,IAAA,4BAAU,EAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAA,wBAAa,EAAC;YACnB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,IAAA,mBAAW,EAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;YAC5C,QAAQ,EAAE,OAAO,CAAC,YAAY;SAC/B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAA,mBAAY,EAAC;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,IAAA,iBAAS,EAAC,OAAO,CAAC,SAAS,CAAC;QACpC,QAAQ,EAAE,OAAO,CAAC,YAAY;KAC/B,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,yBACV,OAAqB,EACrB,EAA2B;IAE3B,IAAA,2BAAc,EAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,IAAA,+BAAiB,EAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IACE,EAAE,CAAC,eAAe;YAClB,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAA,gCAAc,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAC9E,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAA,+BAAa,EAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,0BAAmB,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,0BAAmB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,0BAAmB,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC"}