@lostgradient/weft 0.18.0 → 0.20.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 +3 -1
- package/dist/cli/conformance.js +14 -18
- package/dist/cli/generated/operation-catalog.snapshot.json +1597 -21
- package/dist/cli/generated/operation-client.generated.d.ts +37 -6
- package/dist/cli/generated/operation-client.generated.js +6 -0
- package/dist/core/context/child-workflow-pipe.d.ts +1 -1
- package/dist/core/context/child-workflow-pipe.js +1 -1
- package/dist/core/engine/construction.d.ts +2 -0
- package/dist/core/engine/construction.js +3 -0
- package/dist/core/engine/index.js +1 -0
- package/dist/core/engine/listing.d.ts +1 -0
- package/dist/core/engine/listing.js +6 -4
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +2 -1
- package/dist/core/worker-execution-dispatcher.d.ts +8 -0
- package/dist/core/worker-execution-dispatcher.js +4 -0
- package/dist/core/worker-execution-strategy-options.d.ts +16 -0
- package/dist/core/worker-execution-strategy.js +71 -89
- package/dist/core/worker-fault-handling.d.ts +45 -0
- package/dist/core/worker-fault-handling.js +88 -0
- package/dist/core/worker-protocol.d.ts +18 -1
- package/dist/core/worker-protocol.js +1 -1
- package/dist/core/worker-realm-readiness.d.ts +78 -0
- package/dist/core/worker-realm-readiness.js +127 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +28 -1
- package/dist/json-schema.js +1 -1
- package/dist/runtime/portable.d.ts +14 -0
- package/dist/runtime/portable.js +10 -0
- package/dist/server/index.d.ts +71 -8
- package/dist/server/index.js +7 -3
- package/dist/server/operations/get-task-detail-schema.d.ts +341 -0
- package/dist/server/operations/get-task-detail-schema.js +118 -0
- package/dist/server/operations/get-task-detail.d.ts +346 -0
- package/dist/server/operations/get-task-detail.js +215 -0
- package/dist/server/operations/get-task-diagnostics.d.ts +43 -18
- package/dist/server/operations/get-task-diagnostics.js +87 -126
- package/dist/server/operations/get-worker-diagnostics.d.ts +177 -0
- package/dist/server/operations/get-worker-diagnostics.js +117 -0
- package/dist/server/operations/list-worker-registration-rejections.d.ts +79 -0
- package/dist/server/operations/list-worker-registration-rejections.js +60 -0
- package/dist/server/operations/list-workers.js +1 -3
- package/dist/server/operations/static-registrations.js +8 -20
- package/dist/server/rest-bindings.js +31 -2
- package/dist/server/runtime/authentication-bridge.js +6 -14
- package/dist/server/runtime/context.d.ts +23 -0
- package/dist/server/runtime/task-dispatch.d.ts +7 -1
- package/dist/server/runtime/task-dispatch.js +126 -55
- package/dist/server/runtime/task-ledger-completion.d.ts +68 -0
- package/dist/server/runtime/task-ledger-completion.js +72 -0
- package/dist/server/runtime/task-ledger-recovery.d.ts +55 -0
- package/dist/server/runtime/task-ledger-recovery.js +73 -0
- package/dist/server/runtime/task-ledger-runtime.d.ts +64 -0
- package/dist/server/runtime/task-ledger-runtime.js +34 -0
- package/dist/server/runtime/task-metrics.d.ts +6 -4
- package/dist/server/runtime/task-polling.d.ts +14 -12
- package/dist/server/runtime/task-polling.js +106 -82
- package/dist/server/runtime/task-reconciliation.d.ts +35 -8
- package/dist/server/runtime/task-reconciliation.js +75 -74
- package/dist/server/runtime/task-result-resolution.d.ts +2 -10
- package/dist/server/runtime/task-result-resolution.js +0 -67
- package/dist/server/runtime/task-result-view.d.ts +82 -0
- package/dist/server/runtime/task-result-view.js +48 -0
- package/dist/server/runtime/websocket-worker-messaging.d.ts +16 -0
- package/dist/server/runtime/websocket-worker-messaging.js +32 -0
- package/dist/server/runtime/websocket-worker-registration.d.ts +41 -0
- package/dist/server/runtime/websocket-worker-registration.js +134 -0
- package/dist/server/runtime/websocket-worker.d.ts +0 -1
- package/dist/server/runtime/websocket-worker.js +64 -116
- package/dist/server/serve-internals.d.ts +9 -6
- package/dist/server/serve-internals.js +14 -40
- package/dist/server/task-ledger-codec.d.ts +40 -0
- package/dist/server/task-ledger-codec.js +195 -0
- package/dist/server/task-ledger-keys.d.ts +13 -0
- package/dist/server/task-ledger-keys.js +5 -0
- package/dist/server/task-ledger-limits.d.ts +34 -0
- package/dist/server/task-ledger-limits.js +5 -0
- package/dist/server/task-ledger-transition-helpers.d.ts +38 -0
- package/dist/server/task-ledger-transition-helpers.js +42 -0
- package/dist/server/task-ledger-transitions-cancellation.d.ts +31 -0
- package/dist/server/task-ledger-transitions-cancellation.js +73 -0
- package/dist/server/task-ledger-transitions.d.ts +129 -0
- package/dist/server/task-ledger-transitions.js +162 -0
- package/dist/server/task-ledger-types.d.ts +220 -0
- package/dist/server/task-ledger-types.js +1 -0
- package/dist/server/task-ledger.d.ts +17 -0
- package/dist/server/task-ledger.js +24 -0
- package/dist/server/task-state.d.ts +25 -152
- package/dist/server/task-state.js +0 -188
- package/dist/server/worker-admission-policy.d.ts +70 -0
- package/dist/server/worker-admission-policy.js +0 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/index.d.ts +0 -2
- package/dist/storage/interface.d.ts +0 -2
- 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 +1 -1
- package/dist/storage/postgres.js +1 -1
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +1 -1
- package/dist/storage/web-extension.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/index.d.ts +2 -0
- package/dist/worker/index.js +30 -4
- package/dist/worker/manifest/canonical-json.d.ts +20 -0
- package/dist/worker/manifest/canonical-json.js +13 -0
- package/dist/worker/manifest/capabilities.d.ts +24 -0
- package/dist/worker/manifest/capabilities.js +74 -0
- package/dist/worker/manifest/content-digest.d.ts +20 -0
- package/dist/worker/manifest/content-digest.js +13 -0
- package/dist/worker/manifest/declared-shape-digest.d.ts +14 -0
- package/dist/worker/manifest/declared-shape-digest.js +4 -0
- package/dist/worker/manifest/digest.d.ts +82 -0
- package/dist/worker/manifest/digest.js +9 -0
- package/dist/worker/manifest/execution-identity.d.ts +92 -0
- package/dist/worker/manifest/execution-identity.js +36 -0
- package/dist/worker/manifest/failure.d.ts +59 -0
- package/dist/worker/manifest/failure.js +4 -0
- package/dist/worker/manifest/index.d.ts +22 -0
- package/dist/worker/manifest/index.js +23 -0
- package/dist/worker/manifest/internal-realm.d.ts +50 -0
- package/dist/worker/manifest/internal-realm.js +39 -0
- package/dist/worker/manifest/is-record.d.ts +12 -0
- package/dist/worker/manifest/is-record.js +6 -0
- package/dist/worker/manifest/json-scan.d.ts +26 -0
- package/dist/worker/manifest/json-scan.js +88 -0
- package/dist/worker/manifest/limits.d.ts +138 -0
- package/dist/worker/manifest/limits.js +1 -0
- package/dist/worker/manifest/normalize.d.ts +63 -0
- package/dist/worker/manifest/normalize.js +73 -0
- package/dist/worker/manifest/parse-json.d.ts +24 -0
- package/dist/worker/manifest/parse-json.js +15 -0
- package/dist/worker/manifest/parse.d.ts +86 -0
- package/dist/worker/manifest/parse.js +188 -0
- package/dist/worker/manifest/registry-contract-builder.d.ts +120 -0
- package/dist/worker/manifest/registry-contract-builder.js +65 -0
- package/dist/worker/manifest/types.d.ts +263 -0
- package/dist/worker/manifest/types.js +1 -0
- package/dist/worker/manifest/utf8.d.ts +13 -0
- package/dist/worker/manifest/utf8.js +7 -0
- package/dist/worker/options.d.ts +55 -8
- package/dist/worker/options.js +65 -9
- package/dist/worker/protocol-internals.d.ts +1 -2
- package/dist/worker/protocol-internals.js +0 -5
- package/dist/worker/protocol-messages.d.ts +33 -17
- package/dist/worker/protocol-schemas.d.ts +36 -74
- package/dist/worker/protocol-schemas.js +25 -18
- package/dist/worker/protocol-version.d.ts +18 -14
- package/dist/worker/protocol-version.js +1 -1
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/deployment-consistency.d.ts +78 -0
- package/dist/worker/registry/deployment-consistency.js +27 -0
- package/dist/worker/registry/drain.d.ts +14 -0
- package/dist/worker/registry/drain.js +24 -0
- package/dist/worker/registry/rejections.d.ts +31 -0
- package/dist/worker/registry/rejections.js +10 -0
- package/dist/worker/registry/summary.d.ts +0 -3
- package/dist/worker/registry/summary.js +2 -5
- package/dist/worker/registry/types.d.ts +10 -3
- package/dist/worker/registry.d.ts +47 -2
- package/dist/worker/registry.js +45 -32
- package/dist/workers/workflow-worker-entry.d.ts +12 -7
- package/dist/workers/workflow-worker-entry.js +9 -2
- package/package.json +3 -3
- package/dist/server/task-resolved-record.d.ts +0 -12
- package/dist/server/task-resolved-record.js +0 -35
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Weft
|
|
2
2
|
|
|
3
|
-
A Bun-native durable execution engine. Current release: `0.
|
|
3
|
+
A Bun-native durable execution engine. Current release: `0.19.0`.
|
|
4
4
|
|
|
5
5
|
Install the library from npm as `@lostgradient/weft`:
|
|
6
6
|
|
|
@@ -378,6 +378,8 @@ import { RemoteWorker } from '@lostgradient/weft';
|
|
|
378
378
|
|
|
379
379
|
const worker = new RemoteWorker({
|
|
380
380
|
serverUrl: 'wss://weft.internal:7233',
|
|
381
|
+
deploymentName: 'orders',
|
|
382
|
+
buildId: '2026.08.19-1',
|
|
381
383
|
workflows: {
|
|
382
384
|
orderFulfillment: {
|
|
383
385
|
name: 'orderFulfillment',
|
package/dist/cli/conformance.js
CHANGED
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import { decode } from "../core/codec.js";
|
|
2
2
|
import { Engine } from "../core/engine.js";
|
|
3
3
|
import { serve } from "../server/index.js";
|
|
4
|
-
import {
|
|
4
|
+
import { isRemoteTaskTerminalResolved, taskLedgerKey } from "../server/task-ledger.js";
|
|
5
5
|
import { MemoryStorage } from "../storage/memory.js";
|
|
6
6
|
import {
|
|
7
7
|
REMOTE_WORKER_PROTOCOL_VERSION,
|
|
8
8
|
REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS
|
|
9
9
|
} from "../worker/protocol.js";
|
|
10
10
|
const CONFORMANCE_QUEUE = "conformance", CONFORMANCE_ACTIVITIES = [
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
11
|
+
"conformance.echo",
|
|
12
|
+
"conformance.sleep",
|
|
13
|
+
"conformance.cancel"
|
|
14
14
|
], CONFORMANCE_HEARTBEAT_INTERVAL_MS = 25;
|
|
15
15
|
function createCheck(name, ok, message) {
|
|
16
16
|
return { name, ok, message };
|
|
17
17
|
}
|
|
18
|
-
function isRecord(value) {
|
|
19
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
20
|
-
}
|
|
21
18
|
async function waitForCondition(predicate, timeoutMs, label) {
|
|
22
19
|
const deadline = Date.now() + timeoutMs;
|
|
23
20
|
let lastError;
|
|
@@ -110,17 +107,12 @@ async function waitForWorkerIdle(server, workerId, timeoutMs) {
|
|
|
110
107
|
}
|
|
111
108
|
throw Error(`Timed out after ${timeoutMs}ms waiting for worker ${workerId} to become idle`);
|
|
112
109
|
}
|
|
113
|
-
function isResolvedRecord(value) {
|
|
114
|
-
if (!isRecord(value))
|
|
115
|
-
return !1;
|
|
116
|
-
return typeof value.operationId === "string" && (value.status === "completed" || value.status === "failed") && typeof value.resolvedAt === "number";
|
|
117
|
-
}
|
|
118
110
|
async function readResolvedStatus(storage, operationId) {
|
|
119
|
-
const stored = await storage.get(
|
|
111
|
+
const stored = await storage.get(taskLedgerKey(operationId));
|
|
120
112
|
if (stored === null)
|
|
121
113
|
return;
|
|
122
114
|
const decoded = decode(stored);
|
|
123
|
-
if (!
|
|
115
|
+
if (!isRemoteTaskTerminalResolved(decoded))
|
|
124
116
|
return;
|
|
125
117
|
return decoded.status;
|
|
126
118
|
}
|
|
@@ -131,6 +123,7 @@ async function dispatchAndWait(server, storage, operationId, activityName, input
|
|
|
131
123
|
if (!await server.dispatchTask({
|
|
132
124
|
operationId,
|
|
133
125
|
activityName,
|
|
126
|
+
workflowType: "conformance",
|
|
134
127
|
input,
|
|
135
128
|
queue: CONFORMANCE_QUEUE,
|
|
136
129
|
visibilityTimeout: Math.max(500, timeoutMs)
|
|
@@ -151,15 +144,16 @@ async function runConformanceChecks(command, timeoutMs) {
|
|
|
151
144
|
worker = startWorker(command, server);
|
|
152
145
|
const workerId = await waitForRegisteredWorker(server, timeoutMs), registered = server.registry.getWorker(workerId);
|
|
153
146
|
checks.push(createCheck("register", registered?.queue === CONFORMANCE_QUEUE && CONFORMANCE_ACTIVITIES.every((activity) => registered.activities.includes(activity)), `registered worker ${workerId}`));
|
|
154
|
-
await dispatchAndWait(server, storage, "conformance-echo", "
|
|
147
|
+
await dispatchAndWait(server, storage, "conformance-echo", "conformance.echo", { ok: !0 }, "completed", timeoutMs);
|
|
155
148
|
checks.push(createCheck("task completion", !0, "echo task resolved"));
|
|
156
149
|
await waitForWorkerHeartbeat(server, workerId, timeoutMs);
|
|
157
|
-
await dispatchAndWait(server, storage, "conformance-heartbeat", "
|
|
150
|
+
await dispatchAndWait(server, storage, "conformance-heartbeat", "conformance.sleep", { milliseconds: CONFORMANCE_HEARTBEAT_INTERVAL_MS * 3 }, "completed", timeoutMs);
|
|
158
151
|
checks.push(createCheck("heartbeat", !0, "heartbeat observed while worker was connected"));
|
|
159
152
|
const cancelOperationId = "conformance-cancel";
|
|
160
153
|
if (!await server.dispatchTask({
|
|
161
154
|
operationId: cancelOperationId,
|
|
162
|
-
activityName: "
|
|
155
|
+
activityName: "conformance.cancel",
|
|
156
|
+
workflowType: "conformance",
|
|
163
157
|
input: { milliseconds: timeoutMs },
|
|
164
158
|
queue: CONFORMANCE_QUEUE,
|
|
165
159
|
visibilityTimeout: Math.max(500, timeoutMs)
|
|
@@ -173,7 +167,8 @@ async function runConformanceChecks(command, timeoutMs) {
|
|
|
173
167
|
const reconnectOperationId = "conformance-reconnect", reconnectDelayMs = Math.min(1500, Math.max(250, Math.floor(timeoutMs * 0.75)));
|
|
174
168
|
if (!await server.dispatchTask({
|
|
175
169
|
operationId: reconnectOperationId,
|
|
176
|
-
activityName: "
|
|
170
|
+
activityName: "conformance.sleep",
|
|
171
|
+
workflowType: "conformance",
|
|
177
172
|
input: { milliseconds: reconnectDelayMs },
|
|
178
173
|
queue: CONFORMANCE_QUEUE,
|
|
179
174
|
visibilityTimeout: Math.max(500, timeoutMs)
|
|
@@ -185,6 +180,7 @@ async function runConformanceChecks(command, timeoutMs) {
|
|
|
185
180
|
await stopWorker(worker);
|
|
186
181
|
worker = replacementWorker;
|
|
187
182
|
await waitForCondition(() => server.registry.getWorker(workerId) === void 0, timeoutMs, "original worker disconnect");
|
|
183
|
+
await waitForCondition(() => (server.registry.getWorker(replacementWorkerId)?.inFlight ?? 0) > 0 || server.registry.getWorker(replacementWorkerId) === void 0, timeoutMs, "reassigned reconnect task delivered to replacement worker");
|
|
188
184
|
await waitForWorkerIdle(server, replacementWorkerId, timeoutMs);
|
|
189
185
|
await waitForResolvedStatus(storage, reconnectOperationId, "completed", timeoutMs);
|
|
190
186
|
checks.push(createCheck("reconnect", !0, "in-flight task completed after reconnect"));
|