@farukada/aws-langgraph-dynamodb-ts 0.9.0 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1720 -154
- package/dist/backfill/backfill.d.ts +168 -0
- package/dist/backfill/backfill.js +393 -0
- package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
- package/dist/checkpointer/actions/delete-thread.js +58 -21
- package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
- package/dist/checkpointer/actions/get-tuple.js +44 -10
- package/dist/checkpointer/actions/list.d.ts +46 -4
- package/dist/checkpointer/actions/list.js +121 -66
- package/dist/checkpointer/actions/put-writes.d.ts +41 -9
- package/dist/checkpointer/actions/put-writes.js +62 -77
- package/dist/checkpointer/actions/put.d.ts +83 -4
- package/dist/checkpointer/actions/put.js +177 -25
- package/dist/checkpointer/internal/delta-history.d.ts +112 -0
- package/dist/checkpointer/internal/delta-history.js +252 -0
- package/dist/checkpointer/internal/listing.d.ts +149 -0
- package/dist/checkpointer/internal/listing.js +245 -0
- package/dist/checkpointer/internal/parse.d.ts +262 -0
- package/dist/checkpointer/internal/parse.js +372 -0
- package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
- package/dist/checkpointer/internal/pending-writes.js +588 -0
- package/dist/checkpointer/internal/read.d.ts +130 -0
- package/dist/checkpointer/internal/read.js +264 -0
- package/dist/checkpointer/internal/rows.d.ts +571 -0
- package/dist/checkpointer/internal/rows.js +834 -0
- package/dist/checkpointer/internal/setup.d.ts +42 -19
- package/dist/checkpointer/internal/setup.js +65 -29
- package/dist/checkpointer/saver.d.ts +256 -16
- package/dist/checkpointer/saver.js +275 -29
- package/dist/checkpointer/types.d.ts +39 -39
- package/dist/checkpointer/types.js +10 -1
- package/dist/factory/factory.d.ts +134 -28
- package/dist/factory/factory.js +240 -21
- package/dist/factory/types.d.ts +76 -0
- package/dist/factory/types.js +10 -0
- package/dist/history/actions/add-messages.d.ts +31 -4
- package/dist/history/actions/add-messages.js +38 -58
- package/dist/history/actions/clear.d.ts +49 -6
- package/dist/history/actions/clear.js +66 -14
- package/dist/history/actions/get-messages.d.ts +54 -6
- package/dist/history/actions/get-messages.js +126 -43
- package/dist/history/actions/list-sessions.d.ts +52 -10
- package/dist/history/actions/list-sessions.js +139 -40
- package/dist/history/actions/reconcile-count.d.ts +42 -10
- package/dist/history/actions/reconcile-count.js +45 -45
- package/dist/history/chat-message-history.d.ts +220 -33
- package/dist/history/chat-message-history.js +240 -43
- package/dist/history/internal/append.d.ts +212 -0
- package/dist/history/internal/append.js +500 -0
- package/dist/history/internal/message-read.d.ts +84 -0
- package/dist/history/internal/message-read.js +204 -0
- package/dist/history/internal/parse.d.ts +153 -0
- package/dist/history/internal/parse.js +252 -0
- package/dist/history/internal/rows.d.ts +195 -0
- package/dist/history/internal/rows.js +250 -0
- package/dist/history/internal/session.d.ts +331 -0
- package/dist/history/internal/session.js +628 -0
- package/dist/history/internal/setup.d.ts +52 -17
- package/dist/history/internal/setup.js +92 -21
- package/dist/history/session-adapter.d.ts +102 -7
- package/dist/history/session-adapter.js +103 -9
- package/dist/history/types.d.ts +80 -29
- package/dist/history/types.js +10 -1
- package/dist/index.d.ts +42 -11
- package/dist/index.js +33 -12
- package/dist/shared/adapter.d.ts +135 -0
- package/dist/shared/adapter.js +143 -0
- package/dist/shared/clock.d.ts +51 -2
- package/dist/shared/clock.js +57 -2
- package/dist/shared/codec/codec.d.ts +288 -13
- package/dist/shared/codec/codec.js +416 -19
- package/dist/shared/codec/compression.d.ts +43 -7
- package/dist/shared/codec/compression.js +53 -13
- package/dist/shared/codec/json-serde.d.ts +76 -4
- package/dist/shared/codec/json-serde.js +181 -8
- package/dist/shared/codec/s3/client-types.d.ts +53 -0
- package/dist/shared/codec/s3/client-types.js +26 -0
- package/dist/shared/codec/s3/client.d.ts +43 -10
- package/dist/shared/codec/s3/client.js +82 -9
- package/dist/shared/codec/s3/config.d.ts +242 -11
- package/dist/shared/codec/s3/config.js +293 -11
- package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
- package/dist/shared/codec/s3/lifecycle.js +335 -27
- package/dist/shared/codec/s3/offloader.d.ts +393 -18
- package/dist/shared/codec/s3/offloader.js +595 -37
- package/dist/shared/concurrency.d.ts +43 -0
- package/dist/shared/concurrency.js +78 -0
- package/dist/shared/dynamodb/abort.d.ts +47 -0
- package/dist/shared/dynamodb/abort.js +59 -0
- package/dist/shared/dynamodb/batch-write.d.ts +77 -14
- package/dist/shared/dynamodb/batch-write.js +146 -27
- package/dist/shared/dynamodb/cancellation.d.ts +121 -4
- package/dist/shared/dynamodb/cancellation.js +147 -3
- package/dist/shared/dynamodb/client.d.ts +162 -8
- package/dist/shared/dynamodb/client.js +153 -5
- package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
- package/dist/shared/dynamodb/idempotent-write.js +593 -0
- package/dist/shared/dynamodb/paginate.d.ts +105 -9
- package/dist/shared/dynamodb/paginate.js +175 -7
- package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
- package/dist/shared/dynamodb/partition-delete.js +314 -44
- package/dist/shared/dynamodb/recency-index.d.ts +231 -0
- package/dist/shared/dynamodb/recency-index.js +377 -0
- package/dist/shared/dynamodb/retry.d.ts +276 -8
- package/dist/shared/dynamodb/retry.js +433 -23
- package/dist/shared/dynamodb/table-schema.d.ts +190 -0
- package/dist/shared/dynamodb/table-schema.js +209 -0
- package/dist/shared/errors/base-error.d.ts +184 -10
- package/dist/shared/errors/base-error.js +160 -14
- package/dist/shared/errors/boundary.d.ts +71 -0
- package/dist/shared/errors/boundary.js +143 -0
- package/dist/shared/errors/classify.d.ts +97 -0
- package/dist/shared/errors/classify.js +257 -0
- package/dist/shared/errors/error-code.d.ts +77 -2
- package/dist/shared/errors/error-code.js +83 -1
- package/dist/shared/errors/errors.d.ts +158 -59
- package/dist/shared/errors/errors.js +219 -92
- package/dist/shared/logging/logger.d.ts +69 -3
- package/dist/shared/logging/logger.js +97 -3
- package/dist/shared/logging/redaction.d.ts +92 -8
- package/dist/shared/logging/redaction.js +273 -17
- package/dist/shared/logging/secret-patterns.d.ts +149 -19
- package/dist/shared/logging/secret-patterns.js +188 -27
- package/dist/shared/logging/truncate.d.ts +197 -0
- package/dist/shared/logging/truncate.js +231 -0
- package/dist/shared/options.d.ts +59 -7
- package/dist/shared/options.js +9 -1
- package/dist/shared/ulid.d.ts +77 -7
- package/dist/shared/ulid.js +103 -8
- package/dist/shared/validation/collaborators.d.ts +141 -0
- package/dist/shared/validation/collaborators.js +188 -0
- package/dist/shared/validation/option-shape.d.ts +89 -0
- package/dist/shared/validation/option-shape.js +113 -0
- package/dist/shared/validation/options.d.ts +145 -0
- package/dist/shared/validation/options.js +328 -0
- package/dist/shared/validation/primitives.d.ts +288 -21
- package/dist/shared/validation/primitives.js +353 -50
- package/dist/shared/validation/ttl.d.ts +66 -10
- package/dist/shared/validation/ttl.js +113 -15
- package/dist/store/actions/list-namespaces.d.ts +76 -6
- package/dist/store/actions/list-namespaces.js +166 -24
- package/dist/store/actions/put.d.ts +33 -8
- package/dist/store/actions/put.js +53 -60
- package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
- package/dist/store/actions/reconcile-vector-index.js +34 -15
- package/dist/store/actions/search.d.ts +34 -6
- package/dist/store/actions/search.js +56 -51
- package/dist/store/internal/batch-plan.d.ts +26 -0
- package/dist/store/internal/batch-plan.js +109 -0
- package/dist/store/internal/filter.d.ts +36 -3
- package/dist/store/internal/filter.js +66 -15
- package/dist/store/internal/get-item.d.ts +45 -0
- package/dist/store/internal/get-item.js +115 -0
- package/dist/store/internal/item-write.d.ts +230 -0
- package/dist/store/internal/item-write.js +463 -0
- package/dist/store/internal/parse.d.ts +225 -0
- package/dist/store/internal/parse.js +350 -0
- package/dist/store/internal/rows.d.ts +355 -0
- package/dist/store/internal/rows.js +447 -0
- package/dist/store/internal/semantic-search.d.ts +161 -6
- package/dist/store/internal/semantic-search.js +360 -18
- package/dist/store/internal/setup.d.ts +77 -20
- package/dist/store/internal/setup.js +178 -47
- package/dist/store/internal/table-search.d.ts +100 -0
- package/dist/store/internal/table-search.js +213 -0
- package/dist/store/internal/vector-index.d.ts +247 -0
- package/dist/store/internal/vector-index.js +546 -0
- package/dist/store/store.d.ts +270 -17
- package/dist/store/store.js +329 -38
- package/dist/store/types.d.ts +76 -26
- package/dist/store/types.js +13 -1
- package/dist/store/vector-backend.d.ts +64 -4
- package/dist/store/vector-backend.js +15 -1
- package/package.json +58 -36
- package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
- package/dist/checkpointer/actions/delete-thread.js.map +0 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
- package/dist/checkpointer/actions/get-tuple.js.map +0 -1
- package/dist/checkpointer/actions/list.d.ts.map +0 -1
- package/dist/checkpointer/actions/list.js.map +0 -1
- package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
- package/dist/checkpointer/actions/put-writes.js.map +0 -1
- package/dist/checkpointer/actions/put.d.ts.map +0 -1
- package/dist/checkpointer/actions/put.js.map +0 -1
- package/dist/checkpointer/internal/assemble.d.ts +0 -10
- package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
- package/dist/checkpointer/internal/assemble.js +0 -37
- package/dist/checkpointer/internal/assemble.js.map +0 -1
- package/dist/checkpointer/internal/configurable.d.ts +0 -13
- package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
- package/dist/checkpointer/internal/configurable.js +0 -23
- package/dist/checkpointer/internal/configurable.js.map +0 -1
- package/dist/checkpointer/internal/fetch.d.ts +0 -10
- package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
- package/dist/checkpointer/internal/fetch.js +0 -46
- package/dist/checkpointer/internal/fetch.js.map +0 -1
- package/dist/checkpointer/internal/filter-match.d.ts +0 -12
- package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
- package/dist/checkpointer/internal/filter-match.js +0 -14
- package/dist/checkpointer/internal/filter-match.js.map +0 -1
- package/dist/checkpointer/internal/item-reader.d.ts +0 -55
- package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-reader.js +0 -88
- package/dist/checkpointer/internal/item-reader.js.map +0 -1
- package/dist/checkpointer/internal/item-writer.d.ts +0 -26
- package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-writer.js +0 -92
- package/dist/checkpointer/internal/item-writer.js.map +0 -1
- package/dist/checkpointer/internal/keys.d.ts +0 -31
- package/dist/checkpointer/internal/keys.d.ts.map +0 -1
- package/dist/checkpointer/internal/keys.js +0 -87
- package/dist/checkpointer/internal/keys.js.map +0 -1
- package/dist/checkpointer/internal/query.d.ts +0 -20
- package/dist/checkpointer/internal/query.d.ts.map +0 -1
- package/dist/checkpointer/internal/query.js +0 -36
- package/dist/checkpointer/internal/query.js.map +0 -1
- package/dist/checkpointer/internal/setup.d.ts.map +0 -1
- package/dist/checkpointer/internal/setup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
- package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
- package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
- package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
- package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.js +0 -65
- package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
- package/dist/checkpointer/internal/validation.d.ts +0 -13
- package/dist/checkpointer/internal/validation.d.ts.map +0 -1
- package/dist/checkpointer/internal/validation.js +0 -30
- package/dist/checkpointer/internal/validation.js.map +0 -1
- package/dist/checkpointer/internal/write-guard.d.ts +0 -13
- package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-guard.js +0 -39
- package/dist/checkpointer/internal/write-guard.js.map +0 -1
- package/dist/checkpointer/internal/write-index.d.ts +0 -37
- package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-index.js +0 -42
- package/dist/checkpointer/internal/write-index.js.map +0 -1
- package/dist/checkpointer/saver.d.ts.map +0 -1
- package/dist/checkpointer/saver.js.map +0 -1
- package/dist/checkpointer/types.d.ts.map +0 -1
- package/dist/checkpointer/types.js.map +0 -1
- package/dist/factory/factory.d.ts.map +0 -1
- package/dist/factory/factory.js.map +0 -1
- package/dist/history/actions/add-messages.d.ts.map +0 -1
- package/dist/history/actions/add-messages.js.map +0 -1
- package/dist/history/actions/clear.d.ts.map +0 -1
- package/dist/history/actions/clear.js.map +0 -1
- package/dist/history/actions/get-messages.d.ts.map +0 -1
- package/dist/history/actions/get-messages.js.map +0 -1
- package/dist/history/actions/list-sessions.d.ts.map +0 -1
- package/dist/history/actions/list-sessions.js.map +0 -1
- package/dist/history/actions/reconcile-count.d.ts.map +0 -1
- package/dist/history/actions/reconcile-count.js.map +0 -1
- package/dist/history/chat-message-history.d.ts.map +0 -1
- package/dist/history/chat-message-history.js.map +0 -1
- package/dist/history/internal/append-saga.d.ts +0 -20
- package/dist/history/internal/append-saga.d.ts.map +0 -1
- package/dist/history/internal/append-saga.js +0 -35
- package/dist/history/internal/append-saga.js.map +0 -1
- package/dist/history/internal/compensation.d.ts +0 -21
- package/dist/history/internal/compensation.d.ts.map +0 -1
- package/dist/history/internal/compensation.js +0 -84
- package/dist/history/internal/compensation.js.map +0 -1
- package/dist/history/internal/item-mapper.d.ts +0 -12
- package/dist/history/internal/item-mapper.d.ts.map +0 -1
- package/dist/history/internal/item-mapper.js +0 -33
- package/dist/history/internal/item-mapper.js.map +0 -1
- package/dist/history/internal/keys.d.ts +0 -17
- package/dist/history/internal/keys.d.ts.map +0 -1
- package/dist/history/internal/keys.js +0 -49
- package/dist/history/internal/keys.js.map +0 -1
- package/dist/history/internal/message-chunker.d.ts +0 -14
- package/dist/history/internal/message-chunker.d.ts.map +0 -1
- package/dist/history/internal/message-chunker.js +0 -68
- package/dist/history/internal/message-chunker.js.map +0 -1
- package/dist/history/internal/message-transaction.d.ts +0 -26
- package/dist/history/internal/message-transaction.d.ts.map +0 -1
- package/dist/history/internal/message-transaction.js +0 -60
- package/dist/history/internal/message-transaction.js.map +0 -1
- package/dist/history/internal/query.d.ts +0 -10
- package/dist/history/internal/query.d.ts.map +0 -1
- package/dist/history/internal/query.js +0 -31
- package/dist/history/internal/query.js.map +0 -1
- package/dist/history/internal/session-count.d.ts +0 -41
- package/dist/history/internal/session-count.d.ts.map +0 -1
- package/dist/history/internal/session-count.js +0 -109
- package/dist/history/internal/session-count.js.map +0 -1
- package/dist/history/internal/session-title.d.ts +0 -20
- package/dist/history/internal/session-title.d.ts.map +0 -1
- package/dist/history/internal/session-title.js +0 -44
- package/dist/history/internal/session-title.js.map +0 -1
- package/dist/history/internal/session-update.d.ts +0 -28
- package/dist/history/internal/session-update.d.ts.map +0 -1
- package/dist/history/internal/session-update.js +0 -70
- package/dist/history/internal/session-update.js.map +0 -1
- package/dist/history/internal/setup.d.ts.map +0 -1
- package/dist/history/internal/setup.js.map +0 -1
- package/dist/history/internal/title-generator.d.ts +0 -13
- package/dist/history/internal/title-generator.d.ts.map +0 -1
- package/dist/history/internal/title-generator.js +0 -25
- package/dist/history/internal/title-generator.js.map +0 -1
- package/dist/history/internal/ttl-anchor.d.ts +0 -25
- package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/ttl-anchor.js.map +0 -1
- package/dist/history/internal/validation.d.ts +0 -9
- package/dist/history/internal/validation.d.ts.map +0 -1
- package/dist/history/internal/validation.js +0 -16
- package/dist/history/internal/validation.js.map +0 -1
- package/dist/history/session-adapter.d.ts.map +0 -1
- package/dist/history/session-adapter.js.map +0 -1
- package/dist/history/types.d.ts.map +0 -1
- package/dist/history/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/shared/clock.d.ts.map +0 -1
- package/dist/shared/clock.js.map +0 -1
- package/dist/shared/codec/codec.d.ts.map +0 -1
- package/dist/shared/codec/codec.js.map +0 -1
- package/dist/shared/codec/compression.d.ts.map +0 -1
- package/dist/shared/codec/compression.js.map +0 -1
- package/dist/shared/codec/descriptor-keys.d.ts +0 -4
- package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
- package/dist/shared/codec/descriptor-keys.js +0 -14
- package/dist/shared/codec/descriptor-keys.js.map +0 -1
- package/dist/shared/codec/json-serde.d.ts.map +0 -1
- package/dist/shared/codec/json-serde.js.map +0 -1
- package/dist/shared/codec/s3/client.d.ts.map +0 -1
- package/dist/shared/codec/s3/client.js.map +0 -1
- package/dist/shared/codec/s3/config.d.ts.map +0 -1
- package/dist/shared/codec/s3/config.js.map +0 -1
- package/dist/shared/codec/s3/delete.d.ts +0 -8
- package/dist/shared/codec/s3/delete.d.ts.map +0 -1
- package/dist/shared/codec/s3/delete.js +0 -29
- package/dist/shared/codec/s3/delete.js.map +0 -1
- package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
- package/dist/shared/codec/s3/lifecycle.js.map +0 -1
- package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
- package/dist/shared/codec/s3/offloader.js.map +0 -1
- package/dist/shared/codec/s3/orphans.d.ts +0 -18
- package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
- package/dist/shared/codec/s3/orphans.js +0 -58
- package/dist/shared/codec/s3/orphans.js.map +0 -1
- package/dist/shared/codec/s3/read-write.d.ts +0 -14
- package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
- package/dist/shared/codec/s3/read-write.js +0 -43
- package/dist/shared/codec/s3/read-write.js.map +0 -1
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.d.ts.map +0 -1
- package/dist/shared/codec/s3/retry.js +0 -25
- package/dist/shared/codec/s3/retry.js.map +0 -1
- package/dist/shared/constants.d.ts +0 -64
- package/dist/shared/constants.d.ts.map +0 -1
- package/dist/shared/constants.js +0 -67
- package/dist/shared/constants.js.map +0 -1
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
- package/dist/shared/dynamodb/backoff.js +0 -48
- package/dist/shared/dynamodb/backoff.js.map +0 -1
- package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
- package/dist/shared/dynamodb/batch-write.js.map +0 -1
- package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
- package/dist/shared/dynamodb/cancellation.js.map +0 -1
- package/dist/shared/dynamodb/client.d.ts.map +0 -1
- package/dist/shared/dynamodb/client.js.map +0 -1
- package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
- package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
- package/dist/shared/dynamodb/conditional-put.js +0 -59
- package/dist/shared/dynamodb/conditional-put.js.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
- package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
- package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
- package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate-core.js +0 -52
- package/dist/shared/dynamodb/paginate-core.js.map +0 -1
- package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate.js.map +0 -1
- package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
- package/dist/shared/dynamodb/partition-delete.js.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.js +0 -87
- package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
- package/dist/shared/dynamodb/retry.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry.js.map +0 -1
- package/dist/shared/dynamodb/scan.d.ts +0 -15
- package/dist/shared/dynamodb/scan.d.ts.map +0 -1
- package/dist/shared/dynamodb/scan.js +0 -20
- package/dist/shared/dynamodb/scan.js.map +0 -1
- package/dist/shared/dynamodb/types.d.ts +0 -24
- package/dist/shared/dynamodb/types.d.ts.map +0 -1
- package/dist/shared/dynamodb/types.js +0 -3
- package/dist/shared/dynamodb/types.js.map +0 -1
- package/dist/shared/errors/base-error.d.ts.map +0 -1
- package/dist/shared/errors/base-error.js.map +0 -1
- package/dist/shared/errors/error-code.d.ts.map +0 -1
- package/dist/shared/errors/error-code.js.map +0 -1
- package/dist/shared/errors/errors.d.ts.map +0 -1
- package/dist/shared/errors/errors.js.map +0 -1
- package/dist/shared/errors/wrap-error.d.ts +0 -16
- package/dist/shared/errors/wrap-error.d.ts.map +0 -1
- package/dist/shared/errors/wrap-error.js +0 -30
- package/dist/shared/errors/wrap-error.js.map +0 -1
- package/dist/shared/logging/logger.d.ts.map +0 -1
- package/dist/shared/logging/logger.js.map +0 -1
- package/dist/shared/logging/redaction-walk.d.ts +0 -23
- package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
- package/dist/shared/logging/redaction-walk.js +0 -92
- package/dist/shared/logging/redaction-walk.js.map +0 -1
- package/dist/shared/logging/redaction.d.ts.map +0 -1
- package/dist/shared/logging/redaction.js.map +0 -1
- package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
- package/dist/shared/logging/secret-patterns.js.map +0 -1
- package/dist/shared/options.d.ts.map +0 -1
- package/dist/shared/options.js.map +0 -1
- package/dist/shared/ulid.d.ts.map +0 -1
- package/dist/shared/ulid.js.map +0 -1
- package/dist/shared/validation/primitives.d.ts.map +0 -1
- package/dist/shared/validation/primitives.js.map +0 -1
- package/dist/shared/validation/ttl.d.ts.map +0 -1
- package/dist/shared/validation/ttl.js.map +0 -1
- package/dist/store/actions/get.d.ts +0 -5
- package/dist/store/actions/get.d.ts.map +0 -1
- package/dist/store/actions/get.js +0 -35
- package/dist/store/actions/get.js.map +0 -1
- package/dist/store/actions/list-namespaces.d.ts.map +0 -1
- package/dist/store/actions/list-namespaces.js.map +0 -1
- package/dist/store/actions/put.d.ts.map +0 -1
- package/dist/store/actions/put.js.map +0 -1
- package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
- package/dist/store/actions/reconcile-vector-index.js.map +0 -1
- package/dist/store/actions/search.d.ts.map +0 -1
- package/dist/store/actions/search.js.map +0 -1
- package/dist/store/internal/backend-search.d.ts +0 -5
- package/dist/store/internal/backend-search.d.ts.map +0 -1
- package/dist/store/internal/backend-search.js +0 -68
- package/dist/store/internal/backend-search.js.map +0 -1
- package/dist/store/internal/filter.d.ts.map +0 -1
- package/dist/store/internal/filter.js.map +0 -1
- package/dist/store/internal/index-reconcile.d.ts +0 -22
- package/dist/store/internal/index-reconcile.d.ts.map +0 -1
- package/dist/store/internal/index-reconcile.js +0 -105
- package/dist/store/internal/index-reconcile.js.map +0 -1
- package/dist/store/internal/index-sync.d.ts +0 -11
- package/dist/store/internal/index-sync.d.ts.map +0 -1
- package/dist/store/internal/index-sync.js +0 -26
- package/dist/store/internal/index-sync.js.map +0 -1
- package/dist/store/internal/item-mapper.d.ts +0 -25
- package/dist/store/internal/item-mapper.d.ts.map +0 -1
- package/dist/store/internal/item-mapper.js +0 -53
- package/dist/store/internal/item-mapper.js.map +0 -1
- package/dist/store/internal/keys.d.ts +0 -18
- package/dist/store/internal/keys.d.ts.map +0 -1
- package/dist/store/internal/keys.js +0 -42
- package/dist/store/internal/keys.js.map +0 -1
- package/dist/store/internal/namespace-match.d.ts +0 -12
- package/dist/store/internal/namespace-match.d.ts.map +0 -1
- package/dist/store/internal/namespace-match.js +0 -41
- package/dist/store/internal/namespace-match.js.map +0 -1
- package/dist/store/internal/overwrite-swap.d.ts +0 -33
- package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
- package/dist/store/internal/overwrite-swap.js +0 -62
- package/dist/store/internal/overwrite-swap.js.map +0 -1
- package/dist/store/internal/persist.d.ts +0 -27
- package/dist/store/internal/persist.d.ts.map +0 -1
- package/dist/store/internal/persist.js +0 -59
- package/dist/store/internal/persist.js.map +0 -1
- package/dist/store/internal/query.d.ts +0 -6
- package/dist/store/internal/query.d.ts.map +0 -1
- package/dist/store/internal/query.js +0 -32
- package/dist/store/internal/query.js.map +0 -1
- package/dist/store/internal/ranker.d.ts +0 -13
- package/dist/store/internal/ranker.d.ts.map +0 -1
- package/dist/store/internal/ranker.js +0 -31
- package/dist/store/internal/ranker.js.map +0 -1
- package/dist/store/internal/read-existing.d.ts +0 -19
- package/dist/store/internal/read-existing.d.ts.map +0 -1
- package/dist/store/internal/read-existing.js +0 -29
- package/dist/store/internal/read-existing.js.map +0 -1
- package/dist/store/internal/score-direction.d.ts +0 -32
- package/dist/store/internal/score-direction.d.ts.map +0 -1
- package/dist/store/internal/score-direction.js +0 -39
- package/dist/store/internal/score-direction.js.map +0 -1
- package/dist/store/internal/search-filter.d.ts +0 -4
- package/dist/store/internal/search-filter.d.ts.map +0 -1
- package/dist/store/internal/search-filter.js +0 -11
- package/dist/store/internal/search-filter.js.map +0 -1
- package/dist/store/internal/semantic-search.d.ts.map +0 -1
- package/dist/store/internal/semantic-search.js.map +0 -1
- package/dist/store/internal/setup.d.ts.map +0 -1
- package/dist/store/internal/setup.js.map +0 -1
- package/dist/store/internal/validation.d.ts +0 -13
- package/dist/store/internal/validation.d.ts.map +0 -1
- package/dist/store/internal/validation.js +0 -35
- package/dist/store/internal/validation.js.map +0 -1
- package/dist/store/internal/write-verify.d.ts +0 -37
- package/dist/store/internal/write-verify.d.ts.map +0 -1
- package/dist/store/internal/write-verify.js +0 -68
- package/dist/store/internal/write-verify.js.map +0 -1
- package/dist/store/store.d.ts.map +0 -1
- package/dist/store/store.js.map +0 -1
- package/dist/store/types.d.ts.map +0 -1
- package/dist/store/types.js.map +0 -1
- package/dist/store/vector-backend.d.ts.map +0 -1
- package/dist/store/vector-backend.js.map +0 -1
|
@@ -1,8 +1,152 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how a cancelled transaction says why it failed.
|
|
4
|
+
*
|
|
5
|
+
* A `TransactionCanceledException` carries one raw reason per item, in the
|
|
6
|
+
* order the items were sent, under codes that are not the exception names the
|
|
7
|
+
* same failures carry outside a transaction. Which reason is a guard
|
|
8
|
+
* rejection, which are transient or throttling, and which item failed its
|
|
9
|
+
* condition are read here and nowhere else, so the retry layer, the error
|
|
10
|
+
* classifier and the writers that act on a rejection cannot read one apart.
|
|
11
|
+
*/
|
|
2
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
13
|
exports.getCancellationReasons = getCancellationReasons;
|
|
4
|
-
|
|
14
|
+
exports.conditionalCheckFailure = conditionalCheckFailure;
|
|
15
|
+
exports.transientCancellation = transientCancellation;
|
|
16
|
+
exports.throttledCancellation = throttledCancellation;
|
|
17
|
+
exports.conditionFailedAt = conditionFailedAt;
|
|
18
|
+
/** The reason code an item that was not the cause carries. */
|
|
19
|
+
const NOT_THE_CAUSE = 'None';
|
|
20
|
+
/**
|
|
21
|
+
* The reason code a guard rejection arrives under inside a transaction. It is
|
|
22
|
+
* *not* the exception name the same rejection carries outside one
|
|
23
|
+
* (`ConditionalCheckFailedException`); the two strings are neither
|
|
24
|
+
* interchangeable nor prefixes to test for.
|
|
25
|
+
*/
|
|
26
|
+
const CONDITION_FAILED = 'ConditionalCheckFailed';
|
|
27
|
+
/**
|
|
28
|
+
* The per-item reasons a `TransactWriteItems` cancellation carries.
|
|
29
|
+
*
|
|
30
|
+
* Accepts: `error` — any error; only a `TransactionCanceledException` carries
|
|
31
|
+
* the field.
|
|
32
|
+
*
|
|
33
|
+
* Its parameter is the weak {@link RejectionFields} rather than `Error`, which
|
|
34
|
+
* is a deliberate trade: `{}` and `{ name }` now compile where they did not,
|
|
35
|
+
* and in exchange this module stays the only place that dereferences
|
|
36
|
+
* `CancellationReasons`, so {@link conditionalCheckFailure}, the retry
|
|
37
|
+
* classifier and the two history readers cannot drift apart in how they read
|
|
38
|
+
* it. Every value that reaches it at runtime comes from a `catch`; the two
|
|
39
|
+
* call sites inside this package that pass it along rather than an `Error`
|
|
40
|
+
* ({@link conditionalCheckFailure} and `isConditionalCheckFailed`) received
|
|
41
|
+
* one from a `catch` themselves.
|
|
42
|
+
*
|
|
43
|
+
* Returns: one entry per transaction item, in the order the items were sent
|
|
44
|
+
* (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html),
|
|
45
|
+
* or `undefined` when the error carries none — which is what an older service
|
|
46
|
+
* response, a different failure, or a thrown value that is not an object at
|
|
47
|
+
* all looks like.
|
|
48
|
+
*
|
|
49
|
+
* Throws: **nothing**, for any value a `throw` can produce. Every value that
|
|
50
|
+
* reaches this came from a `catch`, and `null` is one a `catch` can bind: the
|
|
51
|
+
* property read raised a `TypeError` there, inside the classification the
|
|
52
|
+
* retry layer makes before it decides whether to try again.
|
|
53
|
+
*/
|
|
5
54
|
function getCancellationReasons(error) {
|
|
6
|
-
return error
|
|
55
|
+
return error?.CancellationReasons;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The reason belonging to the one item a transaction's guard turned away.
|
|
59
|
+
*
|
|
60
|
+
* A cancellation names every item, so "was this write rejected by its
|
|
61
|
+
* condition?" is only answerable once the items that were merely along for the
|
|
62
|
+
* ride are set aside. What must remain is a single cause, and it must be the
|
|
63
|
+
* condition: a cancellation that also failed a second item for its own reason
|
|
64
|
+
* is not a guard rejection, and reporting one would hide the other failure.
|
|
65
|
+
*
|
|
66
|
+
* A reason carrying no `Code` counts as a cause here, while the retry
|
|
67
|
+
* classifier treats that same shape as transient. The disagreement is
|
|
68
|
+
* deliberate, because the two readers are conservative in opposite directions:
|
|
69
|
+
* for the classifier, an unreadable reason may be retried, which a request
|
|
70
|
+
* token makes harmless; here it must **not** be read as a clean rejection,
|
|
71
|
+
* since acting on one discards whatever else the transaction failed on. AWS
|
|
72
|
+
* populates `Code` for every item, so neither branch is reachable in practice.
|
|
73
|
+
*
|
|
74
|
+
* Accepts: `error` — any error; only a cancellation carries reasons.
|
|
75
|
+
*
|
|
76
|
+
* Returns: the sole `ConditionalCheckFailed` reason — with the rejected row
|
|
77
|
+
* attached when the item asked for it — or `undefined` for every other error,
|
|
78
|
+
* including a cancellation with no reasons, a different cause, or more than
|
|
79
|
+
* one.
|
|
80
|
+
*
|
|
81
|
+
* Throws: nothing.
|
|
82
|
+
*/
|
|
83
|
+
function conditionalCheckFailure(error) {
|
|
84
|
+
const reasons = getCancellationReasons(error) ?? [];
|
|
85
|
+
const causes = reasons.filter((reason) => reason.Code !== NOT_THE_CAUSE);
|
|
86
|
+
return causes.length === 1 && causes[0].Code === CONDITION_FAILED ? causes[0] : undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Cancellation reason codes (from a `TransactionCanceledException`'s
|
|
90
|
+
* `CancellationReasons`) that are transient and safe to retry. `None` marks an
|
|
91
|
+
* item that was not the cause and is ignored.
|
|
92
|
+
*/
|
|
93
|
+
const TRANSIENT_CANCELLATION_REASONS = [
|
|
94
|
+
'None',
|
|
95
|
+
'TransactionConflict',
|
|
96
|
+
'ThrottlingError',
|
|
97
|
+
'ProvisionedThroughputExceeded',
|
|
98
|
+
];
|
|
99
|
+
/**
|
|
100
|
+
* Whether a cancelled transaction failed only for transient reasons.
|
|
101
|
+
*
|
|
102
|
+
* Accepts: `error` — any error; only a cancellation carries reasons.
|
|
103
|
+
*
|
|
104
|
+
* Returns: `undefined` when the error carries no reasons, so the caller's
|
|
105
|
+
* ordinary signal matching applies; otherwise whether every reason is
|
|
106
|
+
* transient. A cancellation carrying no reasons at all is not transient.
|
|
107
|
+
*
|
|
108
|
+
* Throws: nothing, for any value; see {@link getCancellationReasons}.
|
|
109
|
+
*/
|
|
110
|
+
function transientCancellation(error) {
|
|
111
|
+
const reasons = getCancellationReasons(error);
|
|
112
|
+
if (!reasons)
|
|
113
|
+
return undefined;
|
|
114
|
+
// `length > 0` is load-bearing: `.every()` is vacuously true on an empty
|
|
115
|
+
// array, which would make a reason-less cancellation retryable — the exact
|
|
116
|
+
// opposite of what this function documents. AWS populates one reason per
|
|
117
|
+
// `TransactItems` entry, so an empty array should not occur; if it ever
|
|
118
|
+
// does, the conservative answer is not to retry.
|
|
119
|
+
return (reasons.length > 0 &&
|
|
120
|
+
reasons.every((reason) => reason.Code === undefined || TRANSIENT_CANCELLATION_REASONS.includes(reason.Code)));
|
|
121
|
+
}
|
|
122
|
+
/** Cancellation reason codes that mean the request was throttled. */
|
|
123
|
+
const THROTTLING_REASONS = ['ThrottlingError', 'ProvisionedThroughputExceeded'];
|
|
124
|
+
/**
|
|
125
|
+
* Whether a cancelled transaction was throttled.
|
|
126
|
+
*
|
|
127
|
+
* Accepts: `error` — any error; only a cancellation carries reasons.
|
|
128
|
+
*
|
|
129
|
+
* Returns: true when any reason is a throttling reason. Meaningful only for a
|
|
130
|
+
* cancellation {@link transientCancellation} already found transient, which is
|
|
131
|
+
* the one place it is asked.
|
|
132
|
+
*
|
|
133
|
+
* Throws: nothing, for any value.
|
|
134
|
+
*/
|
|
135
|
+
function throttledCancellation(error) {
|
|
136
|
+
return (getCancellationReasons(error) ?? []).some((reason) => reason.Code !== undefined && THROTTLING_REASONS.includes(reason.Code));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Whether the item at `index` of a cancelled transaction failed its condition.
|
|
140
|
+
*
|
|
141
|
+
* Accepts: `error` — any error. `index` — the item's position in the
|
|
142
|
+
* `TransactItems` the caller sent; reasons come back in that order.
|
|
143
|
+
*
|
|
144
|
+
* Returns: true when that item's reason is `ConditionalCheckFailed`, whatever
|
|
145
|
+
* the other items' reasons are; false for anything that is not such a
|
|
146
|
+
* cancellation.
|
|
147
|
+
*
|
|
148
|
+
* Throws: nothing, for any value.
|
|
149
|
+
*/
|
|
150
|
+
function conditionFailedAt(error, index) {
|
|
151
|
+
return getCancellationReasons(error)?.[index]?.Code === CONDITION_FAILED;
|
|
7
152
|
}
|
|
8
|
-
//# sourceMappingURL=cancellation.js.map
|
|
@@ -1,21 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the DynamoDB client: the part of the DocumentClient this package calls,
|
|
3
|
+
* the row shapes that part speaks, and how a client this package builds bounds
|
|
4
|
+
* each request.
|
|
5
|
+
*
|
|
6
|
+
* The structural type is what lets a caller inject any DocumentClient-shaped
|
|
7
|
+
* object, and it is public; the row shapes travel through every module that
|
|
8
|
+
* reads or writes a row; the construction is the one place a request timeout
|
|
9
|
+
* and a socket timeout are set, and the one place that knows whether the
|
|
10
|
+
* adapter owns the client it holds.
|
|
11
|
+
*/
|
|
1
12
|
import { DynamoDBClient, type DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
2
|
-
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
|
|
13
|
+
import { DynamoDBDocument, type NativeAttributeValue, type TransactWriteCommandInput } from '@aws-sdk/lib-dynamodb';
|
|
14
|
+
import type { Logger } from '../logging/logger';
|
|
15
|
+
/**
|
|
16
|
+
* How long one request attempt may take on a client this library builds
|
|
17
|
+
* (10 seconds) before the SDK's request handler destroys it and rejects with a
|
|
18
|
+
* retryable `TimeoutError`. `MAX_WRITE_LIFETIME_MS`
|
|
19
|
+
* (`src/shared/dynamodb/retry.ts`) bounds how many attempts *start*; it is
|
|
20
|
+
* checked between them, so it can refuse to begin another wait and can never
|
|
21
|
+
* shorten the attempt already in flight. Without a handler timeout — every one
|
|
22
|
+
* of them defaults to 0 — a hung socket holds that attempt open forever and
|
|
23
|
+
* the write lifetime bounds nothing.
|
|
24
|
+
*
|
|
25
|
+
* Measured, not picked. Across the fan-out widths this package documents, the
|
|
26
|
+
* worst interval the handler itself saw — socket acquisition including the
|
|
27
|
+
* wait behind the agent's fifty sockets, connect, request write and
|
|
28
|
+
* time-to-first-response-header — was 0.92 s, at a thousand concurrent writes
|
|
29
|
+
* of 20 KB values, and ten seconds is roughly eleven times that. The asymmetry
|
|
30
|
+
* settles the close call: too large leaves one attempt hanging for at most ten
|
|
31
|
+
* seconds, which the write lifetime's own headroom absorbs, while too small
|
|
32
|
+
* turns a healthy wide fan-out into a retry storm.
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 10000;
|
|
35
|
+
/**
|
|
36
|
+
* How long a socket may sit idle (5 seconds) on a client this library builds
|
|
37
|
+
* before the request handler destroys the request. Which error that surfaces
|
|
38
|
+
* as depends on when it fires: before response headers the handler's own
|
|
39
|
+
* rejection reaches the caller as a `TimeoutError`, while after them the call
|
|
40
|
+
* has already resolved and the destroy arrives through the response stream
|
|
41
|
+
* instead, as an `ECONNRESET` abort. Both are classified retryable, so either
|
|
42
|
+
* way a stalled transfer becomes a retry of this library's own. An idle timer
|
|
43
|
+
* rather than a deadline: activity in either direction resets it, so it bounds
|
|
44
|
+
* a transfer that has stalled and never one that is merely slow, and its clock
|
|
45
|
+
* starts at socket assignment rather than at request creation. What each
|
|
46
|
+
* client needs it *for* differs, so that belongs at each client's own call
|
|
47
|
+
* site rather than here.
|
|
48
|
+
*
|
|
49
|
+
* Not a tuning knob. The handler installs the socket listener immediately only
|
|
50
|
+
* below 6 000 ms; at or above that it defers registration by 3 000 ms and
|
|
51
|
+
* returns the deferral's timer id, which the handler's clear-on-resolve
|
|
52
|
+
* cancels when response headers arrive — so at 6 000 or more the field
|
|
53
|
+
* silently stops doing anything for every response that answers inside three
|
|
54
|
+
* seconds, which is the normal case. That is a fact about the request handler
|
|
55
|
+
* and about neither client. A unit assertion holds this value under that
|
|
56
|
+
* threshold so raising it fails loudly instead of disabling the only bound a
|
|
57
|
+
* stalled transfer has.
|
|
58
|
+
*/
|
|
59
|
+
export declare const DEFAULT_SOCKET_TIMEOUT_MS = 5000;
|
|
3
60
|
/** A resolved DynamoDB client plus its ownership flag. */
|
|
4
61
|
export interface ResolvedDynamoDBClient {
|
|
5
62
|
ddbClient: DynamoDBClient | undefined;
|
|
6
|
-
client:
|
|
63
|
+
client: DynamoDBDocumentLike;
|
|
7
64
|
ownsClient: boolean;
|
|
8
65
|
}
|
|
9
66
|
/** Options for {@link resolveDynamoDBClient}. */
|
|
10
67
|
export interface ResolveClientOptions {
|
|
11
|
-
client?:
|
|
68
|
+
client?: DynamoDBDocumentLike;
|
|
12
69
|
clientConfig?: DynamoDBClientConfig;
|
|
13
|
-
createClient?: (config: DynamoDBClientConfig) => DynamoDBClient;
|
|
14
70
|
}
|
|
15
71
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* `
|
|
72
|
+
* The DocumentClient an adapter will use, and whether it owns it.
|
|
73
|
+
*
|
|
74
|
+
* Accepts: `client` — an injected DocumentClient, used as-is; `clientConfig` —
|
|
75
|
+
* what one is built from when no client is injected; `createClient` — the test
|
|
76
|
+
* seam that builds it. `assertBaseAdapterOptions` rejects an injected client
|
|
77
|
+
* given alongside either of the other two, so only one branch is ever taken.
|
|
78
|
+
*
|
|
79
|
+
* Returns: the document client, the raw client behind it when this call built
|
|
80
|
+
* one, and `ownsClient` — true only then. An injected client is never
|
|
81
|
+
* destroyed by `destroy()`; it may be shared with the caller's own code and
|
|
82
|
+
* with the other adapters.
|
|
83
|
+
*
|
|
84
|
+
* Throws: whatever the SDK constructor throws for an unusable config.
|
|
85
|
+
*
|
|
86
|
+
* Guarantees: a client this call builds gets `maxAttempts: 1` unless the config
|
|
87
|
+
* overrides it, so the SDK performs no retries of its own and this library's
|
|
88
|
+
* retry layer is the only one. It also gets a default request handler that
|
|
89
|
+
* bounds how long one attempt may run, which `maxAttempts` alone does not. A
|
|
90
|
+
* `requestHandler` in `clientConfig` replaces that default whole rather than
|
|
91
|
+
* merging with it — the documented escape hatch, and equally the documented
|
|
92
|
+
* way to give up the bound. An injected client keeps whatever it was built
|
|
93
|
+
* with — see {@link warnOnStackedRetries}.
|
|
19
94
|
*/
|
|
20
95
|
export declare function resolveDynamoDBClient(options: ResolveClientOptions): ResolvedDynamoDBClient;
|
|
21
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Warn once when an injected client keeps the SDK's own retries.
|
|
98
|
+
*
|
|
99
|
+
* Accepts: `client` — the caller's. A client that cannot report its setting —
|
|
100
|
+
* a stub, a mock, a future SDK shape — is left alone.
|
|
101
|
+
*
|
|
102
|
+
* Returns: nothing. Deliberately not awaited by its callers: it is a warning
|
|
103
|
+
* about a caller-supplied client, not a precondition for using it, so
|
|
104
|
+
* constructing an adapter stays free of I/O.
|
|
105
|
+
*
|
|
106
|
+
* Throws: nothing, ever. The SDK's own config resolution can reject, and a
|
|
107
|
+
* rejection here would surface as an unhandled rejection from a constructor
|
|
108
|
+
* that did nothing wrong.
|
|
109
|
+
*
|
|
110
|
+
* Guarantees: the SDK's retries run inside every attempt of this library's
|
|
111
|
+
* retry layer, so the budget the constants and README describe multiplies (5 ×
|
|
112
|
+
* 3 requests per operation at the SDK default) and a throttling event turns
|
|
113
|
+
* into a retry storm. Saying so once, at construction, is the only place the
|
|
114
|
+
* caller can act on it.
|
|
115
|
+
*
|
|
116
|
+
* The one gap a deadline cannot cover. A tokened write's budget is bounded by
|
|
117
|
+
* `MAX_WRITE_LIFETIME_MS`, but that bound is checked between attempts: it can
|
|
118
|
+
* refuse to start another wait, and it cannot shorten an attempt already in
|
|
119
|
+
* flight. An injected client that retries internally turns one of this
|
|
120
|
+
* library's attempts into several of its own, so the time spent inside a
|
|
121
|
+
* single attempt stops being bounded by anything this library sets — which is
|
|
122
|
+
* why the warning says to construct it with `maxAttempts: 1`.
|
|
123
|
+
*
|
|
124
|
+
* `maxAttempts: 1` is necessary but not sufficient. The per-attempt bound
|
|
125
|
+
* holds for an injected client only if it also carries its own request
|
|
126
|
+
* timeout: a client this library builds is given one
|
|
127
|
+
* ({@link resolveDynamoDBClient}), and an injected client is used exactly as
|
|
128
|
+
* handed over, so one without a handler timeout leaves a single attempt
|
|
129
|
+
* unbounded even with the SDK's retries switched off.
|
|
130
|
+
*/
|
|
131
|
+
export declare function warnOnStackedRetries(client: DynamoDBDocumentLike, logger: Logger): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* A row, or a key, as the DocumentClient returns and takes it: attribute names
|
|
134
|
+
* mapped to values that nothing has checked yet. Each feature's row parser
|
|
135
|
+
* turns one into that feature's row type.
|
|
136
|
+
*/
|
|
137
|
+
export type AttributeMap = Record<string, NativeAttributeValue>;
|
|
138
|
+
/** A BatchWriteItem PutRequest. */
|
|
139
|
+
interface PutWriteRequest {
|
|
140
|
+
PutRequest: {
|
|
141
|
+
Item: AttributeMap;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** A BatchWriteItem DeleteRequest. */
|
|
145
|
+
interface DeleteWriteRequest {
|
|
146
|
+
DeleteRequest: {
|
|
147
|
+
Key: AttributeMap;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/** A single BatchWriteItem write request. */
|
|
151
|
+
export type WriteRequest = PutWriteRequest | DeleteWriteRequest;
|
|
152
|
+
/** One action of a `TransactWriteItems` request, as the document client takes it. */
|
|
153
|
+
export type TransactAction = NonNullable<TransactWriteCommandInput['TransactItems']>[number];
|
|
154
|
+
/**
|
|
155
|
+
* The DocumentClient surface this library uses, named by shape rather than by
|
|
156
|
+
* identity. A `DynamoDBDocument` satisfies it, and so does a client built from
|
|
157
|
+
* a different copy of `@aws-sdk/lib-dynamodb`.
|
|
158
|
+
*
|
|
159
|
+
* That second case is the reason it exists. A consumer pinned to an older SDK
|
|
160
|
+
* than this package depends on gets a second, newer copy nested under the
|
|
161
|
+
* package; naming `DynamoDBDocument` in an option type would name *that* copy,
|
|
162
|
+
* and the client the consumer built is then a different type with the same
|
|
163
|
+
* name — refused at compile time for a method this library never calls, on the
|
|
164
|
+
* injection path the documentation recommends. Injection always worked at
|
|
165
|
+
* runtime; only the compiler stood in the way.
|
|
166
|
+
*
|
|
167
|
+
* The members are the eight the runtime collaborator check already requires,
|
|
168
|
+
* pinned equal to that list by a test — a client this type accepts and the
|
|
169
|
+
* constructor then rejects, or the reverse, would be worse than either rule
|
|
170
|
+
* alone. Picking them off `DynamoDBDocument` keeps each signature the SDK's
|
|
171
|
+
* own, so the internals stay exactly as type-safe as they were and the
|
|
172
|
+
* signatures cannot drift from the SDK this package installs.
|
|
173
|
+
*/
|
|
174
|
+
export type DynamoDBDocumentLike = Pick<DynamoDBDocument, 'batchWrite' | 'delete' | 'get' | 'put' | 'query' | 'scan' | 'transactWrite' | 'update'>;
|
|
175
|
+
export {};
|
|
@@ -1,19 +1,167 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides the DynamoDB client: the part of the DocumentClient this package calls,
|
|
4
|
+
* the row shapes that part speaks, and how a client this package builds bounds
|
|
5
|
+
* each request.
|
|
6
|
+
*
|
|
7
|
+
* The structural type is what lets a caller inject any DocumentClient-shaped
|
|
8
|
+
* object, and it is public; the row shapes travel through every module that
|
|
9
|
+
* reads or writes a row; the construction is the one place a request timeout
|
|
10
|
+
* and a socket timeout are set, and the one place that knows whether the
|
|
11
|
+
* adapter owns the client it holds.
|
|
12
|
+
*/
|
|
2
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.DEFAULT_SOCKET_TIMEOUT_MS = exports.DEFAULT_REQUEST_TIMEOUT_MS = void 0;
|
|
3
15
|
exports.resolveDynamoDBClient = resolveDynamoDBClient;
|
|
16
|
+
exports.warnOnStackedRetries = warnOnStackedRetries;
|
|
4
17
|
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
18
|
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
6
19
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `
|
|
20
|
+
* How long one request attempt may take on a client this library builds
|
|
21
|
+
* (10 seconds) before the SDK's request handler destroys it and rejects with a
|
|
22
|
+
* retryable `TimeoutError`. `MAX_WRITE_LIFETIME_MS`
|
|
23
|
+
* (`src/shared/dynamodb/retry.ts`) bounds how many attempts *start*; it is
|
|
24
|
+
* checked between them, so it can refuse to begin another wait and can never
|
|
25
|
+
* shorten the attempt already in flight. Without a handler timeout — every one
|
|
26
|
+
* of them defaults to 0 — a hung socket holds that attempt open forever and
|
|
27
|
+
* the write lifetime bounds nothing.
|
|
28
|
+
*
|
|
29
|
+
* Measured, not picked. Across the fan-out widths this package documents, the
|
|
30
|
+
* worst interval the handler itself saw — socket acquisition including the
|
|
31
|
+
* wait behind the agent's fifty sockets, connect, request write and
|
|
32
|
+
* time-to-first-response-header — was 0.92 s, at a thousand concurrent writes
|
|
33
|
+
* of 20 KB values, and ten seconds is roughly eleven times that. The asymmetry
|
|
34
|
+
* settles the close call: too large leaves one attempt hanging for at most ten
|
|
35
|
+
* seconds, which the write lifetime's own headroom absorbs, while too small
|
|
36
|
+
* turns a healthy wide fan-out into a retry storm.
|
|
37
|
+
*/
|
|
38
|
+
exports.DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
|
|
39
|
+
/**
|
|
40
|
+
* How long a socket may sit idle (5 seconds) on a client this library builds
|
|
41
|
+
* before the request handler destroys the request. Which error that surfaces
|
|
42
|
+
* as depends on when it fires: before response headers the handler's own
|
|
43
|
+
* rejection reaches the caller as a `TimeoutError`, while after them the call
|
|
44
|
+
* has already resolved and the destroy arrives through the response stream
|
|
45
|
+
* instead, as an `ECONNRESET` abort. Both are classified retryable, so either
|
|
46
|
+
* way a stalled transfer becomes a retry of this library's own. An idle timer
|
|
47
|
+
* rather than a deadline: activity in either direction resets it, so it bounds
|
|
48
|
+
* a transfer that has stalled and never one that is merely slow, and its clock
|
|
49
|
+
* starts at socket assignment rather than at request creation. What each
|
|
50
|
+
* client needs it *for* differs, so that belongs at each client's own call
|
|
51
|
+
* site rather than here.
|
|
52
|
+
*
|
|
53
|
+
* Not a tuning knob. The handler installs the socket listener immediately only
|
|
54
|
+
* below 6 000 ms; at or above that it defers registration by 3 000 ms and
|
|
55
|
+
* returns the deferral's timer id, which the handler's clear-on-resolve
|
|
56
|
+
* cancels when response headers arrive — so at 6 000 or more the field
|
|
57
|
+
* silently stops doing anything for every response that answers inside three
|
|
58
|
+
* seconds, which is the normal case. That is a fact about the request handler
|
|
59
|
+
* and about neither client. A unit assertion holds this value under that
|
|
60
|
+
* threshold so raising it fails loudly instead of disabling the only bound a
|
|
61
|
+
* stalled transfer has.
|
|
62
|
+
*/
|
|
63
|
+
exports.DEFAULT_SOCKET_TIMEOUT_MS = 5_000;
|
|
64
|
+
/**
|
|
65
|
+
* The DocumentClient an adapter will use, and whether it owns it.
|
|
66
|
+
*
|
|
67
|
+
* Accepts: `client` — an injected DocumentClient, used as-is; `clientConfig` —
|
|
68
|
+
* what one is built from when no client is injected; `createClient` — the test
|
|
69
|
+
* seam that builds it. `assertBaseAdapterOptions` rejects an injected client
|
|
70
|
+
* given alongside either of the other two, so only one branch is ever taken.
|
|
71
|
+
*
|
|
72
|
+
* Returns: the document client, the raw client behind it when this call built
|
|
73
|
+
* one, and `ownsClient` — true only then. An injected client is never
|
|
74
|
+
* destroyed by `destroy()`; it may be shared with the caller's own code and
|
|
75
|
+
* with the other adapters.
|
|
76
|
+
*
|
|
77
|
+
* Throws: whatever the SDK constructor throws for an unusable config.
|
|
78
|
+
*
|
|
79
|
+
* Guarantees: a client this call builds gets `maxAttempts: 1` unless the config
|
|
80
|
+
* overrides it, so the SDK performs no retries of its own and this library's
|
|
81
|
+
* retry layer is the only one. It also gets a default request handler that
|
|
82
|
+
* bounds how long one attempt may run, which `maxAttempts` alone does not. A
|
|
83
|
+
* `requestHandler` in `clientConfig` replaces that default whole rather than
|
|
84
|
+
* merging with it — the documented escape hatch, and equally the documented
|
|
85
|
+
* way to give up the bound. An injected client keeps whatever it was built
|
|
86
|
+
* with — see {@link warnOnStackedRetries}.
|
|
10
87
|
*/
|
|
11
88
|
function resolveDynamoDBClient(options) {
|
|
12
89
|
if (options.client) {
|
|
13
90
|
return { ddbClient: undefined, client: options.client, ownsClient: false };
|
|
14
91
|
}
|
|
15
92
|
const createClient = options.createClient ?? ((config) => new client_dynamodb_1.DynamoDBClient(config));
|
|
16
|
-
|
|
93
|
+
// `throwOnRequestTimeout` is what makes the request timeout a bound: without
|
|
94
|
+
// it the handler only logs a warning when the timeout is breached.
|
|
95
|
+
// `socketTimeout` is here because `requestTimeout` stops applying the moment
|
|
96
|
+
// response *headers* arrive — the handler resolves there and clears its
|
|
97
|
+
// timers — so it says nothing about a response body that then stalls
|
|
98
|
+
// mid-stream, and an idle timer does. No `connectionTimeout` is passed,
|
|
99
|
+
// deliberately — its timer starts when the request is created and is
|
|
100
|
+
// cleared only when the agent *assigns* a socket, so the time a request
|
|
101
|
+
// spends queued behind `maxSockets` counts against it. At the thousand-wide
|
|
102
|
+
// fan-out this package documents, any value short enough to be useful
|
|
103
|
+
// destroys healthy writes that this library then retries, and any value
|
|
104
|
+
// long enough to be safe bounds nothing the request timeout does not
|
|
105
|
+
// already bound.
|
|
106
|
+
const ddbClient = createClient({
|
|
107
|
+
maxAttempts: 1,
|
|
108
|
+
requestHandler: {
|
|
109
|
+
requestTimeout: exports.DEFAULT_REQUEST_TIMEOUT_MS,
|
|
110
|
+
socketTimeout: exports.DEFAULT_SOCKET_TIMEOUT_MS,
|
|
111
|
+
throwOnRequestTimeout: true,
|
|
112
|
+
},
|
|
113
|
+
...options.clientConfig,
|
|
114
|
+
});
|
|
17
115
|
return { ddbClient, client: lib_dynamodb_1.DynamoDBDocument.from(ddbClient), ownsClient: true };
|
|
18
116
|
}
|
|
19
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Warn once when an injected client keeps the SDK's own retries.
|
|
119
|
+
*
|
|
120
|
+
* Accepts: `client` — the caller's. A client that cannot report its setting —
|
|
121
|
+
* a stub, a mock, a future SDK shape — is left alone.
|
|
122
|
+
*
|
|
123
|
+
* Returns: nothing. Deliberately not awaited by its callers: it is a warning
|
|
124
|
+
* about a caller-supplied client, not a precondition for using it, so
|
|
125
|
+
* constructing an adapter stays free of I/O.
|
|
126
|
+
*
|
|
127
|
+
* Throws: nothing, ever. The SDK's own config resolution can reject, and a
|
|
128
|
+
* rejection here would surface as an unhandled rejection from a constructor
|
|
129
|
+
* that did nothing wrong.
|
|
130
|
+
*
|
|
131
|
+
* Guarantees: the SDK's retries run inside every attempt of this library's
|
|
132
|
+
* retry layer, so the budget the constants and README describe multiplies (5 ×
|
|
133
|
+
* 3 requests per operation at the SDK default) and a throttling event turns
|
|
134
|
+
* into a retry storm. Saying so once, at construction, is the only place the
|
|
135
|
+
* caller can act on it.
|
|
136
|
+
*
|
|
137
|
+
* The one gap a deadline cannot cover. A tokened write's budget is bounded by
|
|
138
|
+
* `MAX_WRITE_LIFETIME_MS`, but that bound is checked between attempts: it can
|
|
139
|
+
* refuse to start another wait, and it cannot shorten an attempt already in
|
|
140
|
+
* flight. An injected client that retries internally turns one of this
|
|
141
|
+
* library's attempts into several of its own, so the time spent inside a
|
|
142
|
+
* single attempt stops being bounded by anything this library sets — which is
|
|
143
|
+
* why the warning says to construct it with `maxAttempts: 1`.
|
|
144
|
+
*
|
|
145
|
+
* `maxAttempts: 1` is necessary but not sufficient. The per-attempt bound
|
|
146
|
+
* holds for an injected client only if it also carries its own request
|
|
147
|
+
* timeout: a client this library builds is given one
|
|
148
|
+
* ({@link resolveDynamoDBClient}), and an injected client is used exactly as
|
|
149
|
+
* handed over, so one without a handler timeout leaves a single attempt
|
|
150
|
+
* unbounded even with the SDK's retries switched off.
|
|
151
|
+
*/
|
|
152
|
+
async function warnOnStackedRetries(client, logger) {
|
|
153
|
+
const report = client.config
|
|
154
|
+
?.maxAttempts;
|
|
155
|
+
if (typeof report !== 'function')
|
|
156
|
+
return;
|
|
157
|
+
try {
|
|
158
|
+
const maxAttempts = await report();
|
|
159
|
+
if (maxAttempts > 1) {
|
|
160
|
+
logger.warn("injected DynamoDB client keeps the SDK's own retries; they stack inside this library's " +
|
|
161
|
+
'retry budget — construct it with maxAttempts: 1 unless that is intended', { maxAttempts });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// A client that cannot report its retry setting is left alone.
|
|
166
|
+
}
|
|
167
|
+
}
|