@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,7 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides S3 behind one object.
|
|
3
|
+
*
|
|
4
|
+
* The client is built lazily from the optional peer. An upload writes only
|
|
5
|
+
* while its key is free, so a retried upload never replaces another write's
|
|
6
|
+
* object, and carries its row's key as metadata. A download refuses an object
|
|
7
|
+
* over the configured cap before and while reading it. A delete goes out in
|
|
8
|
+
* batches of a thousand, and a best-effort release retries transient failures,
|
|
9
|
+
* never deletes outside the row's own path, and logs rather than throws.
|
|
10
|
+
*/
|
|
11
|
+
import type { S3Client } from '@aws-sdk/client-s3';
|
|
12
|
+
import { DynamoDBLangGraphError } from '../../errors/base-error';
|
|
13
|
+
import { type Logger } from '../../logging/logger';
|
|
1
14
|
import { S3OffloadConfig } from './config';
|
|
15
|
+
/** Default payload size that triggers S3 offload (350 KB; 50 KB under the DDB 400 KB cap). */
|
|
16
|
+
export declare const DEFAULT_S3_THRESHOLD_BYTES: number;
|
|
17
|
+
/** Default S3 server-side encryption algorithm. */
|
|
18
|
+
export declare const DEFAULT_S3_SSE = "AES256";
|
|
19
|
+
/**
|
|
20
|
+
* Default cap on an offloaded object buffered from S3 (50 MiB), checked against
|
|
21
|
+
* `ContentLength` before the body is read and enforced while streaming when
|
|
22
|
+
* the length is unknown. Together with
|
|
23
|
+
* `DEFAULT_MAX_DECOMPRESSED_BYTES` (`src/shared/codec/compression.ts`)
|
|
24
|
+
* it bounds the memory any single payload can claim.
|
|
25
|
+
*/
|
|
26
|
+
export declare const DEFAULT_MAX_S3_DOWNLOAD_BYTES: number;
|
|
27
|
+
/** S3 DeleteObjects maximum keys per request. */
|
|
28
|
+
export declare const S3_DELETE_BATCH_MAX = 1000;
|
|
2
29
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
30
|
+
* Owns the S3 configuration and the lazily-built client; every method is a
|
|
31
|
+
* small delegation to this module's own functions, keyed to that config.
|
|
5
32
|
*/
|
|
6
33
|
export declare class S3Offloader {
|
|
7
34
|
private clientPromise;
|
|
@@ -12,29 +39,377 @@ export declare class S3Offloader {
|
|
|
12
39
|
private readonly thresholdBytes;
|
|
13
40
|
private readonly sse;
|
|
14
41
|
private readonly sseKmsKeyId?;
|
|
42
|
+
private readonly maxDownloadBytes;
|
|
15
43
|
private readonly config;
|
|
44
|
+
/**
|
|
45
|
+
* Accepts: `config` — already validated by the adapter that builds this, with
|
|
46
|
+
* its key prefix resolved to the adapter's own path.
|
|
47
|
+
*
|
|
48
|
+
* Returns: an offloader whose S3 client is built lazily, on the first
|
|
49
|
+
* operation that needs one.
|
|
50
|
+
*
|
|
51
|
+
* Throws: nothing. A missing `@aws-sdk/client-s3` is not raised here: the
|
|
52
|
+
* import is warmed so the failure surfaces, typed, on the first S3 operation
|
|
53
|
+
* rather than on the first oversize payload days later.
|
|
54
|
+
*/
|
|
16
55
|
constructor(config: S3OffloadConfig);
|
|
17
56
|
private getClient;
|
|
18
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* Whether `data` is large enough to warrant S3 offload.
|
|
59
|
+
*
|
|
60
|
+
* Accepts: the encoded payload, after compression — what would actually be
|
|
61
|
+
* stored.
|
|
62
|
+
*
|
|
63
|
+
* Returns: whether it reaches `thresholdBytes`. The comparison is inclusive,
|
|
64
|
+
* so a payload exactly at the threshold offloads.
|
|
65
|
+
*
|
|
66
|
+
* Throws: nothing.
|
|
67
|
+
*/
|
|
19
68
|
shouldOffload(data: Uint8Array): boolean;
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Build the S3 key of the object write `objectId` uploads for the row `parts`
|
|
71
|
+
* identify.
|
|
72
|
+
*
|
|
73
|
+
* Accepts: `parts` — at least one; the row's identity. `objectId` — the
|
|
74
|
+
* uploading write's id, appended as it is: key-safe, with no `/` (see
|
|
75
|
+
* {@link buildS3Key}).
|
|
76
|
+
*
|
|
77
|
+
* Returns: the key, under this offloader's prefix.
|
|
78
|
+
*
|
|
79
|
+
* Throws: `VALIDATION` naming `s3Key` for empty `parts` or a key over
|
|
80
|
+
* S3's 1024-byte cap.
|
|
81
|
+
*/
|
|
82
|
+
buildKey(parts: readonly string[], objectId: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* The configured key prefix.
|
|
85
|
+
*
|
|
86
|
+
* Accepts: nothing.
|
|
87
|
+
*
|
|
88
|
+
* Returns: the prefix every key this offloader builds starts with, which is
|
|
89
|
+
* what a lifecycle rule is scoped to.
|
|
90
|
+
*
|
|
91
|
+
* Throws: nothing.
|
|
92
|
+
*/
|
|
23
93
|
getKeyPrefix(): string;
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Whether `key` lies under this offloader's prefix and the `scope` parts'
|
|
96
|
+
* path.
|
|
97
|
+
*
|
|
98
|
+
* Accepts: `key` — any key, including one read off a row. `scope` — the
|
|
99
|
+
* identity of the row that claims it.
|
|
100
|
+
*
|
|
101
|
+
* Returns: whether the row may address that object.
|
|
102
|
+
*
|
|
103
|
+
* Throws: nothing — this is the question form; {@link assertOwnedKey} is the
|
|
104
|
+
* refusing form.
|
|
105
|
+
*/
|
|
106
|
+
ownsKey(key: string, scope: readonly string[]): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Refuse a row-sourced key outside the row's own path.
|
|
109
|
+
*
|
|
110
|
+
* Accepts: as {@link ownsKey}.
|
|
111
|
+
*
|
|
112
|
+
* Returns: nothing: `key` is kept under its declared type, and this checks
|
|
113
|
+
* it against `scope`.
|
|
114
|
+
*
|
|
115
|
+
* Throws: `VALIDATION`. Every download of a key taken from a row goes
|
|
116
|
+
* through here, so a tampered or foreign row cannot make a reader fetch an
|
|
117
|
+
* object belonging to another row.
|
|
118
|
+
*/
|
|
119
|
+
assertOwnedKey(key: string, scope: readonly string[]): void;
|
|
120
|
+
/**
|
|
121
|
+
* Upload `data` under `key`, writing only while the key is free.
|
|
122
|
+
*
|
|
123
|
+
* Accepts: `key` — built by {@link buildKey} for the write uploading `data`,
|
|
124
|
+
* so no other write uploads to it. `row` — written to the object as the
|
|
125
|
+
* DynamoDB backlink, for an out-of-band sweeper. `signal` — cancels the
|
|
126
|
+
* request itself, not merely the wait before the next attempt.
|
|
127
|
+
*
|
|
128
|
+
* Returns: the key, whether this request stored the object or an earlier
|
|
129
|
+
* attempt of this upload did (see `uploadObject`); the caller's obligation is
|
|
130
|
+
* the same either way.
|
|
131
|
+
*
|
|
132
|
+
* Throws: `S3_OFFLOAD_FAILED` carrying the key; `ABORTED` when the signal
|
|
133
|
+
* fires, which is the caller's own stop rather than a failed offload.
|
|
134
|
+
*/
|
|
135
|
+
upload(key: string, data: Uint8Array, row: BacklinkRow, signal?: AbortSignal): Promise<string>;
|
|
136
|
+
/**
|
|
137
|
+
* Download the bytes stored under `key`.
|
|
138
|
+
*
|
|
139
|
+
* Accepts: `key` — already checked against the reading row's scope.
|
|
140
|
+
* `signal` — cancels the request, including a body already streaming: the
|
|
141
|
+
* handler's abort listener outlives the response headers and destroys the
|
|
142
|
+
* socket, which is the one bound a stalled transfer has that the request
|
|
143
|
+
* timeout provably does not give it.
|
|
144
|
+
*
|
|
145
|
+
* Returns: the object's bytes.
|
|
146
|
+
*
|
|
147
|
+
* Throws: `S3_OFFLOAD_FAILED` for an object over `maxDownloadBytes` — the cap
|
|
148
|
+
* is enforced on the declared length and again while reading, so a lying
|
|
149
|
+
* `Content-Length` does not get past it — and for a missing object or a
|
|
150
|
+
* transport failure; `ABORTED` when the signal fires.
|
|
151
|
+
*/
|
|
152
|
+
download(key: string, signal?: AbortSignal): Promise<Uint8Array>;
|
|
153
|
+
/**
|
|
154
|
+
* Delete `keys`.
|
|
155
|
+
*
|
|
156
|
+
* Accepts: any number of keys, including none.
|
|
157
|
+
*
|
|
158
|
+
* Returns: the keys S3 reported as failed, so the caller can log what leaked
|
|
159
|
+
* rather than assume it is gone.
|
|
160
|
+
*
|
|
161
|
+
* Throws: whatever the delete throws after its own retries; cleanup callers
|
|
162
|
+
* catch it, since a failed cleanup must not fail the operation it follows.
|
|
163
|
+
*/
|
|
29
164
|
deleteBatch(keys: string[]): Promise<string[]>;
|
|
30
|
-
/** Ensure a `${ttlDays}`-day expiration lifecycle rule exists for the prefix. */
|
|
31
|
-
ensureLifecycleRule(ttlDays: number): Promise<void>;
|
|
32
165
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
166
|
+
* Ensure a `${ttlDays}`-day expiration lifecycle rule exists for the prefix.
|
|
167
|
+
*
|
|
168
|
+
* Accepts: `ttlDays` — whole days, the only granularity S3 accepts.
|
|
169
|
+
* `logger` — the adapter's, for the bucket's versioning state, which is
|
|
170
|
+
* reported rather than enforced.
|
|
171
|
+
*
|
|
172
|
+
* Returns: nothing. Rules that are already correct are left alone, so this
|
|
173
|
+
* is safe to call on every deploy.
|
|
174
|
+
*
|
|
175
|
+
* Throws: `VALIDATION` naming `s3.keyPrefix` when a rule id this prefix
|
|
176
|
+
* would take is already held by a different prefix; whatever reading or
|
|
177
|
+
* writing the bucket's lifecycle configuration throws.
|
|
178
|
+
*/
|
|
179
|
+
ensureLifecycleRule(ttlDays: number, logger: Logger): Promise<void>;
|
|
180
|
+
/**
|
|
181
|
+
* Release the underlying S3 client.
|
|
182
|
+
*
|
|
183
|
+
* Accepts: nothing.
|
|
184
|
+
*
|
|
185
|
+
* Returns: nothing. Safe at any point in the client's lifecycle: called
|
|
186
|
+
* before construction starts it does nothing, called mid-construction it
|
|
187
|
+
* marks the offloader destroyed so the client is released the moment it
|
|
188
|
+
* resolves, and called after it releases it directly.
|
|
189
|
+
*
|
|
190
|
+
* Throws: whatever the SDK client's own `destroy` throws.
|
|
37
191
|
*/
|
|
38
192
|
destroy(): void;
|
|
39
193
|
}
|
|
40
|
-
|
|
194
|
+
/** Parameters for {@link uploadObject}. */
|
|
195
|
+
export interface UploadParams {
|
|
196
|
+
bucket: string;
|
|
197
|
+
key: string;
|
|
198
|
+
data: Uint8Array;
|
|
199
|
+
serverSideEncryption?: string;
|
|
200
|
+
sseKmsKeyId?: string;
|
|
201
|
+
/** User metadata stored on the object, used for the DynamoDB backlink. */
|
|
202
|
+
metadata?: Record<string, string>;
|
|
203
|
+
/** The caller's cancellation; absent, the upload cannot be interrupted. */
|
|
204
|
+
signal?: AbortSignal;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Upload `data` to S3 unless an object already exists under `key`, wrapping
|
|
208
|
+
* failures as `S3_OFFLOAD_FAILED`.
|
|
209
|
+
*
|
|
210
|
+
* The write is conditional (`If-None-Match: *`), which costs nothing extra: it
|
|
211
|
+
* needs only `s3:PutObject`, the permission this package already requires, and
|
|
212
|
+
* a retried request writes nothing new: it can never overwrite the object an
|
|
213
|
+
* earlier attempt stored. A `409 Conflict` — S3's answer when a delete lands
|
|
214
|
+
* between the check and the write — is classified as transient and retried
|
|
215
|
+
* like any other conflict.
|
|
216
|
+
*
|
|
217
|
+
* Accepts: `params.key` — the key of one write's upload of `params.data`,
|
|
218
|
+
* written by no other write. `params.metadata` — the backlink, sent with every
|
|
219
|
+
* attempt; an object an earlier attempt stored keeps that attempt's metadata,
|
|
220
|
+
* which is the same. `params.signal` — cancels the request in flight, not only
|
|
221
|
+
* the wait before the next attempt.
|
|
222
|
+
*
|
|
223
|
+
* Returns: nothing, both when this request stored the object and when S3
|
|
224
|
+
* answered `412` because an earlier attempt of this upload already had. The
|
|
225
|
+
* two are not distinguished because the caller's obligation is identical: the
|
|
226
|
+
* bytes are at that key.
|
|
227
|
+
*
|
|
228
|
+
* Throws: `ABORTED` when the signal fires, unwrapped; `S3_OFFLOAD_FAILED`
|
|
229
|
+
* carrying the key and the underlying error, after three attempts on a
|
|
230
|
+
* transient failure. Its message quotes the SDK's, with credential shapes
|
|
231
|
+
* redacted — a signing failure names the key it signed with, and this message
|
|
232
|
+
* reaches `err.message` on a public error.
|
|
233
|
+
*
|
|
234
|
+
* Guarantees: a cancelled upload leaves at most the object it was writing, at
|
|
235
|
+
* a key ending in this write's own object id, which no row names because the
|
|
236
|
+
* row that would have named it is written afterwards. The conditional write
|
|
237
|
+
* means it can never have replaced anything. It is an orphan of exactly the
|
|
238
|
+
* kind `ensureS3LifecycleRule` sweeps, never a corrupted or half-written
|
|
239
|
+
* object: S3 stores a single `PutObject` whole or not at all.
|
|
240
|
+
*/
|
|
241
|
+
export declare function uploadObject(client: S3Client, params: UploadParams): Promise<void>;
|
|
242
|
+
/** One object to read: its bucket, its key, and the most bytes it may hold. */
|
|
243
|
+
export interface StoredObject {
|
|
244
|
+
readonly bucket: string;
|
|
245
|
+
readonly key: string;
|
|
246
|
+
readonly maxBytes: number;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* The bytes stored under `object.key`.
|
|
250
|
+
*
|
|
251
|
+
* Accepts: `object.maxBytes` — the largest object this call will buffer.
|
|
252
|
+
* `signal` — cancels the request, and with it a body already streaming.
|
|
253
|
+
*
|
|
254
|
+
* Returns: the object's bytes.
|
|
255
|
+
*
|
|
256
|
+
* Throws: `ABORTED` when the signal fires, unwrapped; `S3_OFFLOAD_FAILED`
|
|
257
|
+
* naming the key — for an object over `maxBytes`, for a response with no body,
|
|
258
|
+
* and for any SDK failure that survives the retries. Its message quotes the
|
|
259
|
+
* underlying one with credential shapes redacted; the SDK error is kept as
|
|
260
|
+
* `cause`, so `NoSuchKey` stays distinguishable
|
|
261
|
+
* ({@link isMissingObjectError}).
|
|
262
|
+
*
|
|
263
|
+
* Guarantees: an object over the cap is refused from its declared
|
|
264
|
+
* `ContentLength` before the body is touched, and while streaming when the
|
|
265
|
+
* length is absent, so a replaced or hostile object cannot exhaust memory.
|
|
266
|
+
* Transient failures are retried by this package alone — the client is built
|
|
267
|
+
* with `maxAttempts: 1`.
|
|
268
|
+
*
|
|
269
|
+
* The body is read *inside* the retried attempt, so the signal covers the
|
|
270
|
+
* whole transfer rather than only the round trip to the headers. A signal that
|
|
271
|
+
* fires mid-body destroys the socket, and the stream rejects with a transport
|
|
272
|
+
* error that every classifier here reads as transient; it never reaches that
|
|
273
|
+
* classification, because the signal is read first. A cancelled download
|
|
274
|
+
* leaves nothing behind at all — no local file, no partial object, and the
|
|
275
|
+
* chunks already buffered are dropped with the call.
|
|
276
|
+
*/
|
|
277
|
+
export declare function downloadObject(client: S3Client, object: StoredObject, signal?: AbortSignal): Promise<Uint8Array>;
|
|
278
|
+
/** The part of an S3 `GetObject` body this module relies on. */
|
|
279
|
+
export interface S3Body {
|
|
280
|
+
transformToByteArray(): Promise<Uint8Array>;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* The typed error for an object over the download cap.
|
|
284
|
+
*
|
|
285
|
+
* Accepts: `bytes` — what the object declared or what had been read when the
|
|
286
|
+
* cap was passed; the message says which is not distinguished, because either
|
|
287
|
+
* way the download stops.
|
|
288
|
+
*
|
|
289
|
+
* Returns: the error, coded `S3_OFFLOAD_FAILED` and carrying the key. The
|
|
290
|
+
* message names the key bounded by {@link truncateForLog}, since it came off
|
|
291
|
+
* a row; `context.key` carries it whole, because that is the field a caller
|
|
292
|
+
* reads and it is one value per failed download rather than one per row.
|
|
293
|
+
*
|
|
294
|
+
* Throws: nothing — it builds the error, the caller throws it.
|
|
295
|
+
*/
|
|
296
|
+
export declare function oversizedObjectError(key: string, bytes: number, maxBytes: number): DynamoDBLangGraphError;
|
|
297
|
+
/**
|
|
298
|
+
* The bytes of an S3 body, refused once they pass `maxBytes`.
|
|
299
|
+
*
|
|
300
|
+
* Accepts: `body` — a streaming body (Node's `IncomingMessage`, which the SDK
|
|
301
|
+
* returns) is consumed chunk by chunk; a body offering only
|
|
302
|
+
* `transformToByteArray()` is read whole and then checked. `key` — named in the
|
|
303
|
+
* error. `maxBytes` — the cap; `0` admits only an empty body.
|
|
304
|
+
*
|
|
305
|
+
* Returns: the buffered bytes.
|
|
306
|
+
*
|
|
307
|
+
* Throws: `S3_OFFLOAD_FAILED` naming the key once the total passes `maxBytes`.
|
|
308
|
+
* A streaming body is destroyed at that point, so the rest is never fetched.
|
|
309
|
+
*
|
|
310
|
+
* Guarantees: for a streaming body, peak memory is `maxBytes` plus the one
|
|
311
|
+
* chunk that crossed it — the chunks already held never exceed the cap. For a
|
|
312
|
+
* body without a stream the SDK has already buffered it, so the check bounds
|
|
313
|
+
* what is *returned*, not what was read.
|
|
314
|
+
*/
|
|
315
|
+
export declare function readBodyBounded(body: S3Body, key: string, maxBytes: number): Promise<Uint8Array>;
|
|
316
|
+
/**
|
|
317
|
+
* Delete `keys` from `bucket`, in chunks of {@link S3_DELETE_BATCH_MAX} — the
|
|
318
|
+
* limit `DeleteObjects` accepts per request.
|
|
319
|
+
*
|
|
320
|
+
* Accepts: `keys` — any length, including empty, which issues no request.
|
|
321
|
+
*
|
|
322
|
+
* Returns: the keys S3 named in an error entry. A per-key failure is reported
|
|
323
|
+
* this way rather than thrown, so the caller (orphan cleanup) decides how
|
|
324
|
+
* loudly to react. An error entry carrying no `Key` cannot be attributed and is
|
|
325
|
+
* not reported.
|
|
326
|
+
*
|
|
327
|
+
* Throws: whatever the SDK rejects with — a request that never reached S3, or
|
|
328
|
+
* one refused whole (permissions, a missing bucket).
|
|
329
|
+
*/
|
|
330
|
+
export declare function deleteObjects(client: S3Client, bucket: string, keys: string[]): Promise<string[]>;
|
|
331
|
+
/** The DynamoDB key an offloaded object belongs to. */
|
|
332
|
+
export interface BacklinkRow {
|
|
333
|
+
pk: string;
|
|
334
|
+
sk: string;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* The S3 user metadata linking an object back to the DynamoDB row that points
|
|
338
|
+
* at it — the maintenance aid AWS names for this layout: "Store the primary key
|
|
339
|
+
* value of the item as Amazon S3 metadata of the object" (*Best practices for
|
|
340
|
+
* storing large items and attributes in DynamoDB*). Nothing in this package
|
|
341
|
+
* reads it; it lets an out-of-band sweeper ask DynamoDB whether an object's
|
|
342
|
+
* parent row still exists without parsing object keys.
|
|
343
|
+
*
|
|
344
|
+
* Both values are base64url-encoded. A `thread_id` or a store key may hold any
|
|
345
|
+
* well-formed UTF-16 text, while S3 metadata travels in HTTP headers and the
|
|
346
|
+
* User Guide asks for US-ASCII there; encoding unconditionally keeps every
|
|
347
|
+
* value header-safe and keeps the decoding rule single, which a conditional
|
|
348
|
+
* encoding would not.
|
|
349
|
+
*
|
|
350
|
+
* The pair fits S3's 2 KB metadata budget by construction, not by luck: the
|
|
351
|
+
* same identifiers are already base64url-encoded into the object key, which
|
|
352
|
+
* `buildS3Key` caps at 1024 bytes, so anything that produces a usable key
|
|
353
|
+
* leaves these values far below the budget. `offloader-backlink.test.ts` pins
|
|
354
|
+
* that.
|
|
355
|
+
*
|
|
356
|
+
* Accepts: `row` — the DynamoDB key of the row that will point at the object.
|
|
357
|
+
*
|
|
358
|
+
* Returns: the two metadata fields, both base64url.
|
|
359
|
+
*
|
|
360
|
+
* Throws: nothing.
|
|
361
|
+
*/
|
|
362
|
+
export declare function backlinkMetadata(row: BacklinkRow): Record<string, string>;
|
|
363
|
+
/**
|
|
364
|
+
* The total UTF-8 bytes `metadata` costs against S3's 2 KB user-metadata cap.
|
|
365
|
+
*
|
|
366
|
+
* Accepts: any metadata map. Names and values both count, which is how S3
|
|
367
|
+
* measures it.
|
|
368
|
+
*
|
|
369
|
+
* Returns: the byte total.
|
|
370
|
+
*
|
|
371
|
+
* Throws: nothing.
|
|
372
|
+
*/
|
|
373
|
+
export declare function metadataBytes(metadata: Record<string, string>): number;
|
|
374
|
+
/** What one release of orphaned objects needs. */
|
|
375
|
+
export interface OrphanRelease {
|
|
376
|
+
/** The keys to delete; an absent or empty one is skipped. */
|
|
377
|
+
readonly keys: ReadonlyArray<string | undefined>;
|
|
378
|
+
/** Names the operation in the log lines, e.g. `putWrites`. */
|
|
379
|
+
readonly operation: string;
|
|
380
|
+
readonly logger: Logger;
|
|
381
|
+
/** The row's own leading key parts, when the keys were read back from a row. */
|
|
382
|
+
readonly scope?: readonly string[];
|
|
383
|
+
readonly rng?: () => number;
|
|
384
|
+
readonly maxAttempts?: number;
|
|
385
|
+
readonly signal?: AbortSignal;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Best-effort delete of S3 objects orphaned by a failed DynamoDB write.
|
|
389
|
+
*
|
|
390
|
+
* Accepts: `release.keys` — may hold `undefined` and empty entries, which are
|
|
391
|
+
* dropped; nothing left means no request. `release.operation` — names the
|
|
392
|
+
* operation in every log line. `release.scope` — the row's own leading key
|
|
393
|
+
* parts when `keys` came from a row: a key outside that path is reported and
|
|
394
|
+
* never deleted. Own uploads pass no scope. `release.maxAttempts` — attempts
|
|
395
|
+
* on a transient failure, default 3. `release.signal` — aborts the wait
|
|
396
|
+
* between attempts.
|
|
397
|
+
*
|
|
398
|
+
* Returns: nothing.
|
|
399
|
+
*
|
|
400
|
+
* Throws: **nothing**, ever. This is the library's sole non-throwing path: a
|
|
401
|
+
* cleanup failure must not mask the write failure that caused it. Every
|
|
402
|
+
* outcome that is not a clean delete is logged at `warn`, carrying counts and
|
|
403
|
+
* the failing error's *name* — never its message, which can hold a credential
|
|
404
|
+
* fragment. A `logger` that throws is one more thing this absorbs (see
|
|
405
|
+
* `absorbLoggerFailure`): the promise covers the caller's own code too,
|
|
406
|
+
* or every call site's `catch` would hand its caller the wrong error. Every
|
|
407
|
+
* logger reaching here through an adapter is already contained at
|
|
408
|
+
* `resolveLogger`; the guard stays because this promise is written without a
|
|
409
|
+
* precondition, and a `logger` is an argument.
|
|
410
|
+
*
|
|
411
|
+
* Guarantees: an object outside the row's scope is never deleted. Leftovers
|
|
412
|
+
* have no automatic backstop — an S3 lifecycle rule sweeps them only if one was
|
|
413
|
+
* provisioned through `ensureS3LifecycleRule()`, which is opt-in.
|
|
414
|
+
*/
|
|
415
|
+
export declare function cleanUpS3Orphans(offloader: S3Offloader, release: OrphanRelease): Promise<void>;
|