@orkestrel/workflow 0.0.18 → 0.0.20

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.
@@ -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
- try {
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 && typeof value.description !== "string" || !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;
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 && typeof phase.description !== "string" || !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;
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 && typeof task.description !== "string" || !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;
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 Number.isFinite(value) && value > 0 && value <= 2147483647 ? value : void 0;
776
- return fallback !== void 0 && Number.isFinite(fallback) && fallback > 0 && fallback <= 2147483647 ? 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 instanceof Error ? error.message : String(error);
823
- return typeof message === "string" && message.length > 0 ? message : "unknown failure";
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 || typeof left === "string");
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 = typeof error.message === "string" && error.message.length > 0 ? error.message : "unknown failure";
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 instanceof WorkflowError ? error : new WorkflowError("MUTATION", "task activity report was refused", { task: this.id }));
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 && Number.isFinite(ms) && ms > 0 && ms <= 2147483647 ? (0, _orkestrel_timeout.createTimeout)({ 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 && Number.isFinite(ms) && ms > 0 && ms <= 2147483647 ? (0, _orkestrel_timeout.createTimeout)({ 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 typeof outcome === "boolean" ? outcome : void 0;
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);