@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.1 → 1.0.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.
- package/README.md +1820 -290
- package/dist/cjs/backfill/backfill.d.ts +171 -0
- package/dist/cjs/backfill/backfill.js +177 -0
- package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
- package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
- package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
- package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
- package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
- package/dist/cjs/checkpointer/actions/list.js +70 -0
- package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
- package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
- package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
- package/dist/cjs/checkpointer/actions/put.js +79 -0
- package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
- package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
- package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
- package/dist/cjs/checkpointer/internal/listing.js +104 -0
- package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
- package/dist/cjs/checkpointer/internal/parse.js +184 -0
- package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
- package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
- package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
- package/dist/cjs/checkpointer/internal/read.js +132 -0
- package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
- package/dist/cjs/checkpointer/internal/rows.js +356 -0
- package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
- package/dist/cjs/checkpointer/internal/setup.js +25 -0
- package/dist/cjs/checkpointer/saver.d.ts +306 -0
- package/dist/cjs/checkpointer/saver.js +56 -0
- package/dist/cjs/checkpointer/types.d.ts +51 -0
- package/dist/cjs/factory/factory.d.ts +154 -0
- package/dist/cjs/factory/factory.js +137 -0
- package/dist/{factory → cjs/factory}/types.d.ts +33 -14
- package/dist/cjs/history/actions/add-messages.d.ts +51 -0
- package/dist/cjs/history/actions/add-messages.js +17 -0
- package/dist/cjs/history/actions/clear.d.ts +52 -0
- package/dist/cjs/history/actions/clear.js +29 -0
- package/dist/cjs/history/actions/get-messages.d.ts +60 -0
- package/dist/cjs/history/actions/get-messages.js +58 -0
- package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
- package/dist/cjs/history/actions/list-sessions.js +67 -0
- package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
- package/dist/cjs/history/actions/reconcile-count.js +8 -0
- package/dist/cjs/history/chat-message-history.d.ts +267 -0
- package/dist/cjs/history/chat-message-history.js +61 -0
- package/dist/cjs/history/internal/append.d.ts +244 -0
- package/dist/cjs/history/internal/append.js +267 -0
- package/dist/cjs/history/internal/message-read.d.ts +84 -0
- package/dist/cjs/history/internal/message-read.js +93 -0
- package/dist/cjs/history/internal/parse.d.ts +153 -0
- package/dist/cjs/history/internal/parse.js +113 -0
- package/dist/cjs/history/internal/rows.d.ts +196 -0
- package/dist/cjs/history/internal/rows.js +96 -0
- package/dist/cjs/history/internal/session.d.ts +350 -0
- package/dist/cjs/history/internal/session.js +296 -0
- package/dist/cjs/history/internal/setup.d.ts +64 -0
- package/dist/cjs/history/internal/setup.js +60 -0
- package/dist/cjs/history/session-adapter.d.ts +112 -0
- package/dist/cjs/history/session-adapter.js +38 -0
- package/dist/cjs/history/types.d.ts +102 -0
- package/dist/cjs/index.d.ts +53 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/shared/adapter.d.ts +146 -0
- package/dist/cjs/shared/adapter.js +70 -0
- package/dist/cjs/shared/clock.d.ts +52 -0
- package/dist/cjs/shared/clock.js +14 -0
- package/dist/cjs/shared/codec/codec.d.ts +336 -0
- package/dist/cjs/shared/codec/codec.js +162 -0
- package/dist/cjs/shared/codec/compression.d.ts +66 -0
- package/dist/cjs/shared/codec/compression.js +45 -0
- package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
- package/dist/cjs/shared/codec/json-serde.js +58 -0
- package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
- package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
- package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
- package/dist/cjs/shared/codec/s3/client.js +78 -0
- package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
- package/dist/cjs/shared/codec/s3/config.js +92 -0
- package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
- package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
- package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
- package/dist/cjs/shared/codec/s3/offloader.js +289 -0
- package/dist/cjs/shared/concurrency.d.ts +43 -0
- package/dist/{shared → cjs/shared}/concurrency.js +10 -9
- package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
- package/dist/cjs/shared/dynamodb/abort.js +16 -0
- package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
- package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
- package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
- package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
- package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
- package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
- package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
- package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
- package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
- package/dist/cjs/shared/dynamodb/paginate.js +90 -0
- package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
- package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
- package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
- package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
- package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
- package/dist/cjs/shared/dynamodb/retry.js +193 -0
- package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
- package/dist/cjs/shared/dynamodb/row-size.js +30 -0
- package/dist/cjs/shared/dynamodb/table-schema.d.ts +199 -0
- package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
- package/dist/cjs/shared/errors/base-error.d.ts +231 -0
- package/dist/cjs/shared/errors/base-error.js +73 -0
- package/dist/cjs/shared/errors/boundary.d.ts +86 -0
- package/dist/cjs/shared/errors/boundary.js +61 -0
- package/dist/cjs/shared/errors/classify.d.ts +206 -0
- package/dist/cjs/shared/errors/classify.js +232 -0
- package/dist/cjs/shared/errors/error-code.d.ts +95 -0
- package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
- package/dist/cjs/shared/errors/errors.d.ts +233 -0
- package/dist/cjs/shared/errors/errors.js +123 -0
- package/dist/cjs/shared/logging/logger.d.ts +80 -0
- package/dist/cjs/shared/logging/logger.js +30 -0
- package/dist/cjs/shared/logging/redaction.d.ts +123 -0
- package/dist/cjs/shared/logging/redaction.js +145 -0
- package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
- package/dist/cjs/shared/logging/secret-patterns.js +93 -0
- package/dist/cjs/shared/logging/truncate.d.ts +197 -0
- package/dist/cjs/shared/logging/truncate.js +31 -0
- package/dist/cjs/shared/options.d.ts +100 -0
- package/dist/cjs/shared/ulid.d.ts +80 -0
- package/dist/{shared → cjs/shared}/ulid.js +7 -21
- package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
- package/dist/cjs/shared/validation/collaborators.js +79 -0
- package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
- package/dist/cjs/shared/validation/option-shape.js +31 -0
- package/dist/cjs/shared/validation/options.d.ts +145 -0
- package/dist/cjs/shared/validation/options.js +166 -0
- package/dist/cjs/shared/validation/primitives.d.ts +292 -0
- package/dist/cjs/shared/validation/primitives.js +114 -0
- package/dist/cjs/shared/validation/ttl.d.ts +94 -0
- package/dist/cjs/shared/validation/ttl.js +52 -0
- package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
- package/dist/cjs/store/actions/list-namespaces.js +92 -0
- package/dist/cjs/store/actions/put.d.ts +43 -0
- package/dist/cjs/store/actions/put.js +49 -0
- package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
- package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
- package/dist/cjs/store/actions/search.d.ts +38 -0
- package/dist/cjs/store/actions/search.js +26 -0
- package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
- package/dist/cjs/store/internal/batch-plan.js +32 -0
- package/dist/cjs/store/internal/filter.d.ts +43 -0
- package/dist/cjs/store/internal/filter.js +64 -0
- package/dist/cjs/store/internal/get-item.d.ts +77 -0
- package/dist/cjs/store/internal/get-item.js +58 -0
- package/dist/cjs/store/internal/item-write.d.ts +270 -0
- package/dist/cjs/store/internal/item-write.js +181 -0
- package/dist/cjs/store/internal/parse.d.ts +230 -0
- package/dist/cjs/store/internal/parse.js +180 -0
- package/dist/cjs/store/internal/rows.d.ts +359 -0
- package/dist/cjs/store/internal/rows.js +166 -0
- package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
- package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
- package/dist/cjs/store/internal/setup.d.ts +96 -0
- package/dist/cjs/store/internal/setup.js +103 -0
- package/dist/cjs/store/internal/table-search.d.ts +100 -0
- package/dist/cjs/store/internal/table-search.js +123 -0
- package/dist/cjs/store/internal/vector-index.d.ts +258 -0
- package/dist/cjs/store/internal/vector-index.js +269 -0
- package/dist/cjs/store/store.d.ts +329 -0
- package/dist/cjs/store/store.js +97 -0
- package/dist/cjs/store/types.d.ts +111 -0
- package/dist/cjs/store/vector-backend.d.ts +104 -0
- package/dist/cjs/store/vector-backend.js +4 -0
- package/dist/esm/backfill/backfill.d.ts +171 -0
- package/dist/esm/backfill/backfill.js +170 -0
- package/dist/esm/checkpointer/actions/delete-thread.d.ts +50 -0
- package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
- package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
- package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
- package/dist/esm/checkpointer/actions/list.d.ts +55 -0
- package/dist/esm/checkpointer/actions/list.js +67 -0
- package/dist/esm/checkpointer/actions/put-writes.d.ts +49 -0
- package/dist/esm/checkpointer/actions/put-writes.js +18 -0
- package/dist/esm/checkpointer/actions/put.d.ts +95 -0
- package/dist/esm/checkpointer/actions/put.js +75 -0
- package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
- package/dist/esm/checkpointer/internal/delta-history.js +126 -0
- package/dist/esm/checkpointer/internal/listing.d.ts +149 -0
- package/dist/esm/checkpointer/internal/listing.js +95 -0
- package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
- package/dist/esm/checkpointer/internal/parse.js +169 -0
- package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
- package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
- package/dist/esm/checkpointer/internal/read.d.ts +135 -0
- package/dist/esm/checkpointer/internal/read.js +125 -0
- package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
- package/dist/esm/checkpointer/internal/rows.js +323 -0
- package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
- package/dist/esm/checkpointer/internal/setup.js +21 -0
- package/dist/esm/checkpointer/saver.d.ts +306 -0
- package/dist/esm/checkpointer/saver.js +52 -0
- package/dist/esm/checkpointer/types.d.ts +51 -0
- package/dist/esm/checkpointer/types.js +1 -0
- package/dist/esm/factory/factory.d.ts +154 -0
- package/dist/esm/factory/factory.js +133 -0
- package/dist/esm/factory/types.d.ts +76 -0
- package/dist/esm/factory/types.js +1 -0
- package/dist/esm/history/actions/add-messages.d.ts +51 -0
- package/dist/esm/history/actions/add-messages.js +14 -0
- package/dist/esm/history/actions/clear.d.ts +52 -0
- package/dist/esm/history/actions/clear.js +26 -0
- package/dist/esm/history/actions/get-messages.d.ts +60 -0
- package/dist/esm/history/actions/get-messages.js +55 -0
- package/dist/esm/history/actions/list-sessions.d.ts +55 -0
- package/dist/esm/history/actions/list-sessions.js +64 -0
- package/dist/esm/history/actions/reconcile-count.d.ts +49 -0
- package/dist/esm/history/actions/reconcile-count.js +5 -0
- package/dist/esm/history/chat-message-history.d.ts +267 -0
- package/dist/esm/history/chat-message-history.js +57 -0
- package/dist/esm/history/internal/append.d.ts +244 -0
- package/dist/esm/history/internal/append.js +259 -0
- package/dist/esm/history/internal/message-read.d.ts +84 -0
- package/dist/esm/history/internal/message-read.js +89 -0
- package/dist/esm/history/internal/parse.d.ts +153 -0
- package/dist/esm/history/internal/parse.js +105 -0
- package/dist/esm/history/internal/rows.d.ts +196 -0
- package/dist/esm/history/internal/rows.js +83 -0
- package/dist/esm/history/internal/session.d.ts +350 -0
- package/dist/esm/history/internal/session.js +285 -0
- package/dist/esm/history/internal/setup.d.ts +64 -0
- package/dist/esm/history/internal/setup.js +56 -0
- package/dist/esm/history/session-adapter.d.ts +112 -0
- package/dist/esm/history/session-adapter.js +34 -0
- package/dist/esm/history/types.d.ts +102 -0
- package/dist/esm/history/types.js +1 -0
- package/dist/esm/index.d.ts +53 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/shared/adapter.d.ts +146 -0
- package/dist/esm/shared/adapter.js +65 -0
- package/dist/esm/shared/clock.d.ts +52 -0
- package/dist/esm/shared/clock.js +9 -0
- package/dist/esm/shared/codec/codec.d.ts +336 -0
- package/dist/esm/shared/codec/codec.js +150 -0
- package/dist/esm/shared/codec/compression.d.ts +66 -0
- package/dist/esm/shared/codec/compression.js +40 -0
- package/dist/esm/shared/codec/json-serde.d.ts +80 -0
- package/dist/esm/shared/codec/json-serde.js +54 -0
- package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
- package/dist/esm/shared/codec/s3/client-types.js +3 -0
- package/dist/esm/shared/codec/s3/client.d.ts +63 -0
- package/dist/esm/shared/codec/s3/client.js +40 -0
- package/dist/esm/shared/codec/s3/config.d.ts +260 -0
- package/dist/esm/shared/codec/s3/config.js +79 -0
- package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
- package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
- package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
- package/dist/esm/shared/codec/s3/offloader.js +278 -0
- package/dist/esm/shared/concurrency.d.ts +43 -0
- package/dist/esm/shared/concurrency.js +27 -0
- package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
- package/dist/esm/shared/dynamodb/abort.js +12 -0
- package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
- package/dist/esm/shared/dynamodb/batch-write.js +74 -0
- package/dist/esm/shared/dynamodb/cancellation.d.ts +124 -0
- package/dist/esm/shared/dynamodb/cancellation.js +30 -0
- package/dist/esm/shared/dynamodb/client.d.ts +177 -0
- package/dist/esm/shared/dynamodb/client.js +35 -0
- package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
- package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
- package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
- package/dist/esm/shared/dynamodb/paginate.js +84 -0
- package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
- package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
- package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
- package/dist/esm/shared/dynamodb/recency-index.js +136 -0
- package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
- package/dist/esm/shared/dynamodb/retry.js +180 -0
- package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
- package/dist/esm/shared/dynamodb/row-size.js +26 -0
- package/dist/esm/shared/dynamodb/table-schema.d.ts +199 -0
- package/dist/esm/shared/dynamodb/table-schema.js +43 -0
- package/dist/esm/shared/errors/base-error.d.ts +231 -0
- package/dist/esm/shared/errors/base-error.js +64 -0
- package/dist/esm/shared/errors/boundary.d.ts +86 -0
- package/dist/esm/shared/errors/boundary.js +54 -0
- package/dist/esm/shared/errors/classify.d.ts +206 -0
- package/dist/esm/shared/errors/classify.js +220 -0
- package/dist/esm/shared/errors/error-code.d.ts +95 -0
- package/dist/esm/shared/errors/error-code.js +24 -0
- package/dist/esm/shared/errors/errors.d.ts +233 -0
- package/dist/esm/shared/errors/errors.js +110 -0
- package/dist/esm/shared/logging/logger.d.ts +80 -0
- package/dist/esm/shared/logging/logger.js +25 -0
- package/dist/esm/shared/logging/redaction.d.ts +123 -0
- package/dist/esm/shared/logging/redaction.js +140 -0
- package/dist/esm/shared/logging/secret-patterns.d.ts +227 -0
- package/dist/esm/shared/logging/secret-patterns.js +83 -0
- package/dist/esm/shared/logging/truncate.d.ts +197 -0
- package/dist/esm/shared/logging/truncate.js +25 -0
- package/dist/esm/shared/options.d.ts +100 -0
- package/dist/esm/shared/options.js +1 -0
- package/dist/esm/shared/ulid.d.ts +80 -0
- package/dist/esm/shared/ulid.js +77 -0
- package/dist/esm/shared/validation/collaborators.d.ts +160 -0
- package/dist/esm/shared/validation/collaborators.js +70 -0
- package/dist/esm/shared/validation/option-shape.d.ts +91 -0
- package/dist/esm/shared/validation/option-shape.js +24 -0
- package/dist/esm/shared/validation/options.d.ts +145 -0
- package/dist/esm/shared/validation/options.js +156 -0
- package/dist/esm/shared/validation/primitives.d.ts +292 -0
- package/dist/esm/shared/validation/primitives.js +100 -0
- package/dist/esm/shared/validation/ttl.d.ts +94 -0
- package/dist/esm/shared/validation/ttl.js +46 -0
- package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
- package/dist/esm/store/actions/list-namespaces.js +86 -0
- package/dist/esm/store/actions/put.d.ts +43 -0
- package/dist/esm/store/actions/put.js +46 -0
- package/dist/esm/store/actions/reconcile-vector-index.d.ts +38 -0
- package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
- package/dist/esm/store/actions/search.d.ts +38 -0
- package/dist/esm/store/actions/search.js +23 -0
- package/dist/esm/store/internal/batch-plan.d.ts +56 -0
- package/dist/esm/store/internal/batch-plan.js +28 -0
- package/dist/esm/store/internal/filter.d.ts +43 -0
- package/dist/esm/store/internal/filter.js +60 -0
- package/dist/esm/store/internal/get-item.d.ts +77 -0
- package/dist/esm/store/internal/get-item.js +54 -0
- package/dist/esm/store/internal/item-write.d.ts +270 -0
- package/dist/esm/store/internal/item-write.js +173 -0
- package/dist/esm/store/internal/parse.d.ts +230 -0
- package/dist/esm/store/internal/parse.js +169 -0
- package/dist/esm/store/internal/rows.d.ts +359 -0
- package/dist/esm/store/internal/rows.js +147 -0
- package/dist/esm/store/internal/semantic-search.d.ts +168 -0
- package/dist/esm/store/internal/semantic-search.js +200 -0
- package/dist/esm/store/internal/setup.d.ts +96 -0
- package/dist/esm/store/internal/setup.js +98 -0
- package/dist/esm/store/internal/table-search.d.ts +100 -0
- package/dist/esm/store/internal/table-search.js +119 -0
- package/dist/esm/store/internal/vector-index.d.ts +258 -0
- package/dist/esm/store/internal/vector-index.js +256 -0
- package/dist/esm/store/store.d.ts +329 -0
- package/dist/esm/store/store.js +93 -0
- package/dist/esm/store/types.d.ts +111 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/store/vector-backend.d.ts +104 -0
- package/dist/esm/store/vector-backend.js +1 -0
- package/package.json +68 -46
- package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
- package/dist/checkpointer/actions/delete-thread.js +0 -38
- package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
- package/dist/checkpointer/actions/get-tuple.js +0 -25
- package/dist/checkpointer/actions/list.d.ts +0 -20
- package/dist/checkpointer/actions/list.js +0 -113
- package/dist/checkpointer/actions/put-writes.d.ts +0 -15
- package/dist/checkpointer/actions/put-writes.js +0 -62
- package/dist/checkpointer/actions/put.d.ts +0 -17
- package/dist/checkpointer/actions/put.js +0 -73
- package/dist/checkpointer/internal/assemble.d.ts +0 -17
- package/dist/checkpointer/internal/assemble.js +0 -38
- package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
- package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
- package/dist/checkpointer/internal/configurable.d.ts +0 -12
- package/dist/checkpointer/internal/configurable.js +0 -24
- package/dist/checkpointer/internal/fetch.d.ts +0 -19
- package/dist/checkpointer/internal/fetch.js +0 -88
- package/dist/checkpointer/internal/filter-match.d.ts +0 -13
- package/dist/checkpointer/internal/filter-match.js +0 -15
- package/dist/checkpointer/internal/item-reader.d.ts +0 -66
- package/dist/checkpointer/internal/item-reader.js +0 -113
- package/dist/checkpointer/internal/item-writer.d.ts +0 -35
- package/dist/checkpointer/internal/item-writer.js +0 -107
- package/dist/checkpointer/internal/keys.d.ts +0 -41
- package/dist/checkpointer/internal/keys.js +0 -117
- package/dist/checkpointer/internal/list-scope.d.ts +0 -61
- package/dist/checkpointer/internal/list-scope.js +0 -108
- package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
- package/dist/checkpointer/internal/pending-sends.js +0 -29
- package/dist/checkpointer/internal/query.d.ts +0 -21
- package/dist/checkpointer/internal/query.js +0 -42
- package/dist/checkpointer/internal/regular-write.d.ts +0 -28
- package/dist/checkpointer/internal/regular-write.js +0 -66
- package/dist/checkpointer/internal/setup.d.ts +0 -33
- package/dist/checkpointer/internal/setup.js +0 -38
- package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
- package/dist/checkpointer/internal/special-write-verify.js +0 -80
- package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
- package/dist/checkpointer/internal/stored-channels.js +0 -70
- package/dist/checkpointer/internal/validation.d.ts +0 -18
- package/dist/checkpointer/internal/validation.js +0 -40
- package/dist/checkpointer/internal/write-guard.d.ts +0 -20
- package/dist/checkpointer/internal/write-guard.js +0 -48
- package/dist/checkpointer/internal/write-index.d.ts +0 -36
- package/dist/checkpointer/internal/write-index.js +0 -41
- package/dist/checkpointer/saver.d.ts +0 -70
- package/dist/checkpointer/saver.js +0 -105
- package/dist/checkpointer/types.d.ts +0 -58
- package/dist/factory/factory.d.ts +0 -40
- package/dist/factory/factory.js +0 -87
- package/dist/history/actions/add-messages.d.ts +0 -15
- package/dist/history/actions/add-messages.js +0 -77
- package/dist/history/actions/clear.d.ts +0 -10
- package/dist/history/actions/clear.js +0 -34
- package/dist/history/actions/get-messages.d.ts +0 -17
- package/dist/history/actions/get-messages.js +0 -79
- package/dist/history/actions/list-sessions.d.ts +0 -13
- package/dist/history/actions/list-sessions.js +0 -53
- package/dist/history/actions/reconcile-count.d.ts +0 -12
- package/dist/history/actions/reconcile-count.js +0 -64
- package/dist/history/chat-message-history.d.ts +0 -73
- package/dist/history/chat-message-history.js +0 -111
- package/dist/history/internal/append-saga.d.ts +0 -25
- package/dist/history/internal/append-saga.js +0 -79
- package/dist/history/internal/compensation.d.ts +0 -25
- package/dist/history/internal/compensation.js +0 -92
- package/dist/history/internal/item-mapper.d.ts +0 -9
- package/dist/history/internal/item-mapper.js +0 -27
- package/dist/history/internal/keys.d.ts +0 -16
- package/dist/history/internal/keys.js +0 -48
- package/dist/history/internal/message-chunker.d.ts +0 -13
- package/dist/history/internal/message-chunker.js +0 -67
- package/dist/history/internal/message-transaction.d.ts +0 -25
- package/dist/history/internal/message-transaction.js +0 -61
- package/dist/history/internal/message-window.d.ts +0 -17
- package/dist/history/internal/message-window.js +0 -49
- package/dist/history/internal/query.d.ts +0 -23
- package/dist/history/internal/query.js +0 -39
- package/dist/history/internal/session-count.d.ts +0 -47
- package/dist/history/internal/session-count.js +0 -115
- package/dist/history/internal/session-title.d.ts +0 -19
- package/dist/history/internal/session-title.js +0 -43
- package/dist/history/internal/session-update.d.ts +0 -27
- package/dist/history/internal/session-update.js +0 -69
- package/dist/history/internal/setup.d.ts +0 -31
- package/dist/history/internal/setup.js +0 -43
- package/dist/history/internal/title-generator.d.ts +0 -12
- package/dist/history/internal/title-generator.js +0 -41
- package/dist/history/internal/ttl-anchor.d.ts +0 -24
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/validation.d.ts +0 -25
- package/dist/history/internal/validation.js +0 -53
- package/dist/history/session-adapter.d.ts +0 -29
- package/dist/history/session-adapter.js +0 -35
- package/dist/history/types.d.ts +0 -69
- package/dist/index.d.ts +0 -29
- package/dist/index.js +0 -32
- package/dist/shared/clock.d.ts +0 -8
- package/dist/shared/clock.js +0 -16
- package/dist/shared/codec/codec.d.ts +0 -53
- package/dist/shared/codec/codec.js +0 -66
- package/dist/shared/codec/compression.d.ts +0 -24
- package/dist/shared/codec/compression.js +0 -48
- package/dist/shared/codec/descriptor-keys.d.ts +0 -12
- package/dist/shared/codec/descriptor-keys.js +0 -14
- package/dist/shared/codec/encode.d.ts +0 -13
- package/dist/shared/codec/encode.js +0 -43
- package/dist/shared/codec/json-serde.d.ts +0 -7
- package/dist/shared/codec/json-serde.js +0 -17
- package/dist/shared/codec/payload-loss.d.ts +0 -12
- package/dist/shared/codec/payload-loss.js +0 -38
- package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
- package/dist/shared/codec/s3/adapter-config.js +0 -22
- package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
- package/dist/shared/codec/s3/bounded-body.js +0 -47
- package/dist/shared/codec/s3/client.d.ts +0 -18
- package/dist/shared/codec/s3/client.js +0 -46
- package/dist/shared/codec/s3/config.d.ts +0 -51
- package/dist/shared/codec/s3/config.js +0 -58
- package/dist/shared/codec/s3/delete.d.ts +0 -7
- package/dist/shared/codec/s3/delete.js +0 -28
- package/dist/shared/codec/s3/key-scope.d.ts +0 -23
- package/dist/shared/codec/s3/key-scope.js +0 -44
- package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
- package/dist/shared/codec/s3/lifecycle.js +0 -63
- package/dist/shared/codec/s3/offloader.d.ts +0 -44
- package/dist/shared/codec/s3/offloader.js +0 -118
- package/dist/shared/codec/s3/orphans.d.ts +0 -23
- package/dist/shared/codec/s3/orphans.js +0 -71
- package/dist/shared/codec/s3/read-write.d.ts +0 -18
- package/dist/shared/codec/s3/read-write.js +0 -51
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.js +0 -22
- package/dist/shared/concurrency.d.ts +0 -6
- package/dist/shared/constants.d.ts +0 -112
- package/dist/shared/constants.js +0 -115
- package/dist/shared/dynamodb/abort.d.ts +0 -9
- package/dist/shared/dynamodb/abort.js +0 -27
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.js +0 -48
- package/dist/shared/dynamodb/batch-write.d.ts +0 -22
- package/dist/shared/dynamodb/batch-write.js +0 -53
- package/dist/shared/dynamodb/cancellation.d.ts +0 -6
- package/dist/shared/dynamodb/cancellation.js +0 -7
- package/dist/shared/dynamodb/client.d.ts +0 -28
- package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
- package/dist/shared/dynamodb/conditional-put.js +0 -76
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
- package/dist/shared/dynamodb/expiry.d.ts +0 -16
- package/dist/shared/dynamodb/expiry.js +0 -29
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
- package/dist/shared/dynamodb/paginate-core.js +0 -82
- package/dist/shared/dynamodb/paginate.d.ts +0 -14
- package/dist/shared/dynamodb/paginate.js +0 -19
- package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
- package/dist/shared/dynamodb/partition-delete.js +0 -71
- package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
- package/dist/shared/dynamodb/retry-classifier.js +0 -118
- package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
- package/dist/shared/dynamodb/retry-policy.js +0 -22
- package/dist/shared/dynamodb/retry.d.ts +0 -31
- package/dist/shared/dynamodb/retry.js +0 -57
- package/dist/shared/dynamodb/scan.d.ts +0 -14
- package/dist/shared/dynamodb/scan.js +0 -19
- package/dist/shared/dynamodb/types.d.ts +0 -23
- package/dist/shared/errors/base-error.d.ts +0 -30
- package/dist/shared/errors/base-error.js +0 -27
- package/dist/shared/errors/boundary.d.ts +0 -18
- package/dist/shared/errors/boundary.js +0 -46
- package/dist/shared/errors/error-code.d.ts +0 -13
- package/dist/shared/errors/errors.d.ts +0 -68
- package/dist/shared/errors/errors.js +0 -114
- package/dist/shared/errors/upstream-error.d.ts +0 -16
- package/dist/shared/errors/upstream-error.js +0 -27
- package/dist/shared/errors/wrap-error.d.ts +0 -7
- package/dist/shared/errors/wrap-error.js +0 -15
- package/dist/shared/logging/logger.d.ts +0 -18
- package/dist/shared/logging/logger.js +0 -15
- package/dist/shared/logging/redaction-walk.d.ts +0 -23
- package/dist/shared/logging/redaction-walk.js +0 -112
- package/dist/shared/logging/redaction.d.ts +0 -39
- package/dist/shared/logging/redaction.js +0 -75
- package/dist/shared/logging/secret-patterns.d.ts +0 -92
- package/dist/shared/logging/secret-patterns.js +0 -133
- package/dist/shared/options.d.ts +0 -37
- package/dist/shared/ulid.d.ts +0 -23
- package/dist/shared/validation/options.d.ts +0 -8
- package/dist/shared/validation/options.js +0 -90
- package/dist/shared/validation/primitives.d.ts +0 -29
- package/dist/shared/validation/primitives.js +0 -82
- package/dist/shared/validation/ttl.d.ts +0 -28
- package/dist/shared/validation/ttl.js +0 -52
- package/dist/store/actions/get.d.ts +0 -13
- package/dist/store/actions/get.js +0 -73
- package/dist/store/actions/list-namespaces.d.ts +0 -8
- package/dist/store/actions/list-namespaces.js +0 -59
- package/dist/store/actions/put.d.ts +0 -10
- package/dist/store/actions/put.js +0 -96
- package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
- package/dist/store/actions/reconcile-vector-index.js +0 -26
- package/dist/store/actions/search.d.ts +0 -9
- package/dist/store/actions/search.js +0 -34
- package/dist/store/internal/backend-search.d.ts +0 -4
- package/dist/store/internal/backend-search.js +0 -74
- package/dist/store/internal/batch-plan.d.ts +0 -11
- package/dist/store/internal/batch-plan.js +0 -52
- package/dist/store/internal/candidates.d.ts +0 -23
- package/dist/store/internal/candidates.js +0 -94
- package/dist/store/internal/filter.d.ts +0 -9
- package/dist/store/internal/filter.js +0 -85
- package/dist/store/internal/index-reconcile.d.ts +0 -21
- package/dist/store/internal/index-reconcile.js +0 -118
- package/dist/store/internal/index-sync.d.ts +0 -10
- package/dist/store/internal/index-sync.js +0 -25
- package/dist/store/internal/item-mapper.d.ts +0 -27
- package/dist/store/internal/item-mapper.js +0 -61
- package/dist/store/internal/keys.d.ts +0 -17
- package/dist/store/internal/keys.js +0 -41
- package/dist/store/internal/namespace-match.d.ts +0 -11
- package/dist/store/internal/namespace-match.js +0 -40
- package/dist/store/internal/option-validation.d.ts +0 -13
- package/dist/store/internal/option-validation.js +0 -77
- package/dist/store/internal/overwrite-swap.d.ts +0 -32
- package/dist/store/internal/overwrite-swap.js +0 -68
- package/dist/store/internal/persist.d.ts +0 -28
- package/dist/store/internal/persist.js +0 -64
- package/dist/store/internal/query.d.ts +0 -11
- package/dist/store/internal/query.js +0 -48
- package/dist/store/internal/ranker.d.ts +0 -18
- package/dist/store/internal/ranker.js +0 -39
- package/dist/store/internal/read-existing.d.ts +0 -23
- package/dist/store/internal/read-existing.js +0 -41
- package/dist/store/internal/score-direction.d.ts +0 -31
- package/dist/store/internal/score-direction.js +0 -38
- package/dist/store/internal/search-filter.d.ts +0 -3
- package/dist/store/internal/search-filter.js +0 -10
- package/dist/store/internal/semantic-search.d.ts +0 -34
- package/dist/store/internal/semantic-search.js +0 -87
- package/dist/store/internal/setup.d.ts +0 -36
- package/dist/store/internal/setup.js +0 -40
- package/dist/store/internal/text-path.d.ts +0 -17
- package/dist/store/internal/validation.d.ts +0 -18
- package/dist/store/internal/validation.js +0 -51
- package/dist/store/internal/write-verify.d.ts +0 -42
- package/dist/store/internal/write-verify.js +0 -71
- package/dist/store/store.d.ts +0 -61
- package/dist/store/store.js +0 -107
- package/dist/store/types.d.ts +0 -50
- package/dist/store/types.js +0 -2
- package/dist/store/vector-backend.d.ts +0 -43
- package/dist/store/vector-backend.js +0 -2
- /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
- /package/dist/{factory → cjs/factory}/types.js +0 -0
- /package/dist/{history → cjs/history}/types.js +0 -0
- /package/dist/{shared → cjs/shared}/options.js +0 -0
- /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides when and how a failed request is retried (record 14).
|
|
3
|
+
*
|
|
4
|
+
* Which failures are transient — read from an error's whole cause chain, its
|
|
5
|
+
* HTTP status and its retryable trait, and from a cancelled transaction's
|
|
6
|
+
* reasons — the full-jitter backoff schedule, the attempt budget and the
|
|
7
|
+
* deadline that can cut it short, and the policy an adapter resolves from its
|
|
8
|
+
* options at construction are one decision. Every DynamoDB call goes through
|
|
9
|
+
* it, and so does an S3 object upload and download; the bucket lifecycle calls
|
|
10
|
+
* (`maxAttempts: 1` on the S3 client) and orphan release, which retries on its
|
|
11
|
+
* own loop, do not.
|
|
12
|
+
*/
|
|
13
|
+
import type { Logger } from '../logging/logger.js';
|
|
14
|
+
/** Starting delay for UnprocessedItems / UnprocessedKeys backoff loops. */
|
|
15
|
+
export declare const INITIAL_BACKOFF_DELAY_MS = 100;
|
|
16
|
+
/** Maximum backoff delay for retry loops. */
|
|
17
|
+
export declare const MAX_BACKOFF_DELAY_MS = 5000;
|
|
18
|
+
/** Default maximum attempts for transient-error retries. */
|
|
19
|
+
export declare const DEFAULT_RETRY_MAX_ATTEMPTS = 5;
|
|
20
|
+
/**
|
|
21
|
+
* How long DynamoDB treats a repeated client request token as the same request
|
|
22
|
+
* rather than a new one, so re-sending a tokened write is deduplicated instead
|
|
23
|
+
* of applied twice (10 minutes). Recorded as its own constant so the margin
|
|
24
|
+
* {@link MAX_WRITE_LIFETIME_MS} keeps under it is legible.
|
|
25
|
+
*/
|
|
26
|
+
export declare const TOKEN_IDEMPOTENCY_WINDOW_MS = 600000;
|
|
27
|
+
/**
|
|
28
|
+
* Longest one token-carrying write may keep retrying (5 minutes): half of
|
|
29
|
+
* {@link TOKEN_IDEMPOTENCY_WINDOW_MS}. The other half absorbs the attempt
|
|
30
|
+
* still in flight when the budget ends, clock skew between this client's own
|
|
31
|
+
* clock and DynamoDB's timer, and SDK-internal queueing, so a write that
|
|
32
|
+
* retries to the end still finishes well inside the window its token is
|
|
33
|
+
* honoured for. Its own literal rather than a division of the window:
|
|
34
|
+
* aliasing them would move one whenever the other is retuned (see
|
|
35
|
+
* `LIST_SCAN_WARN_THRESHOLD` (`src/shared/dynamodb/paginate.ts`)).
|
|
36
|
+
*/
|
|
37
|
+
export declare const MAX_WRITE_LIFETIME_MS = 300000;
|
|
38
|
+
/**
|
|
39
|
+
* The per-request options one attempt hands to the SDK call it makes.
|
|
40
|
+
*
|
|
41
|
+
* It is the AWS SDK's own second argument (`HttpHandlerOptions` from
|
|
42
|
+
* `@smithy/types`) narrowed to the single field this library sets, so a call
|
|
43
|
+
* site forwards the value it was given instead of assembling one — the
|
|
44
|
+
* difference between `client.get(params, request)` at every site and thirty
|
|
45
|
+
* chances to write `{ signal }` where the SDK reads `abortSignal`.
|
|
46
|
+
*
|
|
47
|
+
* `DynamoDBDocumentLike` picks its members off the real `DynamoDBDocument`, so
|
|
48
|
+
* every method already accepts this as its optional second argument and no
|
|
49
|
+
* type had to move to make room for it.
|
|
50
|
+
*/
|
|
51
|
+
export interface SdkRequestOptions {
|
|
52
|
+
abortSignal?: AbortSignal;
|
|
53
|
+
}
|
|
54
|
+
/** What {@link RetryOptions.onRetry} learns before each backoff sleep. */
|
|
55
|
+
export interface RetryAttemptInfo {
|
|
56
|
+
attempt: number;
|
|
57
|
+
delayMs: number;
|
|
58
|
+
error: Error;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* How a failed request is retried: how many attempts, how long each wait, and
|
|
62
|
+
* which failures qualify.
|
|
63
|
+
*/
|
|
64
|
+
export interface RetryOptions {
|
|
65
|
+
maxAttempts?: number;
|
|
66
|
+
baseDelayMs?: number;
|
|
67
|
+
maxDelayMs?: number;
|
|
68
|
+
retryableErrors?: readonly string[];
|
|
69
|
+
/**
|
|
70
|
+
* Decides retryability instead of `retryableErrors`: called with each failed
|
|
71
|
+
* attempt's error, it retries when it returns `true`.
|
|
72
|
+
*/
|
|
73
|
+
isRetryable?: (error: Error) => boolean;
|
|
74
|
+
/** Called before every backoff sleep, so retries are visible before the budget is exhausted. */
|
|
75
|
+
onRetry?: (info: RetryAttemptInfo) => void;
|
|
76
|
+
signal?: AbortSignal;
|
|
77
|
+
rng?: () => number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The cap a backoff schedule runs under.
|
|
81
|
+
*
|
|
82
|
+
* Accepts: `baseDelayMs` — the schedule's first delay, already defaulted.
|
|
83
|
+
* `maxDelayMs` — the cap the caller named, if it named one.
|
|
84
|
+
*
|
|
85
|
+
* Returns: the named cap; without one, {@link MAX_BACKOFF_DELAY_MS} raised to
|
|
86
|
+
* a base above it.
|
|
87
|
+
*
|
|
88
|
+
* Throws: nothing.
|
|
89
|
+
*
|
|
90
|
+
* Guarantees: a base delay given without a cap is the delay the schedule
|
|
91
|
+
* starts from. Held under the default cap it would be cut to five seconds on
|
|
92
|
+
* every sleep: an option accepted and then ignored.
|
|
93
|
+
*/
|
|
94
|
+
export declare function backoffCapMs(baseDelayMs: number, maxDelayMs: number | undefined): number;
|
|
95
|
+
/**
|
|
96
|
+
* Run `fn`, retrying transient failures with full-jitter exponential backoff.
|
|
97
|
+
*
|
|
98
|
+
* Accepts: `fn` — given the {@link SdkRequestOptions} for the attempt, to pass
|
|
99
|
+
* as the second argument of the SDK call it makes. That argument is what
|
|
100
|
+
* carries `options.signal` into the request, and it is the only way a call
|
|
101
|
+
* site can: `fn` closes over its own parameters, so nothing else reaches it.
|
|
102
|
+
* An `fn` that makes no cancellable call ignores the parameter and is written
|
|
103
|
+
* exactly as it was, since a zero-argument function still satisfies the type.
|
|
104
|
+
*
|
|
105
|
+
* Accepts: `options.maxAttempts` — total attempts including the first, default
|
|
106
|
+
* {@link DEFAULT_RETRY_MAX_ATTEMPTS}; at least 1, which `assertRetryPolicy`
|
|
107
|
+
* enforces for every caller-supplied policy. `options.baseDelayMs` /
|
|
108
|
+
* `maxDelayMs` — the backoff schedule, its cap defaulted by
|
|
109
|
+
* {@link backoffCapMs}. `options.isRetryable` — replaces
|
|
110
|
+
* `retryableErrors` entirely, so a call site can share one classifier with
|
|
111
|
+
* paths that do not go through here. `options.signal` — checked before the
|
|
112
|
+
* first attempt, handed to every attempt as `abortSignal` so the request in
|
|
113
|
+
* flight is cancelled rather than merely awaited, checked again when an
|
|
114
|
+
* attempt fails, and honoured during every backoff wait. `options.onRetry` —
|
|
115
|
+
* called synchronously before each wait; an exception from it is not caught
|
|
116
|
+
* and ends the operation. `options.deadlineAt` — an internal bound on the
|
|
117
|
+
* whole budget rather than on one attempt: the wait that would carry the
|
|
118
|
+
* operation past it is never started, and the budget ends there instead.
|
|
119
|
+
* Without it the schedule, the attempt count and every error are unchanged.
|
|
120
|
+
*
|
|
121
|
+
* Returns: whatever `fn` resolves to, from the first attempt that succeeds.
|
|
122
|
+
*
|
|
123
|
+
* Throws: the error itself, unchanged, when it is not retryable — a
|
|
124
|
+
* `ValidationException` or a permission failure is never retried;
|
|
125
|
+
* `ABORTED` when the signal fires, including during a wait and
|
|
126
|
+
* including while a request is in flight — the SDK rejects the cancelled
|
|
127
|
+
* request with an error of its own, and a failed attempt whose signal has
|
|
128
|
+
* fired is reported as the cancel it is rather than being classified, retried
|
|
129
|
+
* or wrapped; `RETRY_EXHAUSTED` once the budget ends, carrying the attempt
|
|
130
|
+
* actually reached — not the attempts configured — and the last error as
|
|
131
|
+
* `cause`. Its message quotes the last error **redacted**, because it reaches
|
|
132
|
+
* `err.message`, which an application may print without a redacting logger.
|
|
133
|
+
* That error also records, for `mayStillLand` to read back
|
|
134
|
+
* (`retryBudgetMayStillLand`), whether *any* attempt of the budget — not only
|
|
135
|
+
* the last — left DynamoDB free to apply it later: one that ended on this
|
|
136
|
+
* side before an answer, one DynamoDB answered `TransactionInProgressException`
|
|
137
|
+
* to (its own earlier attempt under the same token still being processed), or
|
|
138
|
+
* one it answered with a server error (see `mayStillBeInFlight`). An attempt
|
|
139
|
+
* answered some other way settles nothing by itself, whatever attempt beside
|
|
140
|
+
* it did.
|
|
141
|
+
*
|
|
142
|
+
* A deadline that ends the budget is reported exactly as a spent one, by the
|
|
143
|
+
* same error with the same code: a caller cannot tell the two apart, and
|
|
144
|
+
* nothing needs to, since the handling of both is identical — read the row
|
|
145
|
+
* back, and release only what is confirmed not to have landed.
|
|
146
|
+
*
|
|
147
|
+
* A cancelled wait is also an abort no longer observed. The signal is read
|
|
148
|
+
* before the first attempt, after every failed one, and inside each wait, so
|
|
149
|
+
* ending the budget in place of a wait drops only that last observation point:
|
|
150
|
+
* a signal that fires *after* the deadline has already refused the wait, in
|
|
151
|
+
* the window where the wait would have been running, surfaces as
|
|
152
|
+
* `RETRY_EXHAUSTED` rather than `ABORTED`. One already set
|
|
153
|
+
* at entry, fired during an attempt, or fired during an earlier wait, is still
|
|
154
|
+
* caught.
|
|
155
|
+
*
|
|
156
|
+
* Guarantees: `fn` is called at most `maxAttempts` times, and at least once
|
|
157
|
+
* unless the signal was already aborted at entry, when it is not called at
|
|
158
|
+
* all. A thrown non-`Error` is wrapped, so what a caller catches is always an
|
|
159
|
+
* `Error`.
|
|
160
|
+
*/
|
|
161
|
+
export declare function withRetry<T>(fn: (request: SdkRequestOptions) => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
162
|
+
/**
|
|
163
|
+
* {@link withRetry} with this package's DynamoDB defaults.
|
|
164
|
+
*
|
|
165
|
+
* Accepts: `overrides` — merged over `maxAttempts:`
|
|
166
|
+
* {@link DEFAULT_RETRY_MAX_ATTEMPTS}, so an adapter's resolved policy wins.
|
|
167
|
+
*
|
|
168
|
+
* Returns: as {@link withRetry}.
|
|
169
|
+
*
|
|
170
|
+
* Throws: as {@link withRetry}.
|
|
171
|
+
*/
|
|
172
|
+
export declare function withDynamoDBRetry<T>(fn: (request: SdkRequestOptions) => Promise<T>, overrides?: Partial<RetryOptions>): Promise<T>;
|
|
173
|
+
/**
|
|
174
|
+
* Whether `error`, or any cause in its chain, is transient.
|
|
175
|
+
*
|
|
176
|
+
* Accepts: `error` — an `Error`; its `cause` chain is walked to
|
|
177
|
+
* {@link MAX_CAUSE_DEPTH}, and a cycle in it terminates the walk rather than
|
|
178
|
+
* looping. Anything else a `throw` can produce carries no node to walk and is
|
|
179
|
+
* not retryable. `retryableErrors` — the signal tokens to match; an empty list
|
|
180
|
+
* still admits the trait and status rules below.
|
|
181
|
+
*
|
|
182
|
+
* Returns: true when any of these holds, in this order —
|
|
183
|
+
* 1. the error is a transaction cancellation and **every** reason it carries is
|
|
184
|
+
* transient. This verdict is final either way: a permanent reason arrives
|
|
185
|
+
* with the same HTTP status as a transient one, so the later rules cannot be
|
|
186
|
+
* allowed to overturn it. A cancellation carrying no reasons is not retried.
|
|
187
|
+
* 2. any node carries the SDK's `$retryable` trait, or is a signing failure
|
|
188
|
+
* the SDK corrected its clock for or reports expired (`isCorrectedClockSkew`);
|
|
189
|
+
* 3. any node's HTTP status is in {@link TRANSIENT_HTTP_STATUSES} — which is
|
|
190
|
+
* what classifies a failure the SDK could not map to a modeled exception,
|
|
191
|
+
* arriving as `name: 'Unknown'` with only a status;
|
|
192
|
+
* 4. any node's `name`, `code`, `errno` or `syscall` equals a token in
|
|
193
|
+
* `retryableErrors`.
|
|
194
|
+
*
|
|
195
|
+
* The token match is exact, never substring: these fields are whole tokens, and
|
|
196
|
+
* a substring rule would let an unrelated name that merely contains one ride
|
|
197
|
+
* along.
|
|
198
|
+
*
|
|
199
|
+
* Throws: **nothing**, for any value a `throw` can produce — see
|
|
200
|
+
* {@link transientCancellation}, which the first rule reads through.
|
|
201
|
+
*/
|
|
202
|
+
export declare function isRetryableError(error: Error, retryableErrors: readonly string[]): boolean;
|
|
203
|
+
/**
|
|
204
|
+
* Caller-facing retry tunables for every DynamoDB call an adapter makes. The
|
|
205
|
+
* schedule is full-jitter exponential backoff: `baseDelayMs` doubling per
|
|
206
|
+
* attempt, capped at `maxDelayMs`, for `maxAttempts` attempts. The
|
|
207
|
+
* message-append path never goes below its own contention floor.
|
|
208
|
+
*/
|
|
209
|
+
export interface RetryPolicy {
|
|
210
|
+
/** Attempts per call before `RETRY_EXHAUSTED` (default 5). */
|
|
211
|
+
maxAttempts?: number;
|
|
212
|
+
/** First backoff delay in milliseconds (default 100). */
|
|
213
|
+
baseDelayMs?: number;
|
|
214
|
+
/**
|
|
215
|
+
* Cap on a single backoff delay in milliseconds (default 5000, or
|
|
216
|
+
* `baseDelayMs` when that is given above it).
|
|
217
|
+
*/
|
|
218
|
+
maxDelayMs?: number;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Resolve an adapter's retry policy once, at construction.
|
|
222
|
+
*
|
|
223
|
+
* Accepts: `policy` — the caller's, already validated, or nothing. `logger` —
|
|
224
|
+
* the adapter's resolved logger.
|
|
225
|
+
*
|
|
226
|
+
* Returns: the options every DynamoDB call of that adapter uses, with each
|
|
227
|
+
* field defaulted and the logger attached, so every retry is visible at `debug`
|
|
228
|
+
* (the attempt, the delay about to be slept, the error's name) instead of only
|
|
229
|
+
* surfacing once the budget is exhausted.
|
|
230
|
+
*
|
|
231
|
+
* Accepts: `attemptFloor` — the lowest attempt count this adapter will actually
|
|
232
|
+
* use, when it raises a caller's below its own. The budget is warned about at
|
|
233
|
+
* that number rather than at the caller's, because it is the one the writes
|
|
234
|
+
* will really spend; an adapter that honours the caller's count passes none.
|
|
235
|
+
*
|
|
236
|
+
* Throws: nothing; the policy was validated where it was given. A policy whose
|
|
237
|
+
* nominal budget outlives {@link MAX_WRITE_LIFETIME_MS} is warned about rather
|
|
238
|
+
* than refused, once per adapter constructed — three adapters built from one
|
|
239
|
+
* long policy each say so for themselves — see
|
|
240
|
+
* {@link warnIfOutlivesWriteLifetime}. The defaults are far inside it and say
|
|
241
|
+
* nothing.
|
|
242
|
+
*/
|
|
243
|
+
export declare function resolveRetryPolicy(policy: RetryPolicy | undefined, logger: Logger, attemptFloor?: number): RetryOptions;
|
|
244
|
+
/**
|
|
245
|
+
* The context's retry options plus a per-call cancellation signal.
|
|
246
|
+
*
|
|
247
|
+
* Accepts: `context.retry` — the adapter's resolved policy. `signal` — the
|
|
248
|
+
* caller's, when the call takes one.
|
|
249
|
+
*
|
|
250
|
+
* Returns: the adapter's options untouched when there is no signal — the same
|
|
251
|
+
* object, so no per-call allocation on the common path — and a copy carrying it
|
|
252
|
+
* when there is.
|
|
253
|
+
*
|
|
254
|
+
* Throws: nothing.
|
|
255
|
+
*/
|
|
256
|
+
export declare function retryFor(context: {
|
|
257
|
+
retry?: RetryOptions;
|
|
258
|
+
}, signal?: AbortSignal): RetryOptions | undefined;
|
|
259
|
+
/**
|
|
260
|
+
* Wait `ms` milliseconds, cancellable.
|
|
261
|
+
*
|
|
262
|
+
* Accepts: `ms` — the delay. `signal` — omitted waits uninterruptibly; already
|
|
263
|
+
* aborted rejects before any timer is set; aborting while pending rejects at
|
|
264
|
+
* that moment and clears the timer.
|
|
265
|
+
*
|
|
266
|
+
* Returns: a promise resolving when the delay elapses.
|
|
267
|
+
*
|
|
268
|
+
* Throws: an `ABORTED` error however the signal was aborted —
|
|
269
|
+
* with a `DOMException`, a string or a custom reason (see
|
|
270
|
+
* {@link abortErrorFrom}).
|
|
271
|
+
*
|
|
272
|
+
* Guarantees: exactly one of resolve and reject runs, and neither the timer nor
|
|
273
|
+
* the abort listener outlives the call. The listener is attached before the
|
|
274
|
+
* timer is armed, so a signal whose `addEventListener` throws rejects the wait
|
|
275
|
+
* with nothing left behind — armed first, the timer outlived that rejection
|
|
276
|
+
* and later called `removeEventListener` outside any promise. A listener that
|
|
277
|
+
* runs while it is being attached settles the wait before any timer exists.
|
|
278
|
+
*/
|
|
279
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
280
|
+
/**
|
|
281
|
+
* The next exponential-backoff delay.
|
|
282
|
+
*
|
|
283
|
+
* Accepts: `currentMs` — the delay just used; at least 1, since doubling 0
|
|
284
|
+
* never grows. `maxMs` — the ceiling, default {@link MAX_BACKOFF_DELAY_MS}.
|
|
285
|
+
*
|
|
286
|
+
* Returns: `min(currentMs * 2, maxMs)`.
|
|
287
|
+
*
|
|
288
|
+
* Throws: nothing.
|
|
289
|
+
*/
|
|
290
|
+
export declare function nextBackoffDelay(currentMs: number, maxMs?: number): number;
|
|
291
|
+
/**
|
|
292
|
+
* AWS's full jitter over a backoff delay.
|
|
293
|
+
*
|
|
294
|
+
* Accepts: `delayMs` — the unjittered delay. `rng` — a seam returning
|
|
295
|
+
* `[0, 1)`, default `Math.random`; tests inject a fixed one.
|
|
296
|
+
*
|
|
297
|
+
* Returns: a value in `[0, delayMs)`, so two clients retrying the same failure
|
|
298
|
+
* do not retry together
|
|
299
|
+
* (https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/).
|
|
300
|
+
*
|
|
301
|
+
* Throws: nothing.
|
|
302
|
+
*/
|
|
303
|
+
export declare function fullJitter(delayMs: number, rng?: () => number): number;
|
|
304
|
+
/**
|
|
305
|
+
* Whether `error` is a transient S3 failure worth retrying.
|
|
306
|
+
*
|
|
307
|
+
* Accepts: `error` — any error, including one carrying no name or code, and
|
|
308
|
+
* equally anything else a `throw` can produce.
|
|
309
|
+
*
|
|
310
|
+
* Returns: {@link isRetryableError} over the shared default tokens, which hold
|
|
311
|
+
* S3's own transient names (`SlowDown`, `InternalError`,
|
|
312
|
+
* `ConditionalRequestConflict`) alongside DynamoDB's — one list, so the two
|
|
313
|
+
* services cannot drift apart on what is transient.
|
|
314
|
+
*
|
|
315
|
+
* Throws: **nothing**, for any value; {@link isRetryableError} is total.
|
|
316
|
+
*/
|
|
317
|
+
export declare function isTransientS3Error(error: Error): boolean;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_WRITE_LIFETIME_MS = exports.TOKEN_IDEMPOTENCY_WINDOW_MS = exports.DEFAULT_RETRY_MAX_ATTEMPTS = exports.MAX_BACKOFF_DELAY_MS = exports.INITIAL_BACKOFF_DELAY_MS = void 0;
|
|
4
|
+
exports.backoffCapMs = backoffCapMs;
|
|
5
|
+
exports.withRetry = withRetry;
|
|
6
|
+
exports.withDynamoDBRetry = withDynamoDBRetry;
|
|
7
|
+
exports.isRetryableError = isRetryableError;
|
|
8
|
+
exports.resolveRetryPolicy = resolveRetryPolicy;
|
|
9
|
+
exports.retryFor = retryFor;
|
|
10
|
+
exports.sleep = sleep;
|
|
11
|
+
exports.nextBackoffDelay = nextBackoffDelay;
|
|
12
|
+
exports.fullJitter = fullJitter;
|
|
13
|
+
exports.isTransientS3Error = isTransientS3Error;
|
|
14
|
+
const clock_js_1 = require("../clock.js");
|
|
15
|
+
const base_error_js_1 = require("../errors/base-error.js");
|
|
16
|
+
const classify_js_1 = require("../errors/classify.js");
|
|
17
|
+
const errors_js_1 = require("../errors/errors.js");
|
|
18
|
+
const secret_patterns_js_1 = require("../logging/secret-patterns.js");
|
|
19
|
+
const truncate_js_1 = require("../logging/truncate.js");
|
|
20
|
+
const abort_js_1 = require("./abort.js");
|
|
21
|
+
const cancellation_js_1 = require("./cancellation.js");
|
|
22
|
+
exports.INITIAL_BACKOFF_DELAY_MS = 100;
|
|
23
|
+
exports.MAX_BACKOFF_DELAY_MS = 5000;
|
|
24
|
+
exports.DEFAULT_RETRY_MAX_ATTEMPTS = 5;
|
|
25
|
+
exports.TOKEN_IDEMPOTENCY_WINDOW_MS = 600_000;
|
|
26
|
+
exports.MAX_WRITE_LIFETIME_MS = 300_000;
|
|
27
|
+
function crossesDeadline(deadlineAt, delayMs) {
|
|
28
|
+
return deadlineAt !== undefined && (0, clock_js_1.nowMs)() + delayMs >= deadlineAt;
|
|
29
|
+
}
|
|
30
|
+
function assertNotAborted(signal) {
|
|
31
|
+
if (signal?.aborted)
|
|
32
|
+
throw (0, abort_js_1.abortErrorFrom)(signal);
|
|
33
|
+
}
|
|
34
|
+
function delayForAttempt(attempt, base, max, rng) {
|
|
35
|
+
const exponential = base * 2 ** (attempt - 1);
|
|
36
|
+
return fullJitter(Math.min(exponential, max), rng);
|
|
37
|
+
}
|
|
38
|
+
function backoffCapMs(baseDelayMs, maxDelayMs) {
|
|
39
|
+
return maxDelayMs ?? Math.max(exports.MAX_BACKOFF_DELAY_MS, baseDelayMs);
|
|
40
|
+
}
|
|
41
|
+
function resolveRetryOptions(options) {
|
|
42
|
+
const baseDelayMs = options.baseDelayMs ?? exports.INITIAL_BACKOFF_DELAY_MS;
|
|
43
|
+
return {
|
|
44
|
+
maxAttempts: options.maxAttempts ?? exports.DEFAULT_RETRY_MAX_ATTEMPTS,
|
|
45
|
+
baseDelayMs,
|
|
46
|
+
maxDelayMs: backoffCapMs(baseDelayMs, options.maxDelayMs),
|
|
47
|
+
isRetryable: options.isRetryable ??
|
|
48
|
+
((error) => isRetryableError(error, options.retryableErrors ?? classify_js_1.DEFAULT_RETRYABLE_ERRORS)),
|
|
49
|
+
rng: options.rng ?? Math.random,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function withRetry(fn, options = {}) {
|
|
53
|
+
const { maxAttempts, baseDelayMs, maxDelayMs, isRetryable, rng } = resolveRetryOptions(options);
|
|
54
|
+
assertNotAborted(options.signal);
|
|
55
|
+
const request = { abortSignal: options.signal };
|
|
56
|
+
let lastError = new Error('Retry failed without error');
|
|
57
|
+
let attempts = 0;
|
|
58
|
+
let mayStillLand = false;
|
|
59
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
60
|
+
attempts = attempt;
|
|
61
|
+
try {
|
|
62
|
+
return await fn(request);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
assertNotAborted(options.signal);
|
|
66
|
+
lastError = (0, base_error_js_1.toError)(error);
|
|
67
|
+
if ((0, classify_js_1.mayStillBeInFlight)(lastError))
|
|
68
|
+
mayStillLand = true;
|
|
69
|
+
if (!isRetryable(lastError))
|
|
70
|
+
throw mayStillLand ? (0, errors_js_1.markMayStillLand)(lastError) : lastError;
|
|
71
|
+
if (attempt === maxAttempts)
|
|
72
|
+
break;
|
|
73
|
+
const delayMs = delayForAttempt(attempt, baseDelayMs, maxDelayMs, rng);
|
|
74
|
+
if (crossesDeadline(options.deadlineAt, delayMs))
|
|
75
|
+
break;
|
|
76
|
+
options.onRetry?.({ attempt, delayMs, error: lastError });
|
|
77
|
+
await sleep(delayMs, options.signal);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
throw (0, errors_js_1.retryExhaustedError)(`Operation failed after ${attempts} attempts: ${(0, secret_patterns_js_1.redactedMessage)(lastError)}`, attempts, lastError, mayStillLand);
|
|
81
|
+
}
|
|
82
|
+
async function withDynamoDBRetry(fn, overrides) {
|
|
83
|
+
return withRetry(fn, { maxAttempts: exports.DEFAULT_RETRY_MAX_ATTEMPTS, ...overrides });
|
|
84
|
+
}
|
|
85
|
+
function recordNode(fields, evidence) {
|
|
86
|
+
for (const value of [fields.name, fields.code, fields.errno, fields.syscall]) {
|
|
87
|
+
if (typeof value === 'string')
|
|
88
|
+
evidence.signals.push(value);
|
|
89
|
+
}
|
|
90
|
+
if (typeof fields.$metadata?.httpStatusCode === 'number') {
|
|
91
|
+
evidence.statuses.push(fields.$metadata.httpStatusCode);
|
|
92
|
+
}
|
|
93
|
+
const byTrait = fields.$retryable !== undefined && fields.$retryable !== null;
|
|
94
|
+
if (byTrait || (0, classify_js_1.isCorrectedClockSkew)(fields))
|
|
95
|
+
evidence.retryableByTrait = true;
|
|
96
|
+
}
|
|
97
|
+
function collectEvidence(error) {
|
|
98
|
+
const seen = new WeakSet();
|
|
99
|
+
const evidence = { signals: [], statuses: [], retryableByTrait: false };
|
|
100
|
+
const walk = (node, depth) => {
|
|
101
|
+
if (depth > classify_js_1.MAX_CAUSE_DEPTH || node === null || typeof node !== 'object' || seen.has(node)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
seen.add(node);
|
|
105
|
+
const fields = node;
|
|
106
|
+
recordNode(fields, evidence);
|
|
107
|
+
if (fields.cause)
|
|
108
|
+
walk(fields.cause, depth + 1);
|
|
109
|
+
};
|
|
110
|
+
walk(error, 0);
|
|
111
|
+
return evidence;
|
|
112
|
+
}
|
|
113
|
+
function isRetryableError(error, retryableErrors) {
|
|
114
|
+
const cancellation = (0, cancellation_js_1.transientCancellation)(error);
|
|
115
|
+
if (cancellation !== undefined)
|
|
116
|
+
return cancellation;
|
|
117
|
+
const evidence = collectEvidence(error);
|
|
118
|
+
if (evidence.retryableByTrait)
|
|
119
|
+
return true;
|
|
120
|
+
if (evidence.statuses.some((status) => classify_js_1.TRANSIENT_HTTP_STATUSES.includes(status)))
|
|
121
|
+
return true;
|
|
122
|
+
return evidence.signals.some((signal) => retryableErrors.includes(signal));
|
|
123
|
+
}
|
|
124
|
+
function nominalBudgetMs(policy) {
|
|
125
|
+
let total = 0;
|
|
126
|
+
for (let sleep = 1; sleep < policy.maxAttempts; sleep++) {
|
|
127
|
+
total += Math.min(policy.baseDelayMs * 2 ** (sleep - 1), policy.maxDelayMs);
|
|
128
|
+
}
|
|
129
|
+
return total;
|
|
130
|
+
}
|
|
131
|
+
function warnIfOutlivesWriteLifetime(policy, logger) {
|
|
132
|
+
const budgetMs = nominalBudgetMs(policy);
|
|
133
|
+
if (budgetMs <= exports.MAX_WRITE_LIFETIME_MS)
|
|
134
|
+
return;
|
|
135
|
+
logger.warn('retry policy outlives the write lifetime; the budget will be cut short', {
|
|
136
|
+
budgetMs,
|
|
137
|
+
maxWriteLifetimeMs: exports.MAX_WRITE_LIFETIME_MS,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function resolveRetryPolicy(policy, logger, attemptFloor = 0) {
|
|
141
|
+
const baseDelayMs = policy?.baseDelayMs ?? exports.INITIAL_BACKOFF_DELAY_MS;
|
|
142
|
+
const resolved = {
|
|
143
|
+
maxAttempts: policy?.maxAttempts ?? exports.DEFAULT_RETRY_MAX_ATTEMPTS,
|
|
144
|
+
baseDelayMs,
|
|
145
|
+
maxDelayMs: backoffCapMs(baseDelayMs, policy?.maxDelayMs),
|
|
146
|
+
};
|
|
147
|
+
warnIfOutlivesWriteLifetime({ ...resolved, maxAttempts: Math.max(resolved.maxAttempts, attemptFloor) }, logger);
|
|
148
|
+
return {
|
|
149
|
+
...resolved,
|
|
150
|
+
onRetry: ({ attempt, delayMs, error }) => logger.debug('retrying after a transient error', {
|
|
151
|
+
attempt,
|
|
152
|
+
delayMs,
|
|
153
|
+
error: (0, truncate_js_1.truncateForLog)((0, base_error_js_1.failureLabel)(error)),
|
|
154
|
+
}),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function retryFor(context, signal) {
|
|
158
|
+
return signal === undefined ? context.retry : { ...context.retry, signal };
|
|
159
|
+
}
|
|
160
|
+
function sleep(ms, signal) {
|
|
161
|
+
if (signal?.aborted) {
|
|
162
|
+
return Promise.reject((0, abort_js_1.abortErrorFrom)(signal));
|
|
163
|
+
}
|
|
164
|
+
return new Promise((resolve, reject) => {
|
|
165
|
+
const wait = { settled: false };
|
|
166
|
+
const onAbort = () => {
|
|
167
|
+
if (wait.settled)
|
|
168
|
+
return;
|
|
169
|
+
wait.settled = true;
|
|
170
|
+
clearTimeout(wait.timer);
|
|
171
|
+
reject((0, abort_js_1.abortErrorFrom)(signal));
|
|
172
|
+
};
|
|
173
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
174
|
+
if (wait.settled)
|
|
175
|
+
return;
|
|
176
|
+
wait.timer = setTimeout(() => {
|
|
177
|
+
if (wait.settled)
|
|
178
|
+
return;
|
|
179
|
+
wait.settled = true;
|
|
180
|
+
signal?.removeEventListener('abort', onAbort);
|
|
181
|
+
resolve();
|
|
182
|
+
}, ms);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function nextBackoffDelay(currentMs, maxMs = exports.MAX_BACKOFF_DELAY_MS) {
|
|
186
|
+
return Math.min(currentMs * 2, maxMs);
|
|
187
|
+
}
|
|
188
|
+
function fullJitter(delayMs, rng = Math.random) {
|
|
189
|
+
return rng() * delayMs;
|
|
190
|
+
}
|
|
191
|
+
function isTransientS3Error(error) {
|
|
192
|
+
return isRetryableError(error, classify_js_1.DEFAULT_RETRYABLE_ERRORS);
|
|
193
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides how DynamoDB measures a row against its 400 KB item limit.
|
|
3
|
+
*
|
|
4
|
+
* DynamoDB does not measure a row by its JSON length: every attribute name
|
|
5
|
+
* counts, a number costs a byte per two significant digits and one more,
|
|
6
|
+
* binary counts its raw bytes, and a list or a map adds three bytes and one
|
|
7
|
+
* per element. A write that would cross the limit is refused here, by those
|
|
8
|
+
* rules, before anything is sent, so the caller learns which input made the
|
|
9
|
+
* row too large instead of reading an `AWS_REJECTED` error after the work that
|
|
10
|
+
* built the row — an embedding, an upload — was already done.
|
|
11
|
+
*/
|
|
12
|
+
import type { AttributeMap } from './client.js';
|
|
13
|
+
/** DynamoDB's cap on one item, 400 KB, in the binary kilobytes its documentation counts in. */
|
|
14
|
+
export declare const MAX_ROW_BYTES: number;
|
|
15
|
+
/**
|
|
16
|
+
* The size DynamoDB counts a row at against its item limit.
|
|
17
|
+
*
|
|
18
|
+
* Accepts: `row` — a row this package is about to write, as the document
|
|
19
|
+
* client would marshall it: strings, numbers, booleans, `null`, binary,
|
|
20
|
+
* arrays and plain objects, nested to any depth. An `undefined` attribute is
|
|
21
|
+
* counted as one byte although the client drops it, which only errs high.
|
|
22
|
+
*
|
|
23
|
+
* Returns: the sum, over every attribute, of its name's UTF-8 bytes and its
|
|
24
|
+
* value's size: a string's UTF-8 bytes; a number's significant digits halved
|
|
25
|
+
* and rounded up, plus one; binary's raw bytes; one byte for a boolean or a
|
|
26
|
+
* null; and for a list or a map three bytes, plus each element's size and one
|
|
27
|
+
* byte per element, a map's element also paying its name. The rules are
|
|
28
|
+
* AWS's own
|
|
29
|
+
* (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/CapacityUnitCalculations.html).
|
|
30
|
+
*
|
|
31
|
+
* Throws: nothing.
|
|
32
|
+
*/
|
|
33
|
+
export declare function rowSizeBytes(row: AttributeMap): number;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_ROW_BYTES = void 0;
|
|
4
|
+
exports.rowSizeBytes = rowSizeBytes;
|
|
5
|
+
exports.MAX_ROW_BYTES = 400 * 1024;
|
|
6
|
+
function nameBytes(name) {
|
|
7
|
+
return Buffer.byteLength(name, 'utf8');
|
|
8
|
+
}
|
|
9
|
+
function significantDigits(value) {
|
|
10
|
+
const mantissa = String(Math.abs(value)).split(/e/i)[0].replace('.', '');
|
|
11
|
+
const trimmed = mantissa.replace(/^0+/, '').replace(/0+$/, '');
|
|
12
|
+
return Math.max(trimmed.length, 1);
|
|
13
|
+
}
|
|
14
|
+
function valueBytes(value) {
|
|
15
|
+
if (typeof value === 'string')
|
|
16
|
+
return Buffer.byteLength(value, 'utf8');
|
|
17
|
+
if (typeof value === 'number')
|
|
18
|
+
return Math.ceil(significantDigits(value) / 2) + 1;
|
|
19
|
+
if (typeof value === 'boolean' || value === null || value === undefined)
|
|
20
|
+
return 1;
|
|
21
|
+
if (ArrayBuffer.isView(value))
|
|
22
|
+
return value.byteLength;
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
return value.reduce((sum, element) => sum + valueBytes(element) + 1, 3);
|
|
25
|
+
}
|
|
26
|
+
return Object.entries(value).reduce((sum, [name, element]) => sum + nameBytes(name) + valueBytes(element) + 1, 3);
|
|
27
|
+
}
|
|
28
|
+
function rowSizeBytes(row) {
|
|
29
|
+
return Object.entries(row).reduce((sum, [name, value]) => sum + nameBytes(name) + valueBytes(value), 0);
|
|
30
|
+
}
|