@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.2 → 1.0.0
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 +390 -193
- package/dist/{backfill → cjs/backfill}/backfill.d.ts +15 -12
- package/dist/cjs/backfill/backfill.js +177 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/delete-thread.d.ts +1 -1
- package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/get-tuple.d.ts +4 -3
- package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/list.d.ts +7 -4
- package/dist/cjs/checkpointer/actions/list.js +70 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/put-writes.d.ts +8 -6
- package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
- package/dist/{checkpointer → cjs/checkpointer}/actions/put.d.ts +21 -15
- package/dist/cjs/checkpointer/actions/put.js +79 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/delta-history.d.ts +38 -26
- package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/listing.d.ts +4 -4
- package/dist/cjs/checkpointer/internal/listing.js +104 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/parse.d.ts +51 -15
- package/dist/cjs/checkpointer/internal/parse.js +184 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/pending-writes.d.ts +64 -25
- package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/read.d.ts +15 -10
- package/dist/cjs/checkpointer/internal/read.js +132 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/rows.d.ts +94 -21
- package/dist/cjs/checkpointer/internal/rows.js +356 -0
- package/dist/{checkpointer → cjs/checkpointer}/internal/setup.d.ts +13 -20
- package/dist/cjs/checkpointer/internal/setup.js +25 -0
- package/dist/{checkpointer → cjs/checkpointer}/saver.d.ts +72 -36
- package/dist/cjs/checkpointer/saver.js +56 -0
- package/dist/{checkpointer → cjs/checkpointer}/types.d.ts +1 -1
- package/dist/cjs/checkpointer/types.js +2 -0
- package/dist/{factory → cjs/factory}/factory.d.ts +25 -20
- package/dist/cjs/factory/factory.js +137 -0
- package/dist/{factory → cjs/factory}/types.d.ts +12 -12
- package/dist/cjs/factory/types.js +2 -0
- package/dist/{history → cjs/history}/actions/add-messages.d.ts +18 -10
- package/dist/cjs/history/actions/add-messages.js +17 -0
- package/dist/{history → cjs/history}/actions/clear.d.ts +1 -1
- package/dist/cjs/history/actions/clear.js +29 -0
- package/dist/{history → cjs/history}/actions/get-messages.d.ts +11 -9
- package/dist/cjs/history/actions/get-messages.js +58 -0
- package/dist/{history → cjs/history}/actions/list-sessions.d.ts +3 -3
- package/dist/cjs/history/actions/list-sessions.js +67 -0
- package/dist/{history → cjs/history}/actions/reconcile-count.d.ts +13 -9
- package/dist/cjs/history/actions/reconcile-count.js +8 -0
- package/dist/{history → cjs/history}/chat-message-history.d.ts +62 -30
- package/dist/cjs/history/chat-message-history.js +61 -0
- package/dist/{history → cjs/history}/internal/append.d.ts +64 -32
- package/dist/cjs/history/internal/append.js +267 -0
- package/dist/{history → cjs/history}/internal/message-read.d.ts +3 -3
- package/dist/cjs/history/internal/message-read.js +93 -0
- package/dist/{history → cjs/history}/internal/parse.d.ts +2 -2
- package/dist/cjs/history/internal/parse.js +113 -0
- package/dist/{history → cjs/history}/internal/rows.d.ts +11 -10
- package/dist/cjs/history/internal/rows.js +96 -0
- package/dist/{history → cjs/history}/internal/session.d.ts +41 -22
- package/dist/cjs/history/internal/session.js +296 -0
- package/dist/{history → cjs/history}/internal/setup.d.ts +2 -2
- package/dist/cjs/history/internal/setup.js +60 -0
- package/dist/{history → cjs/history}/session-adapter.d.ts +0 -6
- package/dist/cjs/history/session-adapter.js +38 -0
- package/dist/{history → cjs/history}/types.d.ts +18 -15
- package/dist/cjs/history/types.js +2 -0
- package/dist/{index.d.ts → cjs/index.d.ts} +27 -27
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +1 -0
- package/dist/{shared → cjs/shared}/adapter.d.ts +27 -16
- package/dist/cjs/shared/adapter.js +70 -0
- package/dist/cjs/shared/clock.js +14 -0
- package/dist/{shared → cjs/shared}/codec/codec.d.ts +37 -20
- package/dist/cjs/shared/codec/codec.js +162 -0
- package/dist/{shared → cjs/shared}/codec/compression.d.ts +9 -4
- package/dist/cjs/shared/codec/compression.js +45 -0
- package/dist/cjs/shared/codec/json-serde.js +58 -0
- package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +2 -1
- package/dist/cjs/shared/codec/s3/client-types.js +6 -0
- package/dist/{shared → cjs/shared}/codec/s3/client.d.ts +25 -7
- package/dist/cjs/shared/codec/s3/client.js +78 -0
- package/dist/{shared → cjs/shared}/codec/s3/config.d.ts +12 -7
- package/dist/cjs/shared/codec/s3/config.js +92 -0
- package/dist/{shared → cjs/shared}/codec/s3/lifecycle.d.ts +71 -17
- package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
- package/dist/{shared → cjs/shared}/codec/s3/offloader.d.ts +42 -29
- package/dist/cjs/shared/codec/s3/offloader.js +289 -0
- package/dist/cjs/shared/concurrency.js +31 -0
- package/dist/{shared → cjs/shared}/dynamodb/abort.d.ts +2 -2
- package/dist/cjs/shared/dynamodb/abort.js +16 -0
- package/dist/{shared → cjs/shared}/dynamodb/batch-write.d.ts +2 -2
- package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
- package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
- package/dist/{shared → cjs/shared}/dynamodb/client.d.ts +24 -22
- package/dist/cjs/shared/dynamodb/client.js +40 -0
- package/dist/{shared → cjs/shared}/dynamodb/idempotent-write.d.ts +64 -19
- package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
- package/dist/{shared → cjs/shared}/dynamodb/paginate.d.ts +2 -2
- package/dist/cjs/shared/dynamodb/paginate.js +90 -0
- package/dist/{shared → cjs/shared}/dynamodb/partition-delete.d.ts +6 -6
- package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
- package/dist/{shared → cjs/shared}/dynamodb/recency-index.d.ts +27 -15
- package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
- package/dist/{shared → cjs/shared}/dynamodb/retry.d.ts +37 -6
- package/dist/cjs/shared/dynamodb/retry.js +193 -0
- package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
- package/dist/cjs/shared/dynamodb/row-size.js +30 -0
- package/dist/{shared → cjs/shared}/dynamodb/table-schema.d.ts +27 -18
- package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
- package/dist/{shared → cjs/shared}/errors/base-error.d.ts +42 -7
- package/dist/cjs/shared/errors/base-error.js +73 -0
- package/dist/{shared → cjs/shared}/errors/boundary.d.ts +29 -14
- package/dist/cjs/shared/errors/boundary.js +61 -0
- package/dist/cjs/shared/errors/classify.d.ts +206 -0
- package/dist/cjs/shared/errors/classify.js +232 -0
- package/dist/{shared → cjs/shared}/errors/error-code.d.ts +17 -10
- package/dist/cjs/shared/errors/error-code.js +27 -0
- package/dist/{shared → cjs/shared}/errors/errors.d.ts +75 -9
- package/dist/cjs/shared/errors/errors.js +123 -0
- package/dist/cjs/shared/logging/logger.js +30 -0
- package/dist/{shared → cjs/shared}/logging/redaction.d.ts +8 -4
- package/dist/cjs/shared/logging/redaction.js +145 -0
- package/dist/{shared → cjs/shared}/logging/secret-patterns.d.ts +30 -7
- package/dist/cjs/shared/logging/secret-patterns.js +93 -0
- package/dist/cjs/shared/logging/truncate.js +31 -0
- package/dist/{shared → cjs/shared}/options.d.ts +27 -11
- package/dist/cjs/shared/options.js +2 -0
- package/dist/cjs/shared/ulid.js +83 -0
- package/dist/{shared → cjs/shared}/validation/collaborators.d.ts +21 -2
- package/dist/cjs/shared/validation/collaborators.js +79 -0
- package/dist/{shared → cjs/shared}/validation/option-shape.d.ts +7 -5
- package/dist/cjs/shared/validation/option-shape.js +31 -0
- package/dist/{shared → cjs/shared}/validation/options.d.ts +4 -4
- package/dist/cjs/shared/validation/options.js +166 -0
- package/dist/cjs/shared/validation/primitives.js +114 -0
- package/dist/{shared → cjs/shared}/validation/ttl.d.ts +26 -9
- package/dist/cjs/shared/validation/ttl.js +52 -0
- package/dist/{store → cjs/store}/actions/list-namespaces.d.ts +5 -5
- package/dist/cjs/store/actions/list-namespaces.js +92 -0
- package/dist/{store → cjs/store}/actions/put.d.ts +11 -4
- package/dist/cjs/store/actions/put.js +49 -0
- package/dist/{store → cjs/store}/actions/reconcile-vector-index.d.ts +5 -5
- package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
- package/dist/{store → cjs/store}/actions/search.d.ts +2 -2
- package/dist/cjs/store/actions/search.js +26 -0
- package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
- package/dist/cjs/store/internal/batch-plan.js +32 -0
- package/dist/{store → cjs/store}/internal/filter.d.ts +3 -3
- package/dist/cjs/store/internal/filter.js +64 -0
- package/dist/cjs/store/internal/get-item.d.ts +77 -0
- package/dist/cjs/store/internal/get-item.js +58 -0
- package/dist/{store → cjs/store}/internal/item-write.d.ts +72 -32
- package/dist/cjs/store/internal/item-write.js +181 -0
- package/dist/{store → cjs/store}/internal/parse.d.ts +15 -10
- package/dist/cjs/store/internal/parse.js +180 -0
- package/dist/{store → cjs/store}/internal/rows.d.ts +38 -34
- package/dist/cjs/store/internal/rows.js +166 -0
- package/dist/{store → cjs/store}/internal/semantic-search.d.ts +2 -2
- package/dist/cjs/store/internal/semantic-search.js +211 -0
- package/dist/{store → cjs/store}/internal/setup.d.ts +10 -15
- package/dist/cjs/store/internal/setup.js +103 -0
- package/dist/{store → cjs/store}/internal/table-search.d.ts +5 -5
- package/dist/cjs/store/internal/table-search.js +123 -0
- package/dist/{store → cjs/store}/internal/vector-index.d.ts +26 -15
- package/dist/cjs/store/internal/vector-index.js +269 -0
- package/dist/{store → cjs/store}/store.d.ts +82 -39
- package/dist/cjs/store/store.js +97 -0
- package/dist/{store → cjs/store}/types.d.ts +25 -10
- package/dist/cjs/store/types.js +2 -0
- package/dist/cjs/store/vector-backend.js +4 -0
- package/dist/esm/backfill/backfill.d.ts +171 -0
- package/dist/esm/backfill/backfill.js +170 -0
- package/dist/{checkpointer/actions/delete-thread.js → esm/checkpointer/actions/delete-thread.d.ts} +4 -26
- package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
- package/dist/{checkpointer/actions/get-tuple.js → esm/checkpointer/actions/get-tuple.d.ts} +7 -24
- package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
- package/dist/esm/checkpointer/actions/list.d.ts +55 -0
- package/dist/esm/checkpointer/actions/list.js +67 -0
- package/dist/{checkpointer/actions/put-writes.js → esm/checkpointer/actions/put-writes.d.ts} +10 -37
- package/dist/esm/checkpointer/actions/put-writes.js +18 -0
- package/dist/esm/checkpointer/actions/put.d.ts +95 -0
- package/dist/esm/checkpointer/actions/put.js +75 -0
- package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
- package/dist/esm/checkpointer/internal/delta-history.js +126 -0
- package/dist/{checkpointer/internal/listing.js → esm/checkpointer/internal/listing.d.ts} +22 -118
- package/dist/esm/checkpointer/internal/listing.js +95 -0
- package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
- package/dist/esm/checkpointer/internal/parse.js +169 -0
- package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
- package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
- package/dist/esm/checkpointer/internal/read.d.ts +135 -0
- package/dist/esm/checkpointer/internal/read.js +125 -0
- package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
- package/dist/esm/checkpointer/internal/rows.js +323 -0
- package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
- package/dist/esm/checkpointer/internal/setup.js +21 -0
- package/dist/{checkpointer/saver.js → esm/checkpointer/saver.d.ts} +84 -87
- package/dist/esm/checkpointer/saver.js +52 -0
- package/dist/esm/checkpointer/types.d.ts +51 -0
- package/dist/esm/checkpointer/types.js +1 -0
- package/dist/esm/factory/factory.d.ts +154 -0
- package/dist/esm/factory/factory.js +133 -0
- package/dist/esm/factory/types.d.ts +76 -0
- package/dist/esm/factory/types.js +1 -0
- package/dist/{history/actions/add-messages.js → esm/history/actions/add-messages.d.ts} +20 -26
- package/dist/esm/history/actions/add-messages.js +14 -0
- package/dist/{history/actions/clear.js → esm/history/actions/clear.d.ts} +4 -35
- package/dist/esm/history/actions/clear.js +26 -0
- package/dist/esm/history/actions/get-messages.d.ts +60 -0
- package/dist/esm/history/actions/get-messages.js +55 -0
- package/dist/esm/history/actions/list-sessions.d.ts +55 -0
- package/dist/esm/history/actions/list-sessions.js +64 -0
- package/dist/{history/actions/reconcile-count.js → esm/history/actions/reconcile-count.d.ts} +14 -16
- package/dist/esm/history/actions/reconcile-count.js +5 -0
- package/dist/{history/chat-message-history.js → esm/history/chat-message-history.d.ts} +76 -87
- package/dist/esm/history/chat-message-history.js +57 -0
- package/dist/esm/history/internal/append.d.ts +244 -0
- package/dist/esm/history/internal/append.js +259 -0
- package/dist/esm/history/internal/message-read.d.ts +84 -0
- package/dist/esm/history/internal/message-read.js +89 -0
- package/dist/esm/history/internal/parse.d.ts +153 -0
- package/dist/esm/history/internal/parse.js +105 -0
- package/dist/{history/internal/rows.js → esm/history/internal/rows.d.ts} +58 -112
- package/dist/esm/history/internal/rows.js +83 -0
- package/dist/esm/history/internal/session.d.ts +350 -0
- package/dist/esm/history/internal/session.js +285 -0
- package/dist/esm/history/internal/setup.d.ts +64 -0
- package/dist/esm/history/internal/setup.js +56 -0
- package/dist/{history/session-adapter.js → esm/history/session-adapter.d.ts} +25 -39
- package/dist/esm/history/session-adapter.js +34 -0
- package/dist/esm/history/types.d.ts +102 -0
- package/dist/esm/history/types.js +1 -0
- package/dist/esm/index.d.ts +53 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/shared/adapter.d.ts +146 -0
- package/dist/esm/shared/adapter.js +65 -0
- package/dist/{shared/clock.js → esm/shared/clock.d.ts} +3 -14
- package/dist/esm/shared/clock.js +9 -0
- package/dist/esm/shared/codec/codec.d.ts +336 -0
- package/dist/esm/shared/codec/codec.js +150 -0
- package/dist/esm/shared/codec/compression.d.ts +66 -0
- package/dist/esm/shared/codec/compression.js +40 -0
- package/dist/esm/shared/codec/json-serde.d.ts +80 -0
- package/dist/esm/shared/codec/json-serde.js +54 -0
- package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
- package/dist/esm/shared/codec/s3/client-types.js +3 -0
- package/dist/esm/shared/codec/s3/client.d.ts +63 -0
- package/dist/esm/shared/codec/s3/client.js +40 -0
- package/dist/{shared/codec/s3/config.js → esm/shared/codec/s3/config.d.ts} +45 -93
- package/dist/esm/shared/codec/s3/config.js +79 -0
- package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
- package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
- package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
- package/dist/esm/shared/codec/s3/offloader.js +278 -0
- package/dist/{shared/concurrency.js → esm/shared/concurrency.d.ts} +2 -37
- package/dist/esm/shared/concurrency.js +27 -0
- package/dist/{shared/dynamodb/abort.js → esm/shared/dynamodb/abort.d.ts} +4 -16
- package/dist/esm/shared/dynamodb/abort.js +12 -0
- package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
- package/dist/esm/shared/dynamodb/batch-write.js +74 -0
- package/dist/{shared/dynamodb/cancellation.js → esm/shared/dynamodb/cancellation.d.ts} +25 -53
- package/dist/esm/shared/dynamodb/cancellation.js +30 -0
- package/dist/{shared/dynamodb/client.js → esm/shared/dynamodb/client.d.ts} +74 -64
- package/dist/esm/shared/dynamodb/client.js +35 -0
- package/dist/{shared/dynamodb/idempotent-write.js → esm/shared/dynamodb/idempotent-write.d.ts} +172 -169
- package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
- package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
- package/dist/esm/shared/dynamodb/paginate.js +84 -0
- package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
- package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
- package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
- package/dist/esm/shared/dynamodb/recency-index.js +136 -0
- package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
- package/dist/esm/shared/dynamodb/retry.js +180 -0
- package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
- package/dist/esm/shared/dynamodb/row-size.js +26 -0
- package/dist/{shared/dynamodb/table-schema.js → esm/shared/dynamodb/table-schema.d.ts} +57 -67
- package/dist/esm/shared/dynamodb/table-schema.js +43 -0
- package/dist/esm/shared/errors/base-error.d.ts +231 -0
- package/dist/esm/shared/errors/base-error.js +64 -0
- package/dist/esm/shared/errors/boundary.d.ts +86 -0
- package/dist/esm/shared/errors/boundary.js +54 -0
- package/dist/esm/shared/errors/classify.d.ts +206 -0
- package/dist/esm/shared/errors/classify.js +220 -0
- package/dist/{shared/errors/error-code.js → esm/shared/errors/error-code.d.ts} +39 -43
- package/dist/esm/shared/errors/error-code.js +24 -0
- package/dist/{shared/errors/errors.js → esm/shared/errors/errors.d.ts} +92 -98
- package/dist/esm/shared/errors/errors.js +110 -0
- package/dist/{shared/logging/logger.js → esm/shared/logging/logger.d.ts} +22 -52
- package/dist/esm/shared/logging/logger.js +25 -0
- package/dist/esm/shared/logging/redaction.d.ts +123 -0
- package/dist/esm/shared/logging/redaction.js +140 -0
- package/dist/{shared/logging/secret-patterns.js → esm/shared/logging/secret-patterns.d.ts} +46 -87
- package/dist/esm/shared/logging/secret-patterns.js +83 -0
- package/dist/{shared/logging/truncate.js → esm/shared/logging/truncate.d.ts} +6 -40
- package/dist/esm/shared/logging/truncate.js +25 -0
- package/dist/esm/shared/options.d.ts +100 -0
- package/dist/esm/shared/options.js +1 -0
- package/dist/{shared/ulid.js → esm/shared/ulid.d.ts} +4 -84
- package/dist/esm/shared/ulid.js +77 -0
- package/dist/{shared/validation/collaborators.js → esm/shared/validation/collaborators.d.ts} +37 -65
- package/dist/esm/shared/validation/collaborators.js +70 -0
- package/dist/{shared/validation/option-shape.js → esm/shared/validation/option-shape.d.ts} +14 -36
- package/dist/esm/shared/validation/option-shape.js +24 -0
- package/dist/esm/shared/validation/options.d.ts +145 -0
- package/dist/esm/shared/validation/options.js +156 -0
- package/dist/{shared/validation/primitives.js → esm/shared/validation/primitives.d.ts} +30 -125
- package/dist/esm/shared/validation/primitives.js +100 -0
- package/dist/esm/shared/validation/ttl.d.ts +94 -0
- package/dist/esm/shared/validation/ttl.js +46 -0
- package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
- package/dist/esm/store/actions/list-namespaces.js +86 -0
- package/dist/esm/store/actions/put.d.ts +43 -0
- package/dist/esm/store/actions/put.js +46 -0
- package/dist/{store/actions/reconcile-vector-index.js → esm/store/actions/reconcile-vector-index.d.ts} +8 -16
- package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
- package/dist/esm/store/actions/search.d.ts +38 -0
- package/dist/esm/store/actions/search.js +23 -0
- package/dist/esm/store/internal/batch-plan.d.ts +56 -0
- package/dist/esm/store/internal/batch-plan.js +28 -0
- package/dist/esm/store/internal/filter.d.ts +43 -0
- package/dist/esm/store/internal/filter.js +60 -0
- package/dist/esm/store/internal/get-item.d.ts +77 -0
- package/dist/esm/store/internal/get-item.js +54 -0
- package/dist/esm/store/internal/item-write.d.ts +270 -0
- package/dist/esm/store/internal/item-write.js +173 -0
- package/dist/esm/store/internal/parse.d.ts +230 -0
- package/dist/esm/store/internal/parse.js +169 -0
- package/dist/{store/internal/rows.js → esm/store/internal/rows.d.ts} +111 -199
- package/dist/esm/store/internal/rows.js +147 -0
- package/dist/esm/store/internal/semantic-search.d.ts +168 -0
- package/dist/esm/store/internal/semantic-search.js +200 -0
- package/dist/esm/store/internal/setup.d.ts +96 -0
- package/dist/esm/store/internal/setup.js +98 -0
- package/dist/esm/store/internal/table-search.d.ts +100 -0
- package/dist/esm/store/internal/table-search.js +119 -0
- package/dist/esm/store/internal/vector-index.d.ts +258 -0
- package/dist/esm/store/internal/vector-index.js +256 -0
- package/dist/{store/store.js → esm/store/store.d.ts} +99 -133
- package/dist/esm/store/store.js +93 -0
- package/dist/esm/store/types.d.ts +111 -0
- package/dist/esm/store/types.js +1 -0
- package/dist/esm/store/vector-backend.d.ts +104 -0
- package/dist/esm/store/vector-backend.js +1 -0
- package/package.json +50 -44
- package/dist/backfill/backfill.js +0 -393
- package/dist/checkpointer/actions/list.js +0 -142
- package/dist/checkpointer/actions/put.js +0 -195
- package/dist/checkpointer/internal/delta-history.js +0 -252
- package/dist/checkpointer/internal/parse.js +0 -372
- package/dist/checkpointer/internal/pending-writes.js +0 -588
- package/dist/checkpointer/internal/read.js +0 -264
- package/dist/checkpointer/internal/rows.js +0 -834
- package/dist/checkpointer/internal/setup.js +0 -72
- package/dist/checkpointer/types.js +0 -12
- package/dist/factory/factory.js +0 -266
- package/dist/factory/types.js +0 -10
- package/dist/history/actions/get-messages.js +0 -141
- package/dist/history/actions/list-sessions.js +0 -156
- package/dist/history/internal/append.js +0 -500
- package/dist/history/internal/message-read.js +0 -204
- package/dist/history/internal/parse.js +0 -252
- package/dist/history/internal/session.js +0 -628
- package/dist/history/internal/setup.js +0 -106
- package/dist/history/types.js +0 -12
- package/dist/index.js +0 -51
- package/dist/shared/adapter.js +0 -143
- package/dist/shared/codec/codec.js +0 -441
- package/dist/shared/codec/compression.js +0 -89
- package/dist/shared/codec/json-serde.js +0 -191
- package/dist/shared/codec/s3/client-types.js +0 -26
- package/dist/shared/codec/s3/client.js +0 -97
- package/dist/shared/codec/s3/lifecycle.js +0 -355
- package/dist/shared/codec/s3/offloader.js +0 -658
- package/dist/shared/dynamodb/batch-write.js +0 -173
- package/dist/shared/dynamodb/paginate.js +0 -188
- package/dist/shared/dynamodb/partition-delete.js +0 -340
- package/dist/shared/dynamodb/recency-index.js +0 -377
- package/dist/shared/dynamodb/retry.js +0 -463
- package/dist/shared/errors/base-error.js +0 -174
- package/dist/shared/errors/boundary.js +0 -143
- package/dist/shared/errors/classify.d.ts +0 -97
- package/dist/shared/errors/classify.js +0 -257
- package/dist/shared/logging/redaction.js +0 -316
- package/dist/shared/options.js +0 -11
- package/dist/shared/validation/options.js +0 -328
- package/dist/shared/validation/ttl.js +0 -132
- package/dist/store/actions/list-namespaces.js +0 -197
- package/dist/store/actions/put.js +0 -78
- package/dist/store/actions/search.js +0 -66
- package/dist/store/internal/batch-plan.d.ts +0 -26
- package/dist/store/internal/batch-plan.js +0 -109
- package/dist/store/internal/filter.js +0 -137
- package/dist/store/internal/get-item.d.ts +0 -45
- package/dist/store/internal/get-item.js +0 -115
- package/dist/store/internal/item-write.js +0 -463
- package/dist/store/internal/parse.js +0 -350
- package/dist/store/internal/semantic-search.js +0 -389
- package/dist/store/internal/setup.js +0 -223
- package/dist/store/internal/table-search.js +0 -213
- package/dist/store/internal/vector-index.js +0 -546
- package/dist/store/types.js +0 -15
- package/dist/store/vector-backend.js +0 -17
- /package/dist/{shared → cjs/shared}/clock.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/codec/json-serde.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/concurrency.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/dynamodb/cancellation.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/logging/logger.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/logging/truncate.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/ulid.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/validation/primitives.d.ts +0 -0
- /package/dist/{store → cjs/store}/vector-backend.d.ts +0 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redactSecrets = redactSecrets;
|
|
4
|
+
exports.redactLogger = redactLogger;
|
|
5
|
+
exports.walkObject = walkObject;
|
|
6
|
+
const errors_js_1 = require("../errors/errors.js");
|
|
7
|
+
const collaborators_js_1 = require("../validation/collaborators.js");
|
|
8
|
+
const option_shape_js_1 = require("../validation/option-shape.js");
|
|
9
|
+
const primitives_js_1 = require("../validation/primitives.js");
|
|
10
|
+
const logger_js_1 = require("./logger.js");
|
|
11
|
+
const secret_patterns_js_1 = require("./secret-patterns.js");
|
|
12
|
+
const UNREDACTABLE = '[UNREDACTABLE]';
|
|
13
|
+
function assertRegExpArray(value, field) {
|
|
14
|
+
if (!Array.isArray(value) || value.some((entry) => !(0, secret_patterns_js_1.isRegExp)(entry))) {
|
|
15
|
+
throw (0, errors_js_1.validationError)(`${field} must be an array of RegExp`, field);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function assertKeyPatterns(value, field) {
|
|
19
|
+
(0, primitives_js_1.assertStringArray)(value, field);
|
|
20
|
+
if (value.some((entry) => (0, secret_patterns_js_1.normaliseKey)(entry) === '')) {
|
|
21
|
+
throw (0, errors_js_1.validationError)(`${field} must name a letter or digit in every entry`, field);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function redactSecrets(value, patterns = secret_patterns_js_1.DEFAULT_SECRET_KEY_PATTERNS, valuePatterns = secret_patterns_js_1.DEFAULT_SECRET_VALUE_PATTERNS) {
|
|
25
|
+
assertKeyPatterns(patterns, 'patterns');
|
|
26
|
+
assertRegExpArray(valuePatterns, 'valuePatterns');
|
|
27
|
+
const keyPatterns = patterns.map(secret_patterns_js_1.normaliseKey);
|
|
28
|
+
const walking = new WeakSet();
|
|
29
|
+
const done = new WeakMap();
|
|
30
|
+
const walk = (current) => {
|
|
31
|
+
if (typeof current === 'string')
|
|
32
|
+
return (0, secret_patterns_js_1.redactText)(current, valuePatterns);
|
|
33
|
+
if (current === null || typeof current !== 'object')
|
|
34
|
+
return current;
|
|
35
|
+
if (done.has(current))
|
|
36
|
+
return done.get(current);
|
|
37
|
+
if (walking.has(current))
|
|
38
|
+
return '[Circular]';
|
|
39
|
+
walking.add(current);
|
|
40
|
+
try {
|
|
41
|
+
const redacted = walkObject(current, { keyPatterns, valuePatterns, walk });
|
|
42
|
+
done.set(current, redacted);
|
|
43
|
+
return redacted;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
walking.delete(current);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
try {
|
|
50
|
+
return walk(value);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return UNREDACTABLE;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function assertRedactionOptions(options) {
|
|
57
|
+
(0, option_shape_js_1.assertObjectShape)(options, 'options');
|
|
58
|
+
if (options.extraKeys !== undefined)
|
|
59
|
+
assertKeyPatterns(options.extraKeys, 'extraKeys');
|
|
60
|
+
if (options.extraValuePatterns !== undefined) {
|
|
61
|
+
assertRegExpArray(options.extraValuePatterns, 'extraValuePatterns');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function redactLogger(inner, options = {}) {
|
|
65
|
+
(0, collaborators_js_1.assertMembers)(inner, collaborators_js_1.LOGGER_MEMBERS, 'logger');
|
|
66
|
+
assertRedactionOptions(options);
|
|
67
|
+
const patterns = options.extraKeys
|
|
68
|
+
? [...secret_patterns_js_1.DEFAULT_SECRET_KEY_PATTERNS, ...options.extraKeys.map(secret_patterns_js_1.normaliseKey)]
|
|
69
|
+
: secret_patterns_js_1.DEFAULT_SECRET_KEY_PATTERNS;
|
|
70
|
+
const valuePatterns = options.extraValuePatterns
|
|
71
|
+
? [...secret_patterns_js_1.DEFAULT_SECRET_VALUE_PATTERNS, ...options.extraValuePatterns]
|
|
72
|
+
: secret_patterns_js_1.DEFAULT_SECRET_VALUE_PATTERNS;
|
|
73
|
+
const deliver = (method) => (message, ...args) => (0, logger_js_1.absorbLoggerFailure)(() => inner[method](message, ...args.map((arg) => redactSecrets(arg, patterns, valuePatterns))));
|
|
74
|
+
return {
|
|
75
|
+
info: deliver('info'),
|
|
76
|
+
warn: deliver('warn'),
|
|
77
|
+
error: deliver('error'),
|
|
78
|
+
debug: deliver('debug'),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function isSetValue(value) {
|
|
82
|
+
return Object.prototype.toString.call(value) === '[object Set]';
|
|
83
|
+
}
|
|
84
|
+
function isMapValue(value) {
|
|
85
|
+
return Object.prototype.toString.call(value) === '[object Map]';
|
|
86
|
+
}
|
|
87
|
+
function isErrorValue(value) {
|
|
88
|
+
const tag = Object.prototype.toString.call(value);
|
|
89
|
+
return tag === '[object Error]' || tag === '[object DOMException]';
|
|
90
|
+
}
|
|
91
|
+
function isOpaqueValue(value) {
|
|
92
|
+
const tag = Object.prototype.toString.call(value);
|
|
93
|
+
return tag === '[object Date]' || tag === '[object RegExp]';
|
|
94
|
+
}
|
|
95
|
+
function redactEntries(entries, keyPatterns, walk) {
|
|
96
|
+
const out = {};
|
|
97
|
+
for (const [key, value] of entries) {
|
|
98
|
+
Object.defineProperty(out, key, {
|
|
99
|
+
value: (0, secret_patterns_js_1.isSecretKey)(key, keyPatterns) ? secret_patterns_js_1.REDACTED : walk(value),
|
|
100
|
+
enumerable: true,
|
|
101
|
+
writable: true,
|
|
102
|
+
configurable: true,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
function redactMap(value, deps) {
|
|
108
|
+
const entries = [...value].map(([key, entry]) => {
|
|
109
|
+
const keyText = key;
|
|
110
|
+
return [String(keyText), entry];
|
|
111
|
+
});
|
|
112
|
+
return redactEntries(entries, deps.keyPatterns, deps.walk);
|
|
113
|
+
}
|
|
114
|
+
function redactError(current, entries, deps) {
|
|
115
|
+
const text = (0, secret_patterns_js_1.redactErrorText)(current, deps.valuePatterns);
|
|
116
|
+
const aggregated = current.errors;
|
|
117
|
+
const bare = entries.length === 0 && current.cause === undefined && aggregated === undefined;
|
|
118
|
+
if (bare && !text.changed)
|
|
119
|
+
return current;
|
|
120
|
+
const out = redactEntries(entries, deps.keyPatterns, deps.walk);
|
|
121
|
+
out.name = text.name;
|
|
122
|
+
out.message = text.message;
|
|
123
|
+
out.stack = text.stack;
|
|
124
|
+
if (current.cause !== undefined)
|
|
125
|
+
out.cause = deps.walk(current.cause);
|
|
126
|
+
if (Array.isArray(aggregated))
|
|
127
|
+
out.errors = deps.walk(aggregated);
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
function walkObject(current, deps) {
|
|
131
|
+
if (Array.isArray(current))
|
|
132
|
+
return current.map(deps.walk);
|
|
133
|
+
if (ArrayBuffer.isView(current))
|
|
134
|
+
return (0, secret_patterns_js_1.binaryLabel)(current);
|
|
135
|
+
if (isOpaqueValue(current))
|
|
136
|
+
return current;
|
|
137
|
+
if (isSetValue(current))
|
|
138
|
+
return [...current].map(deps.walk);
|
|
139
|
+
if (isMapValue(current))
|
|
140
|
+
return redactMap(current, deps);
|
|
141
|
+
const entries = Object.entries(current);
|
|
142
|
+
if (isErrorValue(current))
|
|
143
|
+
return redactError(current, entries, deps);
|
|
144
|
+
return redactEntries(entries, deps.keyPatterns, deps.walk);
|
|
145
|
+
}
|
|
@@ -40,15 +40,23 @@ export declare function normaliseKey(key: string): string;
|
|
|
40
40
|
*
|
|
41
41
|
* The credential-pair pattern (last) tolerates a **closing quote after the
|
|
42
42
|
* keyword**, because that is what `JSON.stringify` produces
|
|
43
|
-
* (`{"password":"…"}`) and
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
43
|
+
* (`{"password":"…"}`), and a backslash before that quote, because a JSON body
|
|
44
|
+
* quoted inside another JSON string — the shape a logged HTTP error carries —
|
|
45
|
+
* reads `{\"password\":\"…\"}`; requiring the separator to follow the bare
|
|
46
|
+
* keyword would match nothing in either, a silent, complete bypass on the
|
|
47
|
+
* most common shapes a downstream error arrives in. Its keywords include the
|
|
48
|
+
* hyphenated and spaced spellings of an API key (`x-api-key`, `api key`), a
|
|
49
|
+
* secret key and a client secret. Its group 1 is the keyword and separator,
|
|
50
|
+
* preserved by {@link redactText}.
|
|
51
|
+
*
|
|
52
|
+
* Its value side tries four shapes, and their order is load-bearing:
|
|
49
53
|
* 1. a fully-quoted span that consumes escapes, so `{"password":"a\"b"}` is
|
|
50
54
|
* redacted whole. Ending the span at the escaped quote stopped the
|
|
51
55
|
* redaction short and printed the rest of the secret verbatim.
|
|
56
|
+
* 1b. a span quoted with escaped quotes, `\"…\"`, the doubly encoded form of
|
|
57
|
+
* the first; it ends at the next quote, so a quote inside such a secret
|
|
58
|
+
* leaves its tail in the clear, and the sibling fields after it stay
|
|
59
|
+
* intact where the line-end fallback would take them too.
|
|
52
60
|
* 2. an unquoted JSON scalar — number, `true`, `false`, `null` — required to
|
|
53
61
|
* end at a real delimiter — `,`, `}`, `]` or end of input, optionally
|
|
54
62
|
* preceded by whitespace. Without this alternative,
|
|
@@ -62,6 +70,17 @@ export declare function normaliseKey(key: string): string;
|
|
|
62
70
|
* 3. the rest of the line, so a multi-word secret is redacted whole instead of
|
|
63
71
|
* up to its first space. Trying the two precise shapes first is what keeps
|
|
64
72
|
* this fallback from over-redacting sibling JSON fields.
|
|
73
|
+
*
|
|
74
|
+
* The JWT pattern (third) must scan in linear time, because these patterns
|
|
75
|
+
* run on text a caller controls — anything passed to `redactSecrets` or
|
|
76
|
+
* `redactLogger`, and an error's whole message before `redactedMessage` cuts
|
|
77
|
+
* it. A token's header segment is therefore not allowed to run across a `-`
|
|
78
|
+
* that opens another `eyJ`: written as `eyJ[A-Za-z0-9_-]+`, every `-eyJ` in a
|
|
79
|
+
* long run of token characters started a fresh scan to the end of the run, so
|
|
80
|
+
* 400 KB of `-eyJ` held the event loop for about 13 seconds. The only output
|
|
81
|
+
* this changes is a token whose header segment itself contains `-eyJ`: it is
|
|
82
|
+
* redacted from that point on, which can leave part of the header — never the
|
|
83
|
+
* payload or the signature — in the clear.
|
|
65
84
|
*/
|
|
66
85
|
export declare const DEFAULT_SECRET_VALUE_PATTERNS: readonly RegExp[];
|
|
67
86
|
/**
|
|
@@ -199,6 +218,10 @@ export interface RedactedErrorText {
|
|
|
199
218
|
* for truncation. A consumer who wants a bound has their own transport to put
|
|
200
219
|
* one in.
|
|
201
220
|
*
|
|
202
|
-
* Throws: **nothing**, for any value
|
|
221
|
+
* Throws: **nothing**, for any value: a `name` or `stack` that cannot be read
|
|
222
|
+
* — a getter of the consumer's own that throws, a `name` whose `toString`
|
|
223
|
+
* throws — is reported as `[unreadable name]` or `[unreadable stack]`, since
|
|
224
|
+
* the one thing this must not do on the way to the consumer's transport is
|
|
225
|
+
* fail.
|
|
203
226
|
*/
|
|
204
227
|
export declare function redactErrorText(error: Error, patterns: readonly RegExp[]): RedactedErrorText;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_SECRET_VALUE_PATTERNS = exports.DEFAULT_SECRET_KEY_PATTERNS = exports.REDACTED = void 0;
|
|
4
|
+
exports.normaliseKey = normaliseKey;
|
|
5
|
+
exports.isSecretKey = isSecretKey;
|
|
6
|
+
exports.redactedMessage = redactedMessage;
|
|
7
|
+
exports.isRegExp = isRegExp;
|
|
8
|
+
exports.redactText = redactText;
|
|
9
|
+
exports.binaryLabel = binaryLabel;
|
|
10
|
+
exports.redactErrorText = redactErrorText;
|
|
11
|
+
const base_error_js_1 = require("../errors/base-error.js");
|
|
12
|
+
const truncate_js_1 = require("./truncate.js");
|
|
13
|
+
exports.REDACTED = '[REDACTED]';
|
|
14
|
+
exports.DEFAULT_SECRET_KEY_PATTERNS = [
|
|
15
|
+
'accesskey',
|
|
16
|
+
'accesskeyid',
|
|
17
|
+
'secret',
|
|
18
|
+
'sessiontoken',
|
|
19
|
+
'securitytoken',
|
|
20
|
+
'authorization',
|
|
21
|
+
'password',
|
|
22
|
+
'passwd',
|
|
23
|
+
'passphrase',
|
|
24
|
+
'apikey',
|
|
25
|
+
'bearer',
|
|
26
|
+
'token',
|
|
27
|
+
'privatekey',
|
|
28
|
+
'secretkey',
|
|
29
|
+
];
|
|
30
|
+
function normaliseKey(key) {
|
|
31
|
+
return key.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
32
|
+
}
|
|
33
|
+
exports.DEFAULT_SECRET_VALUE_PATTERNS = [
|
|
34
|
+
/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,
|
|
35
|
+
/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,
|
|
36
|
+
/\beyJ(?:[A-Za-z0-9_]|-(?!eyJ))+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
|
|
37
|
+
/((?:aws_)?(?:secret_access_key|secretaccesskey|secret_?key|client_?secret|password|passwd|api[-_ ]?key|token)(?:\\?["'])?\s*[=:]\s*)(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\\"[^"\r\n]*\\"|\\'[^'\r\n]*\\'|(?:-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|true|false|null)(?=\s*[,}\]]|\s*$)|[^\r\n]+)/gi,
|
|
38
|
+
];
|
|
39
|
+
function isSecretKey(key, patterns) {
|
|
40
|
+
const normalised = normaliseKey(key);
|
|
41
|
+
return patterns.some((pattern) => normalised === pattern || normalised.endsWith(pattern));
|
|
42
|
+
}
|
|
43
|
+
function redactedMessage(error) {
|
|
44
|
+
return (0, truncate_js_1.truncateRelayedText)(redactText((0, base_error_js_1.toError)(error).message, exports.DEFAULT_SECRET_VALUE_PATTERNS));
|
|
45
|
+
}
|
|
46
|
+
function globalCopyOf(pattern) {
|
|
47
|
+
const flags = pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`;
|
|
48
|
+
return new RegExp(pattern.source, flags);
|
|
49
|
+
}
|
|
50
|
+
function isRegExp(value) {
|
|
51
|
+
return Object.prototype.toString.call(value) === '[object RegExp]';
|
|
52
|
+
}
|
|
53
|
+
function redactText(value, patterns) {
|
|
54
|
+
return patterns.reduce((text, pattern) => {
|
|
55
|
+
if (!isRegExp(pattern))
|
|
56
|
+
return text;
|
|
57
|
+
return text.replace(globalCopyOf(pattern), (_match, prefix) => typeof prefix === 'string' ? `${prefix}${exports.REDACTED}` : exports.REDACTED);
|
|
58
|
+
}, value);
|
|
59
|
+
}
|
|
60
|
+
function binaryLabel(value) {
|
|
61
|
+
return `[${value.constructor.name}(${value.byteLength})]`;
|
|
62
|
+
}
|
|
63
|
+
function redactErrorText(error, patterns) {
|
|
64
|
+
const described = (0, base_error_js_1.toError)(error);
|
|
65
|
+
const rawName = nameOf(described);
|
|
66
|
+
const rawStack = stackOf(described);
|
|
67
|
+
const name = redactText(rawName, patterns);
|
|
68
|
+
const message = redactText(described.message, patterns);
|
|
69
|
+
const stack = rawStack === undefined ? undefined : redactText(rawStack, patterns);
|
|
70
|
+
return {
|
|
71
|
+
name,
|
|
72
|
+
message,
|
|
73
|
+
stack,
|
|
74
|
+
changed: name !== rawName || message !== described.message || stack !== rawStack,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function nameOf(error) {
|
|
78
|
+
try {
|
|
79
|
+
return String(error.name);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return '[unreadable name]';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function stackOf(error) {
|
|
86
|
+
try {
|
|
87
|
+
const { stack } = error;
|
|
88
|
+
return stack === undefined ? undefined : String(stack);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return '[unreadable stack]';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_RELAYED_MESSAGE_CHARS = exports.MAX_LOGGED_LABELS = exports.MAX_LOGGED_VALUE_CHARS = void 0;
|
|
4
|
+
exports.truncateForLog = truncateForLog;
|
|
5
|
+
exports.truncateRelayedText = truncateRelayedText;
|
|
6
|
+
exports.truncateLabelsForLog = truncateLabelsForLog;
|
|
7
|
+
exports.MAX_LOGGED_VALUE_CHARS = 256;
|
|
8
|
+
exports.MAX_LOGGED_LABELS = 8;
|
|
9
|
+
exports.MAX_RELAYED_MESSAGE_CHARS = 1024;
|
|
10
|
+
function isHighSurrogate(unit) {
|
|
11
|
+
return unit >= 0xd800 && unit <= 0xdbff;
|
|
12
|
+
}
|
|
13
|
+
function cutTo(value, max) {
|
|
14
|
+
if (typeof value !== 'string' || value.length <= max)
|
|
15
|
+
return value;
|
|
16
|
+
const last = value.charCodeAt(max - 1);
|
|
17
|
+
const kept = isHighSurrogate(last) ? max - 1 : max;
|
|
18
|
+
return `${value.slice(0, kept)}…(len ${value.length})`;
|
|
19
|
+
}
|
|
20
|
+
function truncateForLog(value) {
|
|
21
|
+
return cutTo(value, exports.MAX_LOGGED_VALUE_CHARS);
|
|
22
|
+
}
|
|
23
|
+
function truncateRelayedText(value) {
|
|
24
|
+
return cutTo(value, exports.MAX_RELAYED_MESSAGE_CHARS);
|
|
25
|
+
}
|
|
26
|
+
function truncateLabelsForLog(labels) {
|
|
27
|
+
if (!Array.isArray(labels))
|
|
28
|
+
return labels;
|
|
29
|
+
const kept = labels.slice(0, exports.MAX_LOGGED_LABELS).map((label) => truncateForLog(label));
|
|
30
|
+
return labels.length > exports.MAX_LOGGED_LABELS ? [...kept, `…(len ${labels.length})`] : kept;
|
|
31
|
+
}
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
* one place. This module holds their types only; checking them is elsewhere.
|
|
9
9
|
*/
|
|
10
10
|
import type { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
11
|
-
import type { CompressionConfig } from './codec/compression';
|
|
12
|
-
import type { S3OffloadConfig } from './codec/s3/config';
|
|
13
|
-
import type { DynamoDBDocumentLike } from './dynamodb/client';
|
|
14
|
-
import type { RetryPolicy } from './dynamodb/retry';
|
|
15
|
-
import type { Logger } from './logging/logger';
|
|
16
|
-
import type { TtlOption } from './validation/ttl';
|
|
11
|
+
import type { CompressionConfig } from './codec/compression.js';
|
|
12
|
+
import type { S3OffloadConfig } from './codec/s3/config.js';
|
|
13
|
+
import type { DynamoDBDocumentLike } from './dynamodb/client.js';
|
|
14
|
+
import type { RetryPolicy } from './dynamodb/retry.js';
|
|
15
|
+
import type { Logger } from './logging/logger.js';
|
|
16
|
+
import type { TtlOption } from './validation/ttl.js';
|
|
17
17
|
/**
|
|
18
18
|
* Options common to every adapter (the unified options shape). An adapter
|
|
19
19
|
* either reuses an injected `client` or builds one from `clientConfig`.
|
|
@@ -34,10 +34,14 @@ export interface BaseAdapterOptions {
|
|
|
34
34
|
/**
|
|
35
35
|
* Index partitions per adapter in the recency index (GSI1), default 8.
|
|
36
36
|
*
|
|
37
|
-
*
|
|
38
|
-
* index, so enabling it later needs
|
|
39
|
-
*
|
|
40
|
-
*
|
|
37
|
+
* Checkpoint and session rows carry the index attributes whether or not the
|
|
38
|
+
* table defines the index, so enabling it later needs only a backfill of the
|
|
39
|
+
* rows written before. The value is fixed for the table's life. Every row
|
|
40
|
+
* keeps the shard it was written with, and `backfillRecencyIndex` writes
|
|
41
|
+
* keys only to rows that have none, so it cannot move a row. Raising the
|
|
42
|
+
* count is safe: the old shards stay among the ones a listing queries.
|
|
43
|
+
* Lowering it hides every row on a dropped shard from the listings. The
|
|
44
|
+
* store takes no `indexShards`.
|
|
41
45
|
*
|
|
42
46
|
* A single index partition per adapter would concentrate every listing on
|
|
43
47
|
* one partition, which is worse than the table scan it replaces.
|
|
@@ -54,6 +58,9 @@ export interface BaseAdapterOptions {
|
|
|
54
58
|
* `saver.list` without a `thread_id`, which streams it and takes no cursor.
|
|
55
59
|
* Leaving it unset keeps both on the table scan, so the index can be created
|
|
56
60
|
* and backfilled before any adapter reads it.
|
|
61
|
+
*
|
|
62
|
+
* The store takes no `indexName`: its rootless search and its namespace
|
|
63
|
+
* listing stay table scans.
|
|
57
64
|
*/
|
|
58
65
|
indexName?: string;
|
|
59
66
|
/**
|
|
@@ -79,6 +86,15 @@ export interface CodecOptions {
|
|
|
79
86
|
}
|
|
80
87
|
/** Per-call cancellation for the long-running adapter methods. */
|
|
81
88
|
export interface CancelOptions {
|
|
82
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* Aborting it rejects the call with an `ABORTED` error — carrying the abort
|
|
91
|
+
* reason as `cause` — whether the signal was already aborted (nothing is
|
|
92
|
+
* sent), aborts while the call waits between requests, or aborts while a
|
|
93
|
+
* request is in flight: the signal reaches the AWS SDK on every DynamoDB
|
|
94
|
+
* request and S3 transfer the call makes for you, so the request itself
|
|
95
|
+
* ends. The verification reads and the cleanup that follow a failure run to
|
|
96
|
+
* completion regardless. A value that is not `AbortSignal`-shaped is refused
|
|
97
|
+
* with `VALIDATION` naming `signal` before anything is sent.
|
|
98
|
+
*/
|
|
83
99
|
signal?: AbortSignal;
|
|
84
100
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ULID_TIME_RANGE_MS = void 0;
|
|
4
|
+
exports.secureRng = secureRng;
|
|
5
|
+
exports.ulidTimePrefix = ulidTimePrefix;
|
|
6
|
+
exports.createUlidFactory = createUlidFactory;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const errors_js_1 = require("./errors/errors.js");
|
|
9
|
+
const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
10
|
+
const ENCODING_LEN = 32;
|
|
11
|
+
const TIME_CHARS = 10;
|
|
12
|
+
const RANDOM_CHARS = 16;
|
|
13
|
+
exports.ULID_TIME_RANGE_MS = ENCODING_LEN ** TIME_CHARS;
|
|
14
|
+
const RNG_POOL_BYTES = 256;
|
|
15
|
+
function secureRng() {
|
|
16
|
+
let pool = Buffer.alloc(0);
|
|
17
|
+
let offset = 0;
|
|
18
|
+
return () => {
|
|
19
|
+
if (offset >= pool.length) {
|
|
20
|
+
pool = (0, node_crypto_1.randomBytes)(RNG_POOL_BYTES);
|
|
21
|
+
offset = 0;
|
|
22
|
+
}
|
|
23
|
+
const byte = pool[offset];
|
|
24
|
+
offset += 1;
|
|
25
|
+
return byte / 256;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function encodeTime(timeMs) {
|
|
29
|
+
let remaining = Math.floor(timeMs);
|
|
30
|
+
let out = '';
|
|
31
|
+
for (let i = 0; i < TIME_CHARS; i++) {
|
|
32
|
+
out = ENCODING[remaining % ENCODING_LEN] + out;
|
|
33
|
+
remaining = Math.floor(remaining / ENCODING_LEN);
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
function ulidTimePrefix(timeMs) {
|
|
38
|
+
if (!(timeMs >= 0 && timeMs < exports.ULID_TIME_RANGE_MS)) {
|
|
39
|
+
throw (0, errors_js_1.validationError)(`a ULID time prefix covers epoch milliseconds 0 to ${exports.ULID_TIME_RANGE_MS - 1} (the year ` +
|
|
40
|
+
`37648); ${timeMs} is outside it and has no ten-character encoding`);
|
|
41
|
+
}
|
|
42
|
+
return encodeTime(timeMs);
|
|
43
|
+
}
|
|
44
|
+
function randomDigits(rng) {
|
|
45
|
+
const digits = [];
|
|
46
|
+
for (let i = 0; i < RANDOM_CHARS; i++) {
|
|
47
|
+
digits.push(Math.floor(rng() * ENCODING_LEN));
|
|
48
|
+
}
|
|
49
|
+
return digits;
|
|
50
|
+
}
|
|
51
|
+
function incrementDigits(digits) {
|
|
52
|
+
const next = [...digits];
|
|
53
|
+
for (let i = RANDOM_CHARS - 1; i >= 0; i--) {
|
|
54
|
+
if (next[i] < ENCODING_LEN - 1) {
|
|
55
|
+
next[i] += 1;
|
|
56
|
+
return { digits: next, overflowed: false };
|
|
57
|
+
}
|
|
58
|
+
next[i] = 0;
|
|
59
|
+
}
|
|
60
|
+
return { digits: next, overflowed: true };
|
|
61
|
+
}
|
|
62
|
+
function createUlidFactory(now = Date.now, rng = secureRng()) {
|
|
63
|
+
let lastTime = -1;
|
|
64
|
+
let lastRandom = [];
|
|
65
|
+
return () => {
|
|
66
|
+
const time = now();
|
|
67
|
+
if (time > lastTime) {
|
|
68
|
+
lastTime = time;
|
|
69
|
+
lastRandom = randomDigits(rng);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const result = incrementDigits(lastRandom);
|
|
73
|
+
if (result.overflowed) {
|
|
74
|
+
lastTime += 1;
|
|
75
|
+
lastRandom = randomDigits(rng);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
lastRandom = result.digits;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return encodeTime(lastTime) + lastRandom.map((digit) => ENCODING[digit]).join('');
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* `AbortSignal` has, so a wrong object fails where it was passed and not at the
|
|
8
8
|
* first call deep inside an operation.
|
|
9
9
|
*/
|
|
10
|
-
import type { CancelOptions } from '../options';
|
|
10
|
+
import type { CancelOptions } from '../options.js';
|
|
11
11
|
/** The `DynamoDBDocument` methods this package calls on an injected `client`. */
|
|
12
12
|
export declare const CLIENT_MEMBERS: readonly string[];
|
|
13
13
|
/** The `Logger` methods every adapter calls. */
|
|
@@ -53,6 +53,23 @@ export declare const ABORT_SIGNAL_MEMBERS: Readonly<Record<string, 'boolean' | '
|
|
|
53
53
|
* the value.
|
|
54
54
|
*/
|
|
55
55
|
export declare function assertMembers(value: object, members: readonly string[], field: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Refuse an injected client whose document translation changes what this
|
|
58
|
+
* package writes or reads back.
|
|
59
|
+
*
|
|
60
|
+
* Accepts: `client` — the injected document client, or any object standing in
|
|
61
|
+
* for one; one without `config.translateConfig` translates the default way.
|
|
62
|
+
*
|
|
63
|
+
* Returns: nothing: the client is kept under its declared type, and this checks it.
|
|
64
|
+
*
|
|
65
|
+
* Throws: `VALIDATION` naming `client` when its `unmarshallOptions.wrapNumbers`
|
|
66
|
+
* is set — every number this package reads back (a row's format version, a
|
|
67
|
+
* `ttl`, a message count) would arrive wrapped, so a newer row would read as
|
|
68
|
+
* version 0 and a session as malformed — or when its
|
|
69
|
+
* `marshallOptions.convertEmptyValues` is on, which stores the root checkpoint
|
|
70
|
+
* namespace, the empty string, as NULL.
|
|
71
|
+
*/
|
|
72
|
+
export declare function assertClientTranslation(client: object): void;
|
|
56
73
|
/**
|
|
57
74
|
* Validate the collaborators every adapter shares: `client`, `logger` and
|
|
58
75
|
* `serde`. Pulled out of each `setUp*` as one call rather than three inline
|
|
@@ -67,7 +84,9 @@ export declare function assertMembers(value: object, members: readonly string[],
|
|
|
67
84
|
* and this checks it. A collaborator the caller did not supply is left
|
|
68
85
|
* untouched, so it still reaches its default.
|
|
69
86
|
*
|
|
70
|
-
* Throws: see {@link assertMembers}
|
|
87
|
+
* Throws: see {@link assertMembers} for a collaborator missing a method, and
|
|
88
|
+
* {@link assertClientTranslation} for a `client` whose translation would
|
|
89
|
+
* change how a row reads back.
|
|
71
90
|
*/
|
|
72
91
|
export declare function assertBaseCollaborators(options: {
|
|
73
92
|
client?: object;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CANCEL_KEYS = exports.ABORT_SIGNAL_MEMBERS = exports.VECTOR_BACKEND_MEMBERS = exports.EMBEDDINGS_MEMBERS = exports.SERDE_MEMBERS = exports.LOGGER_MEMBERS = exports.CLIENT_MEMBERS = void 0;
|
|
4
|
+
exports.assertMembers = assertMembers;
|
|
5
|
+
exports.assertClientTranslation = assertClientTranslation;
|
|
6
|
+
exports.assertBaseCollaborators = assertBaseCollaborators;
|
|
7
|
+
exports.isAbortSignalLike = isAbortSignalLike;
|
|
8
|
+
exports.assertSignalLike = assertSignalLike;
|
|
9
|
+
exports.assertCancelOptions = assertCancelOptions;
|
|
10
|
+
const errors_js_1 = require("../errors/errors.js");
|
|
11
|
+
const option_shape_js_1 = require("./option-shape.js");
|
|
12
|
+
exports.CLIENT_MEMBERS = [
|
|
13
|
+
'get',
|
|
14
|
+
'put',
|
|
15
|
+
'delete',
|
|
16
|
+
'update',
|
|
17
|
+
'query',
|
|
18
|
+
'scan',
|
|
19
|
+
'batchWrite',
|
|
20
|
+
'transactWrite',
|
|
21
|
+
];
|
|
22
|
+
exports.LOGGER_MEMBERS = ['debug', 'info', 'warn', 'error'];
|
|
23
|
+
exports.SERDE_MEMBERS = ['dumpsTyped', 'loadsTyped'];
|
|
24
|
+
exports.EMBEDDINGS_MEMBERS = ['embedQuery', 'embedDocuments'];
|
|
25
|
+
exports.VECTOR_BACKEND_MEMBERS = ['upsert', 'query', 'delete'];
|
|
26
|
+
exports.ABORT_SIGNAL_MEMBERS = {
|
|
27
|
+
aborted: 'boolean',
|
|
28
|
+
addEventListener: 'function',
|
|
29
|
+
removeEventListener: 'function',
|
|
30
|
+
};
|
|
31
|
+
function assertMembers(value, members, field) {
|
|
32
|
+
if (!(0, option_shape_js_1.isObjectShape)(value)) {
|
|
33
|
+
throw (0, errors_js_1.validationError)(`${field} must be an object`, field);
|
|
34
|
+
}
|
|
35
|
+
for (const member of members) {
|
|
36
|
+
if (typeof Reflect.get(value, member) !== 'function') {
|
|
37
|
+
throw (0, errors_js_1.validationError)(`${field}.${member} must be a function`, `${field}.${member}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function assertClientTranslation(client) {
|
|
42
|
+
const translate = client.config?.translateConfig;
|
|
43
|
+
if (translate?.unmarshallOptions?.wrapNumbers) {
|
|
44
|
+
throw (0, errors_js_1.validationError)('client reads numbers back wrapped (unmarshallOptions.wrapNumbers), where this package ' +
|
|
45
|
+
'reads a row version, a ttl and a count as numbers; inject a DynamoDBDocument built ' +
|
|
46
|
+
'without it', 'client');
|
|
47
|
+
}
|
|
48
|
+
if (translate?.marshallOptions?.convertEmptyValues === true) {
|
|
49
|
+
throw (0, errors_js_1.validationError)('client stores an empty string as NULL (marshallOptions.convertEmptyValues), which erases ' +
|
|
50
|
+
'the root checkpoint namespace; inject a DynamoDBDocument built without it', 'client');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function assertBaseCollaborators(options) {
|
|
54
|
+
if (options.client !== undefined) {
|
|
55
|
+
assertMembers(options.client, exports.CLIENT_MEMBERS, 'client');
|
|
56
|
+
assertClientTranslation(options.client);
|
|
57
|
+
}
|
|
58
|
+
if (options.logger !== undefined)
|
|
59
|
+
assertMembers(options.logger, exports.LOGGER_MEMBERS, 'logger');
|
|
60
|
+
if (options.serde !== undefined)
|
|
61
|
+
assertMembers(options.serde, exports.SERDE_MEMBERS, 'serde');
|
|
62
|
+
}
|
|
63
|
+
function isAbortSignalLike(value) {
|
|
64
|
+
if (typeof value !== 'object' || value === null)
|
|
65
|
+
return false;
|
|
66
|
+
return Object.entries(exports.ABORT_SIGNAL_MEMBERS).every(([member, type]) => typeof Reflect.get(value, member) === type);
|
|
67
|
+
}
|
|
68
|
+
function assertSignalLike(value, field = 'signal') {
|
|
69
|
+
if (value !== undefined && !isAbortSignalLike(value)) {
|
|
70
|
+
throw (0, errors_js_1.validationError)(`${field} must be an AbortSignal`, field);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.CANCEL_KEYS = (0, option_shape_js_1.allKeysOf)({ signal: 'signal' });
|
|
74
|
+
function assertCancelOptions(options) {
|
|
75
|
+
if (options === undefined)
|
|
76
|
+
return;
|
|
77
|
+
(0, option_shape_js_1.assertShape)(options, exports.CANCEL_KEYS, 'options');
|
|
78
|
+
assertSignalLike(options.signal);
|
|
79
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hides how an option object is told apart from a misspelt one.
|
|
3
3
|
*
|
|
4
|
-
* An option type lists its keys once, checked by the
|
|
5
|
-
* type, and an object carrying any other key is refused
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* An option type this package defines lists its keys once, checked by the
|
|
5
|
+
* compiler against the type, and an object carrying any other key is refused
|
|
6
|
+
* naming that key. An option object LangGraph defines is only held to being an
|
|
7
|
+
* object, since a key a later LangGraph adds must not refuse a call LangGraph
|
|
8
|
+
* makes (decision record 28). No caller writes the plain-object test or the
|
|
9
|
+
* unknown-key walk itself, so the message and the field a refusal names are the
|
|
10
|
+
* same for every option object this package reads.
|
|
9
11
|
*/
|
|
10
12
|
/**
|
|
11
13
|
* Every key of `T`, listed once.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.allKeysOf = allKeysOf;
|
|
4
|
+
exports.isObjectShape = isObjectShape;
|
|
5
|
+
exports.assertObjectShape = assertObjectShape;
|
|
6
|
+
exports.assertShape = assertShape;
|
|
7
|
+
exports.parseShape = parseShape;
|
|
8
|
+
const errors_js_1 = require("../errors/errors.js");
|
|
9
|
+
function allKeysOf(keys) {
|
|
10
|
+
return Object.keys(keys);
|
|
11
|
+
}
|
|
12
|
+
function isObjectShape(value) {
|
|
13
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
function assertObjectShape(value, field) {
|
|
16
|
+
if (!isObjectShape(value)) {
|
|
17
|
+
throw (0, errors_js_1.validationError)(`${field} must be an object`, field);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function assertShape(value, allowed, field) {
|
|
21
|
+
assertObjectShape(value, field);
|
|
22
|
+
for (const key of Object.keys(value)) {
|
|
23
|
+
if (!allowed.includes(key)) {
|
|
24
|
+
throw (0, errors_js_1.validationError)(`${field}.${key} is not an option this package reads; expected one of ${allowed.join(', ')}`, `${field}.${key}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function parseShape(value, allowed, field) {
|
|
29
|
+
assertShape(value, allowed, field);
|
|
30
|
+
return value;
|
|
31
|
+
}
|