@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,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hides the bucket lifecycle configuration this package maintains.
|
|
3
|
+
*
|
|
4
|
+
* Two rules per prefix — one expiring objects a day after the ttl plus the
|
|
5
|
+
* sweep margin and keeping a released payload's noncurrent version for a
|
|
6
|
+
* grace window, one reclaiming expired delete markers — are written beside
|
|
7
|
+
* whatever else the read that built the write showed, rewritten only when
|
|
8
|
+
* they differ. A lifecycle GET carries no version, so a later read can show
|
|
9
|
+
* less than an earlier one; a rule that read does not show — this package's
|
|
10
|
+
* own included — is dropped by the write built from it. This is followed by
|
|
11
|
+
* a report of whether the bucket keeps versions at all.
|
|
12
|
+
*/
|
|
13
|
+
import type { LifecycleRule, S3Client } from '@aws-sdk/client-s3';
|
|
14
|
+
import type { Logger } from '../../logging/logger.js';
|
|
15
|
+
/**
|
|
16
|
+
* Days a released payload's noncurrent version survives behind its delete
|
|
17
|
+
* marker before S3 reclaims it. One day is the smallest the lifecycle API
|
|
18
|
+
* accepts and it rounds up to the next UTC midnight, so the window is 24-48 h:
|
|
19
|
+
* long enough to restore a payload released in error, short enough that a
|
|
20
|
+
* versioned bucket does not pay for every release it has ever made. It is a
|
|
21
|
+
* floor and never a cap — a longer retention the bucket already carries is
|
|
22
|
+
* kept, because this package has no business shortening someone else's
|
|
23
|
+
* recovery window. Inert on an unversioned bucket, which has no noncurrent
|
|
24
|
+
* versions to expire.
|
|
25
|
+
*/
|
|
26
|
+
export declare const S3_RELEASE_GRACE_DAYS = 1;
|
|
27
|
+
/** The rules to ensure: on which bucket, for which prefix, expiring after how many days. */
|
|
28
|
+
export interface LifecycleTarget {
|
|
29
|
+
readonly bucket: string;
|
|
30
|
+
readonly prefix: string;
|
|
31
|
+
readonly days: number;
|
|
32
|
+
}
|
|
33
|
+
/** Rounds {@link ensureLifecycleRule} polls before it reports a writer it cannot outlast. */
|
|
34
|
+
export declare const LIFECYCLE_SETTLE_WRITES = 5;
|
|
35
|
+
/** How {@link ensureLifecycleRule} waits between re-reads; a test passes one that takes no time. */
|
|
36
|
+
export interface LifecyclePace {
|
|
37
|
+
wait?: (delayMs: number) => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Ensure the two rules scoped to `target.prefix` exist on `target.bucket`: a
|
|
41
|
+
* `target.days`-day expiration for current versions, and the reclaim that
|
|
42
|
+
* removes the delete marker a released payload leaves behind.
|
|
43
|
+
*
|
|
44
|
+
* Accepts: `target.prefix` — re-checked for scoping here, because these rules
|
|
45
|
+
* are the one place an unscoped prefix would destroy data outside this
|
|
46
|
+
* library's. `target.days` — the current-version expiry only. Released
|
|
47
|
+
* versions are governed by the release grace instead (see {@link ttlRule}),
|
|
48
|
+
* which is a floor measured against every rule already governing these keys.
|
|
49
|
+
* Both are inert on an unversioned bucket, which keeps no noncurrent version
|
|
50
|
+
* and leaves no marker. `pace.wait` — how to wait between re-reads; the
|
|
51
|
+
* default sleeps.
|
|
52
|
+
*
|
|
53
|
+
* Returns: nothing. Idempotent: when both rules already say this, no write is
|
|
54
|
+
* issued. Otherwise it writes them, waits, and re-reads. A bucket's
|
|
55
|
+
* configuration is served eventually consistently rather than
|
|
56
|
+
* read-your-writes
|
|
57
|
+
* (https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html, "Amazon
|
|
58
|
+
* S3 data consistency model": "Bucket configurations have an eventual
|
|
59
|
+
* consistency model"), and S3 documents specifically that a lifecycle
|
|
60
|
+
* configuration can take a few minutes to fully propagate
|
|
61
|
+
* (https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html,
|
|
62
|
+
* "Lifecycle configuration propagation delay"). So a re-read that still shows
|
|
63
|
+
* the same rules — by id and the fields this comparison examines — as the
|
|
64
|
+
* read behind this call's last write is treated as that lag, not as loss, and
|
|
65
|
+
* prompts another wait rather than another write; a re-read that instead
|
|
66
|
+
* shows some *other* configuration, still without this call's rules, is a
|
|
67
|
+
* competing writer, and the rules are written again, merged with whatever
|
|
68
|
+
* that read now holds. The waits (1, 2, 4, 8 s) and the five-round limit are
|
|
69
|
+
* this library's own polling policy — a choice, not a bound AWS documents.
|
|
70
|
+
* `CONTENTION` is reserved for a writer this call never once found the bucket
|
|
71
|
+
* at rest for: it fires only when every one of the five rounds needs a
|
|
72
|
+
* write, meaning no re-read this call took ever agreed with the one before
|
|
73
|
+
* it. A last round that writes without reaching that count, or that finds
|
|
74
|
+
* only lag, ends the same way instead — a `warn` and a normal return: the
|
|
75
|
+
* rules were written, only their visibility could not be confirmed here, and
|
|
76
|
+
* a later call (or the same one, run again after a few minutes) can still
|
|
77
|
+
* find them settled. The bucket's versioning state is reported on every exit
|
|
78
|
+
* the loop itself chooses — settled, lag, a late rival, or `CONTENTION` —
|
|
79
|
+
* because the containment a released payload depends on is missing or
|
|
80
|
+
* present regardless of how this call ended. A read or write failure, or a
|
|
81
|
+
* `VALIDATION` `planRules` raises from a re-read, propagates directly instead
|
|
82
|
+
* and skips it, the same as it would skip any other cleanup this never got
|
|
83
|
+
* to.
|
|
84
|
+
*
|
|
85
|
+
* Throws: `VALIDATION` naming `s3.keyPrefix` for an unscoped prefix, or when
|
|
86
|
+
* either rule id this prefix produces is already held by a different prefix
|
|
87
|
+
* (see {@link assertNoIdCollision}); `CONTENTION` when every one of the five
|
|
88
|
+
* rounds this call polls needs a write — a competing writer replacing the
|
|
89
|
+
* configuration on every single re-read, never once leaving it long enough
|
|
90
|
+
* for lag alone to explain what this call sees; otherwise whatever the SDK
|
|
91
|
+
* rejects with. A bucket with no lifecycle configuration at all is not an
|
|
92
|
+
* error — S3 reports `NoSuchLifecycleConfiguration` and this starts from an
|
|
93
|
+
* empty rule set.
|
|
94
|
+
*
|
|
95
|
+
* Guarantees: a write carries forward whatever its own read showed — every
|
|
96
|
+
* rule this package did not add or replace, and the bucket-level
|
|
97
|
+
* `TransitionDefaultMinimumObjectSize` — because a Put replaces the whole
|
|
98
|
+
* configuration and dropping either would silently reset the bucket. That
|
|
99
|
+
* guarantee is only as good as the read, though: a lifecycle GET carries no
|
|
100
|
+
* version, so a later read can show less than an earlier one, and a rule —
|
|
101
|
+
* this package's own included — that a write's own read does not show is
|
|
102
|
+
* dropped by that write, whether or not it is genuinely still on the bucket.
|
|
103
|
+
* Building each write from a read taken right before it, rather than from a
|
|
104
|
+
* plan an earlier wait left stale, narrows this without closing it: a rule a
|
|
105
|
+
* competing writer added is carried forward when this call's own next
|
|
106
|
+
* re-read happens to show it, and lost when a still staler one does not.
|
|
107
|
+
* None of this reaches a *different* call's own first read either: run
|
|
108
|
+
* provisioning calls one at a time, and when more than one adapter or
|
|
109
|
+
* process shares a bucket, re-run each after a few minutes once every one of
|
|
110
|
+
* them has run.
|
|
111
|
+
*/
|
|
112
|
+
export declare function ensureLifecycleRule(client: S3Client, target: LifecycleTarget, logger: Logger, pace?: LifecyclePace): Promise<void>;
|
|
113
|
+
/** The rule to build: its id, its prefix, and the days after which current versions expire. */
|
|
114
|
+
interface RuleTarget {
|
|
115
|
+
readonly id: string;
|
|
116
|
+
readonly prefix: string;
|
|
117
|
+
readonly days: number;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The rule that expires current versions on the TTL's schedule and released
|
|
121
|
+
* ones on the grace.
|
|
122
|
+
*
|
|
123
|
+
* Accepts: `rules` — everything the bucket holds, which is what the grace is
|
|
124
|
+
* measured against. `existing` — the rule this one replaces, if any.
|
|
125
|
+
*
|
|
126
|
+
* Returns: the rule to write. Every field of `existing` this package does not
|
|
127
|
+
* manage is carried through, because the rewrite a changed TTL triggers is
|
|
128
|
+
* otherwise unrecoverable: the next call reads the rewritten rule as already
|
|
129
|
+
* correct and never restores what it dropped.
|
|
130
|
+
*
|
|
131
|
+
* Throws: nothing.
|
|
132
|
+
*
|
|
133
|
+
* Guarantees: the `Expiration` is replaced rather than merged. Merging this
|
|
134
|
+
* package's `Days` into a `Date` an operator set would change the expiry they
|
|
135
|
+
* configured, whatever the service made of the pair.
|
|
136
|
+
*/
|
|
137
|
+
export declare function ttlRule(rule: RuleTarget, rules: readonly LifecycleRule[], existing?: LifecycleRule): LifecycleRule;
|
|
138
|
+
/**
|
|
139
|
+
* The rule that reclaims the delete marker a release leaves, once its last
|
|
140
|
+
* noncurrent version has expired.
|
|
141
|
+
*
|
|
142
|
+
* Accepts: `existing` — the rule this one replaces, if any.
|
|
143
|
+
*
|
|
144
|
+
* Returns: the rule to write, a second one rather than a field on the TTL
|
|
145
|
+
* rule: S3 refuses `ExpiredObjectDeleteMarker` inside an `Expiration` that
|
|
146
|
+
* also carries `Days`, so each rule's `Expiration` holds its own half and
|
|
147
|
+
* nothing of the other's. Fields this package does not manage are carried
|
|
148
|
+
* through as they are on the TTL rule — this id is one this package invented,
|
|
149
|
+
* but that is no reason to drop what an operator has since put on it.
|
|
150
|
+
*
|
|
151
|
+
* Throws: nothing.
|
|
152
|
+
*/
|
|
153
|
+
export declare function markerRule(id: string, prefix: string, existing?: LifecycleRule): LifecycleRule;
|
|
154
|
+
/**
|
|
155
|
+
* Refuse to touch a rule that carries one of this prefix's ids but scopes a
|
|
156
|
+
* different prefix. Three shapes reach here: slugging maps every
|
|
157
|
+
* non-alphanumeric character to `-`, so `app/langgraph/` and `app-langgraph/`
|
|
158
|
+
* produce one id; the marker rule appends `-markers`, so `app/`'s marker id is
|
|
159
|
+
* the expiration id of `app-markers/`; and a rule written in the older schema
|
|
160
|
+
* holds an id this package would take while naming its scope in the top-level
|
|
161
|
+
* `Prefix`.
|
|
162
|
+
*
|
|
163
|
+
* Accepts: `rule` — the rule holding `id`, or nothing. `prefix` — the one this
|
|
164
|
+
* call scopes rules to.
|
|
165
|
+
*
|
|
166
|
+
* Returns: nothing: `rule` is kept under its declared type, and this checks
|
|
167
|
+
* it. A rule naming no scope anywhere is taken over, and so is one already
|
|
168
|
+
* scoping this prefix — including in the older schema, which is then upgraded
|
|
169
|
+
* to a filter.
|
|
170
|
+
*
|
|
171
|
+
* Throws: `VALIDATION` naming `s3.keyPrefix`. The id and the scope are
|
|
172
|
+
* both bounded by {@link truncateForLog}: the scope is whatever the bucket's
|
|
173
|
+
* lifecycle configuration holds, and the id is composed from an
|
|
174
|
+
* `s3.keyPrefix` checked for shape and never for length.
|
|
175
|
+
*
|
|
176
|
+
* Guarantees: the scope is read wherever the rule names it, through the same
|
|
177
|
+
* {@link scopeOf} the floor uses. Reading only `Filter.Prefix` would let a
|
|
178
|
+
* rule in the older schema through, and the rewrite would then replace its
|
|
179
|
+
* scope with this one's — so the objects that rule governs would silently
|
|
180
|
+
* lose their expiration, and a bucket-wide rule would narrow to this prefix.
|
|
181
|
+
*/
|
|
182
|
+
export declare function assertNoIdCollision(rule: LifecycleRule | undefined, prefix: string, id: string): void;
|
|
183
|
+
/**
|
|
184
|
+
* Whether the rule the bucket carries already says what would be written.
|
|
185
|
+
*
|
|
186
|
+
* Accepts: `existing` — the held rule, or nothing. `desired` — what a write
|
|
187
|
+
* would put there.
|
|
188
|
+
*
|
|
189
|
+
* Returns: whether a write can be skipped. A rule in the older schema never
|
|
190
|
+
* matches, because it names its prefix somewhere this does not read, so it is
|
|
191
|
+
* rewritten once into a filter and matches from then on.
|
|
192
|
+
*
|
|
193
|
+
* Throws: nothing.
|
|
194
|
+
*/
|
|
195
|
+
export declare function alreadyCorrect(existing: LifecycleRule | undefined, desired: LifecycleRule): boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Report whether `bucket` keeps versions, which is the whole of the recovery
|
|
198
|
+
* window behind a released payload.
|
|
199
|
+
*
|
|
200
|
+
* Accepts: `bucket` — the offload bucket. `logger` — the adapter's; silent by
|
|
201
|
+
* default, like every other event this package emits.
|
|
202
|
+
*
|
|
203
|
+
* Returns: nothing. A versioned bucket is silent; the other two states warn
|
|
204
|
+
* and name their own remedy, because those remedies differ — a bucket that
|
|
205
|
+
* never had versioning needs it enabled, while a suspended one needs it
|
|
206
|
+
* re-enabled *and* an accounting of what suspension has already destroyed.
|
|
207
|
+
*
|
|
208
|
+
* Throws: nothing, deliberately. A failure of the call itself is a `warn` too,
|
|
209
|
+
* including the `AccessDenied` of a role that provisioned lifecycle rules
|
|
210
|
+
* yesterday without this action: a permission the call did not need then must
|
|
211
|
+
* not break it now. This runs after the rules are written for the same reason
|
|
212
|
+
* — a bucket that cannot answer still gets them.
|
|
213
|
+
*
|
|
214
|
+
* Guarantees: a bucket that has never been versioned answers with an empty
|
|
215
|
+
* body, so the absent state is `Status === undefined`. It is never the string
|
|
216
|
+
* `'Disabled'`, which this API does not return, and testing for one would read
|
|
217
|
+
* an unversioned bucket as a versioned one.
|
|
218
|
+
*/
|
|
219
|
+
export declare function reportBucketVersioning(client: S3Client, bucket: string, logger: Logger): Promise<void>;
|
|
220
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { sleep } from '../../dynamodb/retry.js';
|
|
2
|
+
import { DynamoDBLangGraphError } from '../../errors/base-error.js';
|
|
3
|
+
import { isMissingLifecycleConfiguration } from '../../errors/classify.js';
|
|
4
|
+
import { ErrorCode } from '../../errors/error-code.js';
|
|
5
|
+
import { validationError } from '../../errors/errors.js';
|
|
6
|
+
import { truncateForLog } from '../../logging/truncate.js';
|
|
7
|
+
import { loadS3Sdk } from './client.js';
|
|
8
|
+
import { assertScopedKeyPrefix, buildLifecycleRuleId, buildMarkerRuleId } from './config.js';
|
|
9
|
+
export const S3_RELEASE_GRACE_DAYS = 1;
|
|
10
|
+
async function readState(client, bucket) {
|
|
11
|
+
const { GetBucketLifecycleConfigurationCommand } = await loadS3Sdk();
|
|
12
|
+
try {
|
|
13
|
+
const existing = await client.send(new GetBucketLifecycleConfigurationCommand({ Bucket: bucket }));
|
|
14
|
+
return {
|
|
15
|
+
rules: existing.Rules ?? [],
|
|
16
|
+
transitionDefaultMinimumObjectSize: existing.TransitionDefaultMinimumObjectSize,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (isMissingLifecycleConfiguration(error))
|
|
21
|
+
return { rules: [] };
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function upsert(rules, rule) {
|
|
26
|
+
return rules.some((held) => held.ID === rule.ID)
|
|
27
|
+
? rules.map((held) => (held.ID === rule.ID ? rule : held))
|
|
28
|
+
: [...rules, rule];
|
|
29
|
+
}
|
|
30
|
+
async function putRules(client, bucket, state, rules) {
|
|
31
|
+
const { PutBucketLifecycleConfigurationCommand } = await loadS3Sdk();
|
|
32
|
+
await client.send(new PutBucketLifecycleConfigurationCommand({
|
|
33
|
+
Bucket: bucket,
|
|
34
|
+
LifecycleConfiguration: { Rules: rules },
|
|
35
|
+
...(state.transitionDefaultMinimumObjectSize === undefined
|
|
36
|
+
? {}
|
|
37
|
+
: { TransitionDefaultMinimumObjectSize: state.transitionDefaultMinimumObjectSize }),
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
export const LIFECYCLE_SETTLE_WRITES = 5;
|
|
41
|
+
const LIFECYCLE_SETTLE_BASE_MS = 1_000;
|
|
42
|
+
function planRules(state, target, ids) {
|
|
43
|
+
const heldTtl = state.rules.find((rule) => rule.ID === ids.ttl);
|
|
44
|
+
const heldMarker = state.rules.find((rule) => rule.ID === ids.marker);
|
|
45
|
+
assertNoIdCollision(heldTtl, target.prefix, ids.ttl);
|
|
46
|
+
assertNoIdCollision(heldMarker, target.prefix, ids.marker);
|
|
47
|
+
const expiry = ttlRule({ id: ids.ttl, prefix: target.prefix, days: target.days }, state.rules, heldTtl);
|
|
48
|
+
const reclaim = markerRule(ids.marker, target.prefix, heldMarker);
|
|
49
|
+
return {
|
|
50
|
+
settled: alreadyCorrect(heldTtl, expiry) && alreadyCorrect(heldMarker, reclaim),
|
|
51
|
+
rules: upsert(upsert(state.rules, expiry), reclaim),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function delayForAttempt(attempt) {
|
|
55
|
+
return LIFECYCLE_SETTLE_BASE_MS * 2 ** (attempt - 1);
|
|
56
|
+
}
|
|
57
|
+
function ruleFingerprint(rule) {
|
|
58
|
+
return JSON.stringify([
|
|
59
|
+
rule.ID,
|
|
60
|
+
rule.Status,
|
|
61
|
+
scopeOf(rule),
|
|
62
|
+
rule.Expiration?.Days,
|
|
63
|
+
rule.Expiration?.ExpiredObjectDeleteMarker,
|
|
64
|
+
rule.Expiration?.Date,
|
|
65
|
+
rule.NoncurrentVersionExpiration?.NoncurrentDays,
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
function sameRuleSet(a, b) {
|
|
69
|
+
const fingerprint = (rules) => rules.map(ruleFingerprint).sort().join('\n');
|
|
70
|
+
return fingerprint(a) === fingerprint(b);
|
|
71
|
+
}
|
|
72
|
+
function lifecycleContention(target) {
|
|
73
|
+
return new DynamoDBLangGraphError(`the lifecycle configuration of bucket ${truncateForLog(target.bucket)} kept losing the ` +
|
|
74
|
+
`rules for ${truncateForLog(target.prefix)} to a different configuration: every one of ` +
|
|
75
|
+
`the ${LIFECYCLE_SETTLE_WRITES} rounds this call polls needed a write, another writer ` +
|
|
76
|
+
'replacing it on every re-read; run ensureS3LifecycleRule again once that writer has ' +
|
|
77
|
+
'finished', ErrorCode.CONTENTION, {});
|
|
78
|
+
}
|
|
79
|
+
function warnLifecyclePending(target, logger) {
|
|
80
|
+
logger.warn('ensureS3LifecycleRule: wrote the lifecycle rules but a re-read did not show them within the ' +
|
|
81
|
+
'polling window; S3 documents that propagation can take a few minutes, so this is most ' +
|
|
82
|
+
'likely lag rather than a lost write — call ensureS3LifecycleRule() again later to confirm', { bucket: truncateForLog(target.bucket), prefix: truncateForLog(target.prefix) });
|
|
83
|
+
}
|
|
84
|
+
export async function ensureLifecycleRule(client, target, logger, pace = {}) {
|
|
85
|
+
assertScopedKeyPrefix(target.prefix);
|
|
86
|
+
const ids = {
|
|
87
|
+
ttl: buildLifecycleRuleId(target.prefix),
|
|
88
|
+
marker: buildMarkerRuleId(target.prefix),
|
|
89
|
+
};
|
|
90
|
+
const wait = pace.wait ?? ((delayMs) => sleep(delayMs));
|
|
91
|
+
let before = [];
|
|
92
|
+
let writes = 0;
|
|
93
|
+
let contended = false;
|
|
94
|
+
for (let attempt = 0;; attempt += 1) {
|
|
95
|
+
if (attempt > 0)
|
|
96
|
+
await wait(delayForAttempt(attempt));
|
|
97
|
+
const state = await readState(client, target.bucket);
|
|
98
|
+
const plan = planRules(state, target, ids);
|
|
99
|
+
if (plan.settled)
|
|
100
|
+
break;
|
|
101
|
+
const lastAttempt = attempt === LIFECYCLE_SETTLE_WRITES - 1;
|
|
102
|
+
if (attempt > 0 && sameRuleSet(state.rules, before)) {
|
|
103
|
+
if (lastAttempt) {
|
|
104
|
+
warnLifecyclePending(target, logger);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
logger.debug('ensureS3LifecycleRule: a re-read still shows what was there before this write; ' +
|
|
108
|
+
'waiting for it to propagate', { attempt, waitedMs: delayForAttempt(attempt) });
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (attempt > 0) {
|
|
112
|
+
logger.debug('ensureS3LifecycleRule: a re-read shows a different configuration without these ' +
|
|
113
|
+
'rules; writing them again', { attempt, waitedMs: delayForAttempt(attempt) });
|
|
114
|
+
}
|
|
115
|
+
await putRules(client, target.bucket, state, plan.rules);
|
|
116
|
+
writes += 1;
|
|
117
|
+
before = state.rules;
|
|
118
|
+
if (lastAttempt) {
|
|
119
|
+
if (writes === LIFECYCLE_SETTLE_WRITES)
|
|
120
|
+
contended = true;
|
|
121
|
+
else
|
|
122
|
+
warnLifecyclePending(target, logger);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
await reportBucketVersioning(client, target.bucket, logger);
|
|
127
|
+
if (contended)
|
|
128
|
+
throw lifecycleContention(target);
|
|
129
|
+
}
|
|
130
|
+
function scopeOf(rule) {
|
|
131
|
+
return rule.Filter?.Prefix ?? rule.Filter?.And?.Prefix ?? rule.Prefix;
|
|
132
|
+
}
|
|
133
|
+
function governs(rule, prefix) {
|
|
134
|
+
const scope = scopeOf(rule);
|
|
135
|
+
return rule.Status === 'Enabled' && (scope === undefined || prefix.startsWith(scope));
|
|
136
|
+
}
|
|
137
|
+
function noncurrentDays(rules, prefix, existing) {
|
|
138
|
+
const held = rules
|
|
139
|
+
.filter((rule) => governs(rule, prefix))
|
|
140
|
+
.map((rule) => rule.NoncurrentVersionExpiration?.NoncurrentDays ?? 0);
|
|
141
|
+
return Math.max(...held, existing?.NoncurrentVersionExpiration?.NoncurrentDays ?? 0, S3_RELEASE_GRACE_DAYS);
|
|
142
|
+
}
|
|
143
|
+
function carried(existing) {
|
|
144
|
+
const kept = { ...existing };
|
|
145
|
+
delete kept.Prefix;
|
|
146
|
+
return kept;
|
|
147
|
+
}
|
|
148
|
+
export function ttlRule(rule, rules, existing) {
|
|
149
|
+
return {
|
|
150
|
+
...carried(existing),
|
|
151
|
+
ID: rule.id,
|
|
152
|
+
Filter: { Prefix: rule.prefix },
|
|
153
|
+
Status: 'Enabled',
|
|
154
|
+
Expiration: { Days: rule.days },
|
|
155
|
+
NoncurrentVersionExpiration: {
|
|
156
|
+
...existing?.NoncurrentVersionExpiration,
|
|
157
|
+
NoncurrentDays: noncurrentDays(rules, rule.prefix, existing),
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export function markerRule(id, prefix, existing) {
|
|
162
|
+
return {
|
|
163
|
+
...carried(existing),
|
|
164
|
+
ID: id,
|
|
165
|
+
Filter: { Prefix: prefix },
|
|
166
|
+
Status: 'Enabled',
|
|
167
|
+
Expiration: { ExpiredObjectDeleteMarker: true },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
export function assertNoIdCollision(rule, prefix, id) {
|
|
171
|
+
if (rule === undefined)
|
|
172
|
+
return;
|
|
173
|
+
const found = scopeOf(rule);
|
|
174
|
+
if (found === undefined || found === prefix)
|
|
175
|
+
return;
|
|
176
|
+
throw validationError(`the S3 lifecycle rule id "${truncateForLog(id)}" is already used by the prefix ` +
|
|
177
|
+
`"${truncateForLog(found)}"; an id is the key ` +
|
|
178
|
+
'prefix with every non-alphanumeric character replaced by "-", and the marker rule appends ' +
|
|
179
|
+
'"-markers" to that, so "a/b/" takes the id of "a-b/" and "app/" takes the marker id of ' +
|
|
180
|
+
'"app-markers/" — choose an s3.keyPrefix that produces neither id of any other prefix on ' +
|
|
181
|
+
'this bucket', 's3.keyPrefix');
|
|
182
|
+
}
|
|
183
|
+
function managedShape(rule) {
|
|
184
|
+
return JSON.stringify([
|
|
185
|
+
rule?.Status,
|
|
186
|
+
rule?.Filter?.Prefix,
|
|
187
|
+
rule?.Expiration?.Days,
|
|
188
|
+
rule?.Expiration?.ExpiredObjectDeleteMarker,
|
|
189
|
+
rule?.NoncurrentVersionExpiration?.NoncurrentDays,
|
|
190
|
+
]);
|
|
191
|
+
}
|
|
192
|
+
export function alreadyCorrect(existing, desired) {
|
|
193
|
+
return managedShape(existing) === managedShape(desired);
|
|
194
|
+
}
|
|
195
|
+
export async function reportBucketVersioning(client, bucket, logger) {
|
|
196
|
+
const { GetBucketVersioningCommand } = await loadS3Sdk();
|
|
197
|
+
const named = truncateForLog(bucket);
|
|
198
|
+
let status;
|
|
199
|
+
try {
|
|
200
|
+
status = (await client.send(new GetBucketVersioningCommand({ Bucket: bucket }))).Status;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
const reason = truncateForLog(error?.name ?? 'unknown');
|
|
204
|
+
logger.warn('ensureS3LifecycleRule: could not read the offload bucket versioning state, so whether a released payload is recoverable is unknown; the lifecycle rules were written, and the role needs s3:GetBucketVersioning', { bucket: named, reason });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (status === 'Enabled')
|
|
208
|
+
return;
|
|
209
|
+
if (status === undefined) {
|
|
210
|
+
logger.warn('ensureS3LifecycleRule: versioning is off on the offload bucket, so releasing a payload deletes it outright with no recovery window; enable bucket versioning to gain one', { bucket: named });
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
logger.warn('ensureS3LifecycleRule: versioning is suspended on the offload bucket, so releasing a payload deletes it outright; re-enable versioning, and note that the payloads released while it was suspended are already gone', { bucket: named });
|
|
214
|
+
}
|