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