@lostgradient/weft 0.24.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli/conformance.js +5 -2
- package/dist/cli/generated/operation-catalog.snapshot.json +95 -1
- package/dist/cli/generated/operation-client.generated.d.ts +28 -2
- package/dist/cli/generated/operation-client.generated.js +2 -0
- package/dist/cli/parse-schedule-arguments.js +15 -3
- package/dist/cli/schedule.js +2 -1
- package/dist/cli/types.d.ts +2 -1
- package/dist/client/http-client-requests.js +6 -9
- package/dist/client/start-body.js +1 -0
- package/dist/core/catalog/index.d.ts +2 -2
- package/dist/core/catalog/index.js +9 -2
- package/dist/core/catalog/reference-counts.d.ts +29 -14
- package/dist/core/catalog/removal.d.ts +63 -10
- package/dist/core/catalog/removal.js +18 -2
- package/dist/core/catalog/storage-io.d.ts +23 -0
- package/dist/core/catalog/storage-io.js +1 -1
- package/dist/core/engine/activity-resolution.js +17 -17
- package/dist/core/engine/bulk-operations-purge.js +14 -20
- package/dist/core/engine/bulk-operations-retry.d.ts +9 -0
- package/dist/core/engine/bulk-operations-retry.js +177 -0
- package/dist/core/engine/bulk-operations-shared.d.ts +18 -0
- package/dist/core/engine/bulk-operations-shared.js +14 -0
- package/dist/core/engine/bulk-operations.js +8 -167
- package/dist/core/engine/callback-creators-bundles.js +4 -2
- package/dist/core/engine/callback-creators-core.js +9 -1
- package/dist/core/engine/callback-creators-schedule.js +2 -2
- package/dist/core/engine/catalog-readiness.js +2 -0
- package/dist/core/engine/catalog-removal.d.ts +107 -3
- package/dist/core/engine/catalog-removal.js +66 -13
- package/dist/core/engine/catalog-tombstone-recovery.d.ts +56 -0
- package/dist/core/engine/catalog-tombstone-recovery.js +39 -0
- package/dist/core/engine/constraints.js +5 -1
- package/dist/core/engine/construction.d.ts +1 -1
- package/dist/core/engine/decode-revision.d.ts +32 -0
- package/dist/core/engine/decode-revision.js +9 -0
- package/dist/core/engine/disposal.d.ts +6 -2
- package/dist/core/engine/disposal.js +24 -10
- package/dist/core/engine/dynamic-source-errors.d.ts +81 -0
- package/dist/core/engine/dynamic-source-errors.js +25 -0
- package/dist/core/engine/dynamic-source-execution.d.ts +173 -0
- package/dist/core/engine/dynamic-source-execution.js +108 -0
- package/dist/core/engine/engine-internal-types.d.ts +16 -0
- package/dist/core/engine/engine-workflows-namespace.d.ts +10 -0
- package/dist/core/engine/engine-workflows-namespace.js +3 -1
- package/dist/core/engine/index.d.ts +18 -10
- package/dist/core/engine/index.js +21 -10
- package/dist/core/engine/inline-launch-queue.js +1 -1
- package/dist/core/engine/internals.d.ts +26 -30
- package/dist/core/engine/lifecycle/checkpoint-launch.d.ts +29 -0
- package/dist/core/engine/lifecycle/checkpoint-launch.js +75 -0
- package/dist/core/engine/lifecycle/delayed-start-registration.d.ts +30 -0
- package/dist/core/engine/lifecycle/delayed-start-registration.js +11 -0
- package/dist/core/engine/lifecycle/fork-helpers.d.ts +33 -1
- package/dist/core/engine/lifecycle/fork-helpers.js +3 -1
- package/dist/core/engine/lifecycle/recovery-revision-groups.d.ts +75 -0
- package/dist/core/engine/lifecycle/recovery-revision-groups.js +64 -0
- package/dist/core/engine/lifecycle/resume-generation-guard.d.ts +58 -0
- package/dist/core/engine/lifecycle/resume-generation-guard.js +11 -0
- package/dist/core/engine/lifecycle/resume.js +18 -9
- package/dist/core/engine/lifecycle/shared.d.ts +43 -0
- package/dist/core/engine/lifecycle/standalone-claim-acquire.d.ts +12 -0
- package/dist/core/engine/lifecycle/standalone-claim-acquire.js +6 -0
- package/dist/core/engine/lifecycle/start-commit-errors.d.ts +12 -0
- package/dist/core/engine/lifecycle/start-commit-errors.js +6 -0
- package/dist/core/engine/lifecycle/start-commit.d.ts +22 -7
- package/dist/core/engine/lifecycle/start-commit.js +49 -15
- package/dist/core/engine/lifecycle/start-exec.d.ts +18 -2
- package/dist/core/engine/lifecycle/start-exec.js +7 -5
- package/dist/core/engine/lifecycle/start-or-signal-create.js +1 -3
- package/dist/core/engine/lifecycle/start-or-signal.js +1 -1
- package/dist/core/engine/lifecycle/start-precondition-attribution.d.ts +49 -0
- package/dist/core/engine/lifecycle/start-precondition-attribution.js +13 -0
- package/dist/core/engine/lifecycle/start-revision-resolution.d.ts +34 -0
- package/dist/core/engine/lifecycle/start-revision-resolution.js +11 -0
- package/dist/core/engine/lifecycle/start-state.d.ts +16 -0
- package/dist/core/engine/lifecycle/start-state.js +60 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +66 -3
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +13 -3
- package/dist/core/engine/lifecycle/start.d.ts +16 -6
- package/dist/core/engine/lifecycle/start.js +38 -68
- package/dist/core/engine/lifecycle/transition.d.ts +3 -4
- package/dist/core/engine/lifecycle/transition.js +30 -80
- package/dist/core/engine/lifecycle.d.ts +4 -2
- package/dist/core/engine/lifecycle.js +6 -6
- package/dist/core/engine/listing.js +15 -1
- package/dist/core/engine/memo-durable-activity.js +4 -1
- package/dist/core/engine/nonterminal-revision-count.d.ts +25 -0
- package/dist/core/engine/nonterminal-revision-count.js +16 -0
- package/dist/core/engine/operations-time.d.ts +5 -23
- package/dist/core/engine/operations-time.js +13 -11
- package/dist/core/engine/ownership-bootstrap.d.ts +1 -1
- package/dist/core/engine/pinned-schedule-revision-count.d.ts +26 -0
- package/dist/core/engine/pinned-schedule-revision-count.js +19 -0
- package/dist/core/engine/pinned-schedule-revision.d.ts +76 -0
- package/dist/core/engine/pinned-schedule-revision.js +53 -0
- package/dist/core/engine/registration.d.ts +30 -0
- package/dist/core/engine/registration.js +17 -2
- package/dist/core/engine/retention.js +9 -2
- package/dist/core/engine/revision-errors.d.ts +71 -0
- package/dist/core/engine/revision-errors.js +13 -0
- package/dist/core/engine/schedule-revision-fire.d.ts +17 -0
- package/dist/core/engine/schedule-revision-fire.js +3 -0
- package/dist/core/engine/schedule-run.js +2 -1
- package/dist/core/engine/schedules.d.ts +2 -1
- package/dist/core/engine/schedules.js +28 -9
- package/dist/core/engine/source-diagnostics.d.ts +76 -0
- package/dist/core/engine/source-diagnostics.js +105 -0
- package/dist/core/engine/source-registration.js +4 -2
- package/dist/core/engine/source-resolution.d.ts +25 -9
- package/dist/core/engine/source-resolution.js +49 -14
- package/dist/core/engine/source-runtime-state.d.ts +92 -0
- package/dist/core/engine/source-runtime-state.js +36 -0
- package/dist/core/engine/storage-io.d.ts +19 -2
- package/dist/core/engine/storage-io.js +21 -2
- package/dist/core/engine/termination/finalizer-registration.d.ts +18 -0
- package/dist/core/engine/termination/finalizer-registration.js +21 -0
- package/dist/core/engine/termination/finalizer.d.ts +16 -19
- package/dist/core/engine/termination/finalizer.js +3 -3
- package/dist/core/engine/time-operation-callbacks.d.ts +32 -0
- package/dist/core/engine/time-operation-callbacks.js +0 -0
- package/dist/core/engine/validation/schedule-cadence.d.ts +16 -0
- package/dist/core/engine/validation/schedule-cadence.js +20 -0
- package/dist/core/engine/validation/schedule-options.d.ts +4 -1
- package/dist/core/engine/validation/schedule-options.js +14 -0
- package/dist/core/engine/validation/schedule-revision.d.ts +24 -0
- package/dist/core/engine/validation/schedule-revision.js +21 -0
- package/dist/core/engine/validation/schedule-warnings.d.ts +11 -0
- package/dist/core/engine/validation/schedule-warnings.js +5 -0
- package/dist/core/engine/validation/schedule.d.ts +4 -3
- package/dist/core/engine/validation/schedule.js +15 -26
- package/dist/core/engine/validation.js +3 -0
- package/dist/core/engine/workflow-claim-reclaim-target.d.ts +1 -1
- package/dist/core/engine/workflow-claim-reclaim-target.js +16 -2
- package/dist/core/engine/workflow-retention-deadline.d.ts +16 -0
- package/dist/core/engine/workflow-retention-deadline.js +33 -0
- package/dist/core/events/event-map.d.ts +5 -0
- package/dist/core/events/index.d.ts +1 -0
- package/dist/core/events/index.js +1 -0
- package/dist/core/events/workflow-source-events.d.ts +102 -0
- package/dist/core/events/workflow-source-events.js +57 -0
- package/dist/core/execution-strategy.d.ts +7 -0
- package/dist/core/inline-execution-strategy.context-options.d.ts +1 -1
- package/dist/core/inline-execution-strategy.js +1 -1
- package/dist/core/types/checkpoint.d.ts +14 -0
- package/dist/core/types/schedules.d.ts +52 -1
- package/dist/core/types/state.d.ts +16 -0
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +4 -1
- package/dist/core/worker-execution-strategy.d.ts +1 -0
- package/dist/core/worker-execution-strategy.js +13 -1
- package/dist/core/worker-fault-handling.d.ts +10 -0
- package/dist/core/worker-fault-handling.js +1 -0
- package/dist/core/worker-inbound-message.d.ts +1 -0
- package/dist/core/worker-inbound-message.js +1 -0
- package/dist/core/worker-protocol-guard.js +4 -0
- package/dist/core/worker-protocol.d.ts +7 -0
- package/dist/core/worker-protocol.js +2 -1
- package/dist/core/worker-turn-watchdog.d.ts +8 -1
- package/dist/core/worker-turn-watchdog.js +3 -2
- package/dist/diagnostics/format.js +5 -0
- package/dist/diagnostics/types.d.ts +24 -0
- package/dist/diagnostics/version-check.js +8 -2
- package/dist/http.js +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +7 -0
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +3 -3
- package/dist/server/fault-to-json-rpc.js +2 -1
- package/dist/server/index.d.ts +11 -0
- package/dist/server/operation-fault.d.ts +2 -0
- package/dist/server/operation-fault.js +2 -1
- package/dist/server/operations/create-schedule.d.ts +2 -0
- package/dist/server/operations/create-schedule.js +10 -6
- package/dist/server/operations/get-catalog-diagnostics.d.ts +28 -0
- package/dist/server/operations/get-catalog-diagnostics.js +10 -2
- package/dist/server/operations/get-task-detail-schema.d.ts +8 -0
- package/dist/server/operations/get-task-detail-schema.js +1 -0
- package/dist/server/operations/get-task-detail.d.ts +8 -0
- package/dist/server/operations/get-task-detail.js +1 -0
- package/dist/server/operations/get-task-diagnostics.d.ts +4 -4
- package/dist/server/operations/preload-workflow-revision.d.ts +28 -0
- package/dist/server/operations/preload-workflow-revision.js +60 -0
- package/dist/server/operations/schedule-faults.d.ts +1 -0
- package/dist/server/operations/schedule-faults.js +32 -4
- package/dist/server/operations/schedule-rest-body.d.ts +1 -0
- package/dist/server/operations/schedule-rest-body.js +2 -1
- package/dist/server/operations/static-registrations.js +6 -0
- package/dist/server/operations/update-schedule.d.ts +2 -0
- package/dist/server/operations/update-schedule.js +4 -2
- package/dist/server/operations/workflow-catalog-operation-helpers.js +27 -0
- package/dist/server/runtime/task-dispatch-envelope.d.ts +14 -0
- package/dist/server/runtime/task-dispatch-envelope.js +32 -0
- package/dist/server/runtime/task-dispatch-revision.d.ts +29 -0
- package/dist/server/runtime/task-dispatch-revision.js +13 -0
- package/dist/server/runtime/task-dispatch.js +12 -37
- package/dist/server/runtime/task-ledger-recovery.js +1 -1
- package/dist/server/runtime/task-ledger-runtime.d.ts +14 -2
- package/dist/server/runtime/task-ledger-runtime.js +5 -3
- package/dist/server/runtime/task-polling.js +9 -3
- package/dist/server/runtime/task-reconciliation.js +2 -1
- package/dist/server/runtime/websocket-worker.js +9 -0
- package/dist/server/task-ledger-codec.d.ts +9 -0
- package/dist/server/task-ledger-codec.js +4 -1
- package/dist/server/task-ledger-transition-helpers.js +1 -0
- package/dist/server/task-ledger-types.d.ts +9 -0
- package/dist/server/task-ledger.d.ts +1 -1
- package/dist/server/task-ledger.js +2 -1
- package/dist/server/task-queue-types.d.ts +2 -0
- package/dist/storage/bun-sql.js +3 -1
- package/dist/storage/catalog-keys.d.ts +19 -0
- package/dist/storage/catalog-keys.js +3 -1
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/index.d.ts +3 -1
- package/dist/storage/interface.d.ts +2 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +1 -0
- package/dist/storage/lmdb.d.ts +30 -2
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +2 -2
- package/dist/storage/node-sqlite.js +3 -1
- 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/testing.js +1 -1
- package/dist/storage/turso.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/protocol-messages.d.ts +17 -0
- package/dist/worker/protocol-schemas.d.ts +32 -0
- package/dist/worker/protocol-schemas.js +7 -3
- package/dist/worker/protocol-task-result.js +35 -3
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/types.d.ts +2 -0
- package/dist/worker/registry.d.ts +1 -1
- package/dist/worker/registry.js +3 -1
- package/dist/workers/workflow-runner.d.ts +9 -0
- package/dist/workers/workflow-runner.js +9 -2
- package/dist/workers/workflow-worker-entry.js +9 -4
- package/package.json +2 -2
package/dist/storage/testing.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
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};
|
|
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 p(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)}`,catalogTombstone:(t,e)=>`catalog-tombstone:${a(t)}:${a(e)}`,catalogTombstonePrefix:()=>"catalog-tombstone:"};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)}:${p(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)}:${p(n)}`,applicationCommandTerminalPrefix:(t,e)=>`appterm:v1:${a(t)}:${a(e)}:`,applicationCommandTerminal:(t,e,n,r)=>`appterm:v1:${a(t)}:${a(e)}:${p(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)}:${p(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)}:${p(n)}`,applicationDeliveryTerminalPrefix:(t,e)=>`appdterm:v1:${a(t)}:${a(e)}:`,applicationDeliveryTerminal:(t,e,n,r)=>`appdterm:v1:${a(t)}:${a(e)}:${p(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:","catalog-tombstone:","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=p,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 l}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`,()=>{l("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]()}}),l("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(l("reports a well-formed capability shape",async()=>{using o=await n();D(o)}),l("reports the expected capability row",async()=>{using o=await n();s(o.capabilities()).toEqual(r)}),l("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")l("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)l("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")}),l("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`,()=>{l("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`,()=>{l("get on empty storage returns null",async()=>{using r=await n();let o=await r.get("nonexistent");s(o).toBeNull()}),l("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)}),l("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")}),l("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()}),l("delete on a missing key is a no-op",async()=>{using r=await n();await r.delete("nonexistent"),s(await r.get("nonexistent")).toBeNull()}),l("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"])}),l("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"])}),l("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"])}),l("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"])}),l("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"])}),l("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)}),l("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"))}),l("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"))}),l("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"))}),l("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"])}),l("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 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 (
|
|
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)}`,catalogTombstone:(e,t)=>`catalog-tombstone:${n(e)}:${n(t)}`,catalogTombstonePrefix:()=>"catalog-tombstone:"};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 T(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 k(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:","catalog-tombstone:","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 T(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 k(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
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.24.
|
|
1
|
+
export const VERSION = "0.24.1";
|
package/dist/web-extension.js
CHANGED
|
@@ -1 +1 @@
|
|
|
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};
|
|
1
|
+
function T(e){let t=[];for(let r=0;r<e.length;r+=512)t.push(String.fromCharCode(...e.subarray(r,r+512)));return btoa(t.join(""))}function D(e){let t=atob(e),r=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)r[i]=t.charCodeAt(i);return r}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,r){for await(let[i]of e.scan(t,r))yield i}async function S(e,t){let r=0;for await(let i of c(e,t))r++;return r}async function w(e,t){let r=[];for await(let i of c(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 s of c(e,t,r))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function _(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function n(e){return encodeURIComponent(e)}function l(e){return String(e).padStart(16,"0")}var W={catalogEntry:(e,t)=>`catalog-entry:${n(e)}:${n(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${n(e)}:`,catalogActive:(e)=>`catalog-active:${n(e)}`,catalogTombstone:(e,t)=>`catalog-tombstone:${n(e)}:${n(t)}`,catalogTombstonePrefix:()=>"catalog-tombstone:"};var I="default";var K={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)}:${l(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)}:${l(r)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${n(e)}:${n(t)}:`,applicationCommandTerminal:(e,t,r,i)=>`appterm:v1:${n(e)}:${n(t)}:${l(r)}:${n(i)}`};var L={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)}:${l(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)}:${l(r)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${n(e)}:${n(t)}:`,applicationDeliveryTerminal:(e,t,r,i)=>`appdterm:v1:${n(e)}:${n(t)}:${l(r)}:${n(i)}`};var U={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(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 r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function Y(e,t){if(e.has)return e.has(t);return b(e,t)}function H(e,t,r){if(e.keys)return e.keys(t,r);return c(e,t,r)}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,r){if(d("conditionalBatch conditions",t.length),d("conditionalBatch operations",r.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,r)}var a=l,te="0",ne="1",N=(e,t,r,i)=>`sig:${n(e)}:${n(t)}:${i}:${n(r)}`,Ne={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)=>N(e,t,r,ne),startSignal:(e,t,r)=>N(e,t,r,te),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",...K,...L,...U,...W,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:${I}:${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 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={},r=!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,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=re(e.limit);if(i!==void 0)t.limit=i;return t}async function F(e,t,r){let i=f(r);if(e.deleteRange)return e.deleteRange(t,i);return v(e,t,i)}function ie(e,t){let r={key:e,open:!1};if(t.gte!==void 0&&t.gte>r.key)r.key=t.gte,r.open=!1;if(t.gt!==void 0&&t.gt>=r.key)r.key=t.gt,r.open=!0;return r}function oe(e,t){let r={key:M(e),open:!0};if(t.lt!==void 0&&t.lt<=r.key)r.key=t.lt,r.open=!0;if(t.lte!==void 0&&t.lte<r.key)r.key=t.lte,r.open=!1;return r}function Ye(e,t){let r=ie(e,t),i=oe(e,t);if(r.key>i.key||r.key===i.key&&(r.open||i.open))return null;return{lower:r,upper:i}}function k(e){return e.replaceAll(/:+$/g,"")}function se(e,t){let r=k(e),i=k(t);if(r.length===0)return i;if(i.length===0)return r;return`${r}:${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[r,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(r),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((r)=>({key:this.#e(r.key),expectedValue:r.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 r=this.#g(f(t));return F(this.#t,this.#e(e),r)}async*keys(e,t){for await(let r of H(this.#t,this.#e(e),this.#s(t)))yield this.#o(r)}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,r=t.browser??t.chrome;if(r?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return r}function me(e,t){let r=e.storage?.[t];if(r===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return r}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,r){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=r()}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(),r={},i=new Promise((o)=>{r.release=o}),s=t.catch(()=>{return}).then(()=>i);m.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(r.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[r,i]of Object.entries(e)){let s=O({[r]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${r}": ${String(s)} > ${String(t)}.`)}}async#f(e){let t=Object.keys(e),r=await this.#d(null),i=await this.#d(t);if(r!==null&&i!==null)return r-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,r=await this.#f(e);if(r>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(r)} > ${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 r=await this.#a();r[e]=X(t),await this.#c(r)})}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 r=await this.#a(),i=Object.keys(r).filter((o)=>o.startsWith(e)).filter((o)=>q(o,t)).filter((o)=>de(r[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(r[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 r of e)if(r.type==="put")t[r.key]=X(r.value);else delete t[r.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 r=f(t);return this.#l(),v(this,e,r)}scoped(e){return Q(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{m as WebExtensionStorage};
|
|
@@ -103,6 +103,12 @@ export type CompletedTaskResultMessage = {
|
|
|
103
103
|
readonly value: RemoteWorkerJsonValue;
|
|
104
104
|
/** Required per-dispatch token echoed from the {@link TaskMessage}. */
|
|
105
105
|
readonly attemptToken: string;
|
|
106
|
+
/**
|
|
107
|
+
* Echo of {@link TaskMessage.workflowRevision} (WFT-20), when the dispatch
|
|
108
|
+
* carried one. Missing-or-mismatched echo authorization is transport-specific
|
|
109
|
+
* — see `remote-worker-protocol.md`'s revision-staleness section.
|
|
110
|
+
*/
|
|
111
|
+
readonly workflowRevision?: string;
|
|
106
112
|
};
|
|
107
113
|
/**
|
|
108
114
|
* Failed activity result message.
|
|
@@ -127,6 +133,8 @@ export type FailedTaskResultMessage = {
|
|
|
127
133
|
readonly error: string;
|
|
128
134
|
/** Required per-dispatch token echoed from the {@link TaskMessage}. */
|
|
129
135
|
readonly attemptToken: string;
|
|
136
|
+
/** Echo of {@link TaskMessage.workflowRevision} (WFT-20) — see {@link CompletedTaskResultMessage.workflowRevision}. */
|
|
137
|
+
readonly workflowRevision?: string;
|
|
130
138
|
};
|
|
131
139
|
/**
|
|
132
140
|
* Cancelled activity result message.
|
|
@@ -153,6 +161,8 @@ export type CancelledTaskResultMessage = {
|
|
|
153
161
|
readonly cancelled?: true;
|
|
154
162
|
/** Required per-dispatch token echoed from the {@link TaskMessage}. */
|
|
155
163
|
readonly attemptToken: string;
|
|
164
|
+
/** Echo of {@link TaskMessage.workflowRevision} (WFT-20) — see {@link CompletedTaskResultMessage.workflowRevision}. */
|
|
165
|
+
readonly workflowRevision?: string;
|
|
156
166
|
};
|
|
157
167
|
/**
|
|
158
168
|
* Registration acknowledgement sent after a worker is accepted.
|
|
@@ -262,6 +272,13 @@ export type TaskMessage = {
|
|
|
262
272
|
readonly headers?: Readonly<Record<string, string>>;
|
|
263
273
|
/** Durable token for the workflow run that launched this activity, when known. */
|
|
264
274
|
readonly workflowExecutionToken?: string;
|
|
275
|
+
/**
|
|
276
|
+
* The dispatching workflow run's persisted revision (WFT-20), when known.
|
|
277
|
+
* A worker echoes this back on the resulting `taskResult`; the server
|
|
278
|
+
* rejects a completion whose echoed revision disagrees with the run's
|
|
279
|
+
* persisted revision as stale.
|
|
280
|
+
*/
|
|
281
|
+
readonly workflowRevision?: string;
|
|
265
282
|
/** Unique, unguessable token identifying this dispatch attempt. */
|
|
266
283
|
readonly attemptToken: string;
|
|
267
284
|
};
|
|
@@ -84,6 +84,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
84
84
|
readonly type: "string";
|
|
85
85
|
readonly minLength: 1;
|
|
86
86
|
};
|
|
87
|
+
readonly workflowRevision: {
|
|
88
|
+
readonly type: "string";
|
|
89
|
+
readonly minLength: 1;
|
|
90
|
+
};
|
|
87
91
|
};
|
|
88
92
|
}, {
|
|
89
93
|
readonly type: "object";
|
|
@@ -107,6 +111,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
107
111
|
readonly type: "string";
|
|
108
112
|
readonly minLength: 1;
|
|
109
113
|
};
|
|
114
|
+
readonly workflowRevision: {
|
|
115
|
+
readonly type: "string";
|
|
116
|
+
readonly minLength: 1;
|
|
117
|
+
};
|
|
110
118
|
};
|
|
111
119
|
}, {
|
|
112
120
|
readonly type: "object";
|
|
@@ -133,6 +141,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
133
141
|
readonly type: "string";
|
|
134
142
|
readonly minLength: 1;
|
|
135
143
|
};
|
|
144
|
+
readonly workflowRevision: {
|
|
145
|
+
readonly type: "string";
|
|
146
|
+
readonly minLength: 1;
|
|
147
|
+
};
|
|
136
148
|
};
|
|
137
149
|
}];
|
|
138
150
|
};
|
|
@@ -162,6 +174,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
162
174
|
readonly type: "string";
|
|
163
175
|
readonly minLength: 1;
|
|
164
176
|
};
|
|
177
|
+
readonly workflowRevision: {
|
|
178
|
+
readonly type: "string";
|
|
179
|
+
readonly minLength: 1;
|
|
180
|
+
};
|
|
165
181
|
readonly attemptToken: {
|
|
166
182
|
readonly type: "string";
|
|
167
183
|
readonly minLength: 1;
|
|
@@ -371,6 +387,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
371
387
|
readonly type: "string";
|
|
372
388
|
readonly minLength: 1;
|
|
373
389
|
};
|
|
390
|
+
readonly workflowRevision: {
|
|
391
|
+
readonly type: "string";
|
|
392
|
+
readonly minLength: 1;
|
|
393
|
+
};
|
|
374
394
|
};
|
|
375
395
|
}, {
|
|
376
396
|
readonly type: "object";
|
|
@@ -394,6 +414,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
394
414
|
readonly type: "string";
|
|
395
415
|
readonly minLength: 1;
|
|
396
416
|
};
|
|
417
|
+
readonly workflowRevision: {
|
|
418
|
+
readonly type: "string";
|
|
419
|
+
readonly minLength: 1;
|
|
420
|
+
};
|
|
397
421
|
};
|
|
398
422
|
}, {
|
|
399
423
|
readonly type: "object";
|
|
@@ -420,6 +444,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
420
444
|
readonly type: "string";
|
|
421
445
|
readonly minLength: 1;
|
|
422
446
|
};
|
|
447
|
+
readonly workflowRevision: {
|
|
448
|
+
readonly type: "string";
|
|
449
|
+
readonly minLength: 1;
|
|
450
|
+
};
|
|
423
451
|
};
|
|
424
452
|
}];
|
|
425
453
|
};
|
|
@@ -449,6 +477,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
449
477
|
readonly type: "string";
|
|
450
478
|
readonly minLength: 1;
|
|
451
479
|
};
|
|
480
|
+
readonly workflowRevision: {
|
|
481
|
+
readonly type: "string";
|
|
482
|
+
readonly minLength: 1;
|
|
483
|
+
};
|
|
452
484
|
readonly attemptToken: {
|
|
453
485
|
readonly type: "string";
|
|
454
486
|
readonly minLength: 1;
|
|
@@ -44,7 +44,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
44
44
|
operationId: { type: "string", minLength: 1 },
|
|
45
45
|
status: { const: "completed" },
|
|
46
46
|
value: jsonValueSchema,
|
|
47
|
-
attemptToken: { type: "string", minLength: 1 }
|
|
47
|
+
attemptToken: { type: "string", minLength: 1 },
|
|
48
|
+
workflowRevision: { type: "string", minLength: 1 }
|
|
48
49
|
}
|
|
49
50
|
},
|
|
50
51
|
{
|
|
@@ -56,7 +57,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
56
57
|
operationId: { type: "string", minLength: 1 },
|
|
57
58
|
status: { const: "failed" },
|
|
58
59
|
error: { type: "string" },
|
|
59
|
-
attemptToken: { type: "string", minLength: 1 }
|
|
60
|
+
attemptToken: { type: "string", minLength: 1 },
|
|
61
|
+
workflowRevision: { type: "string", minLength: 1 }
|
|
60
62
|
}
|
|
61
63
|
},
|
|
62
64
|
{
|
|
@@ -69,7 +71,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
69
71
|
status: { const: "cancelled" },
|
|
70
72
|
error: { type: "string" },
|
|
71
73
|
cancelled: { const: !0 },
|
|
72
|
-
attemptToken: { type: "string", minLength: 1 }
|
|
74
|
+
attemptToken: { type: "string", minLength: 1 },
|
|
75
|
+
workflowRevision: { type: "string", minLength: 1 }
|
|
73
76
|
}
|
|
74
77
|
}
|
|
75
78
|
]
|
|
@@ -86,6 +89,7 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
86
89
|
attempt: { type: "number", minimum: 1 },
|
|
87
90
|
headers: stringMapSchema,
|
|
88
91
|
workflowExecutionToken: { type: "string", minLength: 1 },
|
|
92
|
+
workflowRevision: { type: "string", minLength: 1 },
|
|
89
93
|
attemptToken: { type: "string", minLength: 1 }
|
|
90
94
|
}
|
|
91
95
|
},
|
|
@@ -9,6 +9,14 @@ function parseEchoedAttemptToken(record) {
|
|
|
9
9
|
return protocolFailure("invalid_message", "taskResult.attemptToken must be a non-empty string");
|
|
10
10
|
return { ok: !0, message: { attemptToken } };
|
|
11
11
|
}
|
|
12
|
+
function parseEchoedWorkflowRevision(record) {
|
|
13
|
+
const workflowRevision = record.workflowRevision;
|
|
14
|
+
if (workflowRevision === void 0)
|
|
15
|
+
return { ok: !0, message: {} };
|
|
16
|
+
if (!isNonEmptyString(workflowRevision))
|
|
17
|
+
return protocolFailure("invalid_message", "taskResult.workflowRevision must be a non-empty string when present");
|
|
18
|
+
return { ok: !0, message: { workflowRevision } };
|
|
19
|
+
}
|
|
12
20
|
function parseCompletedTaskResult(operationId, record) {
|
|
13
21
|
const value = record.value;
|
|
14
22
|
if (!isRemoteWorkerJsonValue(value))
|
|
@@ -16,9 +24,19 @@ function parseCompletedTaskResult(operationId, record) {
|
|
|
16
24
|
const token = parseEchoedAttemptToken(record);
|
|
17
25
|
if (!token.ok)
|
|
18
26
|
return token;
|
|
27
|
+
const revision = parseEchoedWorkflowRevision(record);
|
|
28
|
+
if (!revision.ok)
|
|
29
|
+
return revision;
|
|
19
30
|
return {
|
|
20
31
|
ok: !0,
|
|
21
|
-
message: {
|
|
32
|
+
message: {
|
|
33
|
+
type: "taskResult",
|
|
34
|
+
operationId,
|
|
35
|
+
status: "completed",
|
|
36
|
+
value,
|
|
37
|
+
...token.message,
|
|
38
|
+
...revision.message
|
|
39
|
+
}
|
|
22
40
|
};
|
|
23
41
|
}
|
|
24
42
|
function parseFailedTaskResult(operationId, record) {
|
|
@@ -28,9 +46,19 @@ function parseFailedTaskResult(operationId, record) {
|
|
|
28
46
|
const token = parseEchoedAttemptToken(record);
|
|
29
47
|
if (!token.ok)
|
|
30
48
|
return token;
|
|
49
|
+
const revision = parseEchoedWorkflowRevision(record);
|
|
50
|
+
if (!revision.ok)
|
|
51
|
+
return revision;
|
|
31
52
|
return {
|
|
32
53
|
ok: !0,
|
|
33
|
-
message: {
|
|
54
|
+
message: {
|
|
55
|
+
type: "taskResult",
|
|
56
|
+
operationId,
|
|
57
|
+
status: "failed",
|
|
58
|
+
error,
|
|
59
|
+
...token.message,
|
|
60
|
+
...revision.message
|
|
61
|
+
}
|
|
34
62
|
};
|
|
35
63
|
}
|
|
36
64
|
function parseCancelledTaskResult(operationId, record) {
|
|
@@ -43,6 +71,9 @@ function parseCancelledTaskResult(operationId, record) {
|
|
|
43
71
|
const token = parseEchoedAttemptToken(record);
|
|
44
72
|
if (!token.ok)
|
|
45
73
|
return token;
|
|
74
|
+
const revision = parseEchoedWorkflowRevision(record);
|
|
75
|
+
if (!revision.ok)
|
|
76
|
+
return revision;
|
|
46
77
|
return {
|
|
47
78
|
ok: !0,
|
|
48
79
|
message: {
|
|
@@ -51,7 +82,8 @@ function parseCancelledTaskResult(operationId, record) {
|
|
|
51
82
|
status: "cancelled",
|
|
52
83
|
error,
|
|
53
84
|
...cancelled === !0 ? { cancelled } : {},
|
|
54
|
-
...token.message
|
|
85
|
+
...token.message,
|
|
86
|
+
...revision.message
|
|
55
87
|
}
|
|
56
88
|
};
|
|
57
89
|
}
|
package/dist/worker/protocol.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var X=import.meta.require;function l(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e){if(e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e))return!0;if(Array.isArray(e))return e.every(p);if(!l(e))return!1;return Object.values(e).every(p)}function a(e){return typeof e==="string"&&e.length>0}function _(e){return Array.isArray(e)&&e.every(a)}function E(e){if(!l(e))return!1;return Object.values(e).every((t)=>typeof t==="string")}function u(e){return typeof e==="number"&&Number.isFinite(e)}function r(e,t,s){return{ok:!1,error:{code:e,message:t,...s!==void 0?{requestedProtocolVersion:s}:{}}}}function d(e,t,s){let o={};for(let[n,g,c,f]of s){let m=t[n];if(m===void 0){if(g)return{ok:!1,error:r(e,f)};continue}if(!c(m))return{ok:!1,error:r(e,f)};o[n]=m}return{ok:!0,values:o}}var i=3,M=3,O=3,T=[3];var R={$ref:"#/$defs/jsonValue"},S={type:"object",additionalProperties:R},w={type:"object",additionalProperties:{type:"string"}},P={const:i},k={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","manifest"],properties:{type:{const:"register"},protocolVersion:P,workerId:{type:"string",minLength:1},manifest:{type:"object"},concurrency:{type:"number",minimum:1,maximum:1000},startedAt:{type:"number"}}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:R,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:R,attempt:{type:"number",minimum:1},headers:w,workflowExecutionToken:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","concurrency","acceptedManifestDigest","serverCapabilities"],properties:{type:{const:"registerAck"},protocolVersion:P,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},concurrency:{type:"number",minimum:1,maximum:1000},acceptedManifestDigest:{type:"string",minLength:1},serverCapabilities:{type:"array",items:{type:"string",minLength:1}}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version","deployment_conflict","registration_rejected"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:{type:"number"}},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},W={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String(i)}.json`,title:`Weft RemoteWorker Protocol v${String(i)}`,oneOf:Object.keys(k).map((e)=>({$ref:`#/$defs/messages/${e}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:S,messages:k}};function y(e){let t=e.attemptToken;if(!a(t))return r("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:t}}}function h(e,t){let s=t.value;if(!p(s))return r("invalid_message","completed taskResult.value must be valid JSON");let o=y(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"completed",value:s,...o.message}}}function v(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","failed taskResult.error must be a string");let o=y(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"failed",error:s,...o.message}}}function V(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","cancelled taskResult.error must be a string");let o=t.cancelled;if(o!==void 0&&o!==!0)return r("invalid_message","taskResult.cancelled must be true when present");let n=y(t);if(!n.ok)return n;return{ok:!0,message:{type:"taskResult",operationId:e,status:"cancelled",error:s,...o===!0?{cancelled:o}:{},...n.message}}}var I={completed:h,failed:v,cancelled:V};function C(e){return e==="completed"||e==="failed"||e==="cancelled"}function b(e){let t=e.operationId;if(!a(t))return r("invalid_message","taskResult.operationId must be a non-empty string");let s=e.status;if(!C(s))return r("invalid_message","taskResult.status must be completed, failed, or cancelled");return I[s](t,e)}var j=new Set(["register","heartbeat","taskResult"]),A=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function L(e){if(e===i)return{ok:!0,message:e};let t=u(e)?e:void 0;return r("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(e)}`,t)}var N=[["workerId",!0,a,"register.workerId must be a non-empty string"],["manifest",!0,l,"register.manifest must be a JSON object"],["concurrency",!1,u,"register.concurrency must be a finite number"],["startedAt",!1,u,"register.startedAt must be a finite number when present"]];function x(e){let t=L(e.protocolVersion);if(!t.ok)return t;let s=d("invalid_registration",e,N);if(!s.ok)return s.error;return{ok:!0,message:{type:"register",protocolVersion:t.message,...s.values}}}function F(e){let t=e.workerId;if(!a(t))return r("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:t}}}var q=[["operationId",!0,a,"task.operationId must be a non-empty string"],["activityName",!0,a,"task.activityName must be a non-empty string"],["input",!0,p,"task.input must be valid JSON"],["attempt",!1,u,"task.attempt must be a finite number"],["headers",!1,E,"task.headers must be a string map"],["workflowExecutionToken",!1,a,"task.workflowExecutionToken must be a non-empty string"],["attemptToken",!0,a,"task.attemptToken must be a non-empty string"]];function J(e){let t=d("invalid_message",e,q);if(!t.ok)return t.error;return{ok:!0,message:{type:"task",...t.values}}}function K(e){let t=e.operationId;if(!a(t))return r("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:t}}}function D(){return{ok:!0,message:{type:"shutdown"}}}function H(e){let t=e.protocolVersion;if(t!==i)return r("invalid_message",`registerAck.protocolVersion must be ${String(i)}`);let{workerId:s,queue:o,concurrency:n,acceptedManifestDigest:g,serverCapabilities:c}=e;if(!a(s))return r("invalid_message","registerAck.workerId must be a non-empty string");if(!a(o))return r("invalid_message","registerAck.queue must be a non-empty string");if(typeof n!=="number"||!Number.isFinite(n))return r("invalid_message","registerAck.concurrency must be a finite number");if(!a(g))return r("invalid_message","registerAck.acceptedManifestDigest must be a non-empty string");if(!_(c))return r("invalid_message","registerAck.serverCapabilities must be an array of non-empty strings");return{ok:!0,message:{type:"registerAck",protocolVersion:t,workerId:s,queue:o,concurrency:n,acceptedManifestDigest:g,serverCapabilities:c}}}function U(e){return e==="invalid_registration"||e==="unsupported_protocol_version"||e==="deployment_conflict"||e==="registration_rejected"}function G(e){let{code:t,message:s,supportedProtocolVersions:o,requestedProtocolVersion:n}=e;if(!U(t))return r("invalid_message","registerError.code is not recognized");if(typeof s!=="string")return r("invalid_message","registerError.message must be a string");if(!Array.isArray(o)||!o.every((c)=>u(c)))return r("invalid_message","registerError.supportedProtocolVersions is invalid");if(n!==void 0&&!u(n))return r("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:t,message:s,supportedProtocolVersions:o,...n!==void 0?{requestedProtocolVersion:n}:{}}}}function z(e){let{code:t,message:s}=e;if(t!=="invalid_json"&&t!=="invalid_message"&&t!=="unknown_message_type"&&t!=="registration_required")return r("invalid_message","protocolError.code is not recognized");if(typeof s!=="string")return r("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:t,message:s}}}function ie(e){if(!l(e))return r("invalid_message","Worker protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Worker protocol message.type must be a string");if(!j.has(t))return r("unknown_message_type",`Unknown worker message type: ${t}`);switch(t){case"register":return x(e);case"heartbeat":return F(e);case"taskResult":return b(e);default:return r("unknown_message_type",`Unknown worker message type: ${t}`)}}function ue(e){if(!l(e))return r("invalid_message","Server protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Server protocol message.type must be a string");if(!A.has(t))return r("unknown_message_type",`Unknown server message type: ${t}`);switch(t){case"registerAck":return H(e);case"registerError":return G(e);case"protocolError":return z(e);case"task":return J(e);case"cancel":return K(e);case"shutdown":return D();default:return r("unknown_message_type",`Unknown server message type: ${t}`)}}export{O as REMOTE_WORKER_MAX_PROTOCOL_VERSION,k as REMOTE_WORKER_MESSAGE_SCHEMAS,M as REMOTE_WORKER_MIN_PROTOCOL_VERSION,W as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,i as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,p as isRemoteWorkerJsonValue,ue as parseServerToWorkerMessage,ie as parseWorkerToServerMessage};
|
|
2
|
+
var Y=import.meta.require;function g(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e){if(e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e))return!0;if(Array.isArray(e))return e.every(p);if(!g(e))return!1;return Object.values(e).every(p)}function i(e){return typeof e==="string"&&e.length>0}function E(e){return Array.isArray(e)&&e.every(i)}function P(e){if(!g(e))return!1;return Object.values(e).every((t)=>typeof t==="string")}function c(e){return typeof e==="number"&&Number.isFinite(e)}function r(e,t,s){return{ok:!1,error:{code:e,message:t,...s!==void 0?{requestedProtocolVersion:s}:{}}}}function d(e,t,s){let n={};for(let[o,a,l,_]of s){let m=t[o];if(m===void 0){if(a)return{ok:!1,error:r(e,_)};continue}if(!l(m))return{ok:!1,error:r(e,_)};n[o]=m}return{ok:!0,values:n}}var u=3,O=3,w=3,T=[3];var k={$ref:"#/$defs/jsonValue"},S={type:"object",additionalProperties:k},v={type:"object",additionalProperties:{type:"string"}},b={const:u},R={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","manifest"],properties:{type:{const:"register"},protocolVersion:b,workerId:{type:"string",minLength:1},manifest:{type:"object"},concurrency:{type:"number",minimum:1,maximum:1000},startedAt:{type:"number"}}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:k,attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:k,attempt:{type:"number",minimum:1},headers:v,workflowExecutionToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","concurrency","acceptedManifestDigest","serverCapabilities"],properties:{type:{const:"registerAck"},protocolVersion:b,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},concurrency:{type:"number",minimum:1,maximum:1000},acceptedManifestDigest:{type:"string",minLength:1},serverCapabilities:{type:"array",items:{type:"string",minLength:1}}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version","deployment_conflict","registration_rejected"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:{type:"number"}},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},W={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String(u)}.json`,title:`Weft RemoteWorker Protocol v${String(u)}`,oneOf:Object.keys(R).map((e)=>({$ref:`#/$defs/messages/${e}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:S,messages:R}};function y(e){let t=e.attemptToken;if(!i(t))return r("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:t}}}function f(e){let t=e.workflowRevision;if(t===void 0)return{ok:!0,message:{}};if(!i(t))return r("invalid_message","taskResult.workflowRevision must be a non-empty string when present");return{ok:!0,message:{workflowRevision:t}}}function h(e,t){let s=t.value;if(!p(s))return r("invalid_message","completed taskResult.value must be valid JSON");let n=y(t);if(!n.ok)return n;let o=f(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"completed",value:s,...n.message,...o.message}}}function V(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","failed taskResult.error must be a string");let n=y(t);if(!n.ok)return n;let o=f(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"failed",error:s,...n.message,...o.message}}}function I(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","cancelled taskResult.error must be a string");let n=t.cancelled;if(n!==void 0&&n!==!0)return r("invalid_message","taskResult.cancelled must be true when present");let o=y(t);if(!o.ok)return o;let a=f(t);if(!a.ok)return a;return{ok:!0,message:{type:"taskResult",operationId:e,status:"cancelled",error:s,...n===!0?{cancelled:n}:{},...o.message,...a.message}}}var C={completed:h,failed:V,cancelled:I};function j(e){return e==="completed"||e==="failed"||e==="cancelled"}function M(e){let t=e.operationId;if(!i(t))return r("invalid_message","taskResult.operationId must be a non-empty string");let s=e.status;if(!j(s))return r("invalid_message","taskResult.status must be completed, failed, or cancelled");return C[s](t,e)}var A=new Set(["register","heartbeat","taskResult"]),L=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function N(e){if(e===u)return{ok:!0,message:e};let t=c(e)?e:void 0;return r("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(e)}`,t)}var x=[["workerId",!0,i,"register.workerId must be a non-empty string"],["manifest",!0,g,"register.manifest must be a JSON object"],["concurrency",!1,c,"register.concurrency must be a finite number"],["startedAt",!1,c,"register.startedAt must be a finite number when present"]];function F(e){let t=N(e.protocolVersion);if(!t.ok)return t;let s=d("invalid_registration",e,x);if(!s.ok)return s.error;return{ok:!0,message:{type:"register",protocolVersion:t.message,...s.values}}}function q(e){let t=e.workerId;if(!i(t))return r("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:t}}}var J=[["operationId",!0,i,"task.operationId must be a non-empty string"],["activityName",!0,i,"task.activityName must be a non-empty string"],["input",!0,p,"task.input must be valid JSON"],["attempt",!1,c,"task.attempt must be a finite number"],["headers",!1,P,"task.headers must be a string map"],["workflowExecutionToken",!1,i,"task.workflowExecutionToken must be a non-empty string"],["workflowRevision",!1,i,"task.workflowRevision must be a non-empty string"],["attemptToken",!0,i,"task.attemptToken must be a non-empty string"]];function K(e){let t=d("invalid_message",e,J);if(!t.ok)return t.error;return{ok:!0,message:{type:"task",...t.values}}}function D(e){let t=e.operationId;if(!i(t))return r("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:t}}}function H(){return{ok:!0,message:{type:"shutdown"}}}function U(e){let t=e.protocolVersion;if(t!==u)return r("invalid_message",`registerAck.protocolVersion must be ${String(u)}`);let{workerId:s,queue:n,concurrency:o,acceptedManifestDigest:a,serverCapabilities:l}=e;if(!i(s))return r("invalid_message","registerAck.workerId must be a non-empty string");if(!i(n))return r("invalid_message","registerAck.queue must be a non-empty string");if(typeof o!=="number"||!Number.isFinite(o))return r("invalid_message","registerAck.concurrency must be a finite number");if(!i(a))return r("invalid_message","registerAck.acceptedManifestDigest must be a non-empty string");if(!E(l))return r("invalid_message","registerAck.serverCapabilities must be an array of non-empty strings");return{ok:!0,message:{type:"registerAck",protocolVersion:t,workerId:s,queue:n,concurrency:o,acceptedManifestDigest:a,serverCapabilities:l}}}function G(e){return e==="invalid_registration"||e==="unsupported_protocol_version"||e==="deployment_conflict"||e==="registration_rejected"}function z(e){let{code:t,message:s,supportedProtocolVersions:n,requestedProtocolVersion:o}=e;if(!G(t))return r("invalid_message","registerError.code is not recognized");if(typeof s!=="string")return r("invalid_message","registerError.message must be a string");if(!Array.isArray(n)||!n.every((l)=>c(l)))return r("invalid_message","registerError.supportedProtocolVersions is invalid");if(o!==void 0&&!c(o))return r("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:t,message:s,supportedProtocolVersions:n,...o!==void 0?{requestedProtocolVersion:o}:{}}}}function X(e){let{code:t,message:s}=e;if(t!=="invalid_json"&&t!=="invalid_message"&&t!=="unknown_message_type"&&t!=="registration_required")return r("invalid_message","protocolError.code is not recognized");if(typeof s!=="string")return r("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:t,message:s}}}function ue(e){if(!g(e))return r("invalid_message","Worker protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Worker protocol message.type must be a string");if(!A.has(t))return r("unknown_message_type",`Unknown worker message type: ${t}`);switch(t){case"register":return F(e);case"heartbeat":return q(e);case"taskResult":return M(e);default:return r("unknown_message_type",`Unknown worker message type: ${t}`)}}function ce(e){if(!g(e))return r("invalid_message","Server protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Server protocol message.type must be a string");if(!L.has(t))return r("unknown_message_type",`Unknown server message type: ${t}`);switch(t){case"registerAck":return U(e);case"registerError":return z(e);case"protocolError":return X(e);case"task":return K(e);case"cancel":return D(e);case"shutdown":return H();default:return r("unknown_message_type",`Unknown server message type: ${t}`)}}export{w as REMOTE_WORKER_MAX_PROTOCOL_VERSION,R as REMOTE_WORKER_MESSAGE_SCHEMAS,O as REMOTE_WORKER_MIN_PROTOCOL_VERSION,W as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,u as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,p as isRemoteWorkerJsonValue,ce as parseServerToWorkerMessage,ue as parseWorkerToServerMessage};
|
|
@@ -125,6 +125,8 @@ export interface InFlightTask {
|
|
|
125
125
|
fairShareKey?: string;
|
|
126
126
|
/** Unique, unguessable token for this dispatch attempt. */
|
|
127
127
|
attemptToken: string;
|
|
128
|
+
/** The dispatching workflow run's persisted revision (WFT-20), when the `TaskDispatch` carried one. */
|
|
129
|
+
workflowRevision?: string;
|
|
128
130
|
}
|
|
129
131
|
export interface WorkerRegistryOptions {
|
|
130
132
|
/** Routing policy used by {@link WorkerRegistry.findWorker}. Default: `'least-loaded'`. */
|
|
@@ -76,7 +76,7 @@ export declare class WorkerRegistry {
|
|
|
76
76
|
*/
|
|
77
77
|
findWorker(activityName: string, options?: RoutingOptions): WorkerInfo | undefined;
|
|
78
78
|
/** Track a task assignment with a visibility timeout deadline. */
|
|
79
|
-
assignTask(workerId: string, operationId: string, visibilityTimeout: number, fairShareKey: string | undefined, attemptToken: string): void;
|
|
79
|
+
assignTask(workerId: string, operationId: string, visibilityTimeout: number, fairShareKey: string | undefined, attemptToken: string, workflowRevision?: string): void;
|
|
80
80
|
/**
|
|
81
81
|
* Undo exactly `assignTask`'s effects — capacity increment, fair-share
|
|
82
82
|
* count, and the in-flight entry — when the durable claim that was
|