@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,112 +1,239 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides what each of this library's errors carries, for the codes that have
|
|
4
|
+
* a factory here.
|
|
5
|
+
*
|
|
6
|
+
* A failure site with a factory below names it for its code and the facts it
|
|
7
|
+
* has. The message wording, which facts go into `context` or `details`,
|
|
8
|
+
* copying a list a caller reads from a `catch` long after the throw,
|
|
9
|
+
* redacting quoted cause text, and a stack that starts at the caller rather
|
|
10
|
+
* than inside the factory are decided here once per code, on the one error
|
|
11
|
+
* class (record 19). `FORMAT_UNSUPPORTED`, `PAYLOAD_CORRUPT`,
|
|
12
|
+
* `COMPRESSION_LIMIT`, `S3_OFFLOAD_FAILED` and `ANCESTOR_EXPIRED` are raised
|
|
13
|
+
* with `new DynamoDBLangGraphError` at their own call sites instead, and
|
|
14
|
+
* every AWS-classified code is wrapped once, by `wrapForeignError` in the
|
|
15
|
+
* error boundary, not per code here.
|
|
16
|
+
*/
|
|
2
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
18
|
+
exports.validationError = validationError;
|
|
19
|
+
exports.conflictError = conflictError;
|
|
20
|
+
exports.retryExhaustedError = retryExhaustedError;
|
|
21
|
+
exports.resultTruncatedError = resultTruncatedError;
|
|
22
|
+
exports.abortError = abortError;
|
|
23
|
+
exports.batchWriteIncompleteError = batchWriteIncompleteError;
|
|
24
|
+
exports.batchWriteAllIncompleteError = batchWriteAllIncompleteError;
|
|
25
|
+
exports.compensationFailedError = compensationFailedError;
|
|
26
|
+
const secret_patterns_1 = require("../logging/secret-patterns");
|
|
4
27
|
const base_error_1 = require("./base-error");
|
|
5
28
|
const error_code_1 = require("./error-code");
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Build one error, with the stack starting at the code that called `factory`
|
|
31
|
+
* rather than inside it: the top frame is the one a reader follows.
|
|
32
|
+
*/
|
|
33
|
+
function build(factory, spec) {
|
|
34
|
+
const error = new base_error_1.DynamoDBLangGraphError(spec.message, spec.code, spec.context, spec.cause, spec.details);
|
|
35
|
+
Error.captureStackTrace(error, factory);
|
|
36
|
+
return error;
|
|
12
37
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
38
|
+
/**
|
|
39
|
+
* The error for input that failed a check before any AWS call was made.
|
|
40
|
+
*
|
|
41
|
+
* Accepts: `message` — already redacted by whoever composed it. `field` — the
|
|
42
|
+
* option, argument or cap that failed, dotted for a nested one
|
|
43
|
+
* (`s3.bucketName`); omitted only where no single input is at fault. `cause` —
|
|
44
|
+
* the refusal beneath it.
|
|
45
|
+
*
|
|
46
|
+
* Returns: a `VALIDATION` error, with `context.field` set when a field was
|
|
47
|
+
* named — which is what a caller branches on to point at the offending input.
|
|
48
|
+
*
|
|
49
|
+
* Throws: nothing; building an error may not fail.
|
|
50
|
+
*/
|
|
51
|
+
function validationError(message, field, cause) {
|
|
52
|
+
return build(validationError, {
|
|
53
|
+
message,
|
|
54
|
+
code: error_code_1.ErrorCode.VALIDATION,
|
|
55
|
+
context: field === undefined ? {} : { field },
|
|
56
|
+
cause,
|
|
57
|
+
});
|
|
20
58
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
59
|
+
/**
|
|
60
|
+
* The error for a conditional write whose precondition no longer holds.
|
|
61
|
+
*
|
|
62
|
+
* Accepts: `message` — what precondition no longer held. `cause` — the
|
|
63
|
+
* rejection beneath it, when there is one.
|
|
64
|
+
*
|
|
65
|
+
* Returns: a `CONDITION_CONFLICT` error. A caller may retry the operation
|
|
66
|
+
* from a fresh read; nothing was written.
|
|
67
|
+
*
|
|
68
|
+
* Throws: nothing; building an error may not fail.
|
|
69
|
+
*/
|
|
70
|
+
function conflictError(message, cause) {
|
|
71
|
+
return build(conflictError, { message, code: error_code_1.ErrorCode.CONDITION_CONFLICT, context: {}, cause });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The error for a retried operation that exhausted its attempt budget.
|
|
75
|
+
*
|
|
76
|
+
* Accepts: `attempts` — how many were made before the budget ran out.
|
|
77
|
+
* `cause` — the last failure, kept so a caller can classify what actually
|
|
78
|
+
* went wrong.
|
|
79
|
+
*
|
|
80
|
+
* Returns: a `RETRY_EXHAUSTED` error, with `context.attempts` when `attempts`
|
|
81
|
+
* was given. It says the attempts are spent, **not** that the operation did
|
|
82
|
+
* not happen: a write whose response was lost is reported this way too, which
|
|
83
|
+
* is why every caller that would delete something reads the row back first.
|
|
84
|
+
*
|
|
85
|
+
* Throws: nothing; building an error may not fail.
|
|
86
|
+
*/
|
|
87
|
+
function retryExhaustedError(message, attempts, cause) {
|
|
88
|
+
return build(retryExhaustedError, {
|
|
89
|
+
message,
|
|
90
|
+
code: error_code_1.ErrorCode.RETRY_EXHAUSTED,
|
|
91
|
+
context: attempts === undefined ? {} : { attempts },
|
|
92
|
+
cause,
|
|
93
|
+
});
|
|
28
94
|
}
|
|
29
|
-
exports.RetryExhaustedError = RetryExhaustedError;
|
|
30
95
|
/**
|
|
31
|
-
*
|
|
32
|
-
* data remained, so the result would have been
|
|
33
|
-
* query (filter/prefix) or raise the cap rather
|
|
96
|
+
* The error for a paginated read that hit its runaway guard (item or
|
|
97
|
+
* iteration cap) while more data remained, so the result would have been
|
|
98
|
+
* silently truncated. Narrow the query (filter/prefix) or raise the cap rather
|
|
99
|
+
* than trusting a partial result.
|
|
100
|
+
*
|
|
101
|
+
* Accepts: `cap` — which cap was hit (`maxItems`, `maxIterations`). `limit` —
|
|
102
|
+
* its value, quoted in the message so the fix is obvious.
|
|
103
|
+
*
|
|
104
|
+
* Returns: a `RESULT_TRUNCATED` error, with `context.field` naming the cap.
|
|
105
|
+
* Raised only when data actually remained, so it never turns a complete
|
|
106
|
+
* result into a failure.
|
|
107
|
+
*
|
|
108
|
+
* Throws: nothing; building an error may not fail.
|
|
34
109
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
110
|
+
function resultTruncatedError(cap, limit) {
|
|
111
|
+
return build(resultTruncatedError, {
|
|
112
|
+
message: `paginated read truncated at the ${cap} cap (${limit}) with more data remaining`,
|
|
113
|
+
code: error_code_1.ErrorCode.RESULT_TRUNCATED,
|
|
114
|
+
context: { field: cap },
|
|
115
|
+
});
|
|
40
116
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
117
|
+
/**
|
|
118
|
+
* The error for an operation cancelled via its `AbortSignal`.
|
|
119
|
+
*
|
|
120
|
+
* Accepts: `message` — defaults to `Operation aborted`. `cause` — the
|
|
121
|
+
* `AbortSignal`'s own reason, when it carried one.
|
|
122
|
+
*
|
|
123
|
+
* Returns: an `ABORTED` error. Distinct from every failure code on purpose: a
|
|
124
|
+
* caller who cancelled did not encounter a fault, and treating the two alike
|
|
125
|
+
* reported an incomplete write for a deliberate stop.
|
|
126
|
+
*
|
|
127
|
+
* Throws: nothing; building an error may not fail.
|
|
128
|
+
*/
|
|
129
|
+
function abortError(message = 'Operation aborted', cause) {
|
|
130
|
+
return build(abortError, { message, code: error_code_1.ErrorCode.ABORTED, context: {}, cause });
|
|
48
131
|
}
|
|
49
|
-
exports.AbortError = AbortError;
|
|
50
132
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
133
|
+
* The error for a `BatchWriteItem` sequence that could not drain its
|
|
134
|
+
* `UnprocessedItems`.
|
|
135
|
+
*
|
|
136
|
+
* Accepts: `succeededCount` — writes DynamoDB acked. `unprocessed` — the
|
|
137
|
+
* requests it did not, verbatim, so they can be re-submitted. `retries` —
|
|
138
|
+
* rounds spent. `cause` — an error that interrupted the drain (a thrown,
|
|
139
|
+
* non-`UnprocessedItems` error from a retry round), rather than a clean
|
|
140
|
+
* exhaustion of the `UnprocessedItems` retry budget.
|
|
141
|
+
*
|
|
142
|
+
* Returns: a `BATCH_WRITE_INCOMPLETE` error whose `details` (`kind: 'drain'`)
|
|
143
|
+
* carry both counts and the list. Items *not* listed in `details.unprocessed`
|
|
144
|
+
* persist: there is no rollback, so reconciliation is driven from that list.
|
|
145
|
+
* That list is **copied**: it is read from a `catch` long after the throw, and
|
|
146
|
+
* a caller reusing its request buffer must not be able to rewrite it.
|
|
147
|
+
*
|
|
148
|
+
* Throws: nothing; building an error may not fail. Anything but an array of
|
|
149
|
+
* requests reads as an empty list rather than crashing the report.
|
|
57
150
|
*/
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
151
|
+
function batchWriteIncompleteError(succeededCount, unprocessed, retries, cause) {
|
|
152
|
+
const items = Array.isArray(unprocessed) ? [...unprocessed] : [];
|
|
153
|
+
return build(batchWriteIncompleteError, {
|
|
154
|
+
message: `batchWrite did not drain after ${retries} UnprocessedItems retries: ` +
|
|
155
|
+
`${succeededCount} item(s) persisted, ${items.length} still un-acked.`,
|
|
156
|
+
code: error_code_1.ErrorCode.BATCH_WRITE_INCOMPLETE,
|
|
157
|
+
context: {},
|
|
158
|
+
cause,
|
|
159
|
+
details: { kind: 'drain', succeededCount, unprocessed: items, retries },
|
|
160
|
+
});
|
|
68
161
|
}
|
|
69
|
-
exports.BatchWriteIncompleteError = BatchWriteIncompleteError;
|
|
70
162
|
/**
|
|
71
|
-
* batchWriteAll
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
163
|
+
* The error for a `batchWriteAll` pass — or a partition-wide delete — that did
|
|
164
|
+
* not fully drain. `batchWriteAll` attempts every chunk rather than stopping
|
|
165
|
+
* at the first failure, so a mid-sequence chunk failing does not abandon the
|
|
166
|
+
* chunks after it. A partition-wide delete reports through the same shape,
|
|
167
|
+
* because what it answers is the same question — how much of this call got
|
|
168
|
+
* through — but it sends one conditional request per row rather than a batch
|
|
169
|
+
* of twenty-five, so it counts rows where a batch counts chunks and says so in
|
|
170
|
+
* its message.
|
|
171
|
+
*
|
|
172
|
+
* Accepts: `batch.succeeded`/`batch.total` — the chunk tally. `batch.failures`
|
|
173
|
+
* — each failing chunk's own error, commonly a `BATCH_WRITE_INCOMPLETE` drain
|
|
174
|
+
* error. `batch.succeededCount` — individual writes confirmed persisted across
|
|
175
|
+
* every chunk (full chunks plus any failed chunk's own partial drain), which
|
|
176
|
+
* is more precise than the chunk tally when a chunk partially drains.
|
|
177
|
+
* `batch.unit` — what the first two counts count; omitting it reproduces the
|
|
178
|
+
* batch wording exactly.
|
|
179
|
+
*
|
|
180
|
+
* Returns: a `BATCH_WRITE_INCOMPLETE` error whose `details` (`kind: 'pass'`)
|
|
181
|
+
* carry the tally, with the first failing chunk's error as `cause`. Every
|
|
182
|
+
* chunk not represented in `details.failedChunks` drained successfully and its
|
|
183
|
+
* writes persist — there is no rollback. The list is **copied**, for the same
|
|
184
|
+
* reason a drain error copies its own.
|
|
185
|
+
*
|
|
186
|
+
* Throws: nothing; building an error may not fail. Anything but an array of
|
|
187
|
+
* errors reads as an empty list rather than crashing the report.
|
|
80
188
|
*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
189
|
+
function batchWriteAllIncompleteError(batch) {
|
|
190
|
+
const { succeeded, total, succeededCount = 0, unit = 'chunk' } = batch;
|
|
191
|
+
const failed = Array.isArray(batch.failures) ? [...batch.failures] : [];
|
|
192
|
+
return build(batchWriteAllIncompleteError, {
|
|
193
|
+
message: `${unit === 'chunk' ? 'batchWriteAll' : 'the partition delete'} did not fully drain: ` +
|
|
194
|
+
`${succeeded}/${total} ${unit}(s) succeeded, ` +
|
|
195
|
+
`${failed.length} ${unit}(s) failed. ${succeededCount} write(s) persisted before the failure.`,
|
|
196
|
+
code: error_code_1.ErrorCode.BATCH_WRITE_INCOMPLETE,
|
|
197
|
+
context: {},
|
|
198
|
+
cause: failed[0],
|
|
199
|
+
details: {
|
|
200
|
+
kind: 'pass',
|
|
201
|
+
unit,
|
|
202
|
+
succeededChunks: succeeded,
|
|
203
|
+
totalChunks: total,
|
|
204
|
+
failedChunks: failed,
|
|
205
|
+
succeededCount,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
95
208
|
}
|
|
96
|
-
exports.BatchWriteAllIncompleteError = BatchWriteAllIncompleteError;
|
|
97
209
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* `
|
|
210
|
+
* The error for a compensating rollback that failed after an append-saga
|
|
211
|
+
* chunk error, so the trigger could not be cleanly undone.
|
|
212
|
+
*
|
|
213
|
+
* Accepts: `cause` — the failure that triggered the rollback. `rollbackError`
|
|
214
|
+
* — why the rollback itself could not finish. Both are built from a `catch`,
|
|
215
|
+
* so either may be whatever a `throw` produced rather than an `Error`.
|
|
216
|
+
*
|
|
217
|
+
* Returns: a `COMPENSATION_FAILED` error carrying the trigger as `cause` and
|
|
218
|
+
* the rollback failure as `details.rollbackError`, each normalised through
|
|
219
|
+
* `toError` so both are always error-shaped. The session's `messageCount` may
|
|
220
|
+
* have drifted, which `reconcileMessageCount` repairs; the quoted text of both
|
|
221
|
+
* errors is redacted before it is embedded.
|
|
222
|
+
*
|
|
223
|
+
* Throws: nothing; building an error may not fail. Reading `.message` off a
|
|
224
|
+
* thrown `null` or `undefined` would throw here, inside the `catch` reporting
|
|
225
|
+
* the rollback — which is why `toError` normalises both `cause` and
|
|
226
|
+
* `rollbackError` before anything reads off them.
|
|
102
227
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
228
|
+
function compensationFailedError(cause, rollbackError) {
|
|
229
|
+
const trigger = (0, base_error_1.toError)(cause);
|
|
230
|
+
const rollback = (0, base_error_1.toError)(rollbackError);
|
|
231
|
+
return build(compensationFailedError, {
|
|
232
|
+
message: `compensation failed after an append error: ${(0, secret_patterns_1.redactedMessage)(trigger)} ` +
|
|
233
|
+
`(rollback: ${(0, secret_patterns_1.redactedMessage)(rollback)})`,
|
|
234
|
+
code: error_code_1.ErrorCode.COMPENSATION_FAILED,
|
|
235
|
+
context: {},
|
|
236
|
+
cause: trigger,
|
|
237
|
+
details: { rollbackError: rollback },
|
|
238
|
+
});
|
|
110
239
|
}
|
|
111
|
-
exports.CompensationFailedError = CompensationFailedError;
|
|
112
|
-
//# sourceMappingURL=errors.js.map
|
|
@@ -1,6 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides that a caller's logger is foreign code that may throw.
|
|
3
|
+
*
|
|
4
|
+
* A caller supplies no logger or one of their own, and internal code receives
|
|
5
|
+
* a logger that is silent by default and whose four levels never throw. No
|
|
6
|
+
* `catch` block or retry hook therefore treats a log call as a failure path
|
|
7
|
+
* of its own, and where a throw is absorbed, and what becomes of the line it
|
|
8
|
+
* was writing, can change here without touching any call site.
|
|
9
|
+
*/
|
|
1
10
|
/** A value safe to pass as a structured log argument. */
|
|
2
11
|
export type LogArgument = string | number | boolean | null | object;
|
|
3
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Pluggable logging interface — consumers supply their own implementation.
|
|
14
|
+
* `args` are structured fields, at most one plain object per call, so an
|
|
15
|
+
* adapter for a structured logger (pino, winston) can merge them into one
|
|
16
|
+
* record; the message is a fixed string and never carries a value.
|
|
17
|
+
*
|
|
18
|
+
* It is the one piece of foreign code every adapter of this package calls,
|
|
19
|
+
* almost always from a `catch` block, so an adapter wraps it: anything one of
|
|
20
|
+
* its methods throws is absorbed at the log call and never replaces the error
|
|
21
|
+
* being reported.
|
|
22
|
+
*/
|
|
4
23
|
export interface Logger {
|
|
5
24
|
info(message: string, ...args: LogArgument[]): void;
|
|
6
25
|
warn(message: string, ...args: LogArgument[]): void;
|
|
@@ -9,6 +28,53 @@ export interface Logger {
|
|
|
9
28
|
}
|
|
10
29
|
/** Default logger: discards everything. Inject a real logger to enable output. */
|
|
11
30
|
export declare const SILENT_LOGGER: Logger;
|
|
12
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Run one log call so that a failure of the caller's own logger cannot become
|
|
33
|
+
* the caller's problem.
|
|
34
|
+
*
|
|
35
|
+
* Shared rather than private to the file that first needed it: a `Logger` is
|
|
36
|
+
* an interface a consumer implements, so a log call is foreign code wherever
|
|
37
|
+
* it appears, and a guard each site has to remember is a guard most sites will
|
|
38
|
+
* not have.
|
|
39
|
+
*
|
|
40
|
+
* Swallowed rather than reported onward, because the only channel a report
|
|
41
|
+
* could use is the logger that just broke, and the alternative — writing to
|
|
42
|
+
* the host's console uninvited — is what {@link SILENT_LOGGER} exists to
|
|
43
|
+
* refuse. What the line was going to say is an observation about work that has
|
|
44
|
+
* either succeeded or is already failing for a reason of its own; the error it
|
|
45
|
+
* protects is the one that says what that reason was.
|
|
46
|
+
*
|
|
47
|
+
* Accepts: `emit` — the whole log call as a thunk, so the arguments are built
|
|
48
|
+
* inside the guard too: a formatter that throws while composing the line is
|
|
49
|
+
* the same failure as a transport that throws while writing it.
|
|
50
|
+
*
|
|
51
|
+
* Returns: nothing, and the same nothing whether the line was written or lost.
|
|
52
|
+
*
|
|
53
|
+
* Throws: **nothing**, ever. That is the entire job. The caller's next
|
|
54
|
+
* statement runs, so a path that says what it is about to do and then does it
|
|
55
|
+
* cannot be stopped between the two by the saying.
|
|
56
|
+
*/
|
|
57
|
+
export declare function absorbLoggerFailure(emit: () => void): void;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve an optional logger to a concrete one.
|
|
60
|
+
*
|
|
61
|
+
* Accepts: `logger` — the caller's, or nothing. Its members were validated
|
|
62
|
+
* where the options were.
|
|
63
|
+
*
|
|
64
|
+
* Returns: {@link SILENT_LOGGER} when nothing was given — silent rather than
|
|
65
|
+
* console by default: a library writing to a host's stdout uninvited is a
|
|
66
|
+
* nuisance, and every event it would have written is documented so an operator
|
|
67
|
+
* can opt in. Otherwise a **wrapper** around the caller's logger, not the
|
|
68
|
+
* object itself: the same four levels, delegating each call with its message
|
|
69
|
+
* and arguments unchanged, and absorbing anything the caller's method throws
|
|
70
|
+
* (see `absorbLoggerFailure`). Identity is therefore not preserved, and
|
|
71
|
+
* a caller comparing what it passed in against what an adapter holds would
|
|
72
|
+
* find two different objects; nothing observable about a log line changes.
|
|
73
|
+
*
|
|
74
|
+
* Throws: nothing.
|
|
75
|
+
*
|
|
76
|
+
* Guarantees: every logger this package hands to its own internals has methods
|
|
77
|
+
* that cannot throw, so no `catch` block, and no retry hook, has to treat a log
|
|
78
|
+
* call as a failure path of its own.
|
|
79
|
+
*/
|
|
13
80
|
export declare function resolveLogger(logger?: Logger): Logger;
|
|
14
|
-
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hides that a caller's logger is foreign code that may throw.
|
|
4
|
+
*
|
|
5
|
+
* A caller supplies no logger or one of their own, and internal code receives
|
|
6
|
+
* a logger that is silent by default and whose four levels never throw. No
|
|
7
|
+
* `catch` block or retry hook therefore treats a log call as a failure path
|
|
8
|
+
* of its own, and where a throw is absorbed, and what becomes of the line it
|
|
9
|
+
* was writing, can change here without touching any call site.
|
|
10
|
+
*/
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.SILENT_LOGGER = void 0;
|
|
13
|
+
exports.absorbLoggerFailure = absorbLoggerFailure;
|
|
4
14
|
exports.resolveLogger = resolveLogger;
|
|
5
15
|
/** Default logger: discards everything. Inject a real logger to enable output. */
|
|
6
16
|
exports.SILENT_LOGGER = {
|
|
@@ -9,8 +19,92 @@ exports.SILENT_LOGGER = {
|
|
|
9
19
|
error() { },
|
|
10
20
|
debug() { },
|
|
11
21
|
};
|
|
12
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Run one log call so that a failure of the caller's own logger cannot become
|
|
24
|
+
* the caller's problem.
|
|
25
|
+
*
|
|
26
|
+
* Shared rather than private to the file that first needed it: a `Logger` is
|
|
27
|
+
* an interface a consumer implements, so a log call is foreign code wherever
|
|
28
|
+
* it appears, and a guard each site has to remember is a guard most sites will
|
|
29
|
+
* not have.
|
|
30
|
+
*
|
|
31
|
+
* Swallowed rather than reported onward, because the only channel a report
|
|
32
|
+
* could use is the logger that just broke, and the alternative — writing to
|
|
33
|
+
* the host's console uninvited — is what {@link SILENT_LOGGER} exists to
|
|
34
|
+
* refuse. What the line was going to say is an observation about work that has
|
|
35
|
+
* either succeeded or is already failing for a reason of its own; the error it
|
|
36
|
+
* protects is the one that says what that reason was.
|
|
37
|
+
*
|
|
38
|
+
* Accepts: `emit` — the whole log call as a thunk, so the arguments are built
|
|
39
|
+
* inside the guard too: a formatter that throws while composing the line is
|
|
40
|
+
* the same failure as a transport that throws while writing it.
|
|
41
|
+
*
|
|
42
|
+
* Returns: nothing, and the same nothing whether the line was written or lost.
|
|
43
|
+
*
|
|
44
|
+
* Throws: **nothing**, ever. That is the entire job. The caller's next
|
|
45
|
+
* statement runs, so a path that says what it is about to do and then does it
|
|
46
|
+
* cannot be stopped between the two by the saying.
|
|
47
|
+
*/
|
|
48
|
+
function absorbLoggerFailure(emit) {
|
|
49
|
+
try {
|
|
50
|
+
emit();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Nowhere left to say it: the reporting channel is the broken part.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* `inner` with each level wrapped so a throw out of it stops at the log call.
|
|
58
|
+
*
|
|
59
|
+
* A `Logger` is an interface a consumer implements, so every log call this
|
|
60
|
+
* package makes runs foreign code, and almost every one of them is made from
|
|
61
|
+
* inside a `catch`: one that stringifies a circular object, whose transport
|
|
62
|
+
* has closed, or that asserts on a field it did not expect replaces the error
|
|
63
|
+
* the caller actually needs to see with its own. At the retry hook the damage
|
|
64
|
+
* is larger than a swap — `withRetry` calls `onRetry` synchronously and does
|
|
65
|
+
* not catch it, so a logger that throws ends an operation that was still
|
|
66
|
+
* succeeding, after its first transient failure.
|
|
67
|
+
*
|
|
68
|
+
* Wrapped once per adapter, here, rather than remembered at each of the three
|
|
69
|
+
* dozen call sites: a site that forgets is a site whose failure path reports
|
|
70
|
+
* the wrong error, and those sites are exactly the ones a test suite exercises
|
|
71
|
+
* least. `absorbLoggerFailure` stays for the places that promise,
|
|
72
|
+
* with no precondition on the logger they were handed, never to throw:
|
|
73
|
+
* `redactLogger`, which a caller may wrap any logger with, the S3 orphan
|
|
74
|
+
* cleanup, and the chat history's append compensation, whose announcement must
|
|
75
|
+
* not be able to stop the rollback it announces.
|
|
76
|
+
*/
|
|
77
|
+
function containedLogger(inner) {
|
|
78
|
+
const deliver = (level) => (message, ...args) => absorbLoggerFailure(() => inner[level](message, ...args));
|
|
79
|
+
return {
|
|
80
|
+
info: deliver('info'),
|
|
81
|
+
warn: deliver('warn'),
|
|
82
|
+
error: deliver('error'),
|
|
83
|
+
debug: deliver('debug'),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve an optional logger to a concrete one.
|
|
88
|
+
*
|
|
89
|
+
* Accepts: `logger` — the caller's, or nothing. Its members were validated
|
|
90
|
+
* where the options were.
|
|
91
|
+
*
|
|
92
|
+
* Returns: {@link SILENT_LOGGER} when nothing was given — silent rather than
|
|
93
|
+
* console by default: a library writing to a host's stdout uninvited is a
|
|
94
|
+
* nuisance, and every event it would have written is documented so an operator
|
|
95
|
+
* can opt in. Otherwise a **wrapper** around the caller's logger, not the
|
|
96
|
+
* object itself: the same four levels, delegating each call with its message
|
|
97
|
+
* and arguments unchanged, and absorbing anything the caller's method throws
|
|
98
|
+
* (see `absorbLoggerFailure`). Identity is therefore not preserved, and
|
|
99
|
+
* a caller comparing what it passed in against what an adapter holds would
|
|
100
|
+
* find two different objects; nothing observable about a log line changes.
|
|
101
|
+
*
|
|
102
|
+
* Throws: nothing.
|
|
103
|
+
*
|
|
104
|
+
* Guarantees: every logger this package hands to its own internals has methods
|
|
105
|
+
* that cannot throw, so no `catch` block, and no retry hook, has to treat a log
|
|
106
|
+
* call as a failure path of its own.
|
|
107
|
+
*/
|
|
13
108
|
function resolveLogger(logger) {
|
|
14
|
-
return logger
|
|
109
|
+
return logger === undefined ? exports.SILENT_LOGGER : containedLogger(logger);
|
|
15
110
|
}
|
|
16
|
-
//# sourceMappingURL=logger.js.map
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Hides how a logger and a value are redacted.
|
|
3
|
+
*
|
|
4
|
+
* A redacting logger walks every argument of every line, bounded in depth and
|
|
5
|
+
* safe against cycles and hostile getters, and replaces the value of any key
|
|
6
|
+
* that looks like a secret and any text that looks like one; the same walk
|
|
7
|
+
* serves `redactSecrets` for a value a caller wants to log themselves.
|
|
8
|
+
*/
|
|
9
|
+
import { type LogArgument, type Logger } from './logger';
|
|
3
10
|
/**
|
|
4
11
|
* Recursively clone `value`, replacing any value at a secret-looking key with
|
|
5
12
|
* `[REDACTED]` and any recognised secret *shape* inside a string — including an
|
|
@@ -13,12 +20,35 @@ import { type Redactable } from './redaction-walk';
|
|
|
13
20
|
* `stack` redacted and every other own property recursed like a plain object.
|
|
14
21
|
* `Date`/`RegExp` keep their identity rather than collapsing to `{}`,
|
|
15
22
|
* `Set`/`Map` render as their contents, and binary views become a short label.
|
|
16
|
-
*
|
|
23
|
+
*
|
|
24
|
+
* Accepts: `value` — any log argument, including `undefined`, a primitive, a
|
|
25
|
+
* typed `Error`, a class instance or a `Record`, so callers never cast. A
|
|
26
|
+
* cyclic or shared graph is fine; each node is walked once. `patterns` and
|
|
27
|
+
* `valuePatterns` — the key names and value shapes to redact, an array of
|
|
28
|
+
* strings and an array of `RegExp` respectively; both default to this
|
|
29
|
+
* package's own lists, and an empty one turns that rule off.
|
|
30
|
+
*
|
|
31
|
+
* Returns: a redacted clone. The input is never mutated — a logger that
|
|
32
|
+
* scrubbed the caller's own object would corrupt the very data the application
|
|
33
|
+
* is working with.
|
|
34
|
+
*
|
|
35
|
+
* Throws: `VALIDATION` naming `patterns` or `valuePatterns` for a list this
|
|
36
|
+
* function could not apply, which is a mistake in the call itself and is
|
|
37
|
+
* raised before anything is walked. Nothing after that: a value whose
|
|
38
|
+
* redaction fails — a throwing getter, a structure deep enough to exhaust the
|
|
39
|
+
* stack — is replaced whole by `[UNREDACTABLE]`, since a logger that throws
|
|
40
|
+
* takes down the operation it was only observing. {@link redactLogger}
|
|
41
|
+
* redacts one argument per call, so there a single hostile argument is what is
|
|
42
|
+
* lost rather than the record around it.
|
|
17
43
|
*/
|
|
18
|
-
export declare function redactSecrets(value:
|
|
44
|
+
export declare function redactSecrets(value: LogArgument | undefined, patterns?: readonly string[], valuePatterns?: readonly RegExp[]): Redactable;
|
|
19
45
|
/** Options controlling {@link redactLogger}. */
|
|
20
46
|
export interface RedactLoggerOptions {
|
|
21
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* Additional key names to redact. Matched like the defaults: a key is
|
|
49
|
+
* redacted when its normalised form (lower-case, punctuation removed) equals
|
|
50
|
+
* or ends with the normalised name, so `'ssn'` covers `SSN` and `user_ssn`.
|
|
51
|
+
*/
|
|
22
52
|
extraKeys?: readonly string[];
|
|
23
53
|
/**
|
|
24
54
|
* Additional secret shapes to redact wherever they appear inside a string.
|
|
@@ -28,8 +58,62 @@ export interface RedactLoggerOptions {
|
|
|
28
58
|
extraValuePatterns?: readonly RegExp[];
|
|
29
59
|
}
|
|
30
60
|
/**
|
|
31
|
-
* Wrap a logger so object args are redacted before delegation.
|
|
32
|
-
*
|
|
61
|
+
* Wrap a logger so object args are redacted before delegation.
|
|
62
|
+
*
|
|
63
|
+
* Accepts: `inner` — the logger to delegate to; it must carry all four
|
|
64
|
+
* methods, because a missing one is a wiring mistake worth naming here rather
|
|
65
|
+
* than at the first log line. `options.extraKeys` — further key names to
|
|
66
|
+
* redact, matched like the defaults. `options.extraValuePatterns` — further
|
|
67
|
+
* secret shapes; each must be a `RegExp`, and it is applied globally whether or
|
|
68
|
+
* not it carries the `g` flag.
|
|
69
|
+
*
|
|
70
|
+
* Returns: a logger with the same four methods.
|
|
71
|
+
*
|
|
72
|
+
* Throws: `VALIDATION` naming `logger` or `logger.<method>` for a logger it
|
|
73
|
+
* could not delegate to, and `options`, `extraKeys` or `extraValuePatterns`
|
|
74
|
+
* for an option of the wrong type. Nothing at log time.
|
|
75
|
+
*
|
|
76
|
+
* Guarantees: the message string is passed through unchanged — never
|
|
77
|
+
* interpolate a secret into it — and every other argument is redacted before
|
|
78
|
+
* it reaches `inner`. Past the wrap call nothing escapes a log call: an
|
|
79
|
+
* argument whose redaction fails is replaced by a fixed marker, and a failure
|
|
80
|
+
* of `inner` itself is absorbed, because the
|
|
81
|
+
* operation that wrote the line was only observing itself and is commonly
|
|
82
|
+
* reporting some other failure already.
|
|
33
83
|
*/
|
|
34
84
|
export declare function redactLogger(inner: Logger, options?: RedactLoggerOptions): Logger;
|
|
35
|
-
|
|
85
|
+
/** A value that {@link redactSecrets} can recurse through. */
|
|
86
|
+
export type Redactable = string | number | boolean | null | undefined | Redactable[] | {
|
|
87
|
+
[key: string]: Redactable;
|
|
88
|
+
};
|
|
89
|
+
/** Any `Redactable` that is a non-null object — what the walk dispatches on. */
|
|
90
|
+
export type RedactableObject = Redactable[] | {
|
|
91
|
+
[key: string]: Redactable;
|
|
92
|
+
};
|
|
93
|
+
/** One step of the recursive walk, threaded into the entry helpers. */
|
|
94
|
+
type Walk = (value: Redactable) => Redactable;
|
|
95
|
+
/** Collaborators threaded through the recursive walk. */
|
|
96
|
+
export interface WalkDeps {
|
|
97
|
+
keyPatterns: readonly string[];
|
|
98
|
+
valuePatterns: readonly RegExp[];
|
|
99
|
+
walk: Walk;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Dispatch one non-null object by its shape.
|
|
103
|
+
*
|
|
104
|
+
* Accepts: `current` — any object. `deps.walk` — how to recurse, which carries
|
|
105
|
+
* the cycle and memo state this module deliberately does not own.
|
|
106
|
+
*
|
|
107
|
+
* Returns: the redacted form — arrays and plain objects recursed, binary views
|
|
108
|
+
* collapsed to a label, `Date`/`RegExp` passed through by reference so they do
|
|
109
|
+
* not become `{}`, `Set`/`Map` rendered as their contents, and an Error through
|
|
110
|
+
* the error path, which preserves the non-enumerable text a plain walk cannot
|
|
111
|
+
* see.
|
|
112
|
+
*
|
|
113
|
+
* Throws: whatever a property getter on the value throws. `redactSecrets`, the
|
|
114
|
+
* only caller, catches it and returns `[UNREDACTABLE]` in place of the whole
|
|
115
|
+
* value it was given, rather than raising a getter's error at a caller who
|
|
116
|
+
* asked only for a copy it could log.
|
|
117
|
+
*/
|
|
118
|
+
export declare function walkObject(current: RedactableObject, deps: WalkDeps): Redactable;
|
|
119
|
+
export {};
|