@lostgradient/weft 0.21.0 → 0.22.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/cli/generated/operation-catalog.snapshot.json +207 -80
- package/dist/cli/generated/operation-client.generated.d.ts +120 -43
- package/dist/client/http-client-storage.js +1 -1
- package/dist/http.js +2 -2
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +3 -3
- package/dist/observability/index.js +2 -2
- package/dist/server/operations/get-task-diagnostics.d.ts +115 -25
- package/dist/server/operations/get-task-diagnostics.js +93 -7
- package/dist/storage/auto.js +1 -1
- package/dist/storage/bun-sql.js +2 -2
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/http.js +1 -1
- package/dist/storage/interface.js +1 -1
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +4 -4
- package/dist/storage/node-sqlite.js +2 -2
- package/dist/storage/postgres.js +4 -4
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/protocol.js +1 -1
- package/package.json +3 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var be=import.meta.require;var q={traceId:"0".repeat(32),spanId:"0".repeat(16),traceFlags:0},v={setAttribute(){},setStatus(){},recordException(){},end(){},spanContext(){return q}},_={setAttribute:(...e)=>v.setAttribute(...e),setStatus:(...e)=>v.setStatus(...e),recordException:(...e)=>v.recordException(...e),end:(...e)=>v.end(...e)},Z={startSpan(){return v}},M={record(){},add(){}},V={createHistogram(){return M},createCounter(){return M},createUpDownCounter(){return M}},B=Symbol("ROOT_CONTEXT"),J={trace:{getTracer(){return Z},setSpan(e){return e}},metrics:{getMeter(){return V}},context:{ROOT_CONTEXT:B,with(e,t){return t()}},SpanStatusCode:{OK:1,ERROR:2,UNSET:0}},w;function Q(){let e=globalThis.require;if(typeof e==="function")return(t)=>e(t);return()=>{return}}function ee(e){return e?.trace?.getTracer!=null&&e.SpanStatusCode!=null}function te(e=Q()){try{let t=e("@opentelemetry/api");if(ee(t))return t}catch{}return}function y(e){if(w)return w;let t=te(e);if(t)return w=t,w;return w=J,w}function P(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),Array.from(t,(r)=>r.toString(16).padStart(2,"0")).join("")}var W="traceparent",re=/^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/,ne="00000000000000000000000000000000",oe="0000000000000000";function L(e){let t=re.exec(e);if(!t)return null;let[,r,n,o,s]=t;if(n===ne)return null;if(o===oe)return null;return{version:r,traceId:n,spanId:o,traceFlags:parseInt(s,16)}}function D(e){let t=e.traceFlags.toString(16).padStart(2,"0");return`${e.version}-${e.traceId}-${e.spanId}-${t}`}function h(e){let t=e.get(W);if(!t)return null;return L(t)}function C(e,t){e.set(W,D(t))}function ie(){return P(16)}function se(){return P(8)}var N=1024;function g(e,t){let r;try{r=JSON.stringify(e)}catch{r=String(e)}if(r.length>t)return r.slice(0,t)+"...";return r}function ae(e){return e instanceof Error?e.message:String(e)}function pe(e){return e instanceof Error?e:Error(String(e))}function b(e,t){let r=e.spanContext();C(t,{version:"00",traceId:r.traceId,spanId:r.spanId,traceFlags:r.traceFlags})}function S(e,t,r){let n=e.attributeExtractor;if(!n)return;let o=n(r);for(let[s,a]of Object.entries(o))t.setAttribute(s,a)}function O(e,t){let r=e.workflowSpans.get(t);return r?e.trace.setSpan(e.api.context.ROOT_CONTEXT,r.span):e.api.context.ROOT_CONTEXT}function R(e,t,r){t.setStatus({code:e.SpanStatusCode.ERROR,message:ae(r)}),t.recordException(pe(r))}function F(e,t,r,n){try{let o=r();return t.setStatus({code:e.SpanStatusCode.OK}),n?.(o),o}catch(o){throw R(e,t,o),o}finally{t.end()}}async function x(e,t,r,n){try{let o=await r();return t.setStatus({code:e.SpanStatusCode.OK}),n?.(o),o}catch(o){throw R(e,t,o),o}finally{t.end()}}function*I(e,t,r,n){try{let o=yield*r();return t.setStatus({code:e.SpanStatusCode.OK}),n?.(o),o}catch(o){throw R(e,t,o),o}finally{t.end()}}function H(e){return{async execute(t,r){let n=h(t.headers),o=e.api.context.ROOT_CONTEXT;if(n){let a={..._,spanContext(){return{traceId:n.traceId,spanId:n.spanId,traceFlags:n.traceFlags}}};o=e.trace.setSpan(e.api.context.ROOT_CONTEXT,a)}let s=e.tracer.startSpan(`activity:execute:${t.activityName}`,{attributes:{"weft.activity.name":t.activityName,"weft.activity.attempt":t.attempt,...n?{"weft.parent.trace_id":n.traceId}:{}}},o);if(e.recordPayloads&&t.input!==void 0)s.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));return x(e,s,()=>r(t))}}}var k={workflowDuration:{name:"weft.workflow.duration",description:"Duration of workflow execution in milliseconds",unit:"ms",type:"histogram"},activityDuration:{name:"weft.activity.duration",description:"Duration of activity execution in milliseconds",unit:"ms",type:"histogram"},activityAttempts:{name:"weft.activity.attempts",description:"Total activity execution attempts",unit:"attempts",type:"counter"},workflowActive:{name:"weft.workflow.active",description:"Number of currently active workflows",unit:"workflows",type:"gauge"},workflowStarted:{name:"weft.workflow.started",description:"Total workflows started",unit:"workflows",type:"counter"},workflowCompleted:{name:"weft.workflow.completed",description:"Total workflows completed",unit:"workflows",type:"counter"},workflowFailed:{name:"weft.workflow.failed",description:"Total workflows failed",unit:"workflows",type:"counter"},promptCacheHits:{name:"weft.prompt_cache.hits",description:"Total prompt prefix cache hits",unit:"hits",type:"counter"},promptCacheMisses:{name:"weft.prompt_cache.misses",description:"Total prompt prefix cache misses",unit:"misses",type:"counter"},dpmoDefects:{name:"weft.dpmo.defects",description:"Total failed workflows (DPMO numerator)",unit:"workflows",type:"counter"},dpmoOperations:{name:"weft.dpmo.operations",description:"Total started workflows (DPMO denominator)",unit:"workflows",type:"counter"},taskBacklog:{name:"weft.task.backlog",description:"Number of queued tasks waiting for workers",unit:"tasks",type:"gauge"},taskQueueLatency:{name:"weft.task.queue_latency",description:"Time tasks spend queued before dispatch in milliseconds",unit:"ms",type:"histogram"},taskExecutionLatency:{name:"weft.task.execution_latency",description:"Time tasks spend executing after worker start in milliseconds",unit:"ms",type:"histogram"},taskRetries:{name:"weft.task.retries",description:"Total task retry attempts after the first dispatch attempt",unit:"retries",type:"counter"},taskRequeues:{name:"weft.task.requeues",description:"Total visibility-timeout or disconnect task requeues",unit:"requeues",type:"counter"},taskStaleHeartbeats:{name:"weft.task.stale_heartbeats",description:"Number of in-flight tasks whose heartbeat age exceeds the diagnostic threshold",unit:"tasks",type:"gauge"},workerCapacitySaturation:{name:"weft.worker.capacity_saturation",description:"Ratio of in-flight worker slots to total worker concurrency",unit:"ratio",type:"gauge"}};var ce=1e4;class G{#e;#r=0;#t=0;constructor(e){this.#e=new Float64Array(e)}push(e){if(this.#e[this.#r]=e,this.#r=(this.#r+1)%this.#e.length,this.#t<this.#e.length)this.#t++}toArray(){if(this.#t<this.#e.length)return Array.from(this.#e.subarray(0,this.#t));let e=Array.from({length:this.#t});for(let t=0;t<this.#t;t++)e[t]=this.#e[(this.#r+t)%this.#e.length];return e}}class E{#e;#r;#t;constructor(){this.#e=new Map,this.#r=new Map,this.#t=new Map}increment(e,t=1){this.#e.set(e,(this.#e.get(e)??0)+t)}record(e,t){let r=this.#r.get(e);if(!r)r=new G(ce),this.#r.set(e,r);r.push(t)}gauge(e,t){this.#t.set(e,t)}snapshot(){let e={};for(let[t,r]of this.#e)e[t]={type:"counter",value:r};for(let[t,r]of this.#r){let n=r.toArray(),o=ue(n);e[t]={type:"histogram",count:n.length,sum:de(n),p50:o[Math.floor(o.length*0.5)]??0,p99:o[Math.floor(o.length*0.99)]??0,min:o[0]??0,max:o[o.length-1]??0}}for(let[t,r]of this.#t)e[t]={type:"gauge",value:r};return e}reset(){this.#e.clear(),this.#r.clear(),this.#t.clear()}}function le(e){let t;if(typeof e==="string")t=y().metrics.getMeter(e);else if(e)t=e;else t=y().metrics.getMeter("weft");return{workflowDuration:t.createHistogram("weft.workflow.duration",{unit:"ms"}),activityDuration:t.createHistogram("weft.activity.duration",{unit:"ms"}),activityAttempts:t.createCounter("weft.activity.attempts"),activeWorkflows:t.createUpDownCounter("weft.workflow.active")}}function ue(e){let t=[...e];return t.sort((r,n)=>r-n),t}function de(e){let t=0;for(let r of e)t+=r;return t}function fe(e,t){let r=t?.type==="histogram"?t.count:0,n=t?.type==="histogram"?t.sum:0;return[`# TYPE ${e} histogram`,`${e}_count ${r}`,`${e}_sum ${n}`]}function me(e,t){let r=t?.type==="counter"?t.value:0;return[`# TYPE ${e} counter`,`${e}_total ${r}`]}function we(e,t){let r=t?.type==="gauge"?t.value:0;return[`# TYPE ${e} gauge`,`${e} ${r}`]}var ye={histogram:fe,counter:me,gauge:we};function ge(e,t){let r=e.name.replace(/\./g,"_"),n=t[e.name];return[`# HELP ${r} ${e.description}`,...ye[e.type](r,n)]}function Se(e){let t=e[k.dpmoDefects.name],r=e[k.dpmoOperations.name],n=t?.type==="counter"?t.value:0,o=r?.type==="counter"?r.value:0,s=o===0?0:n*1e6/o,a="weft_dpmo";return["# HELP weft_dpmo Defects per million operations (failed workflows / started workflows * 1e6)","# TYPE weft_dpmo gauge",`weft_dpmo ${s}`]}function z(e){let t=[];for(let r of Object.values(k))t.push(...ge(r,e));return t.push(...Se(e)),t.join(`
|
|
3
3
|
`)+`
|
|
4
|
-
`}function
|
|
4
|
+
`}function ke(e){return{serialize(){let t=e?.snapshot()??{};return z(t)}}}class l extends Event{static type="workflow:completed";workflowId;result;duration;constructor(e,t,r){super(l.type);this.workflowId=e,this.result=t,this.duration=r}}class u extends Event{static type="workflow:failed";workflowId;error;constructor(e,t){super(u.type);this.workflowId=e,this.error=t}}class d extends Event{static type="workflow:cancelled";workflowId;constructor(e){super(d.type);this.workflowId=e}}class f extends Event{static type="workflow:timed-out";workflowId;timeoutType;elapsed;reason;constructor(e,t,r,n){super(f.type);if(this.workflowId=e,this.timeoutType=t,this.elapsed=r,n!==void 0)this.reason=n}}var Fe=new Set([l.type,u.type,d.type,f.type]);var Te=3600000,X=1e4,ve=3600000;function U(e){let t=Date.now();for(let[r,n]of e.workflowSpans)if(t-n.createdAt>Te)n.span.end(),e.workflowSpans.delete(r);if(e.workflowSpans.size>X){let r=e.workflowSpans.size-X,n=0;for(let[o,s]of e.workflowSpans){if(n>=r)break;s.span.end(),e.workflowSpans.delete(o),n++}}}function K(e,t){let r=e.workflowSpans.get(t);if(r)r.span.end(),e.workflowSpans.delete(t)}function Y(e){function t(i,m,p){let c=e.workflowSpans.get(i);if(!c)return;if(m==="error")c.span.setStatus({code:e.SpanStatusCode.ERROR,...p?{message:p}:{}});else c.span.setStatus({code:e.SpanStatusCode.OK});c.span.end(),e.workflowSpans.delete(i)}let r=(i)=>{if(!(i instanceof l))return;t(i.workflowId,"ok")},n=(i)=>{if(!(i instanceof u))return;t(i.workflowId,"error",i.error.message),e.metrics.increment("weft.dpmo.defects")},o=(i)=>{if(!(i instanceof d))return;t(i.workflowId,"error","Workflow cancelled")},s=(i)=>{if(!(i instanceof f))return;t(i.workflowId,"error",`Workflow timed out (${i.timeoutType}) after ${i.elapsed}ms`),e.metrics.increment("weft.dpmo.defects")};if(e.eventTarget)e.eventTarget.addEventListener(l.type,r),e.eventTarget.addEventListener(u.type,n),e.eventTarget.addEventListener(d.type,o),e.eventTarget.addEventListener(f.type,s);function a(i=ve){let m=Date.now()-i,p=0;for(let[c,T]of e.workflowSpans)if(T.createdAt<=m)T.span.setStatus({code:e.SpanStatusCode.ERROR,message:"span evicted (stale)"}),T.span.end(),e.workflowSpans.delete(c),p++;return p}function A(){if(e.eventTarget)e.eventTarget.removeEventListener(l.type,r),e.eventTarget.removeEventListener(u.type,n),e.eventTarget.removeEventListener(d.type,o),e.eventTarget.removeEventListener(f.type,s);for(let i of e.workflowSpans.values())i.span.setStatus({code:e.SpanStatusCode.ERROR,message:"Observability disposed"}),i.span.end();e.workflowSpans.clear()}return{endWorkflowSpan:t,evictStaleSpans:a,dispose:A}}function j(e){return{workflowStart(t,r){U(e);let n=e.workflowSpans.get(t.workflowId);if(n)n.span.setStatus({code:e.SpanStatusCode.OK}),K(e,t.workflowId);let o=e.tracer.startSpan(`workflow:${t.workflowType}`,{attributes:{"weft.workflow.id":t.workflowId,"weft.workflow.type":t.workflowType}});if(e.workflowSpans.set(t.workflowId,{span:o,createdAt:Date.now()}),b(o,t.headers),e.recordPayloads&&t.input!==void 0)o.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));S(e,o,t),e.metrics.increment("weft.workflow.started"),e.metrics.increment("weft.dpmo.operations"),r(t)},*activity(t,r){let n=e.tracer.startSpan(`activity:${t.activityName}`,{attributes:{"weft.activity.name":t.activityName,"weft.activity.attempt":t.attempt}},O(e,t.workflowId));if(b(n,t.headers),e.recordPayloads&&t.input!==void 0)n.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));S(e,n,t);let o=Date.now();return yield*I(e,n,()=>r(t),()=>{e.metrics.record("weft.activity.duration",Date.now()-o),e.metrics.increment("weft.activity.attempts")})},*sleep(t,r){let n=e.tracer.startSpan("sleep",{attributes:{"weft.sleep.duration":t.duration}},O(e,t.workflowId));S(e,n,t),yield*I(e,n,()=>r(t))},*waitForSignal(t,r){let n=e.tracer.startSpan("waitForSignal",{attributes:{"weft.signal.name":t.signalName}},O(e,t.workflowId));return S(e,n,t),yield*I(e,n,()=>r(t))},async childWorkflow(t,r){let n=[],o=h(t.parentHeaders);if(o)n.push({context:{traceId:o.traceId,spanId:o.spanId,traceFlags:o.traceFlags}});let s=e.tracer.startSpan(`childWorkflow:${t.workflowType}`,{attributes:{"weft.child_workflow.type":t.workflowType,"weft.child_workflow.id":t.childWorkflowId,"weft.child_workflow.parent_id":t.workflowId},links:n},e.api.context.ROOT_CONTEXT);if(b(s,t.headers),e.recordPayloads&&t.input!==void 0)s.setAttribute("weft.payload.input",g(t.input,e.maxPayloadSize));return e.metrics.increment("weft.child_workflow.started"),x(e,s,()=>r(t))},signalReceived(t,r){let n=e.tracer.startSpan(`signal:received:${t.signalName}`,{attributes:{"weft.signal.name":t.signalName,"weft.signal.workflow_id":t.workflowId}});S(e,n,t),F(e,n,()=>r(t))}}}function he(e){let{attributeExtractor:t,eventTarget:r,maxPayloadSize:n=N,metrics:o=new E,openTelemetryApi:s=y(),recordPayloads:a=!1,tracerName:A="weft",tracerVersion:i}=e??{},m=s,{trace:p,SpanStatusCode:c}=m,T=p.getTracer(A,i);return{api:m,trace:p,SpanStatusCode:c,tracer:T,recordPayloads:a,maxPayloadSize:n,attributeExtractor:t,eventTarget:r,metrics:o,workflowSpans:new Map}}function Je(e){let t=he(e),r=j(t),n=H(t),o={...r,...n},s=Y(t);return{interceptor:o,metrics:t.metrics,...s}}export{k as METRICS,E as MetricsCollector,ke as createMetricsCollectorExporter,Je as createObservabilityInterceptors,le as createOpenTelemetryMetrics,h as extractTraceParent,D as formatTraceParent,se as generateSpanId,ie as generateTraceId,y as getOpenTelemetryApi,C as injectTraceParent,L as parseTraceParent,z as serializeMetricsSnapshotForPrometheus};
|
|
@@ -4,29 +4,27 @@
|
|
|
4
4
|
* Scans the durable task ledger (WFT-24 — previously the retired
|
|
5
5
|
* `op:queued:`/`op:inflight:`/`op:resolved:`/`op:dead-letter:` keys, which
|
|
6
6
|
* nothing has written since the WFT-22 ledger cutover) and live worker state
|
|
7
|
-
* to identify queue pressure, stale in-flight
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* turning workflow or worker
|
|
7
|
+
* to identify queue pressure, expected delayed attempts, stale in-flight
|
|
8
|
+
* work, retry storms, elapsed terminal non-adoption, dead letters, and worker
|
|
9
|
+
* capacity saturation. Results are intentionally bounded and low-cardinality
|
|
10
|
+
* so operators can use them in a dashboard without turning workflow or worker
|
|
11
|
+
* identifiers into metrics labels.
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* exposing the ledger's more granular internal states here would add
|
|
20
|
-
* distinctions operators cannot act on differently.
|
|
13
|
+
* `leased`, `completing`, and `cancelling` ledger states are all reported as
|
|
14
|
+
* diagnostic `state: 'inflight'`: they share the same lease-holder/heartbeat
|
|
15
|
+
* shape and the same operator question ("is a worker still making progress on
|
|
16
|
+
* this attempt?"), so exposing the ledger's more granular internal states
|
|
17
|
+
* here would add distinctions operators cannot act on differently. Terminal
|
|
18
|
+
* records reported as `unadopted-terminal` use the coarse `resolved` state and
|
|
19
|
+
* expose no attempt-count history.
|
|
21
20
|
*
|
|
22
21
|
* Retry-storm detection (`kind: 'retry-storm'`) no longer covers `terminal`
|
|
23
22
|
* records: `RemoteTaskTerminal` carries no `retryCount`/`requeueCount` (WFT-25
|
|
24
23
|
* deliberately dropped attempt-count history once a task resolves), so
|
|
25
24
|
* there is nothing left to detect a storm from once an attempt reaches a
|
|
26
|
-
* disposition.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* `kind`.
|
|
25
|
+
* disposition. Terminal records are classified only by elapsed non-adoption;
|
|
26
|
+
* that diagnostic does not claim an adoption attempt failed. `dead-lettered`
|
|
27
|
+
* diagnostics remain a distinct kind for result-persistence exhaustion.
|
|
30
28
|
*
|
|
31
29
|
* Unlike the pre-ledger scan, the full ledger scan this operation performs
|
|
32
30
|
* is one combined keyspace across every state (queued through terminal),
|
|
@@ -49,8 +47,10 @@ declare const taskDiagnosticKindSchema: z.ZodEnum<{
|
|
|
49
47
|
"stale-inflight": "stale-inflight";
|
|
50
48
|
"retry-storm": "retry-storm";
|
|
51
49
|
"all-workers-at-capacity": "all-workers-at-capacity";
|
|
50
|
+
delayed: "delayed";
|
|
51
|
+
"unadopted-terminal": "unadopted-terminal";
|
|
52
52
|
}>;
|
|
53
|
-
declare const taskDiagnosticItemSchema: z.ZodObject<{
|
|
53
|
+
declare const taskDiagnosticItemSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
54
54
|
kind: z.ZodEnum<{
|
|
55
55
|
"dead-lettered": "dead-lettered";
|
|
56
56
|
"stuck-queued": "stuck-queued";
|
|
@@ -82,16 +82,37 @@ declare const taskDiagnosticItemSchema: z.ZodObject<{
|
|
|
82
82
|
storageError: z.ZodOptional<z.ZodString>;
|
|
83
83
|
retryAttempts: z.ZodOptional<z.ZodNumber>;
|
|
84
84
|
evidence: z.ZodArray<z.ZodString>;
|
|
85
|
-
}, z.core.$strict
|
|
85
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
86
|
+
kind: z.ZodLiteral<"delayed">;
|
|
87
|
+
state: z.ZodLiteral<"queued">;
|
|
88
|
+
operationId: z.ZodString;
|
|
89
|
+
workflowId: z.ZodOptional<z.ZodString>;
|
|
90
|
+
queue: z.ZodString;
|
|
91
|
+
retryCount: z.ZodNumber;
|
|
92
|
+
requeueCount: z.ZodNumber;
|
|
93
|
+
availableAt: z.ZodNumber;
|
|
94
|
+
evidence: z.ZodArray<z.ZodString>;
|
|
95
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
96
|
+
kind: z.ZodLiteral<"unadopted-terminal">;
|
|
97
|
+
state: z.ZodLiteral<"resolved">;
|
|
98
|
+
operationId: z.ZodString;
|
|
99
|
+
workflowId: z.ZodOptional<z.ZodString>;
|
|
100
|
+
queue: z.ZodString;
|
|
101
|
+
terminalAt: z.ZodNumber;
|
|
102
|
+
adopted: z.ZodLiteral<false>;
|
|
103
|
+
evidence: z.ZodArray<z.ZodString>;
|
|
104
|
+
}, z.core.$strict>]>;
|
|
86
105
|
declare const taskDiagnosticsSummarySchema: z.ZodObject<{
|
|
87
106
|
stuckQueued: z.ZodNumber;
|
|
88
107
|
staleInflight: z.ZodNumber;
|
|
89
108
|
retryStorms: z.ZodNumber;
|
|
90
109
|
allWorkersAtCapacity: z.ZodNumber;
|
|
91
110
|
deadLettered: z.ZodNumber;
|
|
111
|
+
delayed: z.ZodNumber;
|
|
112
|
+
unadoptedTerminal: z.ZodNumber;
|
|
92
113
|
}, z.core.$strict>;
|
|
93
114
|
declare const getTaskDiagnosticsOutput: z.ZodObject<{
|
|
94
|
-
items: z.ZodArray<z.ZodObject<{
|
|
115
|
+
items: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
95
116
|
kind: z.ZodEnum<{
|
|
96
117
|
"dead-lettered": "dead-lettered";
|
|
97
118
|
"stuck-queued": "stuck-queued";
|
|
@@ -123,13 +144,34 @@ declare const getTaskDiagnosticsOutput: z.ZodObject<{
|
|
|
123
144
|
storageError: z.ZodOptional<z.ZodString>;
|
|
124
145
|
retryAttempts: z.ZodOptional<z.ZodNumber>;
|
|
125
146
|
evidence: z.ZodArray<z.ZodString>;
|
|
126
|
-
}, z.core.$strict
|
|
147
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
148
|
+
kind: z.ZodLiteral<"delayed">;
|
|
149
|
+
state: z.ZodLiteral<"queued">;
|
|
150
|
+
operationId: z.ZodString;
|
|
151
|
+
workflowId: z.ZodOptional<z.ZodString>;
|
|
152
|
+
queue: z.ZodString;
|
|
153
|
+
retryCount: z.ZodNumber;
|
|
154
|
+
requeueCount: z.ZodNumber;
|
|
155
|
+
availableAt: z.ZodNumber;
|
|
156
|
+
evidence: z.ZodArray<z.ZodString>;
|
|
157
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
158
|
+
kind: z.ZodLiteral<"unadopted-terminal">;
|
|
159
|
+
state: z.ZodLiteral<"resolved">;
|
|
160
|
+
operationId: z.ZodString;
|
|
161
|
+
workflowId: z.ZodOptional<z.ZodString>;
|
|
162
|
+
queue: z.ZodString;
|
|
163
|
+
terminalAt: z.ZodNumber;
|
|
164
|
+
adopted: z.ZodLiteral<false>;
|
|
165
|
+
evidence: z.ZodArray<z.ZodString>;
|
|
166
|
+
}, z.core.$strict>]>>;
|
|
127
167
|
summary: z.ZodObject<{
|
|
128
168
|
stuckQueued: z.ZodNumber;
|
|
129
169
|
staleInflight: z.ZodNumber;
|
|
130
170
|
retryStorms: z.ZodNumber;
|
|
131
171
|
allWorkersAtCapacity: z.ZodNumber;
|
|
132
172
|
deadLettered: z.ZodNumber;
|
|
173
|
+
delayed: z.ZodNumber;
|
|
174
|
+
unadoptedTerminal: z.ZodNumber;
|
|
133
175
|
}, z.core.$strict>;
|
|
134
176
|
limit: z.ZodNumber;
|
|
135
177
|
}, z.core.$strict>;
|
|
@@ -140,6 +182,8 @@ declare const getTaskDiagnosticsInput: z.ZodObject<{
|
|
|
140
182
|
staleQueuedAfterMs: z.ZodDefault<z.ZodNumber>;
|
|
141
183
|
staleHeartbeatAfterMs: z.ZodDefault<z.ZodNumber>;
|
|
142
184
|
retryStormMinimumAttempts: z.ZodDefault<z.ZodNumber>;
|
|
185
|
+
includeExpectedDelayed: z.ZodDefault<z.ZodBoolean>;
|
|
186
|
+
unadoptedAfterMs: z.ZodDefault<z.ZodNumber>;
|
|
143
187
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
144
188
|
}, z.core.$strip>;
|
|
145
189
|
declare const clearTaskDeadLetterInput: z.ZodObject<{
|
|
@@ -164,12 +208,14 @@ export declare function createGetTaskDiagnosticsOperation(options?: GetTaskDiagn
|
|
|
164
208
|
staleQueuedAfterMs: number;
|
|
165
209
|
staleHeartbeatAfterMs: number;
|
|
166
210
|
retryStormMinimumAttempts: number;
|
|
211
|
+
includeExpectedDelayed: boolean;
|
|
212
|
+
unadoptedAfterMs: number;
|
|
167
213
|
limit: number;
|
|
168
214
|
operationId?: string | undefined;
|
|
169
215
|
workflowId?: string | undefined;
|
|
170
216
|
queue?: string | undefined;
|
|
171
217
|
}, {
|
|
172
|
-
items: {
|
|
218
|
+
items: ({
|
|
173
219
|
kind: "dead-lettered" | "stuck-queued" | "stale-inflight" | "retry-storm" | "all-workers-at-capacity";
|
|
174
220
|
state: "dead-lettered" | "queued" | "resolved" | "inflight" | "capacity";
|
|
175
221
|
retryCount: number;
|
|
@@ -189,13 +235,34 @@ export declare function createGetTaskDiagnosticsOperation(options?: GetTaskDiagn
|
|
|
189
235
|
deadLetterReason?: "result-resolution-storage-exhausted" | undefined;
|
|
190
236
|
storageError?: string | undefined;
|
|
191
237
|
retryAttempts?: number | undefined;
|
|
192
|
-
}
|
|
238
|
+
} | {
|
|
239
|
+
kind: "delayed";
|
|
240
|
+
state: "queued";
|
|
241
|
+
operationId: string;
|
|
242
|
+
queue: string;
|
|
243
|
+
retryCount: number;
|
|
244
|
+
requeueCount: number;
|
|
245
|
+
availableAt: number;
|
|
246
|
+
evidence: string[];
|
|
247
|
+
workflowId?: string | undefined;
|
|
248
|
+
} | {
|
|
249
|
+
kind: "unadopted-terminal";
|
|
250
|
+
state: "resolved";
|
|
251
|
+
operationId: string;
|
|
252
|
+
queue: string;
|
|
253
|
+
terminalAt: number;
|
|
254
|
+
adopted: false;
|
|
255
|
+
evidence: string[];
|
|
256
|
+
workflowId?: string | undefined;
|
|
257
|
+
})[];
|
|
193
258
|
summary: {
|
|
194
259
|
stuckQueued: number;
|
|
195
260
|
staleInflight: number;
|
|
196
261
|
retryStorms: number;
|
|
197
262
|
allWorkersAtCapacity: number;
|
|
198
263
|
deadLettered: number;
|
|
264
|
+
delayed: number;
|
|
265
|
+
unadoptedTerminal: number;
|
|
199
266
|
};
|
|
200
267
|
limit: number;
|
|
201
268
|
}, unknown>;
|
|
@@ -203,12 +270,14 @@ export declare const getTaskDiagnosticsOperation: import("../operation-catalog.t
|
|
|
203
270
|
staleQueuedAfterMs: number;
|
|
204
271
|
staleHeartbeatAfterMs: number;
|
|
205
272
|
retryStormMinimumAttempts: number;
|
|
273
|
+
includeExpectedDelayed: boolean;
|
|
274
|
+
unadoptedAfterMs: number;
|
|
206
275
|
limit: number;
|
|
207
276
|
operationId?: string | undefined;
|
|
208
277
|
workflowId?: string | undefined;
|
|
209
278
|
queue?: string | undefined;
|
|
210
279
|
}, {
|
|
211
|
-
items: {
|
|
280
|
+
items: ({
|
|
212
281
|
kind: "dead-lettered" | "stuck-queued" | "stale-inflight" | "retry-storm" | "all-workers-at-capacity";
|
|
213
282
|
state: "dead-lettered" | "queued" | "resolved" | "inflight" | "capacity";
|
|
214
283
|
retryCount: number;
|
|
@@ -228,13 +297,34 @@ export declare const getTaskDiagnosticsOperation: import("../operation-catalog.t
|
|
|
228
297
|
deadLetterReason?: "result-resolution-storage-exhausted" | undefined;
|
|
229
298
|
storageError?: string | undefined;
|
|
230
299
|
retryAttempts?: number | undefined;
|
|
231
|
-
}
|
|
300
|
+
} | {
|
|
301
|
+
kind: "delayed";
|
|
302
|
+
state: "queued";
|
|
303
|
+
operationId: string;
|
|
304
|
+
queue: string;
|
|
305
|
+
retryCount: number;
|
|
306
|
+
requeueCount: number;
|
|
307
|
+
availableAt: number;
|
|
308
|
+
evidence: string[];
|
|
309
|
+
workflowId?: string | undefined;
|
|
310
|
+
} | {
|
|
311
|
+
kind: "unadopted-terminal";
|
|
312
|
+
state: "resolved";
|
|
313
|
+
operationId: string;
|
|
314
|
+
queue: string;
|
|
315
|
+
terminalAt: number;
|
|
316
|
+
adopted: false;
|
|
317
|
+
evidence: string[];
|
|
318
|
+
workflowId?: string | undefined;
|
|
319
|
+
})[];
|
|
232
320
|
summary: {
|
|
233
321
|
stuckQueued: number;
|
|
234
322
|
staleInflight: number;
|
|
235
323
|
retryStorms: number;
|
|
236
324
|
allWorkersAtCapacity: number;
|
|
237
325
|
deadLettered: number;
|
|
326
|
+
delayed: number;
|
|
327
|
+
unadoptedTerminal: number;
|
|
238
328
|
};
|
|
239
329
|
limit: number;
|
|
240
330
|
}, unknown>;
|
|
@@ -9,14 +9,22 @@ import {
|
|
|
9
9
|
calculateHeartbeatAgeMs,
|
|
10
10
|
calculateQueueLatencyMs
|
|
11
11
|
} from "../task-state.js";
|
|
12
|
-
const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS = 60000, DEFAULT_RETRY_STORM_MINIMUM_ATTEMPTS = 3, DEFAULT_LIMIT = 50, MAX_LIMIT = 200, taskDiagnosticKindSchema = z.enum([
|
|
12
|
+
const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS = 60000, DEFAULT_RETRY_STORM_MINIMUM_ATTEMPTS = 3, DEFAULT_UNADOPTED_AFTER_MS = 60000, DEFAULT_LIMIT = 50, MAX_LIMIT = 200, taskDiagnosticKindSchema = z.enum([
|
|
13
13
|
"stuck-queued",
|
|
14
14
|
"stale-inflight",
|
|
15
15
|
"retry-storm",
|
|
16
16
|
"all-workers-at-capacity",
|
|
17
|
-
"dead-lettered"
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
"dead-lettered",
|
|
18
|
+
"delayed",
|
|
19
|
+
"unadopted-terminal"
|
|
20
|
+
]), existingTaskDiagnosticItemSchema = z.object({
|
|
21
|
+
kind: z.enum([
|
|
22
|
+
"stuck-queued",
|
|
23
|
+
"stale-inflight",
|
|
24
|
+
"retry-storm",
|
|
25
|
+
"all-workers-at-capacity",
|
|
26
|
+
"dead-lettered"
|
|
27
|
+
]),
|
|
20
28
|
state: z.enum(["queued", "inflight", "resolved", "capacity", "dead-lettered"]),
|
|
21
29
|
operationId: z.string().optional(),
|
|
22
30
|
workflowId: z.string().optional(),
|
|
@@ -35,12 +43,37 @@ const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS =
|
|
|
35
43
|
storageError: z.string().optional(),
|
|
36
44
|
retryAttempts: z.number().int().nonnegative().optional(),
|
|
37
45
|
evidence: z.array(z.string())
|
|
38
|
-
}).strict(),
|
|
46
|
+
}).strict(), delayedTaskDiagnosticItemSchema = z.object({
|
|
47
|
+
kind: z.literal("delayed"),
|
|
48
|
+
state: z.literal("queued"),
|
|
49
|
+
operationId: z.string(),
|
|
50
|
+
workflowId: z.string().optional(),
|
|
51
|
+
queue: z.string(),
|
|
52
|
+
retryCount: z.number().int().nonnegative(),
|
|
53
|
+
requeueCount: z.number().int().nonnegative(),
|
|
54
|
+
availableAt: z.number().nonnegative(),
|
|
55
|
+
evidence: z.array(z.string())
|
|
56
|
+
}).strict(), unadoptedTerminalTaskDiagnosticItemSchema = z.object({
|
|
57
|
+
kind: z.literal("unadopted-terminal"),
|
|
58
|
+
state: z.literal("resolved"),
|
|
59
|
+
operationId: z.string(),
|
|
60
|
+
workflowId: z.string().optional(),
|
|
61
|
+
queue: z.string(),
|
|
62
|
+
terminalAt: z.number().nonnegative(),
|
|
63
|
+
adopted: z.literal(!1),
|
|
64
|
+
evidence: z.array(z.string())
|
|
65
|
+
}).strict(), taskDiagnosticItemSchema = z.union([
|
|
66
|
+
existingTaskDiagnosticItemSchema,
|
|
67
|
+
delayedTaskDiagnosticItemSchema,
|
|
68
|
+
unadoptedTerminalTaskDiagnosticItemSchema
|
|
69
|
+
]), taskDiagnosticsSummarySchema = z.object({
|
|
39
70
|
stuckQueued: z.number().int().nonnegative(),
|
|
40
71
|
staleInflight: z.number().int().nonnegative(),
|
|
41
72
|
retryStorms: z.number().int().nonnegative(),
|
|
42
73
|
allWorkersAtCapacity: z.number().int().nonnegative(),
|
|
43
|
-
deadLettered: z.number().int().nonnegative()
|
|
74
|
+
deadLettered: z.number().int().nonnegative(),
|
|
75
|
+
delayed: z.number().int().nonnegative(),
|
|
76
|
+
unadoptedTerminal: z.number().int().nonnegative()
|
|
44
77
|
}).strict(), getTaskDiagnosticsOutput = z.object({
|
|
45
78
|
items: z.array(taskDiagnosticItemSchema),
|
|
46
79
|
summary: taskDiagnosticsSummarySchema,
|
|
@@ -52,6 +85,8 @@ const DEFAULT_STALE_QUEUED_AFTER_MS = 60000, DEFAULT_STALE_HEARTBEAT_AFTER_MS =
|
|
|
52
85
|
staleQueuedAfterMs: z.number().int().nonnegative().default(DEFAULT_STALE_QUEUED_AFTER_MS),
|
|
53
86
|
staleHeartbeatAfterMs: z.number().int().nonnegative().default(DEFAULT_STALE_HEARTBEAT_AFTER_MS),
|
|
54
87
|
retryStormMinimumAttempts: z.number().int().min(1).default(DEFAULT_RETRY_STORM_MINIMUM_ATTEMPTS),
|
|
88
|
+
includeExpectedDelayed: z.boolean().default(!1),
|
|
89
|
+
unadoptedAfterMs: z.number().int().nonnegative().default(DEFAULT_UNADOPTED_AFTER_MS),
|
|
55
90
|
limit: z.number().int().min(1).max(MAX_LIMIT).default(DEFAULT_LIMIT)
|
|
56
91
|
}), clearTaskDeadLetterInput = z.object({
|
|
57
92
|
operationId: z.string().min(1)
|
|
@@ -128,7 +163,9 @@ async function collectTaskDiagnostics({
|
|
|
128
163
|
staleInflight: 0,
|
|
129
164
|
retryStorms: 0,
|
|
130
165
|
allWorkersAtCapacity: 0,
|
|
131
|
-
deadLettered: 0
|
|
166
|
+
deadLettered: 0,
|
|
167
|
+
delayed: 0,
|
|
168
|
+
unadoptedTerminal: 0
|
|
132
169
|
}, relevantQueues = new Set, addItem = (item) => {
|
|
133
170
|
incrementSummary(summary, item.kind);
|
|
134
171
|
if (items.length < input.limit)
|
|
@@ -155,6 +192,8 @@ async function collectTaskDiagnostics({
|
|
|
155
192
|
function addRecordDiagnostics(decoded, input, currentTime, addItem) {
|
|
156
193
|
switch (decoded.state) {
|
|
157
194
|
case "queued":
|
|
195
|
+
if (input.includeExpectedDelayed && decoded.availableAt > currentTime)
|
|
196
|
+
addDelayedDiagnostic(decoded, addItem);
|
|
158
197
|
if (decoded.availableAt <= currentTime)
|
|
159
198
|
addQueuedDiagnostics(decoded, input, currentTime, addItem);
|
|
160
199
|
addRetryStormDiagnostic(decoded, "queued", input, addItem);
|
|
@@ -166,6 +205,7 @@ function addRecordDiagnostics(decoded, input, currentTime, addItem) {
|
|
|
166
205
|
addRetryStormDiagnostic(decoded, "inflight", input, addItem);
|
|
167
206
|
return;
|
|
168
207
|
case "terminal":
|
|
208
|
+
addUnadoptedTerminalDiagnostic(decoded, input, currentTime, addItem);
|
|
169
209
|
return;
|
|
170
210
|
case "deadLettered":
|
|
171
211
|
addDeadLetterDiagnostics(decoded, addItem);
|
|
@@ -175,6 +215,33 @@ function addRecordDiagnostics(decoded, input, currentTime, addItem) {
|
|
|
175
215
|
}
|
|
176
216
|
}
|
|
177
217
|
}
|
|
218
|
+
function addDelayedDiagnostic(record, addItem) {
|
|
219
|
+
addItem({
|
|
220
|
+
kind: "delayed",
|
|
221
|
+
state: "queued",
|
|
222
|
+
operationId: record.operationId,
|
|
223
|
+
workflowId: record.workflowId,
|
|
224
|
+
queue: record.queue,
|
|
225
|
+
retryCount: record.retryCount,
|
|
226
|
+
requeueCount: record.requeueCount,
|
|
227
|
+
availableAt: record.availableAt,
|
|
228
|
+
evidence: [`Task is delayed until ${record.availableAt} on queue "${record.queue}"`]
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
function addUnadoptedTerminalDiagnostic(record, input, currentTime, addItem) {
|
|
232
|
+
if (record.adopted || record.terminalAt > currentTime - input.unadoptedAfterMs)
|
|
233
|
+
return;
|
|
234
|
+
addItem({
|
|
235
|
+
kind: "unadopted-terminal",
|
|
236
|
+
state: "resolved",
|
|
237
|
+
operationId: record.operationId,
|
|
238
|
+
workflowId: record.workflowId,
|
|
239
|
+
queue: record.queue,
|
|
240
|
+
terminalAt: record.terminalAt,
|
|
241
|
+
adopted: !1,
|
|
242
|
+
evidence: [`Terminal task has remained unadopted for ${currentTime - record.terminalAt}ms`]
|
|
243
|
+
});
|
|
244
|
+
}
|
|
178
245
|
function addQueuedDiagnostics(record, input, currentTime, addItem) {
|
|
179
246
|
const queueLatencyMs = Math.max(0, currentTime - record.lastQueuedAt);
|
|
180
247
|
if (queueLatencyMs < input.staleQueuedAfterMs)
|
|
@@ -337,11 +404,26 @@ function incrementSummary(summary, kind) {
|
|
|
337
404
|
case "dead-lettered":
|
|
338
405
|
summary.deadLettered += 1;
|
|
339
406
|
return;
|
|
407
|
+
case "delayed":
|
|
408
|
+
summary.delayed += 1;
|
|
409
|
+
return;
|
|
410
|
+
case "unadopted-terminal":
|
|
411
|
+
summary.unadoptedTerminal += 1;
|
|
412
|
+
return;
|
|
340
413
|
}
|
|
341
414
|
}
|
|
342
415
|
function parseOptionalNumber(value) {
|
|
343
416
|
return value === null || value.length === 0 ? void 0 : Number(value);
|
|
344
417
|
}
|
|
418
|
+
function parseOptionalBoolean(value) {
|
|
419
|
+
if (value === null || value.length === 0)
|
|
420
|
+
return;
|
|
421
|
+
if (value === "true")
|
|
422
|
+
return !0;
|
|
423
|
+
if (value === "false")
|
|
424
|
+
return !1;
|
|
425
|
+
return value;
|
|
426
|
+
}
|
|
345
427
|
export const getTaskDiagnosticsRestBinding = {
|
|
346
428
|
method: "GET",
|
|
347
429
|
path: "/v1/tasks/diagnostics",
|
|
@@ -354,6 +436,8 @@ export const getTaskDiagnosticsRestBinding = {
|
|
|
354
436
|
staleQueuedAfterMs: { kind: "query", queryParam: "staleQueuedAfterMs" },
|
|
355
437
|
staleHeartbeatAfterMs: { kind: "query", queryParam: "staleHeartbeatAfterMs" },
|
|
356
438
|
retryStormMinimumAttempts: { kind: "query", queryParam: "retryStormMinimumAttempts" },
|
|
439
|
+
includeExpectedDelayed: { kind: "query", queryParam: "includeExpectedDelayed" },
|
|
440
|
+
unadoptedAfterMs: { kind: "query", queryParam: "unadoptedAfterMs" },
|
|
357
441
|
limit: { kind: "query", queryParam: "limit" }
|
|
358
442
|
},
|
|
359
443
|
extractInput: async (request) => {
|
|
@@ -365,6 +449,8 @@ export const getTaskDiagnosticsRestBinding = {
|
|
|
365
449
|
staleQueuedAfterMs: parseOptionalNumber(url.searchParams.get("staleQueuedAfterMs")),
|
|
366
450
|
staleHeartbeatAfterMs: parseOptionalNumber(url.searchParams.get("staleHeartbeatAfterMs")),
|
|
367
451
|
retryStormMinimumAttempts: parseOptionalNumber(url.searchParams.get("retryStormMinimumAttempts")),
|
|
452
|
+
includeExpectedDelayed: parseOptionalBoolean(url.searchParams.get("includeExpectedDelayed")),
|
|
453
|
+
unadoptedAfterMs: parseOptionalNumber(url.searchParams.get("unadoptedAfterMs")),
|
|
368
454
|
limit: parseOptionalNumber(url.searchParams.get("limit"))
|
|
369
455
|
};
|
|
370
456
|
},
|
package/dist/storage/auto.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var o=import.meta.require;function f(e){return{hasBun:typeof e.Bun<"u",hasIndexedDB:typeof e.indexedDB<"u",hasNode:e.process!==void 0&&typeof e.process.versions?.node==="string",hasWebExtensionStorage:e.browser?.storage!==void 0||e.chrome?.storage!==void 0}}async function g(e){let{createHash:n}=await import("crypto"),t=e.process?.cwd?.()??"weft-default";return n("sha256").update(t).digest("hex").slice(0,16)}async function u(e){let[{mkdirSync:n},{tmpdir:t},a]=await Promise.all([import("fs"),import("os"),import("path")]),i=e.process?.env?.WEFT_DEFAULT_STORAGE_PATH,c=i!==void 0&&i.length>0?i:a.join(t(),"weft-default",`${await g(e)}.db`);return n(a.dirname(c),{recursive:!0}),c}function d(e,n){if(n==="Bun")return typeof e.Bun;if(n==="browser.storage")return typeof(e.browser?.storage??e.chrome?.storage);return typeof e.process}function s(e,n){return import.meta.url.endsWith(".ts")?e:n}async function r(e){return await import(e)}function p(e){if(e.browser?.storage!==void 0)return e.browser;if(e.chrome?.storage!==void 0)return e.chrome;return{}}function y(e){let{indexedDB:n,IDBKeyRange:t}=e;if(n===void 0||t===void 0)throw Error("resolveDefaultStorage: IndexedDB resolution requires both indexedDB and IDBKeyRange.");return{indexedDB:n,IDBKeyRange:t}}function D(e){let n=typeof e.indexedDB,t=typeof e.IDBKeyRange;return`typeof indexedDB=${n}, typeof IDBKeyRange=${t}`}var w=s("./bun-sql.ts","./bun-sql.js"),B=s("./node-sqlite.ts","./node-sqlite.js"),x=s("./indexeddb.ts","./indexeddb.js"),b=s("./web-extension.ts","./web-extension.js");async function S(e=globalThis){let n=f(e);if(n.hasBun){let{BunSQLiteStorage:t}=await r(w);return new t(await u(e))}if(n.hasNode){let{NodeSQLiteStorage:t}=await r(B);return new t(await u(e))}if(n.hasWebExtensionStorage){let{WebExtensionStorage:t}=await r(b);return new t({},p(e))}if(n.hasIndexedDB){let{IndexedDBStorage:t}=await r(x);return new t("weft",y(e))}throw Error(`resolveDefaultStorage: requires Bun, Node, WebExtension storage, or IndexedDB. Detected: typeof Bun=${d(e,"Bun")}, typeof process=${d(e,"process")}, typeof browser.storage=${d(e,"browser.storage")}, ${D(e)}.`)}export{S as resolveDefaultStorage};
|
package/dist/storage/bun-sql.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var r=import.meta.require;function L(F,X,$){if(!F.capabilities()[X])throw Error(`Feature "${$}" requires storage capability "${X}", but this storage backend does not provide it.`)}function g(F){let X=F.capabilities(),$=[];if(X.persistence!=="local"&&X.persistence!=="remote")$.push(`persistence must be "local" or "remote" (got "${X.persistence}")`);if(X.readAfterWrite!=="linearizable")$.push(`readAfterWrite must be "linearizable" (got "${X.readAfterWrite}")`);if(X.scanConsistency!=="snapshot")$.push(`scanConsistency must be "snapshot" (got "${X.scanConsistency}")`);if(!X.atomicBatch)$.push("atomicBatch must be true");if(!X.conditionalBatch)$.push("conditionalBatch must be true");if($.length>0)throw Error(`Storage is not durable enough for recovery: ${$.join("; ")}.`)}var Z="default";async function C(F,X){return await F.get(X)!==null}async function*P(F,X,$){for await(let[j]of F.scan(X,$))yield j}async function H(F,X){let $=0;for await(let j of P(F,X))$++;return $}async function N(F,X){let $=[];for await(let j of P(F,X))$.push({type:"delete",key:j});if($.length===0)return 0;return await F.batch($),$.length}async function XF(F,X,$){let j=[];for await(let W of P(F,X,$))j.push({type:"delete",key:W});if(j.length===0)return 0;return await F.batch(j),j.length}function Y(F){return encodeURIComponent(F)}function u(F){return decodeURIComponent(F)}function f(F){try{return decodeURIComponent(F)}catch{return null}}var S={workflowOwnerEpoch:(F)=>`wf-owner-epoch:${Y(F)}`,workflowOwnerHolder:(F)=>`wf-owner-holder:${Y(F)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var I=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var _=1e4,zF=1e4;class E extends Error{code="StorageBatchOperationLimitExceededError";cap=_;count;target;constructor(F,X){super(`${F} count ${X} exceeds MAX_BATCH_OPERATIONS (${_}).`);this.name="StorageBatchOperationLimitExceededError",this.target=F,this.count=X}}function K(F,X){if(X>_)throw new E(F,X)}function WF(F){return F.length>0?F.slice(0,-1)+String.fromCharCode(F.charCodeAt(F.length-1)+1):"\xFF"}function LF(F,X={}){if(X.gt!==void 0&&F<=X.gt)return!1;if(X.gte!==void 0&&F<X.gte)return!1;if(X.lt!==void 0&&F>=X.lt)return!1;if(X.lte!==void 0&&F>X.lte)return!1;return!0}function ZF(F,X){if(F===null||X===null)return F===X;if(F.byteLength!==X.byteLength)return!1;for(let $=0;$<F.byteLength;$++)if(F[$]!==X[$])return!1;return!0}async function _F(F,X){if(F.has)return F.has(X);return C(F,X)}function GF(F,X,$){if(F.keys)return F.keys(X,$);return P(F,X,$)}async function MF(F,X){if(F.count)return F.count(X);return H(F,X)}async function DF(F,X){if(F.deletePrefix)return F.deletePrefix(X);return N(F,X)}async function CF(F,X){K("batch operations",X.length),await F.batch(X)}async function HF(F,X,$){if(K("conditionalBatch conditions",X.length),K("conditionalBatch operations",$.length),L(F,"conditionalBatch","storageConditionalBatch"),!F.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return F.conditionalBatch(X,$)}var J=(F)=>String(F).padStart(16,"0"),p="0",k="1",B=(F,X,$,j)=>`sig:${Y(F)}:${Y(X)}:${j}:${Y($)}`,NF={workflow:(F)=>`wf:${Y(F)}`,checkpoint:(F)=>`wf:${Y(F)}:ckpt`,checkpointHistory:(F,X)=>`wf:${Y(F)}:ckpt:${String(X).padStart(10,"0")}`,timelinePrefix:(F)=>`wf:${Y(F)}:timeline:`,timeline:(F,X)=>`wf:${Y(F)}:timeline:${String(X).padStart(10,"0")}`,schedule:(F)=>`schedule:${Y(F)}`,scheduleTick:(F,X)=>`schedule-due:${String(F).padStart(16,"0")}:${Y(X)}`,scheduleRun:(F)=>`schedule-run:${Y(F)}`,scheduleRunLink:(F)=>`schedule-run-link:${Y(F)}`,scheduleRunBySchedulePrefix:(F)=>`schedule-run-by-schedule:${Y(F)}:`,scheduleRunBySchedule:(F,X)=>`schedule-run-by-schedule:${Y(F)}:${Y(X)}`,operation:(F,X,$)=>`op:${F}:${J(X)}:${$}`,operationInflight:(F)=>`op:inflight:${F}`,operationQueued:(F)=>`op:queued:${F}`,operationResolved:(F)=>`op:resolved:${F}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(F,X,$)=>`audit:bulk:${J(F)}:${Y(X)}:${Y($)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(F,X)=>`op:resolved-by-time:${J(F)}:${Y(X)}`,asyncActivity:(F,X)=>`async-act:v1:${Y(F)}:${Y(X)}`,asyncActivityResolution:(F,X)=>`async-act:v1:${Y(F)}:${Y(X)}:resolution`,activityReconciliationPrefix:(F)=>`actrec:v1:${Y(F)}:`,activityReconciliation:(F,X,$)=>`actrec:v1:${Y(F)}:${Y(X)}:${$}`,eventPrefix:(F)=>`ev:${Y(F)}:`,event:(F,X)=>`ev:${Y(F)}:${String(X).padStart(10,"0")}`,eventHead:(F)=>`ev:${Y(F)}:head`,eventWatermark:(F)=>`ev:${Y(F)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(F)=>`fleet-event:${String(F).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(F)=>`fleet-event-by-workflow:${Y(F)}:`,fleetEventByWorkflow:(F,X)=>`fleet-event-by-workflow:${Y(F)}:${String(X).padStart(10,"0")}`,signal:(F,X,$)=>B(F,X,$,k),startSignal:(F,X,$)=>B(F,X,$,p),signalSequence:(F)=>`sigseq:v1:${Y(F)}`,signalAcceptedResponsePrefix:(F)=>`sigres:v1:${Y(F)}:`,signalAcceptedResponse:(F,X,$)=>`sigres:v1:${Y(F)}:${Y(X)}:${Y($)}`,deadline:(F,X)=>`wf-deadline:${J(F)}:${Y(X)}`,terminalCleanup:(F,X)=>`wf-cleanup:${J(F)}:${Y(X)}`,teardownTimer:(F,X)=>`wf-teardown:${J(F)}:${Y(X)}`,delayedStart:(F,X)=>`wf-delayed:${J(F)}:${Y(X)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(F,X)=>`wf-terminal:${J(F)}:${Y(X)}`,attribute:(F)=>`attr:${Y(F)}`,attributeIndex:(F,X,$)=>`idx:${F}:${X}:${Y($)}`,tagIndex:(F,X)=>`tag:${Y(F)}:${Y(X)}`,updatePrefix:(F)=>`upd:${Y(F)}:`,update:(F,X)=>`upd:${Y(F)}:${X}`,updateResponse:(F)=>`upr:${F}`,updateIdempotency:(F,X)=>`upk:${Y(F)}:${X}`,startIdempotency:(F)=>`start-idem:${Y(F)}`,startIdempotencySignalId:(F)=>`start-idem:${F}`,livenessPrefix:()=>"liveness:",liveness:(F)=>`liveness:${Y(F)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...S,budget:(F,X,$)=>`budget:${F}:${X}:${$}`,review:(F,X)=>`review:${Y(F)}:${X}`,workflowHeaders:(F)=>`wf-headers:${Y(F)}`,childCancellationPrefix:(F)=>`child-cancel:${Y(F)}:`,childCancellation:(F,X)=>`child-cancel:${Y(F)}:${Y(X)}`,childWorkflowByParentPrefix:(F,X)=>`child-by-parent:${Y(F)}:${X===void 0?"":`${Y(X)}:`}`,childWorkflowByParent:(F,X,$)=>`child-by-parent:${Y(F)}:${X===void 0?"":`${Y(X)}:`}${Y($)}`,terminalCleanupNeeded:(F)=>`wf-cleanup-needed:${Y(F)}`,workflowConcurrency:(F,X)=>`wf-concurrency:${Y(F)}:${Y(X)}`,workflowConcurrencyHolder:(F)=>`wf-concurrency-holder:${Y(F)}`,workflowHasServices:(F)=>`wf-has-services:${Y(F)}`,finalizerState:(F)=>`wf-finalizer-state:${Y(F)}`,teardownOwed:(F)=>`wf-teardown-needed:${Y(F)}`,teardownSucceeded:(F)=>`wf-teardown-succeeded:${Y(F)}`,teardownDeadLetter:(F)=>`wf-teardown-deadletter:${Y(F)}`,offload:(F,X)=>`offload:${Y(F)}:${X}`,archive:(F,X)=>`archive:${Y(F)}:${X}`,stateExecution:(F,X)=>`state:execution:${Y(F)}:${Y(X)}`,stateWorkflow:(F,X)=>`state:workflow-scope:${Z}:${Y(F)}:${Y(X)}`,streamChunkPrefix:(F,X)=>`blob:${Y(F)}:${X}:chunk:`,streamChunk:(F,X,$)=>`blob:${Y(F)}:${X}:chunk:${String($).padStart(10,"0")}`,streamTail:(F,X)=>`blob:${Y(F)}:${X}:tail`,streamMetadata:(F,X)=>`blob:${Y(F)}:${X}:meta`,budgetCharged:(F)=>`budget-charged:${F}`,toolEffect:(F,X,$)=>`tool-effect:${Y(F)}:${X}:${$}`,workflowVisibilityStatus:(F,X)=>`wf-idx-status:${Y(F)}:${Y(X)}`,workflowVisibilityType:(F,X)=>`wf-idx-type:${Y(F)}:${Y(X)}`,workflowVisibilityCreated:(F,X)=>`wf-idx-created:${J(F)}:${Y(X)}`,workflowVisibilityUpdated:(F,X)=>`wf-idx-updated:${J(F)}:${Y(X)}`,workflowVisibilityDeadline:(F,X)=>`wf-idx-deadline:${J(F)}:${Y(X)}`,workflowVisibilityManifest:(F)=>`wf-idx-manifest:${Y(F)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};var V;function w(){if(V&&"bun"in V)return V.bun;return globalThis.Bun}function v(){return typeof w()<"u"}function l(){if(V&&"process"in V)return V.process;return globalThis.process}function O(F){let $=l()?.getBuiltinModule;if(typeof $!=="function")return;return $(F)}function x(){let F=O("node:zlib");if(!F)throw Error("gzip/gunzip require Bun or Node 22.5+ (process.getBuiltinModule). "+"Not available in browser or edge runtimes \u2014 use CompressionStream directly.");return F}function A(F){if(v())return new Uint8Array(Bun.gzipSync(new Uint8Array(F)));return new Uint8Array(x().gzipSync(F))}function T(F){if(v())return new Uint8Array(Bun.gunzipSync(new Uint8Array(F)));return new Uint8Array(x().gunzipSync(F))}function R(){return O("node:zlib")}function b(){let F=R();if(!F)throw Error("Brotli compression requires Bun or Node 22.5+ with process.getBuiltinModule support. Use gzip compression for browser/edge runtimes.");return F}function n(F){return new Uint8Array(b().brotliCompressSync(F))}function s(F){return new Uint8Array(b().brotliDecompressSync(F))}var z=193,G=0,h=1,c=2,Q=2;function y(F){return d(F)}function d(F){switch(F){case"gzip":return{algorithm:"gzip",compress(X){return A(X)}};case"brotli":return{algorithm:"brotli",compress(X){return n(X)}};case"none":return{algorithm:"none",compress(X){return X}}}}async function M(F,X,$){if(F.length<$||X.algorithm==="none"){let U=new Uint8Array(F.length+Q);return U[0]=z,U[1]=G,U.set(F,Q),U}let j=await X.compress(F);if(j.length+Q>=F.length+Q){let U=new Uint8Array(F.length+Q);return U[0]=z,U[1]=G,U.set(F,Q),U}let W=X.algorithm==="gzip"?h:c,q=new Uint8Array(j.length+Q);return q[0]=z,q[1]=W,q.set(j,Q),q}async function D(F){if(F.length<Q)throw Error("Compression payload missing 2-byte header.");if(F[0]!==z)throw Error("Compression payload missing magic byte 0xC1.");let X=F[1],$=F.slice(Q);switch(X){case G:return $;case h:return T($);case c:return s($);default:throw Error(`Compression payload uses unsupported algorithm byte 0x${X.toString(16).padStart(2,"0")}.`)}}var a=4096,i="gzip";function m(F){return{threshold:F?.threshold??a,algorithm:F?.algorithm??i}}class t{#F;#X;#Y;constructor(F,X){this.#F=F;let $=m(X);if(this.#X=y($.algorithm),this.#Y=$.threshold,F.query){let j=F.query.bind(F);Object.defineProperty(this,"query",{value:j,enumerable:!0,configurable:!0})}}capabilities(){let F=this.#F.capabilities();return{persistence:F.persistence,readAfterWrite:F.readAfterWrite,scanConsistency:F.scanConsistency,atomicBatch:F.atomicBatch,conditionalBatch:!1,boundedRangeDelete:!1}}async get(F){let X=await this.#F.get(F);if(!X)return null;return D(X)}async put(F,X){let $=await M(X,this.#X,this.#Y);return this.#F.put(F,$)}async delete(F){return this.#F.delete(F)}async*scan(F,X){for await(let[$,j]of this.#F.scan(F,X))yield[$,await D(j)]}async batch(F){K("batch operations",F.length);let X=await Promise.all(F.map(async($)=>{if($.type==="put")return{type:"put",key:$.key,value:await M($.value,this.#X,this.#Y)};return $}));return this.#F.batch(X)}[Symbol.dispose](){this.#F[Symbol.dispose]()}}export{t as CompressedStorage};
|
|
2
|
+
var Q=import.meta.require;function f(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function D(e){let t=e.capabilities(),n=[];if(t.persistence!=="local"&&t.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)n.push("atomicBatch must be true");if(!t.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}var m="default";async function S(e,t){return await e.get(t)!==null}async function*l(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function x(e,t){let n=0;for await(let i of l(e,t))n++;return n}async function C(e,t){let n=[];for await(let i of l(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function re(e,t,n){let i=[];for await(let p of l(e,t,n))i.push({type:"delete",key:p});if(i.length===0)return 0;return await e.batch(i),i.length}function r(e){return encodeURIComponent(e)}function M(e){return decodeURIComponent(e)}function N(e){try{return decodeURIComponent(e)}catch{return null}}var A={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var K=["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:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var y=1e4,pe=1e4;class B extends Error{code="StorageBatchOperationLimitExceededError";cap=y;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${y}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function u(e,t){if(t>y)throw new B(e,t)}function fe(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function me(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function ye(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function he(e,t){if(e.has)return e.has(t);return S(e,t)}function be(e,t,n){if(e.keys)return e.keys(t,n);return l(e,t,n)}async function we(e,t){if(e.count)return e.count(t);return x(e,t)}async function Se(e,t){if(e.deletePrefix)return e.deletePrefix(t);return C(e,t)}async function $e(e,t){u("batch operations",t.length),await e.batch(t)}async function xe(e,t,n){if(u("conditionalBatch conditions",t.length),u("conditionalBatch operations",n.length),f(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var o=(e)=>String(e).padStart(16,"0"),H="0",V="1",v=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ce={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${o(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${o(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${o(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>v(e,t,n,V),startSignal:(e,t,n)=>v(e,t,n,H),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${o(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${o(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${o(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${o(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${o(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...A,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${m}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${o(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${o(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${o(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};var c;function q(){if(c&&"bun"in c)return c.bun;return globalThis.Bun}function P(){return typeof q()<"u"}function W(){if(c&&"process"in c)return c.process;return globalThis.process}function O(e){let n=W()?.getBuiltinModule;if(typeof n!=="function")return;return n(e)}function k(){let e=O("node:zlib");if(!e)throw Error("gzip/gunzip require Bun or Node 22.5+ (process.getBuiltinModule). "+"Not available in browser or edge runtimes \u2014 use CompressionStream directly.");return e}function E(e){if(P())return new Uint8Array(Bun.gzipSync(new Uint8Array(e)));return new Uint8Array(k().gzipSync(e))}function R(e){if(P())return new Uint8Array(Bun.gunzipSync(new Uint8Array(e)));return new Uint8Array(k().gunzipSync(e))}function T(){return O("node:zlib")}function U(){let e=T();if(!e)throw Error("Brotli compression requires Bun or Node 22.5+ with process.getBuiltinModule support. Use gzip compression for browser/edge runtimes.");return e}function F(e){return new Uint8Array(U().brotliCompressSync(e))}function G(e){return new Uint8Array(U().brotliDecompressSync(e))}var g=193,h=0,_=1,I=2,s=2;function z(e){return Y(e)}function Y(e){switch(e){case"gzip":return{algorithm:"gzip",compress(t){return E(t)}};case"brotli":return{algorithm:"brotli",compress(t){return F(t)}};case"none":return{algorithm:"none",compress(t){return t}}}}async function b(e,t,n){if(e.length<n||t.algorithm==="none"){let a=new Uint8Array(e.length+s);return a[0]=g,a[1]=h,a.set(e,s),a}let i=await t.compress(e);if(i.length+s>=e.length+s){let a=new Uint8Array(e.length+s);return a[0]=g,a[1]=h,a.set(e,s),a}let p=t.algorithm==="gzip"?_:I,d=new Uint8Array(i.length+s);return d[0]=g,d[1]=p,d.set(i,s),d}async function w(e){if(e.length<s)throw Error("Compression payload missing 2-byte header.");if(e[0]!==g)throw Error("Compression payload missing magic byte 0xC1.");let t=e[1],n=e.slice(s);switch(t){case h:return n;case _:return R(n);case I:return G(n);default:throw Error(`Compression payload uses unsupported algorithm byte 0x${t.toString(16).padStart(2,"0")}.`)}}var Z=4096,X="gzip";function L(e){return{threshold:e?.threshold??Z,algorithm:e?.algorithm??X}}class j{#e;#t;#r;constructor(e,t){this.#e=e;let n=L(t);if(this.#t=z(n.algorithm),this.#r=n.threshold,e.query){let i=e.query.bind(e);Object.defineProperty(this,"query",{value:i,enumerable:!0,configurable:!0})}}capabilities(){let e=this.#e.capabilities();return{persistence:e.persistence,readAfterWrite:e.readAfterWrite,scanConsistency:e.scanConsistency,atomicBatch:e.atomicBatch,conditionalBatch:!1,boundedRangeDelete:!1}}async get(e){let t=await this.#e.get(e);if(!t)return null;return w(t)}async put(e,t){let n=await b(t,this.#t,this.#r);return this.#e.put(e,n)}async delete(e){return this.#e.delete(e)}async*scan(e,t){for await(let[n,i]of this.#e.scan(e,t))yield[n,await w(i)]}async batch(e){u("batch operations",e.length);let t=await Promise.all(e.map(async(n)=>{if(n.type==="put")return{type:"put",key:n.key,value:await b(n.value,this.#t,this.#r)};return n}));return this.#e.batch(t)}[Symbol.dispose](){this.#e[Symbol.dispose]()}}export{j as CompressedStorage};
|