@orkestrel/workflow 0.0.18 → 0.0.19
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/dist/src/core/index.cjs +15 -19
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.js +15 -19
- package/dist/src/core/index.js.map +1 -1
- package/package.json +13 -13
package/dist/src/core/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { arrayShape, attempt, cloneJSONRecord, cloneJSONValue, compileGuard, createContract, integerShape, isArray, isBoolean, isContractError, isError, isFiniteNumber, isFunction, isInstance, isInteger, isJSONValue, isNonEmptyString, isObject, isRecord, isString, literalShape, objectShape, optionalShape, rawShape, stringShape } from "@orkestrel/contract";
|
|
1
2
|
import { createAbort, isAbortSignal, linkSignal } from "@orkestrel/abort";
|
|
2
|
-
import { arrayShape, attempt, cloneJSONRecord, cloneJSONValue, compileGuard, createContract, integerShape, isArray, isBoolean, isContractError, isFiniteNumber, isFunction, isInteger, isJSONValue, isNonEmptyString, isObject, isRecord, literalShape, objectShape, optionalShape, rawShape, stringShape } from "@orkestrel/contract";
|
|
3
3
|
import { createDatabase, createMemoryDriver } from "@orkestrel/database";
|
|
4
4
|
import { Emitter } from "@orkestrel/emitter";
|
|
5
5
|
import { createTimeout } from "@orkestrel/timeout";
|
|
@@ -44,11 +44,7 @@ var WorkflowError = class extends Error {
|
|
|
44
44
|
* ```
|
|
45
45
|
*/
|
|
46
46
|
function isWorkflowError(value) {
|
|
47
|
-
|
|
48
|
-
return value instanceof WorkflowError;
|
|
49
|
-
} catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
47
|
+
return isInstance(value, WorkflowError);
|
|
52
48
|
}
|
|
53
49
|
//#endregion
|
|
54
50
|
//#region src/core/constants.ts
|
|
@@ -277,14 +273,14 @@ function isWorkflowInterface(value) {
|
|
|
277
273
|
*/
|
|
278
274
|
function isOwnedWorkflowSnapshot(value) {
|
|
279
275
|
try {
|
|
280
|
-
if (!isRecord(value) || !Object.keys(value).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "phases" || key === "created" || key === "updated") || !isNonEmptyString(value.id) || !isNonEmptyString(value.name) || value.description !== void 0 &&
|
|
276
|
+
if (!isRecord(value) || !Object.keys(value).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "phases" || key === "created" || key === "updated") || !isNonEmptyString(value.id) || !isNonEmptyString(value.name) || value.description !== void 0 && !isString(value.description) || !isLifecycleStatus(value.status) || value.override !== void 0 && value.override !== "completed" && value.override !== "skipped" && value.override !== "stopped" || !isBoolean(value.bail) || !isArray(value.phases) || !isFiniteNumber(value.created) || value.created < 0 || !isFiniteNumber(value.updated) || value.updated < value.created) return false;
|
|
281
277
|
const phaseIds = /* @__PURE__ */ new Set();
|
|
282
278
|
const derivations = [];
|
|
283
279
|
let frontier = false;
|
|
284
280
|
let running = false;
|
|
285
281
|
let vacuous = true;
|
|
286
282
|
for (const phase of value.phases) {
|
|
287
|
-
if (!isRecord(phase) || !Object.keys(phase).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "concurrency" || key === "tasks") || !isNonEmptyString(phase.id) || phaseIds.has(phase.id) || !isNonEmptyString(phase.name) || phase.description !== void 0 &&
|
|
283
|
+
if (!isRecord(phase) || !Object.keys(phase).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "concurrency" || key === "tasks") || !isNonEmptyString(phase.id) || phaseIds.has(phase.id) || !isNonEmptyString(phase.name) || phase.description !== void 0 && !isString(phase.description) || !isLifecycleStatus(phase.status) || phase.override !== void 0 && phase.override !== "skipped" && phase.override !== "stopped" || !isBoolean(phase.bail) || phase.concurrency !== void 0 && (!isInteger(phase.concurrency) || phase.concurrency < 1) || !isArray(phase.tasks)) return false;
|
|
288
284
|
const forced = phase.override === "skipped" || phase.override === "stopped";
|
|
289
285
|
const started = phase.status === "running" || phase.status === "completed" || phase.status === "failed";
|
|
290
286
|
if (!forced && frontier && started || phase.status === "running" && running) return false;
|
|
@@ -295,7 +291,7 @@ function isOwnedWorkflowSnapshot(value) {
|
|
|
295
291
|
const statuses = [];
|
|
296
292
|
if (phase.tasks.length > 0) vacuous = false;
|
|
297
293
|
for (const task of phase.tasks) {
|
|
298
|
-
if (!isRecord(task) || !Object.keys(task).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "result" || key === "metadata" || key === "attempts" || key === "behavior" || key === "retries" || key === "timeout" || key === "activity") || !isNonEmptyString(task.id) || taskIds.has(task.id) || !isNonEmptyString(task.name) || task.description !== void 0 &&
|
|
294
|
+
if (!isRecord(task) || !Object.keys(task).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "result" || key === "metadata" || key === "attempts" || key === "behavior" || key === "retries" || key === "timeout" || key === "activity") || !isNonEmptyString(task.id) || taskIds.has(task.id) || !isNonEmptyString(task.name) || task.description !== void 0 && !isString(task.description) || !isLifecycleStatus(task.status) || !isRecord(task.metadata) || !isJSONValue(task.metadata) || !isInteger(task.attempts) || task.attempts < 0 || task.behavior !== void 0 && !isNonEmptyString(task.behavior) || task.retries !== void 0 && (!isInteger(task.retries) || task.retries < 0) || task.timeout !== void 0 && (!isInteger(task.timeout) || task.timeout < 0 || task.timeout > 2147483647)) return false;
|
|
299
295
|
const budget = (task.retries ?? 0) + 1;
|
|
300
296
|
if (task.attempts > budget || task.status === "pending" && task.attempts >= budget) return false;
|
|
301
297
|
if (!(task.activity === void 0 || isTaskActivity(task.activity))) return false;
|
|
@@ -771,8 +767,8 @@ function canTransitionTask(from, to) {
|
|
|
771
767
|
* @returns A host-safe effective window (`1..MAX_TIMER_MS`), or `undefined`
|
|
772
768
|
*/
|
|
773
769
|
function resolveTaskSilence(value, fallback) {
|
|
774
|
-
if (value !== void 0) return
|
|
775
|
-
return fallback !== void 0 &&
|
|
770
|
+
if (value !== void 0) return isFiniteNumber(value) && value > 0 && value <= 2147483647 ? value : void 0;
|
|
771
|
+
return fallback !== void 0 && isFiniteNumber(fallback) && fallback > 0 && fallback <= 2147483647 ? fallback : void 0;
|
|
776
772
|
}
|
|
777
773
|
/**
|
|
778
774
|
* Boxes a value as a {@link Success} — the graceful outcome half of a {@link Result}.
|
|
@@ -818,8 +814,8 @@ function failure(error) {
|
|
|
818
814
|
*/
|
|
819
815
|
function errorToMessage(error) {
|
|
820
816
|
try {
|
|
821
|
-
const message = error
|
|
822
|
-
return
|
|
817
|
+
const message = isError(error) ? error.message : String(error);
|
|
818
|
+
return isString(message) && message.length > 0 ? message : "unknown failure";
|
|
823
819
|
} catch {
|
|
824
820
|
return "unknown failure";
|
|
825
821
|
}
|
|
@@ -1089,7 +1085,7 @@ function recoverWorkflowSnapshot(snapshot) {
|
|
|
1089
1085
|
* ```
|
|
1090
1086
|
*/
|
|
1091
1087
|
function matchesDescription(left, right) {
|
|
1092
|
-
return left === right && (left === void 0 ||
|
|
1088
|
+
return left === right && (left === void 0 || isString(left));
|
|
1093
1089
|
}
|
|
1094
1090
|
/**
|
|
1095
1091
|
* Tests a result's lineage against its containing snapshot nodes.
|
|
@@ -2087,7 +2083,7 @@ var Task = class {
|
|
|
2087
2083
|
}
|
|
2088
2084
|
fail(error) {
|
|
2089
2085
|
const origin = error.origin === "handler" || error.origin === "timeout" || error.origin === "recovery" ? error.origin : "handler";
|
|
2090
|
-
const message =
|
|
2086
|
+
const message = isString(error.message) && error.message.length > 0 ? error.message : "unknown failure";
|
|
2091
2087
|
this.#transition("failed");
|
|
2092
2088
|
this.#finish();
|
|
2093
2089
|
const result = this.#record("failed", Object.freeze({
|
|
@@ -2126,7 +2122,7 @@ var Task = class {
|
|
|
2126
2122
|
this.#emitter.emit("report", activity);
|
|
2127
2123
|
return success(activity);
|
|
2128
2124
|
} catch (error) {
|
|
2129
|
-
return failure(error
|
|
2125
|
+
return failure(isWorkflowError(error) ? error : new WorkflowError("MUTATION", "task activity report was refused", { task: this.id }));
|
|
2130
2126
|
}
|
|
2131
2127
|
}
|
|
2132
2128
|
pulse() {
|
|
@@ -4024,7 +4020,7 @@ var WorkflowRunner = class WorkflowRunner {
|
|
|
4024
4020
|
let runSignal;
|
|
4025
4021
|
let onCancel;
|
|
4026
4022
|
try {
|
|
4027
|
-
timeout = ms !== void 0 &&
|
|
4023
|
+
timeout = ms !== void 0 && isFiniteNumber(ms) && ms > 0 && ms <= 2147483647 ? createTimeout({ ms }) : void 0;
|
|
4028
4024
|
timeout?.start();
|
|
4029
4025
|
budget?.start();
|
|
4030
4026
|
runSignal = this.#fold(workflow, signal, budget, timeout);
|
|
@@ -4157,7 +4153,7 @@ var WorkflowRunner = class WorkflowRunner {
|
|
|
4157
4153
|
return;
|
|
4158
4154
|
}
|
|
4159
4155
|
const ms = task.timeout;
|
|
4160
|
-
const deadline = ms !== void 0 &&
|
|
4156
|
+
const deadline = ms !== void 0 && isFiniteNumber(ms) && ms > 0 && ms <= 2147483647 ? createTimeout({ ms }) : void 0;
|
|
4161
4157
|
const signal = this.#taskSignal(task, controller.signal, runSignal, deadline);
|
|
4162
4158
|
try {
|
|
4163
4159
|
task.start();
|
|
@@ -4311,7 +4307,7 @@ var WorkflowRunner = class WorkflowRunner {
|
|
|
4311
4307
|
try {
|
|
4312
4308
|
if (workflow !== void 0 && isHalted(workflow, phase)) deferred.resolve(void 0);
|
|
4313
4309
|
const outcome = await Promise.race([wait, deferred.promise]);
|
|
4314
|
-
return
|
|
4310
|
+
return isBoolean(outcome) ? outcome : void 0;
|
|
4315
4311
|
} finally {
|
|
4316
4312
|
signal.removeEventListener("abort", onAbort);
|
|
4317
4313
|
workflow?.emitter.off("skip", onTerminal);
|