@lostgradient/weft 0.16.0 → 0.17.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 +1 -1
- package/dist/alerting/alert-manager.d.ts +5 -5
- package/dist/alerting/alert-manager.js +24 -6
- package/dist/alerting/index.d.ts +1 -1
- package/dist/alerting/types.d.ts +17 -13
- package/dist/alerting/types.js +5 -0
- package/dist/core/engine/disposal.js +7 -0
- package/dist/core/engine/engine-runtime-helpers.d.ts +3 -1
- package/dist/core/engine/engine-runtime-helpers.js +2 -2
- package/dist/core/engine/errors.d.ts +20 -0
- package/dist/core/engine/errors.js +8 -0
- package/dist/core/engine/index.d.ts +39 -17
- package/dist/core/engine/index.js +81 -9
- package/dist/core/engine/inline-launch-queue.d.ts +6 -2
- package/dist/core/engine/inline-launch-queue.js +41 -6
- package/dist/core/engine/internals.d.ts +2 -0
- package/dist/core/engine/lease-manager.d.ts +3 -2
- package/dist/core/engine/lease-manager.js +7 -3
- package/dist/core/engine/operations-time.js +6 -0
- package/dist/core/execution-strategy.d.ts +8 -0
- package/dist/core/inline-execution-strategy.d.ts +1 -0
- package/dist/core/inline-execution-strategy.js +33 -20
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +1 -0
- package/dist/core/worker-execution-strategy.d.ts +2 -0
- package/dist/core/worker-execution-strategy.js +7 -2
- package/dist/core/worker-turn-watchdog.d.ts +4 -1
- package/dist/core/worker-turn-watchdog.js +9 -4
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -0
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +1 -1
- package/dist/mcp/tools.js +1 -3
- package/dist/server/dashboard-assets.d.ts +12 -1
- package/dist/server/dashboard-assets.js +145 -31
- package/dist/server/operations/aggregate-workflows.js +0 -7
- package/dist/server/operations/async-activity.js +5 -24
- package/dist/server/operations/bulk-cancel-workflows.js +3 -8
- package/dist/server/operations/bulk-delete-workflows.js +3 -8
- package/dist/server/operations/bulk-mutate-workflow-tags.js +3 -8
- package/dist/server/operations/bulk-operation-helpers.d.ts +2 -10
- package/dist/server/operations/bulk-operation-helpers.js +0 -6
- package/dist/server/operations/bulk-retry-failed-workflows.js +3 -8
- package/dist/server/operations/bulk-signal-workflows.js +3 -8
- package/dist/server/operations/cancel-schedule.js +1 -3
- package/dist/server/operations/cancel-workflow.js +1 -3
- package/dist/server/operations/create-schedule.js +2 -3
- package/dist/server/operations/fork-workflow.js +2 -3
- package/dist/server/operations/get-checkpoint-at.js +1 -6
- package/dist/server/operations/get-registry.js +1 -7
- package/dist/server/operations/get-retention-overview.js +2 -15
- package/dist/server/operations/get-review.js +2 -15
- package/dist/server/operations/get-schedule.js +2 -8
- package/dist/server/operations/get-stream-chunks.js +2 -6
- package/dist/server/operations/get-system-lease.js +1 -7
- package/dist/server/operations/get-system-metrics.js +0 -4
- package/dist/server/operations/get-task-diagnostics.js +2 -13
- package/dist/server/operations/get-update-result.js +1 -6
- package/dist/server/operations/get-workflow-attributes.js +2 -15
- package/dist/server/operations/get-workflow-events.js +2 -15
- package/dist/server/operations/get-workflow-observability.js +2 -5
- package/dist/server/operations/get-workflow-result.js +0 -7
- package/dist/server/operations/get-workflow-timeline.js +1 -6
- package/dist/server/operations/get-workflow.d.ts +3 -6
- package/dist/server/operations/get-workflow.js +2 -12
- package/dist/server/operations/list-alerts.d.ts +5 -2
- package/dist/server/operations/list-alerts.js +2 -9
- package/dist/server/operations/list-checkpoints.js +1 -6
- package/dist/server/operations/list-reviews.js +0 -7
- package/dist/server/operations/list-schedules.js +3 -8
- package/dist/server/operations/list-task-queues.js +0 -4
- package/dist/server/operations/list-workers.js +0 -4
- package/dist/server/operations/list-workflows.js +0 -7
- package/dist/server/operations/pause-schedule.js +1 -3
- package/dist/server/operations/purge-workflows.js +2 -5
- package/dist/server/operations/query-workflow.js +4 -15
- package/dist/server/operations/replay-workflow.js +2 -6
- package/dist/server/operations/resume-schedule.js +1 -3
- package/dist/server/operations/resume-workflow.js +1 -3
- package/dist/server/operations/set-workflow-attributes.js +3 -15
- package/dist/server/operations/signal-workflow.js +3 -12
- package/dist/server/operations/single-workflow-tag-mutation.js +0 -7
- package/dist/server/operations/start-or-signal-workflow.js +2 -3
- package/dist/server/operations/start-workflow.js +2 -3
- package/dist/server/operations/storage-capabilities.js +1 -3
- package/dist/server/operations/storage.js +7 -13
- package/dist/server/operations/submit-review-decision.js +3 -12
- package/dist/server/operations/suspend-workflow.js +1 -3
- package/dist/server/operations/timeout-workflow.js +1 -3
- package/dist/server/operations/update-schedule.js +1 -3
- package/dist/server/operations/update-workflow.js +2 -3
- package/dist/server/operations/worker-drain.js +0 -8
- package/dist/server/rest-binding.d.ts +3 -2
- package/dist/server/route-model.d.ts +2 -0
- package/dist/server/route-model.js +1 -1
- package/dist/server/runtime/task-reconciliation.d.ts +10 -1
- package/dist/server/runtime/task-reconciliation.js +26 -2
- package/dist/server/serve-internals.js +12 -6
- package/dist/storage/indexeddb.js +28 -48
- package/dist/storage/testing.d.ts +6 -3
- package/dist/storage/testing.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/protocol-schemas.d.ts +2 -2
- package/dist/worker/protocol-schemas.js +2 -2
- package/dist/worker/protocol.js +1 -1
- package/package.json +1 -1
package/dist/storage/testing.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var n=import.meta.require,M=(E,_,F)=>{if(_!=null){if(typeof _!=="object"&&typeof _!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let P;if(F)P=_[Symbol.asyncDispose];if(P===void 0)P=_[Symbol.dispose];if(typeof P!=="function")throw TypeError("Object not disposable");E.push([F,P,_])}else if(F)E.push([F]);return _},O=(E,_,F)=>{let P=(R)=>_=F?new SuppressedError(R,_,"An error was suppressed during disposal"):(F=!0,R),Y=(R)=>{while(R=E.pop())try{var U=R[1]&&R[1].call(R[2]);if(R[0])return Promise.resolve(U).then(Y,(X)=>(P(X),Y()))}catch(X){P(X)}if(F)throw _};return Y()};function q(E,_,F){if(!E.capabilities()[_])throw Error(`Feature "${F}" requires storage capability "${_}", but this storage backend does not provide it.`)}function y(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 W="default";async function A(E,_){return await E.get(_)!==null}async function*j(E,_,F){for await(let[P]of E.scan(_,F))yield P}async function h(E,_){let F=0;for await(let P of j(E,_))F++;return F}async function m(E,_){let F=[];for await(let P of j(E,_))F.push({type:"delete",key:P});if(F.length===0)return 0;return await E.batch(F),F.length}async function d(E,_,F){let P=[];for await(let Y of j(E,_,F))P.push({type:"delete",key:Y});if(P.length===0)return 0;return await E.batch(P),P.length}var c=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var T=1e4,o=1e4;class b extends Error{code="StorageBatchOperationLimitExceededError";cap=T;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${T}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}}function v(E,_){if(_>T)throw new b(E,_)}function e(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function EE(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 _E(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 FE(E,_){if(E.has)return E.has(_);return A(E,_)}function SE(E,_,F){if(E.keys)return E.keys(_,F);return j(E,_,F)}async function PE(E,_){if(E.count)return E.count(_);return h(E,_)}async function RE(E,_){if(E.deletePrefix)return E.deletePrefix(_);return m(E,_)}async function YE(E,_){v("batch operations",_.length),await E.batch(_)}async function D(E,_,F){if(v("conditionalBatch conditions",_.length),v("conditionalBatch operations",F.length),q(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 S(E){return encodeURIComponent(E)}function UE(E){return decodeURIComponent(E)}function XE(E){try{return decodeURIComponent(E)}catch{return null}}var Q=(E)=>String(E).padStart(16,"0"),g="0",I="1",u=(E,_,F,P)=>`sig:${S(E)}:${S(_)}:${P}:${S(F)}`,LE={workflow:(E)=>`wf:${S(E)}`,checkpoint:(E)=>`wf:${S(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${S(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${S(E)}:timeline:`,timeline:(E,_)=>`wf:${S(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${S(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${S(_)}`,scheduleRun:(E)=>`schedule-run:${S(E)}`,scheduleRunLink:(E)=>`schedule-run-link:${S(E)}`,scheduleRunBySchedulePrefix:(E)=>`schedule-run-by-schedule:${S(E)}:`,scheduleRunBySchedule:(E,_)=>`schedule-run-by-schedule:${S(E)}:${S(_)}`,operation:(E,_,F)=>`op:${E}:${Q(_)}:${F}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(E)=>`op:dead-letter:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,F)=>`audit:bulk:${Q(E)}:${S(_)}:${S(F)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${Q(E)}:${S(_)}`,asyncActivity:(E,_)=>`async-act:v1:${S(E)}:${S(_)}`,asyncActivityResolution:(E,_)=>`async-act:v1:${S(E)}:${S(_)}:resolution`,activityReconciliationPrefix:(E)=>`actrec:v1:${S(E)}:`,activityReconciliation:(E,_,F)=>`actrec:v1:${S(E)}:${S(_)}:${F}`,eventPrefix:(E)=>`ev:${S(E)}:`,event:(E,_)=>`ev:${S(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${S(E)}:head`,eventWatermark:(E)=>`ev:${S(E)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(E)=>`fleet-event:${String(E).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(E)=>`fleet-event-by-workflow:${S(E)}:`,fleetEventByWorkflow:(E,_)=>`fleet-event-by-workflow:${S(E)}:${String(_).padStart(10,"0")}`,signal:(E,_,F)=>u(E,_,F,I),startSignal:(E,_,F)=>u(E,_,F,g),signalSequence:(E)=>`sigseq:v1:${S(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${S(E)}:`,signalAcceptedResponse:(E,_,F)=>`sigres:v1:${S(E)}:${S(_)}:${S(F)}`,deadline:(E,_)=>`wf-deadline:${Q(E)}:${S(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${Q(E)}:${S(_)}`,teardownTimer:(E,_)=>`wf-teardown:${Q(E)}:${S(_)}`,delayedStart:(E,_)=>`wf-delayed:${Q(E)}:${S(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${Q(E)}:${S(_)}`,attribute:(E)=>`attr:${S(E)}`,attributeIndex:(E,_,F)=>`idx:${E}:${_}:${S(F)}`,tagIndex:(E,_)=>`tag:${S(E)}:${S(_)}`,updatePrefix:(E)=>`upd:${S(E)}:`,update:(E,_)=>`upd:${S(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${S(E)}:${_}`,startIdempotency:(E)=>`start-idem:${S(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${S(E)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(E,_,F)=>`budget:${E}:${_}:${F}`,review:(E,_)=>`review:${S(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${S(E)}`,childCancellationPrefix:(E)=>`child-cancel:${S(E)}:`,childCancellation:(E,_)=>`child-cancel:${S(E)}:${S(_)}`,childWorkflowByParentPrefix:(E,_)=>`child-by-parent:${S(E)}:${_===void 0?"":`${S(_)}:`}`,childWorkflowByParent:(E,_,F)=>`child-by-parent:${S(E)}:${_===void 0?"":`${S(_)}:`}${S(F)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${S(E)}`,workflowConcurrency:(E,_)=>`wf-concurrency:${S(E)}:${S(_)}`,workflowConcurrencyHolder:(E)=>`wf-concurrency-holder:${S(E)}`,workflowHasServices:(E)=>`wf-has-services:${S(E)}`,finalizerState:(E)=>`wf-finalizer-state:${S(E)}`,teardownOwed:(E)=>`wf-teardown-needed:${S(E)}`,teardownSucceeded:(E)=>`wf-teardown-succeeded:${S(E)}`,teardownDeadLetter:(E)=>`wf-teardown-deadletter:${S(E)}`,offload:(E,_)=>`offload:${S(E)}:${_}`,archive:(E,_)=>`archive:${S(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${S(E)}:${S(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${W}:${S(E)}:${S(_)}`,streamChunkPrefix:(E,_)=>`blob:${S(E)}:${_}:chunk:`,streamChunk:(E,_,F)=>`blob:${S(E)}:${_}:chunk:${String(F).padStart(10,"0")}`,streamTail:(E,_)=>`blob:${S(E)}:${_}:tail`,streamMetadata:(E,_)=>`blob:${S(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,F)=>`tool-effect:${S(E)}:${_}:${F}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${S(E)}:${S(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${S(E)}:${S(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${Q(E)}:${S(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${Q(E)}:${S(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${Q(E)}:${S(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${S(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};import{describe as H,expect as G,it as K}from"bun:test";import{expect as $}from"bun:test";var f=new TextEncoder,p=new TextDecoder;function L(E){return f.encode(E)}function z(E){return p.decode(E)}async function Z(E){let _=[];for await(let F of E)_.push(F);return _}function x(E){let _=E.capabilities();$(["ephemeral","local","remote"]).toContain(_.persistence??""),$(["linearizable","session","eventual"]).toContain(_.readAfterWrite),$(["snapshot","best-effort"]).toContain(_.scanConsistency),$(typeof _.atomicBatch).toBe("boolean"),$(typeof _.conditionalBatch).toBe("boolean"),$(typeof _.boundedRangeDelete).toBe("boolean")}function jE(E,_){H(`${E} binary and large-scan conformance`,()=>{K("round-trips binary values correctly",async()=>{let F=await _.create();try{let P=new Uint8Array([0,1,127,128,255,42,0,13,10]);await F.put("binary",P);let Y=await F.get("binary");G(Y).toEqual(P)}finally{F[Symbol.dispose]()}}),K("returns 1000 scanned keys in sorted order",async()=>{let F=await _.create();try{let P=Array.from({length:1000},(R,U)=>({type:"put",key:`item:${String(U).padStart(4,"0")}`,value:L(String(U))}));await F.batch(P);let Y=await Z(F.scan("item:"));G(Y).toHaveLength(1000);for(let R=0;R<Y.length;R+=1)G(Y[R][0]).toBe(`item:${String(R).padStart(4,"0")}`)}finally{F[Symbol.dispose]()}})})}function zE(E,_){let{create:F,expected:P}=_;H(`${E} capabilities() conformance`,()=>{if(K("reports a well-formed capability shape",async()=>{let R=[];try{const Y=M(R,await F(),0);x(Y)}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("reports the expected capability row",async()=>{let R=[];try{const Y=M(R,await F(),0);G(Y.capabilities()).toEqual(P)}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("satisfies its declared read-after-write level",async()=>{let U=[];try{const Y=M(U,await F(),0);await Y.put("raw:key",L("written"));let R=await Y.get("raw:key");if(P.readAfterWrite!=="eventual")G(R).not.toBeNull(),G(z(R)).toBe("written")}catch(X){var V=X,J=1}finally{O(U,V,J)}}),P.scanConsistency==="snapshot")K("does not observe a key inserted after the scan began (snapshot)",async()=>{let V=[];try{const Y=M(V,await F(),0);await Y.put("scan:a",L("1"));await Y.put("scan:b",L("2"));let R=Y.scan("scan:")[Symbol.asyncIterator]();let U=await R.next();G(U.done).toBe(!1);await Y.put("scan:c",L("3"));let X=[];if(!U.done)X.push(U.value[0]);for(let N=await R.next();!N.done;N=await R.next())X.push(N.value[0]);G(X).not.toContain("scan:c");G(X).toContain("scan:a");G(X).toContain("scan:b")}catch(J){var B=J,C=1}finally{O(V,B,C)}});if(P.conditionalBatch)K("applies nothing when a conditionalBatch precondition mismatches",async()=>{let U=[];try{const Y=M(U,await F(),0);await Y.put("cas:key",L("initial"));let R=await D(Y,[{key:"cas:key",expectedValue:L("wrong")}],[{type:"put",key:"cas:key",value:L("changed")}]);G(R).toBe(!1);G(z(await Y.get("cas:key"))).toBe("initial")}catch(X){var V=X,J=1}finally{O(U,V,J)}}),K("reports conditionalBatch before running compare-and-swap assertions",async()=>{let R=[];try{const Y=M(R,await F(),0);G(Y.capabilities().conditionalBatch).toBe(!0)}catch(U){var X=U,V=1}finally{O(R,X,V)}})})}function DE(E,_){let{create:F}=_;H(`${E} concurrent conditionalBatch conformance`,()=>{K("lets exactly one of two contending conditionalBatch calls win",async()=>{let V=[];try{const P=M(V,await F(),0);G(P.capabilities().conditionalBatch).toBe(!0);await P.put("cas:counter",L("start"));let Y=[{key:"cas:counter",expectedValue:L("start")}];let[R,U]=await Promise.all([D(P,Y,[{type:"put",key:"cas:counter",value:L("first")}]),D(P,Y,[{type:"put",key:"cas:counter",value:L("second")}])]);G([R,U].filter(Boolean)).toHaveLength(1);let X=z(await P.get("cas:counter"));G(X).toBe(R?"first":"second")}catch(J){var B=J,C=1}finally{O(V,B,C)}})})}function HE(E,_){let{create:F}=_;H(`${E} basic storage contract`,()=>{K("get on empty storage returns null",async()=>{let R=[];try{const P=M(R,await F(),0);let Y=await P.get("nonexistent");G(Y).toBeNull()}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("put then get returns same bytes",async()=>{let U=[];try{const P=M(U,await F(),0);let Y=L("hello");await P.put("key",Y);let R=await P.get("key");G(R).toEqual(Y)}catch(X){var V=X,J=1}finally{O(U,V,J)}}),K("put with same key overwrites previous value",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("key",L("first"));await P.put("key",L("second"));let Y=await P.get("key");G(z(Y)).toBe("second")}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("delete removes key, subsequent get returns null",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("key",L("value"));await P.delete("key");let Y=await P.get("key");G(Y).toBeNull()}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("scan with prefix returns only matching keys, sorted lexicographically",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("wf:b",L("b"));await P.put("wf:a",L("a"));await P.put("wf:c",L("c"));await P.put("other:x",L("x"));let Y=await Z(P.scan("wf:"));G(Y.map(([J])=>J)).toEqual(["wf:a","wf:b","wf:c"])}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("scan with limit returns at most N entries",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("p:a",L("a"));await P.put("p:b",L("b"));await P.put("p:c",L("c"));let Y=await Z(P.scan("p:",{limit:2}));G(Y).toHaveLength(2);G(Y.map(([J])=>J)).toEqual(["p:a","p:b"])}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("scan with reverse returns in reverse order",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("p:a",L("a"));await P.put("p:b",L("b"));await P.put("p:c",L("c"));let Y=await Z(P.scan("p:",{reverse:!0}));G(Y.map(([J])=>J)).toEqual(["p:c","p:b","p:a"])}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("scan with gt/lt bounds",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("p:a",L("a"));await P.put("p:b",L("b"));await P.put("p:c",L("c"));await P.put("p:d",L("d"));let Y=await Z(P.scan("p:",{gt:"p:a",lt:"p:d"}));G(Y.map(([J])=>J)).toEqual(["p:b","p:c"])}catch(U){var X=U,V=1}finally{O(R,X,V)}}),K("scan with empty prefix returns all keys",async()=>{let R=[];try{const P=M(R,await F(),0);await P.put("alpha",L("a"));await P.put("beta",L("b"));await P.put("gamma",L("c"));let Y=await Z(P.scan(""));G(Y.map(([J])=>J)).toEqual(["alpha","beta","gamma"])}catch(U){var X=U,V=1}finally{O(R,X,V)}})})}export{zE as runStorageCapabilityConformance,DE as runConcurrentConditionalBatchConformance,jE as runBinaryAndLargeScanStorageConformance,HE as runBasicStorageContract};
|
|
2
|
+
var p=import.meta.require,K=(E,_,S)=>{if(_!=null){if(typeof _!=="object"&&typeof _!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let F;if(S)F=_[Symbol.asyncDispose];if(F===void 0)F=_[Symbol.dispose];if(typeof F!=="function")throw TypeError("Object not disposable");E.push([S,F,_])}else if(S)E.push([S]);return _},M=(E,_,S)=>{let F=(R)=>_=S?new SuppressedError(R,_,"An error was suppressed during disposal"):(S=!0,R),Y=(R)=>{while(R=E.pop())try{var U=R[1]&&R[1].call(R[2]);if(R[0])return Promise.resolve(U).then(Y,(X)=>(F(X),Y()))}catch(X){F(X)}if(S)throw _};return Y()};function q(E,_,S){if(!E.capabilities()[_])throw Error(`Feature "${S}" requires storage capability "${_}", but this storage backend does not provide it.`)}function y(E){let _=E.capabilities(),S=[];if(_.persistence!=="local"&&_.persistence!=="remote")S.push(`persistence must be "local" or "remote" (got "${_.persistence}")`);if(_.readAfterWrite!=="linearizable")S.push(`readAfterWrite must be "linearizable" (got "${_.readAfterWrite}")`);if(_.scanConsistency!=="snapshot")S.push(`scanConsistency must be "snapshot" (got "${_.scanConsistency}")`);if(!_.atomicBatch)S.push("atomicBatch must be true");if(!_.conditionalBatch)S.push("conditionalBatch must be true");if(S.length>0)throw Error(`Storage is not durable enough for recovery: ${S.join("; ")}.`)}var W="default";async function A(E,_){return await E.get(_)!==null}async function*j(E,_,S){for await(let[F]of E.scan(_,S))yield F}async function h(E,_){let S=0;for await(let F of j(E,_))S++;return S}async function m(E,_){let S=[];for await(let F of j(E,_))S.push({type:"delete",key:F});if(S.length===0)return 0;return await E.batch(S),S.length}async function d(E,_,S){let F=[];for await(let Y of j(E,_,S))F.push({type:"delete",key:Y});if(F.length===0)return 0;return await E.batch(F),F.length}var I=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var T=1e4,o=1e4;class b extends Error{code="StorageBatchOperationLimitExceededError";cap=T;count;target;constructor(E,_){super(`${E} count ${_} exceeds MAX_BATCH_OPERATIONS (${T}).`);this.name="StorageBatchOperationLimitExceededError",this.target=E,this.count=_}}function v(E,_){if(_>T)throw new b(E,_)}function e(E){return E.length>0?E.slice(0,-1)+String.fromCharCode(E.charCodeAt(E.length-1)+1):"\xFF"}function EE(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 _E(E,_){if(E===null||_===null)return E===_;if(E.byteLength!==_.byteLength)return!1;for(let S=0;S<E.byteLength;S++)if(E[S]!==_[S])return!1;return!0}async function FE(E,_){if(E.has)return E.has(_);return A(E,_)}function SE(E,_,S){if(E.keys)return E.keys(_,S);return j(E,_,S)}async function PE(E,_){if(E.count)return E.count(_);return h(E,_)}async function RE(E,_){if(E.deletePrefix)return E.deletePrefix(_);return m(E,_)}async function YE(E,_){v("batch operations",_.length),await E.batch(_)}async function D(E,_,S){if(v("conditionalBatch conditions",_.length),v("conditionalBatch operations",S.length),q(E,"conditionalBatch","storageConditionalBatch"),!E.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return E.conditionalBatch(_,S)}function P(E){return encodeURIComponent(E)}function UE(E){return decodeURIComponent(E)}function XE(E){try{return decodeURIComponent(E)}catch{return null}}var Q=(E)=>String(E).padStart(16,"0"),f="0",c="1",u=(E,_,S,F)=>`sig:${P(E)}:${P(_)}:${F}:${P(S)}`,LE={workflow:(E)=>`wf:${P(E)}`,checkpoint:(E)=>`wf:${P(E)}:ckpt`,checkpointHistory:(E,_)=>`wf:${P(E)}:ckpt:${String(_).padStart(10,"0")}`,timelinePrefix:(E)=>`wf:${P(E)}:timeline:`,timeline:(E,_)=>`wf:${P(E)}:timeline:${String(_).padStart(10,"0")}`,schedule:(E)=>`schedule:${P(E)}`,scheduleTick:(E,_)=>`schedule-due:${String(E).padStart(16,"0")}:${P(_)}`,scheduleRun:(E)=>`schedule-run:${P(E)}`,scheduleRunLink:(E)=>`schedule-run-link:${P(E)}`,scheduleRunBySchedulePrefix:(E)=>`schedule-run-by-schedule:${P(E)}:`,scheduleRunBySchedule:(E,_)=>`schedule-run-by-schedule:${P(E)}:${P(_)}`,operation:(E,_,S)=>`op:${E}:${Q(_)}:${S}`,operationInflight:(E)=>`op:inflight:${E}`,operationQueued:(E)=>`op:queued:${E}`,operationResolved:(E)=>`op:resolved:${E}`,operationDeadLetterPrefix:()=>"op:dead-letter:",operationDeadLetter:(E)=>`op:dead-letter:${E}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(E,_,S)=>`audit:bulk:${Q(E)}:${P(_)}:${P(S)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(E,_)=>`op:resolved-by-time:${Q(E)}:${P(_)}`,asyncActivity:(E,_)=>`async-act:v1:${P(E)}:${P(_)}`,asyncActivityResolution:(E,_)=>`async-act:v1:${P(E)}:${P(_)}:resolution`,activityReconciliationPrefix:(E)=>`actrec:v1:${P(E)}:`,activityReconciliation:(E,_,S)=>`actrec:v1:${P(E)}:${P(_)}:${S}`,eventPrefix:(E)=>`ev:${P(E)}:`,event:(E,_)=>`ev:${P(E)}:${String(_).padStart(10,"0")}`,eventHead:(E)=>`ev:${P(E)}:head`,eventWatermark:(E)=>`ev:${P(E)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(E)=>`fleet-event:${String(E).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(E)=>`fleet-event-by-workflow:${P(E)}:`,fleetEventByWorkflow:(E,_)=>`fleet-event-by-workflow:${P(E)}:${String(_).padStart(10,"0")}`,signal:(E,_,S)=>u(E,_,S,c),startSignal:(E,_,S)=>u(E,_,S,f),signalSequence:(E)=>`sigseq:v1:${P(E)}`,signalAcceptedResponsePrefix:(E)=>`sigres:v1:${P(E)}:`,signalAcceptedResponse:(E,_,S)=>`sigres:v1:${P(E)}:${P(_)}:${P(S)}`,deadline:(E,_)=>`wf-deadline:${Q(E)}:${P(_)}`,terminalCleanup:(E,_)=>`wf-cleanup:${Q(E)}:${P(_)}`,teardownTimer:(E,_)=>`wf-teardown:${Q(E)}:${P(_)}`,delayedStart:(E,_)=>`wf-delayed:${Q(E)}:${P(_)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(E,_)=>`wf-terminal:${Q(E)}:${P(_)}`,attribute:(E)=>`attr:${P(E)}`,attributeIndex:(E,_,S)=>`idx:${E}:${_}:${P(S)}`,tagIndex:(E,_)=>`tag:${P(E)}:${P(_)}`,updatePrefix:(E)=>`upd:${P(E)}:`,update:(E,_)=>`upd:${P(E)}:${_}`,updateResponse:(E)=>`upr:${E}`,updateIdempotency:(E,_)=>`upk:${P(E)}:${_}`,startIdempotency:(E)=>`start-idem:${P(E)}`,startIdempotencySignalId:(E)=>`start-idem:${E}`,livenessPrefix:()=>"liveness:",liveness:(E)=>`liveness:${P(E)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",budget:(E,_,S)=>`budget:${E}:${_}:${S}`,review:(E,_)=>`review:${P(E)}:${_}`,workflowHeaders:(E)=>`wf-headers:${P(E)}`,childCancellationPrefix:(E)=>`child-cancel:${P(E)}:`,childCancellation:(E,_)=>`child-cancel:${P(E)}:${P(_)}`,childWorkflowByParentPrefix:(E,_)=>`child-by-parent:${P(E)}:${_===void 0?"":`${P(_)}:`}`,childWorkflowByParent:(E,_,S)=>`child-by-parent:${P(E)}:${_===void 0?"":`${P(_)}:`}${P(S)}`,terminalCleanupNeeded:(E)=>`wf-cleanup-needed:${P(E)}`,workflowConcurrency:(E,_)=>`wf-concurrency:${P(E)}:${P(_)}`,workflowConcurrencyHolder:(E)=>`wf-concurrency-holder:${P(E)}`,workflowHasServices:(E)=>`wf-has-services:${P(E)}`,finalizerState:(E)=>`wf-finalizer-state:${P(E)}`,teardownOwed:(E)=>`wf-teardown-needed:${P(E)}`,teardownSucceeded:(E)=>`wf-teardown-succeeded:${P(E)}`,teardownDeadLetter:(E)=>`wf-teardown-deadletter:${P(E)}`,offload:(E,_)=>`offload:${P(E)}:${_}`,archive:(E,_)=>`archive:${P(E)}:${_}`,stateExecution:(E,_)=>`state:execution:${P(E)}:${P(_)}`,stateWorkflow:(E,_)=>`state:workflow-scope:${W}:${P(E)}:${P(_)}`,streamChunkPrefix:(E,_)=>`blob:${P(E)}:${_}:chunk:`,streamChunk:(E,_,S)=>`blob:${P(E)}:${_}:chunk:${String(S).padStart(10,"0")}`,streamTail:(E,_)=>`blob:${P(E)}:${_}:tail`,streamMetadata:(E,_)=>`blob:${P(E)}:${_}:meta`,budgetCharged:(E)=>`budget-charged:${E}`,toolEffect:(E,_,S)=>`tool-effect:${P(E)}:${_}:${S}`,workflowVisibilityStatus:(E,_)=>`wf-idx-status:${P(E)}:${P(_)}`,workflowVisibilityType:(E,_)=>`wf-idx-type:${P(E)}:${P(_)}`,workflowVisibilityCreated:(E,_)=>`wf-idx-created:${Q(E)}:${P(_)}`,workflowVisibilityUpdated:(E,_)=>`wf-idx-updated:${Q(E)}:${P(_)}`,workflowVisibilityDeadline:(E,_)=>`wf-idx-deadline:${Q(E)}:${P(_)}`,workflowVisibilityManifest:(E)=>`wf-idx-manifest:${P(E)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};import{describe as H,expect as V,it as J}from"bun:test";import{expect as $}from"bun:test";var g=new TextEncoder,n=new TextDecoder;function L(E){return g.encode(E)}function z(E){return n.decode(E)}async function Z(E){let _=[];for await(let S of E)_.push(S);return _}function x(E){let _=E.capabilities();$(["ephemeral","local","remote"]).toContain(_.persistence??""),$(["linearizable","session","eventual"]).toContain(_.readAfterWrite),$(["snapshot","best-effort"]).toContain(_.scanConsistency),$(typeof _.atomicBatch).toBe("boolean"),$(typeof _.conditionalBatch).toBe("boolean"),$(typeof _.boundedRangeDelete).toBe("boolean")}function jE(E,_){H(`${E} binary and large-scan conformance`,()=>{J("round-trips binary values correctly",async()=>{let S=await _.create();try{let F=new Uint8Array([0,1,127,128,255,42,0,13,10]);await S.put("binary",F);let Y=await S.get("binary");V(Y).toEqual(F)}finally{S[Symbol.dispose]()}}),J("returns 1000 scanned keys in sorted order",async()=>{let S=await _.create();try{let F=Array.from({length:1000},(R,U)=>({type:"put",key:`item:${String(U).padStart(4,"0")}`,value:L(String(U))}));await S.batch(F);let Y=await Z(S.scan("item:"));V(Y).toHaveLength(1000);for(let R=0;R<Y.length;R+=1)V(Y[R][0]).toBe(`item:${String(R).padStart(4,"0")}`)}finally{S[Symbol.dispose]()}},_.largeScanTimeoutMs)})}function zE(E,_){let{create:S,expected:F}=_;H(`${E} capabilities() conformance`,()=>{if(J("reports a well-formed capability shape",async()=>{let R=[];try{const Y=K(R,await S(),0);x(Y)}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("reports the expected capability row",async()=>{let R=[];try{const Y=K(R,await S(),0);V(Y.capabilities()).toEqual(F)}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("satisfies its declared read-after-write level",async()=>{let U=[];try{const Y=K(U,await S(),0);await Y.put("raw:key",L("written"));let R=await Y.get("raw:key");if(F.readAfterWrite!=="eventual")V(R).not.toBeNull(),V(z(R)).toBe("written")}catch(X){var G=X,O=1}finally{M(U,G,O)}}),F.scanConsistency==="snapshot")J("does not observe a key inserted after the scan began (snapshot)",async()=>{let G=[];try{const Y=K(G,await S(),0);await Y.put("scan:a",L("1"));await Y.put("scan:b",L("2"));let R=Y.scan("scan:")[Symbol.asyncIterator]();let U=await R.next();V(U.done).toBe(!1);await Y.put("scan:c",L("3"));let X=[];if(!U.done)X.push(U.value[0]);for(let N=await R.next();!N.done;N=await R.next())X.push(N.value[0]);V(X).not.toContain("scan:c");V(X).toContain("scan:a");V(X).toContain("scan:b")}catch(O){var B=O,C=1}finally{M(G,B,C)}});if(F.conditionalBatch)J("applies nothing when a conditionalBatch precondition mismatches",async()=>{let U=[];try{const Y=K(U,await S(),0);await Y.put("cas:key",L("initial"));let R=await D(Y,[{key:"cas:key",expectedValue:L("wrong")}],[{type:"put",key:"cas:key",value:L("changed")}]);V(R).toBe(!1);V(z(await Y.get("cas:key"))).toBe("initial")}catch(X){var G=X,O=1}finally{M(U,G,O)}}),J("reports conditionalBatch before running compare-and-swap assertions",async()=>{let R=[];try{const Y=K(R,await S(),0);V(Y.capabilities().conditionalBatch).toBe(!0)}catch(U){var X=U,G=1}finally{M(R,X,G)}})})}function DE(E,_){let{create:S}=_;H(`${E} concurrent conditionalBatch conformance`,()=>{J("lets exactly one of two contending conditionalBatch calls win",async()=>{let G=[];try{const F=K(G,await S(),0);V(F.capabilities().conditionalBatch).toBe(!0);await F.put("cas:counter",L("start"));let Y=[{key:"cas:counter",expectedValue:L("start")}];let[R,U]=await Promise.all([D(F,Y,[{type:"put",key:"cas:counter",value:L("first")}]),D(F,Y,[{type:"put",key:"cas:counter",value:L("second")}])]);V([R,U].filter(Boolean)).toHaveLength(1);let X=z(await F.get("cas:counter"));V(X).toBe(R?"first":"second")}catch(O){var B=O,C=1}finally{M(G,B,C)}})})}function HE(E,_){let{create:S}=_;H(`${E} basic storage contract`,()=>{J("get on empty storage returns null",async()=>{let R=[];try{const F=K(R,await S(),0);let Y=await F.get("nonexistent");V(Y).toBeNull()}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("put then get returns same bytes",async()=>{let U=[];try{const F=K(U,await S(),0);let Y=L("hello");await F.put("key",Y);let R=await F.get("key");V(R).toEqual(Y)}catch(X){var G=X,O=1}finally{M(U,G,O)}}),J("put with same key overwrites previous value",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("key",L("first"));await F.put("key",L("second"));let Y=await F.get("key");V(z(Y)).toBe("second")}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("delete removes key, subsequent get returns null",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("key",L("value"));await F.delete("key");let Y=await F.get("key");V(Y).toBeNull()}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("delete on a missing key is a no-op",async()=>{let Y=[];try{const F=K(Y,await S(),0);await F.delete("nonexistent");V(await F.get("nonexistent")).toBeNull()}catch(R){var U=R,X=1}finally{M(Y,U,X)}}),J("scan with prefix returns only matching keys, sorted lexicographically",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("wf:b",L("b"));await F.put("wf:a",L("a"));await F.put("wf:c",L("c"));await F.put("other:x",L("x"));let Y=await Z(F.scan("wf:"));V(Y.map(([O])=>O)).toEqual(["wf:a","wf:b","wf:c"])}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("scan with limit returns at most N entries",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("p:a",L("a"));await F.put("p:b",L("b"));await F.put("p:c",L("c"));let Y=await Z(F.scan("p:",{limit:2}));V(Y).toHaveLength(2);V(Y.map(([O])=>O)).toEqual(["p:a","p:b"])}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("scan with reverse returns in reverse order",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("p:a",L("a"));await F.put("p:b",L("b"));await F.put("p:c",L("c"));let Y=await Z(F.scan("p:",{reverse:!0}));V(Y.map(([O])=>O)).toEqual(["p:c","p:b","p:a"])}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("scan with gt/lt bounds",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("p:a",L("a"));await F.put("p:b",L("b"));await F.put("p:c",L("c"));await F.put("p:d",L("d"));let Y=await Z(F.scan("p:",{gt:"p:a",lt:"p:d"}));V(Y.map(([O])=>O)).toEqual(["p:b","p:c"])}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("scan with inclusive gte/lte bounds",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("p:a",L("a"));await F.put("p:b",L("b"));await F.put("p:c",L("c"));await F.put("p:d",L("d"));let Y=await Z(F.scan("p:",{gte:"p:b",lte:"p:c"}));V(Y.map(([O])=>O)).toEqual(["p:b","p:c"])}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("scan with no matching keys returns no entries",async()=>{let Y=[];try{const F=K(Y,await S(),0);await F.put("other:a",L("a"));V(await Z(F.scan("wf:"))).toHaveLength(0)}catch(R){var U=R,X=1}finally{M(Y,U,X)}}),J("batch with multiple puts stores every value",async()=>{let Y=[];try{const F=K(Y,await S(),0);await F.batch([{type:"put",key:"a",value:L("1")},{type:"put",key:"b",value:L("2")},{type:"put",key:"c",value:L("3")}]);V(await F.get("a")).toEqual(L("1"));V(await F.get("b")).toEqual(L("2"));V(await F.get("c")).toEqual(L("3"))}catch(R){var U=R,X=1}finally{M(Y,U,X)}}),J("batch with mixed puts and deletes leaves the expected state",async()=>{let Y=[];try{const F=K(Y,await S(),0);await F.put("keep",L("keep"));await F.put("remove",L("remove"));await F.batch([{type:"put",key:"new",value:L("new")},{type:"delete",key:"remove"}]);V(await F.get("keep")).toEqual(L("keep"));V(await F.get("remove")).toBeNull();V(await F.get("new")).toEqual(L("new"))}catch(R){var U=R,X=1}finally{M(Y,U,X)}}),J("batch with no operations is a no-op",async()=>{let Y=[];try{const F=K(Y,await S(),0);await F.put("key",L("value"));await F.batch([]);V(await F.get("key")).toEqual(L("value"))}catch(R){var U=R,X=1}finally{M(Y,U,X)}}),J("scan with empty prefix returns all keys",async()=>{let R=[];try{const F=K(R,await S(),0);await F.put("alpha",L("a"));await F.put("beta",L("b"));await F.put("gamma",L("c"));let Y=await Z(F.scan(""));V(Y.map(([O])=>O)).toEqual(["alpha","beta","gamma"])}catch(U){var X=U,G=1}finally{M(R,X,G)}}),J("scan with empty prefix on empty storage returns no entries",async()=>{let Y=[];try{const F=K(Y,await S(),0);V(await Z(F.scan(""))).toEqual([])}catch(R){var U=R,X=1}finally{M(Y,U,X)}})})}export{zE as runStorageCapabilityConformance,DE as runConcurrentConditionalBatchConformance,jE as runBinaryAndLargeScanStorageConformance,HE as runBasicStorageContract};
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "0.
|
|
1
|
+
export const VERSION = "0.17.0";
|
|
@@ -300,8 +300,8 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
300
300
|
*/
|
|
301
301
|
export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
302
302
|
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
303
|
-
readonly $id:
|
|
304
|
-
readonly title:
|
|
303
|
+
readonly $id: `https://weft.dev/schemas/remote-worker-protocol.v${string}.json`;
|
|
304
|
+
readonly title: `Weft RemoteWorker Protocol v${string}`;
|
|
305
305
|
readonly oneOf: {
|
|
306
306
|
$ref: string;
|
|
307
307
|
}[];
|
|
@@ -160,8 +160,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
160
160
|
}
|
|
161
161
|
}, REMOTE_WORKER_PROTOCOL_JSON_SCHEMA = {
|
|
162
162
|
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
163
|
-
$id:
|
|
164
|
-
title:
|
|
163
|
+
$id: `https://weft.dev/schemas/remote-worker-protocol.v${String(REMOTE_WORKER_PROTOCOL_VERSION)}.json`,
|
|
164
|
+
title: `Weft RemoteWorker Protocol v${String(REMOTE_WORKER_PROTOCOL_VERSION)}`,
|
|
165
165
|
oneOf: Object.keys(REMOTE_WORKER_MESSAGE_SCHEMAS).map((messageType) => ({
|
|
166
166
|
$ref: `#/$defs/messages/${messageType}`
|
|
167
167
|
})),
|
package/dist/worker/protocol.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var c=import.meta.require,l=(z,B,D)=>{if(B!=null){if(typeof B!=="object"&&typeof B!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let X;if(D)X=B[Symbol.asyncDispose];if(X===void 0)X=B[Symbol.dispose];if(typeof X!=="function")throw TypeError("Object not disposable");z.push([D,X,B])}else if(D)z.push([D]);return B},a=(z,B,D)=>{let X=(U)=>B=D?new SuppressedError(U,B,"An error was suppressed during disposal"):(D=!0,U),Z=(U)=>{while(U=z.pop())try{var L=U[1]&&U[1].call(U[2]);if(U[0])return Promise.resolve(L).then(Z,(G)=>(X(G),Z()))}catch(G){X(G)}if(D)throw B};return Z()};function b(z){return z!==null&&typeof z==="object"&&!Array.isArray(z)}function $(z){if(z===null||typeof z==="string"||typeof z==="boolean"||typeof z==="number"&&Number.isFinite(z))return!0;if(Array.isArray(z))return z.every($);if(!b(z))return!1;return Object.values(z).every($)}function Y(z){return typeof z==="string"&&z.length>0}function J(z){return Array.isArray(z)&&z.every(Y)}function w(z){if(!b(z))return!1;return Object.values(z).every((B)=>typeof B==="string")}function q(z){if(!b(z))return!1;return Object.values(z).every($)}function H(z){return typeof z==="number"&&Number.isFinite(z)}function Q(z,B,D){return{ok:!1,error:{code:z,message:B,...D!==void 0?{requestedProtocolVersion:D}:{}}}}function f(z,B,D){let X={};for(let[Z,U,L,G]of D){let j=B[Z];if(j===void 0){if(U)return{ok:!1,error:Q(z,G)};continue}if(!L(j))return{ok:!1,error:Q(z,G)};X[Z]=j}return{ok:!0,values:X}}var x=2,h=2,M=2,I=[2];var K={$ref:"#/$defs/jsonValue"},A={type:"object",additionalProperties:K},P={type:"object",additionalProperties:{type:"string"}},F={const:x},N={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","activities"],properties:{type:{const:"register"},protocolVersion:F,workerId:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000},queue:{type:"string",minLength:1},deploymentName:{type:"string",minLength:1},buildId:{type:"string",minLength:1},runtimeVersion:{type:"string",minLength:1},gitSha:{type:"string",minLength:1},startedAt:{type:"number"},capabilities:A}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:K,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:K,attempt:{type:"number",minimum:1},headers:P,workflowExecutionToken:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","activities","concurrency"],properties:{type:{const:"registerAck"},protocolVersion:F,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:F},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},g={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://weft.dev/schemas/remote-worker-protocol.v1.json",title:"Weft RemoteWorker Protocol v1",oneOf:Object.keys(N).map((z)=>({$ref:`#/$defs/messages/${z}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:A,messages:N}};function C(z){let B=z.attemptToken;if(!Y(B))return Q("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:B}}}function _(z,B){let D=B.value;if(!$(D))return Q("invalid_message","completed taskResult.value must be valid JSON");let X=C(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"completed",value:D,...X.message}}}function T(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","failed taskResult.error must be a string");let X=C(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"failed",error:D,...X.message}}}function y(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","cancelled taskResult.error must be a string");let X=B.cancelled;if(X!==void 0&&X!==!0)return Q("invalid_message","taskResult.cancelled must be true when present");let Z=C(B);if(!Z.ok)return Z;return{ok:!0,message:{type:"taskResult",operationId:z,status:"cancelled",error:D,...X===!0?{cancelled:X}:{},...Z.message}}}var O={completed:_,failed:T,cancelled:y};function V(z){return z==="completed"||z==="failed"||z==="cancelled"}function W(z){let B=z.operationId;if(!Y(B))return Q("invalid_message","taskResult.operationId must be a non-empty string");let D=z.status;if(!V(D))return Q("invalid_message","taskResult.status must be completed, failed, or cancelled");return O[D](B,z)}var S=new Set(["register","heartbeat","taskResult"]),k=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function E(z){if(z===x)return{ok:!0,message:z};let B=H(z)?z:void 0;return Q("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(z)}`,B)}var m=[["workerId",!0,Y,"register.workerId must be a non-empty string"],["activities",!0,J,"register.activities must be an array of non-empty strings"],["concurrency",!1,H,"register.concurrency must be a finite number"],["queue",!1,Y,"register.queue must be a non-empty string"],["deploymentName",!1,Y,"register.deploymentName must be a non-empty string when present"],["buildId",!1,Y,"register.buildId must be a non-empty string when present"],["runtimeVersion",!1,Y,"register.runtimeVersion must be a non-empty string when present"],["gitSha",!1,Y,"register.gitSha must be a non-empty string when present"],["startedAt",!1,H,"register.startedAt must be a finite number when present"],["capabilities",!1,q,"register.capabilities must be a JSON object when present"]];function R(z){let B=E(z.protocolVersion);if(!B.ok)return B;let D=f("invalid_registration",z,m);if(!D.ok)return D.error;return{ok:!0,message:{type:"register",protocolVersion:B.message,...D.values}}}function p(z){let B=z.workerId;if(!Y(B))return Q("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:B}}}var n=[["operationId",!0,Y,"task.operationId must be a non-empty string"],["activityName",!0,Y,"task.activityName must be a non-empty string"],["input",!0,$,"task.input must be valid JSON"],["attempt",!1,H,"task.attempt must be a finite number"],["headers",!1,w,"task.headers must be a string map"],["workflowExecutionToken",!1,Y,"task.workflowExecutionToken must be a non-empty string"],["attemptToken",!0,Y,"task.attemptToken must be a non-empty string"]];function i(z){let B=f("invalid_message",z,n);if(!B.ok)return B.error;return{ok:!0,message:{type:"task",...B.values}}}function v(z){let B=z.operationId;if(!Y(B))return Q("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:B}}}function d(){return{ok:!0,message:{type:"shutdown"}}}function u(z){let B=z.protocolVersion;if(B!==x)return Q("invalid_message",`registerAck.protocolVersion must be ${String(x)}`);let{workerId:D,queue:X,activities:Z,concurrency:U}=z;if(!Y(D))return Q("invalid_message","registerAck.workerId must be a non-empty string");if(!Y(X))return Q("invalid_message","registerAck.queue must be a non-empty string");if(!J(Z))return Q("invalid_message","registerAck.activities must be a string array");if(typeof U!=="number"||!Number.isFinite(U))return Q("invalid_message","registerAck.concurrency must be a finite number");return{ok:!0,message:{type:"registerAck",protocolVersion:B,workerId:D,queue:X,activities:Z,concurrency:U}}}function s(z){let{code:B,message:D,supportedProtocolVersions:X,requestedProtocolVersion:Z}=z;if(B!=="invalid_registration"&&B!=="unsupported_protocol_version")return Q("invalid_message","registerError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","registerError.message must be a string");if(!Array.isArray(X)||!X.every((L)=>L===x))return Q("invalid_message","registerError.supportedProtocolVersions is invalid");if(Z!==void 0&&!H(Z))return Q("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:B,message:D,supportedProtocolVersions:X,...Z!==void 0?{requestedProtocolVersion:Z}:{}}}}function t(z){let{code:B,message:D}=z;if(B!=="invalid_json"&&B!=="invalid_message"&&B!=="unknown_message_type"&&B!=="registration_required")return Q("invalid_message","protocolError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:B,message:D}}}function $z(z){if(!b(z))return Q("invalid_message","Worker protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Worker protocol message.type must be a string");if(!S.has(B))return Q("unknown_message_type",`Unknown worker message type: ${B}`);switch(B){case"register":return R(z);case"heartbeat":return p(z);case"taskResult":return W(z);default:return Q("unknown_message_type",`Unknown worker message type: ${B}`)}}function xz(z){if(!b(z))return Q("invalid_message","Server protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Server protocol message.type must be a string");if(!k.has(B))return Q("unknown_message_type",`Unknown server message type: ${B}`);switch(B){case"registerAck":return u(z);case"registerError":return s(z);case"protocolError":return t(z);case"task":return i(z);case"cancel":return v(z);case"shutdown":return d();default:return Q("unknown_message_type",`Unknown server message type: ${B}`)}}export{$z as parseWorkerToServerMessage,xz as parseServerToWorkerMessage,$ as isRemoteWorkerJsonValue,I as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,x as REMOTE_WORKER_PROTOCOL_VERSION,g as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,h as REMOTE_WORKER_MIN_PROTOCOL_VERSION,N as REMOTE_WORKER_MESSAGE_SCHEMAS,M as REMOTE_WORKER_MAX_PROTOCOL_VERSION};
|
|
2
|
+
var c=import.meta.require,l=(z,B,D)=>{if(B!=null){if(typeof B!=="object"&&typeof B!=="function")throw TypeError('Object expected to be assigned to "using" declaration');let X;if(D)X=B[Symbol.asyncDispose];if(X===void 0)X=B[Symbol.dispose];if(typeof X!=="function")throw TypeError("Object not disposable");z.push([D,X,B])}else if(D)z.push([D]);return B},a=(z,B,D)=>{let X=(U)=>B=D?new SuppressedError(U,B,"An error was suppressed during disposal"):(D=!0,U),Z=(U)=>{while(U=z.pop())try{var j=U[1]&&U[1].call(U[2]);if(U[0])return Promise.resolve(j).then(Z,(G)=>(X(G),Z()))}catch(G){X(G)}if(D)throw B};return Z()};function b(z){return z!==null&&typeof z==="object"&&!Array.isArray(z)}function x(z){if(z===null||typeof z==="string"||typeof z==="boolean"||typeof z==="number"&&Number.isFinite(z))return!0;if(Array.isArray(z))return z.every(x);if(!b(z))return!1;return Object.values(z).every(x)}function Y(z){return typeof z==="string"&&z.length>0}function L(z){return Array.isArray(z)&&z.every(Y)}function q(z){if(!b(z))return!1;return Object.values(z).every((B)=>typeof B==="string")}function A(z){if(!b(z))return!1;return Object.values(z).every(x)}function H(z){return typeof z==="number"&&Number.isFinite(z)}function Q(z,B,D){return{ok:!1,error:{code:z,message:B,...D!==void 0?{requestedProtocolVersion:D}:{}}}}function f(z,B,D){let X={};for(let[Z,U,j,G]of D){let J=B[Z];if(J===void 0){if(U)return{ok:!1,error:Q(z,G)};continue}if(!j(J))return{ok:!1,error:Q(z,G)};X[Z]=J}return{ok:!0,values:X}}var $=2,W=2,M=2,I=[2];var w={$ref:"#/$defs/jsonValue"},C={type:"object",additionalProperties:w},g={type:"object",additionalProperties:{type:"string"}},F={const:$},K={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","activities"],properties:{type:{const:"register"},protocolVersion:F,workerId:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000},queue:{type:"string",minLength:1},deploymentName:{type:"string",minLength:1},buildId:{type:"string",minLength:1},runtimeVersion:{type:"string",minLength:1},gitSha:{type:"string",minLength:1},startedAt:{type:"number"},capabilities:C}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:w,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:w,attempt:{type:"number",minimum:1},headers:g,workflowExecutionToken:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","activities","concurrency"],properties:{type:{const:"registerAck"},protocolVersion:F,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},activities:{type:"array",items:{type:"string",minLength:1}},concurrency:{type:"number",minimum:1,maximum:1000}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:F},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},P={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String($)}.json`,title:`Weft RemoteWorker Protocol v${String($)}`,oneOf:Object.keys(K).map((z)=>({$ref:`#/$defs/messages/${z}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:C,messages:K}};function N(z){let B=z.attemptToken;if(!Y(B))return Q("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:B}}}function y(z,B){let D=B.value;if(!x(D))return Q("invalid_message","completed taskResult.value must be valid JSON");let X=N(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"completed",value:D,...X.message}}}function T(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","failed taskResult.error must be a string");let X=N(B);if(!X.ok)return X;return{ok:!0,message:{type:"taskResult",operationId:z,status:"failed",error:D,...X.message}}}function _(z,B){let D=B.error;if(typeof D!=="string")return Q("invalid_message","cancelled taskResult.error must be a string");let X=B.cancelled;if(X!==void 0&&X!==!0)return Q("invalid_message","taskResult.cancelled must be true when present");let Z=N(B);if(!Z.ok)return Z;return{ok:!0,message:{type:"taskResult",operationId:z,status:"cancelled",error:D,...X===!0?{cancelled:X}:{},...Z.message}}}var V={completed:y,failed:T,cancelled:_};function k(z){return z==="completed"||z==="failed"||z==="cancelled"}function h(z){let B=z.operationId;if(!Y(B))return Q("invalid_message","taskResult.operationId must be a non-empty string");let D=z.status;if(!k(D))return Q("invalid_message","taskResult.status must be completed, failed, or cancelled");return V[D](B,z)}var S=new Set(["register","heartbeat","taskResult"]),O=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function E(z){if(z===$)return{ok:!0,message:z};let B=H(z)?z:void 0;return Q("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(z)}`,B)}var m=[["workerId",!0,Y,"register.workerId must be a non-empty string"],["activities",!0,L,"register.activities must be an array of non-empty strings"],["concurrency",!1,H,"register.concurrency must be a finite number"],["queue",!1,Y,"register.queue must be a non-empty string"],["deploymentName",!1,Y,"register.deploymentName must be a non-empty string when present"],["buildId",!1,Y,"register.buildId must be a non-empty string when present"],["runtimeVersion",!1,Y,"register.runtimeVersion must be a non-empty string when present"],["gitSha",!1,Y,"register.gitSha must be a non-empty string when present"],["startedAt",!1,H,"register.startedAt must be a finite number when present"],["capabilities",!1,A,"register.capabilities must be a JSON object when present"]];function R(z){let B=E(z.protocolVersion);if(!B.ok)return B;let D=f("invalid_registration",z,m);if(!D.ok)return D.error;return{ok:!0,message:{type:"register",protocolVersion:B.message,...D.values}}}function p(z){let B=z.workerId;if(!Y(B))return Q("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:B}}}var n=[["operationId",!0,Y,"task.operationId must be a non-empty string"],["activityName",!0,Y,"task.activityName must be a non-empty string"],["input",!0,x,"task.input must be valid JSON"],["attempt",!1,H,"task.attempt must be a finite number"],["headers",!1,q,"task.headers must be a string map"],["workflowExecutionToken",!1,Y,"task.workflowExecutionToken must be a non-empty string"],["attemptToken",!0,Y,"task.attemptToken must be a non-empty string"]];function i(z){let B=f("invalid_message",z,n);if(!B.ok)return B.error;return{ok:!0,message:{type:"task",...B.values}}}function v(z){let B=z.operationId;if(!Y(B))return Q("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:B}}}function d(){return{ok:!0,message:{type:"shutdown"}}}function u(z){let B=z.protocolVersion;if(B!==$)return Q("invalid_message",`registerAck.protocolVersion must be ${String($)}`);let{workerId:D,queue:X,activities:Z,concurrency:U}=z;if(!Y(D))return Q("invalid_message","registerAck.workerId must be a non-empty string");if(!Y(X))return Q("invalid_message","registerAck.queue must be a non-empty string");if(!L(Z))return Q("invalid_message","registerAck.activities must be a string array");if(typeof U!=="number"||!Number.isFinite(U))return Q("invalid_message","registerAck.concurrency must be a finite number");return{ok:!0,message:{type:"registerAck",protocolVersion:B,workerId:D,queue:X,activities:Z,concurrency:U}}}function s(z){let{code:B,message:D,supportedProtocolVersions:X,requestedProtocolVersion:Z}=z;if(B!=="invalid_registration"&&B!=="unsupported_protocol_version")return Q("invalid_message","registerError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","registerError.message must be a string");if(!Array.isArray(X)||!X.every((j)=>j===$))return Q("invalid_message","registerError.supportedProtocolVersions is invalid");if(Z!==void 0&&!H(Z))return Q("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:B,message:D,supportedProtocolVersions:X,...Z!==void 0?{requestedProtocolVersion:Z}:{}}}}function t(z){let{code:B,message:D}=z;if(B!=="invalid_json"&&B!=="invalid_message"&&B!=="unknown_message_type"&&B!=="registration_required")return Q("invalid_message","protocolError.code is not recognized");if(typeof D!=="string")return Q("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:B,message:D}}}function $z(z){if(!b(z))return Q("invalid_message","Worker protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Worker protocol message.type must be a string");if(!S.has(B))return Q("unknown_message_type",`Unknown worker message type: ${B}`);switch(B){case"register":return R(z);case"heartbeat":return p(z);case"taskResult":return h(z);default:return Q("unknown_message_type",`Unknown worker message type: ${B}`)}}function xz(z){if(!b(z))return Q("invalid_message","Server protocol message must be a JSON object");let B=z.type;if(typeof B!=="string")return Q("invalid_message","Server protocol message.type must be a string");if(!O.has(B))return Q("unknown_message_type",`Unknown server message type: ${B}`);switch(B){case"registerAck":return u(z);case"registerError":return s(z);case"protocolError":return t(z);case"task":return i(z);case"cancel":return v(z);case"shutdown":return d();default:return Q("unknown_message_type",`Unknown server message type: ${B}`)}}export{$z as parseWorkerToServerMessage,xz as parseServerToWorkerMessage,x as isRemoteWorkerJsonValue,I as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,$ as REMOTE_WORKER_PROTOCOL_VERSION,P as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,W as REMOTE_WORKER_MIN_PROTOCOL_VERSION,K as REMOTE_WORKER_MESSAGE_SCHEMAS,M as REMOTE_WORKER_MAX_PROTOCOL_VERSION};
|