@farukada/aws-langgraph-dynamodb-ts 0.2.2 → 0.3.1
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 +224 -512
- package/dist/checkpointer/actions/delete-thread.d.ts +7 -6
- package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
- package/dist/checkpointer/actions/delete-thread.js +47 -152
- package/dist/checkpointer/actions/delete-thread.js.map +1 -1
- package/dist/checkpointer/actions/get-tuple.d.ts +6 -14
- package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
- package/dist/checkpointer/actions/get-tuple.js +13 -166
- package/dist/checkpointer/actions/get-tuple.js.map +1 -1
- package/dist/checkpointer/actions/list.d.ts +10 -0
- package/dist/checkpointer/actions/list.d.ts.map +1 -0
- package/dist/checkpointer/actions/list.js +51 -0
- package/dist/checkpointer/actions/list.js.map +1 -0
- package/dist/checkpointer/actions/put-writes.d.ts +6 -6
- package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
- package/dist/checkpointer/actions/put-writes.js +26 -75
- package/dist/checkpointer/actions/put-writes.js.map +1 -1
- package/dist/checkpointer/actions/put.d.ts +6 -11
- package/dist/checkpointer/actions/put.d.ts.map +1 -1
- package/dist/checkpointer/actions/put.js +29 -161
- package/dist/checkpointer/actions/put.js.map +1 -1
- package/dist/checkpointer/internal/assemble.d.ts +10 -0
- package/dist/checkpointer/internal/assemble.d.ts.map +1 -0
- package/dist/checkpointer/internal/assemble.js +37 -0
- package/dist/checkpointer/internal/assemble.js.map +1 -0
- package/dist/checkpointer/internal/configurable.d.ts +13 -0
- package/dist/checkpointer/internal/configurable.d.ts.map +1 -0
- package/dist/checkpointer/internal/configurable.js +23 -0
- package/dist/checkpointer/internal/configurable.js.map +1 -0
- package/dist/checkpointer/internal/fetch.d.ts +10 -0
- package/dist/checkpointer/internal/fetch.d.ts.map +1 -0
- package/dist/checkpointer/internal/fetch.js +46 -0
- package/dist/checkpointer/internal/fetch.js.map +1 -0
- package/dist/checkpointer/internal/filter-match.d.ts +12 -0
- package/dist/checkpointer/internal/filter-match.d.ts.map +1 -0
- package/dist/checkpointer/internal/filter-match.js +14 -0
- package/dist/checkpointer/internal/filter-match.js.map +1 -0
- package/dist/checkpointer/internal/item-reader.d.ts +10 -0
- package/dist/checkpointer/internal/item-reader.d.ts.map +1 -0
- package/dist/checkpointer/internal/item-reader.js +26 -0
- package/dist/checkpointer/internal/item-reader.js.map +1 -0
- package/dist/checkpointer/internal/item-writer.d.ts +14 -0
- package/dist/checkpointer/internal/item-writer.d.ts.map +1 -0
- package/dist/checkpointer/internal/item-writer.js +68 -0
- package/dist/checkpointer/internal/item-writer.js.map +1 -0
- package/dist/checkpointer/internal/keys.d.ts +15 -0
- package/dist/checkpointer/internal/keys.d.ts.map +1 -0
- package/dist/checkpointer/internal/keys.js +52 -0
- package/dist/checkpointer/internal/keys.js.map +1 -0
- package/dist/checkpointer/internal/query.d.ts +16 -0
- package/dist/checkpointer/internal/query.d.ts.map +1 -0
- package/dist/checkpointer/internal/query.js +33 -0
- package/dist/checkpointer/internal/query.js.map +1 -0
- package/dist/checkpointer/internal/setup.d.ts +31 -0
- package/dist/checkpointer/internal/setup.d.ts.map +1 -0
- package/dist/checkpointer/internal/setup.js +29 -0
- package/dist/checkpointer/internal/setup.js.map +1 -0
- package/dist/checkpointer/internal/validation.d.ts +9 -0
- package/dist/checkpointer/internal/validation.d.ts.map +1 -0
- package/dist/checkpointer/internal/validation.js +28 -0
- package/dist/checkpointer/internal/validation.js.map +1 -0
- package/dist/checkpointer/saver.d.ts +21 -0
- package/dist/checkpointer/saver.d.ts.map +1 -0
- package/dist/checkpointer/saver.js +49 -0
- package/dist/checkpointer/saver.js.map +1 -0
- package/dist/checkpointer/types.d.ts +43 -0
- package/dist/checkpointer/types.d.ts.map +1 -0
- package/dist/{store/types/index.js → checkpointer/types.js} +1 -1
- package/dist/checkpointer/types.js.map +1 -0
- package/dist/factory/factory.d.ts +41 -0
- package/dist/factory/factory.d.ts.map +1 -0
- package/dist/factory/factory.js +49 -0
- package/dist/factory/factory.js.map +1 -0
- package/dist/history/actions/add-messages.d.ts +12 -7
- package/dist/history/actions/add-messages.d.ts.map +1 -1
- package/dist/history/actions/add-messages.js +50 -48
- package/dist/history/actions/add-messages.js.map +1 -1
- package/dist/history/actions/clear.d.ts +5 -11
- package/dist/history/actions/clear.d.ts.map +1 -1
- package/dist/history/actions/clear.js +28 -62
- package/dist/history/actions/clear.js.map +1 -1
- package/dist/history/actions/get-messages.d.ts +6 -13
- package/dist/history/actions/get-messages.d.ts.map +1 -1
- package/dist/history/actions/get-messages.js +23 -59
- package/dist/history/actions/get-messages.js.map +1 -1
- package/dist/history/actions/list-sessions.d.ts +6 -22
- package/dist/history/actions/list-sessions.d.ts.map +1 -1
- package/dist/history/actions/list-sessions.js +26 -69
- package/dist/history/actions/list-sessions.js.map +1 -1
- package/dist/history/actions/reconcile-count.d.ts +10 -0
- package/dist/history/actions/reconcile-count.d.ts.map +1 -0
- package/dist/history/actions/reconcile-count.js +39 -0
- package/dist/history/actions/reconcile-count.js.map +1 -0
- package/dist/history/chat-message-history.d.ts +36 -0
- package/dist/history/chat-message-history.d.ts.map +1 -0
- package/dist/history/chat-message-history.js +67 -0
- package/dist/history/chat-message-history.js.map +1 -0
- package/dist/history/internal/append-saga.d.ts +17 -0
- package/dist/history/internal/append-saga.d.ts.map +1 -0
- package/dist/history/internal/append-saga.js +94 -0
- package/dist/history/internal/append-saga.js.map +1 -0
- package/dist/history/internal/item-mapper.d.ts +12 -0
- package/dist/history/internal/item-mapper.d.ts.map +1 -0
- package/dist/history/internal/item-mapper.js +33 -0
- package/dist/history/internal/item-mapper.js.map +1 -0
- package/dist/history/internal/keys.d.ts +9 -0
- package/dist/history/internal/keys.d.ts.map +1 -0
- package/dist/history/internal/keys.js +22 -0
- package/dist/history/internal/keys.js.map +1 -0
- package/dist/history/internal/message-chunker.d.ts +14 -0
- package/dist/history/internal/message-chunker.d.ts.map +1 -0
- package/dist/history/internal/message-chunker.js +60 -0
- package/dist/history/internal/message-chunker.js.map +1 -0
- package/dist/history/internal/message-transaction.d.ts +17 -0
- package/dist/history/internal/message-transaction.d.ts.map +1 -0
- package/dist/history/internal/message-transaction.js +27 -0
- package/dist/history/internal/message-transaction.js.map +1 -0
- package/dist/history/internal/query.d.ts +6 -0
- package/dist/history/internal/query.d.ts.map +1 -0
- package/dist/history/internal/query.js +28 -0
- package/dist/history/internal/query.js.map +1 -0
- package/dist/history/internal/session-update.d.ts +20 -0
- package/dist/history/internal/session-update.d.ts.map +1 -0
- package/dist/history/internal/session-update.js +46 -0
- package/dist/history/internal/session-update.js.map +1 -0
- package/dist/history/internal/setup.d.ts +28 -0
- package/dist/history/internal/setup.d.ts.map +1 -0
- package/dist/history/internal/setup.js +27 -0
- package/dist/history/internal/setup.js.map +1 -0
- package/dist/history/internal/title-generator.d.ts +7 -0
- package/dist/history/internal/title-generator.d.ts.map +1 -0
- package/dist/history/internal/title-generator.js +16 -0
- package/dist/history/internal/title-generator.js.map +1 -0
- package/dist/history/internal/ttl-anchor.d.ts +12 -0
- package/dist/history/internal/ttl-anchor.d.ts.map +1 -0
- package/dist/history/internal/ttl-anchor.js +26 -0
- package/dist/history/internal/ttl-anchor.js.map +1 -0
- package/dist/history/session-adapter.d.ts +10 -26
- package/dist/history/session-adapter.d.ts.map +1 -1
- package/dist/history/session-adapter.js +15 -57
- package/dist/history/session-adapter.js.map +1 -1
- package/dist/history/types.d.ts +36 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +3 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +18 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -16
- package/dist/index.js.map +1 -1
- package/dist/shared/clock.d.ts +3 -0
- package/dist/shared/clock.d.ts.map +1 -0
- package/dist/shared/clock.js +8 -0
- package/dist/shared/clock.js.map +1 -0
- package/dist/shared/codec/codec.d.ts +44 -0
- package/dist/shared/codec/codec.d.ts.map +1 -0
- package/dist/shared/codec/codec.js +44 -0
- package/dist/shared/codec/codec.js.map +1 -0
- package/dist/shared/codec/compression.d.ts +25 -0
- package/dist/shared/codec/compression.d.ts.map +1 -0
- package/dist/shared/codec/compression.js +49 -0
- package/dist/shared/codec/compression.js.map +1 -0
- package/dist/shared/codec/descriptor-keys.d.ts +4 -0
- package/dist/shared/codec/descriptor-keys.d.ts.map +1 -0
- package/dist/shared/codec/descriptor-keys.js +14 -0
- package/dist/shared/codec/descriptor-keys.js.map +1 -0
- package/dist/shared/codec/json-serde.d.ts +8 -0
- package/dist/shared/codec/json-serde.d.ts.map +1 -0
- package/dist/shared/codec/json-serde.js +18 -0
- package/dist/shared/codec/json-serde.js.map +1 -0
- package/dist/shared/codec/s3/client.d.ts +6 -0
- package/dist/shared/codec/s3/client.d.ts.map +1 -0
- package/dist/shared/codec/s3/client.js +18 -0
- package/dist/shared/codec/s3/client.js.map +1 -0
- package/dist/shared/codec/s3/config.d.ts +16 -0
- package/dist/shared/codec/s3/config.d.ts.map +1 -0
- package/dist/shared/codec/s3/config.js +14 -0
- package/dist/shared/codec/s3/config.js.map +1 -0
- package/dist/shared/codec/s3/delete.d.ts +8 -0
- package/dist/shared/codec/s3/delete.d.ts.map +1 -0
- package/dist/shared/codec/s3/delete.js +29 -0
- package/dist/shared/codec/s3/delete.js.map +1 -0
- package/dist/shared/codec/s3/lifecycle.d.ts +8 -0
- package/dist/shared/codec/s3/lifecycle.d.ts.map +1 -0
- package/dist/shared/codec/s3/lifecycle.js +47 -0
- package/dist/shared/codec/s3/lifecycle.js.map +1 -0
- package/dist/shared/codec/s3/offloader.d.ts +33 -0
- package/dist/shared/codec/s3/offloader.d.ts.map +1 -0
- package/dist/shared/codec/s3/offloader.js +80 -0
- package/dist/shared/codec/s3/offloader.js.map +1 -0
- package/dist/shared/codec/s3/orphans.d.ts +16 -0
- package/dist/shared/codec/s3/orphans.d.ts.map +1 -0
- package/dist/shared/codec/s3/orphans.js +73 -0
- package/dist/shared/codec/s3/orphans.js.map +1 -0
- package/dist/shared/codec/s3/read-write.d.ts +14 -0
- package/dist/shared/codec/s3/read-write.d.ts.map +1 -0
- package/dist/shared/codec/s3/read-write.js +42 -0
- package/dist/shared/codec/s3/read-write.js.map +1 -0
- package/dist/shared/constants.d.ts +37 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +40 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/dynamodb/backoff.d.ts +15 -0
- package/dist/shared/dynamodb/backoff.d.ts.map +1 -0
- package/dist/shared/dynamodb/backoff.js +48 -0
- package/dist/shared/dynamodb/backoff.js.map +1 -0
- package/dist/shared/dynamodb/batch-write.d.ts +10 -0
- package/dist/shared/dynamodb/batch-write.d.ts.map +1 -0
- package/dist/shared/dynamodb/batch-write.js +17 -0
- package/dist/shared/dynamodb/batch-write.js.map +1 -0
- package/dist/shared/dynamodb/client.d.ts +21 -0
- package/dist/shared/dynamodb/client.d.ts.map +1 -0
- package/dist/shared/dynamodb/client.js +19 -0
- package/dist/shared/dynamodb/client.js.map +1 -0
- package/dist/shared/dynamodb/drain-unprocessed.d.ts +15 -0
- package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +1 -0
- package/dist/shared/dynamodb/drain-unprocessed.js +35 -0
- package/dist/shared/dynamodb/drain-unprocessed.js.map +1 -0
- package/dist/shared/dynamodb/paginate-core.d.ts +22 -0
- package/dist/shared/dynamodb/paginate-core.d.ts.map +1 -0
- package/dist/shared/dynamodb/paginate-core.js +52 -0
- package/dist/shared/dynamodb/paginate-core.js.map +1 -0
- package/dist/shared/dynamodb/paginate.d.ts +15 -0
- package/dist/shared/dynamodb/paginate.d.ts.map +1 -0
- package/dist/shared/dynamodb/paginate.js +20 -0
- package/dist/shared/dynamodb/paginate.js.map +1 -0
- package/dist/shared/dynamodb/retry-classifier.d.ts +9 -0
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +1 -0
- package/dist/shared/dynamodb/retry-classifier.js +75 -0
- package/dist/shared/dynamodb/retry-classifier.js.map +1 -0
- package/dist/shared/dynamodb/retry.d.ts +18 -0
- package/dist/shared/dynamodb/retry.d.ts.map +1 -0
- package/dist/shared/dynamodb/retry.js +53 -0
- package/dist/shared/dynamodb/retry.js.map +1 -0
- package/dist/shared/dynamodb/scan.d.ts +15 -0
- package/dist/shared/dynamodb/scan.d.ts.map +1 -0
- package/dist/shared/dynamodb/scan.js +20 -0
- package/dist/shared/dynamodb/scan.js.map +1 -0
- package/dist/shared/dynamodb/types.d.ts +24 -0
- package/dist/shared/dynamodb/types.d.ts.map +1 -0
- package/dist/shared/dynamodb/types.js +3 -0
- package/dist/shared/dynamodb/types.js.map +1 -0
- package/dist/shared/errors/base-error.d.ts +22 -0
- package/dist/shared/errors/base-error.d.ts.map +1 -0
- package/dist/shared/errors/base-error.js +28 -0
- package/dist/shared/errors/base-error.js.map +1 -0
- package/dist/shared/errors/error-code.d.ts +13 -0
- package/dist/shared/errors/error-code.d.ts.map +1 -0
- package/dist/shared/errors/error-code.js +17 -0
- package/dist/shared/errors/error-code.js.map +1 -0
- package/dist/shared/errors/errors.d.ts +47 -0
- package/dist/shared/errors/errors.d.ts.map +1 -0
- package/dist/shared/errors/errors.js +82 -0
- package/dist/shared/errors/errors.js.map +1 -0
- package/dist/shared/errors/wrap-error.d.ts +16 -0
- package/dist/shared/errors/wrap-error.d.ts.map +1 -0
- package/dist/shared/errors/wrap-error.js +30 -0
- package/dist/shared/errors/wrap-error.js.map +1 -0
- package/dist/shared/logging/logger.d.ts +14 -0
- package/dist/shared/logging/logger.d.ts.map +1 -0
- package/dist/shared/logging/logger.js +16 -0
- package/dist/shared/logging/logger.js.map +1 -0
- package/dist/shared/logging/redaction.d.ts +19 -0
- package/dist/shared/logging/redaction.d.ts.map +1 -0
- package/dist/shared/logging/redaction.js +67 -0
- package/dist/shared/logging/redaction.js.map +1 -0
- package/dist/shared/options.d.ts +32 -0
- package/dist/shared/options.d.ts.map +1 -0
- package/dist/shared/options.js +3 -0
- package/dist/shared/options.js.map +1 -0
- package/dist/shared/ulid.d.ts +10 -0
- package/dist/shared/ulid.d.ts.map +1 -0
- package/dist/shared/ulid.js +65 -0
- package/dist/shared/ulid.js.map +1 -0
- package/dist/shared/validation/primitives.d.ts +17 -0
- package/dist/shared/validation/primitives.d.ts.map +1 -0
- package/dist/shared/validation/primitives.js +71 -0
- package/dist/shared/validation/primitives.js.map +1 -0
- package/dist/shared/validation/ttl.d.ts +16 -0
- package/dist/shared/validation/ttl.d.ts.map +1 -0
- package/dist/shared/validation/ttl.js +26 -0
- package/dist/shared/validation/ttl.js.map +1 -0
- package/dist/store/actions/get.d.ts +5 -0
- package/dist/store/actions/get.d.ts.map +1 -0
- package/dist/store/actions/get.js +21 -0
- package/dist/store/actions/get.js.map +1 -0
- package/dist/store/actions/list-namespaces.d.ts +9 -0
- package/dist/store/actions/list-namespaces.d.ts.map +1 -0
- package/dist/store/actions/list-namespaces.js +46 -0
- package/dist/store/actions/list-namespaces.js.map +1 -0
- package/dist/store/actions/put.d.ts +11 -0
- package/dist/store/actions/put.d.ts.map +1 -0
- package/dist/store/actions/put.js +81 -0
- package/dist/store/actions/put.js.map +1 -0
- package/dist/store/actions/reconcile-vector-index.d.ts +17 -0
- package/dist/store/actions/reconcile-vector-index.d.ts.map +1 -0
- package/dist/store/actions/reconcile-vector-index.js +27 -0
- package/dist/store/actions/reconcile-vector-index.js.map +1 -0
- package/dist/store/actions/search.d.ts +10 -0
- package/dist/store/actions/search.d.ts.map +1 -0
- package/dist/store/actions/search.js +72 -0
- package/dist/store/actions/search.js.map +1 -0
- package/dist/store/internal/filter.d.ts +10 -0
- package/dist/store/internal/filter.d.ts.map +1 -0
- package/dist/store/internal/filter.js +37 -0
- package/dist/store/internal/filter.js.map +1 -0
- package/dist/store/internal/index-reconcile.d.ts +22 -0
- package/dist/store/internal/index-reconcile.d.ts.map +1 -0
- package/dist/store/internal/index-reconcile.js +68 -0
- package/dist/store/internal/index-reconcile.js.map +1 -0
- package/dist/store/internal/index-sync.d.ts +11 -0
- package/dist/store/internal/index-sync.d.ts.map +1 -0
- package/dist/store/internal/index-sync.js +26 -0
- package/dist/store/internal/index-sync.js.map +1 -0
- package/dist/store/internal/item-mapper.d.ts +23 -0
- package/dist/store/internal/item-mapper.d.ts.map +1 -0
- package/dist/store/internal/item-mapper.js +51 -0
- package/dist/store/internal/item-mapper.js.map +1 -0
- package/dist/store/internal/keys.d.ts +18 -0
- package/dist/store/internal/keys.d.ts.map +1 -0
- package/dist/store/internal/keys.js +36 -0
- package/dist/store/internal/keys.js.map +1 -0
- package/dist/store/internal/namespace-match.d.ts +12 -0
- package/dist/store/internal/namespace-match.d.ts.map +1 -0
- package/dist/store/internal/namespace-match.js +41 -0
- package/dist/store/internal/namespace-match.js.map +1 -0
- package/dist/store/internal/query.d.ts +6 -0
- package/dist/store/internal/query.d.ts.map +1 -0
- package/dist/store/internal/query.js +32 -0
- package/dist/store/internal/query.js.map +1 -0
- package/dist/store/internal/ranker.d.ts +13 -0
- package/dist/store/internal/ranker.d.ts.map +1 -0
- package/dist/store/internal/ranker.js +29 -0
- package/dist/store/internal/ranker.js.map +1 -0
- package/dist/store/internal/semantic-search.d.ts +13 -0
- package/dist/store/internal/semantic-search.d.ts.map +1 -0
- package/dist/store/internal/semantic-search.js +47 -0
- package/dist/store/internal/semantic-search.js.map +1 -0
- package/dist/store/internal/setup.d.ts +31 -0
- package/dist/store/internal/setup.d.ts.map +1 -0
- package/dist/store/internal/setup.js +29 -0
- package/dist/store/internal/setup.js.map +1 -0
- package/dist/store/internal/validation.d.ts +7 -0
- package/dist/store/internal/validation.d.ts.map +1 -0
- package/dist/store/internal/validation.js +26 -0
- package/dist/store/internal/validation.js.map +1 -0
- package/dist/store/store.d.ts +24 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +58 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/types.d.ts +28 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +3 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/vector-backend.d.ts +27 -0
- package/dist/store/vector-backend.d.ts.map +1 -0
- package/dist/store/vector-backend.js +3 -0
- package/dist/store/vector-backend.js.map +1 -0
- package/package.json +21 -22
- package/dist/checkpointer/actions/index.d.ts +0 -5
- package/dist/checkpointer/actions/index.d.ts.map +0 -1
- package/dist/checkpointer/actions/index.js +0 -21
- package/dist/checkpointer/actions/index.js.map +0 -1
- package/dist/checkpointer/actions/validate-configurable.d.ts +0 -10
- package/dist/checkpointer/actions/validate-configurable.d.ts.map +0 -1
- package/dist/checkpointer/actions/validate-configurable.js +0 -39
- package/dist/checkpointer/actions/validate-configurable.js.map +0 -1
- package/dist/checkpointer/actions/writer.d.ts +0 -52
- package/dist/checkpointer/actions/writer.d.ts.map +0 -1
- package/dist/checkpointer/actions/writer.js +0 -109
- package/dist/checkpointer/actions/writer.js.map +0 -1
- package/dist/checkpointer/index.d.ts +0 -118
- package/dist/checkpointer/index.d.ts.map +0 -1
- package/dist/checkpointer/index.js +0 -393
- package/dist/checkpointer/index.js.map +0 -1
- package/dist/checkpointer/types/index.d.ts +0 -232
- package/dist/checkpointer/types/index.d.ts.map +0 -1
- package/dist/checkpointer/types/index.js +0 -13
- package/dist/checkpointer/types/index.js.map +0 -1
- package/dist/checkpointer/utils/deserialization.d.ts +0 -20
- package/dist/checkpointer/utils/deserialization.d.ts.map +0 -1
- package/dist/checkpointer/utils/deserialization.js +0 -81
- package/dist/checkpointer/utils/deserialization.js.map +0 -1
- package/dist/checkpointer/utils/index.d.ts +0 -7
- package/dist/checkpointer/utils/index.d.ts.map +0 -1
- package/dist/checkpointer/utils/index.js +0 -27
- package/dist/checkpointer/utils/index.js.map +0 -1
- package/dist/checkpointer/utils/validation.d.ts +0 -48
- package/dist/checkpointer/utils/validation.d.ts.map +0 -1
- package/dist/checkpointer/utils/validation.js +0 -235
- package/dist/checkpointer/utils/validation.js.map +0 -1
- package/dist/factory.d.ts +0 -153
- package/dist/factory.d.ts.map +0 -1
- package/dist/factory.js +0 -206
- package/dist/factory.js.map +0 -1
- package/dist/history/actions/add-message.d.ts +0 -10
- package/dist/history/actions/add-message.d.ts.map +0 -1
- package/dist/history/actions/add-message.js +0 -24
- package/dist/history/actions/add-message.js.map +0 -1
- package/dist/history/actions/index.d.ts +0 -9
- package/dist/history/actions/index.d.ts.map +0 -1
- package/dist/history/actions/index.js +0 -17
- package/dist/history/actions/index.js.map +0 -1
- package/dist/history/index.d.ts +0 -118
- package/dist/history/index.d.ts.map +0 -1
- package/dist/history/index.js +0 -179
- package/dist/history/index.js.map +0 -1
- package/dist/history/types/index.d.ts +0 -184
- package/dist/history/types/index.d.ts.map +0 -1
- package/dist/history/types/index.js +0 -7
- package/dist/history/types/index.js.map +0 -1
- package/dist/history/utils/index.d.ts +0 -9
- package/dist/history/utils/index.d.ts.map +0 -1
- package/dist/history/utils/index.js +0 -27
- package/dist/history/utils/index.js.map +0 -1
- package/dist/history/utils/optimistic-retry.d.ts +0 -31
- package/dist/history/utils/optimistic-retry.d.ts.map +0 -1
- package/dist/history/utils/optimistic-retry.js +0 -74
- package/dist/history/utils/optimistic-retry.js.map +0 -1
- package/dist/history/utils/title-generator.d.ts +0 -12
- package/dist/history/utils/title-generator.d.ts.map +0 -1
- package/dist/history/utils/title-generator.js +0 -57
- package/dist/history/utils/title-generator.js.map +0 -1
- package/dist/history/utils/update-expression-builder.d.ts +0 -55
- package/dist/history/utils/update-expression-builder.d.ts.map +0 -1
- package/dist/history/utils/update-expression-builder.js +0 -112
- package/dist/history/utils/update-expression-builder.js.map +0 -1
- package/dist/history/utils/validation.d.ts +0 -68
- package/dist/history/utils/validation.d.ts.map +0 -1
- package/dist/history/utils/validation.js +0 -213
- package/dist/history/utils/validation.js.map +0 -1
- package/dist/shared/index.d.ts +0 -5
- package/dist/shared/index.d.ts.map +0 -1
- package/dist/shared/index.js +0 -21
- package/dist/shared/index.js.map +0 -1
- package/dist/shared/utils/batch-write.d.ts +0 -74
- package/dist/shared/utils/batch-write.d.ts.map +0 -1
- package/dist/shared/utils/batch-write.js +0 -110
- package/dist/shared/utils/batch-write.js.map +0 -1
- package/dist/shared/utils/client-factory.d.ts +0 -25
- package/dist/shared/utils/client-factory.d.ts.map +0 -1
- package/dist/shared/utils/client-factory.js +0 -23
- package/dist/shared/utils/client-factory.js.map +0 -1
- package/dist/shared/utils/compressor.d.ts +0 -66
- package/dist/shared/utils/compressor.d.ts.map +0 -1
- package/dist/shared/utils/compressor.js +0 -133
- package/dist/shared/utils/compressor.js.map +0 -1
- package/dist/shared/utils/constants.d.ts +0 -13
- package/dist/shared/utils/constants.d.ts.map +0 -1
- package/dist/shared/utils/constants.js +0 -35
- package/dist/shared/utils/constants.js.map +0 -1
- package/dist/shared/utils/index.d.ts +0 -14
- package/dist/shared/utils/index.d.ts.map +0 -1
- package/dist/shared/utils/index.js +0 -30
- package/dist/shared/utils/index.js.map +0 -1
- package/dist/shared/utils/logger.d.ts +0 -75
- package/dist/shared/utils/logger.d.ts.map +0 -1
- package/dist/shared/utils/logger.js +0 -148
- package/dist/shared/utils/logger.js.map +0 -1
- package/dist/shared/utils/retry.d.ts +0 -26
- package/dist/shared/utils/retry.d.ts.map +0 -1
- package/dist/shared/utils/retry.js +0 -169
- package/dist/shared/utils/retry.js.map +0 -1
- package/dist/shared/utils/s3-offloader.d.ts +0 -153
- package/dist/shared/utils/s3-offloader.d.ts.map +0 -1
- package/dist/shared/utils/s3-offloader.js +0 -281
- package/dist/shared/utils/s3-offloader.js.map +0 -1
- package/dist/shared/utils/s3-orphans.d.ts +0 -16
- package/dist/shared/utils/s3-orphans.d.ts.map +0 -1
- package/dist/shared/utils/s3-orphans.js +0 -79
- package/dist/shared/utils/s3-orphans.js.map +0 -1
- package/dist/shared/utils/sleep.d.ts +0 -48
- package/dist/shared/utils/sleep.d.ts.map +0 -1
- package/dist/shared/utils/sleep.js +0 -82
- package/dist/shared/utils/sleep.js.map +0 -1
- package/dist/shared/utils/ttl.d.ts +0 -24
- package/dist/shared/utils/ttl.d.ts.map +0 -1
- package/dist/shared/utils/ttl.js +0 -43
- package/dist/shared/utils/ttl.js.map +0 -1
- package/dist/store/actions/get-operation.d.ts +0 -11
- package/dist/store/actions/get-operation.d.ts.map +0 -1
- package/dist/store/actions/get-operation.js +0 -42
- package/dist/store/actions/get-operation.js.map +0 -1
- package/dist/store/actions/index.d.ts +0 -5
- package/dist/store/actions/index.d.ts.map +0 -1
- package/dist/store/actions/index.js +0 -21
- package/dist/store/actions/index.js.map +0 -1
- package/dist/store/actions/list-namespaces-operation.d.ts +0 -10
- package/dist/store/actions/list-namespaces-operation.d.ts.map +0 -1
- package/dist/store/actions/list-namespaces-operation.js +0 -227
- package/dist/store/actions/list-namespaces-operation.js.map +0 -1
- package/dist/store/actions/put-operation.d.ts +0 -9
- package/dist/store/actions/put-operation.d.ts.map +0 -1
- package/dist/store/actions/put-operation.js +0 -107
- package/dist/store/actions/put-operation.js.map +0 -1
- package/dist/store/actions/search-operation.d.ts +0 -17
- package/dist/store/actions/search-operation.d.ts.map +0 -1
- package/dist/store/actions/search-operation.js +0 -203
- package/dist/store/actions/search-operation.js.map +0 -1
- package/dist/store/index.d.ts +0 -82
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -172
- package/dist/store/index.js.map +0 -1
- package/dist/store/types/index.d.ts +0 -131
- package/dist/store/types/index.d.ts.map +0 -1
- package/dist/store/types/index.js.map +0 -1
- package/dist/store/utils/filter.d.ts +0 -16
- package/dist/store/utils/filter.d.ts.map +0 -1
- package/dist/store/utils/filter.js +0 -133
- package/dist/store/utils/filter.js.map +0 -1
- package/dist/store/utils/index.d.ts +0 -7
- package/dist/store/utils/index.d.ts.map +0 -1
- package/dist/store/utils/index.js +0 -27
- package/dist/store/utils/index.js.map +0 -1
- package/dist/store/utils/validation.d.ts +0 -61
- package/dist/store/utils/validation.d.ts.map +0 -1
- package/dist/store/utils/validation.js +0 -260
- package/dist/store/utils/validation.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadLocation = void 0;
|
|
4
|
+
exports.encodePayload = encodePayload;
|
|
5
|
+
exports.decodePayload = decodePayload;
|
|
6
|
+
const compression_1 = require("./compression");
|
|
7
|
+
/** Where an encoded payload lives. */
|
|
8
|
+
var PayloadLocation;
|
|
9
|
+
(function (PayloadLocation) {
|
|
10
|
+
PayloadLocation["INLINE"] = "INLINE";
|
|
11
|
+
PayloadLocation["S3"] = "S3";
|
|
12
|
+
})(PayloadLocation || (exports.PayloadLocation = PayloadLocation = {}));
|
|
13
|
+
function requireOffloader(deps) {
|
|
14
|
+
if (!deps.offloader) {
|
|
15
|
+
throw new Error('Cannot decode an S3 payload without an offloader');
|
|
16
|
+
}
|
|
17
|
+
return deps.offloader;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Encode `value`: serialize via serde, compress (if configured), then offload
|
|
21
|
+
* to S3 when the compressed bytes exceed the offloader's threshold. Returns a
|
|
22
|
+
* descriptor recording how to read it back.
|
|
23
|
+
*/
|
|
24
|
+
async function encodePayload(value, deps, options) {
|
|
25
|
+
const [serdeType, raw] = await deps.serde.dumpsTyped(value);
|
|
26
|
+
const { bytes, compressed } = deps.compression
|
|
27
|
+
? await (0, compression_1.compress)(raw, deps.compression)
|
|
28
|
+
: { bytes: raw, compressed: false };
|
|
29
|
+
if (deps.offloader && deps.offloader.shouldOffload(bytes)) {
|
|
30
|
+
const s3Key = deps.offloader.buildKey(options.keyParts);
|
|
31
|
+
await deps.offloader.upload(s3Key, bytes);
|
|
32
|
+
return { location: PayloadLocation.S3, serdeType, compressed, s3Key };
|
|
33
|
+
}
|
|
34
|
+
return { location: PayloadLocation.INLINE, serdeType, compressed, bytes };
|
|
35
|
+
}
|
|
36
|
+
/** Decode a {@link PayloadDescriptor} produced by {@link encodePayload}. */
|
|
37
|
+
async function decodePayload(descriptor, deps) {
|
|
38
|
+
const raw = descriptor.location === PayloadLocation.S3
|
|
39
|
+
? await requireOffloader(deps).download(descriptor.s3Key)
|
|
40
|
+
: descriptor.bytes;
|
|
41
|
+
const bytes = await (0, compression_1.decompress)(raw, descriptor.compressed, deps.compression?.maxDecompressedBytes);
|
|
42
|
+
return deps.serde.loadsTyped(descriptor.serdeType, bytes);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/shared/codec/codec.ts"],"names":[],"mappings":";;;AAsDA,sCAeC;AAGD,sCAWC;AAjFD,+CAA2F;AAG3F,sCAAsC;AACtC,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,4BAAS,CAAA;AACX,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B;AAiCD,SAAS,gBAAgB,CAAC,IAAe;IACvC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,aAAa,CACjC,KAAQ,EACR,IAAe,EACf,OAAsB;IAEtB,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAsB,IAAI,CAAC,WAAW;QAC/D,CAAC,CAAC,MAAM,IAAA,sBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC5E,CAAC;AAED,4EAA4E;AACrE,KAAK,UAAU,aAAa,CAAI,UAA6B,EAAE,IAAe;IACnF,MAAM,GAAG,GACP,UAAU,CAAC,QAAQ,KAAK,eAAe,CAAC,EAAE;QACxC,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QACzD,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,IAAA,wBAAU,EAC5B,GAAG,EACH,UAAU,CAAC,UAAU,EACrB,IAAI,CAAC,WAAW,EAAE,oBAAoB,CACvC,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Configuration for payload compression. */
|
|
2
|
+
export interface CompressionConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
minSizeBytes?: number;
|
|
5
|
+
level?: number;
|
|
6
|
+
maxDecompressedBytes?: number;
|
|
7
|
+
}
|
|
8
|
+
/** The bytes to store plus whether they were gzip-compressed. */
|
|
9
|
+
export interface CompressionResult {
|
|
10
|
+
bytes: Uint8Array;
|
|
11
|
+
compressed: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Gzip `data` when it is at least `minSizeBytes` and compression actually saves
|
|
15
|
+
* space. Returns the bytes to store and a `compressed` flag the caller records
|
|
16
|
+
* in the payload descriptor; compression is never inferred from the bytes.
|
|
17
|
+
*/
|
|
18
|
+
export declare function compress(data: Uint8Array, config: CompressionConfig): Promise<CompressionResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Gunzip `data` when `compressed` is true; otherwise return it unchanged. Throws
|
|
21
|
+
* a {@link DynamoDbLangGraphError} with code `COMPRESSION_LIMIT` if the output
|
|
22
|
+
* would exceed `maxBytes` (bomb guard).
|
|
23
|
+
*/
|
|
24
|
+
export declare function decompress(data: Uint8Array, compressed: boolean, maxBytes?: number): Promise<Uint8Array>;
|
|
25
|
+
//# sourceMappingURL=compression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../../src/shared/codec/compression.ts"],"names":[],"mappings":"AAiBA,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,OAAO,EACnB,QAAQ,GAAE,MAAuC,GAChD,OAAO,CAAC,UAAU,CAAC,CAgBrB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compress = compress;
|
|
4
|
+
exports.decompress = decompress;
|
|
5
|
+
const node_util_1 = require("node:util");
|
|
6
|
+
const node_zlib_1 = require("node:zlib");
|
|
7
|
+
const constants_1 = require("../constants");
|
|
8
|
+
const base_error_1 = require("../errors/base-error");
|
|
9
|
+
const error_code_1 = require("../errors/error-code");
|
|
10
|
+
const gzipAsync = (0, node_util_1.promisify)(node_zlib_1.gzip);
|
|
11
|
+
const gunzipAsync = (0, node_util_1.promisify)(node_zlib_1.gunzip);
|
|
12
|
+
/** Minimum fraction of the original size the gzip output must beat to be kept. */
|
|
13
|
+
const COMPRESSION_GAIN_RATIO = 0.9;
|
|
14
|
+
/**
|
|
15
|
+
* Gzip `data` when it is at least `minSizeBytes` and compression actually saves
|
|
16
|
+
* space. Returns the bytes to store and a `compressed` flag the caller records
|
|
17
|
+
* in the payload descriptor; compression is never inferred from the bytes.
|
|
18
|
+
*/
|
|
19
|
+
async function compress(data, config) {
|
|
20
|
+
const minSize = config.minSizeBytes ?? constants_1.DEFAULT_COMPRESSION_MIN_BYTES;
|
|
21
|
+
if (!config.enabled || data.length < minSize)
|
|
22
|
+
return { bytes: data, compressed: false };
|
|
23
|
+
const level = config.level ?? constants_1.DEFAULT_COMPRESSION_LEVEL;
|
|
24
|
+
const gzipped = new Uint8Array(await gzipAsync(data, { level }));
|
|
25
|
+
if (gzipped.length >= data.length * COMPRESSION_GAIN_RATIO) {
|
|
26
|
+
return { bytes: data, compressed: false };
|
|
27
|
+
}
|
|
28
|
+
return { bytes: gzipped, compressed: true };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Gunzip `data` when `compressed` is true; otherwise return it unchanged. Throws
|
|
32
|
+
* a {@link DynamoDbLangGraphError} with code `COMPRESSION_LIMIT` if the output
|
|
33
|
+
* would exceed `maxBytes` (bomb guard).
|
|
34
|
+
*/
|
|
35
|
+
async function decompress(data, compressed, maxBytes = constants_1.DEFAULT_MAX_DECOMPRESSED_BYTES) {
|
|
36
|
+
if (!compressed)
|
|
37
|
+
return data;
|
|
38
|
+
try {
|
|
39
|
+
return new Uint8Array(await gunzipAsync(data, { maxOutputLength: maxBytes }));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const err = error;
|
|
43
|
+
if (err.code === 'ERR_BUFFER_TOO_LARGE') {
|
|
44
|
+
throw new base_error_1.DynamoDbLangGraphError(`Refusing to decompress: output would exceed ${maxBytes} bytes`, error_code_1.ErrorCode.COMPRESSION_LIMIT, {}, error);
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=compression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../../src/shared/codec/compression.ts"],"names":[],"mappings":";;AAoCA,4BAYC;AAOD,gCAoBC;AA3ED,yCAAsC;AACtC,yCAAyC;AAEzC,4CAIsB;AACtB,qDAA8D;AAC9D,qDAAiD;AAEjD,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,gBAAI,CAAC,CAAC;AAClC,MAAM,WAAW,GAAG,IAAA,qBAAS,EAAC,kBAAM,CAAC,CAAC;AAEtC,kFAAkF;AAClF,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAgBnC;;;;GAIG;AACI,KAAK,UAAU,QAAQ,CAC5B,IAAgB,EAChB,MAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,yCAA6B,CAAC;IACrE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,qCAAyB,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,UAAmB,EACnB,WAAmB,0CAA8B;IAEjD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,UAAU,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA0B,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACxC,MAAM,IAAI,mCAAsB,CAC9B,+CAA+C,QAAQ,QAAQ,EAC/D,sBAAS,CAAC,iBAAiB,EAC3B,EAAE,EACF,KAAc,CACf,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor-keys.d.ts","sourceRoot":"","sources":["../../../src/shared/codec/descriptor-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,SAAS,CAAC;AAElE,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAMjF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectS3Keys = collectS3Keys;
|
|
4
|
+
const codec_1 = require("./codec");
|
|
5
|
+
/** Collect the S3 keys of any offloaded descriptors, for orphan cleanup. */
|
|
6
|
+
function collectS3Keys(descriptors) {
|
|
7
|
+
const keys = [];
|
|
8
|
+
for (const descriptor of descriptors) {
|
|
9
|
+
if (descriptor.location === codec_1.PayloadLocation.S3)
|
|
10
|
+
keys.push(descriptor.s3Key);
|
|
11
|
+
}
|
|
12
|
+
return keys;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=descriptor-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor-keys.js","sourceRoot":"","sources":["../../../src/shared/codec/descriptor-keys.ts"],"names":[],"mappings":";;AAGA,sCAMC;AATD,mCAAkE;AAElE,4EAA4E;AAC5E,SAAgB,aAAa,CAAC,WAAyC;IACrE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,QAAQ,KAAK,uBAAe,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SerializerProtocol } from '@langchain/langgraph-checkpoint';
|
|
2
|
+
/**
|
|
3
|
+
* A minimal JSON serializer implementing LangGraph's {@link SerializerProtocol},
|
|
4
|
+
* used by adapters (the store, history) that persist plain JSON values through
|
|
5
|
+
* the shared payload codec.
|
|
6
|
+
*/
|
|
7
|
+
export declare const JSON_SERDE: SerializerProtocol;
|
|
8
|
+
//# sourceMappingURL=json-serde.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-serde.d.ts","sourceRoot":"","sources":["../../../src/shared/codec/json-serde.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,kBAQxB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JSON_SERDE = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A minimal JSON serializer implementing LangGraph's {@link SerializerProtocol},
|
|
6
|
+
* used by adapters (the store, history) that persist plain JSON values through
|
|
7
|
+
* the shared payload codec.
|
|
8
|
+
*/
|
|
9
|
+
exports.JSON_SERDE = {
|
|
10
|
+
async dumpsTyped(value) {
|
|
11
|
+
return ['json', new TextEncoder().encode(JSON.stringify(value))];
|
|
12
|
+
},
|
|
13
|
+
async loadsTyped(_type, data) {
|
|
14
|
+
const text = typeof data === 'string' ? data : new TextDecoder().decode(data);
|
|
15
|
+
return JSON.parse(text);
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=json-serde.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-serde.js","sourceRoot":"","sources":["../../../src/shared/codec/json-serde.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACU,QAAA,UAAU,GAAuB;IAC5C,KAAK,CAAC,UAAU,CAAC,KAAK;QACpB,OAAO,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI;QAC1B,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { S3Client, S3ClientConfig } from '@aws-sdk/client-s3';
|
|
2
|
+
/** Lazily import the optional `@aws-sdk/client-s3` peer, caching the module. */
|
|
3
|
+
export declare function loadS3Sdk(): Promise<typeof import('@aws-sdk/client-s3')>;
|
|
4
|
+
/** Construct an `S3Client` from `config` using the lazily-loaded SDK. */
|
|
5
|
+
export declare function createDefaultS3Client(config: S3ClientConfig): Promise<S3Client>;
|
|
6
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/shared/codec/s3/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAInE,gFAAgF;AAChF,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,oBAAoB,CAAC,CAAC,CAK9E;AAED,yEAAyE;AACzE,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGrF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadS3Sdk = loadS3Sdk;
|
|
4
|
+
exports.createDefaultS3Client = createDefaultS3Client;
|
|
5
|
+
let sdkPromise;
|
|
6
|
+
/** Lazily import the optional `@aws-sdk/client-s3` peer, caching the module. */
|
|
7
|
+
async function loadS3Sdk() {
|
|
8
|
+
if (!sdkPromise) {
|
|
9
|
+
sdkPromise = import('@aws-sdk/client-s3');
|
|
10
|
+
}
|
|
11
|
+
return sdkPromise;
|
|
12
|
+
}
|
|
13
|
+
/** Construct an `S3Client` from `config` using the lazily-loaded SDK. */
|
|
14
|
+
async function createDefaultS3Client(config) {
|
|
15
|
+
const { S3Client: S3ClientCtor } = await loadS3Sdk();
|
|
16
|
+
return new S3ClientCtor(config);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/client.ts"],"names":[],"mappings":";;AAKA,8BAKC;AAGD,sDAGC;AAdD,IAAI,UAAoE,CAAC;AAEzE,gFAAgF;AACzE,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,yEAAyE;AAClE,KAAK,UAAU,qBAAqB,CAAC,MAAsB;IAChE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;IACrD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { S3Client, S3ClientConfig } from '@aws-sdk/client-s3';
|
|
2
|
+
/** Configuration for offloading large payloads to S3. */
|
|
3
|
+
export interface S3OffloadConfig {
|
|
4
|
+
bucketName: string;
|
|
5
|
+
keyPrefix?: string;
|
|
6
|
+
thresholdBytes?: number;
|
|
7
|
+
serverSideEncryption?: string;
|
|
8
|
+
sseKmsKeyId?: string;
|
|
9
|
+
clientConfig?: S3ClientConfig;
|
|
10
|
+
createS3Client?: (config: S3ClientConfig) => S3Client;
|
|
11
|
+
}
|
|
12
|
+
/** Build a fully-qualified S3 key: `${prefix}${parts.join('/')}.bin`. */
|
|
13
|
+
export declare function buildS3Key(prefix: string, parts: readonly string[]): string;
|
|
14
|
+
/** Build a deterministic, TTL-independent lifecycle rule id from the prefix. */
|
|
15
|
+
export declare function buildLifecycleRuleId(prefix: string): string;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/shared/codec/s3/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnE,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,QAAQ,CAAC;CACvD;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE3E;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG3D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildS3Key = buildS3Key;
|
|
4
|
+
exports.buildLifecycleRuleId = buildLifecycleRuleId;
|
|
5
|
+
/** Build a fully-qualified S3 key: `${prefix}${parts.join('/')}.bin`. */
|
|
6
|
+
function buildS3Key(prefix, parts) {
|
|
7
|
+
return `${prefix}${parts.join('/')}.bin`;
|
|
8
|
+
}
|
|
9
|
+
/** Build a deterministic, TTL-independent lifecycle rule id from the prefix. */
|
|
10
|
+
function buildLifecycleRuleId(prefix) {
|
|
11
|
+
const slug = prefix.replace(/\/+$/, '').replace(/[^a-zA-Z0-9-]/g, '-') || 'default';
|
|
12
|
+
return `langgraph-ttl-${slug}`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/config.ts"],"names":[],"mappings":";;AAcA,gCAEC;AAGD,oDAGC;AATD,yEAAyE;AACzE,SAAgB,UAAU,CAAC,MAAc,EAAE,KAAwB;IACjE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,SAAgB,oBAAoB,CAAC,MAAc;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;IACpF,OAAO,iBAAiB,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { S3Client } from '@aws-sdk/client-s3';
|
|
2
|
+
/**
|
|
3
|
+
* Delete `keys` from `bucket` in chunks of 1000 (the DeleteObjects limit).
|
|
4
|
+
* Returns the keys S3 reported as failed — never throws on per-key errors so
|
|
5
|
+
* callers (orphan cleanup) can decide how loudly to react.
|
|
6
|
+
*/
|
|
7
|
+
export declare function deleteObjects(client: S3Client, bucket: string, keys: string[]): Promise<string[]>;
|
|
8
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/shared/codec/s3/delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKnD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deleteObjects = deleteObjects;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
const client_1 = require("./client");
|
|
6
|
+
/**
|
|
7
|
+
* Delete `keys` from `bucket` in chunks of 1000 (the DeleteObjects limit).
|
|
8
|
+
* Returns the keys S3 reported as failed — never throws on per-key errors so
|
|
9
|
+
* callers (orphan cleanup) can decide how loudly to react.
|
|
10
|
+
*/
|
|
11
|
+
async function deleteObjects(client, bucket, keys) {
|
|
12
|
+
if (keys.length === 0)
|
|
13
|
+
return [];
|
|
14
|
+
const { DeleteObjectsCommand } = await (0, client_1.loadS3Sdk)();
|
|
15
|
+
const failed = [];
|
|
16
|
+
for (let offset = 0; offset < keys.length; offset += constants_1.S3_DELETE_BATCH_MAX) {
|
|
17
|
+
const chunk = keys.slice(offset, offset + constants_1.S3_DELETE_BATCH_MAX);
|
|
18
|
+
const response = await client.send(new DeleteObjectsCommand({
|
|
19
|
+
Bucket: bucket,
|
|
20
|
+
Delete: { Objects: chunk.map((key) => ({ Key: key })), Quiet: true },
|
|
21
|
+
}));
|
|
22
|
+
for (const error of response.Errors ?? []) {
|
|
23
|
+
if (error.Key)
|
|
24
|
+
failed.push(error.Key);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return failed;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/delete.ts"],"names":[],"mappings":";;AAUA,sCAqBC;AA7BD,+CAAsD;AACtD,qCAAqC;AAErC;;;;GAIG;AACI,KAAK,UAAU,aAAa,CACjC,MAAgB,EAChB,MAAc,EACd,IAAc;IAEd,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,IAAA,kBAAS,GAAE,CAAC;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,+BAAmB,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,+BAAmB,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,IAAI,oBAAoB,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;SACrE,CAAC,CACH,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { S3Client } from '@aws-sdk/client-s3';
|
|
2
|
+
/**
|
|
3
|
+
* Idempotently ensure a `${ttlDays}`-day expiration lifecycle rule exists for
|
|
4
|
+
* `prefix`. Reads existing rules, preserves user-defined ones, and only
|
|
5
|
+
* adds/updates the library's prefix-scoped rule.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureLifecycleRule(client: S3Client, bucket: string, prefix: string, ttlDays: number): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/shared/codec/s3/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAsBlE;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureLifecycleRule = ensureLifecycleRule;
|
|
4
|
+
const client_1 = require("./client");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
async function readRules(client, bucket) {
|
|
7
|
+
const { GetBucketLifecycleConfigurationCommand } = await (0, client_1.loadS3Sdk)();
|
|
8
|
+
try {
|
|
9
|
+
const existing = await client.send(new GetBucketLifecycleConfigurationCommand({ Bucket: bucket }));
|
|
10
|
+
return existing.Rules ?? [];
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error.name === 'NoSuchLifecycleConfiguration')
|
|
14
|
+
return [];
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function alreadyCorrect(rule, ttlDays) {
|
|
19
|
+
return rule?.Status === 'Enabled' && rule.Expiration?.Days === ttlDays;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Idempotently ensure a `${ttlDays}`-day expiration lifecycle rule exists for
|
|
23
|
+
* `prefix`. Reads existing rules, preserves user-defined ones, and only
|
|
24
|
+
* adds/updates the library's prefix-scoped rule.
|
|
25
|
+
*/
|
|
26
|
+
async function ensureLifecycleRule(client, bucket, prefix, ttlDays) {
|
|
27
|
+
const ruleId = (0, config_1.buildLifecycleRuleId)(prefix);
|
|
28
|
+
const rules = await readRules(client, bucket);
|
|
29
|
+
const existing = rules.find((rule) => rule.ID === ruleId);
|
|
30
|
+
if (alreadyCorrect(existing, ttlDays))
|
|
31
|
+
return;
|
|
32
|
+
const newRule = {
|
|
33
|
+
ID: ruleId,
|
|
34
|
+
Filter: { Prefix: prefix },
|
|
35
|
+
Status: 'Enabled',
|
|
36
|
+
Expiration: { Days: ttlDays },
|
|
37
|
+
};
|
|
38
|
+
const merged = existing
|
|
39
|
+
? rules.map((rule) => (rule.ID === ruleId ? newRule : rule))
|
|
40
|
+
: [...rules, newRule];
|
|
41
|
+
const { PutBucketLifecycleConfigurationCommand } = await (0, client_1.loadS3Sdk)();
|
|
42
|
+
await client.send(new PutBucketLifecycleConfigurationCommand({
|
|
43
|
+
Bucket: bucket,
|
|
44
|
+
LifecycleConfiguration: { Rules: merged },
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/lifecycle.ts"],"names":[],"mappings":";;AA2BA,kDA0BC;AAnDD,qCAAqC;AACrC,qCAAgD;AAEhD,KAAK,UAAU,SAAS,CAAC,MAAgB,EAAE,MAAc;IACvD,MAAM,EAAE,sCAAsC,EAAE,GAAG,MAAM,IAAA,kBAAS,GAAE,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,IAAI,sCAAsC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAC/D,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA2B,CAAC,IAAI,KAAK,8BAA8B;YAAE,OAAO,EAAE,CAAC;QACpF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAA+B,EAAE,OAAe;IACtE,OAAO,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,KAAK,OAAO,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAgB,EAChB,MAAc,EACd,MAAc,EACd,OAAe;IAEf,MAAM,MAAM,GAAG,IAAA,6BAAoB,EAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC1D,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAE,OAAO;IAC9C,MAAM,OAAO,GAAkB;QAC7B,EAAE,EAAE,MAAM;QACV,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;QAC1B,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC9B,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,sCAAsC,EAAE,GAAG,MAAM,IAAA,kBAAS,GAAE,CAAC;IACrE,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,sCAAsC,CAAC;QACzC,MAAM,EAAE,MAAM;QACd,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;KAC1C,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { S3OffloadConfig } from './config';
|
|
2
|
+
/**
|
|
3
|
+
* Thin holder composing the pure S3 functions. Owns config + the lazily-built
|
|
4
|
+
* S3 client and delegates all real work; every method is a small delegation.
|
|
5
|
+
*/
|
|
6
|
+
export declare class S3Offloader {
|
|
7
|
+
private client;
|
|
8
|
+
private readonly bucketName;
|
|
9
|
+
private readonly keyPrefix;
|
|
10
|
+
private readonly thresholdBytes;
|
|
11
|
+
private readonly sse;
|
|
12
|
+
private readonly sseKmsKeyId?;
|
|
13
|
+
private readonly config;
|
|
14
|
+
constructor(config: S3OffloadConfig);
|
|
15
|
+
private getClient;
|
|
16
|
+
/** True when `data` is large enough to warrant S3 offload. */
|
|
17
|
+
shouldOffload(data: Uint8Array): boolean;
|
|
18
|
+
/** Build the S3 key for the given key parts. */
|
|
19
|
+
buildKey(parts: readonly string[]): string;
|
|
20
|
+
/** The configured key prefix. */
|
|
21
|
+
getKeyPrefix(): string;
|
|
22
|
+
/** Upload `data` under `key`, returning the key. */
|
|
23
|
+
upload(key: string, data: Uint8Array): Promise<string>;
|
|
24
|
+
/** Download the bytes stored under `key`. */
|
|
25
|
+
download(key: string): Promise<Uint8Array>;
|
|
26
|
+
/** Delete `keys`, returning the keys S3 reported as failed. */
|
|
27
|
+
deleteBatch(keys: string[]): Promise<string[]>;
|
|
28
|
+
/** Ensure a `${ttlDays}`-day expiration lifecycle rule exists for the prefix. */
|
|
29
|
+
ensureLifecycleRule(ttlDays: number): Promise<void>;
|
|
30
|
+
/** Release the underlying S3 client, if one was created. */
|
|
31
|
+
destroy(): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=offloader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offloader.d.ts","sourceRoot":"","sources":["../../../../src/shared/codec/s3/offloader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,eAAe,EAAE,MAAM,UAAU,CAAC;AAKvD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,eAAe;YASrB,SAAS;IAUvB,8DAA8D;IAC9D,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAIxC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;IAI1C,iCAAiC;IACjC,YAAY,IAAI,MAAM;IAItB,oDAAoD;IAC9C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D,6CAA6C;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIhD,+DAA+D;IACzD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpD,iFAAiF;IAC3E,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,4DAA4D;IAC5D,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3Offloader = void 0;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
const client_1 = require("./client");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
const delete_1 = require("./delete");
|
|
8
|
+
const lifecycle_1 = require("./lifecycle");
|
|
9
|
+
const read_write_1 = require("./read-write");
|
|
10
|
+
/**
|
|
11
|
+
* Thin holder composing the pure S3 functions. Owns config + the lazily-built
|
|
12
|
+
* S3 client and delegates all real work; every method is a small delegation.
|
|
13
|
+
*/
|
|
14
|
+
class S3Offloader {
|
|
15
|
+
client;
|
|
16
|
+
bucketName;
|
|
17
|
+
keyPrefix;
|
|
18
|
+
thresholdBytes;
|
|
19
|
+
sse;
|
|
20
|
+
sseKmsKeyId;
|
|
21
|
+
config;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.bucketName = config.bucketName;
|
|
25
|
+
this.keyPrefix = config.keyPrefix ?? constants_1.DEFAULT_S3_KEY_PREFIX;
|
|
26
|
+
this.thresholdBytes = config.thresholdBytes ?? constants_1.DEFAULT_S3_THRESHOLD_BYTES;
|
|
27
|
+
this.sse = config.serverSideEncryption ?? constants_1.DEFAULT_S3_SSE;
|
|
28
|
+
this.sseKmsKeyId = config.sseKmsKeyId;
|
|
29
|
+
}
|
|
30
|
+
async getClient() {
|
|
31
|
+
if (!this.client) {
|
|
32
|
+
const cfg = this.config.clientConfig ?? {};
|
|
33
|
+
this.client = this.config.createS3Client
|
|
34
|
+
? this.config.createS3Client(cfg)
|
|
35
|
+
: await (0, client_1.createDefaultS3Client)(cfg);
|
|
36
|
+
}
|
|
37
|
+
return this.client;
|
|
38
|
+
}
|
|
39
|
+
/** True when `data` is large enough to warrant S3 offload. */
|
|
40
|
+
shouldOffload(data) {
|
|
41
|
+
return data.length >= this.thresholdBytes;
|
|
42
|
+
}
|
|
43
|
+
/** Build the S3 key for the given key parts. */
|
|
44
|
+
buildKey(parts) {
|
|
45
|
+
return (0, config_1.buildS3Key)(this.keyPrefix, parts);
|
|
46
|
+
}
|
|
47
|
+
/** The configured key prefix. */
|
|
48
|
+
getKeyPrefix() {
|
|
49
|
+
return this.keyPrefix;
|
|
50
|
+
}
|
|
51
|
+
/** Upload `data` under `key`, returning the key. */
|
|
52
|
+
async upload(key, data) {
|
|
53
|
+
await (0, read_write_1.uploadObject)(await this.getClient(), {
|
|
54
|
+
bucket: this.bucketName,
|
|
55
|
+
key,
|
|
56
|
+
data,
|
|
57
|
+
serverSideEncryption: this.sse,
|
|
58
|
+
sseKmsKeyId: this.sseKmsKeyId,
|
|
59
|
+
});
|
|
60
|
+
return key;
|
|
61
|
+
}
|
|
62
|
+
/** Download the bytes stored under `key`. */
|
|
63
|
+
async download(key) {
|
|
64
|
+
return (0, read_write_1.downloadObject)(await this.getClient(), this.bucketName, key);
|
|
65
|
+
}
|
|
66
|
+
/** Delete `keys`, returning the keys S3 reported as failed. */
|
|
67
|
+
async deleteBatch(keys) {
|
|
68
|
+
return (0, delete_1.deleteObjects)(await this.getClient(), this.bucketName, keys);
|
|
69
|
+
}
|
|
70
|
+
/** Ensure a `${ttlDays}`-day expiration lifecycle rule exists for the prefix. */
|
|
71
|
+
async ensureLifecycleRule(ttlDays) {
|
|
72
|
+
return (0, lifecycle_1.ensureLifecycleRule)(await this.getClient(), this.bucketName, this.keyPrefix, ttlDays);
|
|
73
|
+
}
|
|
74
|
+
/** Release the underlying S3 client, if one was created. */
|
|
75
|
+
destroy() {
|
|
76
|
+
this.client?.destroy();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.S3Offloader = S3Offloader;
|
|
80
|
+
//# sourceMappingURL=offloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offloader.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/offloader.ts"],"names":[],"mappings":";;;AAEA,+CAAoG;AACpG,qCAAiD;AACjD,qCAAuD;AACvD,qCAAyC;AACzC,2CAAkD;AAClD,6CAA4D;AAE5D;;;GAGG;AACH,MAAa,WAAW;IACd,MAAM,CAAuB;IACpB,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,cAAc,CAAS;IACvB,GAAG,CAAS;IACZ,WAAW,CAAU;IACrB,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,iCAAqB,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,sCAA0B,CAAC;QAC1E,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,oBAAoB,IAAI,0BAAc,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;gBACtC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;gBACjC,CAAC,CAAC,MAAM,IAAA,8BAAqB,EAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,8DAA8D;IAC9D,aAAa,CAAC,IAAgB;QAC5B,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC;IAC5C,CAAC;IAED,gDAAgD;IAChD,QAAQ,CAAC,KAAwB;QAC/B,OAAO,IAAA,mBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,iCAAiC;IACjC,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,IAAgB;QACxC,MAAM,IAAA,yBAAY,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,UAAU;YACvB,GAAG;YACH,IAAI;YACJ,oBAAoB,EAAE,IAAI,CAAC,GAAG;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAA,2BAAc,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,OAAO,IAAA,sBAAa,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,mBAAmB,CAAC,OAAe;QACvC,OAAO,IAAA,+BAAmB,EAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/F,CAAC;IAED,4DAA4D;IAC5D,OAAO;QACL,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IACzB,CAAC;CACF;AA1ED,kCA0EC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from '../../logging/logger';
|
|
2
|
+
import type { S3Offloader } from './offloader';
|
|
3
|
+
/** Options for {@link cleanUpS3Orphans}. */
|
|
4
|
+
export interface OrphanCleanupOptions {
|
|
5
|
+
rng?: () => number;
|
|
6
|
+
maxAttempts?: number;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Best-effort delete of S3 objects orphaned by a failed DynamoDB write. Retries
|
|
11
|
+
* transient errors with full-jitter backoff; on persistent failure or when S3
|
|
12
|
+
* reports keys it could not delete, it logs at `warn` (the lifecycle rule is the
|
|
13
|
+
* backstop) and never throws — the sole non-throwing path in the library.
|
|
14
|
+
*/
|
|
15
|
+
export declare function cleanUpS3Orphans(offloader: S3Offloader, keys: ReadonlyArray<string | undefined>, context: string, logger: Logger, options?: OrphanCleanupOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=orphans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../../../../src/shared/codec/s3/orphans.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA6B/C,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAgBD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,WAAW,EACtB,IAAI,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,EACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cleanUpS3Orphans = cleanUpS3Orphans;
|
|
4
|
+
const backoff_1 = require("../../dynamodb/backoff");
|
|
5
|
+
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
6
|
+
const BASE_DELAY_MS = 100;
|
|
7
|
+
const RETRYABLE_S3_SIGNALS = [
|
|
8
|
+
'SlowDown',
|
|
9
|
+
'InternalError',
|
|
10
|
+
'ServiceUnavailable',
|
|
11
|
+
'RequestTimeout',
|
|
12
|
+
'ThrottlingException',
|
|
13
|
+
'ECONNRESET',
|
|
14
|
+
'ETIMEDOUT',
|
|
15
|
+
'NetworkingError',
|
|
16
|
+
];
|
|
17
|
+
function isTransientS3Error(error) {
|
|
18
|
+
const fields = error;
|
|
19
|
+
const status = fields.$metadata?.httpStatusCode;
|
|
20
|
+
if (typeof status === 'number' && (status === 429 || (status >= 500 && status < 600)))
|
|
21
|
+
return true;
|
|
22
|
+
const signals = [fields.name, fields.code].filter((value) => typeof value === 'string');
|
|
23
|
+
return signals.some((signal) => RETRYABLE_S3_SIGNALS.some((retryable) => signal.includes(retryable)));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wait out one backoff window, cancellable via `options.signal`. Resolves `true`
|
|
27
|
+
* when the signal aborts the wait (so the caller stops retrying) and `false`
|
|
28
|
+
* otherwise — never rejects, preserving the best-effort, non-throwing contract.
|
|
29
|
+
*/
|
|
30
|
+
async function backoffSleep(delayMs, options) {
|
|
31
|
+
try {
|
|
32
|
+
await (0, backoff_1.sleep)((0, backoff_1.fullJitter)(delayMs, options.rng), options.signal);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Best-effort delete of S3 objects orphaned by a failed DynamoDB write. Retries
|
|
41
|
+
* transient errors with full-jitter backoff; on persistent failure or when S3
|
|
42
|
+
* reports keys it could not delete, it logs at `warn` (the lifecycle rule is the
|
|
43
|
+
* backstop) and never throws — the sole non-throwing path in the library.
|
|
44
|
+
*/
|
|
45
|
+
async function cleanUpS3Orphans(offloader, keys, context, logger, options = {}) {
|
|
46
|
+
const orphans = keys.filter((key) => typeof key === 'string' && key.length > 0);
|
|
47
|
+
if (orphans.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
50
|
+
let delay = BASE_DELAY_MS;
|
|
51
|
+
let lastError = new Error('S3 orphan cleanup did not run');
|
|
52
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
53
|
+
try {
|
|
54
|
+
const failed = await offloader.deleteBatch(orphans);
|
|
55
|
+
if (failed.length === 0)
|
|
56
|
+
return;
|
|
57
|
+
logger.warn(`Some orphaned S3 objects could not be deleted after ${context}; lifecycle rule will sweep`, { failedCount: failed.length });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
lastError = error;
|
|
62
|
+
if (attempt >= maxAttempts || !isTransientS3Error(lastError))
|
|
63
|
+
break;
|
|
64
|
+
if (await backoffSleep(delay, options))
|
|
65
|
+
break;
|
|
66
|
+
delay = (0, backoff_1.nextBackoffDelay)(delay);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
logger.warn(`Failed to clean up orphaned S3 objects after ${context}; lifecycle rule will sweep`, {
|
|
70
|
+
message: lastError.message,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=orphans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphans.js","sourceRoot":"","sources":["../../../../src/shared/codec/s3/orphans.ts"],"names":[],"mappings":";;AA0DA,4CAkCC;AA5FD,oDAA6E;AAI7E,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,MAAM,oBAAoB,GAAsB;IAC9C,UAAU;IACV,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,YAAY;IACZ,WAAW;IACX,iBAAiB;CAClB,CAAC;AAEF,SAAS,kBAAkB,CAAC,KAAY;IACtC,MAAM,MAAM,GAAG,KAAkF,CAAC;IAClG,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC;IAChD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAC/C,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CACtD,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7B,oBAAoB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CACrE,CAAC;AACJ,CAAC;AASD;;;;GAIG;AACH,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,OAA6B;IACxE,IAAI,CAAC;QACH,MAAM,IAAA,eAAK,EAAC,IAAA,oBAAU,EAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CACpC,SAAsB,EACtB,IAAuC,EACvC,OAAe,EACf,MAAc,EACd,UAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAChE,IAAI,KAAK,GAAG,aAAa,CAAC;IAC1B,IAAI,SAAS,GAAG,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAChC,MAAM,CAAC,IAAI,CACT,uDAAuD,OAAO,6BAA6B,EAC3F,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAC/B,CAAC;YACF,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAc,CAAC;YAC3B,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;gBAAE,MAAM;YACpE,IAAI,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,MAAM;YAC9C,KAAK,GAAG,IAAA,0BAAgB,EAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CACT,gDAAgD,OAAO,6BAA6B,EACpF;QACE,OAAO,EAAE,SAAS,CAAC,OAAO;KAC3B,CACF,CAAC;AACJ,CAAC"}
|