@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
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how much of an unchecked string a line may quote.
|
|
4
|
+
*
|
|
5
|
+
* A log line or public error message that quotes a string this package did
|
|
6
|
+
* not length-check passes it through here. The caps for an identifier, for a
|
|
7
|
+
* relayed cause's prose and for a list of labels, and the mark that states a
|
|
8
|
+
* cut value's real length, are chosen here, so a call site says what kind of
|
|
9
|
+
* value it quotes and never how many characters it keeps.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MAX_RELAYED_MESSAGE_CHARS = exports.MAX_LOGGED_LABELS = exports.MAX_LOGGED_VALUE_CHARS = void 0;
|
|
13
|
+
exports.truncateForLog = truncateForLog;
|
|
14
|
+
exports.truncateRelayedText = truncateRelayedText;
|
|
15
|
+
exports.truncateLabelsForLog = truncateLabelsForLog;
|
|
16
|
+
/**
|
|
17
|
+
* Characters of an unchecked string one log line or one public error message
|
|
18
|
+
* carries, past which it is cut and marked with its real length.
|
|
19
|
+
*
|
|
20
|
+
* Most of what these lines quote is a row's sort key or an offloaded object's
|
|
21
|
+
* S3 key, so the service already caps each at 1024 bytes — the cost is not one
|
|
22
|
+
* long line but many. `list: skipped a row that is not a checkpoint meta item`
|
|
23
|
+
* and `left a foreign row in place` fire once per row, and those passes walk a
|
|
24
|
+
* whole partition, up to `MAX_TOTAL_ROWS_IN_MEMORY`
|
|
25
|
+
* (`src/shared/dynamodb/paginate.ts`) rows: one call on a shared table could
|
|
26
|
+
* write megabytes of log. A consumer's `VectorBackend` carries no such service
|
|
27
|
+
* cap at all.
|
|
28
|
+
*
|
|
29
|
+
* 256 is `MAX_KEY_SEGMENT_BYTES` (`src/shared/dynamodb/table-schema.ts`), this
|
|
30
|
+
* package's own budget for one identifier inside a key, so any key composed
|
|
31
|
+
* from identifiers it validated is quoted whole in the common case and only a
|
|
32
|
+
* foreign row, a hand-written one or a backend's own answer — exactly the
|
|
33
|
+
* cases these lines report — is cut. Nothing is lost by cutting: the line's
|
|
34
|
+
* job is to say which row to go and look at, and the row holds the rest.
|
|
35
|
+
*/
|
|
36
|
+
exports.MAX_LOGGED_VALUE_CHARS = 256;
|
|
37
|
+
/**
|
|
38
|
+
* Labels of an unchecked `string[]` one log line or one public error message
|
|
39
|
+
* carries, past which the rest are dropped and the real depth is stated.
|
|
40
|
+
*
|
|
41
|
+
* An array is two unbounded things — how many labels there are and how long
|
|
42
|
+
* each one is — so a bound on the labels alone is not a bound: a backend
|
|
43
|
+
* answering with one label of a megabyte and one answering with a million
|
|
44
|
+
* labels of a character cost the same line. {@link MAX_LOGGED_VALUE_CHARS}
|
|
45
|
+
* covers the first, this covers the second.
|
|
46
|
+
*
|
|
47
|
+
* 8 is a budget rather than a rule about namespaces: a store namespace is a
|
|
48
|
+
* path, what identifies which path is its leading labels, and every namespace
|
|
49
|
+
* this package's own documentation forms is two or three deep. The marker
|
|
50
|
+
* states the depth it really had, so a deeper one is cut without being
|
|
51
|
+
* misreported.
|
|
52
|
+
*
|
|
53
|
+
* A `namespace` and `key` pair that passed `parseStoreAddress` needs none of
|
|
54
|
+
* this and goes in whole: that check measures the sort key they *compose*, so
|
|
55
|
+
* it bounds how many labels there are as well as how long each one is. A
|
|
56
|
+
* search or listing **prefix** passes no such check — nothing composes it into
|
|
57
|
+
* a key — so its depth is unchecked however carefully each label was checked,
|
|
58
|
+
* and a backend's own answer is unchecked in both.
|
|
59
|
+
*/
|
|
60
|
+
exports.MAX_LOGGED_LABELS = 8;
|
|
61
|
+
/**
|
|
62
|
+
* Characters of a relayed *cause's* text one public error message or one log
|
|
63
|
+
* line carries, past which it is cut and marked with its real length.
|
|
64
|
+
*
|
|
65
|
+
* Its own cap rather than {@link MAX_LOGGED_VALUE_CHARS} because the two bound
|
|
66
|
+
* different things. That one bounds an **identifier** — a sort key, an S3
|
|
67
|
+
* object key, a namespace label — and 256 is this package's own budget for one
|
|
68
|
+
* identifier inside a key, so a value past it is already abnormal and the line
|
|
69
|
+
* only has to say which row to go and look at. This one bounds **prose**: the
|
|
70
|
+
* sentence an AWS SDK error, a consumer's `VectorBackend` or a caller's own
|
|
71
|
+
* `serde` wrote to explain a failure, which `redactedMessage` relays into
|
|
72
|
+
* `err.message`. Cutting that at an identifier's budget would throw away the
|
|
73
|
+
* half of a diagnostic that says what to do about it, and a diagnostic is the
|
|
74
|
+
* entire value of relaying it at all.
|
|
75
|
+
*
|
|
76
|
+
* 1024 is measured against the longest text this package actually relays: an
|
|
77
|
+
* IAM `AccessDenied`, which names the calling principal's ARN, the action and
|
|
78
|
+
* the resource ARN and then says why no policy allows it, runs to the mid
|
|
79
|
+
* hundreds of characters, and a role ARN with a long path and a session name
|
|
80
|
+
* pushes it further. 1024 clears that whole, so the case an operator most
|
|
81
|
+
* needs to read arrives intact.
|
|
82
|
+
*
|
|
83
|
+
* What it is *for* is the other direction. `redactedMessage` also relays a
|
|
84
|
+
* **caller's own** thrown error — a `serde` refusing a value, a `vectorBackend`
|
|
85
|
+
* rejecting a query — whose length the caller controls entirely, and those
|
|
86
|
+
* messages are quoted once per row on paths that walk a whole prefix or table.
|
|
87
|
+
* Unbounded, one such error fills a log; at 1024 a thousand of them are a
|
|
88
|
+
* megabyte rather than an unbounded amount.
|
|
89
|
+
*
|
|
90
|
+
* Its own literal at the same value as `MAX_SORT_KEY_BYTES`
|
|
91
|
+
* (`src/shared/dynamodb/table-schema.ts`) and `MAX_S3_KEY_BYTES`
|
|
92
|
+
* (`src/shared/codec/s3/config.ts`) rather than an alias of either, for the
|
|
93
|
+
* reason `LIST_SCAN_WARN_THRESHOLD` (`src/shared/dynamodb/paginate.ts`)
|
|
94
|
+
* records: aliasing two caps would move one whenever the other is retuned,
|
|
95
|
+
* and these three answer unrelated questions.
|
|
96
|
+
*/
|
|
97
|
+
exports.MAX_RELAYED_MESSAGE_CHARS = 1024;
|
|
98
|
+
/** True for the high half of a surrogate pair, whose low half follows it. */
|
|
99
|
+
function isHighSurrogate(unit) {
|
|
100
|
+
return unit >= 0xd800 && unit <= 0xdbff;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The cut itself, shared by both caps so one value can never be marked twice
|
|
104
|
+
* with two different lengths.
|
|
105
|
+
*
|
|
106
|
+
* `max` is a character count. A value at or under it comes back identical; a
|
|
107
|
+
* longer one comes back as `max` characters — one fewer when that would split
|
|
108
|
+
* a surrogate pair — followed by `…(len N)` giving the length it really had.
|
|
109
|
+
*/
|
|
110
|
+
function cutTo(value, max) {
|
|
111
|
+
if (typeof value !== 'string' || value.length <= max)
|
|
112
|
+
return value;
|
|
113
|
+
const last = value.charCodeAt(max - 1);
|
|
114
|
+
const kept = isHighSurrogate(last) ? max - 1 : max;
|
|
115
|
+
return `${value.slice(0, kept)}…(len ${value.length})`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Bound a string this package did not length-check.
|
|
119
|
+
*
|
|
120
|
+
* **The rule, in one sentence:** a string goes through here before a log line
|
|
121
|
+
* or a public error message quotes it, unless this package composed it from
|
|
122
|
+
* identifiers it length-checked. Where the string came from does not decide
|
|
123
|
+
* it — a row, a bucket's own configuration, a consumer's `VectorBackend` and
|
|
124
|
+
* an object the caller handed in are the same thing here, which is that
|
|
125
|
+
* nothing bounded them. A caller's `sessionId`, `threadId`, `namespace` and
|
|
126
|
+
* `key`, and every key built from them, are capped by
|
|
127
|
+
* `MAX_PARTITION_ID_BYTES`, `MAX_KEY_SEGMENT_BYTES` and `MAX_SORT_KEY_BYTES`
|
|
128
|
+
* before a request is made, so those go in as they are; a row's own `SK`, an
|
|
129
|
+
* offloaded object's key, a descriptor's `location`, a backend's `namespace`
|
|
130
|
+
* and `key`, a lifecycle rule's scope and a stored message's `type` are
|
|
131
|
+
* bounded by nothing this package ran.
|
|
132
|
+
*
|
|
133
|
+
* **It says "or a public error message" for one reason:** one value must not
|
|
134
|
+
* get two answers. An `s3Key` off a row was cut for the `warn` that reports
|
|
135
|
+
* refusing to delete the object and quoted whole by the error that refuses to
|
|
136
|
+
* read it — one package, one value, two answers. An error's text is not the
|
|
137
|
+
* compatibility surface (the README tells callers to branch on `code`, `name`
|
|
138
|
+
* and the structured fields, never on text) and the `context` those errors
|
|
139
|
+
* carry keeps the value whole, so what reads an error as data loses nothing
|
|
140
|
+
* by this.
|
|
141
|
+
*
|
|
142
|
+
* Accepts: `value` — the string as whatever produced it carried it. Declared
|
|
143
|
+
* `string` because a table's own key attributes always are, and because the
|
|
144
|
+
* interfaces a consumer implements say so; anything else is returned
|
|
145
|
+
* untouched rather than coerced or refused, since a report of a value that is
|
|
146
|
+
* already wrong is the last place to raise a `TypeError` of its own.
|
|
147
|
+
*
|
|
148
|
+
* Returns: the value unchanged at or under {@link MAX_LOGGED_VALUE_CHARS}
|
|
149
|
+
* characters, otherwise that many characters followed by `…(len N)` giving the
|
|
150
|
+
* length it really had. The mark is what keeps a cut value honest: without it
|
|
151
|
+
* a truncated key reads as a key that simply ends there.
|
|
152
|
+
*
|
|
153
|
+
* Throws: nothing.
|
|
154
|
+
*
|
|
155
|
+
* Guarantees: a cut never falls between the halves of a surrogate pair, so a
|
|
156
|
+
* well-formed value stays well-formed. A lone surrogate is what
|
|
157
|
+
* `assertWellFormed` exists to keep out of this package's strings, and a JSON
|
|
158
|
+
* log transport rewrites one to U+FFFD without saying so.
|
|
159
|
+
*/
|
|
160
|
+
function truncateForLog(value) {
|
|
161
|
+
return cutTo(value, exports.MAX_LOGGED_VALUE_CHARS);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Bound the **prose** of a relayed cause, which takes its own cap.
|
|
165
|
+
*
|
|
166
|
+
* {@link truncateForLog} bounds an identifier, where 256 characters is this
|
|
167
|
+
* package's own budget for one and anything past it is already abnormal. The
|
|
168
|
+
* text an AWS SDK error, a consumer's `VectorBackend` or a caller's own
|
|
169
|
+
* `serde` wrote is a sentence rather than a name: cut at an identifier's
|
|
170
|
+
* budget it loses the half that says what to do, which is the only reason to
|
|
171
|
+
* relay it. {@link MAX_RELAYED_MESSAGE_CHARS} records what the larger number
|
|
172
|
+
* is measured against, and why the two differ.
|
|
173
|
+
*
|
|
174
|
+
* It has exactly one caller — `redactedMessage`, the funnel every `catch` in
|
|
175
|
+
* this package goes through — so no call site can get the cap wrong and no
|
|
176
|
+
* future one has to remember it. That also means a site must not cut the
|
|
177
|
+
* result again: a second cut marks the length of the first cut's output rather
|
|
178
|
+
* than of the original, which is the one thing the mark exists to prevent.
|
|
179
|
+
*
|
|
180
|
+
* Accepts: `value` — the redacted text. Redaction runs first, so a credential
|
|
181
|
+
* shape can never be half-cut past the pattern that would have caught it.
|
|
182
|
+
*
|
|
183
|
+
* Returns: the value unchanged at or under the cap, otherwise that many
|
|
184
|
+
* characters followed by `…(len N)`.
|
|
185
|
+
*
|
|
186
|
+
* Throws: nothing.
|
|
187
|
+
*/
|
|
188
|
+
function truncateRelayedText(value) {
|
|
189
|
+
return cutTo(value, exports.MAX_RELAYED_MESSAGE_CHARS);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Bound a list of labels — a store `namespace`, a list of channel names — the
|
|
193
|
+
* same rule reaches.
|
|
194
|
+
*
|
|
195
|
+
* An array is two unbounded things, how many labels it holds and how long each
|
|
196
|
+
* one is, so a bound on one of them is not a bound. {@link truncateForLog}
|
|
197
|
+
* covers the labels; the count is covered here.
|
|
198
|
+
*
|
|
199
|
+
* A `namespace` and `key` pair that passed `parseStoreAddress` is already
|
|
200
|
+
* bounded in both — that check measures the sort key they compose — and goes
|
|
201
|
+
* in whole. A search or listing prefix is not: nothing composes it into a key,
|
|
202
|
+
* so however carefully each label was checked, how many there are was not.
|
|
203
|
+
*
|
|
204
|
+
* The labels stay a list rather than being joined into one string, for two
|
|
205
|
+
* reasons. A structured transport already carries the field as a list and the
|
|
206
|
+
* README's Logging table documents it as one, so joining would change the
|
|
207
|
+
* shape of a line rather than only its size. And a label nothing validated may
|
|
208
|
+
* hold the `#` a join would put between labels, so a joined line cannot say
|
|
209
|
+
* whether the backend answered with one label or with two — which is the very
|
|
210
|
+
* thing these lines report.
|
|
211
|
+
*
|
|
212
|
+
* Accepts: `labels` — as the row, the backend or the caller gave it. Declared
|
|
213
|
+
* `string[]` because that is what the interfaces say; anything else is
|
|
214
|
+
* returned untouched, for the reason {@link truncateForLog} gives, and that
|
|
215
|
+
* case is reached rather than defensive — a `namespace` that is not an array
|
|
216
|
+
* is one of the things `parseStoreAddress` refuses, and the line reporting the
|
|
217
|
+
* refusal quotes what was refused.
|
|
218
|
+
*
|
|
219
|
+
* Returns: at most {@link MAX_LOGGED_LABELS} labels, each bounded by
|
|
220
|
+
* {@link truncateForLog}, with one further label reading `…(len N)` when some
|
|
221
|
+
* were dropped, giving the depth the list really had. A list within both
|
|
222
|
+
* bounds comes back as an equal list.
|
|
223
|
+
*
|
|
224
|
+
* Throws: nothing.
|
|
225
|
+
*/
|
|
226
|
+
function truncateLabelsForLog(labels) {
|
|
227
|
+
if (!Array.isArray(labels))
|
|
228
|
+
return labels;
|
|
229
|
+
const kept = labels.slice(0, exports.MAX_LOGGED_LABELS).map((label) => truncateForLog(label));
|
|
230
|
+
return labels.length > exports.MAX_LOGGED_LABELS ? [...kept, `…(len ${labels.length})`] : kept;
|
|
231
|
+
}
|
package/dist/shared/options.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Hides which options every adapter shares.
|
|
3
|
+
*
|
|
4
|
+
* The table, the client, the ttl, the logger, the retry policy, the recency
|
|
5
|
+
* index, the read concurrency, the codec options and per-call cancellation are
|
|
6
|
+
* declared once here, so the checkpointer, the store and the history accept
|
|
7
|
+
* the same keys with the same meaning, and an adapter-wide option is added in
|
|
8
|
+
* one place. This module holds their types only; checking them is elsewhere.
|
|
9
|
+
*/
|
|
10
|
+
import type { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
3
11
|
import type { CompressionConfig } from './codec/compression';
|
|
4
12
|
import type { S3OffloadConfig } from './codec/s3/config';
|
|
13
|
+
import type { DynamoDBDocumentLike } from './dynamodb/client';
|
|
14
|
+
import type { RetryPolicy } from './dynamodb/retry';
|
|
5
15
|
import type { Logger } from './logging/logger';
|
|
6
16
|
import type { TtlOption } from './validation/ttl';
|
|
7
17
|
/**
|
|
@@ -12,15 +22,53 @@ export interface BaseAdapterOptions {
|
|
|
12
22
|
/** DynamoDB table name. */
|
|
13
23
|
tableName: string;
|
|
14
24
|
/** Pre-built DocumentClient to reuse; when set, the adapter does not own it. */
|
|
15
|
-
client?:
|
|
16
|
-
/**
|
|
25
|
+
client?: DynamoDBDocumentLike;
|
|
26
|
+
/** The config a client is built from when `client` is not provided. */
|
|
17
27
|
clientConfig?: DynamoDBClientConfig;
|
|
18
|
-
/** Factory seam for constructing the underlying client (testing). */
|
|
19
|
-
createClient?: (config: DynamoDBClientConfig) => DynamoDBClient;
|
|
20
28
|
/** Optional time-to-live applied to written items. */
|
|
21
29
|
ttl?: TtlOption;
|
|
22
30
|
/** Optional per-instance logger (defaults to a silent logger). */
|
|
23
31
|
logger?: Logger;
|
|
32
|
+
/** Retry budget and backoff for every DynamoDB call (see the README "Retries and backoff"). */
|
|
33
|
+
retry?: RetryPolicy;
|
|
34
|
+
/**
|
|
35
|
+
* Index partitions per adapter in the recency index (GSI1), default 8.
|
|
36
|
+
*
|
|
37
|
+
* Rows carry the index attributes whether or not the table defines the
|
|
38
|
+
* index, so enabling it later needs no rewrite of new rows — only a backfill
|
|
39
|
+
* of the old ones. The value is fixed at table creation: changing it changes
|
|
40
|
+
* every row's shard, so an existing index must be backfilled again.
|
|
41
|
+
*
|
|
42
|
+
* A single index partition per adapter would concentrate every listing on
|
|
43
|
+
* one partition, which is worse than the table scan it replaces.
|
|
44
|
+
*/
|
|
45
|
+
indexShards?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Name of the recency index (a GSI on `gsi1pk`/`gsi1sk`) on this table.
|
|
48
|
+
*
|
|
49
|
+
* Opt-in on purpose: whether the table carries the index is deployment
|
|
50
|
+
* configuration the operator knows, and probing for it would spend a failed
|
|
51
|
+
* request per process to find out. Naming it switches two listings that
|
|
52
|
+
* would otherwise scan the whole table onto a read of the index, newest
|
|
53
|
+
* first: `history.listSessions`, which pages it by cursor, and a
|
|
54
|
+
* `saver.list` without a `thread_id`, which streams it and takes no cursor.
|
|
55
|
+
* Leaving it unset keeps both on the table scan, so the index can be created
|
|
56
|
+
* and backfilled before any adapter reads it.
|
|
57
|
+
*/
|
|
58
|
+
indexName?: string;
|
|
59
|
+
/**
|
|
60
|
+
* How many payloads a single call decodes at once, default 8.
|
|
61
|
+
*
|
|
62
|
+
* It is the multiplier on this package's memory ceiling, which is
|
|
63
|
+
* `readConcurrency × (s3.maxDownloadBytes + compression.maxDecompressedBytes)`
|
|
64
|
+
* — a downloaded object and its decompressed form are both resident while a
|
|
65
|
+
* payload is decoded, and that much can be in flight for each concurrent
|
|
66
|
+
* decode. Lower it on a small container; raising it trades memory for
|
|
67
|
+
* latency on reads that fetch many offloaded payloads.
|
|
68
|
+
*
|
|
69
|
+
* It also bounds how many recency-index shards one listing queries at once.
|
|
70
|
+
*/
|
|
71
|
+
readConcurrency?: number;
|
|
24
72
|
}
|
|
25
73
|
/** Options enabling payload compression and/or S3 offloading. */
|
|
26
74
|
export interface CodecOptions {
|
|
@@ -29,4 +77,8 @@ export interface CodecOptions {
|
|
|
29
77
|
/** S3 offload configuration for payloads over DynamoDB's item limit. */
|
|
30
78
|
s3?: S3OffloadConfig;
|
|
31
79
|
}
|
|
32
|
-
|
|
80
|
+
/** Per-call cancellation for the long-running adapter methods. */
|
|
81
|
+
export interface CancelOptions {
|
|
82
|
+
/** Aborting it rejects the call with an `ABORTED` error at the next wait. */
|
|
83
|
+
signal?: AbortSignal;
|
|
84
|
+
}
|
package/dist/shared/options.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides which options every adapter shares.
|
|
4
|
+
*
|
|
5
|
+
* The table, the client, the ttl, the logger, the retry policy, the recency
|
|
6
|
+
* index, the read concurrency, the codec options and per-call cancellation are
|
|
7
|
+
* declared once here, so the checkpointer, the store and the history accept
|
|
8
|
+
* the same keys with the same meaning, and an adapter-wide option is added in
|
|
9
|
+
* one place. This module holds their types only; checking them is elsewhere.
|
|
10
|
+
*/
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=options.js.map
|
package/dist/shared/ulid.d.ts
CHANGED
|
@@ -1,10 +1,80 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* Hides how a sortable, unique id is made from the clock and random bytes.
|
|
3
|
+
*
|
|
4
|
+
* A caller gets ids whose byte order is their creation order, and a prefix
|
|
5
|
+
* that bounds every id from a given millisecond, without knowing the alphabet,
|
|
6
|
+
* the width of the time field or where the randomness comes from. One
|
|
7
|
+
* generator's ids strictly increase whatever the clock does, and
|
|
8
|
+
* `ulidTimePrefix` refuses a millisecond the encoding cannot hold rather than
|
|
9
|
+
* wrapping it, so a caller building a bound from a raw millisecond cannot be
|
|
10
|
+
* handed a silently wrong one.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* One past the last millisecond ten base-32 characters can hold: `32^10`,
|
|
14
|
+
* which is `2^50`, and lands in the year 37648. Derived rather than written
|
|
15
|
+
* down, so widening {@link TIME_CHARS} moves the rule with it.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ULID_TIME_RANGE_MS: number;
|
|
18
|
+
/**
|
|
19
|
+
* A CSPRNG-backed `rng` seam.
|
|
20
|
+
*
|
|
21
|
+
* Accepts: nothing. Each returned generator owns its own pool.
|
|
22
|
+
*
|
|
23
|
+
* Returns: a function yielding uniform values in `[0, 1)`, one byte per call,
|
|
24
|
+
* refilling from `crypto.randomBytes` every {@link RNG_POOL_BYTES} — so a burst
|
|
25
|
+
* of ids costs one syscall per 256 digits rather than one per digit.
|
|
26
|
+
*
|
|
27
|
+
* Throws: whatever `crypto.randomBytes` throws when the platform has no entropy.
|
|
28
|
+
*
|
|
29
|
+
* Guarantees: a digit drawn as `floor(rng() * 32)` is uniform over 0..31 —
|
|
30
|
+
* 256 is a whole multiple of 32, so there is no modulo bias. `Math.random`
|
|
31
|
+
* would order and disambiguate just as well but is not a cryptographically
|
|
32
|
+
* secure source, which the ULID spec asks for in identifier generation.
|
|
33
|
+
*/
|
|
34
|
+
export declare function secureRng(): () => number;
|
|
35
|
+
/**
|
|
36
|
+
* The 10 time characters every ULID generated at `timeMs` starts with.
|
|
37
|
+
*
|
|
38
|
+
* Accepts: `timeMs` — epoch milliseconds inside `[0, {@link
|
|
39
|
+
* ULID_TIME_RANGE_MS})`, which is every instant the ten characters can encode.
|
|
40
|
+
*
|
|
41
|
+
* Returns: the prefix, usable as a sort-key bound — every id from that
|
|
42
|
+
* millisecond onward sorts at or after it, every earlier id before it.
|
|
43
|
+
*
|
|
44
|
+
* Throws: `VALIDATION` for a millisecond outside the range, naming no field:
|
|
45
|
+
* no caller-supplied option is at fault here, and the rule a caller meets is
|
|
46
|
+
* `parseMessageWindow`'s, which names `before`. This guard is the invariant
|
|
47
|
+
* underneath it, so no second caller can rebuild the bound that broke.
|
|
48
|
+
*
|
|
49
|
+
* Guarantees: exactly ten characters, all of them from the ULID alphabet.
|
|
50
|
+
* Neither held before. A negative millisecond took a negative remainder into
|
|
51
|
+
* the alphabet and yielded `undefined` per character, so the bound read
|
|
52
|
+
* `undefinedundefined…` — which sorts *above* every real id, since `u` and `d`
|
|
53
|
+
* are both above `Z` — and a window asking for messages before 1969 matched
|
|
54
|
+
* the whole conversation instead of none of it. A millisecond at or past the
|
|
55
|
+
* range wrapped to `0000000000` and matched nothing at all. Both are garbage
|
|
56
|
+
* indistinguishable from a real answer, so both are refused rather than
|
|
57
|
+
* clamped: clamping would hand back the same wrong page under a different
|
|
58
|
+
* name.
|
|
59
|
+
*/
|
|
60
|
+
export declare function ulidTimePrefix(timeMs: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* A monotonic ULID generator.
|
|
63
|
+
*
|
|
64
|
+
* Accepts: `now` — epoch milliseconds, default `Date.now`. `rng` — values in
|
|
65
|
+
* `[0, 1)`, default {@link secureRng}. Both are seams for deterministic tests.
|
|
66
|
+
*
|
|
67
|
+
* Returns: a function yielding lexicographically sortable 26-character ids
|
|
68
|
+
* whose first 10 characters encode the millisecond.
|
|
69
|
+
*
|
|
70
|
+
* Throws: whatever `rng` throws.
|
|
71
|
+
*
|
|
72
|
+
* Guarantees: ids from **one** generator strictly increase, whatever the clock
|
|
73
|
+
* does. A clock that advances starts a fresh random component; a clock that
|
|
74
|
+
* stalls or regresses reuses the last timestamp and increments that component;
|
|
75
|
+
* an increment that exhausts all 16 digits carries into the timestamp and draws
|
|
76
|
+
* fresh digits. Two generators — two processes, or two adapter instances —
|
|
77
|
+
* order only by their wall clocks at millisecond precision, so a lagging clock
|
|
78
|
+
* can sort a later id before an earlier one.
|
|
8
79
|
*/
|
|
9
80
|
export declare function createUlidFactory(now?: () => number, rng?: () => number): () => string;
|
|
10
|
-
//# sourceMappingURL=ulid.d.ts.map
|
package/dist/shared/ulid.js
CHANGED
|
@@ -1,10 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how a sortable, unique id is made from the clock and random bytes.
|
|
4
|
+
*
|
|
5
|
+
* A caller gets ids whose byte order is their creation order, and a prefix
|
|
6
|
+
* that bounds every id from a given millisecond, without knowing the alphabet,
|
|
7
|
+
* the width of the time field or where the randomness comes from. One
|
|
8
|
+
* generator's ids strictly increase whatever the clock does, and
|
|
9
|
+
* `ulidTimePrefix` refuses a millisecond the encoding cannot hold rather than
|
|
10
|
+
* wrapping it, so a caller building a bound from a raw millisecond cannot be
|
|
11
|
+
* handed a silently wrong one.
|
|
12
|
+
*/
|
|
2
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ULID_TIME_RANGE_MS = void 0;
|
|
15
|
+
exports.secureRng = secureRng;
|
|
16
|
+
exports.ulidTimePrefix = ulidTimePrefix;
|
|
3
17
|
exports.createUlidFactory = createUlidFactory;
|
|
18
|
+
const node_crypto_1 = require("node:crypto");
|
|
19
|
+
const errors_1 = require("./errors/errors");
|
|
4
20
|
const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
5
21
|
const ENCODING_LEN = 32;
|
|
6
22
|
const TIME_CHARS = 10;
|
|
7
23
|
const RANDOM_CHARS = 16;
|
|
24
|
+
/**
|
|
25
|
+
* One past the last millisecond ten base-32 characters can hold: `32^10`,
|
|
26
|
+
* which is `2^50`, and lands in the year 37648. Derived rather than written
|
|
27
|
+
* down, so widening {@link TIME_CHARS} moves the rule with it.
|
|
28
|
+
*/
|
|
29
|
+
exports.ULID_TIME_RANGE_MS = ENCODING_LEN ** TIME_CHARS;
|
|
30
|
+
/** Bytes drawn per refill of the {@link secureRng} pool: 16 ids per syscall. */
|
|
31
|
+
const RNG_POOL_BYTES = 256;
|
|
32
|
+
/**
|
|
33
|
+
* A CSPRNG-backed `rng` seam.
|
|
34
|
+
*
|
|
35
|
+
* Accepts: nothing. Each returned generator owns its own pool.
|
|
36
|
+
*
|
|
37
|
+
* Returns: a function yielding uniform values in `[0, 1)`, one byte per call,
|
|
38
|
+
* refilling from `crypto.randomBytes` every {@link RNG_POOL_BYTES} — so a burst
|
|
39
|
+
* of ids costs one syscall per 256 digits rather than one per digit.
|
|
40
|
+
*
|
|
41
|
+
* Throws: whatever `crypto.randomBytes` throws when the platform has no entropy.
|
|
42
|
+
*
|
|
43
|
+
* Guarantees: a digit drawn as `floor(rng() * 32)` is uniform over 0..31 —
|
|
44
|
+
* 256 is a whole multiple of 32, so there is no modulo bias. `Math.random`
|
|
45
|
+
* would order and disambiguate just as well but is not a cryptographically
|
|
46
|
+
* secure source, which the ULID spec asks for in identifier generation.
|
|
47
|
+
*/
|
|
48
|
+
function secureRng() {
|
|
49
|
+
let pool = Buffer.alloc(0);
|
|
50
|
+
let offset = 0;
|
|
51
|
+
return () => {
|
|
52
|
+
if (offset >= pool.length) {
|
|
53
|
+
pool = (0, node_crypto_1.randomBytes)(RNG_POOL_BYTES);
|
|
54
|
+
offset = 0;
|
|
55
|
+
}
|
|
56
|
+
const byte = pool[offset];
|
|
57
|
+
offset += 1;
|
|
58
|
+
return byte / 256;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
8
61
|
function encodeTime(timeMs) {
|
|
9
62
|
let remaining = Math.floor(timeMs);
|
|
10
63
|
let out = '';
|
|
@@ -14,6 +67,38 @@ function encodeTime(timeMs) {
|
|
|
14
67
|
}
|
|
15
68
|
return out;
|
|
16
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* The 10 time characters every ULID generated at `timeMs` starts with.
|
|
72
|
+
*
|
|
73
|
+
* Accepts: `timeMs` — epoch milliseconds inside `[0, {@link
|
|
74
|
+
* ULID_TIME_RANGE_MS})`, which is every instant the ten characters can encode.
|
|
75
|
+
*
|
|
76
|
+
* Returns: the prefix, usable as a sort-key bound — every id from that
|
|
77
|
+
* millisecond onward sorts at or after it, every earlier id before it.
|
|
78
|
+
*
|
|
79
|
+
* Throws: `VALIDATION` for a millisecond outside the range, naming no field:
|
|
80
|
+
* no caller-supplied option is at fault here, and the rule a caller meets is
|
|
81
|
+
* `parseMessageWindow`'s, which names `before`. This guard is the invariant
|
|
82
|
+
* underneath it, so no second caller can rebuild the bound that broke.
|
|
83
|
+
*
|
|
84
|
+
* Guarantees: exactly ten characters, all of them from the ULID alphabet.
|
|
85
|
+
* Neither held before. A negative millisecond took a negative remainder into
|
|
86
|
+
* the alphabet and yielded `undefined` per character, so the bound read
|
|
87
|
+
* `undefinedundefined…` — which sorts *above* every real id, since `u` and `d`
|
|
88
|
+
* are both above `Z` — and a window asking for messages before 1969 matched
|
|
89
|
+
* the whole conversation instead of none of it. A millisecond at or past the
|
|
90
|
+
* range wrapped to `0000000000` and matched nothing at all. Both are garbage
|
|
91
|
+
* indistinguishable from a real answer, so both are refused rather than
|
|
92
|
+
* clamped: clamping would hand back the same wrong page under a different
|
|
93
|
+
* name.
|
|
94
|
+
*/
|
|
95
|
+
function ulidTimePrefix(timeMs) {
|
|
96
|
+
if (!(timeMs >= 0 && timeMs < exports.ULID_TIME_RANGE_MS)) {
|
|
97
|
+
throw (0, errors_1.validationError)(`a ULID time prefix covers epoch milliseconds 0 to ${exports.ULID_TIME_RANGE_MS - 1} (the year ` +
|
|
98
|
+
`37648); ${timeMs} is outside it and has no ten-character encoding`);
|
|
99
|
+
}
|
|
100
|
+
return encodeTime(timeMs);
|
|
101
|
+
}
|
|
17
102
|
function randomDigits(rng) {
|
|
18
103
|
const digits = [];
|
|
19
104
|
for (let i = 0; i < RANDOM_CHARS; i++) {
|
|
@@ -33,14 +118,25 @@ function incrementDigits(digits) {
|
|
|
33
118
|
return { digits: next, overflowed: true };
|
|
34
119
|
}
|
|
35
120
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
121
|
+
* A monotonic ULID generator.
|
|
122
|
+
*
|
|
123
|
+
* Accepts: `now` — epoch milliseconds, default `Date.now`. `rng` — values in
|
|
124
|
+
* `[0, 1)`, default {@link secureRng}. Both are seams for deterministic tests.
|
|
125
|
+
*
|
|
126
|
+
* Returns: a function yielding lexicographically sortable 26-character ids
|
|
127
|
+
* whose first 10 characters encode the millisecond.
|
|
128
|
+
*
|
|
129
|
+
* Throws: whatever `rng` throws.
|
|
130
|
+
*
|
|
131
|
+
* Guarantees: ids from **one** generator strictly increase, whatever the clock
|
|
132
|
+
* does. A clock that advances starts a fresh random component; a clock that
|
|
133
|
+
* stalls or regresses reuses the last timestamp and increments that component;
|
|
134
|
+
* an increment that exhausts all 16 digits carries into the timestamp and draws
|
|
135
|
+
* fresh digits. Two generators — two processes, or two adapter instances —
|
|
136
|
+
* order only by their wall clocks at millisecond precision, so a lagging clock
|
|
137
|
+
* can sort a later id before an earlier one.
|
|
42
138
|
*/
|
|
43
|
-
function createUlidFactory(now = Date.now, rng =
|
|
139
|
+
function createUlidFactory(now = Date.now, rng = secureRng()) {
|
|
44
140
|
let lastTime = -1;
|
|
45
141
|
let lastRandom = [];
|
|
46
142
|
return () => {
|
|
@@ -62,4 +158,3 @@ function createUlidFactory(now = Date.now, rng = Math.random) {
|
|
|
62
158
|
return encodeTime(lastTime) + lastRandom.map((digit) => ENCODING[digit]).join('');
|
|
63
159
|
};
|
|
64
160
|
}
|
|
65
|
-
//# sourceMappingURL=ulid.js.map
|