@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,9 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides how a logger and a value are redacted.
|
|
4
|
+
*
|
|
5
|
+
* A redacting logger walks every argument of every line, bounded in depth and
|
|
6
|
+
* safe against cycles and hostile getters, and replaces the value of any key
|
|
7
|
+
* that looks like a secret and any text that looks like one; the same walk
|
|
8
|
+
* serves `redactSecrets` for a value a caller wants to log themselves.
|
|
9
|
+
*/
|
|
2
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
11
|
exports.redactSecrets = redactSecrets;
|
|
4
12
|
exports.redactLogger = redactLogger;
|
|
5
|
-
|
|
13
|
+
exports.walkObject = walkObject;
|
|
14
|
+
const errors_1 = require("../errors/errors");
|
|
15
|
+
const collaborators_1 = require("../validation/collaborators");
|
|
16
|
+
const option_shape_1 = require("../validation/option-shape");
|
|
17
|
+
const primitives_1 = require("../validation/primitives");
|
|
18
|
+
const logger_1 = require("./logger");
|
|
6
19
|
const secret_patterns_1 = require("./secret-patterns");
|
|
20
|
+
/** Substituted for a log argument whose redaction itself failed (a throwing getter, say). */
|
|
21
|
+
const UNREDACTABLE = '[UNREDACTABLE]';
|
|
22
|
+
/**
|
|
23
|
+
* Reject a list of value shapes this package could not apply.
|
|
24
|
+
*
|
|
25
|
+
* Accepts: `value` — the list as the caller gave it. `field` — what the error
|
|
26
|
+
* names.
|
|
27
|
+
*
|
|
28
|
+
* Returns: nothing: the value is kept under its declared type, and this
|
|
29
|
+
* checks it. An empty list is valid, and is how a caller turns value matching
|
|
30
|
+
* off.
|
|
31
|
+
*
|
|
32
|
+
* Throws: `VALIDATION` naming `field` for a non-array or an entry that is
|
|
33
|
+
* not a `RegExp`. {@link redactText} skips such an entry, which protects
|
|
34
|
+
* nothing while the caller believes it does, so it is refused where it is
|
|
35
|
+
* supplied instead.
|
|
36
|
+
*/
|
|
37
|
+
function assertRegExpArray(value, field) {
|
|
38
|
+
if (!Array.isArray(value) || value.some((entry) => !(0, secret_patterns_1.isRegExp)(entry))) {
|
|
39
|
+
throw (0, errors_1.validationError)(`${field} must be an array of RegExp`, field);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
7
42
|
/**
|
|
8
43
|
* Recursively clone `value`, replacing any value at a secret-looking key with
|
|
9
44
|
* `[REDACTED]` and any recognised secret *shape* inside a string — including an
|
|
@@ -17,44 +52,265 @@ const secret_patterns_1 = require("./secret-patterns");
|
|
|
17
52
|
* `stack` redacted and every other own property recursed like a plain object.
|
|
18
53
|
* `Date`/`RegExp` keep their identity rather than collapsing to `{}`,
|
|
19
54
|
* `Set`/`Map` render as their contents, and binary views become a short label.
|
|
20
|
-
*
|
|
55
|
+
*
|
|
56
|
+
* Accepts: `value` — any log argument, including `undefined`, a primitive, a
|
|
57
|
+
* typed `Error`, a class instance or a `Record`, so callers never cast. A
|
|
58
|
+
* cyclic or shared graph is fine; each node is walked once. `patterns` and
|
|
59
|
+
* `valuePatterns` — the key names and value shapes to redact, an array of
|
|
60
|
+
* strings and an array of `RegExp` respectively; both default to this
|
|
61
|
+
* package's own lists, and an empty one turns that rule off.
|
|
62
|
+
*
|
|
63
|
+
* Returns: a redacted clone. The input is never mutated — a logger that
|
|
64
|
+
* scrubbed the caller's own object would corrupt the very data the application
|
|
65
|
+
* is working with.
|
|
66
|
+
*
|
|
67
|
+
* Throws: `VALIDATION` naming `patterns` or `valuePatterns` for a list this
|
|
68
|
+
* function could not apply, which is a mistake in the call itself and is
|
|
69
|
+
* raised before anything is walked. Nothing after that: a value whose
|
|
70
|
+
* redaction fails — a throwing getter, a structure deep enough to exhaust the
|
|
71
|
+
* stack — is replaced whole by `[UNREDACTABLE]`, since a logger that throws
|
|
72
|
+
* takes down the operation it was only observing. {@link redactLogger}
|
|
73
|
+
* redacts one argument per call, so there a single hostile argument is what is
|
|
74
|
+
* lost rather than the record around it.
|
|
21
75
|
*/
|
|
22
76
|
function redactSecrets(value, patterns = secret_patterns_1.DEFAULT_SECRET_KEY_PATTERNS, valuePatterns = secret_patterns_1.DEFAULT_SECRET_VALUE_PATTERNS) {
|
|
23
|
-
|
|
77
|
+
(0, primitives_1.assertStringArray)(patterns, 'patterns');
|
|
78
|
+
assertRegExpArray(valuePatterns, 'valuePatterns');
|
|
79
|
+
// `walking` detects a cycle; `done` memoises a finished node. Both are
|
|
80
|
+
// needed and they answer different questions. A guard that only removed a
|
|
81
|
+
// node when its subtree finished is correct for cycles but re-walks every
|
|
82
|
+
// node reachable by more than one path, so a graph that merely *shares*
|
|
83
|
+
// structure — not even a cycle — costs exponential time: without `done`, a
|
|
84
|
+
// few dozen shared objects in a sub-kilobyte argument would block the event
|
|
85
|
+
// loop for minutes, and this is a public export reachable from caller code.
|
|
86
|
+
const walking = new WeakSet();
|
|
87
|
+
const done = new WeakMap();
|
|
24
88
|
const walk = (current) => {
|
|
25
89
|
if (typeof current === 'string')
|
|
26
90
|
return (0, secret_patterns_1.redactText)(current, valuePatterns);
|
|
27
91
|
if (current === null || typeof current !== 'object')
|
|
28
92
|
return current;
|
|
29
|
-
if (
|
|
93
|
+
if (done.has(current))
|
|
94
|
+
return done.get(current);
|
|
95
|
+
if (walking.has(current))
|
|
30
96
|
return '[Circular]';
|
|
31
|
-
|
|
97
|
+
walking.add(current);
|
|
32
98
|
try {
|
|
33
|
-
|
|
99
|
+
const redacted = walkObject(current, { keyPatterns: patterns, valuePatterns, walk });
|
|
100
|
+
done.set(current, redacted);
|
|
101
|
+
return redacted;
|
|
34
102
|
}
|
|
35
103
|
finally {
|
|
36
|
-
|
|
104
|
+
walking.delete(current);
|
|
37
105
|
}
|
|
38
106
|
};
|
|
39
|
-
|
|
107
|
+
try {
|
|
108
|
+
return walk(value);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Every failure of the walk yields the marker: a `RangeError` from nesting
|
|
112
|
+
// deeper than the stack holds, and equally a getter of the caller's own
|
|
113
|
+
// that throws. Telling the two apart served no caller. The value is being
|
|
114
|
+
// prepared for a log line, and the log line is typically written from a
|
|
115
|
+
// `catch`, so a throw here does not report the hostile value — it replaces
|
|
116
|
+
// the failure that was being reported with a `TypeError` about a getter.
|
|
117
|
+
return UNREDACTABLE;
|
|
118
|
+
}
|
|
40
119
|
}
|
|
41
120
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
121
|
+
* Reject redaction options that would silently fail to redact.
|
|
122
|
+
*
|
|
123
|
+
* A non-string in `extraKeys` reached `key.toLowerCase()` and raised a bare
|
|
124
|
+
* `TypeError` at the first log call; a non-`RegExp` in `extraValuePatterns` is
|
|
125
|
+
* skipped by {@link redactText} and would have protected nothing while the
|
|
126
|
+
* caller believed it did. An `options` that is not an object at all carried no
|
|
127
|
+
* rule to begin with, and was read as "none given", leaving the caller running
|
|
128
|
+
* on a default it believed it had overridden. All three are refused here,
|
|
129
|
+
* once, where they are configured.
|
|
130
|
+
*
|
|
131
|
+
* Accepts: `options` — as the caller gave it.
|
|
132
|
+
*
|
|
133
|
+
* Returns: nothing: the value is kept under its declared type, and this
|
|
134
|
+
* checks it.
|
|
135
|
+
*
|
|
136
|
+
* Throws: `VALIDATION` naming `options`, `extraKeys` or `extraValuePatterns`.
|
|
137
|
+
*/
|
|
138
|
+
function assertRedactionOptions(options) {
|
|
139
|
+
(0, option_shape_1.assertObjectShape)(options, 'options');
|
|
140
|
+
if (options.extraKeys !== undefined)
|
|
141
|
+
(0, primitives_1.assertStringArray)(options.extraKeys, 'extraKeys');
|
|
142
|
+
if (options.extraValuePatterns !== undefined) {
|
|
143
|
+
assertRegExpArray(options.extraValuePatterns, 'extraValuePatterns');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Wrap a logger so object args are redacted before delegation.
|
|
148
|
+
*
|
|
149
|
+
* Accepts: `inner` — the logger to delegate to; it must carry all four
|
|
150
|
+
* methods, because a missing one is a wiring mistake worth naming here rather
|
|
151
|
+
* than at the first log line. `options.extraKeys` — further key names to
|
|
152
|
+
* redact, matched like the defaults. `options.extraValuePatterns` — further
|
|
153
|
+
* secret shapes; each must be a `RegExp`, and it is applied globally whether or
|
|
154
|
+
* not it carries the `g` flag.
|
|
155
|
+
*
|
|
156
|
+
* Returns: a logger with the same four methods.
|
|
157
|
+
*
|
|
158
|
+
* Throws: `VALIDATION` naming `logger` or `logger.<method>` for a logger it
|
|
159
|
+
* could not delegate to, and `options`, `extraKeys` or `extraValuePatterns`
|
|
160
|
+
* for an option of the wrong type. Nothing at log time.
|
|
161
|
+
*
|
|
162
|
+
* Guarantees: the message string is passed through unchanged — never
|
|
163
|
+
* interpolate a secret into it — and every other argument is redacted before
|
|
164
|
+
* it reaches `inner`. Past the wrap call nothing escapes a log call: an
|
|
165
|
+
* argument whose redaction fails is replaced by a fixed marker, and a failure
|
|
166
|
+
* of `inner` itself is absorbed, because the
|
|
167
|
+
* operation that wrote the line was only observing itself and is commonly
|
|
168
|
+
* reporting some other failure already.
|
|
44
169
|
*/
|
|
45
170
|
function redactLogger(inner, options = {}) {
|
|
171
|
+
(0, collaborators_1.assertMembers)(inner, collaborators_1.LOGGER_MEMBERS, 'logger');
|
|
172
|
+
assertRedactionOptions(options);
|
|
46
173
|
const patterns = options.extraKeys
|
|
47
|
-
? [...secret_patterns_1.DEFAULT_SECRET_KEY_PATTERNS, ...options.extraKeys.map(
|
|
174
|
+
? [...secret_patterns_1.DEFAULT_SECRET_KEY_PATTERNS, ...options.extraKeys.map(secret_patterns_1.normaliseKey)]
|
|
48
175
|
: secret_patterns_1.DEFAULT_SECRET_KEY_PATTERNS;
|
|
49
176
|
const valuePatterns = options.extraValuePatterns
|
|
50
177
|
? [...secret_patterns_1.DEFAULT_SECRET_VALUE_PATTERNS, ...options.extraValuePatterns]
|
|
51
178
|
: secret_patterns_1.DEFAULT_SECRET_VALUE_PATTERNS;
|
|
52
|
-
const
|
|
179
|
+
const deliver = (method) => (message, ...args) => (0, logger_1.absorbLoggerFailure)(() => inner[method](message, ...args.map((arg) => redactSecrets(arg, patterns, valuePatterns))));
|
|
53
180
|
return {
|
|
54
|
-
info: (
|
|
55
|
-
warn: (
|
|
56
|
-
error: (
|
|
57
|
-
debug: (
|
|
181
|
+
info: deliver('info'),
|
|
182
|
+
warn: deliver('warn'),
|
|
183
|
+
error: deliver('error'),
|
|
184
|
+
debug: deliver('debug'),
|
|
58
185
|
};
|
|
59
186
|
}
|
|
60
|
-
|
|
187
|
+
/** True when `value` is a Set, tested by tag so a cross-realm Set still matches. */
|
|
188
|
+
function isSetValue(value) {
|
|
189
|
+
return Object.prototype.toString.call(value) === '[object Set]';
|
|
190
|
+
}
|
|
191
|
+
/** True when `value` is a Map, tested by tag so a cross-realm Map still matches. */
|
|
192
|
+
function isMapValue(value) {
|
|
193
|
+
return Object.prototype.toString.call(value) === '[object Map]';
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* True when `value` is an Error (or subclass) or a `DOMException` — which has
|
|
197
|
+
* its own tag yet carries the same `name`/`message`/`stack` — tested by tag,
|
|
198
|
+
* not `instanceof`, so a cross-realm error still matches.
|
|
199
|
+
*/
|
|
200
|
+
function isErrorValue(value) {
|
|
201
|
+
const tag = Object.prototype.toString.call(value);
|
|
202
|
+
return tag === '[object Error]' || tag === '[object DOMException]';
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* True for a value whose identity matters more than its own properties.
|
|
206
|
+
* `Date` and `RegExp` have none, so recursing either would yield a bare `{}`.
|
|
207
|
+
*/
|
|
208
|
+
function isOpaqueValue(value) {
|
|
209
|
+
const tag = Object.prototype.toString.call(value);
|
|
210
|
+
return tag === '[object Date]' || tag === '[object RegExp]';
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Rebuild entries into a plain object, redacting values at secret-looking
|
|
214
|
+
* keys. Properties are defined, not assigned: `out['__proto__'] = …` would
|
|
215
|
+
* replace the result's prototype (and drop the entry) instead of recording the
|
|
216
|
+
* key as data.
|
|
217
|
+
*/
|
|
218
|
+
function redactEntries(entries, keyPatterns, walk) {
|
|
219
|
+
const out = {};
|
|
220
|
+
for (const [key, value] of entries) {
|
|
221
|
+
Object.defineProperty(out, key, {
|
|
222
|
+
value: (0, secret_patterns_1.isSecretKey)(key, keyPatterns) ? secret_patterns_1.REDACTED : walk(value),
|
|
223
|
+
enumerable: true,
|
|
224
|
+
writable: true,
|
|
225
|
+
configurable: true,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* A Map's entries as an object. Keys are stringified so a non-string key is
|
|
232
|
+
* still reported rather than dropped — including as `[object Object]` for a
|
|
233
|
+
* plain-object key, which beats silently losing the entry — and each is
|
|
234
|
+
* checked against the secret-key patterns exactly as a plain object's own
|
|
235
|
+
* keys are.
|
|
236
|
+
*
|
|
237
|
+
* The annotation on `keyText` is `Redactable`'s own shape restated with an
|
|
238
|
+
* explicit `toString`, which every one of its members already has; it changes
|
|
239
|
+
* nothing about which key is what, only what `no-base-to-string` can see, so
|
|
240
|
+
* it stops mistaking the deliberate `[object Object]` case above for a bug.
|
|
241
|
+
*/
|
|
242
|
+
function redactMap(value, deps) {
|
|
243
|
+
const entries = [...value].map(([key, entry]) => {
|
|
244
|
+
const keyText = key;
|
|
245
|
+
return [String(keyText), entry];
|
|
246
|
+
});
|
|
247
|
+
return redactEntries(entries, deps.keyPatterns, deps.walk);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Rebuild an Error as a plain object carrying its redacted text alongside its
|
|
251
|
+
* redacted own properties. The one exception is an Error with no own
|
|
252
|
+
* enumerable data, no `cause`, no aggregated `errors`, and no secret in its
|
|
253
|
+
* text: it is returned by reference so its identity and stack trace survive,
|
|
254
|
+
* which is what keeps a caught error useful in a log.
|
|
255
|
+
*
|
|
256
|
+
* `cause` and `AggregateError.errors` are copied explicitly because both are
|
|
257
|
+
* defined *non-enumerable* per spec, so `Object.entries` never sees them.
|
|
258
|
+
* Without this the whole chain vanished on every rebuild — and the rebuild
|
|
259
|
+
* always fires for this library's own error types, since each attaches an
|
|
260
|
+
* enumerable `code`/`context`. A redacted `RETRY_EXHAUSTED` would then no
|
|
261
|
+
* longer say whether the underlying failure was a throttle, a validation error
|
|
262
|
+
* or a network fault, which is the entire reason it carries a cause. A bare
|
|
263
|
+
* Error *with* a cause is rebuilt for the same reason: passing it by reference
|
|
264
|
+
* would hand the caller whatever secret the cause carries. Recursing through
|
|
265
|
+
* `walk` redacts the chain too, and the cycle guard handles a cause that
|
|
266
|
+
* points back at its own wrapper.
|
|
267
|
+
*/
|
|
268
|
+
function redactError(current, entries, deps) {
|
|
269
|
+
const text = (0, secret_patterns_1.redactErrorText)(current, deps.valuePatterns);
|
|
270
|
+
const aggregated = current.errors;
|
|
271
|
+
const bare = entries.length === 0 && current.cause === undefined && aggregated === undefined;
|
|
272
|
+
if (bare && !text.changed)
|
|
273
|
+
return current;
|
|
274
|
+
const out = redactEntries(entries, deps.keyPatterns, deps.walk);
|
|
275
|
+
out.name = text.name;
|
|
276
|
+
out.message = text.message;
|
|
277
|
+
out.stack = text.stack;
|
|
278
|
+
if (current.cause !== undefined)
|
|
279
|
+
out.cause = deps.walk(current.cause);
|
|
280
|
+
if (Array.isArray(aggregated))
|
|
281
|
+
out.errors = deps.walk(aggregated);
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Dispatch one non-null object by its shape.
|
|
286
|
+
*
|
|
287
|
+
* Accepts: `current` — any object. `deps.walk` — how to recurse, which carries
|
|
288
|
+
* the cycle and memo state this module deliberately does not own.
|
|
289
|
+
*
|
|
290
|
+
* Returns: the redacted form — arrays and plain objects recursed, binary views
|
|
291
|
+
* collapsed to a label, `Date`/`RegExp` passed through by reference so they do
|
|
292
|
+
* not become `{}`, `Set`/`Map` rendered as their contents, and an Error through
|
|
293
|
+
* the error path, which preserves the non-enumerable text a plain walk cannot
|
|
294
|
+
* see.
|
|
295
|
+
*
|
|
296
|
+
* Throws: whatever a property getter on the value throws. `redactSecrets`, the
|
|
297
|
+
* only caller, catches it and returns `[UNREDACTABLE]` in place of the whole
|
|
298
|
+
* value it was given, rather than raising a getter's error at a caller who
|
|
299
|
+
* asked only for a copy it could log.
|
|
300
|
+
*/
|
|
301
|
+
function walkObject(current, deps) {
|
|
302
|
+
if (Array.isArray(current))
|
|
303
|
+
return current.map(deps.walk);
|
|
304
|
+
if (ArrayBuffer.isView(current))
|
|
305
|
+
return (0, secret_patterns_1.binaryLabel)(current);
|
|
306
|
+
if (isOpaqueValue(current))
|
|
307
|
+
return current;
|
|
308
|
+
if (isSetValue(current))
|
|
309
|
+
return [...current].map(deps.walk);
|
|
310
|
+
if (isMapValue(current))
|
|
311
|
+
return redactMap(current, deps);
|
|
312
|
+
const entries = Object.entries(current);
|
|
313
|
+
if (isErrorValue(current))
|
|
314
|
+
return redactError(current, entries, deps);
|
|
315
|
+
return redactEntries(entries, deps.keyPatterns, deps.walk);
|
|
316
|
+
}
|
|
@@ -1,7 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides what a secret looks like.
|
|
3
|
+
*
|
|
4
|
+
* Which key names mark their value as a secret, which credential formats are
|
|
5
|
+
* recognised in free text, how a match is replaced while the field's name is
|
|
6
|
+
* kept, and how a caught value's message is redacted before another error
|
|
7
|
+
* quotes it are decided here. The redacting logger and every error that
|
|
8
|
+
* quotes its cause share these rules, so a new credential shape is one edit.
|
|
9
|
+
*/
|
|
1
10
|
/** Marker substituted for anything recognised as secret. */
|
|
2
11
|
export declare const REDACTED = "[REDACTED]";
|
|
3
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Key names whose value is a secret. Each entry is a *normalised* name — see
|
|
14
|
+
* {@link normaliseKey} — and matches a key whose normalised form equals it or
|
|
15
|
+
* ends with it. Suffix matching is what catches `secretAccessKey`, `x-api-key`,
|
|
16
|
+
* `client_secret` and `AUTH_TOKEN`; requiring the pattern to be a suffix, not a
|
|
17
|
+
* substring, is what spares `maxTokens`, `total_tokens`, `tokenizer` and
|
|
18
|
+
* `secretary` — a bare substring match would redact all four for merely
|
|
19
|
+
* containing `token` or `secret`.
|
|
20
|
+
*/
|
|
4
21
|
export declare const DEFAULT_SECRET_KEY_PATTERNS: readonly string[];
|
|
22
|
+
/**
|
|
23
|
+
* Canonical form of a key name for matching.
|
|
24
|
+
*
|
|
25
|
+
* Accepts: any key name, in any case and with any separators.
|
|
26
|
+
*
|
|
27
|
+
* Returns: it lower-cased with every character that is not a letter or digit
|
|
28
|
+
* removed, so `api_key`, `x-api-key`, `ApiKey` and `API KEY` all become
|
|
29
|
+
* `apikey` and one pattern covers every spelling.
|
|
30
|
+
*
|
|
31
|
+
* Throws: nothing.
|
|
32
|
+
*/
|
|
33
|
+
export declare function normaliseKey(key: string): string;
|
|
5
34
|
/**
|
|
6
35
|
* Secret shapes recognisable in free text, where key-name matching cannot
|
|
7
36
|
* reach: an error's `message`/`stack`, or any other string value. Deliberately
|
|
@@ -35,26 +64,105 @@ export declare const DEFAULT_SECRET_KEY_PATTERNS: readonly string[];
|
|
|
35
64
|
* this fallback from over-redacting sibling JSON fields.
|
|
36
65
|
*/
|
|
37
66
|
export declare const DEFAULT_SECRET_VALUE_PATTERNS: readonly RegExp[];
|
|
38
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Whether a key name says its value is a secret.
|
|
69
|
+
*
|
|
70
|
+
* Accepts: `key` — any name. `patterns` — already-normalised names; an empty
|
|
71
|
+
* list matches nothing, which is how a caller turns key matching off.
|
|
72
|
+
*
|
|
73
|
+
* Returns: whether the normalised key equals or *ends with* a pattern. Suffix,
|
|
74
|
+
* not substring: that is what catches `secretAccessKey` and `x-api-key` while
|
|
75
|
+
* sparing `maxTokens`, `tokenizer` and `secretary`.
|
|
76
|
+
*
|
|
77
|
+
* Throws: nothing.
|
|
78
|
+
*/
|
|
39
79
|
export declare function isSecretKey(key: string, patterns: readonly string[]): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* An error's message with recognised credential shapes redacted.
|
|
82
|
+
*
|
|
83
|
+
* Accepts: any error — and, since this is what a `catch` block binds, any
|
|
84
|
+
* other value a `throw` can produce: `null`, `undefined`, a string, a number,
|
|
85
|
+
* a symbol, a plain object. Such a value is described through {@link toError}
|
|
86
|
+
* first and the description is what is redacted, so a secret it carries in its
|
|
87
|
+
* own text is still caught.
|
|
88
|
+
*
|
|
89
|
+
* Returns: the message, redacted with the default value patterns and then
|
|
90
|
+
* bounded by `truncateRelayedText` — for embedding in another error's
|
|
91
|
+
* message, since a wrapper that quotes its cause must not leak a `password=`
|
|
92
|
+
* or token the cause happened to carry. That text reaches `err.message`, which
|
|
93
|
+
* an application may print without a redacting logger.
|
|
94
|
+
*
|
|
95
|
+
* The bound is here rather than at the sites that quote the result, so no call
|
|
96
|
+
* site can get it wrong and no future one has to remember: a `RETRY_EXHAUSTED`
|
|
97
|
+
* report, a wrapped AWS failure, a compensation failure and both S3 transfer
|
|
98
|
+
* errors all inherit it from this one line. Redaction runs **before** the cut,
|
|
99
|
+
* because cutting first could split a credential shape past the pattern that
|
|
100
|
+
* would have caught it. Its own cap rather than the identifier cap: this is
|
|
101
|
+
* prose, and `MAX_RELAYED_MESSAGE_CHARS` records what that number is
|
|
102
|
+
* measured against. The value worth bounding is not the AWS SDK's own text but
|
|
103
|
+
* a **caller's** — a `serde` refusal or a `vectorBackend` rejection, whose
|
|
104
|
+
* length the caller controls entirely and which some paths quote once per row.
|
|
105
|
+
*
|
|
106
|
+
* Throws: **nothing**, for any value. Reading `.message` off a thrown
|
|
107
|
+
* primitive yielded `undefined` and the redaction then raised a `TypeError` —
|
|
108
|
+
* from inside the `catch` that was reporting the real failure, and from the
|
|
109
|
+
* one function a static guard funnels every one of this package's `catch`
|
|
110
|
+
* blocks into. Its promise has to hold for what a `catch` actually binds, or
|
|
111
|
+
* the guard concentrates every site into a function that is not safe.
|
|
112
|
+
*/
|
|
113
|
+
export declare function redactedMessage(error: Error): string;
|
|
114
|
+
/**
|
|
115
|
+
* Whether `value` is a regular expression.
|
|
116
|
+
*
|
|
117
|
+
* Accepts: anything, including a `RegExp` from another realm.
|
|
118
|
+
*
|
|
119
|
+
* Returns: whether its tag says so. By tag rather than `instanceof`, which is
|
|
120
|
+
* banned repo-wide because it answers "no" across a realm or a duplicated
|
|
121
|
+
* module.
|
|
122
|
+
*
|
|
123
|
+
* Throws: nothing.
|
|
124
|
+
*/
|
|
125
|
+
export declare function isRegExp(value: RegExp): boolean;
|
|
40
126
|
/**
|
|
41
127
|
* Replace every recognised secret shape inside `value` with {@link REDACTED},
|
|
42
128
|
* leaving the surrounding text intact so a redacted message stays readable.
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
129
|
+
*
|
|
130
|
+
* Accepts: `value` — any text. `patterns` — applied in order, each against the
|
|
131
|
+
* result of the last; an empty list returns the text unchanged. An entry that
|
|
132
|
+
* is not a `RegExp` is skipped: reading `.source` off one produced
|
|
133
|
+
* `new RegExp(undefined)` — that is `/(?:)/`, which matches the empty string
|
|
134
|
+
* and prefixed the marker to every value while catching no secret at all.
|
|
135
|
+
* Both public entry points — `redactSecrets` and {@link redactLogger} — now
|
|
136
|
+
* refuse such an entry where it is supplied, since a skipped pattern protects
|
|
137
|
+
* nothing while its caller believes it does; skipping remains the last-ditch
|
|
138
|
+
* guard for a list this package assembles internally.
|
|
139
|
+
*
|
|
140
|
+
* Returns: the text with every match replaced. A pattern may capture a leading
|
|
141
|
+
* group it wants **preserved**: only the rest of the match is replaced, which
|
|
142
|
+
* keeps `apiKey=[REDACTED]` saying which field was redacted instead of
|
|
143
|
+
* collapsing to a bare marker. A pattern with no group is replaced whole.
|
|
144
|
+
* `String.prototype.replace` passes the match *offset* — a number — as the
|
|
145
|
+
* second callback argument when the pattern has no group, hence the `typeof`
|
|
146
|
+
* test rather than an `undefined` check.
|
|
147
|
+
*
|
|
148
|
+
* Throws: nothing.
|
|
149
|
+
*
|
|
150
|
+
* Guarantees: every pattern is applied globally and from a fresh copy, so
|
|
151
|
+
* neither a missing `g` flag nor a leftover `lastIndex` can leave a later
|
|
152
|
+
* occurrence in the clear.
|
|
53
153
|
*/
|
|
54
154
|
export declare function redactText(value: string, patterns: readonly RegExp[]): string;
|
|
55
155
|
/**
|
|
56
|
-
* A short label for a binary view.
|
|
57
|
-
*
|
|
156
|
+
* A short label for a binary view.
|
|
157
|
+
*
|
|
158
|
+
* Accepts: any `ArrayBufferView`.
|
|
159
|
+
*
|
|
160
|
+
* Returns: its type and byte length, e.g. `[Uint8Array(4096)]`. Recursing into
|
|
161
|
+
* one would explode it into a per-index numeric map, both unreadable and far
|
|
162
|
+
* larger than the value itself — and a payload is exactly the thing a log must
|
|
163
|
+
* not carry.
|
|
164
|
+
*
|
|
165
|
+
* Throws: nothing.
|
|
58
166
|
*/
|
|
59
167
|
export declare function binaryLabel(value: ArrayBufferView): string;
|
|
60
168
|
/** An Error's redacted non-enumerable text, plus whether redaction changed it. */
|
|
@@ -65,10 +173,32 @@ export interface RedactedErrorText {
|
|
|
65
173
|
changed: boolean;
|
|
66
174
|
}
|
|
67
175
|
/**
|
|
68
|
-
* Redact an Error's `name
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
176
|
+
* Redact an Error's `name`, `message` and `stack`.
|
|
177
|
+
*
|
|
178
|
+
* Accepts: `error` — any error; a missing `stack` stays missing. Any other
|
|
179
|
+
* value a `throw` can produce is described through {@link toError} first, on
|
|
180
|
+
* the same reasoning as {@link redactedMessage}: the walk that calls this only
|
|
181
|
+
* reaches it for a value whose tag says `Error`, but the promise below is
|
|
182
|
+
* written in this function's own contract and is this function's to keep.
|
|
183
|
+
*
|
|
184
|
+
* Returns: the redacted text, plus `changed`: whether any secret was actually
|
|
185
|
+
* found. That flag is what decides between passing a bare Error through by
|
|
186
|
+
* reference — preserving its identity and stack trace — and rebuilding it so
|
|
187
|
+
* the secret cannot escape. It compares against the described error, so a
|
|
188
|
+
* value that had no text of its own is never reported as changed by the
|
|
189
|
+
* describing.
|
|
190
|
+
*
|
|
191
|
+
* None of the three is cut, and that is a decision rather than an omission.
|
|
192
|
+
* The rule that bounds unchecked text bounds what *this package* writes into
|
|
193
|
+
* its own `err.message` and its own log lines — `redactedMessage` is that
|
|
194
|
+
* funnel. This function is on the other side of the boundary: it rebuilds an
|
|
195
|
+
* Error the **consumer** handed to `redactSecrets`, or to the logger
|
|
196
|
+
* `redactLogger` wrapped, on the way to the consumer's own transport. Cutting
|
|
197
|
+
* there would change what their transport receives, for a value this package
|
|
198
|
+
* neither produced nor quotes, and the caller asked for redaction rather than
|
|
199
|
+
* for truncation. A consumer who wants a bound has their own transport to put
|
|
200
|
+
* one in.
|
|
201
|
+
*
|
|
202
|
+
* Throws: **nothing**, for any value.
|
|
72
203
|
*/
|
|
73
204
|
export declare function redactErrorText(error: Error, patterns: readonly RegExp[]): RedactedErrorText;
|
|
74
|
-
//# sourceMappingURL=secret-patterns.d.ts.map
|