@lostgradient/weft 0.23.0 → 0.24.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 +72 -4
- package/dist/cli/codegen-emit-dedup.d.ts +81 -0
- package/dist/cli/codegen-emit-dedup.js +45 -0
- package/dist/cli/codegen-emit-registry.d.ts +90 -0
- package/dist/cli/codegen-emit-registry.js +50 -0
- package/dist/cli/codegen-emit.d.ts +26 -39
- package/dist/cli/codegen-emit.js +4 -27
- package/dist/cli/codegen-validate.d.ts +49 -0
- package/dist/cli/codegen-validate.js +186 -0
- package/dist/cli/codegen.js +6 -87
- package/dist/cli/generated/operation-catalog.snapshot.json +287 -3
- package/dist/cli/generated/operation-client.generated.d.ts +324 -10
- package/dist/cli/generated/operation-client.generated.js +12 -0
- package/dist/cli/output.js +1 -1
- package/dist/cli/storage-factory.js +2 -0
- package/dist/cli/workflow-commands.js +2 -0
- package/dist/cli-main.js +1 -1
- package/dist/core/application-payload-digest.d.ts +42 -0
- package/dist/core/application-payload-digest.js +76 -0
- package/dist/core/application-primitive-abort.d.ts +50 -0
- package/dist/core/application-primitive-abort.js +40 -0
- package/dist/core/application-primitive-attempt-registry.d.ts +74 -0
- package/dist/core/application-primitive-attempt-registry.js +73 -0
- package/dist/core/application-primitive-codec.d.ts +36 -0
- package/dist/core/application-primitive-codec.js +56 -0
- package/dist/core/application-primitive-commit.d.ts +67 -0
- package/dist/core/application-primitive-commit.js +66 -0
- package/dist/core/application-primitive-guards.d.ts +62 -0
- package/dist/core/application-primitive-guards.js +89 -0
- package/dist/core/application-primitive-payload.d.ts +29 -0
- package/dist/core/application-primitive-payload.js +65 -0
- package/dist/core/application-primitive-timing.d.ts +18 -0
- package/dist/core/application-primitive-timing.js +22 -0
- package/dist/core/atomic-state.js +2 -0
- package/dist/core/catalog/codec.d.ts +40 -0
- package/dist/core/catalog/codec.js +45 -0
- package/dist/core/catalog/errors.d.ts +104 -0
- package/dist/core/catalog/errors.js +41 -0
- package/dist/core/catalog/index.d.ts +25 -0
- package/dist/core/catalog/index.js +15 -0
- package/dist/core/catalog/reference-counts.d.ts +105 -0
- package/dist/core/catalog/reference-counts.js +28 -0
- package/dist/core/catalog/removal.d.ts +52 -0
- package/dist/core/catalog/removal.js +14 -0
- package/dist/core/catalog/storage-io.d.ts +78 -0
- package/dist/core/catalog/storage-io.js +106 -0
- package/dist/core/catalog/types.d.ts +108 -0
- package/dist/core/catalog/types.js +0 -0
- package/dist/core/catalog/workflow-catalog.d.ts +165 -0
- package/dist/core/catalog/workflow-catalog.js +198 -0
- package/dist/core/compare-codepoint.d.ts +13 -0
- package/dist/core/compare-codepoint.js +7 -0
- package/dist/core/compression.js +2 -0
- package/dist/core/context/attributes.d.ts +1 -1
- package/dist/core/context/durable-operations.d.ts +2 -2
- package/dist/core/context/index.js +5 -3
- package/dist/core/context/state-namespace.d.ts +1 -1
- package/dist/core/contract/build.d.ts +64 -0
- package/dist/core/contract/build.js +99 -0
- package/dist/core/contract/compatibility.d.ts +187 -0
- package/dist/core/contract/compatibility.js +37 -0
- package/dist/core/contract/failure.d.ts +64 -0
- package/dist/core/contract/failure.js +4 -0
- package/dist/core/contract/hash.d.ts +92 -0
- package/dist/core/contract/hash.js +34 -0
- package/dist/core/contract/index.d.ts +21 -0
- package/dist/core/contract/index.js +22 -0
- package/dist/core/contract/limits.d.ts +74 -0
- package/dist/core/contract/limits.js +1 -0
- package/dist/core/contract/manifest-parse-schema.d.ts +37 -0
- package/dist/core/contract/manifest-parse-schema.js +106 -0
- package/dist/core/contract/manifest-parse.d.ts +76 -0
- package/dist/core/contract/manifest-parse.js +189 -0
- package/dist/core/contract/manifest.d.ts +56 -0
- package/dist/core/contract/manifest.js +31 -0
- package/dist/core/contract/normalize.d.ts +97 -0
- package/dist/core/contract/normalize.js +127 -0
- package/dist/core/contract/revision.d.ts +29 -0
- package/dist/core/contract/revision.js +5 -0
- package/dist/core/contract/types.d.ts +274 -0
- package/dist/core/contract/types.js +1 -0
- package/dist/core/engine/catalog-activation.d.ts +40 -0
- package/dist/core/engine/catalog-activation.js +17 -0
- package/dist/core/engine/catalog-events.d.ts +36 -0
- package/dist/core/engine/catalog-events.js +15 -0
- package/dist/core/engine/catalog-readiness.d.ts +49 -0
- package/dist/core/engine/catalog-readiness.js +59 -0
- package/dist/core/engine/catalog-removal.d.ts +132 -0
- package/dist/core/engine/catalog-removal.js +70 -0
- package/dist/core/engine/construction.d.ts +1 -1
- package/dist/core/engine/construction.js +4 -2
- package/dist/core/engine/disposal.js +9 -0
- package/dist/core/engine/engine-workflows-namespace.d.ts +130 -0
- package/dist/core/engine/engine-workflows-namespace.js +49 -0
- package/dist/core/engine/finalizer-metadata.d.ts +22 -0
- package/dist/core/engine/finalizer-metadata.js +12 -0
- package/dist/core/engine/handle-result.js +2 -0
- package/dist/core/engine/index.d.ts +83 -0
- package/dist/core/engine/index.js +61 -0
- package/dist/core/engine/internals.d.ts +44 -1
- package/dist/core/engine/internals.js +6 -0
- package/dist/core/engine/lifecycle/start.js +3 -0
- package/dist/core/engine/registration.d.ts +76 -0
- package/dist/core/engine/registration.js +12 -6
- package/dist/core/engine/source-registration.d.ts +42 -0
- package/dist/core/engine/source-registration.js +36 -0
- package/dist/core/engine/source-resolution.d.ts +85 -0
- package/dist/core/engine/source-resolution.js +119 -0
- package/dist/core/engine/validation.js +2 -2
- package/dist/core/events/catalog-events.d.ts +117 -0
- package/dist/core/events/catalog-events.js +62 -0
- package/dist/core/events/event-map.d.ts +6 -0
- package/dist/core/events/index.d.ts +1 -0
- package/dist/core/events/index.js +1 -0
- package/dist/core/mailbox-admission.d.ts +26 -0
- package/dist/core/mailbox-admission.js +130 -0
- package/dist/core/mailbox-claims.d.ts +251 -0
- package/dist/core/mailbox-claims.js +0 -0
- package/dist/core/mailbox-codec.d.ts +32 -0
- package/dist/core/mailbox-codec.js +221 -0
- package/dist/core/mailbox-contract.d.ts +290 -0
- package/dist/core/mailbox-contract.js +0 -0
- package/dist/core/mailbox-delivery.d.ts +37 -0
- package/dist/core/mailbox-delivery.js +193 -0
- package/dist/core/mailbox-guards.d.ts +78 -0
- package/dist/core/mailbox-guards.js +58 -0
- package/dist/core/mailbox-index-codec.d.ts +41 -0
- package/dist/core/mailbox-index-codec.js +71 -0
- package/dist/core/mailbox-internals.d.ts +156 -0
- package/dist/core/mailbox-internals.js +154 -0
- package/dist/core/mailbox-maintenance.d.ts +29 -0
- package/dist/core/mailbox-maintenance.js +196 -0
- package/dist/core/mailbox-settlement.d.ts +69 -0
- package/dist/core/mailbox-settlement.js +206 -0
- package/dist/core/mailbox-storage.d.ts +117 -0
- package/dist/core/mailbox-storage.js +115 -0
- package/dist/core/mailbox-transition-helpers.d.ts +70 -0
- package/dist/core/mailbox-transition-helpers.js +43 -0
- package/dist/core/mailbox-transitions-recovery.d.ts +28 -0
- package/dist/core/mailbox-transitions-recovery.js +64 -0
- package/dist/core/mailbox-transitions.d.ts +138 -0
- package/dist/core/mailbox-transitions.js +180 -0
- package/dist/core/mailbox-types.d.ts +406 -0
- package/dist/core/mailbox-types.js +16 -0
- package/dist/core/mailbox-validation.d.ts +65 -0
- package/dist/core/mailbox-validation.js +73 -0
- package/dist/core/mailbox-waits.d.ts +50 -0
- package/dist/core/mailbox-waits.js +97 -0
- package/dist/core/mailbox.d.ts +163 -0
- package/dist/core/mailbox.js +211 -0
- package/dist/core/outbox-claims.d.ts +307 -0
- package/dist/core/outbox-claims.js +0 -0
- package/dist/core/outbox-codec.d.ts +24 -0
- package/dist/core/outbox-codec.js +257 -0
- package/dist/core/outbox-contract.d.ts +346 -0
- package/dist/core/outbox-contract.js +0 -0
- package/dist/core/outbox-delivery.d.ts +34 -0
- package/dist/core/outbox-delivery.js +149 -0
- package/dist/core/outbox-drain.d.ts +29 -0
- package/dist/core/outbox-drain.js +158 -0
- package/dist/core/outbox-enqueue.d.ts +24 -0
- package/dist/core/outbox-enqueue.js +115 -0
- package/dist/core/outbox-guards.d.ts +76 -0
- package/dist/core/outbox-guards.js +60 -0
- package/dist/core/outbox-index-codec.d.ts +33 -0
- package/dist/core/outbox-index-codec.js +71 -0
- package/dist/core/outbox-internals.d.ts +99 -0
- package/dist/core/outbox-internals.js +159 -0
- package/dist/core/outbox-listing.d.ts +12 -0
- package/dist/core/outbox-listing.js +38 -0
- package/dist/core/outbox-maintenance.d.ts +28 -0
- package/dist/core/outbox-maintenance.js +191 -0
- package/dist/core/outbox-operations.d.ts +18 -0
- package/dist/core/outbox-operations.js +46 -0
- package/dist/core/outbox-runner.d.ts +30 -0
- package/dist/core/outbox-runner.js +217 -0
- package/dist/core/outbox-settlement.d.ts +57 -0
- package/dist/core/outbox-settlement.js +183 -0
- package/dist/core/outbox-storage.d.ts +107 -0
- package/dist/core/outbox-storage.js +127 -0
- package/dist/core/outbox-transition-helpers.d.ts +83 -0
- package/dist/core/outbox-transition-helpers.js +63 -0
- package/dist/core/outbox-transitions-recovery.d.ts +30 -0
- package/dist/core/outbox-transitions-recovery.js +42 -0
- package/dist/core/outbox-transitions.d.ts +145 -0
- package/dist/core/outbox-transitions.js +236 -0
- package/dist/core/outbox-types.d.ts +400 -0
- package/dist/core/outbox-types.js +20 -0
- package/dist/core/outbox-validation.d.ts +101 -0
- package/dist/core/outbox-validation.js +127 -0
- package/dist/core/outbox-waits.d.ts +39 -0
- package/dist/core/outbox-waits.js +88 -0
- package/dist/core/outbox.d.ts +156 -0
- package/dist/core/outbox.js +234 -0
- package/dist/core/registry-limits.d.ts +49 -0
- package/dist/core/registry-limits.js +10 -0
- package/dist/core/registry-schema-conversion.d.ts +20 -0
- package/dist/core/registry-schema-conversion.js +22 -0
- package/dist/core/registry-snapshot.d.ts +91 -42
- package/dist/core/registry-snapshot.js +39 -77
- package/dist/core/registry-workflow-contract-draft.d.ts +32 -0
- package/dist/core/registry-workflow-contract-draft.js +28 -0
- package/dist/core/registry-workflow-manifest.d.ts +122 -0
- package/dist/core/registry-workflow-manifest.js +92 -0
- package/dist/core/source/errors.d.ts +55 -0
- package/dist/core/source/errors.js +13 -0
- package/dist/core/source/index.d.ts +19 -0
- package/dist/core/source/index.js +4 -0
- package/dist/core/source/resolvers.d.ts +45 -0
- package/dist/core/source/resolvers.js +9 -0
- package/dist/core/source/types.d.ts +211 -0
- package/dist/core/source/types.js +0 -0
- package/dist/core/source/validate.d.ts +91 -0
- package/dist/core/source/validate.js +62 -0
- package/dist/core/source/workflow-source.d.ts +43 -0
- package/dist/core/source/workflow-source.js +16 -0
- package/dist/core/types/workflow-registries.d.ts +7 -0
- package/dist/core/types/workflow-registry.d.ts +12 -0
- package/dist/core/versioning.js +2 -0
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +9 -1
- package/dist/http.js +2 -2
- package/dist/index.d.ts +23 -2
- package/dist/index.js +50 -0
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +3 -3
- package/dist/mcp/resources.js +2 -0
- package/dist/runtime/portable.d.ts +9 -1
- package/dist/server/fault-to-json-rpc.js +3 -1
- package/dist/server/handler/auth-context-principal.js +4 -0
- package/dist/server/json-rpc-http.js +2 -0
- package/dist/server/json-rpc-websocket.js +6 -4
- package/dist/server/operation-catalog/index.d.ts +1 -1
- package/dist/server/operation-catalog/pipeline-helpers.js +2 -0
- package/dist/server/operation-catalog/types.d.ts +17 -0
- package/dist/server/operation-fault.d.ts +3 -0
- package/dist/server/operation-fault.js +3 -1
- package/dist/server/operations/activate-workflow-revision.d.ts +30 -0
- package/dist/server/operations/activate-workflow-revision.js +69 -0
- package/dist/server/operations/fleet-events-subscription.js +1 -1
- package/dist/server/operations/fork-workflow.js +1 -1
- package/dist/server/operations/get-active-workflow-revision.d.ts +32 -0
- package/dist/server/operations/get-active-workflow-revision.js +46 -0
- package/dist/server/operations/get-catalog-diagnostics.d.ts +85 -0
- package/dist/server/operations/get-catalog-diagnostics.js +57 -0
- package/dist/server/operations/get-registry.js +17 -4
- package/dist/server/operations/get-workflow-revision.d.ts +25 -0
- package/dist/server/operations/get-workflow-revision.js +50 -0
- package/dist/server/operations/install-workflow-revision.d.ts +27 -0
- package/dist/server/operations/install-workflow-revision.js +46 -0
- package/dist/server/operations/list-workflow-revisions.d.ts +20 -0
- package/dist/server/operations/list-workflow-revisions.js +40 -0
- package/dist/server/operations/start-or-signal-workflow.js +1 -1
- package/dist/server/operations/start-workflow.js +1 -1
- package/dist/server/operations/static-registrations.js +36 -0
- package/dist/server/operations/storage.js +2 -2
- package/dist/server/operations/submit-review-decision.js +1 -1
- package/dist/server/operations/workflow-catalog-operation-helpers.d.ts +59 -0
- package/dist/server/operations/workflow-catalog-operation-helpers.js +135 -0
- package/dist/server/runtime/websocket-upgrade.js +2 -0
- package/dist/storage/bun-sql.js +49 -6
- package/dist/storage/catalog-keys.d.ts +45 -0
- package/dist/storage/catalog-keys.js +6 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/derived-operations.js +1 -1
- package/dist/storage/index.d.ts +26 -1
- package/dist/storage/interface.d.ts +26 -1
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-encoding.d.ts +15 -0
- package/dist/storage/key-encoding.js +3 -0
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +15 -0
- package/dist/storage/lmdb.d.ts +26 -1
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/mailbox-keys.d.ts +80 -0
- package/dist/storage/mailbox-keys.js +14 -0
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +2 -2
- package/dist/storage/node-sqlite-loader.d.ts +1 -1
- package/dist/storage/node-sqlite-loader.js +2 -2
- package/dist/storage/node-sqlite.js +51 -8
- package/dist/storage/outbox-keys.d.ts +77 -0
- package/dist/storage/outbox-keys.js +14 -0
- package/dist/storage/postgres.js +2 -2
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/storage-configuration.d.ts +6 -0
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/manifest/registry-contract-builder.d.ts +21 -3
- package/dist/worker/manifest/registry-contract-builder.js +40 -31
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var K=import.meta.require;function c(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function D(e){let t=e.capabilities(),r=[];if(t.persistence!=="local"&&t.persistence!=="remote")r.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")r.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")r.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)r.push("atomicBatch must be true");if(!t.conditionalBatch)r.push("conditionalBatch must be true");if(r.length>0)throw Error(`Storage is not durable enough for recovery: ${r.join("; ")}.`)}var d="default";async function m(e,t){return await e.get(t)!==null}async function*a(e,t,r){for await(let[i]of e.scan(t,r))yield i}async function y(e,t){let r=0;for await(let i of a(e,t))r++;return r}async function b(e,t){let r=[];for await(let i of a(e,t))r.push({type:"delete",key:i});if(r.length===0)return 0;return await e.batch(r),r.length}async function w(e,t,r){let i=[];for await(let l of a(e,t,r))i.push({type:"delete",key:l});if(i.length===0)return 0;return await e.batch(i),i.length}function n(e){return encodeURIComponent(e)}function E(e){return decodeURIComponent(e)}function A(e){try{return decodeURIComponent(e)}catch{return null}}var S={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var I=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var u=1e4,J=1e4;class v extends Error{code="StorageBatchOperationLimitExceededError";cap=u;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${u}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function s(e,t){if(t>u)throw new v(e,t)}function Z(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function ee(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function te(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function k(e,t){if(e.has)return e.has(t);return m(e,t)}function R(e,t,r){if(e.keys)return e.keys(t,r);return a(e,t,r)}async function O(e,t){if(e.count)return e.count(t);return y(e,t)}async function C(e,t){if(e.deletePrefix)return e.deletePrefix(t);return b(e,t)}async function ne(e,t){s("batch operations",t.length),await e.batch(t)}async function P(e,t,r){if(s("conditionalBatch conditions",t.length),s("conditionalBatch operations",r.length),c(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,r)}var o=(e)=>String(e).padStart(16,"0"),_="0",T="1",x=(e,t,r,i)=>`sig:${n(e)}:${n(t)}:${i}:${n(r)}`,re={workflow:(e)=>`wf:${n(e)}`,checkpoint:(e)=>`wf:${n(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${n(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${n(e)}:timeline:`,timeline:(e,t)=>`wf:${n(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${n(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${n(t)}`,scheduleRun:(e)=>`schedule-run:${n(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${n(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${n(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${n(e)}:${n(t)}`,operation:(e,t,r)=>`op:${e}:${o(t)}:${r}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,r)=>`audit:bulk:${o(e)}:${n(t)}:${n(r)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${o(e)}:${n(t)}`,asyncActivity:(e,t)=>`async-act:v1:${n(e)}:${n(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${n(e)}:${n(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${n(e)}:`,activityReconciliation:(e,t,r)=>`actrec:v1:${n(e)}:${n(t)}:${r}`,eventPrefix:(e)=>`ev:${n(e)}:`,event:(e,t)=>`ev:${n(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${n(e)}:head`,eventWatermark:(e)=>`ev:${n(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${n(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${n(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,r)=>x(e,t,r,T),startSignal:(e,t,r)=>x(e,t,r,_),signalSequence:(e)=>`sigseq:v1:${n(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${n(e)}:`,signalAcceptedResponse:(e,t,r)=>`sigres:v1:${n(e)}:${n(t)}:${n(r)}`,deadline:(e,t)=>`wf-deadline:${o(e)}:${n(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${o(e)}:${n(t)}`,teardownTimer:(e,t)=>`wf-teardown:${o(e)}:${n(t)}`,delayedStart:(e,t)=>`wf-delayed:${o(e)}:${n(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${o(e)}:${n(t)}`,attribute:(e)=>`attr:${n(e)}`,attributeIndex:(e,t,r)=>`idx:${e}:${t}:${n(r)}`,tagIndex:(e,t)=>`tag:${n(e)}:${n(t)}`,updatePrefix:(e)=>`upd:${n(e)}:`,update:(e,t)=>`upd:${n(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${n(e)}:${t}`,startIdempotency:(e)=>`start-idem:${n(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${n(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...S,budget:(e,t,r)=>`budget:${e}:${t}:${r}`,review:(e,t)=>`review:${n(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${n(e)}`,childCancellationPrefix:(e)=>`child-cancel:${n(e)}:`,childCancellation:(e,t)=>`child-cancel:${n(e)}:${n(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}`,childWorkflowByParent:(e,t,r)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}${n(r)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${n(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${n(e)}:${n(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${n(e)}`,workflowHasServices:(e)=>`wf-has-services:${n(e)}`,finalizerState:(e)=>`wf-finalizer-state:${n(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${n(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${n(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${n(e)}`,offload:(e,t)=>`offload:${n(e)}:${t}`,archive:(e,t)=>`archive:${n(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${n(e)}:${n(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${d}:${n(e)}:${n(t)}`,streamChunkPrefix:(e,t)=>`blob:${n(e)}:${t}:chunk:`,streamChunk:(e,t,r)=>`blob:${n(e)}:${t}:chunk:${String(r).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${n(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${n(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,r)=>`tool-effect:${n(e)}:${t}:${r}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${n(e)}:${n(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${n(e)}:${n(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${o(e)}:${n(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${o(e)}:${n(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${o(e)}:${n(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${n(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function L(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},r=!1;for(let l of["gt","gte","lt","lte"]){let g=e[l];if(g===void 0)continue;if(typeof g!=="string")throw Error("deleteRange bounds must be strings");t[l]=g,r=!0}if(!r)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=L(e.limit);if(i!==void 0)t.limit=i;return t}async function B(e,t,r){let i=f(r);if(e.deleteRange)return e.deleteRange(t,i);return w(e,t,i)}function p(e){return e.replaceAll(/:+$/g,"")}function z(e,t){let r=p(e),i=p(t);if(r.length===0)return i;if(i.length===0)return r;return`${r}:${i}`}class h{#t;#n;constructor(e,t){this.#t=e,this.#n=p(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#i(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#o(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#a(e={}){let t=this.#o(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#s(e){return this.#o(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new h(this.#t,z(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[r,i]of this.#t.scan(this.#e(e),this.#a(t)))yield[this.#i(r),i]}async batch(e){s("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return P(this.#t,e.map((r)=>({key:this.#e(r.key),expectedValue:r.expectedValue})),this.#r(t))}async has(e){return k(this.#t,this.#e(e))}async deletePrefix(e){return C(this.#t,this.#e(e))}async deleteRange(e,t){let r=this.#s(f(t));return B(this.#t,this.#e(e),r)}async*keys(e,t){for await(let r of R(this.#t,this.#e(e),this.#a(t)))yield this.#i(r)}async count(e){return O(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function fe(e,t){return new h(e,t)}export{h as ScopedStorage,fe as scopedStorage};
|
|
2
|
+
var M=import.meta.require;function p(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function I(e){let t=e.capabilities(),r=[];if(t.persistence!=="local"&&t.persistence!=="remote")r.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")r.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")r.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)r.push("atomicBatch must be true");if(!t.conditionalBatch)r.push("conditionalBatch must be true");if(r.length>0)throw Error(`Storage is not durable enough for recovery: ${r.join("; ")}.`)}function n(e){return encodeURIComponent(e)}function _(e){return decodeURIComponent(e)}function K(e){try{return decodeURIComponent(e)}catch{return null}}function o(e){return String(e).padStart(16,"0")}var h={catalogEntry:(e,t)=>`catalog-entry:${n(e)}:${n(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${n(e)}:`,catalogActive:(e)=>`catalog-active:${n(e)}`};var d="default";async function b(e,t){return await e.get(t)!==null}async function*s(e,t,r){for await(let[i]of e.scan(t,r))yield i}async function w(e,t){let r=0;for await(let i of s(e,t))r++;return r}async function S(e,t){let r=[];for await(let i of s(e,t))r.push({type:"delete",key:i});if(r.length===0)return 0;return await e.batch(r),r.length}async function v(e,t,r){let i=[];for await(let g of s(e,t,r))i.push({type:"delete",key:g});if(i.length===0)return 0;return await e.batch(i),i.length}var x={applicationMailbox:(e,t)=>`appmbx:v1:${n(e)}:${n(t)}`,applicationMailboxSinkProbe:(e,t,r)=>`appprobe:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${n(e)}:${n(t)}:`,applicationCommand:(e,t,r)=>`appcmd:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${n(e)}:${n(t)}:`,applicationCommandReady:(e,t,r)=>`appready:v1:${n(e)}:${n(t)}:${o(r)}`,applicationCommandIdempotency:(e,t,r)=>`appidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${n(e)}:${n(t)}:`,applicationCommandBySequence:(e,t,r)=>`appseq:v1:${n(e)}:${n(t)}:${o(r)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${n(e)}:${n(t)}:`,applicationCommandTerminal:(e,t,r,i)=>`appterm:v1:${n(e)}:${n(t)}:${o(r)}:${n(i)}`};var O={applicationOutbox:(e,t)=>`appobx:v1:${n(e)}:${n(t)}`,applicationOutboxSinkProbe:(e,t,r)=>`appprobe:v1:outbox:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${n(e)}:${n(t)}:`,applicationDelivery:(e,t,r)=>`appdlv:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${n(e)}:${n(t)}:`,applicationDeliveryDue:(e,t,r,i)=>`appdue:v1:${n(e)}:${n(t)}:${o(r)}:${n(i)}`,applicationDeliveryIdempotency:(e,t,r)=>`appdidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${n(e)}:${n(t)}:`,applicationDeliveryBySequence:(e,t,r)=>`appdseq:v1:${n(e)}:${n(t)}:${o(r)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${n(e)}:${n(t)}:`,applicationDeliveryTerminal:(e,t,r,i)=>`appdterm:v1:${n(e)}:${n(t)}:${o(r)}:${n(i)}`};var C={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var L=["actrec:","appcmd:","appdidem:","appdlv:","appdseq:","appdterm:","appdue:","appidem:","appmbx:","appobx:","appprobe:","appready:","appseq:","appterm:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","catalog-active:","catalog-entry:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var u=1e4,pe=1e4;class k extends Error{code="StorageBatchOperationLimitExceededError";cap=u;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${u}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function l(e,t){if(t>u)throw new k(e,t)}function de(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function ue(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function fe(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function P(e,t){if(e.has)return e.has(t);return b(e,t)}function B(e,t,r){if(e.keys)return e.keys(t,r);return s(e,t,r)}async function D(e,t){if(e.count)return e.count(t);return w(e,t)}async function E(e,t){if(e.deletePrefix)return e.deletePrefix(t);return S(e,t)}async function me(e,t){l("batch operations",t.length),await e.batch(t)}async function A(e,t,r){if(l("conditionalBatch conditions",t.length),l("conditionalBatch operations",r.length),p(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,r)}var a=o,z="0",q="1",R=(e,t,r,i)=>`sig:${n(e)}:${n(t)}:${i}:${n(r)}`,ye={workflow:(e)=>`wf:${n(e)}`,checkpoint:(e)=>`wf:${n(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${n(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${n(e)}:timeline:`,timeline:(e,t)=>`wf:${n(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${n(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${n(t)}`,scheduleRun:(e)=>`schedule-run:${n(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${n(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${n(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${n(e)}:${n(t)}`,operation:(e,t,r)=>`op:${e}:${a(t)}:${r}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,r)=>`audit:bulk:${a(e)}:${n(t)}:${n(r)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${a(e)}:${n(t)}`,asyncActivity:(e,t)=>`async-act:v1:${n(e)}:${n(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${n(e)}:${n(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${n(e)}:`,activityReconciliation:(e,t,r)=>`actrec:v1:${n(e)}:${n(t)}:${r}`,eventPrefix:(e)=>`ev:${n(e)}:`,event:(e,t)=>`ev:${n(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${n(e)}:head`,eventWatermark:(e)=>`ev:${n(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${n(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${n(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,r)=>R(e,t,r,q),startSignal:(e,t,r)=>R(e,t,r,z),signalSequence:(e)=>`sigseq:v1:${n(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${n(e)}:`,signalAcceptedResponse:(e,t,r)=>`sigres:v1:${n(e)}:${n(t)}:${n(r)}`,deadline:(e,t)=>`wf-deadline:${a(e)}:${n(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${a(e)}:${n(t)}`,teardownTimer:(e,t)=>`wf-teardown:${a(e)}:${n(t)}`,delayedStart:(e,t)=>`wf-delayed:${a(e)}:${n(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${a(e)}:${n(t)}`,attribute:(e)=>`attr:${n(e)}`,attributeIndex:(e,t,r)=>`idx:${e}:${t}:${n(r)}`,tagIndex:(e,t)=>`tag:${n(e)}:${n(t)}`,updatePrefix:(e)=>`upd:${n(e)}:`,update:(e,t)=>`upd:${n(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${n(e)}:${t}`,startIdempotency:(e)=>`start-idem:${n(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${n(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...x,...O,...C,...h,budget:(e,t,r)=>`budget:${e}:${t}:${r}`,review:(e,t)=>`review:${n(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${n(e)}`,childCancellationPrefix:(e)=>`child-cancel:${n(e)}:`,childCancellation:(e,t)=>`child-cancel:${n(e)}:${n(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}`,childWorkflowByParent:(e,t,r)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}${n(r)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${n(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${n(e)}:${n(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${n(e)}`,workflowHasServices:(e)=>`wf-has-services:${n(e)}`,finalizerState:(e)=>`wf-finalizer-state:${n(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${n(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${n(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${n(e)}`,offload:(e,t)=>`offload:${n(e)}:${t}`,archive:(e,t)=>`archive:${n(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${n(e)}:${n(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${d}:${n(e)}:${n(t)}`,streamChunkPrefix:(e,t)=>`blob:${n(e)}:${t}:chunk:`,streamChunk:(e,t,r)=>`blob:${n(e)}:${t}:chunk:${String(r).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${n(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${n(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,r)=>`tool-effect:${n(e)}:${t}:${r}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${n(e)}:${n(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${n(e)}:${n(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${a(e)}:${n(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${a(e)}:${n(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${a(e)}:${n(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${n(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function U(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},r=!1;for(let g of["gt","gte","lt","lte"]){let c=e[g];if(c===void 0)continue;if(typeof c!=="string")throw Error("deleteRange bounds must be strings");t[g]=c,r=!0}if(!r)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=U(e.limit);if(i!==void 0)t.limit=i;return t}async function T(e,t,r){let i=f(r);if(e.deleteRange)return e.deleteRange(t,i);return v(e,t,i)}function m(e){return e.replaceAll(/:+$/g,"")}function W(e,t){let r=m(e),i=m(t);if(r.length===0)return i;if(i.length===0)return r;return`${r}:${i}`}class y{#t;#n;constructor(e,t){this.#t=e,this.#n=m(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#i(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#o(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#a(e={}){let t=this.#o(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#s(e){return this.#o(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new y(this.#t,W(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[r,i]of this.#t.scan(this.#e(e),this.#a(t)))yield[this.#i(r),i]}async batch(e){l("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return A(this.#t,e.map((r)=>({key:this.#e(r.key),expectedValue:r.expectedValue})),this.#r(t))}async has(e){return P(this.#t,this.#e(e))}async deletePrefix(e){return E(this.#t,this.#e(e))}async deleteRange(e,t){let r=this.#s(f(t));return T(this.#t,this.#e(e),r)}async*keys(e,t){for await(let r of B(this.#t,this.#e(e),this.#a(t)))yield this.#i(r)}async count(e){return D(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function Re(e,t){return new y(e,t)}export{y as ScopedStorage,Re as scopedStorage};
|
|
@@ -62,6 +62,12 @@ export type SQLiteStorageConfiguration = {
|
|
|
62
62
|
export type LMDBStorageConfiguration = {
|
|
63
63
|
type: 'lmdb';
|
|
64
64
|
path: string;
|
|
65
|
+
/**
|
|
66
|
+
* LMDB commit durability. Defaults to `'full'`. `'relaxed'` trades crash
|
|
67
|
+
* durability for write latency—see {@link LMDBStorageOptions}—and is
|
|
68
|
+
* intended for test fixtures, not production storage.
|
|
69
|
+
*/
|
|
70
|
+
durability?: 'full' | 'relaxed';
|
|
65
71
|
};
|
|
66
72
|
/**
|
|
67
73
|
* Runtime configuration for Turso/libSQL storage.
|
package/dist/storage/testing.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var N=import.meta.require;function S(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function T(e){let t=e.capabilities(),r=[];if(t.persistence!=="local"&&t.persistence!=="remote")r.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")r.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")r.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)r.push("atomicBatch must be true");if(!t.conditionalBatch)r.push("conditionalBatch must be true");if(r.length>0)throw Error(`Storage is not durable enough for recovery: ${r.join("; ")}.`)}var x="default";async function k(e,t){return await e.get(t)!==null}async function*w(e,t,r){for await(let[a]of e.scan(t,r))yield a}async function B(e,t){let r=0;for await(let a of w(e,t))r++;return r}async function E(e,t){let r=[];for await(let a of w(e,t))r.push({type:"delete",key:a});if(r.length===0)return 0;return await e.batch(r),r.length}async function V(e,t,r){let a=[];for await(let o of w(e,t,r))a.push({type:"delete",key:o});if(a.length===0)return 0;return await e.batch(a),a.length}function n(e){return encodeURIComponent(e)}function L(e){return decodeURIComponent(e)}function _(e){try{return decodeURIComponent(e)}catch{return null}}var P={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var q=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var v=1e4,te=1e4;class O extends Error{code="StorageBatchOperationLimitExceededError";cap=v;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${v}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function C(e,t){if(t>v)throw new O(e,t)}function ae(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function ne(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function re(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function ie(e,t){if(e.has)return e.has(t);return k(e,t)}function oe(e,t,r){if(e.keys)return e.keys(t,r);return w(e,t,r)}async function se(e,t){if(e.count)return e.count(t);return B(e,t)}async function ce(e,t){if(e.deletePrefix)return e.deletePrefix(t);return E(e,t)}async function le(e,t){C("batch operations",t.length),await e.batch(t)}async function m(e,t,r){if(C("conditionalBatch conditions",t.length),C("conditionalBatch operations",r.length),S(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,r)}var g=(e)=>String(e).padStart(16,"0"),I="0",D="1",A=(e,t,r,a)=>`sig:${n(e)}:${n(t)}:${a}:${n(r)}`,ge={workflow:(e)=>`wf:${n(e)}`,checkpoint:(e)=>`wf:${n(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${n(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${n(e)}:timeline:`,timeline:(e,t)=>`wf:${n(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${n(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${n(t)}`,scheduleRun:(e)=>`schedule-run:${n(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${n(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${n(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${n(e)}:${n(t)}`,operation:(e,t,r)=>`op:${e}:${g(t)}:${r}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,r)=>`audit:bulk:${g(e)}:${n(t)}:${n(r)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${g(e)}:${n(t)}`,asyncActivity:(e,t)=>`async-act:v1:${n(e)}:${n(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${n(e)}:${n(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${n(e)}:`,activityReconciliation:(e,t,r)=>`actrec:v1:${n(e)}:${n(t)}:${r}`,eventPrefix:(e)=>`ev:${n(e)}:`,event:(e,t)=>`ev:${n(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${n(e)}:head`,eventWatermark:(e)=>`ev:${n(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${n(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${n(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,r)=>A(e,t,r,D),startSignal:(e,t,r)=>A(e,t,r,I),signalSequence:(e)=>`sigseq:v1:${n(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${n(e)}:`,signalAcceptedResponse:(e,t,r)=>`sigres:v1:${n(e)}:${n(t)}:${n(r)}`,deadline:(e,t)=>`wf-deadline:${g(e)}:${n(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${g(e)}:${n(t)}`,teardownTimer:(e,t)=>`wf-teardown:${g(e)}:${n(t)}`,delayedStart:(e,t)=>`wf-delayed:${g(e)}:${n(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${g(e)}:${n(t)}`,attribute:(e)=>`attr:${n(e)}`,attributeIndex:(e,t,r)=>`idx:${e}:${t}:${n(r)}`,tagIndex:(e,t)=>`tag:${n(e)}:${n(t)}`,updatePrefix:(e)=>`upd:${n(e)}:`,update:(e,t)=>`upd:${n(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${n(e)}:${t}`,startIdempotency:(e)=>`start-idem:${n(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${n(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...P,budget:(e,t,r)=>`budget:${e}:${t}:${r}`,review:(e,t)=>`review:${n(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${n(e)}`,childCancellationPrefix:(e)=>`child-cancel:${n(e)}:`,childCancellation:(e,t)=>`child-cancel:${n(e)}:${n(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}`,childWorkflowByParent:(e,t,r)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}${n(r)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${n(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${n(e)}:${n(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${n(e)}`,workflowHasServices:(e)=>`wf-has-services:${n(e)}`,finalizerState:(e)=>`wf-finalizer-state:${n(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${n(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${n(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${n(e)}`,offload:(e,t)=>`offload:${n(e)}:${t}`,archive:(e,t)=>`archive:${n(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${n(e)}:${n(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${x}:${n(e)}:${n(t)}`,streamChunkPrefix:(e,t)=>`blob:${n(e)}:${t}:chunk:`,streamChunk:(e,t,r)=>`blob:${n(e)}:${t}:chunk:${String(r).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${n(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${n(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,r)=>`tool-effect:${n(e)}:${t}:${r}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${n(e)}:${n(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${n(e)}:${n(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${g(e)}:${n(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${g(e)}:${n(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${g(e)}:${n(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${n(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};import{describe as h,expect as s,it as l}from"bun:test";import{expect as f}from"bun:test";var K=new TextEncoder,H=new TextDecoder;function i(e){return K.encode(e)}function y(e){return H.decode(e)}async function u(e){let t=[];for await(let r of e)t.push(r);return t}function R(e){let t=e.capabilities();f(["ephemeral","local","remote"]).toContain(t.persistence??""),f(["linearizable","session","eventual"]).toContain(t.readAfterWrite),f(["snapshot","best-effort"]).toContain(t.scanConsistency),f(typeof t.atomicBatch).toBe("boolean"),f(typeof t.conditionalBatch).toBe("boolean"),f(typeof t.boundedRangeDelete).toBe("boolean")}function Se(e,t){h(`${e} binary and large-scan conformance`,()=>{l("round-trips binary values correctly",async()=>{let r=await t.create();try{let a=new Uint8Array([0,1,127,128,255,42,0,13,10]);await r.put("binary",a);let o=await r.get("binary");s(o).toEqual(a)}finally{r[Symbol.dispose]()}}),l("returns 1000 scanned keys in sorted order",async()=>{let r=await t.create();try{let a=Array.from({length:1000},(c,p)=>({type:"put",key:`item:${String(p).padStart(4,"0")}`,value:i(String(p))}));await r.batch(a);let o=await u(r.scan("item:"));s(o).toHaveLength(1000);for(let c=0;c<o.length;c+=1)s(o[c][0]).toBe(`item:${String(c).padStart(4,"0")}`)}finally{r[Symbol.dispose]()}},t.largeScanTimeoutMs)})}function xe(e,t){let{create:r,expected:a}=t;h(`${e} capabilities() conformance`,()=>{if(l("reports a well-formed capability shape",async()=>{using o=await r();R(o)}),l("reports the expected capability row",async()=>{using o=await r();s(o.capabilities()).toEqual(a)}),l("satisfies its declared read-after-write level",async()=>{using o=await r();await o.put("raw:key",i("written"));let c=await o.get("raw:key");if(a.readAfterWrite!=="eventual")s(c).not.toBeNull(),s(y(c)).toBe("written")}),a.scanConsistency==="snapshot")l("does not observe a key inserted after the scan began (snapshot)",async()=>{using o=await r();await o.put("scan:a",i("1")),await o.put("scan:b",i("2"));let c=o.scan("scan:")[Symbol.asyncIterator](),p=await c.next();s(p.done).toBe(!1),await o.put("scan:c",i("3"));let d=[];if(!p.done)d.push(p.value[0]);for(let b=await c.next();!b.done;b=await c.next())d.push(b.value[0]);s(d).not.toContain("scan:c"),s(d).toContain("scan:a"),s(d).toContain("scan:b")});if(a.conditionalBatch)l("applies nothing when a conditionalBatch precondition mismatches",async()=>{using o=await r();await o.put("cas:key",i("initial"));let c=await m(o,[{key:"cas:key",expectedValue:i("wrong")}],[{type:"put",key:"cas:key",value:i("changed")}]);s(c).toBe(!1),s(y(await o.get("cas:key"))).toBe("initial")}),l("reports conditionalBatch before running compare-and-swap assertions",async()=>{using o=await r();s(o.capabilities().conditionalBatch).toBe(!0)})})}function ve(e,t){let{create:r}=t;h(`${e} concurrent conditionalBatch conformance`,()=>{l("lets exactly one of two contending conditionalBatch calls win",async()=>{using a=await r();s(a.capabilities().conditionalBatch).toBe(!0),await a.put("cas:counter",i("start"));let o=[{key:"cas:counter",expectedValue:i("start")}],[c,p]=await Promise.all([m(a,o,[{type:"put",key:"cas:counter",value:i("first")}]),m(a,o,[{type:"put",key:"cas:counter",value:i("second")}])]);s([c,p].filter(Boolean)).toHaveLength(1);let d=y(await a.get("cas:counter"));s(d).toBe(c?"first":"second")})})}function Ce(e,t){let{create:r}=t;h(`${e} basic storage contract`,()=>{l("get on empty storage returns null",async()=>{using a=await r();let o=await a.get("nonexistent");s(o).toBeNull()}),l("put then get returns same bytes",async()=>{using a=await r();let o=i("hello");await a.put("key",o);let c=await a.get("key");s(c).toEqual(o)}),l("put with same key overwrites previous value",async()=>{using a=await r();await a.put("key",i("first")),await a.put("key",i("second"));let o=await a.get("key");s(y(o)).toBe("second")}),l("delete removes key, subsequent get returns null",async()=>{using a=await r();await a.put("key",i("value")),await a.delete("key");let o=await a.get("key");s(o).toBeNull()}),l("delete on a missing key is a no-op",async()=>{using a=await r();await a.delete("nonexistent"),s(await a.get("nonexistent")).toBeNull()}),l("scan with prefix returns only matching keys, sorted lexicographically",async()=>{using a=await r();await a.put("wf:b",i("b")),await a.put("wf:a",i("a")),await a.put("wf:c",i("c")),await a.put("other:x",i("x"));let o=await u(a.scan("wf:"));s(o.map(([c])=>c)).toEqual(["wf:a","wf:b","wf:c"])}),l("scan with limit returns at most N entries",async()=>{using a=await r();await a.put("p:a",i("a")),await a.put("p:b",i("b")),await a.put("p:c",i("c"));let o=await u(a.scan("p:",{limit:2}));s(o).toHaveLength(2),s(o.map(([c])=>c)).toEqual(["p:a","p:b"])}),l("scan with reverse returns in reverse order",async()=>{using a=await r();await a.put("p:a",i("a")),await a.put("p:b",i("b")),await a.put("p:c",i("c"));let o=await u(a.scan("p:",{reverse:!0}));s(o.map(([c])=>c)).toEqual(["p:c","p:b","p:a"])}),l("scan with gt/lt bounds",async()=>{using a=await r();await a.put("p:a",i("a")),await a.put("p:b",i("b")),await a.put("p:c",i("c")),await a.put("p:d",i("d"));let o=await u(a.scan("p:",{gt:"p:a",lt:"p:d"}));s(o.map(([c])=>c)).toEqual(["p:b","p:c"])}),l("scan with inclusive gte/lte bounds",async()=>{using a=await r();await a.put("p:a",i("a")),await a.put("p:b",i("b")),await a.put("p:c",i("c")),await a.put("p:d",i("d"));let o=await u(a.scan("p:",{gte:"p:b",lte:"p:c"}));s(o.map(([c])=>c)).toEqual(["p:b","p:c"])}),l("scan with no matching keys returns no entries",async()=>{using a=await r();await a.put("other:a",i("a")),s(await u(a.scan("wf:"))).toHaveLength(0)}),l("batch with multiple puts stores every value",async()=>{using a=await r();await a.batch([{type:"put",key:"a",value:i("1")},{type:"put",key:"b",value:i("2")},{type:"put",key:"c",value:i("3")}]),s(await a.get("a")).toEqual(i("1")),s(await a.get("b")).toEqual(i("2")),s(await a.get("c")).toEqual(i("3"))}),l("batch with mixed puts and deletes leaves the expected state",async()=>{using a=await r();await a.put("keep",i("keep")),await a.put("remove",i("remove")),await a.batch([{type:"put",key:"new",value:i("new")},{type:"delete",key:"remove"}]),s(await a.get("keep")).toEqual(i("keep")),s(await a.get("remove")).toBeNull(),s(await a.get("new")).toEqual(i("new"))}),l("batch with no operations is a no-op",async()=>{using a=await r();await a.put("key",i("value")),await a.batch([]),s(await a.get("key")).toEqual(i("value"))}),l("scan with empty prefix returns all keys",async()=>{using a=await r();await a.put("alpha",i("a")),await a.put("beta",i("b")),await a.put("gamma",i("c"));let o=await u(a.scan(""));s(o.map(([c])=>c)).toEqual(["alpha","beta","gamma"])}),l("scan with empty prefix on empty storage returns no entries",async()=>{using a=await r();s(await u(a.scan(""))).toEqual([])})})}export{Ce as runBasicStorageContract,Se as runBinaryAndLargeScanStorageConformance,ve as runConcurrentConditionalBatchConformance,xe as runStorageCapabilityConformance};
|
|
2
|
+
var V=import.meta.require;function v(t,e,n){if(!t.capabilities()[e])throw Error(`Feature "${n}" requires storage capability "${e}", but this storage backend does not provide it.`)}function L(t){let e=t.capabilities(),n=[];if(e.persistence!=="local"&&e.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${e.persistence}")`);if(e.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${e.readAfterWrite}")`);if(e.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${e.scanConsistency}")`);if(!e.atomicBatch)n.push("atomicBatch must be true");if(!e.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}function a(t){return encodeURIComponent(t)}function I(t){return decodeURIComponent(t)}function K(t){try{return decodeURIComponent(t)}catch{return null}}function l(t){return String(t).padStart(16,"0")}var B={catalogEntry:(t,e)=>`catalog-entry:${a(t)}:${a(e)}`,catalogEntryPrefix:(t)=>`catalog-entry:${a(t)}:`,catalogActive:(t)=>`catalog-active:${a(t)}`};var x="default";async function E(t,e){return await t.get(e)!==null}async function*y(t,e,n){for await(let[r]of t.scan(e,n))yield r}async function P(t,e){let n=0;for await(let r of y(t,e))n++;return n}async function O(t,e){let n=[];for await(let r of y(t,e))n.push({type:"delete",key:r});if(n.length===0)return 0;return await t.batch(n),n.length}async function Q(t,e,n){let r=[];for await(let o of y(t,e,n))r.push({type:"delete",key:o});if(r.length===0)return 0;return await t.batch(r),r.length}var A={applicationMailbox:(t,e)=>`appmbx:v1:${a(t)}:${a(e)}`,applicationMailboxSinkProbe:(t,e,n)=>`appprobe:v1:${a(t)}:${a(e)}:${a(n)}`,applicationCommandPrefix:(t,e)=>`appcmd:v1:${a(t)}:${a(e)}:`,applicationCommand:(t,e,n)=>`appcmd:v1:${a(t)}:${a(e)}:${a(n)}`,applicationCommandReadyPrefix:(t,e)=>`appready:v1:${a(t)}:${a(e)}:`,applicationCommandReady:(t,e,n)=>`appready:v1:${a(t)}:${a(e)}:${l(n)}`,applicationCommandIdempotency:(t,e,n)=>`appidem:v1:${a(t)}:${a(e)}:${a(n)}`,applicationCommandBySequencePrefix:(t,e)=>`appseq:v1:${a(t)}:${a(e)}:`,applicationCommandBySequence:(t,e,n)=>`appseq:v1:${a(t)}:${a(e)}:${l(n)}`,applicationCommandTerminalPrefix:(t,e)=>`appterm:v1:${a(t)}:${a(e)}:`,applicationCommandTerminal:(t,e,n,r)=>`appterm:v1:${a(t)}:${a(e)}:${l(n)}:${a(r)}`};var T={applicationOutbox:(t,e)=>`appobx:v1:${a(t)}:${a(e)}`,applicationOutboxSinkProbe:(t,e,n)=>`appprobe:v1:outbox:${a(t)}:${a(e)}:${a(n)}`,applicationDeliveryPrefix:(t,e)=>`appdlv:v1:${a(t)}:${a(e)}:`,applicationDelivery:(t,e,n)=>`appdlv:v1:${a(t)}:${a(e)}:${a(n)}`,applicationDeliveryDuePrefix:(t,e)=>`appdue:v1:${a(t)}:${a(e)}:`,applicationDeliveryDue:(t,e,n,r)=>`appdue:v1:${a(t)}:${a(e)}:${l(n)}:${a(r)}`,applicationDeliveryIdempotency:(t,e,n)=>`appdidem:v1:${a(t)}:${a(e)}:${a(n)}`,applicationDeliveryBySequencePrefix:(t,e)=>`appdseq:v1:${a(t)}:${a(e)}:`,applicationDeliveryBySequence:(t,e,n)=>`appdseq:v1:${a(t)}:${a(e)}:${l(n)}`,applicationDeliveryTerminalPrefix:(t,e)=>`appdterm:v1:${a(t)}:${a(e)}:`,applicationDeliveryTerminal:(t,e,n,r)=>`appdterm:v1:${a(t)}:${a(e)}:${l(n)}:${a(r)}`};var R={workflowOwnerEpoch:(t)=>`wf-owner-epoch:${a(t)}`,workflowOwnerHolder:(t)=>`wf-owner-holder:${a(t)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var W=["actrec:","appcmd:","appdidem:","appdlv:","appdseq:","appdterm:","appdue:","appidem:","appmbx:","appobx:","appprobe:","appready:","appseq:","appterm:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","catalog-active:","catalog-entry:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var C=1e4,ft=1e4;class _ extends Error{code="StorageBatchOperationLimitExceededError";cap=C;count;target;constructor(t,e){super(`${t} count ${e} exceeds MAX_BATCH_OPERATIONS (${C}).`);this.name="StorageBatchOperationLimitExceededError",this.target=t,this.count=e}}function k(t,e){if(e>C)throw new _(t,e)}function mt(t){return t.length>0?t.slice(0,-1)+String.fromCharCode(t.charCodeAt(t.length-1)+1):"\xFF"}function yt(t,e={}){if(e.gt!==void 0&&t<=e.gt)return!1;if(e.gte!==void 0&&t<e.gte)return!1;if(e.lt!==void 0&&t>=e.lt)return!1;if(e.lte!==void 0&&t>e.lte)return!1;return!0}function wt(t,e){if(t===null||e===null)return t===e;if(t.byteLength!==e.byteLength)return!1;for(let n=0;n<t.byteLength;n++)if(t[n]!==e[n])return!1;return!0}async function bt(t,e){if(t.has)return t.has(e);return E(t,e)}function $t(t,e,n){if(t.keys)return t.keys(e,n);return y(t,e,n)}async function ht(t,e){if(t.count)return t.count(e);return P(t,e)}async function St(t,e){if(t.deletePrefix)return t.deletePrefix(e);return O(t,e)}async function vt(t,e){k("batch operations",e.length),await t.batch(e)}async function b(t,e,n){if(k("conditionalBatch conditions",e.length),k("conditionalBatch operations",n.length),v(t,"conditionalBatch","storageConditionalBatch"),!t.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return t.conditionalBatch(e,n)}var g=l,M="0",U="1",q=(t,e,n,r)=>`sig:${a(t)}:${a(e)}:${r}:${a(n)}`,xt={workflow:(t)=>`wf:${a(t)}`,checkpoint:(t)=>`wf:${a(t)}:ckpt`,checkpointHistory:(t,e)=>`wf:${a(t)}:ckpt:${String(e).padStart(10,"0")}`,timelinePrefix:(t)=>`wf:${a(t)}:timeline:`,timeline:(t,e)=>`wf:${a(t)}:timeline:${String(e).padStart(10,"0")}`,schedule:(t)=>`schedule:${a(t)}`,scheduleTick:(t,e)=>`schedule-due:${String(t).padStart(16,"0")}:${a(e)}`,scheduleRun:(t)=>`schedule-run:${a(t)}`,scheduleRunLink:(t)=>`schedule-run-link:${a(t)}`,scheduleRunBySchedulePrefix:(t)=>`schedule-run-by-schedule:${a(t)}:`,scheduleRunBySchedule:(t,e)=>`schedule-run-by-schedule:${a(t)}:${a(e)}`,operation:(t,e,n)=>`op:${t}:${g(e)}:${n}`,operationInflight:(t)=>`op:inflight:${t}`,operationQueued:(t)=>`op:queued:${t}`,operationResolved:(t)=>`op:resolved:${t}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(t,e,n)=>`audit:bulk:${g(t)}:${a(e)}:${a(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(t,e)=>`op:resolved-by-time:${g(t)}:${a(e)}`,asyncActivity:(t,e)=>`async-act:v1:${a(t)}:${a(e)}`,asyncActivityResolution:(t,e)=>`async-act:v1:${a(t)}:${a(e)}:resolution`,activityReconciliationPrefix:(t)=>`actrec:v1:${a(t)}:`,activityReconciliation:(t,e,n)=>`actrec:v1:${a(t)}:${a(e)}:${n}`,eventPrefix:(t)=>`ev:${a(t)}:`,event:(t,e)=>`ev:${a(t)}:${String(e).padStart(10,"0")}`,eventHead:(t)=>`ev:${a(t)}:head`,eventWatermark:(t)=>`ev:${a(t)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(t)=>`fleet-event:${String(t).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(t)=>`fleet-event-by-workflow:${a(t)}:`,fleetEventByWorkflow:(t,e)=>`fleet-event-by-workflow:${a(t)}:${String(e).padStart(10,"0")}`,signal:(t,e,n)=>q(t,e,n,U),startSignal:(t,e,n)=>q(t,e,n,M),signalSequence:(t)=>`sigseq:v1:${a(t)}`,signalAcceptedResponsePrefix:(t)=>`sigres:v1:${a(t)}:`,signalAcceptedResponse:(t,e,n)=>`sigres:v1:${a(t)}:${a(e)}:${a(n)}`,deadline:(t,e)=>`wf-deadline:${g(t)}:${a(e)}`,terminalCleanup:(t,e)=>`wf-cleanup:${g(t)}:${a(e)}`,teardownTimer:(t,e)=>`wf-teardown:${g(t)}:${a(e)}`,delayedStart:(t,e)=>`wf-delayed:${g(t)}:${a(e)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(t,e)=>`wf-terminal:${g(t)}:${a(e)}`,attribute:(t)=>`attr:${a(t)}`,attributeIndex:(t,e,n)=>`idx:${t}:${e}:${a(n)}`,tagIndex:(t,e)=>`tag:${a(t)}:${a(e)}`,updatePrefix:(t)=>`upd:${a(t)}:`,update:(t,e)=>`upd:${a(t)}:${e}`,updateResponse:(t)=>`upr:${t}`,updateIdempotency:(t,e)=>`upk:${a(t)}:${e}`,startIdempotency:(t)=>`start-idem:${a(t)}`,startIdempotencySignalId:(t)=>`start-idem:${t}`,livenessPrefix:()=>"liveness:",liveness:(t)=>`liveness:${a(t)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...A,...T,...R,...B,budget:(t,e,n)=>`budget:${t}:${e}:${n}`,review:(t,e)=>`review:${a(t)}:${e}`,workflowHeaders:(t)=>`wf-headers:${a(t)}`,childCancellationPrefix:(t)=>`child-cancel:${a(t)}:`,childCancellation:(t,e)=>`child-cancel:${a(t)}:${a(e)}`,childWorkflowByParentPrefix:(t,e)=>`child-by-parent:${a(t)}:${e===void 0?"":`${a(e)}:`}`,childWorkflowByParent:(t,e,n)=>`child-by-parent:${a(t)}:${e===void 0?"":`${a(e)}:`}${a(n)}`,terminalCleanupNeeded:(t)=>`wf-cleanup-needed:${a(t)}`,workflowConcurrency:(t,e)=>`wf-concurrency:${a(t)}:${a(e)}`,workflowConcurrencyHolder:(t)=>`wf-concurrency-holder:${a(t)}`,workflowHasServices:(t)=>`wf-has-services:${a(t)}`,finalizerState:(t)=>`wf-finalizer-state:${a(t)}`,teardownOwed:(t)=>`wf-teardown-needed:${a(t)}`,teardownSucceeded:(t)=>`wf-teardown-succeeded:${a(t)}`,teardownDeadLetter:(t)=>`wf-teardown-deadletter:${a(t)}`,offload:(t,e)=>`offload:${a(t)}:${e}`,archive:(t,e)=>`archive:${a(t)}:${e}`,stateExecution:(t,e)=>`state:execution:${a(t)}:${a(e)}`,stateWorkflow:(t,e)=>`state:workflow-scope:${x}:${a(t)}:${a(e)}`,streamChunkPrefix:(t,e)=>`blob:${a(t)}:${e}:chunk:`,streamChunk:(t,e,n)=>`blob:${a(t)}:${e}:chunk:${String(n).padStart(10,"0")}`,streamTail:(t,e)=>`blob:${a(t)}:${e}:tail`,streamMetadata:(t,e)=>`blob:${a(t)}:${e}:meta`,budgetCharged:(t)=>`budget-charged:${t}`,toolEffect:(t,e,n)=>`tool-effect:${a(t)}:${e}:${n}`,workflowVisibilityStatus:(t,e)=>`wf-idx-status:${a(t)}:${a(e)}`,workflowVisibilityType:(t,e)=>`wf-idx-type:${a(t)}:${a(e)}`,workflowVisibilityCreated:(t,e)=>`wf-idx-created:${g(t)}:${a(e)}`,workflowVisibilityUpdated:(t,e)=>`wf-idx-updated:${g(t)}:${a(e)}`,workflowVisibilityDeadline:(t,e)=>`wf-idx-deadline:${g(t)}:${a(e)}`,workflowVisibilityManifest:(t)=>`wf-idx-manifest:${a(t)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};import{describe as h,expect as s,it as p}from"bun:test";import{expect as m}from"bun:test";var H=new TextEncoder,N=new TextDecoder;function i(t){return H.encode(t)}function w(t){return N.decode(t)}async function u(t){let e=[];for await(let n of t)e.push(n);return e}function D(t){let e=t.capabilities();m(["ephemeral","local","remote"]).toContain(e.persistence??""),m(["linearizable","session","eventual"]).toContain(e.readAfterWrite),m(["snapshot","best-effort"]).toContain(e.scanConsistency),m(typeof e.atomicBatch).toBe("boolean"),m(typeof e.conditionalBatch).toBe("boolean"),m(typeof e.boundedRangeDelete).toBe("boolean")}function _t(t,e){h(`${t} binary and large-scan conformance`,()=>{p("round-trips binary values correctly",async()=>{let n=await e.create();try{let r=new Uint8Array([0,1,127,128,255,42,0,13,10]);await n.put("binary",r);let o=await n.get("binary");s(o).toEqual(r)}finally{n[Symbol.dispose]()}}),p("returns 1000 scanned keys in sorted order",async()=>{let n=await e.create();try{let r=Array.from({length:1000},(c,d)=>({type:"put",key:`item:${String(d).padStart(4,"0")}`,value:i(String(d))}));await n.batch(r);let o=await u(n.scan("item:"));s(o).toHaveLength(1000);for(let c=0;c<o.length;c+=1)s(o[c][0]).toBe(`item:${String(c).padStart(4,"0")}`)}finally{n[Symbol.dispose]()}},e.largeScanTimeoutMs)})}function Dt(t,e){let{create:n,expected:r}=e;h(`${t} capabilities() conformance`,()=>{if(p("reports a well-formed capability shape",async()=>{using o=await n();D(o)}),p("reports the expected capability row",async()=>{using o=await n();s(o.capabilities()).toEqual(r)}),p("satisfies its declared read-after-write level",async()=>{using o=await n();await o.put("raw:key",i("written"));let c=await o.get("raw:key");if(r.readAfterWrite!=="eventual")s(c).not.toBeNull(),s(w(c)).toBe("written")}),r.scanConsistency==="snapshot")p("does not observe a key inserted after the scan began (snapshot)",async()=>{using o=await n();await o.put("scan:a",i("1")),await o.put("scan:b",i("2"));let c=o.scan("scan:")[Symbol.asyncIterator](),d=await c.next();s(d.done).toBe(!1),await o.put("scan:c",i("3"));let f=[];if(!d.done)f.push(d.value[0]);for(let S=await c.next();!S.done;S=await c.next())f.push(S.value[0]);s(f).not.toContain("scan:c"),s(f).toContain("scan:a"),s(f).toContain("scan:b")});if(r.conditionalBatch)p("applies nothing when a conditionalBatch precondition mismatches",async()=>{using o=await n();await o.put("cas:key",i("initial"));let c=await b(o,[{key:"cas:key",expectedValue:i("wrong")}],[{type:"put",key:"cas:key",value:i("changed")}]);s(c).toBe(!1),s(w(await o.get("cas:key"))).toBe("initial")}),p("reports conditionalBatch before running compare-and-swap assertions",async()=>{using o=await n();s(o.capabilities().conditionalBatch).toBe(!0)})})}function Lt(t,e){let{create:n}=e;h(`${t} concurrent conditionalBatch conformance`,()=>{p("lets exactly one of two contending conditionalBatch calls win",async()=>{using r=await n();s(r.capabilities().conditionalBatch).toBe(!0),await r.put("cas:counter",i("start"));let o=[{key:"cas:counter",expectedValue:i("start")}],[c,d]=await Promise.all([b(r,o,[{type:"put",key:"cas:counter",value:i("first")}]),b(r,o,[{type:"put",key:"cas:counter",value:i("second")}])]);s([c,d].filter(Boolean)).toHaveLength(1);let f=w(await r.get("cas:counter"));s(f).toBe(c?"first":"second")})})}function It(t,e){let{create:n}=e;h(`${t} basic storage contract`,()=>{p("get on empty storage returns null",async()=>{using r=await n();let o=await r.get("nonexistent");s(o).toBeNull()}),p("put then get returns same bytes",async()=>{using r=await n();let o=i("hello");await r.put("key",o);let c=await r.get("key");s(c).toEqual(o)}),p("put with same key overwrites previous value",async()=>{using r=await n();await r.put("key",i("first")),await r.put("key",i("second"));let o=await r.get("key");s(w(o)).toBe("second")}),p("delete removes key, subsequent get returns null",async()=>{using r=await n();await r.put("key",i("value")),await r.delete("key");let o=await r.get("key");s(o).toBeNull()}),p("delete on a missing key is a no-op",async()=>{using r=await n();await r.delete("nonexistent"),s(await r.get("nonexistent")).toBeNull()}),p("scan with prefix returns only matching keys, sorted lexicographically",async()=>{using r=await n();await r.put("wf:b",i("b")),await r.put("wf:a",i("a")),await r.put("wf:c",i("c")),await r.put("other:x",i("x"));let o=await u(r.scan("wf:"));s(o.map(([c])=>c)).toEqual(["wf:a","wf:b","wf:c"])}),p("scan with limit returns at most N entries",async()=>{using r=await n();await r.put("p:a",i("a")),await r.put("p:b",i("b")),await r.put("p:c",i("c"));let o=await u(r.scan("p:",{limit:2}));s(o).toHaveLength(2),s(o.map(([c])=>c)).toEqual(["p:a","p:b"])}),p("scan with reverse returns in reverse order",async()=>{using r=await n();await r.put("p:a",i("a")),await r.put("p:b",i("b")),await r.put("p:c",i("c"));let o=await u(r.scan("p:",{reverse:!0}));s(o.map(([c])=>c)).toEqual(["p:c","p:b","p:a"])}),p("scan with gt/lt bounds",async()=>{using r=await n();await r.put("p:a",i("a")),await r.put("p:b",i("b")),await r.put("p:c",i("c")),await r.put("p:d",i("d"));let o=await u(r.scan("p:",{gt:"p:a",lt:"p:d"}));s(o.map(([c])=>c)).toEqual(["p:b","p:c"])}),p("scan with inclusive gte/lte bounds",async()=>{using r=await n();await r.put("p:a",i("a")),await r.put("p:b",i("b")),await r.put("p:c",i("c")),await r.put("p:d",i("d"));let o=await u(r.scan("p:",{gte:"p:b",lte:"p:c"}));s(o.map(([c])=>c)).toEqual(["p:b","p:c"])}),p("scan with no matching keys returns no entries",async()=>{using r=await n();await r.put("other:a",i("a")),s(await u(r.scan("wf:"))).toHaveLength(0)}),p("batch with multiple puts stores every value",async()=>{using r=await n();await r.batch([{type:"put",key:"a",value:i("1")},{type:"put",key:"b",value:i("2")},{type:"put",key:"c",value:i("3")}]),s(await r.get("a")).toEqual(i("1")),s(await r.get("b")).toEqual(i("2")),s(await r.get("c")).toEqual(i("3"))}),p("batch with mixed puts and deletes leaves the expected state",async()=>{using r=await n();await r.put("keep",i("keep")),await r.put("remove",i("remove")),await r.batch([{type:"put",key:"new",value:i("new")},{type:"delete",key:"remove"}]),s(await r.get("keep")).toEqual(i("keep")),s(await r.get("remove")).toBeNull(),s(await r.get("new")).toEqual(i("new"))}),p("batch with no operations is a no-op",async()=>{using r=await n();await r.put("key",i("value")),await r.batch([]),s(await r.get("key")).toEqual(i("value"))}),p("scan with empty prefix returns all keys",async()=>{using r=await n();await r.put("alpha",i("a")),await r.put("beta",i("b")),await r.put("gamma",i("c"));let o=await u(r.scan(""));s(o.map(([c])=>c)).toEqual(["alpha","beta","gamma"])}),p("scan with empty prefix on empty storage returns no entries",async()=>{using r=await n();s(await u(r.scan(""))).toEqual([])})})}export{It as runBasicStorageContract,_t as runBinaryAndLargeScanStorageConformance,Lt as runConcurrentConditionalBatchConformance,Dt as runStorageCapabilityConformance};
|
package/dist/storage/turso.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var $e=import.meta.require;function h(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function ee(e){let t=e.capabilities(),n=[];if(t.persistence!=="local"&&t.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)n.push("atomicBatch must be true");if(!t.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}var S="default";async function x(e,t){return await e.get(t)!==null}async function*g(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function k(e,t){let n=0;for await(let i of g(e,t))n++;return n}async function O(e,t){let n=[];for await(let i of g(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function C(e,t,n){let i=[];for await(let a of g(e,t,n))i.push({type:"delete",key:a});if(i.length===0)return 0;return await e.batch(i),i.length}function r(e){return encodeURIComponent(e)}function te(e){return decodeURIComponent(e)}function ne(e){try{return decodeURIComponent(e)}catch{return null}}var T={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var re=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var w=1e4,Ie=1e4;class v extends Error{code="StorageBatchOperationLimitExceededError";cap=w;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${w}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function u(e,t){if(t>w)throw new v(e,t)}function B(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function qe(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function A(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function _(e,t){if(e.has)return e.has(t);return x(e,t)}function L(e,t,n){if(e.keys)return e.keys(t,n);return g(e,t,n)}async function D(e,t){if(e.count)return e.count(t);return k(e,t)}async function I(e,t){if(e.deletePrefix)return e.deletePrefix(t);return O(e,t)}async function Ke(e,t){u("batch operations",t.length),await e.batch(t)}async function q(e,t,n){if(u("conditionalBatch conditions",t.length),u("conditionalBatch operations",n.length),h(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var o=(e)=>String(e).padStart(16,"0"),ie="0",ae="1",P=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ne={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${o(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${o(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${o(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>P(e,t,n,ae),startSignal:(e,t,n)=>P(e,t,n,ie),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${o(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${o(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${o(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${o(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${o(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...T,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${S}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${o(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${o(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${o(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function se(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function d(e){let t={},n=!1;for(let a of["gt","gte","lt","lte"]){let s=e[a];if(s===void 0)continue;if(typeof s!=="string")throw Error("deleteRange bounds must be strings");t[a]=s,n=!0}if(!n)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=se(e.limit);if(i!==void 0)t.limit=i;return t}async function K(e,t,n){let i=d(n);if(e.deleteRange)return e.deleteRange(t,i);return C(e,t,i)}function E(e){return e.replaceAll(/:+$/g,"")}function oe(e,t){let n=E(e),i=E(t);if(n.length===0)return i;if(i.length===0)return n;return`${n}:${i}`}class b{#e;#r;constructor(e,t){this.#e=e,this.#r=E(t)}#t(e){if(this.#r.length===0)return e;return e.length===0?`${this.#r}:`:`${this.#r}:${e}`}#n(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#t(t.key),value:t.value};return{type:"delete",key:this.#t(t.key)}})}#i(e){if(this.#r.length===0)return e;return e.slice(this.#r.length+1)}#a(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#t(e.gt);if(e.gte!==void 0)t.gte=this.#t(e.gte);if(e.lt!==void 0)t.lt=this.#t(e.lt);if(e.lte!==void 0)t.lte=this.#t(e.lte);return t}#s(e={}){let t=this.#a(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#o(e){return this.#a(e)}capabilities(){return this.#e.capabilities()}scoped(e){return new b(this.#e,oe(this.#r,e))}async get(e){return this.#e.get(this.#t(e))}async put(e,t){await this.#e.put(this.#t(e),t)}async delete(e){await this.#e.delete(this.#t(e))}async*scan(e,t){for await(let[n,i]of this.#e.scan(this.#t(e),this.#s(t)))yield[this.#i(n),i]}async batch(e){u("batch operations",e.length),await this.#e.batch(this.#n(e))}async conditionalBatch(e,t){return q(this.#e,e.map((n)=>({key:this.#t(n.key),expectedValue:n.expectedValue})),this.#n(t))}async has(e){return _(this.#e,this.#t(e))}async deletePrefix(e){return I(this.#e,this.#t(e))}async deleteRange(e,t){let n=this.#o(d(t));return K(this.#e,this.#t(e),n)}async*keys(e,t){for await(let n of L(this.#e,this.#t(e),this.#s(t)))yield this.#i(n)}async count(e){return D(this.#e,this.#t(e))}[Symbol.dispose](){this.#e[Symbol.dispose]()}}function N(e,t){return new b(e,t)}import{createClient as pe}from"@libsql/client";var le=/^PRAGMA\b/iu,ce=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,ue=/^SELECT\b/iu;function ge(e){return e.trim().replace(/;+\s*$/u,"").trim()}function de(e){return ce.test(e)}function U(e){let t=ge(e);if(t.length===0)throw Error("Storage query must not be empty.");if(t.includes(";"))throw Error("Storage query must contain exactly one read-only statement.");if(ue.test(t))return;if(le.test(t)&&de(t))return;throw Error("Storage query only supports read-only SELECT and PRAGMA statements.")}var M=`CREATE TABLE IF NOT EXISTS kv (
|
|
2
|
+
var Oe=import.meta.require;function S(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function ie(e){let t=e.capabilities(),r=[];if(t.persistence!=="local"&&t.persistence!=="remote")r.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")r.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")r.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)r.push("atomicBatch must be true");if(!t.conditionalBatch)r.push("conditionalBatch must be true");if(r.length>0)throw Error(`Storage is not durable enough for recovery: ${r.join("; ")}.`)}function n(e){return encodeURIComponent(e)}function ae(e){return decodeURIComponent(e)}function oe(e){try{return decodeURIComponent(e)}catch{return null}}function s(e){return String(e).padStart(16,"0")}var v={catalogEntry:(e,t)=>`catalog-entry:${n(e)}:${n(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${n(e)}:`,catalogActive:(e)=>`catalog-active:${n(e)}`};var w="default";async function O(e,t){return await e.get(t)!==null}async function*p(e,t,r){for await(let[i]of e.scan(t,r))yield i}async function C(e,t){let r=0;for await(let i of p(e,t))r++;return r}async function k(e,t){let r=[];for await(let i of p(e,t))r.push({type:"delete",key:i});if(r.length===0)return 0;return await e.batch(r),r.length}async function T(e,t,r){let i=[];for await(let a of p(e,t,r))i.push({type:"delete",key:a});if(i.length===0)return 0;return await e.batch(i),i.length}var P={applicationMailbox:(e,t)=>`appmbx:v1:${n(e)}:${n(t)}`,applicationMailboxSinkProbe:(e,t,r)=>`appprobe:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${n(e)}:${n(t)}:`,applicationCommand:(e,t,r)=>`appcmd:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${n(e)}:${n(t)}:`,applicationCommandReady:(e,t,r)=>`appready:v1:${n(e)}:${n(t)}:${s(r)}`,applicationCommandIdempotency:(e,t,r)=>`appidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${n(e)}:${n(t)}:`,applicationCommandBySequence:(e,t,r)=>`appseq:v1:${n(e)}:${n(t)}:${s(r)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${n(e)}:${n(t)}:`,applicationCommandTerminal:(e,t,r,i)=>`appterm:v1:${n(e)}:${n(t)}:${s(r)}:${n(i)}`};var B={applicationOutbox:(e,t)=>`appobx:v1:${n(e)}:${n(t)}`,applicationOutboxSinkProbe:(e,t,r)=>`appprobe:v1:outbox:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${n(e)}:${n(t)}:`,applicationDelivery:(e,t,r)=>`appdlv:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${n(e)}:${n(t)}:`,applicationDeliveryDue:(e,t,r,i)=>`appdue:v1:${n(e)}:${n(t)}:${s(r)}:${n(i)}`,applicationDeliveryIdempotency:(e,t,r)=>`appdidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${n(e)}:${n(t)}:`,applicationDeliveryBySequence:(e,t,r)=>`appdseq:v1:${n(e)}:${n(t)}:${s(r)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${n(e)}:${n(t)}:`,applicationDeliveryTerminal:(e,t,r,i)=>`appdterm:v1:${n(e)}:${n(t)}:${s(r)}:${n(i)}`};var A={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var se=["actrec:","appcmd:","appdidem:","appdlv:","appdseq:","appdterm:","appdue:","appidem:","appmbx:","appobx:","appprobe:","appready:","appseq:","appterm:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","catalog-active:","catalog-entry:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var b=1e4,Xe=1e4;class D extends Error{code="StorageBatchOperationLimitExceededError";cap=b;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${b}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function u(e,t){if(t>b)throw new D(e,t)}function L(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function Ge(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function I(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function q(e,t){if(e.has)return e.has(t);return O(e,t)}function K(e,t,r){if(e.keys)return e.keys(t,r);return p(e,t,r)}async function N(e,t){if(e.count)return e.count(t);return C(e,t)}async function U(e,t){if(e.deletePrefix)return e.deletePrefix(t);return k(e,t)}async function je(e,t){u("batch operations",t.length),await e.batch(t)}async function M(e,t,r){if(u("conditionalBatch conditions",t.length),u("conditionalBatch operations",r.length),S(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,r)}var l=s,le="0",ce="1",_=(e,t,r,i)=>`sig:${n(e)}:${n(t)}:${i}:${n(r)}`,Ze={workflow:(e)=>`wf:${n(e)}`,checkpoint:(e)=>`wf:${n(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${n(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${n(e)}:timeline:`,timeline:(e,t)=>`wf:${n(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${n(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${n(t)}`,scheduleRun:(e)=>`schedule-run:${n(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${n(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${n(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${n(e)}:${n(t)}`,operation:(e,t,r)=>`op:${e}:${l(t)}:${r}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,r)=>`audit:bulk:${l(e)}:${n(t)}:${n(r)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${l(e)}:${n(t)}`,asyncActivity:(e,t)=>`async-act:v1:${n(e)}:${n(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${n(e)}:${n(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${n(e)}:`,activityReconciliation:(e,t,r)=>`actrec:v1:${n(e)}:${n(t)}:${r}`,eventPrefix:(e)=>`ev:${n(e)}:`,event:(e,t)=>`ev:${n(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${n(e)}:head`,eventWatermark:(e)=>`ev:${n(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${n(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${n(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,r)=>_(e,t,r,ce),startSignal:(e,t,r)=>_(e,t,r,le),signalSequence:(e)=>`sigseq:v1:${n(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${n(e)}:`,signalAcceptedResponse:(e,t,r)=>`sigres:v1:${n(e)}:${n(t)}:${n(r)}`,deadline:(e,t)=>`wf-deadline:${l(e)}:${n(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${l(e)}:${n(t)}`,teardownTimer:(e,t)=>`wf-teardown:${l(e)}:${n(t)}`,delayedStart:(e,t)=>`wf-delayed:${l(e)}:${n(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${l(e)}:${n(t)}`,attribute:(e)=>`attr:${n(e)}`,attributeIndex:(e,t,r)=>`idx:${e}:${t}:${n(r)}`,tagIndex:(e,t)=>`tag:${n(e)}:${n(t)}`,updatePrefix:(e)=>`upd:${n(e)}:`,update:(e,t)=>`upd:${n(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${n(e)}:${t}`,startIdempotency:(e)=>`start-idem:${n(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${n(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...P,...B,...A,...v,budget:(e,t,r)=>`budget:${e}:${t}:${r}`,review:(e,t)=>`review:${n(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${n(e)}`,childCancellationPrefix:(e)=>`child-cancel:${n(e)}:`,childCancellation:(e,t)=>`child-cancel:${n(e)}:${n(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}`,childWorkflowByParent:(e,t,r)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}${n(r)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${n(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${n(e)}:${n(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${n(e)}`,workflowHasServices:(e)=>`wf-has-services:${n(e)}`,finalizerState:(e)=>`wf-finalizer-state:${n(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${n(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${n(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${n(e)}`,offload:(e,t)=>`offload:${n(e)}:${t}`,archive:(e,t)=>`archive:${n(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${n(e)}:${n(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${w}:${n(e)}:${n(t)}`,streamChunkPrefix:(e,t)=>`blob:${n(e)}:${t}:chunk:`,streamChunk:(e,t,r)=>`blob:${n(e)}:${t}:chunk:${String(r).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${n(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${n(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,r)=>`tool-effect:${n(e)}:${t}:${r}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${n(e)}:${n(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${n(e)}:${n(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${l(e)}:${n(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${l(e)}:${n(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${l(e)}:${n(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${n(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function ge(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function d(e){let t={},r=!1;for(let a of["gt","gte","lt","lte"]){let o=e[a];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[a]=o,r=!0}if(!r)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=ge(e.limit);if(i!==void 0)t.limit=i;return t}async function Y(e,t,r){let i=d(r);if(e.deleteRange)return e.deleteRange(t,i);return T(e,t,i)}function E(e){return e.replaceAll(/:+$/g,"")}function ue(e,t){let r=E(e),i=E(t);if(r.length===0)return i;if(i.length===0)return r;return`${r}:${i}`}class x{#e;#r;constructor(e,t){this.#e=e,this.#r=E(t)}#t(e){if(this.#r.length===0)return e;return e.length===0?`${this.#r}:`:`${this.#r}:${e}`}#n(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#t(t.key),value:t.value};return{type:"delete",key:this.#t(t.key)}})}#i(e){if(this.#r.length===0)return e;return e.slice(this.#r.length+1)}#a(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#t(e.gt);if(e.gte!==void 0)t.gte=this.#t(e.gte);if(e.lt!==void 0)t.lt=this.#t(e.lt);if(e.lte!==void 0)t.lte=this.#t(e.lte);return t}#o(e={}){let t=this.#a(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#s(e){return this.#a(e)}capabilities(){return this.#e.capabilities()}scoped(e){return new x(this.#e,ue(this.#r,e))}async get(e){return this.#e.get(this.#t(e))}async put(e,t){await this.#e.put(this.#t(e),t)}async delete(e){await this.#e.delete(this.#t(e))}async*scan(e,t){for await(let[r,i]of this.#e.scan(this.#t(e),this.#o(t)))yield[this.#i(r),i]}async batch(e){u("batch operations",e.length),await this.#e.batch(this.#n(e))}async conditionalBatch(e,t){return M(this.#e,e.map((r)=>({key:this.#t(r.key),expectedValue:r.expectedValue})),this.#n(t))}async has(e){return q(this.#e,this.#t(e))}async deletePrefix(e){return U(this.#e,this.#t(e))}async deleteRange(e,t){let r=this.#s(d(t));return Y(this.#e,this.#t(e),r)}async*keys(e,t){for await(let r of K(this.#e,this.#t(e),this.#o(t)))yield this.#i(r)}async count(e){return N(this.#e,this.#t(e))}[Symbol.dispose](){this.#e[Symbol.dispose]()}}function W(e,t){return new x(e,t)}import{createClient as he}from"@libsql/client";var pe=/^PRAGMA\b/iu,de=/^PRAGMA\s+(?:[A-Z_][A-Z0-9_]*\.)?[A-Z_][A-Z0-9_]*\s*$/iu,fe=/^SELECT\b/iu;function me(e){return e.trim().replace(/;+\s*$/u,"").trim()}function ye(e){return de.test(e)}function V(e){let t=me(e);if(t.length===0)throw Error("Storage query must not be empty.");if(t.includes(";"))throw Error("Storage query must contain exactly one read-only statement.");if(fe.test(t))return;if(pe.test(t)&&ye(t))return;throw Error("Storage query only supports read-only SELECT and PRAGMA statements.")}var Q=`CREATE TABLE IF NOT EXISTS kv (
|
|
3
3
|
key TEXT PRIMARY KEY,
|
|
4
4
|
value BLOB NOT NULL
|
|
5
|
-
) WITHOUT ROWID`,R="SELECT value FROM kv WHERE key = ?",
|
|
5
|
+
) WITHOUT ROWID`,R="SELECT value FROM kv WHERE key = ?",m="INSERT INTO kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",y="DELETE FROM kv WHERE key = ?",z="SELECT 1 AS present FROM kv WHERE key = ? LIMIT 1",F="SELECT COUNT(*) AS count FROM kv WHERE key >= ? AND key < ?",H="DELETE FROM kv WHERE key >= ? AND key < ?";function h(e){return[e,L(e)]}function X(e,t){let{gt:r,gte:i,lt:a,lte:o}=t,c=["key >= ? AND key < ?"],g=h(e);if(r!==void 0)c.push("key > ?"),g.push(r);if(i!==void 0)c.push("key >= ?"),g.push(i);if(a!==void 0)c.push("key < ?"),g.push(a);if(o!==void 0)c.push("key <= ?"),g.push(o);return{conditions:c,parameters:g}}function G(e,t={}){let{limit:r,reverse:i}=t,{conditions:a,parameters:o}=X(e,t),c=i?"DESC":"ASC",g=r!==void 0?" LIMIT ?":"";if(r!==void 0)o.push(r);return{parameters:o,sqlSuffix:`WHERE ${a.join(" AND ")} ORDER BY key ${c}${g}`}}function j(e,t,r="kv"){let{conditions:i,parameters:a}=X(e,t),o=i.join(" AND ");if(t.limit===void 0)return{parameters:a,sql:`DELETE FROM ${r} WHERE ${o}`};return a.push(t.limit),{parameters:a,sql:`DELETE FROM ${r} WHERE key IN (SELECT key FROM ${r} WHERE ${o} ORDER BY key ASC LIMIT ?)`}}function Z(e,t={}){let{parameters:r,sqlSuffix:i}=G(e,t);return{parameters:r,sql:`SELECT key, value FROM kv ${i}`}}function J(e,t={}){let{parameters:r,sqlSuffix:i}=G(e,t);return{parameters:r,sql:`SELECT key FROM kv ${i}`}}var ee=`${Q};`,f=10,Se=new Set(["SQLITE_BUSY","SQLITE_LOCKED"]);function te(e){return typeof e==="object"&&e!==null&&"code"in e&&typeof e.code==="string"&&Se.has(e.code)}async function we(e){return e.transaction("write")}async function be(e){try{await e.rollback()}catch{}}async function ne(e){await new Promise((t)=>{setTimeout(t,Math.min(e*5,50))})}async function $e(e,t){for(let r=1;r<=f;r++)try{await e.batch(t,"write");return}catch(i){if(!te(i)||r===f)throw i;await ne(r)}}async function Ee(e,t){for(let r of t){let a=(await e.execute({sql:R,args:[r.key]})).rows[0]?.value,o=a===null||a===void 0?null:new Uint8Array(a);if(!I(o,r.expectedValue))return!1}return!0}async function xe(e,t){for(let r of t)if(r.type==="put")await e.execute({sql:m,args:[r.key,r.value]});else await e.execute({sql:y,args:[r.key]})}function Re(e){if(e==="file::memory:"||e===":memory:")return"ephemeral";if(e.startsWith("file:"))return"local";return"remote"}class ve{#e;#r;#t=!1;constructor(e){this.#r=Re(e.url),this.#e=he(e.authToken?{url:e.url,authToken:e.authToken}:{url:e.url})}capabilities(){return{persistence:this.#r,readAfterWrite:"session",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}async#n(){if(this.#t)return;await this.#e.executeMultiple(ee),this.#t=!0}async get(e){await this.#n();let t=await this.#e.execute({sql:R,args:[e]});if(t.rows.length===0)return null;let r=t.rows[0].value;if(r===null||r===void 0)return null;return new Uint8Array(r)}async put(e,t){await this.#n(),await this.#e.execute({sql:m,args:[e,t]})}async delete(e){await this.#n(),await this.#e.execute({sql:y,args:[e]})}async has(e){return await this.#n(),(await this.#e.execute({sql:z,args:[e]})).rows.length>0}async deletePrefix(e){await this.#n();let[t,r]=h(e);return(await this.#e.execute({sql:H,args:[t,r]})).rowsAffected}async deleteRange(e,t){await this.#n();let r=d(t),{parameters:i,sql:a}=j(e,r);return(await this.#e.execute({sql:a,args:i})).rowsAffected}async*scan(e,t={}){await this.#n();let{parameters:r,sql:i}=Z(e,t),a=await this.#e.execute({sql:i,args:r});for(let o of a.rows){let{key:c,value:g}=o,re=new Uint8Array(g);yield[c,re]}}async*keys(e,t={}){await this.#n();let{parameters:r,sql:i}=J(e,t),a=await this.#e.execute({sql:i,args:r});for(let o of a.rows)yield o.key}async count(e){await this.#n();let[t,r]=h(e),i=await this.#e.execute({sql:F,args:[t,r]});return Number(i.rows[0]?.count??0)}scoped(e){return W(this,e)}async batch(e){if(u("batch operations",e.length),e.length===0)return;await this.#n();let t=e.map((r)=>{if(r.type==="put")return{sql:m,args:[r.key,r.value]};return{sql:y,args:[r.key]}});await $e(this.#e,t)}async conditionalBatch(e,t){u("conditionalBatch conditions",e.length),u("conditionalBatch operations",t.length),await this.#n();let r;for(let i=1;i<=f;i++){let a;try{if(a=await we(this.#e),await a.executeMultiple(ee),!await Ee(a,e))return await a.rollback(),!1;return await xe(a,t),await a.commit(),!0}catch(o){if(a!==void 0)await be(a);if(!te(o))throw o;if(r=o,i<f)await ne(i)}}throw Error(`conditionalBatch exhausted ${f} attempts after SQLite contention failures`,{cause:r})}async query(e,t){return await this.#n(),V(e),(await this.#e.execute({sql:e,args:t??[]})).rows}[Symbol.dispose](){this.#e.close()}}export{ve as TursoStorage};
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "0.
|
|
1
|
+
export const VERSION = "0.24.0";
|
package/dist/web-extension.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function A(e){let t=[];for(let n=0;n<e.length;n+=512)t.push(String.fromCharCode(...e.subarray(n,n+512)));return btoa(t.join(""))}function T(e){let t=atob(e),n=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)n[i]=t.charCodeAt(i);return n}function g(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}async function m(e,t){return await e.get(t)!==null}async function*c(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function b(e,t){let n=0;for await(let i of c(e,t))n++;return n}async function S(e,t){let n=[];for await(let i of c(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function w(e,t,n){let i=[];for await(let s of c(e,t,n))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function D(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}var _="default";function r(e){return encodeURIComponent(e)}var W={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var v=1e4;class N extends Error{code="StorageBatchOperationLimitExceededError";cap=v;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${v}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function u(e,t){if(t>v)throw new N(e,t)}function U(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"ÿ"}function L(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function Re(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function K(e,t){if(e.has)return e.has(t);return m(e,t)}function z(e,t,n){if(e.keys)return e.keys(t,n);return c(e,t,n)}async function M(e,t){if(e.count)return e.count(t);return b(e,t)}async function H(e,t){if(e.deletePrefix)return e.deletePrefix(t);return S(e,t)}async function V(e,t,n){if(u("conditionalBatch conditions",t.length),u("conditionalBatch operations",n.length),D(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var a=(e)=>String(e).padStart(16,"0"),X="0",Z="1",I=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Pe={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${a(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${a(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${a(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>I(e,t,n,Z),startSignal:(e,t,n)=>I(e,t,n,X),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${a(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${a(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${a(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${a(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${a(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...W,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${_}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${a(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${a(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${a(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function J(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},n=!1;for(let s of["gt","gte","lt","lte"]){let o=e[s];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[s]=o,n=!0}if(!n)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=J(e.limit);if(i!==void 0)t.limit=i;return t}async function Y(e,t,n){let i=f(n);if(e.deleteRange)return e.deleteRange(t,i);return w(e,t,i)}function ee(e,t){let n={key:e,open:!1};if(t.gte!==void 0&&t.gte>n.key)n.key=t.gte,n.open=!1;if(t.gt!==void 0&&t.gt>=n.key)n.key=t.gt,n.open=!0;return n}function te(e,t){let n={key:U(e),open:!0};if(t.lt!==void 0&&t.lt<=n.key)n.key=t.lt,n.open=!0;if(t.lte!==void 0&&t.lte<n.key)n.key=t.lte,n.open=!1;return n}function Ae(e,t){let n=ee(e,t),i=te(e,t);if(n.key>i.key||n.key===i.key&&(n.open||i.open))return null;return{lower:n,upper:i}}function E(e){return e.replaceAll(/:+$/g,"")}function ne(e,t){let n=E(e),i=E(t);if(n.length===0)return i;if(i.length===0)return n;return`${n}:${i}`}class k{#t;#n;constructor(e,t){this.#t=e,this.#n=E(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#o(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#i(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#s(e={}){let t=this.#i(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#c(e){return this.#i(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new k(this.#t,ne(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[n,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(n),i]}async batch(e){u("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return V(this.#t,e.map((n)=>({key:this.#e(n.key),expectedValue:n.expectedValue})),this.#r(t))}async has(e){return K(this.#t,this.#e(e))}async deletePrefix(e){return H(this.#t,this.#e(e))}async deleteRange(e,t){let n=this.#c(f(t));return Y(this.#t,this.#e(e),n)}async*keys(e,t){for await(let n of z(this.#t,this.#e(e),this.#s(t)))yield this.#o(n)}async count(e){return M(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function q(e,t){return new k(e,t)}var G=1,y="__weftStorageKeyspace",re=102400,ie=8192;function oe(e){return typeof e==="object"&&e!==null&&"then"in e&&typeof e.then==="function"}function O(e){if(!g(e))return!1;if(e.__weftStorage!==G)return!1;return typeof e.value==="string"}function se(e){if(!g(e))return!1;return Object.values(e).every(O)}function x(e){if(e!==y)return;throw Error(`WebExtensionStorage key "${y}" is reserved for adapter metadata.`)}function ae(e){for(let t of e)x(t.key)}function j(e){return{__weftStorage:G,value:A(e)}}function Q(e){if(!O(e))return null;return T(e.value)}function le(e){return O(e)}function R(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function ce(e){if(!g(e))return!1;if(e.runtime!==void 0&&!g(e.runtime))return!1;return e.storage===void 0||g(e.storage)}function ge(e){if(e!==void 0){if(!ce(e))throw Error("WebExtensionStorage injected namespace must be an object.");return e}let t=globalThis,n=t.browser??t.chrome;if(n?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return n}function ue(e,t){let n=e.storage?.[t];if(n===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return n}function de(e){if(e==="session")return"ephemeral";if(e==="sync"||e==="managed")return"remote";return"local"}function fe(e){let t=e.runtime?.lastError?.message;return t===void 0?null:Error(t)}async function P(e,t,n){return new Promise((i,s)=>{let o=!1,d=(l)=>{if(o)return;let B=fe(e);if(o=!0,B!==null)s(B);else i(l)},C=(l)=>{if(o)return;o=!0,s(l)},F=(l)=>d(l),h;try{h=t(F)}catch{try{h=n()}catch(l){C(l);return}}if(oe(h))h.then(d,C)})}class p{static#t=new WeakMap;#n;#e;#r;#o;#i;constructor(e={},t){this.#r=e.area??"local",this.#o=de(this.#r),this.#n=ge(t),this.#e=ue(this.#n,this.#r),this.#i=()=>{},this.#n.storage?.onChanged?.addListener?.(this.#i)}capabilities(){return{persistence:this.#o,readAfterWrite:"session",scanConsistency:"best-effort",atomicBatch:!1,conditionalBatch:!1,boundedRangeDelete:!1}}async#s(e){return P(this.#n,(t)=>this.#e.get(e,t),()=>this.#e.get(e))}async#c(e){await P(this.#n,(t)=>this.#e.set(e,t),()=>this.#e.set(e))}async#d(e){if(this.#e.getBytesInUse===void 0)return null;return P(this.#n,(t)=>this.#e.getBytesInUse?.(e,t),()=>this.#e.getBytesInUse?.(e))}async#a(){let t=(await this.#s(y))[y];if(t===void 0)return{};if(!se(t))throw Error("WebExtensionStorage keyspace is not a valid storage envelope map.");return{...t}}async#g(e){let t={[y]:e};await this.#y(t),await this.#c(t)}async#u(e){let t=p.#t.get(this.#e)??Promise.resolve(),n={},i=new Promise((o)=>{n.release=o}),s=t.catch(()=>{return}).then(()=>i);p.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(n.release?.(),p.#t.get(this.#e)===s)p.#t.delete(this.#e)}}#l(){if(this.#r==="managed")throw Error('WebExtensionStorage area "managed" is read-only.')}#f(e){let t=this.#e.QUOTA_BYTES_PER_ITEM??ie;for(let[n,i]of Object.entries(e)){let s=R({[n]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${n}": ${String(s)} > ${String(t)}.`)}}async#p(e){let t=Object.keys(e),n=await this.#d(null),i=await this.#d(t);if(n!==null&&i!==null)return n-i+R(e);let s=await this.#s(null);return R({...s,...e})}async#y(e){if(this.#r!=="sync")return;this.#f(e);let t=this.#e.QUOTA_BYTES??re,n=await this.#p(e);if(n>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(n)} > ${String(t)}.`)}async get(e){x(e);let t=await this.#a();return Q(t[e])}async put(e,t){this.#l(),x(e),await this.#u(async()=>{let n=await this.#a();n[e]=j(t),await this.#g(n)})}async delete(e){this.#l(),x(e),await this.#u(async()=>{let t=await this.#a();if(!(e in t))return;delete t[e],await this.#g(t)})}async*scan(e,t={}){let n=await this.#a(),i=Object.keys(n).filter((o)=>o.startsWith(e)).filter((o)=>L(o,t)).filter((o)=>le(n[o])).toSorted();if(t.reverse)i=i.toReversed();let s=0;for(let o of i){if(t.limit!==void 0&&s>=t.limit)break;let d=Q(n[o]);if(d===null)continue;yield[o,d],s+=1}}async batch(e){if(u("batch operations",e.length),this.#l(),e.length===0)return;ae(e),await this.#u(async()=>{let t=await this.#a();for(let n of e)if(n.type==="put")t[n.key]=j(n.value);else delete t[n.key];await this.#g(t)})}has(e){return m(this,e)}async*keys(e,t){yield*c(this,e,t)}count(e){return b(this,e)}async deletePrefix(e){return this.#l(),S(this,e)}async deleteRange(e,t){let n=f(t);return this.#l(),w(this,e,n)}scoped(e){return q(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{p as WebExtensionStorage};
|
|
1
|
+
function T(e){let t=[];for(let n=0;n<e.length;n+=512)t.push(String.fromCharCode(...e.subarray(n,n+512)));return btoa(t.join(""))}function D(e){let t=atob(e),n=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)n[i]=t.charCodeAt(i);return n}function u(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}async function b(e,t){return await e.get(t)!==null}async function*c(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function S(e,t){let n=0;for await(let i of c(e,t))n++;return n}async function w(e,t){let n=[];for await(let i of c(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function v(e,t,n){let i=[];for await(let s of c(e,t,n))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function _(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function r(e){return encodeURIComponent(e)}function l(e){return String(e).padStart(16,"0")}var W={catalogEntry:(e,t)=>`catalog-entry:${r(e)}:${r(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${r(e)}:`,catalogActive:(e)=>`catalog-active:${r(e)}`};var I="default";var K={applicationMailbox:(e,t)=>`appmbx:v1:${r(e)}:${r(t)}`,applicationMailboxSinkProbe:(e,t,n)=>`appprobe:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${r(e)}:${r(t)}:`,applicationCommand:(e,t,n)=>`appcmd:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${r(e)}:${r(t)}:`,applicationCommandReady:(e,t,n)=>`appready:v1:${r(e)}:${r(t)}:${l(n)}`,applicationCommandIdempotency:(e,t,n)=>`appidem:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${r(e)}:${r(t)}:`,applicationCommandBySequence:(e,t,n)=>`appseq:v1:${r(e)}:${r(t)}:${l(n)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${r(e)}:${r(t)}:`,applicationCommandTerminal:(e,t,n,i)=>`appterm:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`};var L={applicationOutbox:(e,t)=>`appobx:v1:${r(e)}:${r(t)}`,applicationOutboxSinkProbe:(e,t,n)=>`appprobe:v1:outbox:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${r(e)}:${r(t)}:`,applicationDelivery:(e,t,n)=>`appdlv:v1:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${r(e)}:${r(t)}:`,applicationDeliveryDue:(e,t,n,i)=>`appdue:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`,applicationDeliveryIdempotency:(e,t,n)=>`appdidem:v1:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${r(e)}:${r(t)}:`,applicationDeliveryBySequence:(e,t,n)=>`appdseq:v1:${r(e)}:${r(t)}:${l(n)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${r(e)}:${r(t)}:`,applicationDeliveryTerminal:(e,t,n,i)=>`appdterm:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`};var U={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var E=1e4;class z extends Error{code="StorageBatchOperationLimitExceededError";cap=E;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${E}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function d(e,t){if(t>E)throw new z(e,t)}function M(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"ÿ"}function q(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function Ue(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function Y(e,t){if(e.has)return e.has(t);return b(e,t)}function H(e,t,n){if(e.keys)return e.keys(t,n);return c(e,t,n)}async function V(e,t){if(e.count)return e.count(t);return S(e,t)}async function j(e,t){if(e.deletePrefix)return e.deletePrefix(t);return w(e,t)}async function G(e,t,n){if(d("conditionalBatch conditions",t.length),d("conditionalBatch operations",n.length),_(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var a=l,te="0",ne="1",N=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ne={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${a(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${a(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${a(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>N(e,t,n,ne),startSignal:(e,t,n)=>N(e,t,n,te),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${a(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${a(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${a(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${a(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${a(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...K,...L,...U,...W,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${I}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${a(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${a(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${a(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function re(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},n=!1;for(let s of["gt","gte","lt","lte"]){let o=e[s];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[s]=o,n=!0}if(!n)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=re(e.limit);if(i!==void 0)t.limit=i;return t}async function F(e,t,n){let i=f(n);if(e.deleteRange)return e.deleteRange(t,i);return v(e,t,i)}function ie(e,t){let n={key:e,open:!1};if(t.gte!==void 0&&t.gte>n.key)n.key=t.gte,n.open=!1;if(t.gt!==void 0&&t.gt>=n.key)n.key=t.gt,n.open=!0;return n}function oe(e,t){let n={key:M(e),open:!0};if(t.lt!==void 0&&t.lt<=n.key)n.key=t.lt,n.open=!0;if(t.lte!==void 0&&t.lte<n.key)n.key=t.lte,n.open=!1;return n}function Ye(e,t){let n=ie(e,t),i=oe(e,t);if(n.key>i.key||n.key===i.key&&(n.open||i.open))return null;return{lower:n,upper:i}}function k(e){return e.replaceAll(/:+$/g,"")}function se(e,t){let n=k(e),i=k(t);if(n.length===0)return i;if(i.length===0)return n;return`${n}:${i}`}class P{#t;#n;constructor(e,t){this.#t=e,this.#n=k(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#o(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#i(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#s(e={}){let t=this.#i(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#g(e){return this.#i(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new P(this.#t,se(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[n,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(n),i]}async batch(e){d("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return G(this.#t,e.map((n)=>({key:this.#e(n.key),expectedValue:n.expectedValue})),this.#r(t))}async has(e){return Y(this.#t,this.#e(e))}async deletePrefix(e){return j(this.#t,this.#e(e))}async deleteRange(e,t){let n=this.#g(f(t));return F(this.#t,this.#e(e),n)}async*keys(e,t){for await(let n of H(this.#t,this.#e(e),this.#s(t)))yield this.#o(n)}async count(e){return V(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function Q(e,t){return new P(e,t)}var J=1,y="__weftStorageKeyspace",ae=102400,le=8192;function ge(e){return typeof e==="object"&&e!==null&&"then"in e&&typeof e.then==="function"}function C(e){if(!u(e))return!1;if(e.__weftStorage!==J)return!1;return typeof e.value==="string"}function ce(e){if(!u(e))return!1;return Object.values(e).every(C)}function x(e){if(e!==y)return;throw Error(`WebExtensionStorage key "${y}" is reserved for adapter metadata.`)}function ue(e){for(let t of e)x(t.key)}function X(e){return{__weftStorage:J,value:T(e)}}function Z(e){if(!C(e))return null;return D(e.value)}function de(e){return C(e)}function O(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function pe(e){if(!u(e))return!1;if(e.runtime!==void 0&&!u(e.runtime))return!1;return e.storage===void 0||u(e.storage)}function fe(e){if(e!==void 0){if(!pe(e))throw Error("WebExtensionStorage injected namespace must be an object.");return e}let t=globalThis,n=t.browser??t.chrome;if(n?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return n}function me(e,t){let n=e.storage?.[t];if(n===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return n}function ye(e){if(e==="session")return"ephemeral";if(e==="sync"||e==="managed")return"remote";return"local"}function he(e){let t=e.runtime?.lastError?.message;return t===void 0?null:Error(t)}async function R(e,t,n){return new Promise((i,s)=>{let o=!1,p=(g)=>{if(o)return;let A=he(e);if(o=!0,A!==null)s(A);else i(g)},B=(g)=>{if(o)return;o=!0,s(g)},ee=(g)=>p(g),h;try{h=t(ee)}catch{try{h=n()}catch(g){B(g);return}}if(ge(h))h.then(p,B)})}class m{static#t=new WeakMap;#n;#e;#r;#o;#i;constructor(e={},t){this.#r=e.area??"local",this.#o=ye(this.#r),this.#n=fe(t),this.#e=me(this.#n,this.#r),this.#i=()=>{},this.#n.storage?.onChanged?.addListener?.(this.#i)}capabilities(){return{persistence:this.#o,readAfterWrite:"session",scanConsistency:"best-effort",atomicBatch:!1,conditionalBatch:!1,boundedRangeDelete:!1}}async#s(e){return R(this.#n,(t)=>this.#e.get(e,t),()=>this.#e.get(e))}async#g(e){await R(this.#n,(t)=>this.#e.set(e,t),()=>this.#e.set(e))}async#d(e){if(this.#e.getBytesInUse===void 0)return null;return R(this.#n,(t)=>this.#e.getBytesInUse?.(e,t),()=>this.#e.getBytesInUse?.(e))}async#a(){let t=(await this.#s(y))[y];if(t===void 0)return{};if(!ce(t))throw Error("WebExtensionStorage keyspace is not a valid storage envelope map.");return{...t}}async#c(e){let t={[y]:e};await this.#m(t),await this.#g(t)}async#u(e){let t=m.#t.get(this.#e)??Promise.resolve(),n={},i=new Promise((o)=>{n.release=o}),s=t.catch(()=>{return}).then(()=>i);m.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(n.release?.(),m.#t.get(this.#e)===s)m.#t.delete(this.#e)}}#l(){if(this.#r==="managed")throw Error('WebExtensionStorage area "managed" is read-only.')}#p(e){let t=this.#e.QUOTA_BYTES_PER_ITEM??le;for(let[n,i]of Object.entries(e)){let s=O({[n]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${n}": ${String(s)} > ${String(t)}.`)}}async#f(e){let t=Object.keys(e),n=await this.#d(null),i=await this.#d(t);if(n!==null&&i!==null)return n-i+O(e);let s=await this.#s(null);return O({...s,...e})}async#m(e){if(this.#r!=="sync")return;this.#p(e);let t=this.#e.QUOTA_BYTES??ae,n=await this.#f(e);if(n>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(n)} > ${String(t)}.`)}async get(e){x(e);let t=await this.#a();return Z(t[e])}async put(e,t){this.#l(),x(e),await this.#u(async()=>{let n=await this.#a();n[e]=X(t),await this.#c(n)})}async delete(e){this.#l(),x(e),await this.#u(async()=>{let t=await this.#a();if(!(e in t))return;delete t[e],await this.#c(t)})}async*scan(e,t={}){let n=await this.#a(),i=Object.keys(n).filter((o)=>o.startsWith(e)).filter((o)=>q(o,t)).filter((o)=>de(n[o])).toSorted();if(t.reverse)i=i.toReversed();let s=0;for(let o of i){if(t.limit!==void 0&&s>=t.limit)break;let p=Z(n[o]);if(p===null)continue;yield[o,p],s+=1}}async batch(e){if(d("batch operations",e.length),this.#l(),e.length===0)return;ue(e),await this.#u(async()=>{let t=await this.#a();for(let n of e)if(n.type==="put")t[n.key]=X(n.value);else delete t[n.key];await this.#c(t)})}has(e){return b(this,e)}async*keys(e,t){yield*c(this,e,t)}count(e){return S(this,e)}async deletePrefix(e){return this.#l(),w(this,e)}async deleteRange(e,t){let n=f(t);return this.#l(),v(this,e,n)}scoped(e){return Q(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{m as WebExtensionStorage};
|
|
@@ -7,9 +7,27 @@
|
|
|
7
7
|
* manifest — see {@link declaredShapeDigest}. This module is that build
|
|
8
8
|
* tooling: it derives `WorkerWorkflowContract`/`WorkerActivityContract`
|
|
9
9
|
* values from the *same* normalized representation `buildRegistrySnapshot`
|
|
10
|
-
* produces for `GET /v1/registry` and `weft codegen`, hashed
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* produces for `GET /v1/registry` and `weft codegen`, hashed via
|
|
11
|
+
* `core/contract`'s canonical `contractHash()`/`activityContractHash()`/
|
|
12
|
+
* `deriveWorkflowRevision()` (WFT-5) — the same normalized-contract vocabulary
|
|
13
|
+
* `weft codegen` and `WorkflowRevisionManifest` use, rather than this
|
|
14
|
+
* module's own ad hoc hashing (as it did before WFT-5).
|
|
15
|
+
*
|
|
16
|
+
* **WFT-5 digest-value change.** `contractHash`/`workflowRevision` here now
|
|
17
|
+
* fold in a `contractVersion` domain separator (`WORKFLOW_CONTRACT_VERSION`)
|
|
18
|
+
* that the pre-WFT-5 formula never had, so digest *strings* for an
|
|
19
|
+
* otherwise-unchanged registration differ from 0.23.x output — see
|
|
20
|
+
* `CHANGELOG.md`. `workflowRevision` also now derives from a `WorkflowContract`
|
|
21
|
+
* that omits `queue`/`retry`/`timeout` (registry-only activity metadata with
|
|
22
|
+
* no contract-identity meaning), which the pre-WFT-5 formula's
|
|
23
|
+
* `{ ...entry, version }` spread incidentally included; this is a narrowing,
|
|
24
|
+
* not a behavior a caller could rely on. `contractHash` also now folds in
|
|
25
|
+
* whichever activities `options.workflows[type]` names (previously
|
|
26
|
+
* independent of that list, since only the activity's *own* schema was
|
|
27
|
+
* hashed) — declaring a different activity subset for the same workflow type
|
|
28
|
+
* now changes `contractHash`, which is the intended effect of a contract
|
|
29
|
+
* identity that is supposed to answer "what can a caller do with this
|
|
30
|
+
* workflow", not just "what does the workflow's own input/output look like".
|
|
13
31
|
*
|
|
14
32
|
* Intended use is a build script: construct an `Engine` with every workflow
|
|
15
33
|
* the artifact bundles registered (never started), call
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
activityContractHash,
|
|
3
|
+
contractHash,
|
|
4
|
+
deriveWorkflowRevision
|
|
5
|
+
} from "../../core/contract/index.js";
|
|
6
|
+
import { buildActivityEntry } from "../../core/registry-snapshot.js";
|
|
7
|
+
import { buildWorkflowManifestForType } from "../../core/registry-workflow-manifest.js";
|
|
4
8
|
import { WeftError } from "../../core/weft-error.js";
|
|
5
9
|
import { VERSION } from "../../version.js";
|
|
6
10
|
import { REMOTE_WORKER_PROTOCOL_VERSION } from "../protocol.js";
|
|
7
|
-
import { canonicalJsonStringify } from "./canonical-json.js";
|
|
8
|
-
import { sha256Hex } from "./content-digest.js";
|
|
9
11
|
import { WORKER_MANIFEST_VERSION } from "./types.js";
|
|
10
12
|
|
|
11
13
|
export class WorkerManifestBuildError extends WeftError {
|
|
@@ -13,43 +15,50 @@ export class WorkerManifestBuildError extends WeftError {
|
|
|
13
15
|
super("WorkerManifestBuildError", message);
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
|
-
function
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
18
|
+
async function findWorkflowManifest(engine, workflowType) {
|
|
19
|
+
const manifest = await buildWorkflowManifestForType(engine, workflowType);
|
|
20
|
+
if (manifest === void 0)
|
|
19
21
|
throw new WorkerManifestBuildError(`Cannot build a worker manifest: workflow type "${workflowType}" is not registered on the source Engine.`);
|
|
20
|
-
return
|
|
22
|
+
return manifest;
|
|
21
23
|
}
|
|
22
|
-
function findActivityEntry(
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
24
|
+
function findActivityEntry(engine, workflowType, activityName) {
|
|
25
|
+
const metadata = engine.getWorkflowActivityDefinition(workflowType, activityName);
|
|
26
|
+
if (metadata === void 0)
|
|
25
27
|
throw new WorkerManifestBuildError(`Cannot build a worker manifest: activity "${activityName}" declared under workflow "${workflowType}" is not registered on the source Engine.`);
|
|
26
|
-
return
|
|
28
|
+
return buildActivityEntry(metadata);
|
|
27
29
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function activityContractPayload(entry) {
|
|
38
|
-
return { inputSchema: entry.inputSchema, outputSchema: entry.outputSchema };
|
|
30
|
+
function toActivityContract(entry) {
|
|
31
|
+
const contract = {};
|
|
32
|
+
if (entry.inputSchema !== void 0)
|
|
33
|
+
contract.inputSchema = entry.inputSchema;
|
|
34
|
+
if (entry.outputSchema !== void 0)
|
|
35
|
+
contract.outputSchema = entry.outputSchema;
|
|
36
|
+
return contract;
|
|
39
37
|
}
|
|
40
|
-
async function buildActivityContract(
|
|
41
|
-
const entry = findActivityEntry(
|
|
42
|
-
return { contractHash: await
|
|
38
|
+
async function buildActivityContract(engine, workflowType, activityName, implementationRevision) {
|
|
39
|
+
const entry = findActivityEntry(engine, workflowType, activityName);
|
|
40
|
+
return { contractHash: await activityContractHash(toActivityContract(entry)), implementationRevision };
|
|
43
41
|
}
|
|
44
|
-
async function buildWorkflowContract(
|
|
45
|
-
const
|
|
42
|
+
async function buildWorkflowContract(engine, workflowType, activityNames, implementationRevision) {
|
|
43
|
+
const manifest = await findWorkflowManifest(engine, workflowType), workflowVersion = manifest.contract.workflowVersion, sortedActivityNames = [...activityNames].toSorted(), activities = Object.create(null);
|
|
44
|
+
for (const activityName of sortedActivityNames)
|
|
45
|
+
activities[activityName] = toActivityContract(findActivityEntry(engine, workflowType, activityName));
|
|
46
|
+
const baseContract = manifest.contract, contractForHash = Object.keys(activities).length > 0 ? { ...baseContract, activities } : baseContract, [hash, revision] = await Promise.all([
|
|
47
|
+
contractHash(contractForHash),
|
|
48
|
+
deriveWorkflowRevision(contractForHash)
|
|
49
|
+
]), activityContracts = await Promise.all(sortedActivityNames.map((activityName) => buildActivityContract(engine, workflowType, activityName, implementationRevision))), workerActivities = Object.create(null);
|
|
46
50
|
sortedActivityNames.forEach((activityName, index) => {
|
|
47
|
-
|
|
51
|
+
workerActivities[activityName] = activityContracts[index];
|
|
48
52
|
});
|
|
49
|
-
return {
|
|
53
|
+
return {
|
|
54
|
+
workflowVersion,
|
|
55
|
+
workflowRevision: revision,
|
|
56
|
+
contractHash: hash,
|
|
57
|
+
activities: workerActivities
|
|
58
|
+
};
|
|
50
59
|
}
|
|
51
60
|
export async function buildWorkerManifestFromRegistry(engine, options) {
|
|
52
|
-
const
|
|
61
|
+
const sortedWorkflowTypes = Object.keys(options.workflows).toSorted(), workflowContracts = await Promise.all(sortedWorkflowTypes.map((workflowType) => buildWorkflowContract(engine, workflowType, options.workflows[workflowType] ?? [], options.deployment.buildId))), workflows = Object.create(null);
|
|
53
62
|
sortedWorkflowTypes.forEach((workflowType, index) => {
|
|
54
63
|
workflows[workflowType] = workflowContracts[index];
|
|
55
64
|
});
|