@lostgradient/weft 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -22
- package/dist/cli/generated/operation-client.generated.d.ts +28 -1
- package/dist/cli/generated/operation-client.generated.js +2 -0
- package/dist/cli-main.js +79 -79
- package/dist/client/handle-delegation.d.ts +4 -0
- package/dist/client/handle-delegation.js +6 -0
- package/dist/client/http-client-requests.d.ts +2 -0
- package/dist/client/http-client-requests.js +3 -0
- package/dist/client/http-client.d.ts +4 -1
- package/dist/client/http-client.js +9 -1
- package/dist/client/interface.d.ts +57 -2
- package/dist/client/local.d.ts +4 -1
- package/dist/client/local.js +7 -0
- package/dist/client/start-body.d.ts +7 -1
- package/dist/client/start-body.js +13 -4
- package/dist/core/codec/extension-codec.js +4 -2
- package/dist/core/codec/index.d.ts +1 -0
- package/dist/core/codec/index.js +1 -0
- package/dist/core/codec/serializer-registry.d.ts +122 -0
- package/dist/core/codec/serializer-registry.js +51 -0
- package/dist/core/context/index.d.ts +9 -0
- package/dist/core/context/internals.d.ts +9 -0
- package/dist/core/context/internals.js +3 -0
- package/dist/core/context/run-operation.d.ts +16 -3
- package/dist/core/context/run-operation.js +16 -7
- package/dist/core/engine/bulk-operations.js +1 -1
- package/dist/core/engine/construction.d.ts +0 -1
- package/dist/core/engine/construction.js +10 -1
- package/dist/core/engine/disposal.js +12 -0
- package/dist/core/engine/engine-create-types.d.ts +0 -14
- package/dist/core/engine/engine-internal-types.d.ts +12 -0
- package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
- package/dist/core/engine/engine-leak-warnings.js +4 -0
- package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
- package/dist/core/engine/engine-runtime-helpers.js +26 -5
- package/dist/core/engine/errors.d.ts +74 -0
- package/dist/core/engine/errors.js +25 -1
- package/dist/core/engine/handle-result.js +1 -1
- package/dist/core/engine/handles.d.ts +89 -40
- package/dist/core/engine/handles.js +25 -27
- package/dist/core/engine/index.d.ts +96 -4
- package/dist/core/engine/index.js +75 -4
- package/dist/core/engine/inline-launch-queue.d.ts +14 -0
- package/dist/core/engine/inline-launch-queue.js +32 -7
- package/dist/core/engine/internals.d.ts +18 -10
- package/dist/core/engine/lifecycle/fork-helpers.js +1 -7
- package/dist/core/engine/lifecycle/persist.js +5 -20
- package/dist/core/engine/lifecycle/resume.js +25 -4
- package/dist/core/engine/lifecycle/start-commit.d.ts +47 -0
- package/dist/core/engine/lifecycle/start-commit.js +27 -0
- package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
- package/dist/core/engine/lifecycle/start-exec.js +38 -0
- package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +79 -0
- package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
- package/dist/core/engine/lifecycle/start-or-signal.d.ts +45 -0
- package/dist/core/engine/lifecycle/start-or-signal.js +141 -0
- package/dist/core/engine/lifecycle/start.d.ts +3 -3
- package/dist/core/engine/lifecycle/start.js +31 -37
- package/dist/core/engine/lifecycle.d.ts +3 -2
- package/dist/core/engine/lifecycle.js +9 -2
- package/dist/core/engine/listing.js +1 -1
- package/dist/core/engine/persisted-data-version.d.ts +5 -9
- package/dist/core/engine/persisted-data-version.js +4 -5
- package/dist/core/engine/schedule-handle.d.ts +45 -0
- package/dist/core/engine/schedule-handle.js +26 -0
- package/dist/core/engine/schedules.d.ts +1 -1
- package/dist/core/engine/schedules.js +7 -3
- package/dist/core/engine/second-instance-detector.d.ts +96 -0
- package/dist/core/engine/second-instance-detector.js +108 -0
- package/dist/core/engine/signals.d.ts +22 -0
- package/dist/core/engine/signals.js +15 -0
- package/dist/core/engine/termination/cleanup.d.ts +25 -0
- package/dist/core/engine/termination/cleanup.js +19 -1
- package/dist/core/engine/termination/complete.js +4 -3
- package/dist/core/engine/termination/suspend.d.ts +68 -0
- package/dist/core/engine/termination/suspend.js +41 -0
- package/dist/core/engine/termination.d.ts +4 -2
- package/dist/core/engine/termination.js +2 -0
- package/dist/core/engine/validation.js +25 -1
- package/dist/core/engine/workflow-feed.d.ts +5 -3
- package/dist/core/events/event-map.d.ts +2 -1
- package/dist/core/events/workflow-events.d.ts +23 -0
- package/dist/core/events/workflow-events.js +9 -0
- package/dist/core/list-filter-validation.js +2 -1
- package/dist/core/start-workflow-validation.d.ts +22 -0
- package/dist/core/start-workflow-validation.js +11 -1
- package/dist/core/step-context.d.ts +10 -6
- package/dist/core/step-context.js +7 -15
- package/dist/core/types/activity.d.ts +6 -3
- package/dist/core/types/identity.d.ts +8 -1
- package/dist/core/types/launch-metadata.d.ts +33 -0
- package/dist/core/types/launch-metadata.js +0 -0
- package/dist/core/types/message-handles.d.ts +25 -0
- package/dist/core/types/options.d.ts +48 -54
- package/dist/core/types/reviews.d.ts +2 -1
- package/dist/core/types/services-resolution.d.ts +47 -0
- package/dist/core/types/services-resolution.js +0 -0
- package/dist/core/types/state.d.ts +11 -11
- package/dist/core/types/workflow-builder.d.ts +5 -4
- package/dist/core/types/workflow-function.d.ts +17 -0
- package/dist/core/types/workflow-snapshot.d.ts +29 -0
- package/dist/core/types/workflow-snapshot.js +0 -0
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.js +3 -0
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +3 -1
- package/dist/diagnostics/doctor.js +6 -3
- package/dist/diagnostics/format.js +2 -2
- package/dist/diagnostics/types.d.ts +1 -0
- package/dist/diagnostics/version-check.js +6 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +10 -1
- package/dist/json-schema.js +1 -1
- package/dist/mcp/cli.js +35 -35
- package/dist/mcp/list-filter.js +2 -1
- package/dist/mcp/session.js +1 -0
- package/dist/observability/index.js +2 -2
- package/dist/server/handler.js +30 -30
- package/dist/server/index.js +33 -33
- package/dist/server/interactive-operations.js +1 -0
- package/dist/server/operations/resume-workflow.js +2 -2
- package/dist/server/operations/start-or-signal-workflow.d.ts +39 -0
- package/dist/server/operations/start-or-signal-workflow.js +140 -0
- package/dist/server/operations/start-workflow-options.d.ts +32 -0
- package/dist/server/operations/start-workflow-options.js +63 -0
- package/dist/server/operations/start-workflow.js +7 -69
- package/dist/server/operations/suspend-workflow.d.ts +13 -0
- package/dist/server/operations/suspend-workflow.js +36 -0
- package/dist/server/rest-binding.d.ts +18 -7
- package/dist/server/rest-bindings.js +12 -0
- package/dist/server/runtime/task-dispatch.js +5 -3
- package/dist/server/runtime/task-polling.d.ts +16 -2
- package/dist/server/runtime/task-polling.js +20 -5
- package/dist/server/runtime/websocket-worker.js +8 -0
- package/dist/server/serve-internals.d.ts +8 -0
- package/dist/server/serve-internals.js +4 -2
- package/dist/server/task-state.d.ts +8 -0
- package/dist/service-worker/index.js +28 -28
- package/dist/storage/capabilities.d.ts +10 -2
- package/dist/storage/capabilities.js +2 -2
- package/dist/storage/http.js +2 -2
- package/dist/storage/index.d.ts +6 -1
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/interface.d.ts +26 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +2 -0
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon-value-mapping.d.ts +47 -0
- package/dist/storage/neon-value-mapping.js +11 -0
- package/dist/storage/neon.d.ts +108 -0
- package/dist/storage/neon.js +10 -0
- package/dist/storage/node-sqlite-loader.d.ts +71 -0
- package/dist/storage/node-sqlite-loader.js +41 -0
- package/dist/storage/node-sqlite.d.ts +1 -19
- package/dist/storage/node-sqlite.js +38 -32
- package/dist/storage/postgres-key-value-queries.d.ts +79 -0
- package/dist/storage/postgres-key-value-queries.js +63 -0
- package/dist/storage/resolve.d.ts +2 -165
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/storage-configuration.d.ts +209 -0
- package/dist/storage/storage-configuration.js +0 -0
- package/dist/storage/text-value-store.d.ts +9 -9
- package/dist/storage/turso.js +2 -2
- package/dist/storage/typed-storage.js +1 -1
- package/dist/storage/web-extension.js +1 -1
- package/dist/testing/index.js +33 -33
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/index.js +9 -5
- package/dist/worker/long-poll.js +4 -0
- package/dist/worker/protocol-messages.d.ts +20 -0
- package/dist/worker/protocol-schemas.d.ts +32 -0
- package/dist/worker/protocol-schemas.js +8 -4
- package/dist/worker/protocol-task-result.d.ts +28 -0
- package/dist/worker/protocol-task-result.js +76 -0
- package/dist/worker/protocol.d.ts +4 -15
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/fair-share.d.ts +29 -0
- package/dist/worker/registry/fair-share.js +30 -0
- package/dist/worker/registry/routing.d.ts +18 -0
- package/dist/worker/registry/routing.js +14 -0
- package/dist/worker/registry/types.d.ts +7 -0
- package/dist/worker/registry.d.ts +16 -1
- package/dist/worker/registry.js +24 -36
- package/package.json +17 -4
|
@@ -170,8 +170,16 @@ export declare function requireStorageCapability(storage: Storage, capability: G
|
|
|
170
170
|
/**
|
|
171
171
|
* Fail fast when a storage backend is not conservative enough for boot-time
|
|
172
172
|
* durable recovery. This is intentionally stricter than the engine's per-feature
|
|
173
|
-
* gates: it rejects ephemeral,
|
|
174
|
-
*
|
|
173
|
+
* gates: it rejects ephemeral, eventual, best-effort, non-atomic, and non-CAS
|
|
174
|
+
* storage before an application starts in durable mode.
|
|
175
|
+
*
|
|
176
|
+
* Persistence may be `local` (a same-process file-backed store) or `remote` (a
|
|
177
|
+
* durable service such as Neon Postgres). A `remote` backend is acceptable only
|
|
178
|
+
* because the other four axes are still required at their strongest:
|
|
179
|
+
* `linearizable` read-after-write, `snapshot` scans, atomic batches, and
|
|
180
|
+
* compare-and-swap. A remote store that cannot promise all four (an eventually
|
|
181
|
+
* consistent HTTP backend, say) is still rejected — by those axes, not by its
|
|
182
|
+
* persistence scope.
|
|
175
183
|
*
|
|
176
184
|
* @throws {Error} When the backend's capability row is not suitable for recovery.
|
|
177
185
|
*
|
|
@@ -4,8 +4,8 @@ export function requireStorageCapability(storage, capability, featureName) {
|
|
|
4
4
|
}
|
|
5
5
|
export function assertDurableStorageForRecovery(storage) {
|
|
6
6
|
const capabilities = storage.capabilities(), failures = [];
|
|
7
|
-
if (capabilities.persistence !== "local")
|
|
8
|
-
failures.push(`persistence must be "local" (got "${capabilities.persistence}")`);
|
|
7
|
+
if (capabilities.persistence !== "local" && capabilities.persistence !== "remote")
|
|
8
|
+
failures.push(`persistence must be "local" or "remote" (got "${capabilities.persistence}")`);
|
|
9
9
|
if (capabilities.readAfterWrite !== "linearizable")
|
|
10
10
|
failures.push(`readAfterWrite must be "linearizable" (got "${capabilities.readAfterWrite}")`);
|
|
11
11
|
if (capabilities.scanConsistency !== "snapshot")
|
package/dist/storage/http.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var k=Object.defineProperty;var u=(
|
|
2
|
-
`);
|
|
1
|
+
var k=Object.defineProperty;var u=(F)=>F;function m(F,J){this[F]=u.bind(null,J)}var n=(F,J)=>{for(var Q in J)k(F,Q,{get:J[Q],enumerable:!0,configurable:!0,set:m.bind(J,Q)})};function U(F){let J=[];for(let Q=0;Q<F.length;Q+=512)J.push(String.fromCharCode(...F.subarray(Q,Q+512)));return btoa(J.join(""))}function T(F){let J=atob(F),Q=new Uint8Array(J.length);for(let Z=0;Z<J.length;Z+=1)Q[Z]=J.charCodeAt(Z);return Q}function N(F){return typeof F==="object"&&F!==null&&!Array.isArray(F)}async function M(F,J){return await F.get(J)!==null}async function*X(F,J,Q){for await(let[Z]of F.scan(J,Q))yield Z}async function V(F,J){let Q=0;for await(let Z of X(F,J))Q++;return Q}async function E(F,J){let Q=[];for await(let Z of X(F,J))Q.push({type:"delete",key:Z});if(Q.length===0)return 0;return await F.batch(Q),Q.length}async function H(F,J,Q){let Z=[];for await(let $ of X(F,J,Q))Z.push({type:"delete",key:$});if(Z.length===0)return 0;return await F.batch(Z),Z.length}function q(F,J,Q){if(!F.capabilities()[J])throw Error(`Feature "${Q}" requires storage capability "${J}", but this storage backend does not provide it.`)}var R="default";function O(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"ÿ"}function GF(F,J={}){if(J.gt!==void 0&&F<=J.gt)return!1;if(J.gte!==void 0&&F<J.gte)return!1;if(J.lt!==void 0&&F>=J.lt)return!1;if(J.lte!==void 0&&F>J.lte)return!1;return!0}function WF(F,J){if(F===null||J===null)return F===J;if(F.byteLength!==J.byteLength)return!1;for(let Q=0;Q<F.byteLength;Q++)if(F[Q]!==J[Q])return!1;return!0}async function P(F,J){if(F.has)return F.has(J);return M(F,J)}function h(F,J,Q){if(F.keys)return F.keys(J,Q);return X(F,J,Q)}async function v(F,J){if(F.count)return F.count(J);return V(F,J)}async function C(F,J){if(F.deletePrefix)return F.deletePrefix(J);return E(F,J)}async function b(F,J,Q){if(q(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(J,Q)}function Y(F){return encodeURIComponent(F)}function XF(F){try{return decodeURIComponent(F)}catch{return null}}var G=(F)=>String(F).padStart(16,"0"),_F={workflow:(F)=>`wf:${Y(F)}`,checkpoint:(F)=>`wf:${Y(F)}:ckpt`,checkpointHistory:(F,J)=>`wf:${Y(F)}:ckpt:${String(J).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Y(F)}:timeline:`,timeline:(F,J)=>`wf:${Y(F)}:timeline:${String(J).padStart(10,"0")}`,schedule:(F)=>`schedule:${Y(F)}`,scheduleTick:(F,J)=>`schedule-due:${String(F).padStart(16,"0")}:${Y(J)}`,scheduleRun:(F)=>`schedule-run:${Y(F)}`,operation:(F,J,Q)=>`op:${F}:${G(J)}:${Q}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,J,Q)=>`audit:bulk:${G(F)}:${Y(J)}:${Y(Q)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,J)=>`op:resolved-by-time:${G(F)}:${Y(J)}`,asyncActivity:(F,J)=>`async-act:v1:${Y(F)}:${Y(J)}`,activityReconciliationPrefix:(F)=>`actrec:v1:${Y(F)}:`,activityReconciliation:(F,J,Q)=>`actrec:v1:${Y(F)}:${Y(J)}:${Q}`,eventPrefix:(F)=>`ev:${Y(F)}:`,event:(F,J)=>`ev:${Y(F)}:${String(J).padStart(10,"0")}`,eventHead:(F)=>`ev:${Y(F)}:head`,eventWatermark:(F)=>`ev:${Y(F)}:watermark`,signal:(F,J,Q)=>`sig:${Y(F)}:${J}:${Y(Q)}`,signalSequence:(F)=>`sigseq:v1:${Y(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Y(F)}:`,signalAcceptedResponse:(F,J,Q)=>`sigres:v1:${Y(F)}:${Y(J)}:${Y(Q)}`,deadline:(F,J)=>`wf-deadline:${G(F)}:${Y(J)}`,terminalCleanup:(F,J)=>`wf-cleanup:${G(F)}:${Y(J)}`,delayedStart:(F,J)=>`wf-delayed:${G(F)}:${Y(J)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,J)=>`wf-terminal:${G(F)}:${Y(J)}`,attribute:(F)=>`attr:${Y(F)}`,attributeIndex:(F,J,Q)=>`idx:${F}:${J}:${Y(Q)}`,tagIndex:(F,J)=>`tag:${Y(F)}:${Y(J)}`,updatePrefix:(F)=>`upd:${Y(F)}:`,update:(F,J)=>`upd:${Y(F)}:${J}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,J)=>`upk:${Y(F)}:${J}`,startIdempotency:(F)=>`start-idem:${Y(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Y(F)}`,budget:(F,J,Q)=>`budget:${F}:${J}:${Q}`,review:(F,J)=>`review:${Y(F)}:${J}`,workflowHeaders:(F)=>`wf-headers:${Y(F)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Y(F)}`,workflowHasServices:(F)=>`wf-has-services:${Y(F)}`,offload:(F,J)=>`offload:${Y(F)}:${J}`,archive:(F,J)=>`archive:${Y(F)}:${J}`,stateExecution:(F,J)=>`state:execution:${Y(F)}:${Y(J)}`,stateWorkflow:(F,J)=>`state:workflow-scope:${R}:${Y(F)}:${Y(J)}`,streamChunkPrefix:(F,J)=>`blob:${Y(F)}:${J}:chunk:`,streamChunk:(F,J,Q)=>`blob:${Y(F)}:${J}:chunk:${String(Q).padStart(10,"0")}`,streamMetadata:(F,J)=>`blob:${Y(F)}:${J}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,J,Q)=>`tool-effect:${Y(F)}:${J}:${Q}`,workflowVisibilityStatus:(F,J)=>`wf-idx-status:${Y(F)}:${Y(J)}`,workflowVisibilityType:(F,J)=>`wf-idx-type:${Y(F)}:${Y(J)}`,workflowVisibilityCreated:(F,J)=>`wf-idx-created:${G(F)}:${Y(J)}`,workflowVisibilityUpdated:(F,J)=>`wf-idx-updated:${G(F)}:${Y(J)}`,workflowVisibilityDeadline:(F,J)=>`wf-idx-deadline:${G(F)}:${Y(J)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Y(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function w(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function j(F){let J={},Q=!1;for(let $ of["gt","gte","lt","lte"]){let W=F[$];if(W===void 0)continue;if(typeof W!=="string")throw Error("deleteRange bounds must be strings");J[$]=W,Q=!0}if(!Q)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Z=w(F.limit);if(Z!==void 0)J.limit=Z;return J}async function K(F,J,Q){let Z=j(Q);if(F.deleteRange)return F.deleteRange(J,Z);return H(F,J,Z)}function c(F,J){let Q={key:F,open:!1};if(J.gte!==void 0&&J.gte>Q.key)Q.key=J.gte,Q.open=!1;if(J.gt!==void 0&&J.gt>=Q.key)Q.key=J.gt,Q.open=!0;return Q}function y(F,J){let Q={key:O(F),open:!0};if(J.lt!==void 0&&J.lt<=Q.key)Q.key=J.lt,Q.open=!0;if(J.lte!==void 0&&J.lte<Q.key)Q.key=J.lte,Q.open=!1;return Q}function HF(F,J){let Q=c(F,J),Z=y(F,J);if(Q.key>Z.key||Q.key===Z.key&&(Q.open||Z.open))return null;return{lower:Q,upper:Z}}function B(F){return F.replaceAll(/:+$/g,"")}function g(F,J){let Q=B(F),Z=B(J);if(Q.length===0)return Z;if(Z.length===0)return Q;return`${Q}:${Z}`}class D{#J;#Q;constructor(F,J){this.#J=F,this.#Q=B(J)}#F(F){if(this.#Q.length===0)return F;return F.length===0?`${this.#Q}:`:`${this.#Q}:${F}`}#Y(F){if(this.#Q.length===0)return F;return F.slice(this.#Q.length+1)}#Z(F={}){let J={};if(F.limit!==void 0)J.limit=F.limit;if(F.reverse!==void 0)J.reverse=F.reverse;if(F.gt!==void 0)J.gt=this.#F(F.gt);if(F.gte!==void 0)J.gte=this.#F(F.gte);if(F.lt!==void 0)J.lt=this.#F(F.lt);if(F.lte!==void 0)J.lte=this.#F(F.lte);return J}#G(F){let J={};if(F.limit!==void 0)J.limit=F.limit;if(F.gt!==void 0)J.gt=this.#F(F.gt);if(F.gte!==void 0)J.gte=this.#F(F.gte);if(F.lt!==void 0)J.lt=this.#F(F.lt);if(F.lte!==void 0)J.lte=this.#F(F.lte);return J}capabilities(){return this.#J.capabilities()}scoped(F){return new D(this.#J,g(this.#Q,F))}async get(F){return this.#J.get(this.#F(F))}async put(F,J){await this.#J.put(this.#F(F),J)}async delete(F){await this.#J.delete(this.#F(F))}async*scan(F,J){for await(let[Q,Z]of this.#J.scan(this.#F(F),this.#Z(J)))yield[this.#Y(Q),Z]}async batch(F){await this.#J.batch(F.map((J)=>{if(J.type==="put")return{type:"put",key:this.#F(J.key),value:J.value};return{type:"delete",key:this.#F(J.key)}}))}async conditionalBatch(F,J){return b(this.#J,F.map((Q)=>({key:this.#F(Q.key),expectedValue:Q.expectedValue})),J.map((Q)=>{if(Q.type==="put")return{type:"put",key:this.#F(Q.key),value:Q.value};return{type:"delete",key:this.#F(Q.key)}}))}async has(F){return P(this.#J,this.#F(F))}async deletePrefix(F){return C(this.#J,this.#F(F))}async deleteRange(F,J){let Q=this.#G(j(J));return K(this.#J,this.#F(F),Q)}async*keys(F,J){for await(let Q of h(this.#J,this.#F(F),this.#Z(J)))yield this.#Y(Q)}async count(F){return v(this.#J,this.#F(F))}[Symbol.dispose](){this.#J[Symbol.dispose]()}}function S(F,J){return new D(F,J)}var f=67108864;function I(F){if(F.type==="put")return{type:"put",key:F.key,value:U(F.value)};return{type:"delete",key:F.key}}function l(F){return{key:F.key,expectedValue:F.expectedValue===null?null:U(F.expectedValue)}}function d(F){if(!N(F)||typeof F.key!=="string"||typeof F.value!=="string")throw Error("HTTPStorage scan response contained an invalid NDJSON entry.");return{key:F.key,value:F.value}}function p(F){if(!N(F)||typeof F.applied!=="boolean")throw Error('HTTPStorage conditional batch response must include a boolean "applied" field.');return F.applied}function _(F,J,Q){if(Q!==void 0)F.searchParams.set(J,String(Q))}function s(F){if(F.trim().length===0)return null;let J=d(JSON.parse(F));return[J.key,T(J.value)]}function a(F){if(F>f)throw Error("HTTPStorage scan response exceeded the maximum allowed size.")}async function*i(F){if(F.body===null)return;let J=F.body.getReader(),Q=new TextDecoder,Z="",$=0,W=!1;try{while(!0){let{done:L,value:A}=await J.read();if(L){W=!0;break}$+=A.byteLength,a($),Z+=Q.decode(A,{stream:!0});let z=Z.split(`
|
|
2
|
+
`);Z=z.pop()??"";for(let x of z)yield x}if(Z+=Q.decode(),Z.length>0)yield Z}finally{try{if(!W)await J.cancel()}catch{}J.releaseLock()}}class r{#J;#Q;#F;constructor(F){this.#J=F.baseUrl instanceof URL?F.baseUrl:new URL(F.baseUrl),this.#Q={...F.headers},this.#F=F.remoteConditionalBatch??!1}capabilities(){return{persistence:"remote",readAfterWrite:"eventual",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:this.#F,boundedRangeDelete:!1}}#Y(F){let J=this.#J.href.endsWith("/")?this.#J.href:`${this.#J.href}/`;return new URL(F.replace(/^\/+/,""),J)}#Z(F){return this.#Y(`/v1/storage/${encodeURIComponent(F)}`)}#G(F,J){let Q=this.#Y("/v1/storage");return Q.searchParams.set("prefix",F),_(Q,"limit",J.limit),_(Q,"reverse",J.reverse),_(Q,"gt",J.gt),_(Q,"gte",J.gte),_(Q,"lt",J.lt),_(Q,"lte",J.lte),Q}async#$(F,J={},Q=[]){let Z=new Headers(this.#Q);for(let[W,L]of new Headers(J.headers).entries())Z.set(W,L);let $=await fetch(F,{...J,headers:Z});if(!$.ok&&!Q.includes($.status))throw Error(`HTTPStorage request failed: ${J.method??"GET"} ${F.pathname} returned ${String($.status)}.`);return $}async get(F){let J=await this.#$(this.#Z(F),{method:"GET"},[404]);if(J.status===404)return null;return new Uint8Array(await J.arrayBuffer())}async put(F,J){await this.#$(this.#Z(F),{method:"PUT",headers:{"content-type":"application/octet-stream"},body:new Blob([J])})}async delete(F){await this.#$(this.#Z(F),{method:"DELETE"})}async*scan(F,J={}){let Q=await this.#$(this.#G(F,J),{method:"GET",headers:{accept:"application/x-ndjson"}});for await(let Z of i(Q)){let $=s(Z);if($!==null)yield $}}async batch(F){await this.#$(this.#Y("/v1/storage/-/batch"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({operations:F.map(I)})})}async conditionalBatch(F,J){let Q=await this.#$(this.#Y("/v1/storage/-/conditional-batch"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({conditions:F.map(l),operations:J.map(I)})});return p(await Q.json())}has(F){return M(this,F)}async*keys(F,J){yield*X(this,F,J)}count(F){return V(this,F)}deletePrefix(F){return E(this,F)}deleteRange(F,J){return H(this,F,j(J))}scoped(F){return S(this,F)}[Symbol.dispose](){}}export{r as HTTPStorage};
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* import { SQLiteStorage } from '@lostgradient/weft/storage/sqlite'; // Bun or Node SQLite
|
|
14
14
|
* import { LMDBStorage } from '@lostgradient/weft/storage/lmdb'; // peer: lmdb
|
|
15
15
|
* import { TursoStorage } from '@lostgradient/weft/storage/turso'; // peer: @libsql/client
|
|
16
|
+
* import { NeonStorage } from '@lostgradient/weft/storage/neon'; // peer: @neondatabase/serverless
|
|
16
17
|
* import { IndexedDBStorage } from '@lostgradient/weft/storage/indexeddb'; // browser-only
|
|
17
18
|
* import { WebExtensionStorage } from '@lostgradient/weft/storage/web-extension'; // extension-only
|
|
18
19
|
* import { HTTPStorage } from '@lostgradient/weft/storage/http'; // remote storage
|
|
@@ -119,6 +120,10 @@ declare const exportedKeys: {
|
|
|
119
120
|
readonly update: (workflowId: string, updateId: string) => string;
|
|
120
121
|
readonly updateResponse: (updateId: string) => string;
|
|
121
122
|
readonly updateIdempotency: (workflowId: string, key: string) => string;
|
|
123
|
+
readonly startIdempotency: (key: string) => string;
|
|
124
|
+
readonly startIdempotencySignalId: (key: string) => string;
|
|
125
|
+
readonly livenessPrefix: () => string;
|
|
126
|
+
readonly liveness: (instanceId: string) => string;
|
|
122
127
|
readonly budget: (namespace: string, period: string, date: string) => string;
|
|
123
128
|
readonly review: (workflowId: string, reviewId: string) => string;
|
|
124
129
|
readonly workflowHeaders: (workflowId: string) => string;
|
|
@@ -270,7 +275,7 @@ declare const exportedTextValueStore: typeof textValueStore;
|
|
|
270
275
|
* void isWeftKey;
|
|
271
276
|
* ```
|
|
272
277
|
*/
|
|
273
|
-
declare const exportedWeftReservedKeyPrefixes: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-terminal:"];
|
|
278
|
+
declare const exportedWeftReservedKeyPrefixes: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "liveness:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-terminal:"];
|
|
274
279
|
/**
|
|
275
280
|
* Re-exported {@link withCodec}. See the original declaration for full docs.
|
|
276
281
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var l=Object.defineProperty;var d=(Y)=>Y;function p(Y,J){this[Y]=d.bind(null,J)}var t=(Y,J)=>{for(var U in J)l(Y,U,{get:J[U],enumerable:!0,configurable:!0,set:p.bind(J,U)})};async function E(Y,J){return await Y.get(J)!==null}async function*T(Y,J,U){for await(let[Z]of Y.scan(J,U))yield Z}async function v(Y,J){let U=0;for await(let Z of T(Y,J))U++;return U}async function K(Y,J){let U=[];for await(let Z of T(Y,J))U.push({type:"delete",key:Z});if(U.length===0)return 0;return await Y.batch(U),U.length}async function C(Y,J,U){let Z=[];for await(let $ of T(Y,J,U))Z.push({type:"delete",key:$});if(Z.length===0)return 0;return await Y.batch(Z),Z.length}function q(Y,J,U){if(!Y.capabilities()[J])throw Error(`Feature "${U}" requires storage capability "${J}", but this storage backend does not provide it.`)}var b="default";function N(Y){return Y.length>0?Y.slice(0,-1)+String.fromCharCode(Y.charCodeAt(Y.length-1)+1):"ÿ"}function O(Y,J={}){if(J.gt!==void 0&&Y<=J.gt)return!1;if(J.gte!==void 0&&Y<J.gte)return!1;if(J.lt!==void 0&&Y>=J.lt)return!1;if(J.lte!==void 0&&Y>J.lte)return!1;return!0}function I(Y,J){if(Y===null||J===null)return Y===J;if(Y.byteLength!==J.byteLength)return!1;for(let U=0;U<Y.byteLength;U++)if(Y[U]!==J[U])return!1;return!0}async function S(Y,J){if(Y.has)return Y.has(J);return E(Y,J)}function x(Y,J,U){if(Y.keys)return Y.keys(J,U);return T(Y,J,U)}async function k(Y,J){if(Y.count)return Y.count(J);return v(Y,J)}async function w(Y,J){if(Y.deletePrefix)return Y.deletePrefix(J);return K(Y,J)}async function u(Y,J,U){if(q(Y,"conditionalBatch","storageConditionalBatch"),!Y.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return Y.conditionalBatch(J,U)}function X(Y){return encodeURIComponent(Y)}function GY(Y){try{return decodeURIComponent(Y)}catch{return null}}var _=(Y)=>String(Y).padStart(16,"0"),FY={workflow:(Y)=>`wf:${X(Y)}`,checkpoint:(Y)=>`wf:${X(Y)}:ckpt`,checkpointHistory:(Y,J)=>`wf:${X(Y)}:ckpt:${String(J).padStart(10,"0")}`,timelinePrefix:(Y)=>`wf:${X(Y)}:timeline:`,timeline:(Y,J)=>`wf:${X(Y)}:timeline:${String(J).padStart(10,"0")}`,schedule:(Y)=>`schedule:${X(Y)}`,scheduleTick:(Y,J)=>`schedule-due:${String(Y).padStart(16,"0")}:${X(J)}`,scheduleRun:(Y)=>`schedule-run:${X(Y)}`,operation:(Y,J,U)=>`op:${Y}:${_(J)}:${U}`,operationInflight:(Y)=>`op:inflight:${Y}`,operationQueued:(Y)=>`op:queued:${Y}`,operationResolved:(Y)=>`op:resolved:${Y}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(Y,J,U)=>`audit:bulk:${_(Y)}:${X(J)}:${X(U)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(Y,J)=>`op:resolved-by-time:${_(Y)}:${X(J)}`,asyncActivity:(Y,J)=>`async-act:v1:${X(Y)}:${X(J)}`,activityReconciliationPrefix:(Y)=>`actrec:v1:${X(Y)}:`,activityReconciliation:(Y,J,U)=>`actrec:v1:${X(Y)}:${X(J)}:${U}`,eventPrefix:(Y)=>`ev:${X(Y)}:`,event:(Y,J)=>`ev:${X(Y)}:${String(J).padStart(10,"0")}`,eventHead:(Y)=>`ev:${X(Y)}:head`,eventWatermark:(Y)=>`ev:${X(Y)}:watermark`,signal:(Y,J,U)=>`sig:${X(Y)}:${J}:${X(U)}`,signalSequence:(Y)=>`sigseq:v1:${X(Y)}`,signalAcceptedResponsePrefix:(Y)=>`sigres:v1:${X(Y)}:`,signalAcceptedResponse:(Y,J,U)=>`sigres:v1:${X(Y)}:${X(J)}:${X(U)}`,deadline:(Y,J)=>`wf-deadline:${_(Y)}:${X(J)}`,terminalCleanup:(Y,J)=>`wf-cleanup:${_(Y)}:${X(J)}`,delayedStart:(Y,J)=>`wf-delayed:${_(Y)}:${X(J)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(Y,J)=>`wf-terminal:${_(Y)}:${X(J)}`,attribute:(Y)=>`attr:${X(Y)}`,attributeIndex:(Y,J,U)=>`idx:${Y}:${J}:${X(U)}`,tagIndex:(Y,J)=>`tag:${X(Y)}:${X(J)}`,updatePrefix:(Y)=>`upd:${X(Y)}:`,update:(Y,J)=>`upd:${X(Y)}:${J}`,updateResponse:(Y)=>`upr:${Y}`,updateIdempotency:(Y,J)=>`upk:${X(Y)}:${J}`,budget:(Y,J,U)=>`budget:${Y}:${J}:${U}`,review:(Y,J)=>`review:${X(Y)}:${J}`,workflowHeaders:(Y)=>`wf-headers:${X(Y)}`,terminalCleanupNeeded:(Y)=>`wf-cleanup-needed:${X(Y)}`,workflowHasServices:(Y)=>`wf-has-services:${X(Y)}`,offload:(Y,J)=>`offload:${X(Y)}:${J}`,archive:(Y,J)=>`archive:${X(Y)}:${J}`,stateExecution:(Y,J)=>`state:execution:${X(Y)}:${X(J)}`,stateWorkflow:(Y,J)=>`state:workflow-scope:${b}:${X(Y)}:${X(J)}`,streamChunkPrefix:(Y,J)=>`blob:${X(Y)}:${J}:chunk:`,streamChunk:(Y,J,U)=>`blob:${X(Y)}:${J}:chunk:${String(U).padStart(10,"0")}`,streamMetadata:(Y,J)=>`blob:${X(Y)}:${J}:meta`,budgetCharged:(Y)=>`budget-charged:${Y}`,toolEffect:(Y,J,U)=>`tool-effect:${X(Y)}:${J}:${U}`,workflowVisibilityStatus:(Y,J)=>`wf-idx-status:${X(Y)}:${X(J)}`,workflowVisibilityType:(Y,J)=>`wf-idx-type:${X(Y)}:${X(J)}`,workflowVisibilityCreated:(Y,J)=>`wf-idx-created:${_(Y)}:${X(J)}`,workflowVisibilityUpdated:(Y,J)=>`wf-idx-updated:${_(Y)}:${X(J)}`,workflowVisibilityDeadline:(Y,J)=>`wf-idx-deadline:${_(Y)}:${X(J)}`,workflowVisibilityManifest:(Y)=>`wf-idx-manifest:${X(Y)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function s(Y){if(Y===void 0)return;if(typeof Y!=="number"||!Number.isInteger(Y)||Y<0)throw Error("deleteRange limit must be a finite non-negative integer");return Y===0?0:Y}function P(Y){let J={},U=!1;for(let $ of["gt","gte","lt","lte"]){let F=Y[$];if(F===void 0)continue;if(typeof F!=="string")throw Error("deleteRange bounds must be strings");J[$]=F,U=!0}if(!U)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Z=s(Y.limit);if(Z!==void 0)J.limit=Z;return J}async function y(Y,J,U){let Z=P(U);if(Y.deleteRange)return Y.deleteRange(J,Z);return C(Y,J,Z)}function a(Y,J){let U={key:Y,open:!1};if(J.gte!==void 0&&J.gte>U.key)U.key=J.gte,U.open=!1;if(J.gt!==void 0&&J.gt>=U.key)U.key=J.gt,U.open=!0;return U}function i(Y,J){let U={key:N(Y),open:!0};if(J.lt!==void 0&&J.lt<=U.key)U.key=J.lt,U.open=!0;if(J.lte!==void 0&&J.lte<U.key)U.key=J.lte,U.open=!1;return U}function m(Y,J){let U=a(Y,J),Z=i(Y,J);if(U.key>Z.key||U.key===Z.key&&(U.open||Z.open))return null;return{lower:U,upper:Z}}function R(Y){return Y.replaceAll(/:+$/g,"")}function n(Y,J){let U=R(Y),Z=R(J);if(U.length===0)return Z;if(Z.length===0)return U;return`${U}:${Z}`}class h{#J;#U;constructor(Y,J){this.#J=Y,this.#U=R(J)}#Y(Y){if(this.#U.length===0)return Y;return Y.length===0?`${this.#U}:`:`${this.#U}:${Y}`}#X(Y){if(this.#U.length===0)return Y;return Y.slice(this.#U.length+1)}#Z(Y={}){let J={};if(Y.limit!==void 0)J.limit=Y.limit;if(Y.reverse!==void 0)J.reverse=Y.reverse;if(Y.gt!==void 0)J.gt=this.#Y(Y.gt);if(Y.gte!==void 0)J.gte=this.#Y(Y.gte);if(Y.lt!==void 0)J.lt=this.#Y(Y.lt);if(Y.lte!==void 0)J.lte=this.#Y(Y.lte);return J}#$(Y){let J={};if(Y.limit!==void 0)J.limit=Y.limit;if(Y.gt!==void 0)J.gt=this.#Y(Y.gt);if(Y.gte!==void 0)J.gte=this.#Y(Y.gte);if(Y.lt!==void 0)J.lt=this.#Y(Y.lt);if(Y.lte!==void 0)J.lte=this.#Y(Y.lte);return J}capabilities(){return this.#J.capabilities()}scoped(Y){return new h(this.#J,n(this.#U,Y))}async get(Y){return this.#J.get(this.#Y(Y))}async put(Y,J){await this.#J.put(this.#Y(Y),J)}async delete(Y){await this.#J.delete(this.#Y(Y))}async*scan(Y,J){for await(let[U,Z]of this.#J.scan(this.#Y(Y),this.#Z(J)))yield[this.#X(U),Z]}async batch(Y){await this.#J.batch(Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#Y(J.key),value:J.value};return{type:"delete",key:this.#Y(J.key)}}))}async conditionalBatch(Y,J){return u(this.#J,Y.map((U)=>({key:this.#Y(U.key),expectedValue:U.expectedValue})),J.map((U)=>{if(U.type==="put")return{type:"put",key:this.#Y(U.key),value:U.value};return{type:"delete",key:this.#Y(U.key)}}))}async has(Y){return S(this.#J,this.#Y(Y))}async deletePrefix(Y){return w(this.#J,this.#Y(Y))}async deleteRange(Y,J){let U=this.#$(P(J));return y(this.#J,this.#Y(Y),U)}async*keys(Y,J){for await(let U of x(this.#J,this.#Y(Y),this.#Z(J)))yield this.#X(U)}async count(Y){return k(this.#J,this.#Y(Y))}[Symbol.dispose](){this.#J[Symbol.dispose]()}}function f(Y,J){return new h(Y,J)}var Q="kv";function A(Y){return new Promise((J,U)=>{Y.onsuccess=()=>J(Y.result),Y.onerror=()=>U(Y.error)})}function g(Y,J){let U=null,Z=null,$=null,F=(G,V)=>{let W=G??Error(V);if(Z){let B=Z;U=null,Z=null,B(W);return}$=W};return Y.onsuccess=()=>{if(!U)return;let G=U;U=null,Z=null,G(Y.result)},Y.onerror=()=>{F(Y.error,"IndexedDB cursor request failed.")},J.onerror=()=>{F(J.error,"IndexedDB transaction failed.")},J.onabort=()=>{F(J.error,"IndexedDB transaction aborted.")},()=>{return new Promise((G,V)=>{if($){let W=$;$=null,V(W);return}if(U=G,Z=V,Y.readyState==="done"){let W=U;U=null,Z=null,W?.(Y.result)}})}}class r{#J;#U=null;#Y;constructor(Y="weft"){this.#J=Y,this.#Y=this.#X()}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#X(){let Y=indexedDB.open(this.#J,1);return Y.onupgradeneeded=()=>{let J=Y.result;if(!J.objectStoreNames.contains(Q))J.createObjectStore(Q)},A(Y).then((J)=>{return this.#U=J,J})}async get(Y){let Z=(await this.#Y).transaction(Q,"readonly").objectStore(Q),$=await A(Z.get(Y));return $===void 0?null:new Uint8Array($)}async put(Y,J){let $=(await this.#Y).transaction(Q,"readwrite").objectStore(Q);await A($.put(J,Y))}async delete(Y){let Z=(await this.#Y).transaction(Q,"readwrite").objectStore(Q);await A(Z.delete(Y))}async has(Y){let Z=(await this.#Y).transaction(Q,"readonly").objectStore(Q);return await A(Z.count(Y))>0}async deletePrefix(Y){let J=await this.#Y,U=N(Y),Z=IDBKeyRange.bound(Y,U,!1,!0);return new Promise(($,F)=>{let G=J.transaction(Q,"readwrite"),V=G.objectStore(Q),W=0,B=V.count(Z);B.onsuccess=()=>{W=B.result,V.delete(Z)},G.oncomplete=()=>$(W),G.onerror=()=>F(G.error)})}async deleteRange(Y,J){let U=P(J),Z=m(Y,U);if(Z===null)return 0;let $=IDBKeyRange.bound(Z.lower.key,Z.upper.key,Z.lower.open,Z.upper.open),F=await this.#Y,{limit:G}=U;return new Promise((V,W)=>{let B=F.transaction(Q,"readwrite"),M=B.objectStore(Q),D=0;if(G===void 0){let H=M.count($);H.onsuccess=()=>{D=H.result,M.delete($)}}else{let H=M.openCursor($,"next");H.onsuccess=()=>{let z=H.result;if(z===null||D>=G)return;if(z.delete(),D++,D<G)z.continue()}}B.oncomplete=()=>V(D),B.onerror=()=>W(B.error)})}async*scan(Y,J={}){let{limit:U,reverse:Z}=J,$=await this.#Y,F=N(Y),G=IDBKeyRange.bound(Y,F,!1,!0),V=Z?"prev":"next",W=$.transaction(Q,"readonly"),M=W.objectStore(Q).openCursor(G,V),D=0,H=g(M,W),z=!1;try{let L=await H();while(L){if(U!==void 0&&D>=U)break;let j=L.key;if(O(j,J))yield[j,new Uint8Array(L.value)],D++;L.continue(),L=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async batch(Y){if(Y.length===0)return;let J=await this.#Y;return new Promise((U,Z)=>{let $=J.transaction(Q,"readwrite"),F=$.objectStore(Q);for(let G of Y)if(G.type==="put")F.put(G.value,G.key);else F.delete(G.key);$.oncomplete=()=>U(),$.onerror=()=>Z($.error)})}async conditionalBatch(Y,J){let U=await this.#Y;return new Promise((Z,$)=>{let F=U.transaction(Q,"readwrite"),G=F.objectStore(Q),V=!1,W=!1,B=(H,z)=>{if(V)return;V=!0,$(H??Error(z))};F.oncomplete=()=>{if(V)return;V=!0,Z(!0)},F.onerror=()=>{B(F.error,"IndexedDB conditionalBatch transaction failed.")},F.onabort=()=>{if(V)return;if(V=!0,W){Z(!1);return}$(F.error??Error("IndexedDB conditionalBatch transaction aborted."))};let M=()=>{for(let H of J)if(H.type==="put")G.put(H.value,H.key);else G.delete(H.key)},D=(H)=>{if(H>=Y.length){M();return}let z=Y[H],L=G.get(z.key);L.onsuccess=()=>{let j=L.result,c=j===void 0?null:new Uint8Array(j);if(!I(c,z.expectedValue)){W=!0,F.abort();return}D(H+1)},L.onerror=()=>{B(L.error,"IndexedDB conditionalBatch condition check failed.")}};D(0)})}async*keys(Y,J={}){let{limit:U,reverse:Z}=J,$=await this.#Y,F=N(Y),G=IDBKeyRange.bound(Y,F,!1,!0),V=Z?"prev":"next",W=$.transaction(Q,"readonly"),M=W.objectStore(Q).openKeyCursor(G,V),D=0,H=g(M,W),z=!1;try{let L=await H();while(L){if(U!==void 0&&D>=U)break;let j=L.key;if(O(j,J))yield j,D++;L.continue(),L=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async count(Y){let J=await this.#Y,U=N(Y),$=J.transaction(Q,"readonly").objectStore(Q);return A($.count(IDBKeyRange.bound(Y,U,!1,!0)))}scoped(Y){return f(this,Y)}[Symbol.dispose](){if(this.#U)this.#U.close(),this.#U=null}}export{r as IndexedDBStorage};
|
|
1
|
+
var l=Object.defineProperty;var d=(F)=>F;function p(F,Y){this[F]=d.bind(null,Y)}var t=(F,Y)=>{for(var J in Y)l(F,J,{get:Y[J],enumerable:!0,configurable:!0,set:p.bind(Y,J)})};async function E(F,Y){return await F.get(Y)!==null}async function*T(F,Y,J){for await(let[U]of F.scan(Y,J))yield U}async function v(F,Y){let J=0;for await(let U of T(F,Y))J++;return J}async function K(F,Y){let J=[];for await(let U of T(F,Y))J.push({type:"delete",key:U});if(J.length===0)return 0;return await F.batch(J),J.length}async function b(F,Y,J){let U=[];for await(let X of T(F,Y,J))U.push({type:"delete",key:X});if(U.length===0)return 0;return await F.batch(U),U.length}function q(F,Y,J){if(!F.capabilities()[Y])throw Error(`Feature "${J}" requires storage capability "${Y}", but this storage backend does not provide it.`)}var C="default";function N(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"ÿ"}function O(F,Y={}){if(Y.gt!==void 0&&F<=Y.gt)return!1;if(Y.gte!==void 0&&F<Y.gte)return!1;if(Y.lt!==void 0&&F>=Y.lt)return!1;if(Y.lte!==void 0&&F>Y.lte)return!1;return!0}function I(F,Y){if(F===null||Y===null)return F===Y;if(F.byteLength!==Y.byteLength)return!1;for(let J=0;J<F.byteLength;J++)if(F[J]!==Y[J])return!1;return!0}async function S(F,Y){if(F.has)return F.has(Y);return E(F,Y)}function x(F,Y,J){if(F.keys)return F.keys(Y,J);return T(F,Y,J)}async function k(F,Y){if(F.count)return F.count(Y);return v(F,Y)}async function w(F,Y){if(F.deletePrefix)return F.deletePrefix(Y);return K(F,Y)}async function u(F,Y,J){if(q(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(Y,J)}function Q(F){return encodeURIComponent(F)}function ZF(F){try{return decodeURIComponent(F)}catch{return null}}var _=(F)=>String(F).padStart(16,"0"),$F={workflow:(F)=>`wf:${Q(F)}`,checkpoint:(F)=>`wf:${Q(F)}:ckpt`,checkpointHistory:(F,Y)=>`wf:${Q(F)}:ckpt:${String(Y).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Q(F)}:timeline:`,timeline:(F,Y)=>`wf:${Q(F)}:timeline:${String(Y).padStart(10,"0")}`,schedule:(F)=>`schedule:${Q(F)}`,scheduleTick:(F,Y)=>`schedule-due:${String(F).padStart(16,"0")}:${Q(Y)}`,scheduleRun:(F)=>`schedule-run:${Q(F)}`,operation:(F,Y,J)=>`op:${F}:${_(Y)}:${J}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,Y,J)=>`audit:bulk:${_(F)}:${Q(Y)}:${Q(J)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,Y)=>`op:resolved-by-time:${_(F)}:${Q(Y)}`,asyncActivity:(F,Y)=>`async-act:v1:${Q(F)}:${Q(Y)}`,activityReconciliationPrefix:(F)=>`actrec:v1:${Q(F)}:`,activityReconciliation:(F,Y,J)=>`actrec:v1:${Q(F)}:${Q(Y)}:${J}`,eventPrefix:(F)=>`ev:${Q(F)}:`,event:(F,Y)=>`ev:${Q(F)}:${String(Y).padStart(10,"0")}`,eventHead:(F)=>`ev:${Q(F)}:head`,eventWatermark:(F)=>`ev:${Q(F)}:watermark`,signal:(F,Y,J)=>`sig:${Q(F)}:${Y}:${Q(J)}`,signalSequence:(F)=>`sigseq:v1:${Q(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Q(F)}:`,signalAcceptedResponse:(F,Y,J)=>`sigres:v1:${Q(F)}:${Q(Y)}:${Q(J)}`,deadline:(F,Y)=>`wf-deadline:${_(F)}:${Q(Y)}`,terminalCleanup:(F,Y)=>`wf-cleanup:${_(F)}:${Q(Y)}`,delayedStart:(F,Y)=>`wf-delayed:${_(F)}:${Q(Y)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,Y)=>`wf-terminal:${_(F)}:${Q(Y)}`,attribute:(F)=>`attr:${Q(F)}`,attributeIndex:(F,Y,J)=>`idx:${F}:${Y}:${Q(J)}`,tagIndex:(F,Y)=>`tag:${Q(F)}:${Q(Y)}`,updatePrefix:(F)=>`upd:${Q(F)}:`,update:(F,Y)=>`upd:${Q(F)}:${Y}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,Y)=>`upk:${Q(F)}:${Y}`,startIdempotency:(F)=>`start-idem:${Q(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Q(F)}`,budget:(F,Y,J)=>`budget:${F}:${Y}:${J}`,review:(F,Y)=>`review:${Q(F)}:${Y}`,workflowHeaders:(F)=>`wf-headers:${Q(F)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Q(F)}`,workflowHasServices:(F)=>`wf-has-services:${Q(F)}`,offload:(F,Y)=>`offload:${Q(F)}:${Y}`,archive:(F,Y)=>`archive:${Q(F)}:${Y}`,stateExecution:(F,Y)=>`state:execution:${Q(F)}:${Q(Y)}`,stateWorkflow:(F,Y)=>`state:workflow-scope:${C}:${Q(F)}:${Q(Y)}`,streamChunkPrefix:(F,Y)=>`blob:${Q(F)}:${Y}:chunk:`,streamChunk:(F,Y,J)=>`blob:${Q(F)}:${Y}:chunk:${String(J).padStart(10,"0")}`,streamMetadata:(F,Y)=>`blob:${Q(F)}:${Y}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,Y,J)=>`tool-effect:${Q(F)}:${Y}:${J}`,workflowVisibilityStatus:(F,Y)=>`wf-idx-status:${Q(F)}:${Q(Y)}`,workflowVisibilityType:(F,Y)=>`wf-idx-type:${Q(F)}:${Q(Y)}`,workflowVisibilityCreated:(F,Y)=>`wf-idx-created:${_(F)}:${Q(Y)}`,workflowVisibilityUpdated:(F,Y)=>`wf-idx-updated:${_(F)}:${Q(Y)}`,workflowVisibilityDeadline:(F,Y)=>`wf-idx-deadline:${_(F)}:${Q(Y)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Q(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function s(F){if(F===void 0)return;if(typeof F!=="number"||!Number.isInteger(F)||F<0)throw Error("deleteRange limit must be a finite non-negative integer");return F===0?0:F}function P(F){let Y={},J=!1;for(let X of["gt","gte","lt","lte"]){let $=F[X];if($===void 0)continue;if(typeof $!=="string")throw Error("deleteRange bounds must be strings");Y[X]=$,J=!0}if(!J)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let U=s(F.limit);if(U!==void 0)Y.limit=U;return Y}async function m(F,Y,J){let U=P(J);if(F.deleteRange)return F.deleteRange(Y,U);return b(F,Y,U)}function a(F,Y){let J={key:F,open:!1};if(Y.gte!==void 0&&Y.gte>J.key)J.key=Y.gte,J.open=!1;if(Y.gt!==void 0&&Y.gt>=J.key)J.key=Y.gt,J.open=!0;return J}function i(F,Y){let J={key:N(F),open:!0};if(Y.lt!==void 0&&Y.lt<=J.key)J.key=Y.lt,J.open=!0;if(Y.lte!==void 0&&Y.lte<J.key)J.key=Y.lte,J.open=!1;return J}function y(F,Y){let J=a(F,Y),U=i(F,Y);if(J.key>U.key||J.key===U.key&&(J.open||U.open))return null;return{lower:J,upper:U}}function h(F){return F.replaceAll(/:+$/g,"")}function n(F,Y){let J=h(F),U=h(Y);if(J.length===0)return U;if(U.length===0)return J;return`${J}:${U}`}class R{#Y;#J;constructor(F,Y){this.#Y=F,this.#J=h(Y)}#F(F){if(this.#J.length===0)return F;return F.length===0?`${this.#J}:`:`${this.#J}:${F}`}#Q(F){if(this.#J.length===0)return F;return F.slice(this.#J.length+1)}#U(F={}){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.reverse!==void 0)Y.reverse=F.reverse;if(F.gt!==void 0)Y.gt=this.#F(F.gt);if(F.gte!==void 0)Y.gte=this.#F(F.gte);if(F.lt!==void 0)Y.lt=this.#F(F.lt);if(F.lte!==void 0)Y.lte=this.#F(F.lte);return Y}#X(F){let Y={};if(F.limit!==void 0)Y.limit=F.limit;if(F.gt!==void 0)Y.gt=this.#F(F.gt);if(F.gte!==void 0)Y.gte=this.#F(F.gte);if(F.lt!==void 0)Y.lt=this.#F(F.lt);if(F.lte!==void 0)Y.lte=this.#F(F.lte);return Y}capabilities(){return this.#Y.capabilities()}scoped(F){return new R(this.#Y,n(this.#J,F))}async get(F){return this.#Y.get(this.#F(F))}async put(F,Y){await this.#Y.put(this.#F(F),Y)}async delete(F){await this.#Y.delete(this.#F(F))}async*scan(F,Y){for await(let[J,U]of this.#Y.scan(this.#F(F),this.#U(Y)))yield[this.#Q(J),U]}async batch(F){await this.#Y.batch(F.map((Y)=>{if(Y.type==="put")return{type:"put",key:this.#F(Y.key),value:Y.value};return{type:"delete",key:this.#F(Y.key)}}))}async conditionalBatch(F,Y){return u(this.#Y,F.map((J)=>({key:this.#F(J.key),expectedValue:J.expectedValue})),Y.map((J)=>{if(J.type==="put")return{type:"put",key:this.#F(J.key),value:J.value};return{type:"delete",key:this.#F(J.key)}}))}async has(F){return S(this.#Y,this.#F(F))}async deletePrefix(F){return w(this.#Y,this.#F(F))}async deleteRange(F,Y){let J=this.#X(P(Y));return m(this.#Y,this.#F(F),J)}async*keys(F,Y){for await(let J of x(this.#Y,this.#F(F),this.#U(Y)))yield this.#Q(J)}async count(F){return k(this.#Y,this.#F(F))}[Symbol.dispose](){this.#Y[Symbol.dispose]()}}function f(F,Y){return new R(F,Y)}var G="kv";function A(F){return new Promise((Y,J)=>{F.onsuccess=()=>Y(F.result),F.onerror=()=>J(F.error)})}function g(F,Y){let J=null,U=null,X=null,$=(Z,L)=>{let W=Z??Error(L);if(U){let B=U;J=null,U=null,B(W);return}X=W};return F.onsuccess=()=>{if(!J)return;let Z=J;J=null,U=null,Z(F.result)},F.onerror=()=>{$(F.error,"IndexedDB cursor request failed.")},Y.onerror=()=>{$(Y.error,"IndexedDB transaction failed.")},Y.onabort=()=>{$(Y.error,"IndexedDB transaction aborted.")},()=>{return new Promise((Z,L)=>{if(X){let W=X;X=null,L(W);return}if(J=Z,U=L,F.readyState==="done"){let W=J;J=null,U=null,W?.(F.result)}})}}class r{#Y;#J=null;#F;constructor(F="weft"){this.#Y=F,this.#F=this.#Q()}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"best-effort",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#Q(){let F=indexedDB.open(this.#Y,1);return F.onupgradeneeded=()=>{let Y=F.result;if(!Y.objectStoreNames.contains(G))Y.createObjectStore(G)},A(F).then((Y)=>{return this.#J=Y,Y})}async get(F){let U=(await this.#F).transaction(G,"readonly").objectStore(G),X=await A(U.get(F));return X===void 0?null:new Uint8Array(X)}async put(F,Y){let X=(await this.#F).transaction(G,"readwrite").objectStore(G);await A(X.put(Y,F))}async delete(F){let U=(await this.#F).transaction(G,"readwrite").objectStore(G);await A(U.delete(F))}async has(F){let U=(await this.#F).transaction(G,"readonly").objectStore(G);return await A(U.count(F))>0}async deletePrefix(F){let Y=await this.#F,J=N(F),U=IDBKeyRange.bound(F,J,!1,!0);return new Promise((X,$)=>{let Z=Y.transaction(G,"readwrite"),L=Z.objectStore(G),W=0,B=L.count(U);B.onsuccess=()=>{W=B.result,L.delete(U)},Z.oncomplete=()=>X(W),Z.onerror=()=>$(Z.error)})}async deleteRange(F,Y){let J=P(Y),U=y(F,J);if(U===null)return 0;let X=IDBKeyRange.bound(U.lower.key,U.upper.key,U.lower.open,U.upper.open),$=await this.#F,{limit:Z}=J;return new Promise((L,W)=>{let B=$.transaction(G,"readwrite"),M=B.objectStore(G),D=0;if(Z===void 0){let H=M.count(X);H.onsuccess=()=>{D=H.result,M.delete(X)}}else{let H=M.openCursor(X,"next");H.onsuccess=()=>{let z=H.result;if(z===null||D>=Z)return;if(z.delete(),D++,D<Z)z.continue()}}B.oncomplete=()=>L(D),B.onerror=()=>W(B.error)})}async*scan(F,Y={}){let{limit:J,reverse:U}=Y,X=await this.#F,$=N(F),Z=IDBKeyRange.bound(F,$,!1,!0),L=U?"prev":"next",W=X.transaction(G,"readonly"),M=W.objectStore(G).openCursor(Z,L),D=0,H=g(M,W),z=!1;try{let V=await H();while(V){if(J!==void 0&&D>=J)break;let j=V.key;if(O(j,Y))yield[j,new Uint8Array(V.value)],D++;V.continue(),V=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async batch(F){if(F.length===0)return;let Y=await this.#F;return new Promise((J,U)=>{let X=Y.transaction(G,"readwrite"),$=X.objectStore(G);for(let Z of F)if(Z.type==="put")$.put(Z.value,Z.key);else $.delete(Z.key);X.oncomplete=()=>J(),X.onerror=()=>U(X.error)})}async conditionalBatch(F,Y){let J=await this.#F;return new Promise((U,X)=>{let $=J.transaction(G,"readwrite"),Z=$.objectStore(G),L=!1,W=!1,B=(H,z)=>{if(L)return;L=!0,X(H??Error(z))};$.oncomplete=()=>{if(L)return;L=!0,U(!0)},$.onerror=()=>{B($.error,"IndexedDB conditionalBatch transaction failed.")},$.onabort=()=>{if(L)return;if(L=!0,W){U(!1);return}X($.error??Error("IndexedDB conditionalBatch transaction aborted."))};let M=()=>{for(let H of Y)if(H.type==="put")Z.put(H.value,H.key);else Z.delete(H.key)},D=(H)=>{if(H>=F.length){M();return}let z=F[H],V=Z.get(z.key);V.onsuccess=()=>{let j=V.result,c=j===void 0?null:new Uint8Array(j);if(!I(c,z.expectedValue)){W=!0,$.abort();return}D(H+1)},V.onerror=()=>{B(V.error,"IndexedDB conditionalBatch condition check failed.")}};D(0)})}async*keys(F,Y={}){let{limit:J,reverse:U}=Y,X=await this.#F,$=N(F),Z=IDBKeyRange.bound(F,$,!1,!0),L=U?"prev":"next",W=X.transaction(G,"readonly"),M=W.objectStore(G).openKeyCursor(Z,L),D=0,H=g(M,W),z=!1;try{let V=await H();while(V){if(J!==void 0&&D>=J)break;let j=V.key;if(O(j,Y))yield j,D++;V.continue(),V=await H()}z=!0}finally{if(!z)try{W.abort()}catch{}}}async count(F){let Y=await this.#F,J=N(F),X=Y.transaction(G,"readonly").objectStore(G);return A(X.count(IDBKeyRange.bound(F,J,!1,!0)))}scoped(F){return f(this,F)}[Symbol.dispose](){if(this.#J)this.#J.close(),this.#J=null}}export{r as IndexedDBStorage};
|
|
@@ -321,6 +321,32 @@ export declare const KEYS: {
|
|
|
321
321
|
readonly update: (workflowId: string, updateId: string) => string;
|
|
322
322
|
readonly updateResponse: (updateId: string) => string;
|
|
323
323
|
readonly updateIdempotency: (workflowId: string, key: string) => string;
|
|
324
|
+
/**
|
|
325
|
+
* Maps a start `idempotencyKey` to the workflow id created for it. Written
|
|
326
|
+
* atomically with the workflow record under a `conditionalBatch` gated on this
|
|
327
|
+
* key being absent, so concurrent same-key starts converge on one workflow.
|
|
328
|
+
* Unlike `updateIdempotency`, it is keyed by the idempotency key alone (no
|
|
329
|
+
* workflow id) because the workflow id is the value it resolves to. It is
|
|
330
|
+
* intentionally NOT swept on terminal cleanup: it must outlive the run so a
|
|
331
|
+
* post-completion `startOrSignal` sees a terminal workflow (and conflicts)
|
|
332
|
+
* rather than missing the mapping and creating a fresh run.
|
|
333
|
+
*/
|
|
334
|
+
readonly startIdempotency: (key: string) => string;
|
|
335
|
+
/**
|
|
336
|
+
* The convergence signal id that `startOrSignal` derives from an idempotency
|
|
337
|
+
* key so independent same-key callers deliver ONE signal. Deliberately uses the
|
|
338
|
+
* RAW key (not `encodeStorageKeyComponent`): unlike `startIdempotency` this is a
|
|
339
|
+
* signal id, not a storage key, and `validateSignalId` is character-agnostic, so
|
|
340
|
+
* the raw key is always a valid id as long as it fits the byte cap (enforced as
|
|
341
|
+
* ≤117 bytes so `"start-idem:"` + key stays within the 128-byte signal-id
|
|
342
|
+
* ceiling). The two derivations are independent namespaces; both are individually
|
|
343
|
+
* correct, so the raw-vs-encoded difference is harmless.
|
|
344
|
+
*/
|
|
345
|
+
readonly startIdempotencySignalId: (key: string) => string;
|
|
346
|
+
/** Scan prefix for engine liveness heartbeats (best-effort second-instance detection). */
|
|
347
|
+
readonly livenessPrefix: () => string;
|
|
348
|
+
/** Per-engine liveness heartbeat key. One key per engine instance under the shared store. */
|
|
349
|
+
readonly liveness: (instanceId: string) => string;
|
|
324
350
|
readonly budget: (namespace: string, period: string, date: string) => string;
|
|
325
351
|
readonly review: (workflowId: string, reviewId: string) => string;
|
|
326
352
|
readonly workflowHeaders: (workflowId: string) => string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var V=Object.defineProperty;var Z=(E)=>E;function $(E,_){this[E]=Z.bind(null,_)}var H=(E,_)=>{for(var W in _)V(E,W,{get:_[W],enumerable:!0,configurable:!0,set:$.bind(_,W)})};var B=(E,_)=>()=>(E&&(_=E(E=0)),_);function U(E,_,W){if(!E.capabilities()[_])throw Error(`Feature "${W}" requires storage capability "${_}", but this storage backend does not provide it.`)}function j(E){let _=E.capabilities(),W=[];if(_.persistence!=="local"&&_.persistence!=="remote")W.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)W.push("atomicBatch must be true");if(!_.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var L="default";async function G(E,_){return await E.get(_)!==null}async function*X(E,_,W){for await(let[P]of E.scan(_,W))yield P}async function J(E,_){let W=0;for await(let P of X(E,_))W++;return W}async function M(E,_){let W=[];for await(let P of X(E,_))W.push({type:"delete",key:P});if(W.length===0)return 0;return await E.batch(W),W.length}async function T(E,_,W){let P=[];for await(let Q of X(E,_,W))P.push({type:"delete",key:Q});if(P.length===0)return 0;return await E.batch(P),P.length}var D;var O=B(()=>{D=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function K(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function S(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function C(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let W=0;W<E.byteLength;W++)if(E[W]!==_[W])return!1;return!0}async function c(E,_){if(E.has)return E.has(_);return G(E,_)}function I(E,_,W){if(E.keys)return E.keys(_,W);return X(E,_,W)}async function f(E,_){if(E.count)return E.count(_);return J(E,_)}async function m(E,_){if(E.deletePrefix)return E.deletePrefix(_);return M(E,_)}async function y(E,_,W){if(U(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,W)}function F(E){return encodeURIComponent(E)}function k(E){return decodeURIComponent(E)}function l(E){try{return decodeURIComponent(E)}catch{return null}}var R=(E)=>String(E).padStart(16,"0"),g;var z=B(()=>{O();g={workflow:(E)=>`wf:${F(E)}`,checkpoint:(E)=>`wf:${F(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${F(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${F(E)}:timeline:`,timeline:(E,_)=>`wf:${F(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${F(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${F(_)}`,scheduleRun:(E)=>`schedule-run:${F(E)}`,operation:(E,_,W)=>`op:${E}:${R(_)}:${W}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,W)=>`audit:bulk:${R(E)}:${F(_)}:${F(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${R(E)}:${F(_)}`,asyncActivity:(E,_)=>`async-act:v1:${F(E)}:${F(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${F(E)}:`,activityReconciliation:(E,_,W)=>`actrec:v1:${F(E)}:${F(_)}:${W}`,eventPrefix:(E)=>`ev:${F(E)}:`,event:(E,_)=>`ev:${F(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${F(E)}:head`,eventWatermark:(E)=>`ev:${F(E)}:watermark`,signal:(E,_,W)=>`sig:${F(E)}:${_}:${F(W)}`,signalSequence:(E)=>`sigseq:v1:${F(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${F(E)}:`,signalAcceptedResponse:(E,_,W)=>`sigres:v1:${F(E)}:${F(_)}:${F(W)}`,deadline:(E,_)=>`wf-deadline:${R(E)}:${F(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${R(E)}:${F(_)}`,delayedStart:(E,_)=>`wf-delayed:${R(E)}:${F(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${R(E)}:${F(_)}`,attribute:(E)=>`attr:${F(E)}`,attributeIndex:(E,_,W)=>`idx:${E}:${_}:${F(W)}`,tagIndex:(E,_)=>`tag:${F(E)}:${F(_)}`,updatePrefix:(E)=>`upd:${F(E)}:`,update:(E,_)=>`upd:${F(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${F(E)}:${_}`,startIdempotency:(E)=>`start-idem:${F(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${F(E)}`,budget:(E,_,W)=>`budget:${E}:${_}:${W}`,review:(E,_)=>`review:${F(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${F(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${F(E)}`,workflowHasServices:(E)=>`wf-has-services:${F(E)}`,offload:(E,_)=>`offload:${F(E)}:${_}`,archive:(E,_)=>`archive:${F(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${F(E)}:${F(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${L}:${F(E)}:${F(_)}`,streamChunkPrefix:(E,_)=>`blob:${F(E)}:${_}:chunk:`,streamChunk:(E,_,W)=>`blob:${F(E)}:${_}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${F(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,W)=>`tool-effect:${F(E)}:${_}:${W}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${F(E)}:${F(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${F(E)}:${F(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${R(E)}:${F(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${R(E)}:${F(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${R(E)}:${F(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${F(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});z();export{l as tryDecodeStorageKeyComponent,C as storageValuesEqual,I as storageKeys,c as storageHas,m as storageDeletePrefix,f as storageCount,y as storageConditionalBatch,K as resolvePrefixRangeEnd,U as requireStorageCapability,S as matchesScanOptions,F as encodeStorageKeyComponent,k as decodeStorageKeyComponent,j as assertDurableStorageForRecovery,D as WEFT_RESERVED_KEY_PREFIXES,g as KEYS,L as DEFAULT_SCOPE};
|
|
@@ -16,4 +16,4 @@
|
|
|
16
16
|
* console.log(isWeftKey); // true
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
export declare const WEFT_RESERVED_KEY_PREFIXES: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-terminal:"];
|
|
19
|
+
export declare const WEFT_RESERVED_KEY_PREFIXES: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "ev:", "idx:", "liveness:", "offload:", "op:", "review:", "schedule:", "schedule-due:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-deadline:", "wf-delayed:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-terminal:"];
|
|
@@ -9,6 +9,7 @@ export const WEFT_RESERVED_KEY_PREFIXES = [
|
|
|
9
9
|
"budget-charged:",
|
|
10
10
|
"ev:",
|
|
11
11
|
"idx:",
|
|
12
|
+
"liveness:",
|
|
12
13
|
"offload:",
|
|
13
14
|
"op:",
|
|
14
15
|
"review:",
|
|
@@ -18,6 +19,7 @@ export const WEFT_RESERVED_KEY_PREFIXES = [
|
|
|
18
19
|
"sig:",
|
|
19
20
|
"sigres:",
|
|
20
21
|
"sigseq:",
|
|
22
|
+
"start-idem:",
|
|
21
23
|
"state:",
|
|
22
24
|
"tag:",
|
|
23
25
|
"tool-effect:",
|
package/dist/storage/lmdb.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var y=Object.defineProperty;var g=(E)=>E;function f(E,_){this[E]=g.bind(null,_)}var l=(E,_)=>{for(var W in _)y(E,W,{get:_[W],enumerable:!0,configurable:!0,set:f.bind(_,W)})};var j=(E,_)=>()=>(E&&(_=E(E=0)),_);function B(E,_,W){if(!E.capabilities()[_])throw Error(`Feature "${W}" requires storage capability "${_}", but this storage backend does not provide it.`)}function d(E){let _=E.capabilities(),W=[];if(_.persistence!=="local")W.push(`persistence must be "local" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)W.push("atomicBatch must be true");if(!_.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var L="default";async function A(E,_){return await E.get(_)!==null}async function*Q(E,_,W){for await(let[Y]of E.scan(_,W))yield Y}async function z(E,_){let W=0;for await(let Y of Q(E,_))W++;return W}async function P(E,_){let W=[];for await(let Y of Q(E,_))W.push({type:"delete",key:Y});if(W.length===0)return 0;return await E.batch(W),W.length}async function O(E,_,W){let Y=[];for await(let X of Q(E,_,W))Y.push({type:"delete",key:X});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var p;var h=j(()=>{p=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function V(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function N(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function v(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let W=0;W<E.byteLength;W++)if(E[W]!==_[W])return!1;return!0}async function C(E,_){if(E.has)return E.has(_);return A(E,_)}function K(E,_,W){if(E.keys)return E.keys(_,W);return Q(E,_,W)}async function b(E,_){if(E.count)return E.count(_);return z(E,_)}async function S(E,_){if(E.deletePrefix)return E.deletePrefix(_);return P(E,_)}async function u(E,_,W){if(B(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,W)}function F(E){return encodeURIComponent(E)}function YE(E){return decodeURIComponent(E)}function XE(E){try{return decodeURIComponent(E)}catch{return null}}var J=(E)=>String(E).padStart(16,"0"),JE;var q=j(()=>{h();JE={workflow:(E)=>`wf:${F(E)}`,checkpoint:(E)=>`wf:${F(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${F(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${F(E)}:timeline:`,timeline:(E,_)=>`wf:${F(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${F(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${F(_)}`,scheduleRun:(E)=>`schedule-run:${F(E)}`,operation:(E,_,W)=>`op:${E}:${J(_)}:${W}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,W)=>`audit:bulk:${J(E)}:${F(_)}:${F(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${J(E)}:${F(_)}`,asyncActivity:(E,_)=>`async-act:v1:${F(E)}:${F(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${F(E)}:`,activityReconciliation:(E,_,W)=>`actrec:v1:${F(E)}:${F(_)}:${W}`,eventPrefix:(E)=>`ev:${F(E)}:`,event:(E,_)=>`ev:${F(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${F(E)}:head`,eventWatermark:(E)=>`ev:${F(E)}:watermark`,signal:(E,_,W)=>`sig:${F(E)}:${_}:${F(W)}`,signalSequence:(E)=>`sigseq:v1:${F(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${F(E)}:`,signalAcceptedResponse:(E,_,W)=>`sigres:v1:${F(E)}:${F(_)}:${F(W)}`,deadline:(E,_)=>`wf-deadline:${J(E)}:${F(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${J(E)}:${F(_)}`,delayedStart:(E,_)=>`wf-delayed:${J(E)}:${F(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${J(E)}:${F(_)}`,attribute:(E)=>`attr:${F(E)}`,attributeIndex:(E,_,W)=>`idx:${E}:${_}:${F(W)}`,tagIndex:(E,_)=>`tag:${F(E)}:${F(_)}`,updatePrefix:(E)=>`upd:${F(E)}:`,update:(E,_)=>`upd:${F(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${F(E)}:${_}`,budget:(E,_,W)=>`budget:${E}:${_}:${W}`,review:(E,_)=>`review:${F(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${F(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${F(E)}`,workflowHasServices:(E)=>`wf-has-services:${F(E)}`,offload:(E,_)=>`offload:${F(E)}:${_}`,archive:(E,_)=>`archive:${F(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${F(E)}:${F(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${L}:${F(E)}:${F(_)}`,streamChunkPrefix:(E,_)=>`blob:${F(E)}:${_}:chunk:`,streamChunk:(E,_,W)=>`blob:${F(E)}:${_}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${F(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,W)=>`tool-effect:${F(E)}:${_}:${W}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${F(E)}:${F(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${F(E)}:${F(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${J(E)}:${F(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${J(E)}:${F(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${J(E)}:${F(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${F(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function s(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 H(E){let _={},W=!1;for(let X of["gt","gte","lt","lte"]){let U=E[X];if(U===void 0)continue;if(typeof U!=="string")throw Error("deleteRange bounds must be strings");_[X]=U,W=!0}if(!W)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=s(E.limit);if(Y!==void 0)_.limit=Y;return _}async function I(E,_,W){let Y=H(W);if(E.deleteRange)return E.deleteRange(_,Y);return O(E,_,Y)}var D=()=>{};function R(E){return E.replaceAll(/:+$/g,"")}function a(E,_){let W=R(E),Y=R(_);if(W.length===0)return Y;if(Y.length===0)return W;return`${W}:${Y}`}function x(E,_){return new T(E,_)}var T;var c=j(()=>{D();q();T=class T{#E;#F;constructor(E,_){this.#E=E,this.#F=R(_)}#_(E){if(this.#F.length===0)return E;return E.length===0?`${this.#F}:`:`${this.#F}:${E}`}#W(E){if(this.#F.length===0)return E;return E.slice(this.#F.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}capabilities(){return this.#E.capabilities()}scoped(E){return new T(this.#E,a(this.#F,E))}async get(E){return this.#E.get(this.#_(E))}async put(E,_){await this.#E.put(this.#_(E),_)}async delete(E){await this.#E.delete(this.#_(E))}async*scan(E,_){for await(let[W,Y]of this.#E.scan(this.#_(E),this.#Y(_)))yield[this.#W(W),Y]}async batch(E){await this.#E.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#_(_.key),value:_.value};return{type:"delete",key:this.#_(_.key)}}))}async conditionalBatch(E,_){return u(this.#E,E.map((W)=>({key:this.#_(W.key),expectedValue:W.expectedValue})),_.map((W)=>{if(W.type==="put")return{type:"put",key:this.#_(W.key),value:W.value};return{type:"delete",key:this.#_(W.key)}}))}async has(E){return C(this.#E,this.#_(E))}async deletePrefix(E){return S(this.#E,this.#_(E))}async deleteRange(E,_){let W=this.#X(H(_));return I(this.#E,this.#_(E),W)}async*keys(E,_){for await(let W of K(this.#E,this.#_(E),this.#Y(_)))yield this.#W(W)}async count(E){return b(this.#E,this.#_(E))}[Symbol.dispose](){this.#E[Symbol.dispose]()}}});var i={};l(i,{LMDBStorage:()=>k});import*as w from"lmdb";var k;var r=j(()=>{D();q();c();k=class k{#E;#F=!1;#_=null;constructor(E){this.#E=w.open({path:E,encoding:"binary"})}#W(){if(this.#F)throw Error("LMDBStorage is closed")}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!1}}async get(E){this.#W();let _=this.#E.get(E);if(_===void 0)return null;return new Uint8Array(_)}async put(E,_){this.#W(),await this.#E.put(E,Buffer.from(_))}async delete(E){this.#W(),await this.#E.remove(E)}async has(E){return this.#W(),this.#E.doesExist(E)}async deletePrefix(E){this.#W();let _=[];for await(let W of this.keys(E))_.push(W);if(_.length===0)return 0;return await this.#E.batch(()=>{for(let W of _)this.#E.remove(W)}),_.length}async deleteRange(E,_){this.#W();let W=H(_),Y=[];for await(let X of this.keys(E,W))Y.push(X);if(Y.length===0)return 0;return await this.#E.batch(()=>{for(let X of Y)this.#E.remove(X)}),Y.length}async*scan(E,_={}){this.#W();let{limit:W,reverse:Y}=_,X=V(E),U=Y?this.#E.getRange({start:X,end:E,reverse:!0}):this.#E.getRange({start:E,end:X}),$=0,G=!1;for(let{key:Z,value:m}of U){if(!Z.startsWith(E)){if(Y&&!G)continue;break}if(G=!0,!N(Z,_))continue;if(W!==void 0&&$>=W)break;yield[Z,new Uint8Array(m)],$++}}async*keys(E,_={}){this.#W();let{limit:W,reverse:Y}=_,X=V(E),U=Y?this.#E.getKeys({start:X,end:E,reverse:!0}):this.#E.getKeys({start:E,end:X}),$=0,G=!1;for(let Z of U){if(!Z.startsWith(E)){if(Y&&!G)continue;break}if(G=!0,!N(Z,_))continue;if(W!==void 0&&$>=W)break;yield Z,$++}}async count(E){this.#W();let _=V(E);return this.#E.getKeysCount({start:E,end:_})}scoped(E){return this.#W(),x(this,E)}async batch(E){if(this.#W(),E.length===0)return;await this.#E.batch(()=>{for(let _ of E)if(_.type==="put")this.#E.put(_.key,Buffer.from(_.value));else this.#E.remove(_.key)})}async conditionalBatch(E,_){return this.#W(),this.#E.transactionSync(()=>{for(let Y of E){let X=this.#E.get(Y.key),U=X===void 0?null:new Uint8Array(X);if(!v(U,Y.expectedValue))return!1}for(let Y of _)if(Y.type==="put")this.#E.putSync(Y.key,Buffer.from(Y.value));else this.#E.removeSync(Y.key);return!0})}close(){return this.#F=!0,this.#_??=(async()=>{await Promise.resolve(),await this.#E.close()})(),this.#_}[Symbol.dispose](){this.close()}}});r();export{k as LMDBStorage};
|
|
2
|
+
var y=Object.defineProperty;var g=(E)=>E;function f(E,_){this[E]=g.bind(null,_)}var l=(E,_)=>{for(var F in _)y(E,F,{get:_[F],enumerable:!0,configurable:!0,set:f.bind(_,F)})};var G=(E,_)=>()=>(E&&(_=E(E=0)),_);function V(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function d(E){let _=E.capabilities(),F=[];if(_.persistence!=="local"&&_.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)F.push("atomicBatch must be true");if(!_.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var B="default";async function A(E,_){return await E.get(_)!==null}async function*M(E,_,F){for await(let[Y]of E.scan(_,F))yield Y}async function z(E,_){let F=0;for await(let Y of M(E,_))F++;return F}async function P(E,_){let F=[];for await(let Y of M(E,_))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}async function O(E,_,F){let Y=[];for await(let X of M(E,_,F))Y.push({type:"delete",key:X});if(Y.length===0)return 0;return await E.batch(Y),Y.length}var s;var v=G(()=>{s=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function L(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function q(E,_={}){if(_.gt!==void 0&&E<=_.gt)return!1;if(_.gte!==void 0&&E<_.gte)return!1;if(_.lt!==void 0&&E>=_.lt)return!1;if(_.lte!==void 0&&E>_.lte)return!1;return!0}function h(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let F=0;F<E.byteLength;F++)if(E[F]!==_[F])return!1;return!0}async function b(E,_){if(E.has)return E.has(_);return A(E,_)}function C(E,_,F){if(E.keys)return E.keys(_,F);return M(E,_,F)}async function K(E,_){if(E.count)return E.count(_);return z(E,_)}async function S(E,_){if(E.deletePrefix)return E.deletePrefix(_);return P(E,_)}async function u(E,_,F){if(V(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,F)}function W(E){return encodeURIComponent(E)}function YE(E){return decodeURIComponent(E)}function XE(E){try{return decodeURIComponent(E)}catch{return null}}var J=(E)=>String(E).padStart(16,"0"),JE;var N=G(()=>{v();JE={workflow:(E)=>`wf:${W(E)}`,checkpoint:(E)=>`wf:${W(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${W(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${W(E)}:timeline:`,timeline:(E,_)=>`wf:${W(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${W(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${W(_)}`,scheduleRun:(E)=>`schedule-run:${W(E)}`,operation:(E,_,F)=>`op:${E}:${J(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${J(E)}:${W(_)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${J(E)}:${W(_)}`,asyncActivity:(E,_)=>`async-act:v1:${W(E)}:${W(_)}`,activityReconciliationPrefix:(E)=>`actrec:v1:${W(E)}:`,activityReconciliation:(E,_,F)=>`actrec:v1:${W(E)}:${W(_)}:${F}`,eventPrefix:(E)=>`ev:${W(E)}:`,event:(E,_)=>`ev:${W(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${W(E)}:head`,eventWatermark:(E)=>`ev:${W(E)}:watermark`,signal:(E,_,F)=>`sig:${W(E)}:${_}:${W(F)}`,signalSequence:(E)=>`sigseq:v1:${W(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${W(E)}:`,signalAcceptedResponse:(E,_,F)=>`sigres:v1:${W(E)}:${W(_)}:${W(F)}`,deadline:(E,_)=>`wf-deadline:${J(E)}:${W(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${J(E)}:${W(_)}`,delayedStart:(E,_)=>`wf-delayed:${J(E)}:${W(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${J(E)}:${W(_)}`,attribute:(E)=>`attr:${W(E)}`,attributeIndex:(E,_,F)=>`idx:${E}:${_}:${W(F)}`,tagIndex:(E,_)=>`tag:${W(E)}:${W(_)}`,updatePrefix:(E)=>`upd:${W(E)}:`,update:(E,_)=>`upd:${W(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${W(E)}:${_}`,startIdempotency:(E)=>`start-idem:${W(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${W(E)}`,budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${W(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${W(E)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${W(E)}`,workflowHasServices:(E)=>`wf-has-services:${W(E)}`,offload:(E,_)=>`offload:${W(E)}:${_}`,archive:(E,_)=>`archive:${W(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${W(E)}:${W(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${B}:${W(E)}:${W(_)}`,streamChunkPrefix:(E,_)=>`blob:${W(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${W(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(E,_)=>`blob:${W(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,F)=>`tool-effect:${W(E)}:${_}:${F}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${W(E)}:${W(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${W(E)}:${W(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${J(E)}:${W(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${J(E)}:${W(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${J(E)}:${W(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${W(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function p(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 H(E){let _={},F=!1;for(let X of["gt","gte","lt","lte"]){let Q=E[X];if(Q===void 0)continue;if(typeof Q!=="string")throw Error("deleteRange bounds must be strings");_[X]=Q,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=p(E.limit);if(Y!==void 0)_.limit=Y;return _}async function I(E,_,F){let Y=H(F);if(E.deleteRange)return E.deleteRange(_,Y);return O(E,_,Y)}var D=()=>{};function R(E){return E.replaceAll(/:+$/g,"")}function a(E,_){let F=R(E),Y=R(_);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function x(E,_){return new T(E,_)}var T;var c=G(()=>{D();N();T=class T{#E;#W;constructor(E,_){this.#E=E,this.#W=R(_)}#_(E){if(this.#W.length===0)return E;return E.length===0?`${this.#W}:`:`${this.#W}:${E}`}#F(E){if(this.#W.length===0)return E;return E.slice(this.#W.length+1)}#Y(E={}){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.reverse!==void 0)_.reverse=E.reverse;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}#X(E){let _={};if(E.limit!==void 0)_.limit=E.limit;if(E.gt!==void 0)_.gt=this.#_(E.gt);if(E.gte!==void 0)_.gte=this.#_(E.gte);if(E.lt!==void 0)_.lt=this.#_(E.lt);if(E.lte!==void 0)_.lte=this.#_(E.lte);return _}capabilities(){return this.#E.capabilities()}scoped(E){return new T(this.#E,a(this.#W,E))}async get(E){return this.#E.get(this.#_(E))}async put(E,_){await this.#E.put(this.#_(E),_)}async delete(E){await this.#E.delete(this.#_(E))}async*scan(E,_){for await(let[F,Y]of this.#E.scan(this.#_(E),this.#Y(_)))yield[this.#F(F),Y]}async batch(E){await this.#E.batch(E.map((_)=>{if(_.type==="put")return{type:"put",key:this.#_(_.key),value:_.value};return{type:"delete",key:this.#_(_.key)}}))}async conditionalBatch(E,_){return u(this.#E,E.map((F)=>({key:this.#_(F.key),expectedValue:F.expectedValue})),_.map((F)=>{if(F.type==="put")return{type:"put",key:this.#_(F.key),value:F.value};return{type:"delete",key:this.#_(F.key)}}))}async has(E){return b(this.#E,this.#_(E))}async deletePrefix(E){return S(this.#E,this.#_(E))}async deleteRange(E,_){let F=this.#X(H(_));return I(this.#E,this.#_(E),F)}async*keys(E,_){for await(let F of C(this.#E,this.#_(E),this.#Y(_)))yield this.#F(F)}async count(E){return K(this.#E,this.#_(E))}[Symbol.dispose](){this.#E[Symbol.dispose]()}}});var i={};l(i,{LMDBStorage:()=>m});import*as w from"lmdb";var m;var r=G(()=>{D();N();c();m=class m{#E;#W=!1;#_=null;constructor(E){this.#E=w.open({path:E,encoding:"binary"})}#F(){if(this.#W)throw Error("LMDBStorage is closed")}capabilities(){return{persistence:"local",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!1}}async get(E){this.#F();let _=this.#E.get(E);if(_===void 0)return null;return new Uint8Array(_)}async put(E,_){this.#F(),await this.#E.put(E,Buffer.from(_))}async delete(E){this.#F(),await this.#E.remove(E)}async has(E){return this.#F(),this.#E.doesExist(E)}async deletePrefix(E){this.#F();let _=[];for await(let F of this.keys(E))_.push(F);if(_.length===0)return 0;return await this.#E.batch(()=>{for(let F of _)this.#E.remove(F)}),_.length}async deleteRange(E,_){this.#F();let F=H(_),Y=[];for await(let X of this.keys(E,F))Y.push(X);if(Y.length===0)return 0;return await this.#E.batch(()=>{for(let X of Y)this.#E.remove(X)}),Y.length}async*scan(E,_={}){this.#F();let{limit:F,reverse:Y}=_,X=L(E),Q=Y?this.#E.getRange({start:X,end:E,reverse:!0}):this.#E.getRange({start:E,end:X}),Z=0,$=!1;for(let{key:U,value:k}of Q){if(!U.startsWith(E)){if(Y&&!$)continue;break}if($=!0,!q(U,_))continue;if(F!==void 0&&Z>=F)break;yield[U,new Uint8Array(k)],Z++}}async*keys(E,_={}){this.#F();let{limit:F,reverse:Y}=_,X=L(E),Q=Y?this.#E.getKeys({start:X,end:E,reverse:!0}):this.#E.getKeys({start:E,end:X}),Z=0,$=!1;for(let U of Q){if(!U.startsWith(E)){if(Y&&!$)continue;break}if($=!0,!q(U,_))continue;if(F!==void 0&&Z>=F)break;yield U,Z++}}async count(E){this.#F();let _=L(E);return this.#E.getKeysCount({start:E,end:_})}scoped(E){return this.#F(),x(this,E)}async batch(E){if(this.#F(),E.length===0)return;await this.#E.batch(()=>{for(let _ of E)if(_.type==="put")this.#E.put(_.key,Buffer.from(_.value));else this.#E.remove(_.key)})}async conditionalBatch(E,_){return this.#F(),this.#E.transactionSync(()=>{for(let Y of E){let X=this.#E.get(Y.key),Q=X===void 0?null:new Uint8Array(X);if(!h(Q,Y.expectedValue))return!1}for(let Y of _)if(Y.type==="put")this.#E.putSync(Y.key,Buffer.from(Y.value));else this.#E.removeSync(Y.key);return!0})}close(){return this.#W=!0,this.#_??=(async()=>{await Promise.resolve(),await this.#E.close()})(),this.#_}[Symbol.dispose](){this.close()}}});r();export{m as LMDBStorage};
|
package/dist/storage/memory.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var c=Object.defineProperty;var k=(_)=>_;function y(_,E){this[_]=k.bind(null,E)}var g=(_,E)=>{for(var W in E)c(_,W,{get:E[W],enumerable:!0,configurable:!0,set:y.bind(E,W)})};var j=(_,E)=>()=>(_&&(E=_(_=0)),E);function L(_,E,W){if(!_.capabilities()[E])throw Error(`Feature "${W}" requires storage capability "${E}", but this storage backend does not provide it.`)}function f(_){let E=_.capabilities(),W=[];if(E.persistence!=="local")W.push(`persistence must be "local" (got "${E.persistence}")`);if(E.readAfterWrite!=="linearizable")W.push(`readAfterWrite must be "linearizable" (got "${E.readAfterWrite}")`);if(E.scanConsistency!=="snapshot")W.push(`scanConsistency must be "snapshot" (got "${E.scanConsistency}")`);if(!E.atomicBatch)W.push("atomicBatch must be true");if(!E.conditionalBatch)W.push("conditionalBatch must be true");if(W.length>0)throw Error(`Storage is not durable enough for recovery: ${W.join("; ")}.`)}var B="default";async function A(_,E){return await _.get(E)!==null}async function*Q(_,E,W){for await(let[Y]of _.scan(E,W))yield Y}async function z(_,E){let W=0;for await(let Y of Q(_,E))W++;return W}async function O(_,E){let W=[];for await(let Y of Q(_,E))W.push({type:"delete",key:Y});if(W.length===0)return 0;return await _.batch(W),W.length}async function P(_,E,W){let Y=[];for await(let J of Q(_,E,W))Y.push({type:"delete",key:J});if(Y.length===0)return 0;return await _.batch(Y),Y.length}var l;var h=j(()=>{l=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function G(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function H(_,E={}){if(E.gt!==void 0&&_<=E.gt)return!1;if(E.gte!==void 0&&_<E.gte)return!1;if(E.lt!==void 0&&_>=E.lt)return!1;if(E.lte!==void 0&&_>E.lte)return!1;return!0}function v(_,E){if(_===null||E===null)return _===E;if(_.byteLength!==E.byteLength)return!1;for(let W=0;W<_.byteLength;W++)if(_[W]!==E[W])return!1;return!0}async function b(_,E){if(_.has)return _.has(E);return A(_,E)}function C(_,E,W){if(_.keys)return _.keys(E,W);return Q(_,E,W)}async function K(_,E){if(_.count)return _.count(E);return z(_,E)}async function u(_,E){if(_.deletePrefix)return _.deletePrefix(E);return O(_,E)}async function S(_,E,W){if(L(_,"conditionalBatch","storageConditionalBatch"),!_.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return _.conditionalBatch(E,W)}function F(_){return encodeURIComponent(_)}function W_(_){return decodeURIComponent(_)}function F_(_){try{return decodeURIComponent(_)}catch{return null}}var U=(_)=>String(_).padStart(16,"0"),Y_;var N=j(()=>{h();Y_={workflow:(_)=>`wf:${F(_)}`,checkpoint:(_)=>`wf:${F(_)}:ckpt`,checkpointHistory:(_,E)=>`wf:${F(_)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(_)=>`wf:${F(_)}:timeline:`,timeline:(_,E)=>`wf:${F(_)}:timeline:${String(E).padStart(10,"0")}`,schedule:(_)=>`schedule:${F(_)}`,scheduleTick:(_,E)=>`schedule-due:${String(_).padStart(16,"0")}:${F(E)}`,scheduleRun:(_)=>`schedule-run:${F(_)}`,operation:(_,E,W)=>`op:${_}:${U(E)}:${W}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,W)=>`audit:bulk:${U(_)}:${F(E)}:${F(W)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${U(_)}:${F(E)}`,asyncActivity:(_,E)=>`async-act:v1:${F(_)}:${F(E)}`,activityReconciliationPrefix:(_)=>`actrec:v1:${F(_)}:`,activityReconciliation:(_,E,W)=>`actrec:v1:${F(_)}:${F(E)}:${W}`,eventPrefix:(_)=>`ev:${F(_)}:`,event:(_,E)=>`ev:${F(_)}:${String(E).padStart(10,"0")}`,eventHead:(_)=>`ev:${F(_)}:head`,eventWatermark:(_)=>`ev:${F(_)}:watermark`,signal:(_,E,W)=>`sig:${F(_)}:${E}:${F(W)}`,signalSequence:(_)=>`sigseq:v1:${F(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${F(_)}:`,signalAcceptedResponse:(_,E,W)=>`sigres:v1:${F(_)}:${F(E)}:${F(W)}`,deadline:(_,E)=>`wf-deadline:${U(_)}:${F(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${U(_)}:${F(E)}`,delayedStart:(_,E)=>`wf-delayed:${U(_)}:${F(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${U(_)}:${F(E)}`,attribute:(_)=>`attr:${F(_)}`,attributeIndex:(_,E,W)=>`idx:${_}:${E}:${F(W)}`,tagIndex:(_,E)=>`tag:${F(_)}:${F(E)}`,updatePrefix:(_)=>`upd:${F(_)}:`,update:(_,E)=>`upd:${F(_)}:${E}`,updateResponse:(_)=>`upr:${_}`,updateIdempotency:(_,E)=>`upk:${F(_)}:${E}`,budget:(_,E,W)=>`budget:${_}:${E}:${W}`,review:(_,E)=>`review:${F(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${F(_)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${F(_)}`,workflowHasServices:(_)=>`wf-has-services:${F(_)}`,offload:(_,E)=>`offload:${F(_)}:${E}`,archive:(_,E)=>`archive:${F(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${F(_)}:${F(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${B}:${F(_)}:${F(E)}`,streamChunkPrefix:(_,E)=>`blob:${F(_)}:${E}:chunk:`,streamChunk:(_,E,W)=>`blob:${F(_)}:${E}:chunk:${String(W).padStart(10,"0")}`,streamMetadata:(_,E)=>`blob:${F(_)}:${E}:meta`,budgetCharged:(_)=>`budget-charged:${_}`,toolEffect:(_,E,W)=>`tool-effect:${F(_)}:${E}:${W}`,workflowVisibilityStatus:(_,E)=>`wf-idx-status:${F(_)}:${F(E)}`,workflowVisibilityType:(_,E)=>`wf-idx-type:${F(_)}:${F(E)}`,workflowVisibilityCreated:(_,E)=>`wf-idx-created:${U(_)}:${F(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${U(_)}:${F(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${U(_)}:${F(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${F(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function d(_){if(_===void 0)return;if(typeof _!=="number"||!Number.isInteger(_)||_<0)throw Error("deleteRange limit must be a finite non-negative integer");return _===0?0:_}function V(_){let E={},W=!1;for(let J of["gt","gte","lt","lte"]){let X=_[J];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");E[J]=X,W=!0}if(!W)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=d(_.limit);if(Y!==void 0)E.limit=Y;return E}async function I(_,E,W){let Y=V(W);if(_.deleteRange)return _.deleteRange(E,Y);return P(_,E,Y)}var q=()=>{};function D(_){return _.replaceAll(/:+$/g,"")}function s(_,E){let W=D(_),Y=D(E);if(W.length===0)return Y;if(Y.length===0)return W;return`${W}:${Y}`}function x(_,E){return new R(_,E)}var R;var w=j(()=>{q();N();R=class R{#_;#W;constructor(_,E){this.#_=_,this.#W=D(E)}#E(_){if(this.#W.length===0)return _;return _.length===0?`${this.#W}:`:`${this.#W}:${_}`}#F(_){if(this.#W.length===0)return _;return _.slice(this.#W.length+1)}#Y(_={}){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.reverse!==void 0)E.reverse=_.reverse;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}#X(_){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}capabilities(){return this.#_.capabilities()}scoped(_){return new R(this.#_,s(this.#W,_))}async get(_){return this.#_.get(this.#E(_))}async put(_,E){await this.#_.put(this.#E(_),E)}async delete(_){await this.#_.delete(this.#E(_))}async*scan(_,E){for await(let[W,Y]of this.#_.scan(this.#E(_),this.#Y(E)))yield[this.#F(W),Y]}async batch(_){await this.#_.batch(_.map((E)=>{if(E.type==="put")return{type:"put",key:this.#E(E.key),value:E.value};return{type:"delete",key:this.#E(E.key)}}))}async conditionalBatch(_,E){return S(this.#_,_.map((W)=>({key:this.#E(W.key),expectedValue:W.expectedValue})),E.map((W)=>{if(W.type==="put")return{type:"put",key:this.#E(W.key),value:W.value};return{type:"delete",key:this.#E(W.key)}}))}async has(_){return b(this.#_,this.#E(_))}async deletePrefix(_){return u(this.#_,this.#E(_))}async deleteRange(_,E){let W=this.#X(V(E));return I(this.#_,this.#E(_),W)}async*keys(_,E){for await(let W of C(this.#_,this.#E(_),this.#Y(E)))yield this.#F(W)}async count(_){return K(this.#_,this.#E(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});var p={};g(p,{MemoryStorage:()=>m});var m;var a=j(()=>{q();N();w();m=class m{#_;constructor(){this.#_=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#W(_,E,W){return _>=E&&_<W}#E(_,E){let W=[];for(let Y of this.#_.keys())if(this.#W(Y,_,E))W.push(Y);return W.toSorted()}async get(_){return this.#_.get(_)??null}async put(_,E){this.#_.set(_,E)}async delete(_){this.#_.delete(_)}async*scan(_,E={}){let{limit:W,reverse:Y}=E,J=G(_),X=this.#E(_,J);if(X=X.filter(($)=>H($,E)),Y)X.reverse();let Z=0;for(let $ of X){if(W!==void 0&&Z>=W)break;let T=this.#_.get($);if(T!==void 0)yield[$,T],Z++}}async batch(_){this.#F(_)}#F(_){for(let E of _)if(E.type==="put")this.#_.set(E.key,E.value);else this.#_.delete(E.key)}async conditionalBatch(_,E){for(let W of _){let Y=this.#_.get(W.key)??null;if(!v(Y,W.expectedValue))return!1}return this.#F(E),!0}async has(_){return this.#_.has(_)}async deletePrefix(_){let E=G(_),W=this.#E(_,E);for(let Y of W)this.#_.delete(Y);return W.length}async deleteRange(_,E){let W=V(E),Y=G(_),J=this.#E(_,Y).filter((Z)=>H(Z,W)),X=W.limit===void 0?J:J.slice(0,W.limit);for(let Z of X)this.#_.delete(Z);return X.length}async*keys(_,E={}){let{limit:W,reverse:Y}=E,J=G(_),X=this.#E(_,J);if(X=X.filter(($)=>H($,E)),Y)X.reverse();let Z=0;for(let $ of X){if(W!==void 0&&Z>=W)break;yield $,Z++}}async count(_){let E=G(_);return this.#E(_,E).length}scoped(_){return x(this,_)}get size(){return this.#_.size}clear(){this.#_.clear()}snapshot(){let _=new Map;for(let[E,W]of this.#_)_.set(E,new Uint8Array(W));return _}[Symbol.dispose](){this.#_.clear()}}});a();export{m as MemoryStorage};
|
|
2
|
+
var c=Object.defineProperty;var k=(_)=>_;function g(_,E){this[_]=k.bind(null,E)}var f=(_,E)=>{for(var F in E)c(_,F,{get:E[F],enumerable:!0,configurable:!0,set:g.bind(E,F)})};var G=(_,E)=>()=>(_&&(E=_(_=0)),E);function L(_,E,F){if(!_.capabilities()[E])throw Error(`Feature "${F}" requires storage capability "${E}", but this storage backend does not provide it.`)}function y(_){let E=_.capabilities(),F=[];if(E.persistence!=="local"&&E.persistence!=="remote")F.push(`persistence must be "local" or "remote" (got "${E.persistence}")`);if(E.readAfterWrite!=="linearizable")F.push(`readAfterWrite must be "linearizable" (got "${E.readAfterWrite}")`);if(E.scanConsistency!=="snapshot")F.push(`scanConsistency must be "snapshot" (got "${E.scanConsistency}")`);if(!E.atomicBatch)F.push("atomicBatch must be true");if(!E.conditionalBatch)F.push("conditionalBatch must be true");if(F.length>0)throw Error(`Storage is not durable enough for recovery: ${F.join("; ")}.`)}var q="default";async function A(_,E){return await _.get(E)!==null}async function*M(_,E,F){for await(let[Y]of _.scan(E,F))yield Y}async function z(_,E){let F=0;for await(let Y of M(_,E))F++;return F}async function O(_,E){let F=[];for await(let Y of M(_,E))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await _.batch(F),F.length}async function P(_,E,F){let Y=[];for await(let J of M(_,E,F))Y.push({type:"delete",key:J});if(Y.length===0)return 0;return await _.batch(Y),Y.length}var l;var v=G(()=>{l=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","ev:","idx:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-deadline:","wf-delayed:","wf-has-services:","wf-headers:","wf-idx-","wf-terminal:"]});function $(_){return _.length>0?_.slice(0,-1)+String.fromCharCode(_.charCodeAt(_.length-1)+1):"\xFF"}function H(_,E={}){if(E.gt!==void 0&&_<=E.gt)return!1;if(E.gte!==void 0&&_<E.gte)return!1;if(E.lt!==void 0&&_>=E.lt)return!1;if(E.lte!==void 0&&_>E.lte)return!1;return!0}function h(_,E){if(_===null||E===null)return _===E;if(_.byteLength!==E.byteLength)return!1;for(let F=0;F<_.byteLength;F++)if(_[F]!==E[F])return!1;return!0}async function b(_,E){if(_.has)return _.has(E);return A(_,E)}function C(_,E,F){if(_.keys)return _.keys(E,F);return M(_,E,F)}async function u(_,E){if(_.count)return _.count(E);return z(_,E)}async function K(_,E){if(_.deletePrefix)return _.deletePrefix(E);return O(_,E)}async function S(_,E,F){if(L(_,"conditionalBatch","storageConditionalBatch"),!_.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return _.conditionalBatch(E,F)}function W(_){return encodeURIComponent(_)}function F_(_){return decodeURIComponent(_)}function W_(_){try{return decodeURIComponent(_)}catch{return null}}var Q=(_)=>String(_).padStart(16,"0"),Y_;var B=G(()=>{v();Y_={workflow:(_)=>`wf:${W(_)}`,checkpoint:(_)=>`wf:${W(_)}:ckpt`,checkpointHistory:(_,E)=>`wf:${W(_)}:ckpt:${String(E).padStart(10,"0")}`,timelinePrefix:(_)=>`wf:${W(_)}:timeline:`,timeline:(_,E)=>`wf:${W(_)}:timeline:${String(E).padStart(10,"0")}`,schedule:(_)=>`schedule:${W(_)}`,scheduleTick:(_,E)=>`schedule-due:${String(_).padStart(16,"0")}:${W(E)}`,scheduleRun:(_)=>`schedule-run:${W(_)}`,operation:(_,E,F)=>`op:${_}:${Q(E)}:${F}`,operationInflight:(_)=>`op:inflight:${_}`,operationQueued:(_)=>`op:queued:${_}`,operationResolved:(_)=>`op:resolved:${_}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(_,E,F)=>`audit:bulk:${Q(_)}:${W(E)}:${W(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(_,E)=>`op:resolved-by-time:${Q(_)}:${W(E)}`,asyncActivity:(_,E)=>`async-act:v1:${W(_)}:${W(E)}`,activityReconciliationPrefix:(_)=>`actrec:v1:${W(_)}:`,activityReconciliation:(_,E,F)=>`actrec:v1:${W(_)}:${W(E)}:${F}`,eventPrefix:(_)=>`ev:${W(_)}:`,event:(_,E)=>`ev:${W(_)}:${String(E).padStart(10,"0")}`,eventHead:(_)=>`ev:${W(_)}:head`,eventWatermark:(_)=>`ev:${W(_)}:watermark`,signal:(_,E,F)=>`sig:${W(_)}:${E}:${W(F)}`,signalSequence:(_)=>`sigseq:v1:${W(_)}`,signalAcceptedResponsePrefix:(_)=>`sigres:v1:${W(_)}:`,signalAcceptedResponse:(_,E,F)=>`sigres:v1:${W(_)}:${W(E)}:${W(F)}`,deadline:(_,E)=>`wf-deadline:${Q(_)}:${W(E)}`,terminalCleanup:(_,E)=>`wf-cleanup:${Q(_)}:${W(E)}`,delayedStart:(_,E)=>`wf-delayed:${Q(_)}:${W(E)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(_,E)=>`wf-terminal:${Q(_)}:${W(E)}`,attribute:(_)=>`attr:${W(_)}`,attributeIndex:(_,E,F)=>`idx:${_}:${E}:${W(F)}`,tagIndex:(_,E)=>`tag:${W(_)}:${W(E)}`,updatePrefix:(_)=>`upd:${W(_)}:`,update:(_,E)=>`upd:${W(_)}:${E}`,updateResponse:(_)=>`upr:${_}`,updateIdempotency:(_,E)=>`upk:${W(_)}:${E}`,startIdempotency:(_)=>`start-idem:${W(_)}`,startIdempotencySignalId:(_)=>`start-idem:${_}`,livenessPrefix:()=>"liveness:",liveness:(_)=>`liveness:${W(_)}`,budget:(_,E,F)=>`budget:${_}:${E}:${F}`,review:(_,E)=>`review:${W(_)}:${E}`,workflowHeaders:(_)=>`wf-headers:${W(_)}`,terminalCleanupNeeded:(_)=>`wf-cleanup-needed:${W(_)}`,workflowHasServices:(_)=>`wf-has-services:${W(_)}`,offload:(_,E)=>`offload:${W(_)}:${E}`,archive:(_,E)=>`archive:${W(_)}:${E}`,stateExecution:(_,E)=>`state:execution:${W(_)}:${W(E)}`,stateWorkflow:(_,E)=>`state:workflow-scope:${q}:${W(_)}:${W(E)}`,streamChunkPrefix:(_,E)=>`blob:${W(_)}:${E}:chunk:`,streamChunk:(_,E,F)=>`blob:${W(_)}:${E}:chunk:${String(F).padStart(10,"0")}`,streamMetadata:(_,E)=>`blob:${W(_)}:${E}:meta`,budgetCharged:(_)=>`budget-charged:${_}`,toolEffect:(_,E,F)=>`tool-effect:${W(_)}:${E}:${F}`,workflowVisibilityStatus:(_,E)=>`wf-idx-status:${W(_)}:${W(E)}`,workflowVisibilityType:(_,E)=>`wf-idx-type:${W(_)}:${W(E)}`,workflowVisibilityCreated:(_,E)=>`wf-idx-created:${Q(_)}:${W(E)}`,workflowVisibilityUpdated:(_,E)=>`wf-idx-updated:${Q(_)}:${W(E)}`,workflowVisibilityDeadline:(_,E)=>`wf-idx-deadline:${Q(_)}:${W(E)}`,workflowVisibilityManifest:(_)=>`wf-idx-manifest:${W(_)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"}});function d(_){if(_===void 0)return;if(typeof _!=="number"||!Number.isInteger(_)||_<0)throw Error("deleteRange limit must be a finite non-negative integer");return _===0?0:_}function V(_){let E={},F=!1;for(let J of["gt","gte","lt","lte"]){let X=_[J];if(X===void 0)continue;if(typeof X!=="string")throw Error("deleteRange bounds must be strings");E[J]=X,F=!0}if(!F)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let Y=d(_.limit);if(Y!==void 0)E.limit=Y;return E}async function I(_,E,F){let Y=V(F);if(_.deleteRange)return _.deleteRange(E,Y);return P(_,E,Y)}var N=()=>{};function D(_){return _.replaceAll(/:+$/g,"")}function s(_,E){let F=D(_),Y=D(E);if(F.length===0)return Y;if(Y.length===0)return F;return`${F}:${Y}`}function x(_,E){return new R(_,E)}var R;var w=G(()=>{N();B();R=class R{#_;#F;constructor(_,E){this.#_=_,this.#F=D(E)}#E(_){if(this.#F.length===0)return _;return _.length===0?`${this.#F}:`:`${this.#F}:${_}`}#W(_){if(this.#F.length===0)return _;return _.slice(this.#F.length+1)}#Y(_={}){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.reverse!==void 0)E.reverse=_.reverse;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}#X(_){let E={};if(_.limit!==void 0)E.limit=_.limit;if(_.gt!==void 0)E.gt=this.#E(_.gt);if(_.gte!==void 0)E.gte=this.#E(_.gte);if(_.lt!==void 0)E.lt=this.#E(_.lt);if(_.lte!==void 0)E.lte=this.#E(_.lte);return E}capabilities(){return this.#_.capabilities()}scoped(_){return new R(this.#_,s(this.#F,_))}async get(_){return this.#_.get(this.#E(_))}async put(_,E){await this.#_.put(this.#E(_),E)}async delete(_){await this.#_.delete(this.#E(_))}async*scan(_,E){for await(let[F,Y]of this.#_.scan(this.#E(_),this.#Y(E)))yield[this.#W(F),Y]}async batch(_){await this.#_.batch(_.map((E)=>{if(E.type==="put")return{type:"put",key:this.#E(E.key),value:E.value};return{type:"delete",key:this.#E(E.key)}}))}async conditionalBatch(_,E){return S(this.#_,_.map((F)=>({key:this.#E(F.key),expectedValue:F.expectedValue})),E.map((F)=>{if(F.type==="put")return{type:"put",key:this.#E(F.key),value:F.value};return{type:"delete",key:this.#E(F.key)}}))}async has(_){return b(this.#_,this.#E(_))}async deletePrefix(_){return K(this.#_,this.#E(_))}async deleteRange(_,E){let F=this.#X(V(E));return I(this.#_,this.#E(_),F)}async*keys(_,E){for await(let F of C(this.#_,this.#E(_),this.#Y(E)))yield this.#W(F)}async count(_){return u(this.#_,this.#E(_))}[Symbol.dispose](){this.#_[Symbol.dispose]()}}});var p={};f(p,{MemoryStorage:()=>m});var m;var a=G(()=>{N();B();w();m=class m{#_;constructor(){this.#_=new Map}capabilities(){return{persistence:"ephemeral",readAfterWrite:"linearizable",scanConsistency:"snapshot",atomicBatch:!0,conditionalBatch:!0,boundedRangeDelete:!0}}#F(_,E,F){return _>=E&&_<F}#E(_,E){let F=[];for(let Y of this.#_.keys())if(this.#F(Y,_,E))F.push(Y);return F.toSorted()}async get(_){return this.#_.get(_)??null}async put(_,E){this.#_.set(_,E)}async delete(_){this.#_.delete(_)}async*scan(_,E={}){let{limit:F,reverse:Y}=E,J=$(_),X=this.#E(_,J);if(X=X.filter((Z)=>H(Z,E)),Y)X.reverse();let U=0;for(let Z of X){if(F!==void 0&&U>=F)break;let T=this.#_.get(Z);if(T!==void 0)yield[Z,T],U++}}async batch(_){this.#W(_)}#W(_){for(let E of _)if(E.type==="put")this.#_.set(E.key,E.value);else this.#_.delete(E.key)}async conditionalBatch(_,E){for(let F of _){let Y=this.#_.get(F.key)??null;if(!h(Y,F.expectedValue))return!1}return this.#W(E),!0}async has(_){return this.#_.has(_)}async deletePrefix(_){let E=$(_),F=this.#E(_,E);for(let Y of F)this.#_.delete(Y);return F.length}async deleteRange(_,E){let F=V(E),Y=$(_),J=this.#E(_,Y).filter((U)=>H(U,F)),X=F.limit===void 0?J:J.slice(0,F.limit);for(let U of X)this.#_.delete(U);return X.length}async*keys(_,E={}){let{limit:F,reverse:Y}=E,J=$(_),X=this.#E(_,J);if(X=X.filter((Z)=>H(Z,E)),Y)X.reverse();let U=0;for(let Z of X){if(F!==void 0&&U>=F)break;yield Z,U++}}async count(_){let E=$(_);return this.#E(_,E).length}scoped(_){return x(this,_)}get size(){return this.#_.size}clear(){this.#_.clear()}snapshot(){let _=new Map;for(let[E,F]of this.#_)_.set(E,new Uint8Array(F));return _}[Symbol.dispose](){this.#_.clear()}}});a();export{m as MemoryStorage};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure value-mapping helpers shared by the Neon adapter: the minimal query-result
|
|
3
|
+
* shape both the Neon serverless driver and the PGlite test backend satisfy, the
|
|
4
|
+
* driver-tolerant affected-row count, and the BYTEA encode/decode pair. Split out
|
|
5
|
+
* of `neon.ts` to keep that module focused on the `Storage` implementation; none
|
|
6
|
+
* of these is exported from the package — `neon.ts` imports them back.
|
|
7
|
+
*
|
|
8
|
+
* @module storage/neon-value-mapping
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Minimal structural view of a node-postgres query result. The Neon serverless
|
|
12
|
+
* driver and PGlite both return an object with a `rows` array; nothing else is
|
|
13
|
+
* needed here, so the adapter depends only on this shape rather than the full
|
|
14
|
+
* driver types. Keeping the seam minimal is what lets the PGlite test backend
|
|
15
|
+
* stand in for the real `Pool` without pulling the optional dependency's types
|
|
16
|
+
* into the build.
|
|
17
|
+
*
|
|
18
|
+
* `rowCount` (node-postgres) and `affectedRows` (PGlite) are the driver-specific
|
|
19
|
+
* names for the number of rows a write affected; both are optional here and read
|
|
20
|
+
* defensively so delete counts never require materializing the deleted rows.
|
|
21
|
+
*/
|
|
22
|
+
export type NeonQueryResult = {
|
|
23
|
+
rows: Array<Record<string, unknown>>;
|
|
24
|
+
rowCount?: number | null;
|
|
25
|
+
affectedRows?: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Read the number of rows a write statement affected, tolerating the
|
|
29
|
+
* driver-specific field name (`rowCount` on node-postgres/Neon, `affectedRows`
|
|
30
|
+
* on PGlite). Falls back to `rows.length` for statements that return rows.
|
|
31
|
+
*/
|
|
32
|
+
export declare function affectedRowCount(result: NeonQueryResult): number;
|
|
33
|
+
/**
|
|
34
|
+
* Normalize a BYTEA value read back from Postgres into a `Uint8Array`. The Neon
|
|
35
|
+
* driver returns a Node `Buffer`, which may be a view onto a larger pooled
|
|
36
|
+
* `ArrayBuffer`; `new Uint8Array(buffer)` copies the bytes into a standalone
|
|
37
|
+
* array so the value cannot be corrupted by buffer reuse. PGlite already returns
|
|
38
|
+
* a `Uint8Array`, and copying it is harmless.
|
|
39
|
+
*/
|
|
40
|
+
export declare function toStorageValue(raw: unknown): Uint8Array;
|
|
41
|
+
/**
|
|
42
|
+
* Bind a storage value for a BYTEA parameter. node-postgres serializes a Node
|
|
43
|
+
* `Buffer` as BYTEA; a bare `Uint8Array` can serialize incorrectly. `Buffer` is
|
|
44
|
+
* a `Uint8Array` subclass, so PGlite accepts the same bound value — keeping a
|
|
45
|
+
* single bind path means the PGlite test exercises exactly what Neon runs.
|
|
46
|
+
*/
|
|
47
|
+
export declare function toBytea(value: Uint8Array): Buffer;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function affectedRowCount(result) {
|
|
2
|
+
return result.rowCount ?? result.affectedRows ?? result.rows.length;
|
|
3
|
+
}
|
|
4
|
+
export function toStorageValue(raw) {
|
|
5
|
+
if (raw instanceof Uint8Array)
|
|
6
|
+
return new Uint8Array(raw);
|
|
7
|
+
return new Uint8Array(raw);
|
|
8
|
+
}
|
|
9
|
+
export function toBytea(value) {
|
|
10
|
+
return Buffer.from(value);
|
|
11
|
+
}
|