@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.1 → 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 +1820 -290
- package/dist/cjs/backfill/backfill.d.ts +171 -0
- package/dist/cjs/backfill/backfill.js +177 -0
- package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
- package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
- package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
- package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
- package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
- package/dist/cjs/checkpointer/actions/list.js +70 -0
- package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
- package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
- package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
- package/dist/cjs/checkpointer/actions/put.js +79 -0
- package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
- package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
- package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
- package/dist/cjs/checkpointer/internal/listing.js +104 -0
- package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
- package/dist/cjs/checkpointer/internal/parse.js +184 -0
- package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
- package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
- package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
- package/dist/cjs/checkpointer/internal/read.js +132 -0
- package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
- package/dist/cjs/checkpointer/internal/rows.js +356 -0
- package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
- package/dist/cjs/checkpointer/internal/setup.js +25 -0
- package/dist/cjs/checkpointer/saver.d.ts +306 -0
- package/dist/cjs/checkpointer/saver.js +56 -0
- package/dist/cjs/checkpointer/types.d.ts +51 -0
- package/dist/cjs/factory/factory.d.ts +154 -0
- package/dist/cjs/factory/factory.js +137 -0
- package/dist/{factory → cjs/factory}/types.d.ts +33 -14
- package/dist/cjs/history/actions/add-messages.d.ts +51 -0
- package/dist/cjs/history/actions/add-messages.js +17 -0
- package/dist/cjs/history/actions/clear.d.ts +52 -0
- package/dist/cjs/history/actions/clear.js +29 -0
- package/dist/cjs/history/actions/get-messages.d.ts +60 -0
- package/dist/cjs/history/actions/get-messages.js +58 -0
- package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
- package/dist/cjs/history/actions/list-sessions.js +67 -0
- package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
- package/dist/cjs/history/actions/reconcile-count.js +8 -0
- package/dist/cjs/history/chat-message-history.d.ts +267 -0
- package/dist/cjs/history/chat-message-history.js +61 -0
- package/dist/cjs/history/internal/append.d.ts +244 -0
- package/dist/cjs/history/internal/append.js +267 -0
- package/dist/cjs/history/internal/message-read.d.ts +84 -0
- package/dist/cjs/history/internal/message-read.js +93 -0
- package/dist/cjs/history/internal/parse.d.ts +153 -0
- package/dist/cjs/history/internal/parse.js +113 -0
- package/dist/cjs/history/internal/rows.d.ts +196 -0
- package/dist/cjs/history/internal/rows.js +96 -0
- package/dist/cjs/history/internal/session.d.ts +350 -0
- package/dist/cjs/history/internal/session.js +296 -0
- package/dist/cjs/history/internal/setup.d.ts +64 -0
- package/dist/cjs/history/internal/setup.js +60 -0
- package/dist/cjs/history/session-adapter.d.ts +112 -0
- package/dist/cjs/history/session-adapter.js +38 -0
- package/dist/cjs/history/types.d.ts +102 -0
- package/dist/cjs/index.d.ts +53 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/shared/adapter.d.ts +146 -0
- package/dist/cjs/shared/adapter.js +70 -0
- package/dist/cjs/shared/clock.d.ts +52 -0
- package/dist/cjs/shared/clock.js +14 -0
- package/dist/cjs/shared/codec/codec.d.ts +336 -0
- package/dist/cjs/shared/codec/codec.js +162 -0
- package/dist/cjs/shared/codec/compression.d.ts +66 -0
- package/dist/cjs/shared/codec/compression.js +45 -0
- package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
- package/dist/cjs/shared/codec/json-serde.js +58 -0
- package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
- package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
- package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
- package/dist/cjs/shared/codec/s3/client.js +78 -0
- package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
- package/dist/cjs/shared/codec/s3/config.js +92 -0
- package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
- package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
- package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
- package/dist/cjs/shared/codec/s3/offloader.js +289 -0
- package/dist/cjs/shared/concurrency.d.ts +43 -0
- package/dist/{shared → cjs/shared}/concurrency.js +10 -9
- package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
- package/dist/cjs/shared/dynamodb/abort.js +16 -0
- package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
- package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
- package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
- package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
- package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
- package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
- package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
- package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
- package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
- package/dist/cjs/shared/dynamodb/paginate.js +90 -0
- package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
- package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
- package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
- package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
- package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
- 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/cjs/shared/dynamodb/table-schema.d.ts +199 -0
- package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
- package/dist/cjs/shared/errors/base-error.d.ts +231 -0
- package/dist/cjs/shared/errors/base-error.js +73 -0
- package/dist/cjs/shared/errors/boundary.d.ts +86 -0
- 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/cjs/shared/errors/error-code.d.ts +95 -0
- package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
- package/dist/cjs/shared/errors/errors.d.ts +233 -0
- package/dist/cjs/shared/errors/errors.js +123 -0
- package/dist/cjs/shared/logging/logger.d.ts +80 -0
- package/dist/cjs/shared/logging/logger.js +30 -0
- package/dist/cjs/shared/logging/redaction.d.ts +123 -0
- package/dist/cjs/shared/logging/redaction.js +145 -0
- package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
- package/dist/cjs/shared/logging/secret-patterns.js +93 -0
- package/dist/cjs/shared/logging/truncate.d.ts +197 -0
- package/dist/cjs/shared/logging/truncate.js +31 -0
- package/dist/cjs/shared/options.d.ts +100 -0
- package/dist/cjs/shared/ulid.d.ts +80 -0
- package/dist/{shared → cjs/shared}/ulid.js +7 -21
- package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
- package/dist/cjs/shared/validation/collaborators.js +79 -0
- package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
- package/dist/cjs/shared/validation/option-shape.js +31 -0
- package/dist/cjs/shared/validation/options.d.ts +145 -0
- package/dist/cjs/shared/validation/options.js +166 -0
- package/dist/cjs/shared/validation/primitives.d.ts +292 -0
- package/dist/cjs/shared/validation/primitives.js +114 -0
- package/dist/cjs/shared/validation/ttl.d.ts +94 -0
- package/dist/cjs/shared/validation/ttl.js +52 -0
- package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
- package/dist/cjs/store/actions/list-namespaces.js +92 -0
- package/dist/cjs/store/actions/put.d.ts +43 -0
- package/dist/cjs/store/actions/put.js +49 -0
- package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
- package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
- package/dist/cjs/store/actions/search.d.ts +38 -0
- 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/cjs/store/internal/filter.d.ts +43 -0
- 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/cjs/store/internal/item-write.d.ts +270 -0
- package/dist/cjs/store/internal/item-write.js +181 -0
- package/dist/cjs/store/internal/parse.d.ts +230 -0
- package/dist/cjs/store/internal/parse.js +180 -0
- package/dist/cjs/store/internal/rows.d.ts +359 -0
- package/dist/cjs/store/internal/rows.js +166 -0
- package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
- package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
- package/dist/cjs/store/internal/setup.d.ts +96 -0
- package/dist/cjs/store/internal/setup.js +103 -0
- package/dist/cjs/store/internal/table-search.d.ts +100 -0
- package/dist/cjs/store/internal/table-search.js +123 -0
- package/dist/cjs/store/internal/vector-index.d.ts +258 -0
- package/dist/cjs/store/internal/vector-index.js +269 -0
- package/dist/cjs/store/store.d.ts +329 -0
- package/dist/cjs/store/store.js +97 -0
- package/dist/cjs/store/types.d.ts +111 -0
- package/dist/cjs/store/vector-backend.d.ts +104 -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/esm/checkpointer/actions/delete-thread.d.ts +50 -0
- package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
- package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
- 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/esm/checkpointer/actions/put-writes.d.ts +49 -0
- 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/esm/checkpointer/internal/listing.d.ts +149 -0
- 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/esm/checkpointer/saver.d.ts +306 -0
- 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/esm/history/actions/add-messages.d.ts +51 -0
- package/dist/esm/history/actions/add-messages.js +14 -0
- package/dist/esm/history/actions/clear.d.ts +52 -0
- 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/esm/history/actions/reconcile-count.d.ts +49 -0
- package/dist/esm/history/actions/reconcile-count.js +5 -0
- package/dist/esm/history/chat-message-history.d.ts +267 -0
- 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/esm/history/internal/rows.d.ts +196 -0
- 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/esm/history/session-adapter.d.ts +112 -0
- 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/esm/shared/clock.d.ts +52 -0
- 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/esm/shared/codec/s3/config.d.ts +260 -0
- 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/esm/shared/concurrency.d.ts +43 -0
- package/dist/esm/shared/concurrency.js +27 -0
- package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
- 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/esm/shared/dynamodb/cancellation.d.ts +124 -0
- package/dist/esm/shared/dynamodb/cancellation.js +30 -0
- package/dist/esm/shared/dynamodb/client.d.ts +177 -0
- package/dist/esm/shared/dynamodb/client.js +35 -0
- package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
- 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/esm/shared/dynamodb/table-schema.d.ts +199 -0
- 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/esm/shared/errors/error-code.d.ts +95 -0
- package/dist/esm/shared/errors/error-code.js +24 -0
- package/dist/esm/shared/errors/errors.d.ts +233 -0
- package/dist/esm/shared/errors/errors.js +110 -0
- package/dist/esm/shared/logging/logger.d.ts +80 -0
- 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/esm/shared/logging/secret-patterns.d.ts +227 -0
- package/dist/esm/shared/logging/secret-patterns.js +83 -0
- package/dist/esm/shared/logging/truncate.d.ts +197 -0
- 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/esm/shared/ulid.d.ts +80 -0
- package/dist/esm/shared/ulid.js +77 -0
- package/dist/esm/shared/validation/collaborators.d.ts +160 -0
- package/dist/esm/shared/validation/collaborators.js +70 -0
- package/dist/esm/shared/validation/option-shape.d.ts +91 -0
- 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/esm/shared/validation/primitives.d.ts +292 -0
- 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/esm/store/actions/reconcile-vector-index.d.ts +38 -0
- 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/esm/store/internal/rows.d.ts +359 -0
- 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/esm/store/store.d.ts +329 -0
- 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 +68 -46
- package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
- package/dist/checkpointer/actions/delete-thread.js +0 -38
- package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
- package/dist/checkpointer/actions/get-tuple.js +0 -25
- package/dist/checkpointer/actions/list.d.ts +0 -20
- package/dist/checkpointer/actions/list.js +0 -113
- package/dist/checkpointer/actions/put-writes.d.ts +0 -15
- package/dist/checkpointer/actions/put-writes.js +0 -62
- package/dist/checkpointer/actions/put.d.ts +0 -17
- package/dist/checkpointer/actions/put.js +0 -73
- package/dist/checkpointer/internal/assemble.d.ts +0 -17
- package/dist/checkpointer/internal/assemble.js +0 -38
- package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
- package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
- package/dist/checkpointer/internal/configurable.d.ts +0 -12
- package/dist/checkpointer/internal/configurable.js +0 -24
- package/dist/checkpointer/internal/fetch.d.ts +0 -19
- package/dist/checkpointer/internal/fetch.js +0 -88
- package/dist/checkpointer/internal/filter-match.d.ts +0 -13
- package/dist/checkpointer/internal/filter-match.js +0 -15
- package/dist/checkpointer/internal/item-reader.d.ts +0 -66
- package/dist/checkpointer/internal/item-reader.js +0 -113
- package/dist/checkpointer/internal/item-writer.d.ts +0 -35
- package/dist/checkpointer/internal/item-writer.js +0 -107
- package/dist/checkpointer/internal/keys.d.ts +0 -41
- package/dist/checkpointer/internal/keys.js +0 -117
- package/dist/checkpointer/internal/list-scope.d.ts +0 -61
- package/dist/checkpointer/internal/list-scope.js +0 -108
- package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
- package/dist/checkpointer/internal/pending-sends.js +0 -29
- package/dist/checkpointer/internal/query.d.ts +0 -21
- package/dist/checkpointer/internal/query.js +0 -42
- package/dist/checkpointer/internal/regular-write.d.ts +0 -28
- package/dist/checkpointer/internal/regular-write.js +0 -66
- package/dist/checkpointer/internal/setup.d.ts +0 -33
- package/dist/checkpointer/internal/setup.js +0 -38
- package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
- package/dist/checkpointer/internal/special-write-cas.js +0 -104
- package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
- package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
- package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
- package/dist/checkpointer/internal/special-write-verify.js +0 -80
- package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
- package/dist/checkpointer/internal/stored-channels.js +0 -70
- package/dist/checkpointer/internal/validation.d.ts +0 -18
- package/dist/checkpointer/internal/validation.js +0 -40
- package/dist/checkpointer/internal/write-guard.d.ts +0 -20
- package/dist/checkpointer/internal/write-guard.js +0 -48
- package/dist/checkpointer/internal/write-index.d.ts +0 -36
- package/dist/checkpointer/internal/write-index.js +0 -41
- package/dist/checkpointer/saver.d.ts +0 -70
- package/dist/checkpointer/saver.js +0 -105
- package/dist/checkpointer/types.d.ts +0 -58
- package/dist/factory/factory.d.ts +0 -40
- package/dist/factory/factory.js +0 -87
- package/dist/history/actions/add-messages.d.ts +0 -15
- package/dist/history/actions/add-messages.js +0 -77
- package/dist/history/actions/clear.d.ts +0 -10
- package/dist/history/actions/clear.js +0 -34
- package/dist/history/actions/get-messages.d.ts +0 -17
- package/dist/history/actions/get-messages.js +0 -79
- package/dist/history/actions/list-sessions.d.ts +0 -13
- package/dist/history/actions/list-sessions.js +0 -53
- package/dist/history/actions/reconcile-count.d.ts +0 -12
- package/dist/history/actions/reconcile-count.js +0 -64
- package/dist/history/chat-message-history.d.ts +0 -73
- package/dist/history/chat-message-history.js +0 -111
- package/dist/history/internal/append-saga.d.ts +0 -25
- package/dist/history/internal/append-saga.js +0 -79
- package/dist/history/internal/compensation.d.ts +0 -25
- package/dist/history/internal/compensation.js +0 -92
- package/dist/history/internal/item-mapper.d.ts +0 -9
- package/dist/history/internal/item-mapper.js +0 -27
- package/dist/history/internal/keys.d.ts +0 -16
- package/dist/history/internal/keys.js +0 -48
- package/dist/history/internal/message-chunker.d.ts +0 -13
- package/dist/history/internal/message-chunker.js +0 -67
- package/dist/history/internal/message-transaction.d.ts +0 -25
- package/dist/history/internal/message-transaction.js +0 -61
- package/dist/history/internal/message-window.d.ts +0 -17
- package/dist/history/internal/message-window.js +0 -49
- package/dist/history/internal/query.d.ts +0 -23
- package/dist/history/internal/query.js +0 -39
- package/dist/history/internal/session-count.d.ts +0 -47
- package/dist/history/internal/session-count.js +0 -115
- package/dist/history/internal/session-title.d.ts +0 -19
- package/dist/history/internal/session-title.js +0 -43
- package/dist/history/internal/session-update.d.ts +0 -27
- package/dist/history/internal/session-update.js +0 -69
- package/dist/history/internal/setup.d.ts +0 -31
- package/dist/history/internal/setup.js +0 -43
- package/dist/history/internal/title-generator.d.ts +0 -12
- package/dist/history/internal/title-generator.js +0 -41
- package/dist/history/internal/ttl-anchor.d.ts +0 -24
- package/dist/history/internal/ttl-anchor.js +0 -38
- package/dist/history/internal/validation.d.ts +0 -25
- package/dist/history/internal/validation.js +0 -53
- package/dist/history/session-adapter.d.ts +0 -29
- package/dist/history/session-adapter.js +0 -35
- package/dist/history/types.d.ts +0 -69
- package/dist/index.d.ts +0 -29
- package/dist/index.js +0 -32
- package/dist/shared/clock.d.ts +0 -8
- package/dist/shared/clock.js +0 -16
- package/dist/shared/codec/codec.d.ts +0 -53
- package/dist/shared/codec/codec.js +0 -66
- package/dist/shared/codec/compression.d.ts +0 -24
- package/dist/shared/codec/compression.js +0 -48
- package/dist/shared/codec/descriptor-keys.d.ts +0 -12
- package/dist/shared/codec/descriptor-keys.js +0 -14
- package/dist/shared/codec/encode.d.ts +0 -13
- package/dist/shared/codec/encode.js +0 -43
- package/dist/shared/codec/json-serde.d.ts +0 -7
- package/dist/shared/codec/json-serde.js +0 -17
- package/dist/shared/codec/payload-loss.d.ts +0 -12
- package/dist/shared/codec/payload-loss.js +0 -38
- package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
- package/dist/shared/codec/s3/adapter-config.js +0 -22
- package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
- package/dist/shared/codec/s3/bounded-body.js +0 -47
- package/dist/shared/codec/s3/client.d.ts +0 -18
- package/dist/shared/codec/s3/client.js +0 -46
- package/dist/shared/codec/s3/config.d.ts +0 -51
- package/dist/shared/codec/s3/config.js +0 -58
- package/dist/shared/codec/s3/delete.d.ts +0 -7
- package/dist/shared/codec/s3/delete.js +0 -28
- package/dist/shared/codec/s3/key-scope.d.ts +0 -23
- package/dist/shared/codec/s3/key-scope.js +0 -44
- package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
- package/dist/shared/codec/s3/lifecycle.js +0 -63
- package/dist/shared/codec/s3/offloader.d.ts +0 -44
- package/dist/shared/codec/s3/offloader.js +0 -118
- package/dist/shared/codec/s3/orphans.d.ts +0 -23
- package/dist/shared/codec/s3/orphans.js +0 -71
- package/dist/shared/codec/s3/read-write.d.ts +0 -18
- package/dist/shared/codec/s3/read-write.js +0 -51
- package/dist/shared/codec/s3/retry.d.ts +0 -5
- package/dist/shared/codec/s3/retry.js +0 -22
- package/dist/shared/concurrency.d.ts +0 -6
- package/dist/shared/constants.d.ts +0 -112
- package/dist/shared/constants.js +0 -115
- package/dist/shared/dynamodb/abort.d.ts +0 -9
- package/dist/shared/dynamodb/abort.js +0 -27
- package/dist/shared/dynamodb/backoff.d.ts +0 -15
- package/dist/shared/dynamodb/backoff.js +0 -48
- package/dist/shared/dynamodb/batch-write.d.ts +0 -22
- package/dist/shared/dynamodb/batch-write.js +0 -53
- package/dist/shared/dynamodb/cancellation.d.ts +0 -6
- package/dist/shared/dynamodb/cancellation.js +0 -7
- package/dist/shared/dynamodb/client.d.ts +0 -28
- package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
- package/dist/shared/dynamodb/conditional-put.js +0 -76
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
- package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
- package/dist/shared/dynamodb/expiry.d.ts +0 -16
- package/dist/shared/dynamodb/expiry.js +0 -29
- package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
- package/dist/shared/dynamodb/paginate-core.js +0 -82
- package/dist/shared/dynamodb/paginate.d.ts +0 -14
- package/dist/shared/dynamodb/paginate.js +0 -19
- package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
- package/dist/shared/dynamodb/partition-delete.js +0 -71
- package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
- package/dist/shared/dynamodb/retry-classifier.js +0 -118
- package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
- package/dist/shared/dynamodb/retry-policy.js +0 -22
- package/dist/shared/dynamodb/retry.d.ts +0 -31
- package/dist/shared/dynamodb/retry.js +0 -57
- package/dist/shared/dynamodb/scan.d.ts +0 -14
- package/dist/shared/dynamodb/scan.js +0 -19
- package/dist/shared/dynamodb/types.d.ts +0 -23
- package/dist/shared/errors/base-error.d.ts +0 -30
- package/dist/shared/errors/base-error.js +0 -27
- package/dist/shared/errors/boundary.d.ts +0 -18
- package/dist/shared/errors/boundary.js +0 -46
- package/dist/shared/errors/error-code.d.ts +0 -13
- package/dist/shared/errors/errors.d.ts +0 -68
- package/dist/shared/errors/errors.js +0 -114
- package/dist/shared/errors/upstream-error.d.ts +0 -16
- package/dist/shared/errors/upstream-error.js +0 -27
- package/dist/shared/errors/wrap-error.d.ts +0 -7
- package/dist/shared/errors/wrap-error.js +0 -15
- package/dist/shared/logging/logger.d.ts +0 -18
- package/dist/shared/logging/logger.js +0 -15
- package/dist/shared/logging/redaction-walk.d.ts +0 -23
- package/dist/shared/logging/redaction-walk.js +0 -112
- package/dist/shared/logging/redaction.d.ts +0 -39
- package/dist/shared/logging/redaction.js +0 -75
- package/dist/shared/logging/secret-patterns.d.ts +0 -92
- package/dist/shared/logging/secret-patterns.js +0 -133
- package/dist/shared/options.d.ts +0 -37
- package/dist/shared/ulid.d.ts +0 -23
- package/dist/shared/validation/options.d.ts +0 -8
- package/dist/shared/validation/options.js +0 -90
- package/dist/shared/validation/primitives.d.ts +0 -29
- package/dist/shared/validation/primitives.js +0 -82
- package/dist/shared/validation/ttl.d.ts +0 -28
- package/dist/shared/validation/ttl.js +0 -52
- package/dist/store/actions/get.d.ts +0 -13
- package/dist/store/actions/get.js +0 -73
- package/dist/store/actions/list-namespaces.d.ts +0 -8
- package/dist/store/actions/list-namespaces.js +0 -59
- package/dist/store/actions/put.d.ts +0 -10
- package/dist/store/actions/put.js +0 -96
- package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
- package/dist/store/actions/reconcile-vector-index.js +0 -26
- package/dist/store/actions/search.d.ts +0 -9
- package/dist/store/actions/search.js +0 -34
- package/dist/store/internal/backend-search.d.ts +0 -4
- package/dist/store/internal/backend-search.js +0 -74
- package/dist/store/internal/batch-plan.d.ts +0 -11
- package/dist/store/internal/batch-plan.js +0 -52
- package/dist/store/internal/candidates.d.ts +0 -23
- package/dist/store/internal/candidates.js +0 -94
- package/dist/store/internal/filter.d.ts +0 -9
- package/dist/store/internal/filter.js +0 -85
- package/dist/store/internal/index-reconcile.d.ts +0 -21
- package/dist/store/internal/index-reconcile.js +0 -118
- package/dist/store/internal/index-sync.d.ts +0 -10
- package/dist/store/internal/index-sync.js +0 -25
- package/dist/store/internal/item-mapper.d.ts +0 -27
- package/dist/store/internal/item-mapper.js +0 -61
- package/dist/store/internal/keys.d.ts +0 -17
- package/dist/store/internal/keys.js +0 -41
- package/dist/store/internal/namespace-match.d.ts +0 -11
- package/dist/store/internal/namespace-match.js +0 -40
- package/dist/store/internal/option-validation.d.ts +0 -13
- package/dist/store/internal/option-validation.js +0 -77
- package/dist/store/internal/overwrite-swap.d.ts +0 -32
- package/dist/store/internal/overwrite-swap.js +0 -68
- package/dist/store/internal/persist.d.ts +0 -28
- package/dist/store/internal/persist.js +0 -64
- package/dist/store/internal/query.d.ts +0 -11
- package/dist/store/internal/query.js +0 -48
- package/dist/store/internal/ranker.d.ts +0 -18
- package/dist/store/internal/ranker.js +0 -39
- package/dist/store/internal/read-existing.d.ts +0 -23
- package/dist/store/internal/read-existing.js +0 -41
- package/dist/store/internal/score-direction.d.ts +0 -31
- package/dist/store/internal/score-direction.js +0 -38
- package/dist/store/internal/search-filter.d.ts +0 -3
- package/dist/store/internal/search-filter.js +0 -10
- package/dist/store/internal/semantic-search.d.ts +0 -34
- package/dist/store/internal/semantic-search.js +0 -87
- package/dist/store/internal/setup.d.ts +0 -36
- package/dist/store/internal/setup.js +0 -40
- package/dist/store/internal/text-path.d.ts +0 -17
- package/dist/store/internal/validation.d.ts +0 -18
- package/dist/store/internal/validation.js +0 -51
- package/dist/store/internal/write-verify.d.ts +0 -42
- package/dist/store/internal/write-verify.js +0 -71
- package/dist/store/store.d.ts +0 -61
- package/dist/store/store.js +0 -107
- package/dist/store/types.d.ts +0 -50
- package/dist/store/types.js +0 -2
- package/dist/store/vector-backend.d.ts +0 -43
- package/dist/store/vector-backend.js +0 -2
- /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
- /package/dist/{factory → cjs/factory}/types.js +0 -0
- /package/dist/{history → cjs/history}/types.js +0 -0
- /package/dist/{shared → cjs/shared}/options.js +0 -0
- /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { DynamoDBSaver } from '../checkpointer/saver.js';
|
|
2
|
+
import { DynamoDBChatMessageHistory } from '../history/chat-message-history.js';
|
|
3
|
+
import { s3ClientOptions } from '../shared/codec/s3/client-types.js';
|
|
4
|
+
import { resolveDynamoDBClient } from '../shared/dynamodb/client.js';
|
|
5
|
+
import { failureLabel } from '../shared/errors/base-error.js';
|
|
6
|
+
import { resolveLogger } from '../shared/logging/logger.js';
|
|
7
|
+
import { truncateForLog } from '../shared/logging/truncate.js';
|
|
8
|
+
import { assertMembers, LOGGER_MEMBERS } from '../shared/validation/collaborators.js';
|
|
9
|
+
import { allKeysOf, assertObjectShape, assertShape, isObjectShape, } from '../shared/validation/option-shape.js';
|
|
10
|
+
import { assertClientChoice } from '../shared/validation/options.js';
|
|
11
|
+
import { DynamoDBStore } from '../store/store.js';
|
|
12
|
+
const FACTORY_BASE_KEYS = allKeysOf({
|
|
13
|
+
client: 'client',
|
|
14
|
+
clientConfig: 'clientConfig',
|
|
15
|
+
createClient: 'createClient',
|
|
16
|
+
logger: 'logger',
|
|
17
|
+
ttl: 'ttl',
|
|
18
|
+
compression: 'compression',
|
|
19
|
+
s3: 's3',
|
|
20
|
+
retry: 'retry',
|
|
21
|
+
});
|
|
22
|
+
const CREATE_ALL_KEYS = allKeysOf({
|
|
23
|
+
saver: 'saver',
|
|
24
|
+
store: 'store',
|
|
25
|
+
history: 'history',
|
|
26
|
+
});
|
|
27
|
+
function release(logger, close) {
|
|
28
|
+
try {
|
|
29
|
+
close();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
logger.warn('factory.destroy: an adapter did not release its resources', {
|
|
33
|
+
reason: truncateForLog(failureLabel(error)),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function overridesClient(options) {
|
|
38
|
+
return (options.client !== undefined ||
|
|
39
|
+
options.clientConfig !== undefined ||
|
|
40
|
+
options.createClient !== undefined);
|
|
41
|
+
}
|
|
42
|
+
function given(options) {
|
|
43
|
+
const kept = {};
|
|
44
|
+
for (const [key, value] of Object.entries(options)) {
|
|
45
|
+
if (value !== undefined)
|
|
46
|
+
kept[key] = value;
|
|
47
|
+
}
|
|
48
|
+
return kept;
|
|
49
|
+
}
|
|
50
|
+
export class DynamoDBFactory {
|
|
51
|
+
base;
|
|
52
|
+
constructor(base = {}) {
|
|
53
|
+
this.base = base;
|
|
54
|
+
assertShape(base, FACTORY_BASE_KEYS, 'options');
|
|
55
|
+
assertClientChoice(base);
|
|
56
|
+
if (base.logger !== undefined)
|
|
57
|
+
assertMembers(base.logger, LOGGER_MEMBERS, 'logger');
|
|
58
|
+
}
|
|
59
|
+
sharedDefaults() {
|
|
60
|
+
const { logger, ttl, compression, s3, retry } = this.base;
|
|
61
|
+
return { logger, ttl, compression, s3, retry };
|
|
62
|
+
}
|
|
63
|
+
withTableRegion(s3) {
|
|
64
|
+
if (!isObjectShape(s3))
|
|
65
|
+
return s3;
|
|
66
|
+
if (s3.clientConfig !== undefined && !isObjectShape(s3.clientConfig))
|
|
67
|
+
return s3;
|
|
68
|
+
const region = s3ClientOptions(s3.clientConfig).region ?? this.base.clientConfig?.region;
|
|
69
|
+
if (region === undefined)
|
|
70
|
+
return s3;
|
|
71
|
+
return { ...s3, clientConfig: { ...s3.clientConfig, region } };
|
|
72
|
+
}
|
|
73
|
+
defaultsFor(options) {
|
|
74
|
+
return overridesClient(options) ? this.sharedDefaults() : this.base;
|
|
75
|
+
}
|
|
76
|
+
createSaver(options) {
|
|
77
|
+
assertObjectShape(options, 'options');
|
|
78
|
+
const own = given(options);
|
|
79
|
+
return new DynamoDBSaver({ ...this.defaultsFor(own), ...own });
|
|
80
|
+
}
|
|
81
|
+
createStore(options) {
|
|
82
|
+
assertObjectShape(options, 'options');
|
|
83
|
+
const own = given(options);
|
|
84
|
+
return new DynamoDBStore({ ...this.defaultsFor(own), ...own });
|
|
85
|
+
}
|
|
86
|
+
createChatMessageHistory(options) {
|
|
87
|
+
assertObjectShape(options, 'options');
|
|
88
|
+
const own = given(options);
|
|
89
|
+
return new DynamoDBChatMessageHistory({ ...this.defaultsFor(own), ...own });
|
|
90
|
+
}
|
|
91
|
+
createAll(options) {
|
|
92
|
+
assertShape(options, CREATE_ALL_KEYS, 'options');
|
|
93
|
+
const { saver, store, history } = options;
|
|
94
|
+
for (const section of [saver, store, history]) {
|
|
95
|
+
if (section !== undefined)
|
|
96
|
+
assertObjectShape(section, 'options');
|
|
97
|
+
}
|
|
98
|
+
const logger = resolveLogger(this.base.logger);
|
|
99
|
+
const resolved = resolveDynamoDBClient(this.base);
|
|
100
|
+
const shared = { ...this.sharedDefaults(), client: resolved.client };
|
|
101
|
+
const onSharedClient = (section) => {
|
|
102
|
+
const options = { ...shared, ...given(section) };
|
|
103
|
+
return { ...options, s3: this.withTableRegion(options.s3) };
|
|
104
|
+
};
|
|
105
|
+
const built = [];
|
|
106
|
+
const track = (adapter) => {
|
|
107
|
+
built.push(adapter);
|
|
108
|
+
return adapter;
|
|
109
|
+
};
|
|
110
|
+
let destroyed = false;
|
|
111
|
+
const destroy = () => {
|
|
112
|
+
if (destroyed)
|
|
113
|
+
return;
|
|
114
|
+
destroyed = true;
|
|
115
|
+
for (const adapter of built)
|
|
116
|
+
release(logger, () => adapter.destroy());
|
|
117
|
+
release(logger, () => resolved.ddbClient?.destroy());
|
|
118
|
+
};
|
|
119
|
+
try {
|
|
120
|
+
const adapters = {
|
|
121
|
+
saver: saver && track(new DynamoDBSaver(onSharedClient(saver))),
|
|
122
|
+
store: store && track(new DynamoDBStore(onSharedClient(store))),
|
|
123
|
+
history: history && track(new DynamoDBChatMessageHistory(onSharedClient(history))),
|
|
124
|
+
destroy,
|
|
125
|
+
};
|
|
126
|
+
return adapters;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
destroy();
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides how the factory's options are typed by what a caller asks for.
|
|
3
|
+
*
|
|
4
|
+
* The defaults every adapter inherits, the per-adapter sections of `createAll`
|
|
5
|
+
* without the shared client's fields, and a result whose adapters are typed
|
|
6
|
+
* `undefined` for each section left out are declared here, so a caller's
|
|
7
|
+
* compiler knows which adapters it got without a runtime check.
|
|
8
|
+
*/
|
|
9
|
+
import type { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
10
|
+
import type { DynamoDBSaver } from '../checkpointer/saver.js';
|
|
11
|
+
import type { DynamoDBSaverOptions } from '../checkpointer/types.js';
|
|
12
|
+
import type { DynamoDBChatMessageHistory } from '../history/chat-message-history.js';
|
|
13
|
+
import type { DynamoDBChatMessageHistoryOptions } from '../history/types.js';
|
|
14
|
+
import type { CompressionConfig } from '../shared/codec/compression.js';
|
|
15
|
+
import type { S3OffloadConfig } from '../shared/codec/s3/config.js';
|
|
16
|
+
import type { DynamoDBDocumentLike } from '../shared/dynamodb/client.js';
|
|
17
|
+
import type { RetryPolicy } from '../shared/dynamodb/retry.js';
|
|
18
|
+
import type { Logger } from '../shared/logging/logger.js';
|
|
19
|
+
import type { TtlOption } from '../shared/validation/ttl.js';
|
|
20
|
+
import type { DynamoDBStore } from '../store/store.js';
|
|
21
|
+
import type { DynamoDBStoreOptions } from '../store/types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Defaults applied to every adapter the factory builds: the client (or how to
|
|
24
|
+
* build one) and the cross-cutting options a team usually wants identical
|
|
25
|
+
* across its checkpointer, store and history. A per-adapter option wins.
|
|
26
|
+
*/
|
|
27
|
+
export interface FactoryBaseOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Reused as-is by every adapter. Construct it with `maxAttempts: 1`, or the
|
|
30
|
+
* SDK's own retries stack inside the library's retry budget (each adapter
|
|
31
|
+
* logs a `warn` at construction when they would).
|
|
32
|
+
*/
|
|
33
|
+
client?: DynamoDBDocumentLike;
|
|
34
|
+
/**
|
|
35
|
+
* The config the client is built from, and read for its `region` when an `s3`
|
|
36
|
+
* config names none — including by `createAll`, whose adapters are handed the
|
|
37
|
+
* shared client rather than this config.
|
|
38
|
+
*/
|
|
39
|
+
clientConfig?: DynamoDBClientConfig;
|
|
40
|
+
logger?: Logger;
|
|
41
|
+
ttl?: TtlOption;
|
|
42
|
+
compression?: CompressionConfig;
|
|
43
|
+
s3?: S3OffloadConfig;
|
|
44
|
+
retry?: RetryPolicy;
|
|
45
|
+
}
|
|
46
|
+
/** An adapter's own options inside {@link CreateAllOptions}: everything but the shared client. */
|
|
47
|
+
export type AdapterSection<Options> = Omit<Options, 'client' | 'clientConfig' | 'createClient'>;
|
|
48
|
+
/**
|
|
49
|
+
* Per-adapter options for `DynamoDBFactory.createAll`; omit a section to skip
|
|
50
|
+
* that adapter, and pass none to build none. A key that is not one of these
|
|
51
|
+
* three is refused: it would otherwise skip every adapter silently. So is a
|
|
52
|
+
* section that is not an object, `null` included, naming `options` as that
|
|
53
|
+
* adapter's constructor would.
|
|
54
|
+
*/
|
|
55
|
+
export interface CreateAllOptions {
|
|
56
|
+
saver?: AdapterSection<DynamoDBSaverOptions>;
|
|
57
|
+
store?: AdapterSection<DynamoDBStoreOptions>;
|
|
58
|
+
history?: AdapterSection<DynamoDBChatMessageHistoryOptions>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The adapters `createAll` built, typed by the sections it was given: an
|
|
62
|
+
* omitted section is `undefined`. The default names the all-three result.
|
|
63
|
+
*/
|
|
64
|
+
export interface CreatedAdapters<O extends CreateAllOptions = Required<CreateAllOptions>> {
|
|
65
|
+
saver: O extends {
|
|
66
|
+
saver: object;
|
|
67
|
+
} ? DynamoDBSaver : undefined;
|
|
68
|
+
store: O extends {
|
|
69
|
+
store: object;
|
|
70
|
+
} ? DynamoDBStore : undefined;
|
|
71
|
+
history: O extends {
|
|
72
|
+
history: object;
|
|
73
|
+
} ? DynamoDBChatMessageHistory : undefined;
|
|
74
|
+
/** Tear down every built adapter and the shared client, once. */
|
|
75
|
+
destroy: () => void;
|
|
76
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides what an append settles before its first write.
|
|
3
|
+
*
|
|
4
|
+
* The session id and every message are parsed before anything is sent, so a
|
|
5
|
+
* message that could never be read back fails with its index and nothing
|
|
6
|
+
* stored; an empty list ends here, the no-op a turn without a message is; and
|
|
7
|
+
* with a ttl configured, the session's creation-anchored expiry is read first
|
|
8
|
+
* so every message of the append shares it. How the rows and the count are
|
|
9
|
+
* then written together is `appendMessages`' decision, not this module's.
|
|
10
|
+
*/
|
|
11
|
+
import type { BaseMessage } from '@langchain/core/messages';
|
|
12
|
+
import type { HistoryContext } from '../internal/setup.js';
|
|
13
|
+
/**
|
|
14
|
+
* Append messages as one item per message. Each chunk writes its message Puts
|
|
15
|
+
* and the session-metadata count `ADD` in a single `TransactWriteItems`, so
|
|
16
|
+
* `messageCount` can never disagree with the stored messages. A creation-anchored
|
|
17
|
+
* TTL (resolved by read, set in the transaction via `if_not_exists`) gives every
|
|
18
|
+
* item one shared expiry. Batches larger than the 100-item / 4 MB transaction
|
|
19
|
+
* limits are split into chunks and applied with caller-observed atomicity: if a
|
|
20
|
+
* later chunk fails, the committed chunks are rolled back (see {@link appendMessages}).
|
|
21
|
+
*
|
|
22
|
+
* Per item the 400 KB DynamoDB limit still applies; enable S3 offloading so
|
|
23
|
+
* large payloads become small descriptors and stay well under the limits.
|
|
24
|
+
*
|
|
25
|
+
* Accepts: `messages` — LangChain messages; an empty list writes nothing and is
|
|
26
|
+
* not an error, which is what a turn that produced no message means.
|
|
27
|
+
* `signal` — aborts between chunks.
|
|
28
|
+
*
|
|
29
|
+
* Returns: nothing, and only once every message has landed.
|
|
30
|
+
*
|
|
31
|
+
* Throws: `VALIDATION` naming `sessionId` or `messages` (with the offending
|
|
32
|
+
* index) before any write, or naming `payload` for a message too large to
|
|
33
|
+
* store inline without `s3`, or, once offloaded, larger than
|
|
34
|
+
* `s3.maxDownloadBytes`; `S3_OFFLOAD_FAILED`; whatever the transaction
|
|
35
|
+
* throws, after the rollback; `COMPENSATION_FAILED` when that rollback could
|
|
36
|
+
* not finish, or when a failing chunk's own outcome could not be established;
|
|
37
|
+
* `ABORTED` when the signal fires, after the same rollback.
|
|
38
|
+
*
|
|
39
|
+
* Guarantees: a caller observes all messages or none — except the one chunk
|
|
40
|
+
* a failed call could not settle: an `ABORTED` append whose in-flight chunk
|
|
41
|
+
* commits after the call returns, or a `COMPENSATION_FAILED` append whose
|
|
42
|
+
* failing chunk's own outcome could not be established. Read the session
|
|
43
|
+
* back before deciding whether to resend those messages. `messageCount`
|
|
44
|
+
* always agrees with the messages that landed, because each chunk writes
|
|
45
|
+
* both in one transaction. Every message of the append shares one
|
|
46
|
+
* creation-anchored expiry, so a conversation expires whole rather than
|
|
47
|
+
* losing its oldest turns first. No S3 object is left behind by a failure,
|
|
48
|
+
* at any stage — including a failure partway through encoding, before the
|
|
49
|
+
* saga exists.
|
|
50
|
+
*/
|
|
51
|
+
export declare function addMessages(context: HistoryContext, sessionId: string, messages: BaseMessage[], signal?: AbortSignal): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { calculateTtlTimestamp } from '../../shared/validation/ttl.js';
|
|
2
|
+
import { appendMessages } from '../internal/append.js';
|
|
3
|
+
import { parseMessages, parseSessionId } from '../internal/parse.js';
|
|
4
|
+
import { resolveTtlAnchor } from '../internal/session.js';
|
|
5
|
+
export async function addMessages(context, sessionId, messages, signal) {
|
|
6
|
+
const session = parseSessionId(sessionId);
|
|
7
|
+
const stored = parseMessages(messages);
|
|
8
|
+
if (stored.length === 0)
|
|
9
|
+
return;
|
|
10
|
+
const anchor = context.ttl
|
|
11
|
+
? await resolveTtlAnchor(context, session, calculateTtlTimestamp(context.ttl), signal)
|
|
12
|
+
: undefined;
|
|
13
|
+
await appendMessages(context, { sessionId: session, messages: stored, anchor, signal });
|
|
14
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides which rows a clear may delete.
|
|
3
|
+
*
|
|
4
|
+
* A clear removes only what the partition read observed and this adapter
|
|
5
|
+
* wrote, each row pinned to the write id it was read with, and reaches a
|
|
6
|
+
* message's offloaded payload through the attribute that holds it. A caller
|
|
7
|
+
* asks for a session to go and never decides that a foreign row, or one a
|
|
8
|
+
* concurrent append rewrote, is left in place and reported rather than
|
|
9
|
+
* deleted; the paging, the per-row deletes and the S3 cleanup are the shared
|
|
10
|
+
* partition delete's.
|
|
11
|
+
*/
|
|
12
|
+
import type { HistoryContext } from '../internal/setup.js';
|
|
13
|
+
/**
|
|
14
|
+
* Delete exactly the message rows and the session row of one session that the
|
|
15
|
+
* partition read observed.
|
|
16
|
+
*
|
|
17
|
+
* Accepts: `sessionId` — validated. `options.signal` — aborts between pages.
|
|
18
|
+
*
|
|
19
|
+
* Returns: nothing. Clearing a session that does not exist is not an error;
|
|
20
|
+
* there is simply nothing in the partition.
|
|
21
|
+
*
|
|
22
|
+
* Throws: `VALIDATION` naming `sessionId`; `BATCH_WRITE_INCOMPLETE`
|
|
23
|
+
* when a row's delete fails, carrying what did succeed; `ABORTED` when the
|
|
24
|
+
* signal fires, whether between pages or during a row's delete — a cancel is
|
|
25
|
+
* reported as a cancel and never as an incomplete delete, and no further row
|
|
26
|
+
* is issued after it. A refused
|
|
27
|
+
* row raises nothing and is not one of those failures: the pin turned it away
|
|
28
|
+
* because an append landed after the read, and deleting the session row then
|
|
29
|
+
* would remove the `messageCount`, the `updatedAt` and the recency-index entry
|
|
30
|
+
* of a session that is still alive — leaving it is the safe answer. The error's
|
|
31
|
+
* two counts are **rows**, not batches — rows deleted and rows attempted,
|
|
32
|
+
* summed across every flush of the pass, with `details.succeededCount` repeating
|
|
33
|
+
* the first and `details.failedChunks` holding each failing row's own error — and its
|
|
34
|
+
* message says so, because a pass that sends one request per row is not a batch
|
|
35
|
+
* that did not drain. Refused rows are in neither count; each is reported at
|
|
36
|
+
* `warn` with its sort key and counted as skipped. The remedy is to re-run once
|
|
37
|
+
* the session is quiescent, and `reconcileMessageCount` repairs the count the
|
|
38
|
+
* surviving session row is left over-counting in the meantime.
|
|
39
|
+
*
|
|
40
|
+
* Guarantees: a row this adapter did not write is left in place and logged, so
|
|
41
|
+
* a shared-table partition is never collaterally wiped. Offloaded objects are
|
|
42
|
+
* deleted best-effort after their rows, and only objects under this session's
|
|
43
|
+
* own path. A row rewritten after the read is left in place and reported: an
|
|
44
|
+
* append landing during the call moves the session row's own write id, so that
|
|
45
|
+
* row survives while the messages the read saw are still deleted, and its
|
|
46
|
+
* `messageCount` then over-counts until `reconcileMessageCount` repairs it —
|
|
47
|
+
* which is the right outcome, the session being alive. One pass over a
|
|
48
|
+
* quiescent session: a message appended while this runs may survive it.
|
|
49
|
+
*/
|
|
50
|
+
export declare function clearSession(context: HistoryContext, sessionId: string, options?: {
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { WRITE_ID_ATTRIBUTE } from '../../shared/dynamodb/idempotent-write.js';
|
|
2
|
+
import { deletePartitionRows, namedDescriptor, } from '../../shared/dynamodb/partition-delete.js';
|
|
3
|
+
import { retryFor } from '../../shared/dynamodb/retry.js';
|
|
4
|
+
import { parseSessionId } from '../internal/parse.js';
|
|
5
|
+
import { isHistorySortKey, sessionRowsQuery } from '../internal/rows.js';
|
|
6
|
+
function descriptorsOf(row) {
|
|
7
|
+
const entry = namedDescriptor(row, 'message');
|
|
8
|
+
return entry === undefined ? [] : [entry];
|
|
9
|
+
}
|
|
10
|
+
export async function clearSession(context, sessionId, options = {}) {
|
|
11
|
+
const session = parseSessionId(sessionId);
|
|
12
|
+
await deletePartitionRows({
|
|
13
|
+
client: context.client,
|
|
14
|
+
tableName: context.tableName,
|
|
15
|
+
params: sessionRowsQuery(context.tableName, session, { consistent: true }),
|
|
16
|
+
logger: context.logger,
|
|
17
|
+
retry: retryFor(context, options.signal),
|
|
18
|
+
signal: options.signal,
|
|
19
|
+
offloader: context.offloader,
|
|
20
|
+
operation: 'history.clear',
|
|
21
|
+
ownsSortKey: isHistorySortKey,
|
|
22
|
+
descriptorsOf,
|
|
23
|
+
idAttribute: WRITE_ID_ATTRIBUTE,
|
|
24
|
+
scope: [session],
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides which decode failures cost one message and which fail the read.
|
|
3
|
+
*
|
|
4
|
+
* A stored message is fetched, deserialized and rebuilt in three stages, and
|
|
5
|
+
* the stage a failure comes from decides its fate: only a loss no reader could
|
|
6
|
+
* ever recover is confined to that message and handed to `onCorruptMessage`
|
|
7
|
+
* (record 12); a transport fault, an out-of-scope key, a newer payload or a
|
|
8
|
+
* serializer's refusal fails the read under either policy. A caller gets a
|
|
9
|
+
* conversation that is whole or, under `'skip'`, missing a lost turn
|
|
10
|
+
* reported at `error` — never one silently truncated without a trace —
|
|
11
|
+
* however many downloads run at once.
|
|
12
|
+
*/
|
|
13
|
+
import { type BaseMessage } from '@langchain/core/messages';
|
|
14
|
+
import type { CancelOptions } from '../../shared/options.js';
|
|
15
|
+
import type { HistoryContext } from '../internal/setup.js';
|
|
16
|
+
import type { MessageWindow } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Return a session's messages in chronological order — the whole session, or
|
|
19
|
+
* the window `options` selects: `limit` keeps only the newest `limit`
|
|
20
|
+
* messages, `before` only those appended before that instant (see
|
|
21
|
+
* {@link readWindow}). Items past their TTL are filtered out on read
|
|
22
|
+
* (DynamoDB deletes an expired row within a few days, with no fixed bound),
|
|
23
|
+
* so the returned history is never stale. A corrupt item — see
|
|
24
|
+
* {@link decodeMessage} for exactly what counts — is handled per
|
|
25
|
+
* `onCorruptMessage`: `'throw'` fails the read with the underlying error;
|
|
26
|
+
* `'skip'` (the default) reports it at `error` with its sort key and returns
|
|
27
|
+
* the rest. Every other failure propagates regardless of the policy.
|
|
28
|
+
*
|
|
29
|
+
* Accepts: `options.limit` — the newest N, at least 1; absent asks for the
|
|
30
|
+
* whole session, and `0` is refused rather than read as an empty conversation
|
|
31
|
+
* (see {@link parseMessageWindow}).
|
|
32
|
+
* `options.before` — only messages appended before that instant.
|
|
33
|
+
* `options.signal` — aborts the reads.
|
|
34
|
+
*
|
|
35
|
+
* Returns: the messages in chronological order, oldest first. A session that
|
|
36
|
+
* does not exist and one whose messages have all expired both return nothing:
|
|
37
|
+
* a conversation nobody can read is a conversation that is not there.
|
|
38
|
+
*
|
|
39
|
+
* Throws: `VALIDATION` naming `sessionId`, `limit`, `before`, `signal`, or
|
|
40
|
+
* `options.<key>` for a key this package does not read;
|
|
41
|
+
* `FORMAT_UNSUPPORTED` for a row, or a payload, a newer version wrote — the
|
|
42
|
+
* payload half whatever the policy, because a newer reader reads it and
|
|
43
|
+
* dropping it would lose a turn a rollback could still serve; the decode error
|
|
44
|
+
* of a corrupt row under `onCorruptMessage: 'throw'`; `VALIDATION` naming
|
|
45
|
+
* `message` for a row in this session's message key space that this adapter
|
|
46
|
+
* did not write, naming
|
|
47
|
+
* `s3Key` for a row addressing an object outside the session's own path, and
|
|
48
|
+
* naming `serde` for a row whose payload the serializer refuses to
|
|
49
|
+
* reconstruct, all three whatever the policy; `COMPRESSION_LIMIT` for a
|
|
50
|
+
* payload larger than this reader's `compression.maxDecompressedBytes`,
|
|
51
|
+
* whatever the policy too; any infrastructure failure — a throttle, a
|
|
52
|
+
* permission, a transport error — whatever the policy, because dropping a
|
|
53
|
+
* message for one of those would hand back a silently truncated conversation
|
|
54
|
+
* that the chain then re-persists as the truth.
|
|
55
|
+
*
|
|
56
|
+
* Guarantees: strongly consistent, so the turn just appended is visible.
|
|
57
|
+
* Offloaded messages download several at a time, and the corruption policy is
|
|
58
|
+
* applied in message order however they finish.
|
|
59
|
+
*/
|
|
60
|
+
export declare function getMessages(context: HistoryContext, sessionId: string, options?: MessageWindow & CancelOptions): Promise<BaseMessage[]>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { mapStoredMessagesToChatMessages, } from '@langchain/core/messages';
|
|
2
|
+
import { codecDepsOf, isPermanentPayloadLoss, loadPayloadValue, readPayloadBytes, } from '../../shared/codec/codec.js';
|
|
3
|
+
import { DEFAULT_READ_CONCURRENCY, mapWithConcurrency } from '../../shared/concurrency.js';
|
|
4
|
+
import { failureLabel, toError } from '../../shared/errors/base-error.js';
|
|
5
|
+
import { truncateForLog } from '../../shared/logging/truncate.js';
|
|
6
|
+
import { readWindow } from '../internal/message-read.js';
|
|
7
|
+
import { parseGetMessagesRequest } from '../internal/parse.js';
|
|
8
|
+
function corruptOrRethrow(error) {
|
|
9
|
+
if (isPermanentPayloadLoss(error))
|
|
10
|
+
return { kind: 'corrupt', error };
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
async function decodeMessage(context, item, sessionId, signal) {
|
|
14
|
+
const deps = codecDepsOf(context, signal);
|
|
15
|
+
let bytes;
|
|
16
|
+
try {
|
|
17
|
+
bytes = await readPayloadBytes(item.message, deps, [sessionId]);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
return corruptOrRethrow(error);
|
|
21
|
+
}
|
|
22
|
+
let stored;
|
|
23
|
+
try {
|
|
24
|
+
stored = await loadPayloadValue(item.message.serdeType, bytes, deps);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return corruptOrRethrow(error);
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return { kind: 'ok', message: mapStoredMessagesToChatMessages([stored])[0] };
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return { kind: 'corrupt', error: toError(error) };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function getMessages(context, sessionId, options = {}) {
|
|
37
|
+
const request = parseGetMessagesRequest(sessionId, options);
|
|
38
|
+
const items = await readWindow(context, request.sessionId, request.window, request.signal);
|
|
39
|
+
const decoded = await mapWithConcurrency(items, context.readConcurrency ?? DEFAULT_READ_CONCURRENCY, (item) => decodeMessage(context, item, request.sessionId, request.signal));
|
|
40
|
+
const messages = [];
|
|
41
|
+
decoded.forEach((result, index) => {
|
|
42
|
+
if (result.kind === 'ok') {
|
|
43
|
+
messages.push(result.message);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (context.onCorruptMessage === 'throw')
|
|
47
|
+
throw result.error;
|
|
48
|
+
context.logger.error('getMessages: skipped a corrupt message item', {
|
|
49
|
+
sessionId: request.sessionId,
|
|
50
|
+
sortKey: truncateForLog(items[index].SK),
|
|
51
|
+
reason: truncateForLog(failureLabel(result.error)),
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
return messages;
|
|
55
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides whether a listing reads the recency index or scans the table.
|
|
3
|
+
*
|
|
4
|
+
* With a configured `indexName` a listing is a cursor-paged, newest-first
|
|
5
|
+
* merge of the index shards; without one it is a filtered scan sorted in
|
|
6
|
+
* memory, with no cursor (record 8). A caller passes the same options and gets
|
|
7
|
+
* the same `SessionPage` either way: `limit` is the newest N on both paths,
|
|
8
|
+
* `0` reads neither, and the same rule summarises each session and drops the
|
|
9
|
+
* expired, foreign and malformed ones.
|
|
10
|
+
*/
|
|
11
|
+
import type { HistoryContext } from '../internal/setup.js';
|
|
12
|
+
import type { ListSessionsOptions, SessionPage } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* List sessions as metadata summaries, most recently updated first.
|
|
15
|
+
*
|
|
16
|
+
* Accepts: `options.limit` — the package-wide page rule, an integer from 0 to
|
|
17
|
+
* the page ceiling; absent means one index page (100) with the index, and
|
|
18
|
+
* every session without it, since a scan has no cursor to fetch the rest with.
|
|
19
|
+
* `0` returns an empty page on either path without reading the table, which
|
|
20
|
+
* matters most on the scan path: a scan has to finish before the newest can be
|
|
21
|
+
* known, so answering `limit: 0` by scanning and then slicing to nothing would
|
|
22
|
+
* have paid for the whole table to return an empty page.
|
|
23
|
+
* `options.cursor` — from a previous page, and
|
|
24
|
+
* only with a configured `indexName`. `options.maxItems` and
|
|
25
|
+
* `maxIterations` — caps on the scan path; with the index the page size is the
|
|
26
|
+
* bound and they do nothing. Each must be a positive integer or `Infinity`
|
|
27
|
+
* (the paginator's own way to ask for no cap); absent keeps its default.
|
|
28
|
+
*
|
|
29
|
+
* Returns: the page, newest-updated first, and a `nextCursor` while rows may
|
|
30
|
+
* remain. A page can come back shorter than `limit` while more remain: expired
|
|
31
|
+
* and foreign rows are dropped after the read, and so is a row of this
|
|
32
|
+
* package's own whose `messageCount`, `createdAt`, `updatedAt`, `title` or
|
|
33
|
+
* `ttl` is not the type written there — otherwise one unreadable `ttl` would fail the
|
|
34
|
+
* whole call, taking every healthy session with it. The cursor is a position in
|
|
35
|
+
* the index rather than a count of what survived filtering. A cursor does not
|
|
36
|
+
* promise more rows: the page after it can come back empty (see
|
|
37
|
+
* `queryRecencyIndex`).
|
|
38
|
+
*
|
|
39
|
+
* Throws: `VALIDATION` naming `limit`, `cursor`, `maxItems`,
|
|
40
|
+
* `maxIterations`, `signal`, or `options.<key>` for a key this package does
|
|
41
|
+
* not read; `RESULT_TRUNCATED` past the scan path's caps, or for an
|
|
42
|
+
* index shard whose pages do not end within `MAX_LOOP_ITERATIONS`;
|
|
43
|
+
* `FORMAT_UNSUPPORTED` for a SESSION row a newer release wrote, on either
|
|
44
|
+
* path; `ABORTED`.
|
|
45
|
+
*
|
|
46
|
+
* Guarantees: with a configured `indexName` each index shard is read
|
|
47
|
+
* newest-first one DynamoDB page at a time, and its next page whenever it has
|
|
48
|
+
* no row buffered and the page still needs one, which can cost a query per
|
|
49
|
+
* shard per page whose rows the page never takes; at most `readConcurrency`
|
|
50
|
+
* shards are queried at once. Memory is the page being built, up to `limit`
|
|
51
|
+
* rows and so bounded by the page ceiling, plus at most one DynamoDB page per shard,
|
|
52
|
+
* whatever the table holds. Without one it is a filtered table scan that holds
|
|
53
|
+
* every session at once and returns no cursor.
|
|
54
|
+
*/
|
|
55
|
+
export declare function listSessions(context: HistoryContext, options?: ListSessionsOptions): Promise<SessionPage>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { nowSeconds } from '../../shared/clock.js';
|
|
2
|
+
import { DEFAULT_READ_CONCURRENCY } from '../../shared/concurrency.js';
|
|
3
|
+
import { paginateScan } from '../../shared/dynamodb/paginate.js';
|
|
4
|
+
import { DEFAULT_INDEX_SHARDS, queryRecencyIndex } from '../../shared/dynamodb/recency-index.js';
|
|
5
|
+
import { retryFor } from '../../shared/dynamodb/retry.js';
|
|
6
|
+
import { PARTITION_KEY_ATTRIBUTE, SORT_KEY_ATTRIBUTE } from '../../shared/dynamodb/table-schema.js';
|
|
7
|
+
import { parseLimit } from '../../shared/validation/primitives.js';
|
|
8
|
+
import { parseListSessionsRequest } from '../internal/parse.js';
|
|
9
|
+
import { SESSION_SORT_KEY, historyPartitionPrefix } from '../internal/rows.js';
|
|
10
|
+
import { summariseSession } from '../internal/session.js';
|
|
11
|
+
const DEFAULT_PAGE_SIZE = parseLimit(100, 0);
|
|
12
|
+
async function pageFromIndex(context, indexName, request) {
|
|
13
|
+
const atSeconds = nowSeconds();
|
|
14
|
+
const page = await queryRecencyIndex({
|
|
15
|
+
client: context.client,
|
|
16
|
+
tableName: context.tableName,
|
|
17
|
+
indexName,
|
|
18
|
+
tag: 'SESS',
|
|
19
|
+
shards: context.indexShards ?? DEFAULT_INDEX_SHARDS,
|
|
20
|
+
concurrency: context.readConcurrency ?? DEFAULT_READ_CONCURRENCY,
|
|
21
|
+
limit: request.limit ?? DEFAULT_PAGE_SIZE,
|
|
22
|
+
cursor: request.cursor,
|
|
23
|
+
retry: retryFor(context, request.signal),
|
|
24
|
+
signal: request.signal,
|
|
25
|
+
});
|
|
26
|
+
const sessions = page.items
|
|
27
|
+
.map((raw) => summariseSession(raw, atSeconds))
|
|
28
|
+
.filter((session) => session !== undefined);
|
|
29
|
+
return { sessions, ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }) };
|
|
30
|
+
}
|
|
31
|
+
async function allByScan(context, request) {
|
|
32
|
+
const sessions = [];
|
|
33
|
+
const atSeconds = nowSeconds();
|
|
34
|
+
for await (const raw of paginateScan({
|
|
35
|
+
retry: retryFor(context, request.signal),
|
|
36
|
+
signal: request.signal,
|
|
37
|
+
client: context.client,
|
|
38
|
+
params: {
|
|
39
|
+
TableName: context.tableName,
|
|
40
|
+
FilterExpression: 'begins_with(#pk, :pkp) AND #sk = :session',
|
|
41
|
+
ExpressionAttributeNames: { '#pk': PARTITION_KEY_ATTRIBUTE, '#sk': SORT_KEY_ATTRIBUTE },
|
|
42
|
+
ExpressionAttributeValues: {
|
|
43
|
+
':pkp': historyPartitionPrefix(),
|
|
44
|
+
':session': SESSION_SORT_KEY,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
maxIterations: request.maxIterations,
|
|
48
|
+
maxItems: request.maxItems,
|
|
49
|
+
})) {
|
|
50
|
+
const session = summariseSession(raw, atSeconds);
|
|
51
|
+
if (session)
|
|
52
|
+
sessions.push(session);
|
|
53
|
+
}
|
|
54
|
+
sessions.sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0));
|
|
55
|
+
return { sessions: request.limit === undefined ? sessions : sessions.slice(0, request.limit) };
|
|
56
|
+
}
|
|
57
|
+
export async function listSessions(context, options = {}) {
|
|
58
|
+
const request = parseListSessionsRequest(options, context.indexName);
|
|
59
|
+
if (request.limit === 0)
|
|
60
|
+
return { sessions: [] };
|
|
61
|
+
return context.indexName === undefined
|
|
62
|
+
? allByScan(context, request)
|
|
63
|
+
: pageFromIndex(context, context.indexName, request);
|
|
64
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides that repairing `messageCount` is the session row's own job.
|
|
3
|
+
*
|
|
4
|
+
* The public repair only parses the session id and hands it to the module
|
|
5
|
+
* that owns the count (record 22). The recount, the compare-and-swap on the
|
|
6
|
+
* value it read, and the retry when an append lands in between all live
|
|
7
|
+
* there, beside the append that keeps the count in step, so the repair and
|
|
8
|
+
* the append cannot come to disagree about what the count means.
|
|
9
|
+
*/
|
|
10
|
+
import type { HistoryContext } from '../internal/setup.js';
|
|
11
|
+
/**
|
|
12
|
+
* Recompute `messageCount` from the number of stored message items and write it
|
|
13
|
+
* back, repairing drift. The append path keeps the count consistent
|
|
14
|
+
* transactionally, so this is only needed after external corruption.
|
|
15
|
+
*
|
|
16
|
+
* **Safe to run on a live session.** The count is written under a condition on
|
|
17
|
+
* the value the row held when the count was computed, so an append landing in
|
|
18
|
+
* between makes the write fail rather than clobber the increment; the tool then
|
|
19
|
+
* recounts and tries again. Written unconditionally, it would silently discard
|
|
20
|
+
* concurrent appends on exactly the sessions an operator reaches for this tool
|
|
21
|
+
* to fix. The count itself is a consistent read, because the pin can only
|
|
22
|
+
* catch a counter that moved, not a count taken off a stale replica.
|
|
23
|
+
*
|
|
24
|
+
* Accepts: `sessionId` — validated, and an existing session: repairing one that
|
|
25
|
+
* does not exist would mean creating it. `signal` — aborts the reads.
|
|
26
|
+
*
|
|
27
|
+
* Returns: the count now stored: the session's live message rows, which is
|
|
28
|
+
* what `getMessages` returns, except for a row it drops as corrupt under
|
|
29
|
+
* `onCorruptMessage: 'skip'`, which is counted here all the same.
|
|
30
|
+
*
|
|
31
|
+
* Throws: `VALIDATION` naming `sessionId`; `CONDITION_CONFLICT` when the
|
|
32
|
+
* session does not exist — rather than creating a permanent, TTL-less
|
|
33
|
+
* metadata-only row — and when it stays too busy to settle within
|
|
34
|
+
* {@link OVERWRITE_CAS_MAX_ATTEMPTS} attempts; `FORMAT_UNSUPPORTED` for a
|
|
35
|
+
* message row a newer release wrote, and `VALIDATION` naming `message` for
|
|
36
|
+
* a row in the session's message key space that this adapter did not write,
|
|
37
|
+
* both of which `getMessages` refuses too — writing a count back for a session
|
|
38
|
+
* no read can open would repair nothing; whatever the reads and the write
|
|
39
|
+
* throw.
|
|
40
|
+
*
|
|
41
|
+
* Guarantees: safe on a live session. The write is pinned to the value the row
|
|
42
|
+
* held when the count was computed, so an append landing in between fails the
|
|
43
|
+
* write rather than clobbering its increment, and the tool recounts; the rows
|
|
44
|
+
* are counted with a consistent read, so a chunk that just committed or was
|
|
45
|
+
* just rolled back is counted as it stands. Expired messages are not counted,
|
|
46
|
+
* so the repaired number agrees with what `getMessages` returns rather than
|
|
47
|
+
* with what the table still holds.
|
|
48
|
+
*/
|
|
49
|
+
export declare function reconcileMessageCount(context: HistoryContext, sessionId: string, signal?: AbortSignal): Promise<number>;
|