@farukada/aws-langgraph-dynamodb-ts 0.9.0 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1720 -154
- package/dist/backfill/backfill.d.ts +168 -0
- package/dist/backfill/backfill.js +393 -0
- package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
- package/dist/checkpointer/actions/delete-thread.js +58 -21
- package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
- package/dist/checkpointer/actions/get-tuple.js +44 -10
- package/dist/checkpointer/actions/list.d.ts +46 -4
- package/dist/checkpointer/actions/list.js +121 -66
- package/dist/checkpointer/actions/put-writes.d.ts +41 -9
- package/dist/checkpointer/actions/put-writes.js +62 -77
- package/dist/checkpointer/actions/put.d.ts +83 -4
- package/dist/checkpointer/actions/put.js +177 -25
- package/dist/checkpointer/internal/delta-history.d.ts +112 -0
- package/dist/checkpointer/internal/delta-history.js +252 -0
- package/dist/checkpointer/internal/listing.d.ts +149 -0
- package/dist/checkpointer/internal/listing.js +245 -0
- package/dist/checkpointer/internal/parse.d.ts +262 -0
- package/dist/checkpointer/internal/parse.js +372 -0
- package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
- package/dist/checkpointer/internal/pending-writes.js +588 -0
- package/dist/checkpointer/internal/read.d.ts +130 -0
- package/dist/checkpointer/internal/read.js +264 -0
- package/dist/checkpointer/internal/rows.d.ts +571 -0
- package/dist/checkpointer/internal/rows.js +834 -0
- package/dist/checkpointer/internal/setup.d.ts +42 -19
- package/dist/checkpointer/internal/setup.js +65 -29
- package/dist/checkpointer/saver.d.ts +256 -16
- package/dist/checkpointer/saver.js +275 -29
- package/dist/checkpointer/types.d.ts +39 -39
- package/dist/checkpointer/types.js +10 -1
- package/dist/factory/factory.d.ts +134 -28
- package/dist/factory/factory.js +240 -21
- package/dist/factory/types.d.ts +76 -0
- package/dist/factory/types.js +10 -0
- package/dist/history/actions/add-messages.d.ts +31 -4
- package/dist/history/actions/add-messages.js +38 -58
- package/dist/history/actions/clear.d.ts +49 -6
- package/dist/history/actions/clear.js +66 -14
- package/dist/history/actions/get-messages.d.ts +54 -6
- package/dist/history/actions/get-messages.js +126 -43
- package/dist/history/actions/list-sessions.d.ts +52 -10
- package/dist/history/actions/list-sessions.js +139 -40
- package/dist/history/actions/reconcile-count.d.ts +42 -10
- package/dist/history/actions/reconcile-count.js +45 -45
- package/dist/history/chat-message-history.d.ts +220 -33
- package/dist/history/chat-message-history.js +240 -43
- package/dist/history/internal/append.d.ts +212 -0
- package/dist/history/internal/append.js +500 -0
- package/dist/history/internal/message-read.d.ts +84 -0
- package/dist/history/internal/message-read.js +204 -0
- package/dist/history/internal/parse.d.ts +153 -0
- package/dist/history/internal/parse.js +252 -0
- package/dist/history/internal/rows.d.ts +195 -0
- package/dist/history/internal/rows.js +250 -0
- package/dist/history/internal/session.d.ts +331 -0
- package/dist/history/internal/session.js +628 -0
- package/dist/history/internal/setup.d.ts +52 -17
- package/dist/history/internal/setup.js +92 -21
- package/dist/history/session-adapter.d.ts +102 -7
- package/dist/history/session-adapter.js +103 -9
- package/dist/history/types.d.ts +80 -29
- package/dist/history/types.js +10 -1
- package/dist/index.d.ts +42 -11
- package/dist/index.js +33 -12
- package/dist/shared/adapter.d.ts +135 -0
- package/dist/shared/adapter.js +143 -0
- package/dist/shared/clock.d.ts +51 -2
- package/dist/shared/clock.js +57 -2
- package/dist/shared/codec/codec.d.ts +288 -13
- package/dist/shared/codec/codec.js +416 -19
- package/dist/shared/codec/compression.d.ts +43 -7
- package/dist/shared/codec/compression.js +53 -13
- package/dist/shared/codec/json-serde.d.ts +76 -4
- package/dist/shared/codec/json-serde.js +181 -8
- package/dist/shared/codec/s3/client-types.d.ts +53 -0
- package/dist/shared/codec/s3/client-types.js +26 -0
- package/dist/shared/codec/s3/client.d.ts +43 -10
- package/dist/shared/codec/s3/client.js +82 -9
- package/dist/shared/codec/s3/config.d.ts +242 -11
- package/dist/shared/codec/s3/config.js +293 -11
- package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
- package/dist/shared/codec/s3/lifecycle.js +335 -27
- package/dist/shared/codec/s3/offloader.d.ts +393 -18
- package/dist/shared/codec/s3/offloader.js +595 -37
- package/dist/shared/concurrency.d.ts +43 -0
- package/dist/shared/concurrency.js +78 -0
- package/dist/shared/dynamodb/abort.d.ts +47 -0
- package/dist/shared/dynamodb/abort.js +59 -0
- package/dist/shared/dynamodb/batch-write.d.ts +77 -14
- package/dist/shared/dynamodb/batch-write.js +146 -27
- package/dist/shared/dynamodb/cancellation.d.ts +121 -4
- package/dist/shared/dynamodb/cancellation.js +147 -3
- package/dist/shared/dynamodb/client.d.ts +162 -8
- package/dist/shared/dynamodb/client.js +153 -5
- package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
- package/dist/shared/dynamodb/idempotent-write.js +593 -0
- package/dist/shared/dynamodb/paginate.d.ts +105 -9
- package/dist/shared/dynamodb/paginate.js +175 -7
- package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
- package/dist/shared/dynamodb/partition-delete.js +314 -44
- package/dist/shared/dynamodb/recency-index.d.ts +231 -0
- package/dist/shared/dynamodb/recency-index.js +377 -0
- package/dist/shared/dynamodb/retry.d.ts +276 -8
- package/dist/shared/dynamodb/retry.js +433 -23
- package/dist/shared/dynamodb/table-schema.d.ts +190 -0
- package/dist/shared/dynamodb/table-schema.js +209 -0
- package/dist/shared/errors/base-error.d.ts +184 -10
- package/dist/shared/errors/base-error.js +160 -14
- package/dist/shared/errors/boundary.d.ts +71 -0
- package/dist/shared/errors/boundary.js +143 -0
- package/dist/shared/errors/classify.d.ts +97 -0
- package/dist/shared/errors/classify.js +257 -0
- package/dist/shared/errors/error-code.d.ts +77 -2
- package/dist/shared/errors/error-code.js +83 -1
- package/dist/shared/errors/errors.d.ts +158 -59
- package/dist/shared/errors/errors.js +219 -92
- package/dist/shared/logging/logger.d.ts +69 -3
- package/dist/shared/logging/logger.js +97 -3
- package/dist/shared/logging/redaction.d.ts +92 -8
- package/dist/shared/logging/redaction.js +273 -17
- package/dist/shared/logging/secret-patterns.d.ts +149 -19
- package/dist/shared/logging/secret-patterns.js +188 -27
- package/dist/shared/logging/truncate.d.ts +197 -0
- package/dist/shared/logging/truncate.js +231 -0
- package/dist/shared/options.d.ts +59 -7
- package/dist/shared/options.js +9 -1
- package/dist/shared/ulid.d.ts +77 -7
- package/dist/shared/ulid.js +103 -8
- package/dist/shared/validation/collaborators.d.ts +141 -0
- package/dist/shared/validation/collaborators.js +188 -0
- package/dist/shared/validation/option-shape.d.ts +89 -0
- package/dist/shared/validation/option-shape.js +113 -0
- package/dist/shared/validation/options.d.ts +145 -0
- package/dist/shared/validation/options.js +328 -0
- package/dist/shared/validation/primitives.d.ts +288 -21
- package/dist/shared/validation/primitives.js +353 -50
- package/dist/shared/validation/ttl.d.ts +66 -10
- package/dist/shared/validation/ttl.js +113 -15
- package/dist/store/actions/list-namespaces.d.ts +76 -6
- package/dist/store/actions/list-namespaces.js +166 -24
- package/dist/store/actions/put.d.ts +33 -8
- package/dist/store/actions/put.js +53 -60
- package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
- package/dist/store/actions/reconcile-vector-index.js +34 -15
- package/dist/store/actions/search.d.ts +34 -6
- package/dist/store/actions/search.js +56 -51
- package/dist/store/internal/batch-plan.d.ts +26 -0
- package/dist/store/internal/batch-plan.js +109 -0
- package/dist/store/internal/filter.d.ts +36 -3
- package/dist/store/internal/filter.js +66 -15
- package/dist/store/internal/get-item.d.ts +45 -0
- package/dist/store/internal/get-item.js +115 -0
- package/dist/store/internal/item-write.d.ts +230 -0
- package/dist/store/internal/item-write.js +463 -0
- package/dist/store/internal/parse.d.ts +225 -0
- package/dist/store/internal/parse.js +350 -0
- package/dist/store/internal/rows.d.ts +355 -0
- package/dist/store/internal/rows.js +447 -0
- package/dist/store/internal/semantic-search.d.ts +161 -6
- package/dist/store/internal/semantic-search.js +360 -18
- package/dist/store/internal/setup.d.ts +77 -20
- package/dist/store/internal/setup.js +178 -47
- package/dist/store/internal/table-search.d.ts +100 -0
- package/dist/store/internal/table-search.js +213 -0
- package/dist/store/internal/vector-index.d.ts +247 -0
- package/dist/store/internal/vector-index.js +546 -0
- package/dist/store/store.d.ts +270 -17
- package/dist/store/store.js +329 -38
- package/dist/store/types.d.ts +76 -26
- package/dist/store/types.js +13 -1
- package/dist/store/vector-backend.d.ts +64 -4
- package/dist/store/vector-backend.js +15 -1
- package/package.json +58 -36
- package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
- package/dist/checkpointer/actions/delete-thread.js.map +0 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
- package/dist/checkpointer/actions/get-tuple.js.map +0 -1
- package/dist/checkpointer/actions/list.d.ts.map +0 -1
- package/dist/checkpointer/actions/list.js.map +0 -1
- package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
- package/dist/checkpointer/actions/put-writes.js.map +0 -1
- package/dist/checkpointer/actions/put.d.ts.map +0 -1
- package/dist/checkpointer/actions/put.js.map +0 -1
- package/dist/checkpointer/internal/assemble.d.ts +0 -10
- package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
- package/dist/checkpointer/internal/assemble.js +0 -37
- package/dist/checkpointer/internal/assemble.js.map +0 -1
- package/dist/checkpointer/internal/configurable.d.ts +0 -13
- package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
- package/dist/checkpointer/internal/configurable.js +0 -23
- package/dist/checkpointer/internal/configurable.js.map +0 -1
- package/dist/checkpointer/internal/fetch.d.ts +0 -10
- package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
- package/dist/checkpointer/internal/fetch.js +0 -46
- package/dist/checkpointer/internal/fetch.js.map +0 -1
- package/dist/checkpointer/internal/filter-match.d.ts +0 -12
- package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
- package/dist/checkpointer/internal/filter-match.js +0 -14
- package/dist/checkpointer/internal/filter-match.js.map +0 -1
- package/dist/checkpointer/internal/item-reader.d.ts +0 -55
- package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-reader.js +0 -88
- package/dist/checkpointer/internal/item-reader.js.map +0 -1
- package/dist/checkpointer/internal/item-writer.d.ts +0 -26
- package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
- package/dist/checkpointer/internal/item-writer.js +0 -92
- package/dist/checkpointer/internal/item-writer.js.map +0 -1
- package/dist/checkpointer/internal/keys.d.ts +0 -31
- package/dist/checkpointer/internal/keys.d.ts.map +0 -1
- package/dist/checkpointer/internal/keys.js +0 -87
- package/dist/checkpointer/internal/keys.js.map +0 -1
- package/dist/checkpointer/internal/query.d.ts +0 -20
- package/dist/checkpointer/internal/query.d.ts.map +0 -1
- package/dist/checkpointer/internal/query.js +0 -36
- package/dist/checkpointer/internal/query.js.map +0 -1
- package/dist/checkpointer/internal/setup.d.ts.map +0 -1
- package/dist/checkpointer/internal/setup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
- package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
- package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
- package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
- package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
- package/dist/checkpointer/internal/special-write-verify.js +0 -65
- package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
- package/dist/checkpointer/internal/validation.d.ts +0 -13
- package/dist/checkpointer/internal/validation.d.ts.map +0 -1
- package/dist/checkpointer/internal/validation.js +0 -30
- package/dist/checkpointer/internal/validation.js.map +0 -1
- package/dist/checkpointer/internal/write-guard.d.ts +0 -13
- package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-guard.js +0 -39
- package/dist/checkpointer/internal/write-guard.js.map +0 -1
- package/dist/checkpointer/internal/write-index.d.ts +0 -37
- package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
- package/dist/checkpointer/internal/write-index.js +0 -42
- package/dist/checkpointer/internal/write-index.js.map +0 -1
- package/dist/checkpointer/saver.d.ts.map +0 -1
- package/dist/checkpointer/saver.js.map +0 -1
- package/dist/checkpointer/types.d.ts.map +0 -1
- package/dist/checkpointer/types.js.map +0 -1
- package/dist/factory/factory.d.ts.map +0 -1
- package/dist/factory/factory.js.map +0 -1
- package/dist/history/actions/add-messages.d.ts.map +0 -1
- package/dist/history/actions/add-messages.js.map +0 -1
- package/dist/history/actions/clear.d.ts.map +0 -1
- package/dist/history/actions/clear.js.map +0 -1
- package/dist/history/actions/get-messages.d.ts.map +0 -1
- package/dist/history/actions/get-messages.js.map +0 -1
- package/dist/history/actions/list-sessions.d.ts.map +0 -1
- package/dist/history/actions/list-sessions.js.map +0 -1
- package/dist/history/actions/reconcile-count.d.ts.map +0 -1
- package/dist/history/actions/reconcile-count.js.map +0 -1
- package/dist/history/chat-message-history.d.ts.map +0 -1
- package/dist/history/chat-message-history.js.map +0 -1
- package/dist/history/internal/append-saga.d.ts +0 -20
- package/dist/history/internal/append-saga.d.ts.map +0 -1
- package/dist/history/internal/append-saga.js +0 -35
- package/dist/history/internal/append-saga.js.map +0 -1
- package/dist/history/internal/compensation.d.ts +0 -21
- package/dist/history/internal/compensation.d.ts.map +0 -1
- package/dist/history/internal/compensation.js +0 -84
- package/dist/history/internal/compensation.js.map +0 -1
- package/dist/history/internal/item-mapper.d.ts +0 -12
- package/dist/history/internal/item-mapper.d.ts.map +0 -1
- package/dist/history/internal/item-mapper.js +0 -33
- package/dist/history/internal/item-mapper.js.map +0 -1
- package/dist/history/internal/keys.d.ts +0 -17
- package/dist/history/internal/keys.d.ts.map +0 -1
- package/dist/history/internal/keys.js +0 -49
- package/dist/history/internal/keys.js.map +0 -1
- package/dist/history/internal/message-chunker.d.ts +0 -14
- package/dist/history/internal/message-chunker.d.ts.map +0 -1
- package/dist/history/internal/message-chunker.js +0 -68
- package/dist/history/internal/message-chunker.js.map +0 -1
- package/dist/history/internal/message-transaction.d.ts +0 -26
- package/dist/history/internal/message-transaction.d.ts.map +0 -1
- package/dist/history/internal/message-transaction.js +0 -60
- package/dist/history/internal/message-transaction.js.map +0 -1
- package/dist/history/internal/query.d.ts +0 -10
- package/dist/history/internal/query.d.ts.map +0 -1
- package/dist/history/internal/query.js +0 -31
- package/dist/history/internal/query.js.map +0 -1
- package/dist/history/internal/session-count.d.ts +0 -41
- package/dist/history/internal/session-count.d.ts.map +0 -1
- package/dist/history/internal/session-count.js +0 -109
- package/dist/history/internal/session-count.js.map +0 -1
- package/dist/history/internal/session-title.d.ts +0 -20
- package/dist/history/internal/session-title.d.ts.map +0 -1
- package/dist/history/internal/session-title.js +0 -44
- package/dist/history/internal/session-title.js.map +0 -1
- package/dist/history/internal/session-update.d.ts +0 -28
- package/dist/history/internal/session-update.d.ts.map +0 -1
- package/dist/history/internal/session-update.js +0 -70
- package/dist/history/internal/session-update.js.map +0 -1
- package/dist/history/internal/setup.d.ts.map +0 -1
- package/dist/history/internal/setup.js.map +0 -1
- package/dist/history/internal/title-generator.d.ts +0 -13
- package/dist/history/internal/title-generator.d.ts.map +0 -1
- package/dist/history/internal/title-generator.js +0 -25
- package/dist/history/internal/title-generator.js.map +0 -1
- package/dist/history/internal/ttl-anchor.d.ts +0 -25
- package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/ttl-anchor.js.map +0 -1
- package/dist/history/internal/validation.d.ts +0 -9
- package/dist/history/internal/validation.d.ts.map +0 -1
- package/dist/history/internal/validation.js +0 -16
- package/dist/history/internal/validation.js.map +0 -1
- package/dist/history/session-adapter.d.ts.map +0 -1
- package/dist/history/session-adapter.js.map +0 -1
- package/dist/history/types.d.ts.map +0 -1
- package/dist/history/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/shared/clock.d.ts.map +0 -1
- package/dist/shared/clock.js.map +0 -1
- package/dist/shared/codec/codec.d.ts.map +0 -1
- package/dist/shared/codec/codec.js.map +0 -1
- package/dist/shared/codec/compression.d.ts.map +0 -1
- package/dist/shared/codec/compression.js.map +0 -1
- package/dist/shared/codec/descriptor-keys.d.ts +0 -4
- package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
- package/dist/shared/codec/descriptor-keys.js +0 -14
- package/dist/shared/codec/descriptor-keys.js.map +0 -1
- package/dist/shared/codec/json-serde.d.ts.map +0 -1
- package/dist/shared/codec/json-serde.js.map +0 -1
- package/dist/shared/codec/s3/client.d.ts.map +0 -1
- package/dist/shared/codec/s3/client.js.map +0 -1
- package/dist/shared/codec/s3/config.d.ts.map +0 -1
- package/dist/shared/codec/s3/config.js.map +0 -1
- package/dist/shared/codec/s3/delete.d.ts +0 -8
- package/dist/shared/codec/s3/delete.d.ts.map +0 -1
- package/dist/shared/codec/s3/delete.js +0 -29
- package/dist/shared/codec/s3/delete.js.map +0 -1
- package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
- package/dist/shared/codec/s3/lifecycle.js.map +0 -1
- package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
- package/dist/shared/codec/s3/offloader.js.map +0 -1
- package/dist/shared/codec/s3/orphans.d.ts +0 -18
- package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
- package/dist/shared/codec/s3/orphans.js +0 -58
- package/dist/shared/codec/s3/orphans.js.map +0 -1
- package/dist/shared/codec/s3/read-write.d.ts +0 -14
- package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
- package/dist/shared/codec/s3/read-write.js +0 -43
- package/dist/shared/codec/s3/read-write.js.map +0 -1
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.d.ts.map +0 -1
- package/dist/shared/codec/s3/retry.js +0 -25
- package/dist/shared/codec/s3/retry.js.map +0 -1
- package/dist/shared/constants.d.ts +0 -64
- package/dist/shared/constants.d.ts.map +0 -1
- package/dist/shared/constants.js +0 -67
- package/dist/shared/constants.js.map +0 -1
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
- package/dist/shared/dynamodb/backoff.js +0 -48
- package/dist/shared/dynamodb/backoff.js.map +0 -1
- package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
- package/dist/shared/dynamodb/batch-write.js.map +0 -1
- package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
- package/dist/shared/dynamodb/cancellation.js.map +0 -1
- package/dist/shared/dynamodb/client.d.ts.map +0 -1
- package/dist/shared/dynamodb/client.js.map +0 -1
- package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
- package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
- package/dist/shared/dynamodb/conditional-put.js +0 -59
- package/dist/shared/dynamodb/conditional-put.js.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
- package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
- package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
- package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate-core.js +0 -52
- package/dist/shared/dynamodb/paginate-core.js.map +0 -1
- package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
- package/dist/shared/dynamodb/paginate.js.map +0 -1
- package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
- package/dist/shared/dynamodb/partition-delete.js.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry-classifier.js +0 -87
- package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
- package/dist/shared/dynamodb/retry.d.ts.map +0 -1
- package/dist/shared/dynamodb/retry.js.map +0 -1
- package/dist/shared/dynamodb/scan.d.ts +0 -15
- package/dist/shared/dynamodb/scan.d.ts.map +0 -1
- package/dist/shared/dynamodb/scan.js +0 -20
- package/dist/shared/dynamodb/scan.js.map +0 -1
- package/dist/shared/dynamodb/types.d.ts +0 -24
- package/dist/shared/dynamodb/types.d.ts.map +0 -1
- package/dist/shared/dynamodb/types.js +0 -3
- package/dist/shared/dynamodb/types.js.map +0 -1
- package/dist/shared/errors/base-error.d.ts.map +0 -1
- package/dist/shared/errors/base-error.js.map +0 -1
- package/dist/shared/errors/error-code.d.ts.map +0 -1
- package/dist/shared/errors/error-code.js.map +0 -1
- package/dist/shared/errors/errors.d.ts.map +0 -1
- package/dist/shared/errors/errors.js.map +0 -1
- package/dist/shared/errors/wrap-error.d.ts +0 -16
- package/dist/shared/errors/wrap-error.d.ts.map +0 -1
- package/dist/shared/errors/wrap-error.js +0 -30
- package/dist/shared/errors/wrap-error.js.map +0 -1
- package/dist/shared/logging/logger.d.ts.map +0 -1
- package/dist/shared/logging/logger.js.map +0 -1
- package/dist/shared/logging/redaction-walk.d.ts +0 -23
- package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
- package/dist/shared/logging/redaction-walk.js +0 -92
- package/dist/shared/logging/redaction-walk.js.map +0 -1
- package/dist/shared/logging/redaction.d.ts.map +0 -1
- package/dist/shared/logging/redaction.js.map +0 -1
- package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
- package/dist/shared/logging/secret-patterns.js.map +0 -1
- package/dist/shared/options.d.ts.map +0 -1
- package/dist/shared/options.js.map +0 -1
- package/dist/shared/ulid.d.ts.map +0 -1
- package/dist/shared/ulid.js.map +0 -1
- package/dist/shared/validation/primitives.d.ts.map +0 -1
- package/dist/shared/validation/primitives.js.map +0 -1
- package/dist/shared/validation/ttl.d.ts.map +0 -1
- package/dist/shared/validation/ttl.js.map +0 -1
- package/dist/store/actions/get.d.ts +0 -5
- package/dist/store/actions/get.d.ts.map +0 -1
- package/dist/store/actions/get.js +0 -35
- package/dist/store/actions/get.js.map +0 -1
- package/dist/store/actions/list-namespaces.d.ts.map +0 -1
- package/dist/store/actions/list-namespaces.js.map +0 -1
- package/dist/store/actions/put.d.ts.map +0 -1
- package/dist/store/actions/put.js.map +0 -1
- package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
- package/dist/store/actions/reconcile-vector-index.js.map +0 -1
- package/dist/store/actions/search.d.ts.map +0 -1
- package/dist/store/actions/search.js.map +0 -1
- package/dist/store/internal/backend-search.d.ts +0 -5
- package/dist/store/internal/backend-search.d.ts.map +0 -1
- package/dist/store/internal/backend-search.js +0 -68
- package/dist/store/internal/backend-search.js.map +0 -1
- package/dist/store/internal/filter.d.ts.map +0 -1
- package/dist/store/internal/filter.js.map +0 -1
- package/dist/store/internal/index-reconcile.d.ts +0 -22
- package/dist/store/internal/index-reconcile.d.ts.map +0 -1
- package/dist/store/internal/index-reconcile.js +0 -105
- package/dist/store/internal/index-reconcile.js.map +0 -1
- package/dist/store/internal/index-sync.d.ts +0 -11
- package/dist/store/internal/index-sync.d.ts.map +0 -1
- package/dist/store/internal/index-sync.js +0 -26
- package/dist/store/internal/index-sync.js.map +0 -1
- package/dist/store/internal/item-mapper.d.ts +0 -25
- package/dist/store/internal/item-mapper.d.ts.map +0 -1
- package/dist/store/internal/item-mapper.js +0 -53
- package/dist/store/internal/item-mapper.js.map +0 -1
- package/dist/store/internal/keys.d.ts +0 -18
- package/dist/store/internal/keys.d.ts.map +0 -1
- package/dist/store/internal/keys.js +0 -42
- package/dist/store/internal/keys.js.map +0 -1
- package/dist/store/internal/namespace-match.d.ts +0 -12
- package/dist/store/internal/namespace-match.d.ts.map +0 -1
- package/dist/store/internal/namespace-match.js +0 -41
- package/dist/store/internal/namespace-match.js.map +0 -1
- package/dist/store/internal/overwrite-swap.d.ts +0 -33
- package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
- package/dist/store/internal/overwrite-swap.js +0 -62
- package/dist/store/internal/overwrite-swap.js.map +0 -1
- package/dist/store/internal/persist.d.ts +0 -27
- package/dist/store/internal/persist.d.ts.map +0 -1
- package/dist/store/internal/persist.js +0 -59
- package/dist/store/internal/persist.js.map +0 -1
- package/dist/store/internal/query.d.ts +0 -6
- package/dist/store/internal/query.d.ts.map +0 -1
- package/dist/store/internal/query.js +0 -32
- package/dist/store/internal/query.js.map +0 -1
- package/dist/store/internal/ranker.d.ts +0 -13
- package/dist/store/internal/ranker.d.ts.map +0 -1
- package/dist/store/internal/ranker.js +0 -31
- package/dist/store/internal/ranker.js.map +0 -1
- package/dist/store/internal/read-existing.d.ts +0 -19
- package/dist/store/internal/read-existing.d.ts.map +0 -1
- package/dist/store/internal/read-existing.js +0 -29
- package/dist/store/internal/read-existing.js.map +0 -1
- package/dist/store/internal/score-direction.d.ts +0 -32
- package/dist/store/internal/score-direction.d.ts.map +0 -1
- package/dist/store/internal/score-direction.js +0 -39
- package/dist/store/internal/score-direction.js.map +0 -1
- package/dist/store/internal/search-filter.d.ts +0 -4
- package/dist/store/internal/search-filter.d.ts.map +0 -1
- package/dist/store/internal/search-filter.js +0 -11
- package/dist/store/internal/search-filter.js.map +0 -1
- package/dist/store/internal/semantic-search.d.ts.map +0 -1
- package/dist/store/internal/semantic-search.js.map +0 -1
- package/dist/store/internal/setup.d.ts.map +0 -1
- package/dist/store/internal/setup.js.map +0 -1
- package/dist/store/internal/validation.d.ts +0 -13
- package/dist/store/internal/validation.d.ts.map +0 -1
- package/dist/store/internal/validation.js +0 -35
- package/dist/store/internal/validation.js.map +0 -1
- package/dist/store/internal/write-verify.d.ts +0 -37
- package/dist/store/internal/write-verify.d.ts.map +0 -1
- package/dist/store/internal/write-verify.js +0 -68
- package/dist/store/internal/write-verify.js.map +0 -1
- package/dist/store/store.d.ts.map +0 -1
- package/dist/store/store.js.map +0 -1
- package/dist/store/types.d.ts.map +0 -1
- package/dist/store/types.js.map +0 -1
- package/dist/store/vector-backend.d.ts.map +0 -1
- package/dist/store/vector-backend.js.map +0 -1
|
@@ -1,8 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the JSON form: writing it, reading it, and recognising it.
|
|
3
|
+
*
|
|
4
|
+
* The default serde writes a value as JSON under the `json` type and reads
|
|
5
|
+
* back only that type; the codec also asks, when a serde refuses stored bytes,
|
|
6
|
+
* whether those bytes are still JSON at all, which tells a corrupt payload from
|
|
7
|
+
* a serde that would not reconstruct it.
|
|
8
|
+
*/
|
|
1
9
|
import type { SerializerProtocol } from '@langchain/langgraph-checkpoint';
|
|
2
10
|
/**
|
|
3
|
-
* A
|
|
4
|
-
*
|
|
5
|
-
* the
|
|
11
|
+
* A plain JSON serializer implementing LangGraph's `SerializerProtocol`:
|
|
12
|
+
* the default `serde` of `DynamoDBStore` and `DynamoDBChatMessageHistory`, and
|
|
13
|
+
* the alternative a `DynamoDBSaver` can be given in place of LangGraph's
|
|
14
|
+
* `JsonPlusSerializer`.
|
|
15
|
+
*
|
|
16
|
+
* It is exported so that choice is available. The checkpointer's default
|
|
17
|
+
* revives a stored `{"lc": …}` record by instantiating the class the record
|
|
18
|
+
* names, so the row selects which constructor runs on read; this serializer
|
|
19
|
+
* runs `JSON.parse` and nothing else, and reconstructs no class at all.
|
|
20
|
+
* Reading with it is the narrower trust boundary, and the price is stated
|
|
21
|
+
* below: it stores the JSON projection of a value, not the value.
|
|
22
|
+
*
|
|
23
|
+
* `dumpsTyped` accepts any value `JSON.stringify` can represent and refuses the
|
|
24
|
+
* rest. A value it cannot represent — `undefined`, a function, a symbol —
|
|
25
|
+
* stringifies to `undefined` and would be stored as **zero bytes**, which reads
|
|
26
|
+
* back as a parse error; a circular structure or a `BigInt` makes it throw. Both
|
|
27
|
+
* are reported as `VALIDATION` naming `value`, at the write, rather than
|
|
28
|
+
* as an unreadable row later — with the refusal attached as `cause` and never
|
|
29
|
+
* quoted into the message, which for a circular structure names the caller's
|
|
30
|
+
* own properties and classes.
|
|
31
|
+
*
|
|
32
|
+
* What it represents, it represents as JSON, which is lossy in ways nothing
|
|
33
|
+
* records: a `Map` or `Set` stores as `{}`, an object key whose value is
|
|
34
|
+
* `undefined` is dropped and an array element is stored as `null`, `NaN` and
|
|
35
|
+
* `Infinity` store as `null`, `-0` as `0`, a `Uint8Array` as an index-keyed
|
|
36
|
+
* object and a `Date` as an ISO string. The README's *Table schema* section
|
|
37
|
+
* holds the whole table, against the checkpointer default column by column.
|
|
38
|
+
*
|
|
39
|
+
* `loadsTyped` reads only the `json` form it writes, and says
|
|
40
|
+
* so before it looks at a byte. Any other declared form is a `VALIDATION` error
|
|
41
|
+
* naming `serde`, because it says what *this* reader may rebuild and not that
|
|
42
|
+
* the payload is damaged. Bytes of that form which do not parse are
|
|
43
|
+
* `PAYLOAD_CORRUPT`, because they can never be read and the caller should
|
|
44
|
+
* report rather than retry; a `data` that is not bytes at all is a
|
|
45
|
+
* `VALIDATION` naming `data`, because that is the caller's mistake and
|
|
46
|
+
* not a row's.
|
|
47
|
+
*
|
|
48
|
+
* Frozen for the reason {@link ErrorCode} is: one object, shared by every
|
|
49
|
+
* adapter in the process that did not pass a `serde` of its own, and
|
|
50
|
+
* reachable from the package root. An assignment to `dumpsTyped` by any one
|
|
51
|
+
* consumer would silently change how every other one writes.
|
|
6
52
|
*/
|
|
7
53
|
export declare const JSON_SERDE: SerializerProtocol;
|
|
8
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Whether stored bytes are still the form the row that holds them declares.
|
|
56
|
+
*
|
|
57
|
+
* This is the structural question behind the two ways a decode fails —
|
|
58
|
+
* `PAYLOAD_CORRUPT` for bytes no reader can decode, and the `serde` refusal for
|
|
59
|
+
* bytes *this* reader will not rebuild a value from — and it is the only one
|
|
60
|
+
* this package can answer on its own. `SerializerProtocol` offers no way to ask
|
|
61
|
+
* a serde whether it parsed the bytes before deciding not to reconstruct what
|
|
62
|
+
* they name, and the refusal it throws is a caller's object: its class, its
|
|
63
|
+
* fields and its prose are all whatever that caller chose. Classifying a
|
|
64
|
+
* payload by any of those would make the code mean "a third party said so",
|
|
65
|
+
* which is exactly what neither code may mean.
|
|
66
|
+
*
|
|
67
|
+
* Accepts: `serdeType` — the type stamped on the row, as the descriptor carries
|
|
68
|
+
* it. `bytes` — what the row stored, already decompressed.
|
|
69
|
+
*
|
|
70
|
+
* Returns: whether the bytes still parse as the declared form. A type this
|
|
71
|
+
* package has no grammar for is taken at its word and answers `true`, so its
|
|
72
|
+
* serde's refusal is reported rather than written off: dropping a payload this
|
|
73
|
+
* reader merely cannot check would lose data on nothing but its own ignorance.
|
|
74
|
+
*
|
|
75
|
+
* Throws: **nothing**, for any bytes. It is called from inside the `catch` that
|
|
76
|
+
* is classifying a decode failure, where a throw would replace the failure
|
|
77
|
+
* being reported — and the value it is handed came off a row, so it may be
|
|
78
|
+
* anything that row's writer stored.
|
|
79
|
+
*/
|
|
80
|
+
export declare function bytesHoldDeclaredForm(serdeType: string, bytes: Uint8Array): boolean;
|
|
@@ -1,18 +1,191 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides the JSON form: writing it, reading it, and recognising it.
|
|
4
|
+
*
|
|
5
|
+
* The default serde writes a value as JSON under the `json` type and reads
|
|
6
|
+
* back only that type; the codec also asks, when a serde refuses stored bytes,
|
|
7
|
+
* whether those bytes are still JSON at all, which tells a corrupt payload from
|
|
8
|
+
* a serde that would not reconstruct it.
|
|
9
|
+
*/
|
|
2
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
11
|
exports.JSON_SERDE = void 0;
|
|
12
|
+
exports.bytesHoldDeclaredForm = bytesHoldDeclaredForm;
|
|
13
|
+
const base_error_1 = require("../errors/base-error");
|
|
14
|
+
const error_code_1 = require("../errors/error-code");
|
|
15
|
+
const errors_1 = require("../errors/errors");
|
|
16
|
+
const truncate_1 = require("../logging/truncate");
|
|
4
17
|
/**
|
|
5
|
-
* A
|
|
6
|
-
*
|
|
7
|
-
* the
|
|
18
|
+
* A plain JSON serializer implementing LangGraph's `SerializerProtocol`:
|
|
19
|
+
* the default `serde` of `DynamoDBStore` and `DynamoDBChatMessageHistory`, and
|
|
20
|
+
* the alternative a `DynamoDBSaver` can be given in place of LangGraph's
|
|
21
|
+
* `JsonPlusSerializer`.
|
|
22
|
+
*
|
|
23
|
+
* It is exported so that choice is available. The checkpointer's default
|
|
24
|
+
* revives a stored `{"lc": …}` record by instantiating the class the record
|
|
25
|
+
* names, so the row selects which constructor runs on read; this serializer
|
|
26
|
+
* runs `JSON.parse` and nothing else, and reconstructs no class at all.
|
|
27
|
+
* Reading with it is the narrower trust boundary, and the price is stated
|
|
28
|
+
* below: it stores the JSON projection of a value, not the value.
|
|
29
|
+
*
|
|
30
|
+
* `dumpsTyped` accepts any value `JSON.stringify` can represent and refuses the
|
|
31
|
+
* rest. A value it cannot represent — `undefined`, a function, a symbol —
|
|
32
|
+
* stringifies to `undefined` and would be stored as **zero bytes**, which reads
|
|
33
|
+
* back as a parse error; a circular structure or a `BigInt` makes it throw. Both
|
|
34
|
+
* are reported as `VALIDATION` naming `value`, at the write, rather than
|
|
35
|
+
* as an unreadable row later — with the refusal attached as `cause` and never
|
|
36
|
+
* quoted into the message, which for a circular structure names the caller's
|
|
37
|
+
* own properties and classes.
|
|
38
|
+
*
|
|
39
|
+
* What it represents, it represents as JSON, which is lossy in ways nothing
|
|
40
|
+
* records: a `Map` or `Set` stores as `{}`, an object key whose value is
|
|
41
|
+
* `undefined` is dropped and an array element is stored as `null`, `NaN` and
|
|
42
|
+
* `Infinity` store as `null`, `-0` as `0`, a `Uint8Array` as an index-keyed
|
|
43
|
+
* object and a `Date` as an ISO string. The README's *Table schema* section
|
|
44
|
+
* holds the whole table, against the checkpointer default column by column.
|
|
45
|
+
*
|
|
46
|
+
* `loadsTyped` reads only the `json` form it writes, and says
|
|
47
|
+
* so before it looks at a byte. Any other declared form is a `VALIDATION` error
|
|
48
|
+
* naming `serde`, because it says what *this* reader may rebuild and not that
|
|
49
|
+
* the payload is damaged. Bytes of that form which do not parse are
|
|
50
|
+
* `PAYLOAD_CORRUPT`, because they can never be read and the caller should
|
|
51
|
+
* report rather than retry; a `data` that is not bytes at all is a
|
|
52
|
+
* `VALIDATION` naming `data`, because that is the caller's mistake and
|
|
53
|
+
* not a row's.
|
|
54
|
+
*
|
|
55
|
+
* Frozen for the reason {@link ErrorCode} is: one object, shared by every
|
|
56
|
+
* adapter in the process that did not pass a `serde` of its own, and
|
|
57
|
+
* reachable from the package root. An assignment to `dumpsTyped` by any one
|
|
58
|
+
* consumer would silently change how every other one writes.
|
|
8
59
|
*/
|
|
9
60
|
exports.JSON_SERDE = {
|
|
10
61
|
async dumpsTyped(value) {
|
|
11
|
-
|
|
62
|
+
let text;
|
|
63
|
+
try {
|
|
64
|
+
text = JSON.stringify(value);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// The refusal travels as `cause`, never as text. V8 writes the path it
|
|
68
|
+
// walked into the message it throws for a circular structure, quoting
|
|
69
|
+
// the caller's own property names and constructor names — and this
|
|
70
|
+
// package does not compose a public `err.message` out of a caller's
|
|
71
|
+
// identifiers, which an application may print, log or return in a
|
|
72
|
+
// response. `redactedMessage` removes credential shapes, not names, so
|
|
73
|
+
// it never covered this. A caller who wants the path reads `cause`.
|
|
74
|
+
throw (0, errors_1.validationError)('value cannot be serialized as JSON — a circular structure, or a value JSON has no ' +
|
|
75
|
+
'encoding for such as a BigInt; the refusal itself is attached as `cause`', 'value', (0, base_error_1.toError)(error));
|
|
76
|
+
}
|
|
77
|
+
if (text === undefined) {
|
|
78
|
+
throw (0, errors_1.validationError)('value has no JSON representation (undefined, a function or a symbol), so it cannot be ' +
|
|
79
|
+
'stored; store null instead to record an absent value', 'value');
|
|
80
|
+
}
|
|
81
|
+
// `dumpsTyped` stays `async` because the two throws above must reach a
|
|
82
|
+
// caller as a rejection even when it is called without `await` (a bare
|
|
83
|
+
// `.catch()`), which a plain synchronous throw would not do. Returning
|
|
84
|
+
// `Promise.resolve(...)` here — rather than the bare tuple — is what
|
|
85
|
+
// satisfies `require-await`: the rule accepts a `return` of a thenable
|
|
86
|
+
// value in place of an explicit `await`, and needs no `await` to do it.
|
|
87
|
+
return Promise.resolve([JSON_SERDE_TYPE, new TextEncoder().encode(text)]);
|
|
12
88
|
},
|
|
13
|
-
async loadsTyped(
|
|
14
|
-
|
|
15
|
-
|
|
89
|
+
async loadsTyped(type, data) {
|
|
90
|
+
// The declared form is honoured, and honoured first. Ignoring it left this
|
|
91
|
+
// serializer answering for forms it has no grammar for: a row stamped
|
|
92
|
+
// `bytes` by the checkpointer's default — what that serializer writes for a
|
|
93
|
+
// raw `Uint8Array` — parsed here as JSON and returned a *different value*
|
|
94
|
+
// whenever those bytes happened to be valid JSON, and returned this
|
|
95
|
+
// serializer's own `PAYLOAD_CORRUPT` when they were not. The second reading
|
|
96
|
+
// is the one that cost data: the codec passes an already-branded refusal
|
|
97
|
+
// through untouched, so `bytesHoldDeclaredForm` never ran, the row was
|
|
98
|
+
// filed as permanent loss, and history's default `onCorruptMessage: 'skip'`
|
|
99
|
+
// dropped the message. The same row read through the checkpointer's own
|
|
100
|
+
// default was reported as a refusal instead, so which serde an adapter
|
|
101
|
+
// carried decided whether a turn survived the read.
|
|
102
|
+
//
|
|
103
|
+
// A form this serializer cannot rebuild a value from is a statement about
|
|
104
|
+
// this reader, not about the payload, so it names `serde` — the same brand
|
|
105
|
+
// the codec puts on `JsonPlusSerializer`'s `Unknown serialization type`,
|
|
106
|
+
// which is what makes the two agree. The type is quoted from the row, so it
|
|
107
|
+
// is bounded, for the reason `truncateForLog` states.
|
|
108
|
+
if (type !== JSON_SERDE_TYPE) {
|
|
109
|
+
throw (0, errors_1.validationError)(`this serializer reads only the \`${JSON_SERDE_TYPE}\` form it writes, and this payload ` +
|
|
110
|
+
`declares ${(0, truncate_1.truncateForLog)(String(JSON.stringify(type)))}; read the row with the ` +
|
|
111
|
+
'serializer that wrote it, or rewrite the row', 'serde');
|
|
112
|
+
}
|
|
113
|
+
let text;
|
|
114
|
+
// The decode is inside a guard of its own because it fails for a different
|
|
115
|
+
// reason than the parse does, and names it separately. UTF-8 decoding is
|
|
116
|
+
// lenient — a malformed byte becomes U+FFFD rather than an error — so the
|
|
117
|
+
// only way `TextDecoder` refuses is a `data` that is not bytes at all,
|
|
118
|
+
// which is the caller's mistake and not a corrupt row. The codec always
|
|
119
|
+
// passes a `Uint8Array`; a direct caller passing anything else would
|
|
120
|
+
// otherwise get a bare `TypeError` from Node naming an argument called
|
|
121
|
+
// "list".
|
|
122
|
+
try {
|
|
123
|
+
text = typeof data === 'string' ? data : new TextDecoder().decode(data);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw (0, errors_1.validationError)('data must be the bytes or text this serializer wrote, as a Uint8Array or a string', 'data', error);
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
// Same reasoning as `dumpsTyped`'s final return: see its comment.
|
|
130
|
+
return Promise.resolve(JSON.parse(text));
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw new base_error_1.DynamoDBLangGraphError('the stored payload is not the JSON this serializer wrote, so it cannot be decoded', error_code_1.ErrorCode.PAYLOAD_CORRUPT, {}, error);
|
|
134
|
+
}
|
|
16
135
|
},
|
|
17
136
|
};
|
|
18
|
-
|
|
137
|
+
Object.freeze(exports.JSON_SERDE);
|
|
138
|
+
/**
|
|
139
|
+
* The one `serdeType` whose grammar this package can check for itself: the type
|
|
140
|
+
* `JSON_SERDE` stamps on everything it writes, and the one LangGraph's
|
|
141
|
+
* own `JsonPlusSerializer` stamps on every value but a raw `Uint8Array`, which
|
|
142
|
+
* it stamps `bytes`.
|
|
143
|
+
*
|
|
144
|
+
* The one constant is shared by the serializer that writes this form and the
|
|
145
|
+
* check that re-derives it, within this module. They had each decided
|
|
146
|
+
* separately what they understood: the check took any other type at its
|
|
147
|
+
* word, while `JSON_SERDE` ignored the declared type and ran `JSON.parse` on
|
|
148
|
+
* whatever it was handed. A row declaring a form neither of them writes was
|
|
149
|
+
* therefore classified one way through one serializer and the opposite way
|
|
150
|
+
* through the other — and a row declaring `bytes`, which the checkpointer's
|
|
151
|
+
* default writes for a raw `Uint8Array`, decoded to a *different value*
|
|
152
|
+
* rather than failing at all when its bytes happened to parse as JSON.
|
|
153
|
+
*/
|
|
154
|
+
const JSON_SERDE_TYPE = 'json';
|
|
155
|
+
/**
|
|
156
|
+
* Whether stored bytes are still the form the row that holds them declares.
|
|
157
|
+
*
|
|
158
|
+
* This is the structural question behind the two ways a decode fails —
|
|
159
|
+
* `PAYLOAD_CORRUPT` for bytes no reader can decode, and the `serde` refusal for
|
|
160
|
+
* bytes *this* reader will not rebuild a value from — and it is the only one
|
|
161
|
+
* this package can answer on its own. `SerializerProtocol` offers no way to ask
|
|
162
|
+
* a serde whether it parsed the bytes before deciding not to reconstruct what
|
|
163
|
+
* they name, and the refusal it throws is a caller's object: its class, its
|
|
164
|
+
* fields and its prose are all whatever that caller chose. Classifying a
|
|
165
|
+
* payload by any of those would make the code mean "a third party said so",
|
|
166
|
+
* which is exactly what neither code may mean.
|
|
167
|
+
*
|
|
168
|
+
* Accepts: `serdeType` — the type stamped on the row, as the descriptor carries
|
|
169
|
+
* it. `bytes` — what the row stored, already decompressed.
|
|
170
|
+
*
|
|
171
|
+
* Returns: whether the bytes still parse as the declared form. A type this
|
|
172
|
+
* package has no grammar for is taken at its word and answers `true`, so its
|
|
173
|
+
* serde's refusal is reported rather than written off: dropping a payload this
|
|
174
|
+
* reader merely cannot check would lose data on nothing but its own ignorance.
|
|
175
|
+
*
|
|
176
|
+
* Throws: **nothing**, for any bytes. It is called from inside the `catch` that
|
|
177
|
+
* is classifying a decode failure, where a throw would replace the failure
|
|
178
|
+
* being reported — and the value it is handed came off a row, so it may be
|
|
179
|
+
* anything that row's writer stored.
|
|
180
|
+
*/
|
|
181
|
+
function bytesHoldDeclaredForm(serdeType, bytes) {
|
|
182
|
+
if (serdeType !== JSON_SERDE_TYPE)
|
|
183
|
+
return true;
|
|
184
|
+
try {
|
|
185
|
+
JSON.parse(new TextDecoder().decode(bytes));
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the S3 SDK's own types from this package's declarations.
|
|
3
|
+
*
|
|
4
|
+
* The S3 client, its config and a command are described by the members this
|
|
5
|
+
* package touches, so no shipped declaration imports the optional
|
|
6
|
+
* `@aws-sdk/client-s3` peer and a caller without it installed still compiles
|
|
7
|
+
* (record 1). A real `S3Client` or `S3ClientConfig` satisfies these shapes as
|
|
8
|
+
* it is, so a caller who has the SDK passes its own values unchanged.
|
|
9
|
+
*/
|
|
10
|
+
/** A region as the SDK accepts it: a string or a provider resolving to one. */
|
|
11
|
+
export type S3RegionLike = string | (() => Promise<string>);
|
|
12
|
+
/** A value an S3 client option can hold. */
|
|
13
|
+
export type S3ClientOption = string | number | boolean | object | null | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The S3 client options this library reads (`region`) or sets (`maxAttempts`),
|
|
16
|
+
* open to every other `S3ClientConfig` key.
|
|
17
|
+
*/
|
|
18
|
+
export interface S3ClientOptions {
|
|
19
|
+
region?: S3RegionLike;
|
|
20
|
+
maxAttempts?: number;
|
|
21
|
+
[option: string]: S3ClientOption;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Structural stand-in for `S3ClientConfig`, so the shipped declarations compile
|
|
25
|
+
* without the optional `@aws-sdk/client-s3` peer installed. A literal gets
|
|
26
|
+
* completion for the options the library uses; a typed `S3ClientConfig`
|
|
27
|
+
* variable is accepted as it is.
|
|
28
|
+
*/
|
|
29
|
+
export type S3ClientConfigLike = S3ClientOptions | object;
|
|
30
|
+
/**
|
|
31
|
+
* The options of a config, read through the structural type.
|
|
32
|
+
*
|
|
33
|
+
* Accepts: a config as the caller gave it, or nothing.
|
|
34
|
+
*
|
|
35
|
+
* Returns: the same object seen as {@link S3ClientOptions} so `region` and
|
|
36
|
+
* `maxAttempts` can be read; an absent config reads as empty rather than
|
|
37
|
+
* needing a guard at every call site.
|
|
38
|
+
*
|
|
39
|
+
* Throws: nothing.
|
|
40
|
+
*/
|
|
41
|
+
export declare function s3ClientOptions(config: S3ClientConfigLike | undefined): S3ClientOptions;
|
|
42
|
+
/** What every SDK command object carries: its `input`. */
|
|
43
|
+
export interface S3CommandLike {
|
|
44
|
+
input: object;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The S3 client surface this library calls, typed structurally for the same
|
|
48
|
+
* reason. `S3Client` from `@aws-sdk/client-s3` satisfies it.
|
|
49
|
+
*/
|
|
50
|
+
export interface S3ClientLike {
|
|
51
|
+
send(command: S3CommandLike, options?: object): Promise<object>;
|
|
52
|
+
destroy(): void;
|
|
53
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides the S3 SDK's own types from this package's declarations.
|
|
4
|
+
*
|
|
5
|
+
* The S3 client, its config and a command are described by the members this
|
|
6
|
+
* package touches, so no shipped declaration imports the optional
|
|
7
|
+
* `@aws-sdk/client-s3` peer and a caller without it installed still compiles
|
|
8
|
+
* (record 1). A real `S3Client` or `S3ClientConfig` satisfies these shapes as
|
|
9
|
+
* it is, so a caller who has the SDK passes its own values unchanged.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.s3ClientOptions = s3ClientOptions;
|
|
13
|
+
/**
|
|
14
|
+
* The options of a config, read through the structural type.
|
|
15
|
+
*
|
|
16
|
+
* Accepts: a config as the caller gave it, or nothing.
|
|
17
|
+
*
|
|
18
|
+
* Returns: the same object seen as {@link S3ClientOptions} so `region` and
|
|
19
|
+
* `maxAttempts` can be read; an absent config reads as empty rather than
|
|
20
|
+
* needing a guard at every call site.
|
|
21
|
+
*
|
|
22
|
+
* Throws: nothing.
|
|
23
|
+
*/
|
|
24
|
+
function s3ClientOptions(config) {
|
|
25
|
+
return (config ?? {});
|
|
26
|
+
}
|
|
@@ -1,12 +1,45 @@
|
|
|
1
|
-
import type { S3Client, S3ClientConfig } from '@aws-sdk/client-s3';
|
|
2
|
-
/** Lazily import the optional `@aws-sdk/client-s3` peer, caching the module. */
|
|
3
|
-
export declare function loadS3Sdk(): Promise<typeof import('@aws-sdk/client-s3')>;
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* Hides that the S3 SDK is loaded on first use, and how its client is set up.
|
|
3
|
+
*
|
|
4
|
+
* An adapter without offload never imports the optional peer; the first
|
|
5
|
+
* offload does, once, and a missing install surfaces as `VALIDATION` naming
|
|
6
|
+
* the remedy (record 1). The client built here defaults to no retries of its
|
|
7
|
+
* own — `maxAttempts: 1` — so this package's retry is the only layer unless a
|
|
8
|
+
* caller's own `maxAttempts` overrides it (record 14), and its idle timer
|
|
9
|
+
* bounds a stalled transfer without bounding a slow one.
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
import type { S3Client } from '@aws-sdk/client-s3';
|
|
12
|
+
import type { S3ClientConfigLike } from './client-types';
|
|
13
|
+
type S3Sdk = typeof import('@aws-sdk/client-s3');
|
|
14
|
+
/**
|
|
15
|
+
* The optional `@aws-sdk/client-s3` peer, imported on first use.
|
|
16
|
+
*
|
|
17
|
+
* Accepts: nothing. Concurrent callers share one import.
|
|
18
|
+
*
|
|
19
|
+
* Returns: the module, cached for every later call.
|
|
20
|
+
*
|
|
21
|
+
* Throws: `VALIDATION` naming `s3` when the package is not installed,
|
|
22
|
+
* carrying the install command; any other import failure — a broken build, a
|
|
23
|
+
* syntax error inside the package — passes through unchanged. A failure is not
|
|
24
|
+
* cached, so an install or a fixed bundle succeeds on a later call.
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadS3Sdk(): Promise<S3Sdk>;
|
|
27
|
+
/**
|
|
28
|
+
* An `S3Client` built from `config` with the lazily-loaded SDK.
|
|
29
|
+
*
|
|
30
|
+
* Accepts: `config` — any `S3ClientConfig`; an explicit `maxAttempts` or
|
|
31
|
+
* `requestHandler` wins over the defaults below.
|
|
32
|
+
*
|
|
33
|
+
* Returns: the client. The caller owns it and destroys it.
|
|
34
|
+
*
|
|
35
|
+
* Throws: whatever {@link loadS3Sdk} throws.
|
|
36
|
+
*
|
|
37
|
+
* Guarantees: `maxAttempts` defaults to 1, so the SDK performs no retries of
|
|
38
|
+
* its own and this library's retry, backoff and classification are the only
|
|
39
|
+
* retry layer — the same default `resolveDynamoDBClient` applies on the
|
|
40
|
+
* DynamoDB side. A default request handler bounds a transfer that has
|
|
41
|
+
* stalled, which `maxAttempts` alone does not; a `requestHandler` in `config`
|
|
42
|
+
* replaces it whole rather than merging with it.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createDefaultS3Client(config: S3ClientConfigLike): Promise<S3Client>;
|
|
45
|
+
export {};
|
|
@@ -1,24 +1,97 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides that the S3 SDK is loaded on first use, and how its client is set up.
|
|
4
|
+
*
|
|
5
|
+
* An adapter without offload never imports the optional peer; the first
|
|
6
|
+
* offload does, once, and a missing install surfaces as `VALIDATION` naming
|
|
7
|
+
* the remedy (record 1). The client built here defaults to no retries of its
|
|
8
|
+
* own — `maxAttempts: 1` — so this package's retry is the only layer unless a
|
|
9
|
+
* caller's own `maxAttempts` overrides it (record 14), and its idle timer
|
|
10
|
+
* bounds a stalled transfer without bounding a slow one.
|
|
11
|
+
*/
|
|
2
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
13
|
exports.loadS3Sdk = loadS3Sdk;
|
|
4
14
|
exports.createDefaultS3Client = createDefaultS3Client;
|
|
15
|
+
const client_1 = require("../../dynamodb/client");
|
|
16
|
+
const errors_1 = require("../../errors/errors");
|
|
17
|
+
/** Codes Node and bundlers use for an import that cannot be resolved. */
|
|
18
|
+
const MISSING_MODULE_CODES = ['ERR_MODULE_NOT_FOUND', 'MODULE_NOT_FOUND'];
|
|
5
19
|
let sdkPromise;
|
|
6
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Convert a failed import of the optional peer into a typed error that names
|
|
22
|
+
* the remedy. Any other failure (a broken build, a syntax error inside the
|
|
23
|
+
* package) passes through unchanged.
|
|
24
|
+
*/
|
|
25
|
+
function wrapMissingPeer(error) {
|
|
26
|
+
const code = error.code;
|
|
27
|
+
if (code !== undefined && MISSING_MODULE_CODES.includes(code)) {
|
|
28
|
+
throw (0, errors_1.validationError)('S3 offload requires the optional peer @aws-sdk/client-s3 (npm install @aws-sdk/client-s3); ' +
|
|
29
|
+
'bundlers must keep it installed or external', 's3', error);
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The optional `@aws-sdk/client-s3` peer, imported on first use.
|
|
35
|
+
*
|
|
36
|
+
* Accepts: nothing. Concurrent callers share one import.
|
|
37
|
+
*
|
|
38
|
+
* Returns: the module, cached for every later call.
|
|
39
|
+
*
|
|
40
|
+
* Throws: `VALIDATION` naming `s3` when the package is not installed,
|
|
41
|
+
* carrying the install command; any other import failure — a broken build, a
|
|
42
|
+
* syntax error inside the package — passes through unchanged. A failure is not
|
|
43
|
+
* cached, so an install or a fixed bundle succeeds on a later call.
|
|
44
|
+
*/
|
|
7
45
|
async function loadS3Sdk() {
|
|
8
46
|
if (!sdkPromise) {
|
|
9
|
-
sdkPromise = import('@aws-sdk/client-s3')
|
|
47
|
+
sdkPromise = import('@aws-sdk/client-s3').catch((error) => {
|
|
48
|
+
sdkPromise = undefined;
|
|
49
|
+
return wrapMissingPeer(error);
|
|
50
|
+
});
|
|
10
51
|
}
|
|
11
52
|
return sdkPromise;
|
|
12
53
|
}
|
|
13
54
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
55
|
+
* An `S3Client` built from `config` with the lazily-loaded SDK.
|
|
56
|
+
*
|
|
57
|
+
* Accepts: `config` — any `S3ClientConfig`; an explicit `maxAttempts` or
|
|
58
|
+
* `requestHandler` wins over the defaults below.
|
|
59
|
+
*
|
|
60
|
+
* Returns: the client. The caller owns it and destroys it.
|
|
61
|
+
*
|
|
62
|
+
* Throws: whatever {@link loadS3Sdk} throws.
|
|
63
|
+
*
|
|
64
|
+
* Guarantees: `maxAttempts` defaults to 1, so the SDK performs no retries of
|
|
65
|
+
* its own and this library's retry, backoff and classification are the only
|
|
66
|
+
* retry layer — the same default `resolveDynamoDBClient` applies on the
|
|
67
|
+
* DynamoDB side. A default request handler bounds a transfer that has
|
|
68
|
+
* stalled, which `maxAttempts` alone does not; a `requestHandler` in `config`
|
|
69
|
+
* replaces it whole rather than merging with it.
|
|
19
70
|
*/
|
|
20
71
|
async function createDefaultS3Client(config) {
|
|
21
72
|
const { S3Client: S3ClientCtor } = await loadS3Sdk();
|
|
22
|
-
|
|
73
|
+
// One field, where the DynamoDB client gets three, and the asymmetry is
|
|
74
|
+
// deliberate. `requestTimeout` bounds request creation until response
|
|
75
|
+
// *headers* arrive, and a `PutObject`'s headers arrive only once the whole
|
|
76
|
+
// body has been uploaded — so here it would be a bound on upload duration,
|
|
77
|
+
// over payloads running from the offload threshold to the download cap, and
|
|
78
|
+
// a legitimate large upload on a slow link would be destroyed for being
|
|
79
|
+
// slow. `socketTimeout` is an idle timer that any activity in either
|
|
80
|
+
// direction resets, so it separates a stalled transfer from a slow one.
|
|
81
|
+
// `throwOnRequestTimeout` is absent because without a request timeout it has
|
|
82
|
+
// nothing to act on, and `connectionTimeout` because its timer counts the
|
|
83
|
+
// wait behind the agent's sockets, which this path fans out across.
|
|
84
|
+
//
|
|
85
|
+
// What this bounds is a transfer stalled after its socket was assigned, not
|
|
86
|
+
// the whole attempt: nothing here bounds the time a request spends queued
|
|
87
|
+
// for a socket, and an idle timer is not a deadline, so a large upload's
|
|
88
|
+
// total duration stays unbounded. At or above 2 MiB the SDK sends
|
|
89
|
+
// `Expect: 100-continue` and the handler then waits six seconds for the
|
|
90
|
+
// continue on a throwaway agent, so the five-second idle timer is what
|
|
91
|
+
// fires first — the one place the two timers race.
|
|
92
|
+
return new S3ClientCtor({
|
|
93
|
+
maxAttempts: 1,
|
|
94
|
+
requestHandler: { socketTimeout: client_1.DEFAULT_SOCKET_TIMEOUT_MS },
|
|
95
|
+
...config,
|
|
96
|
+
});
|
|
23
97
|
}
|
|
24
|
-
//# sourceMappingURL=client.js.map
|