@runium/core 0.1.1 → 0.3.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.
Files changed (2) hide show
  1. package/index.js +347 -246
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,97 +1,183 @@
1
- import { readFile as x, writeFile as M, mkdir as j } from "node:fs/promises";
2
- import { EventEmitter as v } from "node:events";
3
- import q from "bcx-expression-evaluator";
4
- import K from "ajv/dist/2020.js";
5
- import U from "ajv-keywords";
6
- import { spawn as F } from "node:child_process";
7
- import { createWriteStream as w } from "node:fs";
8
- import { resolve as I, dirname as P } from "node:path";
1
+ import { readFile as J, writeFile as B, mkdir as O } from "node:fs/promises";
2
+ import { exec as H, spawn as W } from "node:child_process";
3
+ import { setTimeout as X } from "node:timers/promises";
4
+ import { promisify as z } from "node:util";
5
+ import { EventEmitter as N } from "node:events";
6
+ import Z from "bcx-expression-evaluator";
7
+ import Q from "ajv/dist/2020.js";
8
+ import tt from "ajv-keywords";
9
+ import { createWriteStream as v } from "node:fs";
10
+ import { constants as et } from "node:os";
11
+ import { resolve as $, dirname as D } from "node:path";
9
12
  class p extends Error {
10
13
  code;
11
14
  payload;
12
- constructor(t, s, r = null) {
13
- super(t), this.code = s, this.payload = r;
15
+ constructor(t, s, i = null) {
16
+ super(t), this.code = s, this.payload = i;
14
17
  }
15
18
  }
16
- function At(e) {
19
+ function xt(e) {
17
20
  return !!e && e instanceof p;
18
21
  }
19
- var Y = ((e) => (e.READ_JSON = "file-read-json", e.WRITE_JSON = "file-write-json", e))(Y || {});
20
- async function _t(e) {
22
+ var st = ((e) => (e.READ_JSON = "file-read-json", e.WRITE_JSON = "file-write-json", e))(st || {});
23
+ async function Mt(e) {
21
24
  try {
22
- const t = await x(e, { encoding: "utf-8" });
25
+ const t = await J(e, { encoding: "utf-8" });
23
26
  return JSON.parse(t);
24
27
  } catch (t) {
25
28
  throw new p(`Can not read JSON file ${e}`, "file-read-json", { path: e, original: t });
26
29
  }
27
30
  }
28
- async function It(e, t) {
31
+ async function Kt(e, t) {
29
32
  try {
30
- await M(e, JSON.stringify(t, null, 2), { encoding: "utf-8" });
33
+ await B(e, JSON.stringify(t, null, 2), { encoding: "utf-8" });
31
34
  } catch (s) {
32
35
  throw new p(`Can not write JSON file ${e}`, "file-write-json", { path: e, data: t, original: s });
33
36
  }
34
37
  }
35
- const V = String.raw`"\$unwrap\((.*)\)"`;
36
- var J = ((e) => (e.MACRO_APPLY_ERROR = "macro-apply-error", e))(J || {});
37
- function $t(e, t) {
38
- const s = Object.keys(t), r = String.raw`\$(${s.join("|")})\(([^()]*(?:\([^()]*\)[^()]*)*)\)`, i = (o) => {
39
- const a = new RegExp(r, "g");
38
+ const rt = String.raw`"\$unwrap\((.*)\)"`;
39
+ var it = ((e) => (e.MACRO_APPLY_ERROR = "macro-apply-error", e))(it || {});
40
+ function qt(e, t) {
41
+ const s = Object.keys(t), i = String.raw`\$(${s.join("|")})\(([^()]*(?:\([^()]*\)[^()]*)*)\)`, r = (o) => {
42
+ const a = new RegExp(i, "g");
40
43
  let c = o, n = !0;
41
- for (; n; ) n = !1, c = c.replace(a, (u, A, N) => {
44
+ for (; n; ) n = !1, c = c.replace(a, (u, l, Y) => {
42
45
  n = !0;
43
- const y = [];
44
- let _ = 0, S = "";
45
- for (const g of N) g === "," && _ === 0 ? (y.push(S.trim()), S = "") : (g === "(" && _++, g === ")" && _--, S += g);
46
- y.push(S.trim());
47
- const G = y.map((g) => g ? i(g) : "");
46
+ const R = [];
47
+ let w = 0, k = "";
48
+ for (const h of Y) h === "," && w === 0 ? (R.push(k.trim()), k = "") : (h === "(" && w++, h === ")" && w--, k += h);
49
+ R.push(k.trim());
50
+ const V = R.map((h) => h ? r(h) : "");
48
51
  try {
49
- return t[A](...G);
50
- } catch (g) {
51
- throw new p(`Can not apply macro "${A}"`, "macro-apply-error", { type: A, args: y, original: g });
52
+ return t[l](...V);
53
+ } catch (h) {
54
+ throw new p(`Can not apply macro "${l}"`, "macro-apply-error", { type: l, args: R, original: h });
52
55
  }
53
56
  });
54
57
  return c;
55
58
  };
56
59
  return (function(o) {
57
- const a = new RegExp(V, "g");
60
+ const a = new RegExp(rt, "g");
58
61
  return o.replace(a, (c, n) => n.trim());
59
- })(s.length ? i(e) : e);
62
+ })(s.length ? r(e) : e);
60
63
  }
61
- var f = ((e) => (e.IMMEDIATE = "immediate", e.DEFERRED = "deferred", e.IGNORE = "ignore", e))(f || {}), d = ((e) => (e.EMIT_EVENT = "emit-event", e.START_TASK = "start-task", e.RESTART_TASK = "restart-task", e.STOP_TASK = "stop-task", e.STOP_PROJECT = "stop-project", e.ENABLE_TRIGGER = "enable-trigger", e.DISABLE_TRIGGER = "disable-trigger", e))(d || {}), T = ((e) => (e.DEFAULT = "default", e))(T || {}), l = ((e) => (e.EVENT = "event", e.TIMEOUT = "timeout", e.INTERVAL = "interval", e))(l || {}), m = ((e) => (e.ALWAYS = "always", e.ON_FAILURE = "on-failure", e))(m || {}), B = ((e) => (e.INCORRECT_DATA = "project-config-incorrect-data", e.TASKS_CIRCULAR_DEPENDENCY = "project-config-tasks-circular-dependency", e.TASK_NOT_EXISTS = "project-config-task-not-exists", e.TRIGGER_NOT_EXISTS = "project-config-trigger-not-exists", e))(B || {});
62
- const H = /* @__PURE__ */ new Set(["start-task", "restart-task", "stop-task"]), W = /* @__PURE__ */ new Set(["enable-trigger", "disable-trigger"]), X = new Set(Object.values(d)), z = new Set(Object.values(l));
63
- function b(e) {
64
- return H.has(e.type);
64
+ const L = z(H);
65
+ async function G(e) {
66
+ return process.platform === "win32" ? x(e) : (async function(t) {
67
+ try {
68
+ const { stdout: s } = await L("ps -eo pid,ppid"), i = s.split(`
69
+ `).slice(1), r = /* @__PURE__ */ new Map();
70
+ for (const o of i) {
71
+ const a = o.trim().split(/\s+/);
72
+ if (a.length >= 2) {
73
+ const c = parseInt(a[0], 10), n = parseInt(a[1], 10);
74
+ isNaN(c) || isNaN(n) || (r.has(n) || r.set(n, []), r.get(n).push(c));
75
+ }
76
+ }
77
+ return M(t, r);
78
+ } catch {
79
+ return { pid: t, children: [], depth: 0 };
80
+ }
81
+ })(e);
82
+ }
83
+ async function x(e) {
84
+ try {
85
+ const { stdout: t } = await L(`wmic process where (ParentProcessId=${e}) get ProcessId`, { windowsHide: !0 }), s = t.split(`
86
+ `).map((r) => r.trim()).filter(Boolean).slice(1).map((r) => parseInt(r, 10)).filter((r) => !isNaN(r)), i = [];
87
+ for (const r of s) {
88
+ const o = await x(r);
89
+ i.push(o);
90
+ }
91
+ return { pid: e, children: i, depth: 0 };
92
+ } catch {
93
+ return { pid: e, children: [], depth: 0 };
94
+ }
95
+ }
96
+ function M(e, t) {
97
+ return { pid: e, children: (t.get(e) || []).map((s) => M(s, t)), depth: 0 };
98
+ }
99
+ function K(e, t = 0) {
100
+ e.depth = t;
101
+ for (const s of e.children) K(s, t + 1);
102
+ }
103
+ function m(e) {
104
+ try {
105
+ return process.kill(e, 0), !0;
106
+ } catch (t) {
107
+ const s = t;
108
+ return s.code !== "ESRCH" && s.code === "EPERM";
109
+ }
110
+ }
111
+ async function C(e, t = "SIGTERM", s = 1e3) {
112
+ if (!m(e)) return !0;
113
+ try {
114
+ process.kill(e, t);
115
+ } catch (r) {
116
+ const o = r;
117
+ if (o.code === "ESRCH") return !0;
118
+ throw o;
119
+ }
120
+ const i = Date.now();
121
+ for (; Date.now() - i < s; ) {
122
+ if (!m(e)) return !0;
123
+ await X(50);
124
+ }
125
+ return !m(e);
126
+ }
127
+ async function ot(e, t = "SIGTERM", s = "SIGKILL", i = 1e3) {
128
+ const r = await G(e);
129
+ K(r);
130
+ const o = (function(a) {
131
+ const c = [], n = (u) => {
132
+ c.push(u);
133
+ for (const l of u.children) n(l);
134
+ };
135
+ return n(a), c.sort((u, l) => l.depth - u.depth);
136
+ })(r);
137
+ for (const a of o)
138
+ m(a.pid) && !await C(a.pid, t, i) && m(a.pid) && await C(a.pid, s, i);
139
+ }
140
+ async function Ut(e) {
141
+ const t = await G(e), s = [], i = (r) => {
142
+ s.push(r.pid);
143
+ for (const o of r.children) i(o);
144
+ };
145
+ return i(t), s;
65
146
  }
66
- function O(e) {
67
- return W.has(e.type);
147
+ var y = ((e) => (e.IMMEDIATE = "immediate", e.DEFERRED = "deferred", e.IGNORE = "ignore", e))(y || {}), d = ((e) => (e.EMIT_EVENT = "emit-event", e.START_TASK = "start-task", e.RESTART_TASK = "restart-task", e.STOP_TASK = "stop-task", e.STOP_PROJECT = "stop-project", e.ENABLE_TRIGGER = "enable-trigger", e.DISABLE_TRIGGER = "disable-trigger", e))(d || {}), S = ((e) => (e.DEFAULT = "default", e))(S || {}), f = ((e) => (e.EVENT = "event", e.TIMEOUT = "timeout", e.INTERVAL = "interval", e))(f || {}), E = ((e) => (e.ALWAYS = "always", e.ON_FAILURE = "on-failure", e))(E || {}), nt = ((e) => (e.INCORRECT_DATA = "project-config-incorrect-data", e.TASKS_CIRCULAR_DEPENDENCY = "project-config-tasks-circular-dependency", e.TASK_NOT_EXISTS = "project-config-task-not-exists", e.TRIGGER_NOT_EXISTS = "project-config-trigger-not-exists", e))(nt || {});
148
+ const at = /* @__PURE__ */ new Set(["start-task", "restart-task", "stop-task"]), ct = /* @__PURE__ */ new Set(["enable-trigger", "disable-trigger"]), pt = new Set(Object.values(d)), dt = new Set(Object.values(f));
149
+ function P(e) {
150
+ return at.has(e.type);
68
151
  }
69
- function Z(e) {
70
- return !X.has(e.type);
152
+ function j(e) {
153
+ return ct.has(e.type);
71
154
  }
72
- function Q(e) {
73
- return !z.has(e.type);
155
+ function ut(e) {
156
+ return !pt.has(e.type);
74
157
  }
75
- const C = new K({ allowUnionTypes: !0, allErrors: !0, verbose: !0 });
76
- function tt(e) {
158
+ function ht(e) {
159
+ return !dt.has(e.type);
160
+ }
161
+ const q = new Q({ allowUnionTypes: !0, allErrors: !0, verbose: !0 });
162
+ function gt(e) {
77
163
  const t = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Set();
78
- for (const i of e.tasks) s.add(i.id), t.set(i.id, []);
79
- const r = new Set(e.triggers?.map((i) => i.id) || []);
80
- for (const i of e.tasks) {
81
- for (const o of i.dependencies || []) {
82
- if (!s.has(o.taskId)) throw new p(`Task "${i.id}" depends on not existing task "${o.taskId}"`, "project-config-task-not-exists", { taskId: i.id, dependency: { ...o }, scope: "dependencies" });
83
- t.get(o.taskId).push(i.id);
164
+ for (const r of e.tasks) s.add(r.id), t.set(r.id, []);
165
+ const i = new Set(e.triggers?.map((r) => r.id) || []);
166
+ for (const r of e.tasks) {
167
+ for (const o of r.dependencies || []) {
168
+ if (!s.has(o.taskId)) throw new p(`Task "${r.id}" depends on not existing task "${o.taskId}"`, "project-config-task-not-exists", { taskId: r.id, dependency: { ...o }, scope: "dependencies" });
169
+ t.get(o.taskId).push(r.id);
84
170
  }
85
- for (const o of i.handlers || []) {
86
- if (b(o.action) && !s.has(o.action.taskId)) throw new p(`Task "${i.id}" handler action uses not existing task "${o.action.taskId}"`, "project-config-task-not-exists", { taskId: i.id, handler: { ...o }, scope: "handlers" });
87
- if (O(o.action) && !r.has(o.action.triggerId)) throw new p(`Task "${i.id}" handler action uses not existing trigger "${o.action.triggerId}"`, "project-config-trigger-not-exists", { taskId: i.id, handler: { ...o }, scope: "handlers" });
171
+ for (const o of r.handlers || []) {
172
+ if (P(o.action) && !s.has(o.action.options.taskId)) throw new p(`Task "${r.id}" handler action uses not existing task "${o.action.options.taskId}"`, "project-config-task-not-exists", { taskId: r.id, handler: { ...o }, scope: "handlers" });
173
+ if (j(o.action) && !i.has(o.action.options.triggerId)) throw new p(`Task "${r.id}" handler action uses not existing trigger "${o.action.options.triggerId}"`, "project-config-trigger-not-exists", { taskId: r.id, handler: { ...o }, scope: "handlers" });
88
174
  }
89
175
  }
90
- for (const i of e.triggers || []) {
91
- if (b(i.action) && !s.has(i.action.taskId)) throw new p(`Trigger "${i.id}" action uses not existing task "${i.action.taskId}"`, "project-config-task-not-exists", { trigger: { ...i }, scope: "triggers" });
92
- if (O(i.action) && !r.has(i.action.triggerId)) throw new p(`Trigger "${i.id}" action uses not existing trigger "${i.action.triggerId}"`, "project-config-trigger-not-exists", { trigger: { ...i }, scope: "triggers" });
176
+ for (const r of e.triggers || []) {
177
+ if (P(r.action) && !s.has(r.action.options.taskId)) throw new p(`Trigger "${r.id}" action uses not existing task "${r.action.options.taskId}"`, "project-config-task-not-exists", { trigger: { ...r }, scope: "triggers" });
178
+ if (j(r.action) && !i.has(r.action.options.triggerId)) throw new p(`Trigger "${r.id}" action uses not existing trigger "${r.action.options.triggerId}"`, "project-config-trigger-not-exists", { trigger: { ...r }, scope: "triggers" });
93
179
  }
94
- (function(i) {
180
+ (function(r) {
95
181
  const o = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), c = (n) => {
96
182
  if (a.has(n)) {
97
183
  const u = [...a, n].join(" -> ");
@@ -99,30 +185,30 @@ function tt(e) {
99
185
  }
100
186
  if (!o.has(n)) {
101
187
  a.add(n);
102
- for (const u of i.get(n) || []) c(u);
188
+ for (const u of r.get(n) || []) c(u);
103
189
  a.delete(n), o.add(n);
104
190
  }
105
191
  };
106
- for (const n of i.keys()) o.has(n) || c(n);
192
+ for (const n of r.keys()) o.has(n) || c(n);
107
193
  })(t);
108
194
  }
109
- function et(e, t) {
110
- (function(s, r) {
111
- const i = C.compile(r || {});
112
- if (!i(s)) throw new p("Incorrect project config data", "project-config-incorrect-data", { errors: i.errors });
113
- })(e, t), tt(e);
195
+ function ft(e, t) {
196
+ (function(s, i) {
197
+ const r = q.compile(i || {});
198
+ if (!r(s)) throw new p("Incorrect project config data", "project-config-incorrect-data", { errors: r.errors });
199
+ })(e, t), gt(e);
114
200
  }
115
- U(C, ["uniqueItemProperties"]);
116
- var h = ((e) => (e.IDLE = "idle", e.STARTING = "starting", e.STARTED = "started", e.COMPLETED = "completed", e.FAILED = "failed", e.STOPPING = "stopping", e.STOPPED = "stopped", e))(h || {}), k = ((e) => (e.STATE_CHANGE = "state-change", e.STDOUT = "stdout", e.STDERR = "stderr", e))(k || {});
117
- const jt = -1;
118
- class D extends v {
201
+ tt(q, ["uniqueItemProperties"]);
202
+ var g = ((e) => (e.IDLE = "idle", e.STARTING = "starting", e.STARTED = "started", e.COMPLETED = "completed", e.FAILED = "failed", e.STOPPING = "stopping", e.STOPPED = "stopped", e))(g || {}), A = ((e) => (e.STATE_CHANGE = "state-change", e.STDOUT = "stdout", e.STDERR = "stderr", e))(A || {});
203
+ const Ft = -1;
204
+ class U extends N {
119
205
  constructor(t) {
120
206
  super(), this.options = t;
121
207
  }
122
208
  }
123
- class st extends D {
209
+ class lt extends U {
124
210
  constructor(t) {
125
- super(t), this.options = t, this.setMaxListeners(50), this.options.env = { ...process.env, ...t.env || {} }, this.options.cwd = I(process.cwd(), t.cwd || "");
211
+ super(t), this.options = t, this.setMaxListeners(50), this.options.env = { ...process.env, ...t.env || {} }, this.options.cwd = $(process.cwd(), t.cwd || "");
126
212
  }
127
213
  state = { status: "idle", pid: -1, timestamp: Date.now(), iteration: 0 };
128
214
  process = null;
@@ -144,8 +230,8 @@ class st extends D {
144
230
  this.updateState({ status: "starting", iteration: this.state.iteration + 1, pid: -1, exitCode: void 0, error: void 0 });
145
231
  try {
146
232
  await this.initLogStreams();
147
- const { cwd: t, command: s, arguments: r = [], env: i, shell: o = !0 } = this.options;
148
- this.process = F(s, r, { cwd: t, env: i, shell: o, stdio: ["ignore", "pipe", "pipe"] }), this.addProcessListeners(), this.setTTLTimer(), this.updateState({ status: "started", pid: this.process.pid });
233
+ const { cwd: t, command: s, arguments: i = [], env: r, shell: o = !0 } = this.options;
234
+ this.process = W(s, i, { cwd: t, env: r, shell: o, stdio: ["ignore", "pipe", "pipe"] }), this.addProcessListeners(), this.setTTLTimer(), this.updateState({ status: "started", pid: this.process.pid });
149
235
  } catch (t) {
150
236
  this.onError(t);
151
237
  }
@@ -156,29 +242,27 @@ class st extends D {
156
242
  return !!this.process && t === "started";
157
243
  }
158
244
  async stop(t = "") {
159
- if (this.canStop()) return this.updateState({ status: "stopping", reason: t }), new Promise((s) => {
160
- const r = this.options.stopSignal || "SIGTERM";
161
- this.process.kill(r), this.process.on("exit", () => {
162
- s();
163
- });
164
- });
245
+ if (!this.canStop()) return;
246
+ this.updateState({ status: "stopping", reason: t });
247
+ const s = this.options.stopSignal || "SIGTERM";
248
+ await ot(Number(this.process.pid), s, "SIGKILL", 3e4);
165
249
  }
166
250
  async restart() {
167
251
  await this.stop("restart"), this.start();
168
252
  }
169
253
  updateState(t) {
170
254
  const s = { ...this.state, ...t, timestamp: Date.now() };
171
- this.state = Object.fromEntries(Object.entries(s).filter(([r, i]) => i !== void 0)), this.emit("state-change", this.getState()), this.emit(this.state.status, this.getState());
255
+ this.state = Object.fromEntries(Object.entries(s).filter(([i, r]) => r !== void 0)), this.emit("state-change", this.getState()), this.emit(this.state.status, this.getState());
172
256
  }
173
257
  async initLogStreams() {
174
258
  const { stdout: t = null, stderr: s = null } = this.options.log || {};
175
259
  if (t) {
176
- const r = I(t);
177
- await j(P(r), { recursive: !0 }), this.stdoutStream = w(t, { flags: "w" });
260
+ const i = $(t);
261
+ await O(D(i), { recursive: !0 }), this.stdoutStream = v(t, { flags: this.state.iteration === 1 ? "w" : "a" });
178
262
  }
179
263
  if (s) {
180
- const r = I(s);
181
- await j(P(r), { recursive: !0 }), this.stderrStream = w(s, { flags: "w" });
264
+ const i = $(s);
265
+ await O(D(i), { recursive: !0 }), this.stderrStream = v(s, { flags: this.state.iteration === 1 ? "w" : "a" });
182
266
  }
183
267
  }
184
268
  setTTLTimer() {
@@ -199,8 +283,8 @@ class st extends D {
199
283
  this.emit("stderr", s), this.stderrStream && this.stderrStream.write(s);
200
284
  }
201
285
  onExit(t) {
202
- const s = t !== null ? t : -1;
203
- this.updateState({ status: s === 0 ? "completed" : s === -1 ? "stopped" : "failed", exitCode: s }), this.cleanup();
286
+ let s = -1;
287
+ t !== null && (s = t === 128 + et.signals[this.options.stopSignal || "SIGTERM"] ? -1 : t), this.updateState({ status: s === 0 ? "completed" : s === -1 ? "stopped" : "failed", exitCode: s }), this.cleanup();
204
288
  }
205
289
  onError(t) {
206
290
  this.updateState({ status: "failed", error: t }), this.cleanup();
@@ -209,70 +293,71 @@ class st extends D {
209
293
  this.ttlTimer && (clearTimeout(this.ttlTimer), this.ttlTimer = null), this.process && (this.process.removeAllListeners(), this.process.stdout?.removeAllListeners(), this.process.stderr?.removeAllListeners(), this.process = null), this.stdoutStream && (this.stdoutStream.end(), this.stdoutStream = null), this.stderrStream && (this.stderrStream.end(), this.stderrStream = null);
210
294
  }
211
295
  }
212
- var rt = ((e) => (e.ACTION_TYPE_ALREADY_USED = "project-schema-action-type-already-used", e.TASK_TYPE_ALREADY_USED = "project-schema-task-type-already-used", e.TRIGGER_TYPE_ALREADY_USED = "project-schema-trigger-type-already-used", e))(rt || {});
213
- const $ = /^[a-zA-Z0-9_-]+$/, it = { id: { type: "string", pattern: $.source }, name: { type: "string" }, type: { type: "string" }, mode: { $ref: "#/$defs/Runium_TaskStartMode" }, dependencies: { type: "array", items: { $ref: "#/$defs/Runium_TaskDependency" } }, handlers: { type: "array", items: { $ref: "#/$defs/Runium_TaskHandler" } }, restart: { $ref: "#/$defs/Runium_TaskRestartPolicy" } }, E = { id: { type: "string", pattern: $.source }, action: { $ref: "#/$defs/Runium_Action" }, disabled: { type: "boolean" } };
214
- function L(e, t) {
215
- return { type: "object", properties: { ...structuredClone(it), type: { const: e }, options: { ...structuredClone(t) } }, required: ["id", "options"], additionalProperties: !1 };
296
+ var Tt = ((e) => (e.ACTION_TYPE_ALREADY_USED = "project-schema-action-type-already-used", e.TASK_TYPE_ALREADY_USED = "project-schema-task-type-already-used", e.TRIGGER_TYPE_ALREADY_USED = "project-schema-trigger-type-already-used", e))(Tt || {});
297
+ const b = /^[a-zA-Z0-9_-]+$/, mt = { id: { type: "string", pattern: b.source }, name: { type: "string" }, type: { type: "string" }, mode: { $ref: "#/$defs/Runium_TaskStartMode" }, dependencies: { type: "array", items: { $ref: "#/$defs/Runium_TaskDependency" } }, handlers: { type: "array", items: { $ref: "#/$defs/Runium_TaskHandler" } }, restart: { $ref: "#/$defs/Runium_TaskRestartPolicy" } }, yt = { id: { type: "string", pattern: b.source }, action: { $ref: "#/$defs/Runium_Action" }, disabled: { type: "boolean" } };
298
+ function F(e, t) {
299
+ return { type: "object", properties: { ...structuredClone(mt), type: { const: e }, options: { ...structuredClone(t) } }, required: ["id", "options"], additionalProperties: !1 };
216
300
  }
217
- function ot(e, t) {
218
- return { type: "object", properties: { type: { type: "string", const: e }, ...t ? { payload: t } : {} }, required: ["type", ...t ? ["payload"] : []], additionalProperties: !1 };
301
+ function T(e, t) {
302
+ const s = t ? { options: t } : {}, i = t ? ["options"] : [];
303
+ return { type: "object", properties: { type: Array.isArray(e) ? { type: "string", enum: e } : { type: "string", const: e }, ...s }, required: ["type", ...i], additionalProperties: !1 };
219
304
  }
220
- function nt(e, t) {
221
- const s = t ? { payload: t } : {}, r = t ? ["payload"] : [];
222
- return { type: "object", properties: { ...structuredClone(E), type: { type: "string", const: e }, ...s }, required: ["id", "type", "action", ...r], additionalProperties: !1 };
305
+ function _(e, t) {
306
+ const s = t ? { options: t } : {}, i = t ? ["options"] : [];
307
+ return { type: "object", properties: { ...structuredClone(yt), type: { type: "string", const: e }, ...s }, required: ["id", "type", "action", ...i], additionalProperties: !1 };
223
308
  }
224
- function at() {
225
- const e = { $schema: "https://json-schema.org/draft/2020-12/schema", $id: "https://example.com/schemas/project.json", title: "Project", type: "object", properties: { id: { type: "string", pattern: $.source }, name: { type: "string" }, tasks: { type: "array", items: { oneOf: [{ $ref: "#/$defs/Runium_TaskConfig" }] }, minItems: 1, uniqueItemProperties: ["id"] }, triggers: { type: "array", items: { $ref: "#/$defs/Runium_Trigger" }, uniqueItemProperties: ["id"] } }, required: ["id", "tasks"], additionalProperties: !1, $defs: { Runium_EnvValue: { type: ["string", "number", "boolean"] }, Runium_Env: { type: "object", additionalProperties: { $ref: "#/$defs/Runium_EnvValue" } }, Runium_TaskStartMode: { type: "string", enum: Object.values(f) }, Runium_TaskHandler: { type: "object", properties: { action: { $ref: "#/$defs/Runium_Action" }, condition: { $ref: "#/$defs/Runium_TaskStateCondition" } }, required: ["action", "condition"], additionalProperties: !1 }, Runium_TaskStateCondition: { oneOf: [{ type: "string" }, { type: "boolean" }, { $ref: "#/$defs/Runium_TaskState" }] }, Runium_TaskState: { type: "object", properties: { status: { $ref: "#/$defs/Runium_TaskStatus" }, iteration: { type: "number", minimum: 0 }, exitCode: { type: "number", minimum: 0 }, reason: { type: "string" } }, additionalProperties: !1 }, Runium_TaskStatus: { type: "string", enum: Object.values(h) }, Runium_TaskDependency: { type: "object", properties: { taskId: { type: "string" }, condition: { $ref: "#/$defs/Runium_TaskStateCondition" } }, required: ["taskId", "condition"], additionalProperties: !1 }, Runium_Trigger: { oneOf: [{ $ref: "#/$defs/Runium_TriggerEvent" }, { $ref: "#/$defs/Runium_TriggerInterval" }, { $ref: "#/$defs/Runium_TriggerTimeout" }] }, Runium_TriggerEvent: { type: "object", properties: { ...structuredClone(E), type: { const: l.EVENT }, event: { type: "string" } }, required: ["id", "type", "event", "action"], additionalProperties: !1 }, Runium_TriggerInterval: { type: "object", properties: { ...structuredClone(E), type: { const: l.INTERVAL }, interval: { type: "number", minimum: 0 } }, required: ["id", "type", "interval", "action"], additionalProperties: !1 }, Runium_TriggerTimeout: { type: "object", properties: { ...structuredClone(E), type: { const: l.TIMEOUT }, timeout: { type: "number", minimum: 0 } }, required: ["id", "type", "timeout", "action"], additionalProperties: !1 }, Runium_Action: { oneOf: [{ $ref: "#/$defs/Runium_ActionEmitEvent" }, { $ref: "#/$defs/Runium_ActionProcessTask" }, { $ref: "#/$defs/Runium_ActionStopProject" }, { $ref: "#/$defs/Runium_ActionToggleTrigger" }] }, Runium_ActionEmitEvent: { type: "object", properties: { type: { type: "string", const: d.EMIT_EVENT }, event: { type: "string" } }, required: ["type", "event"], additionalProperties: !1 }, Runium_ActionProcessTask: { type: "object", properties: { type: { type: "string", enum: [d.START_TASK, d.RESTART_TASK, d.STOP_TASK] }, taskId: { type: "string" } }, required: ["type", "taskId"], additionalProperties: !1 }, Runium_ActionStopProject: { type: "object", properties: { type: { type: "string", const: d.STOP_PROJECT } }, required: ["type"], additionalProperties: !1 }, Runium_ActionToggleTrigger: { type: "object", properties: { type: { type: "string", enum: [d.ENABLE_TRIGGER, d.DISABLE_TRIGGER] }, triggerId: { type: "string" } }, required: ["type", "triggerId"], additionalProperties: !1 }, Runium_TaskConfig: { ...L(T.DEFAULT, { $ref: "#/$defs/Runium_TaskOptions" }) }, Runium_TaskOptions: { type: "object", properties: { command: { type: "string" }, arguments: { type: "array", items: { type: "string" } }, shell: { type: "boolean" }, cwd: { type: "string" }, env: { $ref: "#/$defs/Runium_Env" }, ttl: { type: "number" }, log: { $ref: "#/$defs/Runium_TaskLog" }, stopSignal: { type: "string" } }, required: ["command"], additionalProperties: !1 }, Runium_TaskRestartPolicy: { oneOf: [{ $ref: "#/$defs/Runium_TaskRestartPolicyAlways" }, { $ref: "#/$defs/Runium_TaskRestartPolicyOnFailure" }] }, Runium_TaskRestartPolicyAlways: { type: "object", required: ["policy"], properties: { policy: { const: m.ALWAYS }, delay: { type: "number" } }, additionalProperties: !1 }, Runium_TaskRestartPolicyOnFailure: { type: "object", required: ["policy"], properties: { policy: { const: m.ON_FAILURE }, delay: { type: "number" }, maxRetries: { type: "number" } }, additionalProperties: !1 }, Runium_TaskLog: { type: "object", properties: { stdout: { type: ["string", "null"] }, stderr: { type: ["string", "null"] } }, additionalProperties: !1 } } };
309
+ function St() {
310
+ const e = { $schema: "https://json-schema.org/draft/2020-12/schema", $id: "https://example.com/schemas/project.json", title: "Project", type: "object", properties: { id: { type: "string", pattern: b.source }, name: { type: "string" }, tasks: { type: "array", items: { oneOf: [{ $ref: "#/$defs/Runium_TaskConfig" }] }, minItems: 1, uniqueItemProperties: ["id"] }, triggers: { type: "array", items: { $ref: "#/$defs/Runium_Trigger" }, uniqueItemProperties: ["id"] } }, required: ["id", "tasks"], additionalProperties: !1, $defs: { Runium_EnvValue: { type: ["string", "number", "boolean"] }, Runium_Env: { type: "object", additionalProperties: { $ref: "#/$defs/Runium_EnvValue" } }, Runium_TaskStartMode: { type: "string", enum: Object.values(y) }, Runium_TaskHandler: { type: "object", properties: { action: { $ref: "#/$defs/Runium_Action" }, condition: { $ref: "#/$defs/Runium_TaskStateCondition" } }, required: ["action", "condition"], additionalProperties: !1 }, Runium_TaskStateCondition: { oneOf: [{ type: "string" }, { type: "boolean" }, { $ref: "#/$defs/Runium_TaskState" }] }, Runium_TaskState: { type: "object", properties: { status: { $ref: "#/$defs/Runium_TaskStatus" }, iteration: { type: "number", minimum: 0 }, exitCode: { type: "number", minimum: 0 }, reason: { type: "string" } }, additionalProperties: !1 }, Runium_TaskStatus: { type: "string", enum: Object.values(g) }, Runium_TaskDependency: { type: "object", properties: { taskId: { type: "string" }, condition: { $ref: "#/$defs/Runium_TaskStateCondition" } }, required: ["taskId", "condition"], additionalProperties: !1 }, Runium_Trigger: { oneOf: [{ $ref: "#/$defs/Runium_TriggerEvent" }, { $ref: "#/$defs/Runium_TriggerInterval" }, { $ref: "#/$defs/Runium_TriggerTimeout" }] }, Runium_TriggerEvent: _(f.EVENT, { type: "object", properties: { event: { type: "string" } }, required: ["event"], additionalProperties: !1 }), Runium_TriggerInterval: _(f.INTERVAL, { type: "object", properties: { interval: { type: "number", minimum: 0 } }, required: ["interval"], additionalProperties: !1 }), Runium_TriggerTimeout: _(f.TIMEOUT, { type: "object", properties: { timeout: { type: "number", minimum: 0 } }, required: ["timeout"], additionalProperties: !1 }), Runium_Action: { oneOf: [{ $ref: "#/$defs/Runium_ActionEmitEvent" }, { $ref: "#/$defs/Runium_ActionProcessTask" }, { $ref: "#/$defs/Runium_ActionStopProject" }, { $ref: "#/$defs/Runium_ActionToggleTrigger" }] }, Runium_ActionEmitEvent: T(d.EMIT_EVENT, { type: "object", properties: { event: { type: "string" } }, required: ["event"], additionalProperties: !1 }), Runium_ActionProcessTask: T([d.START_TASK, d.RESTART_TASK, d.STOP_TASK], { type: "object", properties: { taskId: { type: "string" } }, required: ["taskId"], additionalProperties: !1 }), Runium_ActionStopProject: T(d.STOP_PROJECT), Runium_ActionToggleTrigger: T([d.ENABLE_TRIGGER, d.DISABLE_TRIGGER], { type: "object", properties: { triggerId: { type: "string" } }, required: ["triggerId"], additionalProperties: !1 }), Runium_TaskConfig: { ...F(S.DEFAULT, { $ref: "#/$defs/Runium_TaskOptions" }) }, Runium_TaskOptions: { type: "object", properties: { command: { type: "string" }, arguments: { type: "array", items: { type: "string" } }, shell: { type: "boolean" }, cwd: { type: "string" }, env: { $ref: "#/$defs/Runium_Env" }, ttl: { type: "number" }, log: { $ref: "#/$defs/Runium_TaskLog" }, stopSignal: { type: "string" } }, required: ["command"], additionalProperties: !1 }, Runium_TaskRestartPolicy: { oneOf: [{ $ref: "#/$defs/Runium_TaskRestartPolicyAlways" }, { $ref: "#/$defs/Runium_TaskRestartPolicyOnFailure" }] }, Runium_TaskRestartPolicyAlways: { type: "object", required: ["policy"], properties: { policy: { const: E.ALWAYS }, delay: { type: "number" } }, additionalProperties: !1 }, Runium_TaskRestartPolicyOnFailure: { type: "object", required: ["policy"], properties: { policy: { const: E.ON_FAILURE }, delay: { type: "number" }, maxRetries: { type: "number" } }, additionalProperties: !1 }, Runium_TaskLog: { type: "object", properties: { stdout: { type: ["string", "null"] }, stderr: { type: ["string", "null"] } }, additionalProperties: !1 } } };
226
311
  return Object.freeze(e);
227
312
  }
228
- function ct(e, t) {
313
+ function Et(e, t) {
229
314
  let s = structuredClone(e);
230
- return t.project && (s = (function(r, i) {
231
- return i && (r.properties = { ...i.properties || {}, ...r.properties }, r.required = Array.from(/* @__PURE__ */ new Set([...r.required ?? [], ...i.required ?? []]))), r;
232
- })(s, t.project)), t.definitions && (s = (function(r, i) {
233
- return i && (r.$defs = { ...i, ...r.$defs }), r;
234
- })(s, t.definitions)), t.tasks && (s = (function(r, i) {
235
- if (i) {
236
- const o = new Set(r.properties.tasks.items.oneOf.map((c) => {
315
+ return t.project && (s = (function(i, r) {
316
+ return r && (i.properties = { ...r.properties || {}, ...i.properties }, i.required = Array.from(/* @__PURE__ */ new Set([...i.required ?? [], ...r.required ?? []]))), i;
317
+ })(s, t.project)), t.definitions && (s = (function(i, r) {
318
+ return r && (i.$defs = { ...r, ...i.$defs }), i;
319
+ })(s, t.definitions)), t.tasks && (s = (function(i, r) {
320
+ if (r) {
321
+ const o = new Set(i.properties.tasks.items.oneOf.map((c) => {
237
322
  const n = c.$ref.split("/").pop() || "";
238
- return r.$defs[n]?.properties?.type?.const || T.DEFAULT;
323
+ return i.$defs[n]?.properties?.type?.const || S.DEFAULT;
239
324
  })), a = {};
240
- for (const [c, n] of Object.entries(i)) {
325
+ for (const [c, n] of Object.entries(r)) {
241
326
  if (o.has(n.type)) throw new p(`Task type "${n.type}" already used in project schema`, "project-schema-task-type-already-used", { type: n.type });
242
- a[c] = L(n.type, n.options), r.properties.tasks.items.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
327
+ a[c] = F(n.type, n.options), i.properties.tasks.items.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
243
328
  }
244
- r.$defs = { ...a, ...r.$defs };
329
+ i.$defs = { ...a, ...i.$defs };
245
330
  }
246
- return r;
247
- })(s, t.tasks)), t.actions && (s = (function(r, i) {
248
- if (i) {
249
- const o = new Set(r.$defs.Runium_Action.oneOf.map((c) => {
250
- const n = c.$ref.split("/").pop() || "", u = r.$defs[n]?.properties?.type;
331
+ return i;
332
+ })(s, t.tasks)), t.actions && (s = (function(i, r) {
333
+ if (r) {
334
+ const o = new Set(i.$defs.Runium_Action.oneOf.map((c) => {
335
+ const n = c.$ref.split("/").pop() || "", u = i.$defs[n]?.properties?.type;
251
336
  return u?.enum || [u?.const];
252
337
  }).flat()), a = {};
253
- for (const [c, n] of Object.entries(i)) {
338
+ for (const [c, n] of Object.entries(r)) {
254
339
  if (o.has(n.type)) throw new p(`Action type "${n.type}" already used in project schema`, "project-schema-action-type-already-used", { type: n.type });
255
- a[c] = ot(n.type, n.payload), r.$defs.Runium_Action.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
340
+ a[c] = T(n.type, n.options), i.$defs.Runium_Action.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
256
341
  }
257
- r.$defs = { ...a, ...r.$defs };
342
+ i.$defs = { ...a, ...i.$defs };
258
343
  }
259
- return r;
260
- })(s, t.actions)), t.triggers && (s = (function(r, i) {
261
- if (i) {
262
- const o = new Set(r.$defs.Runium_Trigger.oneOf.map((c) => {
344
+ return i;
345
+ })(s, t.actions)), t.triggers && (s = (function(i, r) {
346
+ if (r) {
347
+ const o = new Set(i.$defs.Runium_Trigger.oneOf.map((c) => {
263
348
  const n = c.$ref.split("/").pop() || "";
264
- return r.$defs[n]?.properties?.type?.const;
349
+ return i.$defs[n]?.properties?.type?.const;
265
350
  })), a = {};
266
- for (const [c, n] of Object.entries(i)) {
351
+ for (const [c, n] of Object.entries(r)) {
267
352
  if (o.has(n.type)) throw new p(`Trigger type "${n.type}" already used in project schema`, "project-schema-trigger-type-already-used", { type: n.type });
268
- a[c] = nt(n.type, n.payload), r.$defs.Runium_Trigger.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
353
+ a[c] = _(n.type, n.options), i.$defs.Runium_Trigger.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
269
354
  }
270
- r.$defs = { ...a, ...r.$defs };
355
+ i.$defs = { ...a, ...i.$defs };
271
356
  }
272
- return r;
357
+ return i;
273
358
  })(s, t.triggers)), Object.freeze(s);
274
359
  }
275
- class R {
360
+ class I {
276
361
  project;
277
362
  id;
278
363
  action;
@@ -286,11 +371,14 @@ class R {
286
371
  isDisabled() {
287
372
  return this.disabled;
288
373
  }
374
+ processAction() {
375
+ this.project.processAction(this.action);
376
+ }
289
377
  }
290
- class pt extends R {
378
+ class Rt extends I {
291
379
  event;
292
380
  constructor(t, s) {
293
- super(t, s), this.event = t.event;
381
+ super(t, s), this.event = t.options.event;
294
382
  }
295
383
  enable() {
296
384
  this.project.on(this.event, this.handler), this.disabled = !1;
@@ -299,53 +387,53 @@ class pt extends R {
299
387
  this.project.off(this.event, this.handler), this.disabled = !0;
300
388
  }
301
389
  handler = () => {
302
- this.project.processAction(this.action);
390
+ this.processAction();
303
391
  };
304
392
  }
305
- class dt extends R {
393
+ class kt extends I {
306
394
  interval;
307
395
  intervalId = null;
308
396
  constructor(t, s) {
309
- super(t, s), this.interval = t.interval;
397
+ super(t, s), this.interval = t.options.interval;
310
398
  }
311
399
  enable() {
312
400
  this.intervalId = setInterval(() => {
313
- this.project.processAction(this.action);
401
+ this.processAction();
314
402
  }, this.interval), this.disabled = !1;
315
403
  }
316
404
  disable() {
317
405
  this.intervalId && clearInterval(this.intervalId), this.disabled = !0, this.intervalId = null;
318
406
  }
319
407
  }
320
- class ut extends R {
408
+ class At extends I {
321
409
  timeout;
322
410
  timeoutId = null;
323
411
  constructor(t, s) {
324
- super(t, s), this.timeout = t.timeout;
412
+ super(t, s), this.timeout = t.options.timeout;
325
413
  }
326
414
  enable() {
327
415
  this.timeoutId = setTimeout(() => {
328
- this.project.processAction(this.action);
416
+ this.processAction();
329
417
  }, this.timeout), this.disabled = !1;
330
418
  }
331
419
  disable() {
332
420
  this.timeoutId && clearTimeout(this.timeoutId), this.disabled = !0, this.timeoutId = null;
333
421
  }
334
422
  }
335
- var gt = ((e) => (e.STATE_CHANGE = "state-change", e.START_TASK = "start-task", e.RESTART_TASK = "restart-task", e.STOP_TASK = "stop-task", e.PROCESS_ACTION = "process-action", e.ENABLE_TRIGGER = "enable-trigger", e.DISABLE_TRIGGER = "disable-trigger", e.TASK_STATE_CHANGE = "task-state-change", e.TASK_STDOUT = "task-stdout", e.TASK_STDERR = "task-stderr", e))(gt || {}), ht = ((e) => (e.IDLE = "idle", e.STARTING = "starting", e.STARTED = "started", e.STOPPING = "stopping", e.STOPPED = "stopped", e))(ht || {}), lt = ((e) => (e.ACTION_PROCESSOR_ALREADY_REGISTERED = "project-action-processor-already-registered", e.ACTION_PROCESSOR_INCORRECT = "project-action-processor-incorrect", e.TASK_PROCESSOR_NOT_FOUND = "project-task-processor-not-found", e.TASK_PROCESSOR_ALREADY_REGISTERED = "project-task-processor-already-registered", e.TASK_PROCESSOR_INCORRECT = "project-task-processor-incorrect", e.TRIGGER_PROCESSOR_ALREADY_REGISTERED = "project-trigger-processor-already-registered", e.TRIGGER_PROCESSOR_INCORRECT = "project-trigger-processor-incorrect", e))(lt || {});
336
- class wt extends v {
423
+ var _t = ((e) => (e.STATE_CHANGE = "state-change", e.START_TASK = "start-task", e.RESTART_TASK = "restart-task", e.STOP_TASK = "stop-task", e.PROCESS_ACTION = "process-action", e.ENABLE_TRIGGER = "enable-trigger", e.DISABLE_TRIGGER = "disable-trigger", e.TASK_STATE_CHANGE = "task-state-change", e.TASK_STDOUT = "task-stdout", e.TASK_STDERR = "task-stderr", e))(_t || {}), It = ((e) => (e.IDLE = "idle", e.STARTING = "starting", e.STARTED = "started", e.STOPPING = "stopping", e.STOPPED = "stopped", e))(It || {}), wt = ((e) => (e.ACTION_PROCESSOR_ALREADY_REGISTERED = "project-action-processor-already-registered", e.ACTION_PROCESSOR_INCORRECT = "project-action-processor-incorrect", e.TASK_PROCESSOR_NOT_FOUND = "project-task-processor-not-found", e.TASK_PROCESSOR_ALREADY_REGISTERED = "project-task-processor-already-registered", e.TASK_PROCESSOR_INCORRECT = "project-task-processor-incorrect", e.TRIGGER_PROCESSOR_ALREADY_REGISTERED = "project-trigger-processor-already-registered", e.TRIGGER_PROCESSOR_INCORRECT = "project-trigger-processor-incorrect", e))(wt || {});
424
+ class Yt extends N {
337
425
  constructor(t) {
338
426
  super(), this.config = t;
339
427
  }
340
- schema = at();
341
- taskProcessors = /* @__PURE__ */ new Map([[T.DEFAULT, st]]);
428
+ schema = St();
429
+ taskProcessors = /* @__PURE__ */ new Map([[S.DEFAULT, lt]]);
342
430
  actionProcessors = /* @__PURE__ */ new Map();
343
431
  triggerProcessors = /* @__PURE__ */ new Map();
344
432
  tasks = /* @__PURE__ */ new Map();
345
433
  triggers = /* @__PURE__ */ new Map();
346
434
  state = { timestamp: Date.now(), status: "idle" };
347
435
  validate() {
348
- et(this.config, this.schema);
436
+ ft(this.config, this.schema);
349
437
  }
350
438
  getConfig() {
351
439
  return { ...this.config };
@@ -361,23 +449,23 @@ class wt extends v {
361
449
  this.validate(), this.initTasks(), this.initTriggers(), this.updateState({ status: "starting" });
362
450
  const t = this.getTasksStartOrder();
363
451
  for (const s of t) if (this.tasks.has(s)) {
364
- const { instance: r, config: i } = this.tasks.get(s), { mode: o = f.IMMEDIATE, dependencies: a = [] } = i;
365
- o === f.IMMEDIATE && a.length === 0 && r.start();
452
+ const { instance: i, config: r } = this.tasks.get(s), { mode: o = y.IMMEDIATE, dependencies: a = [] } = r;
453
+ o === y.IMMEDIATE && a.length === 0 && i.start();
366
454
  }
367
455
  this.updateState({ status: "started" });
368
456
  }
369
457
  async stop(t = "") {
370
458
  if (this.state.status !== "started" && this.state.status !== "starting") return;
371
459
  this.updateState({ status: "stopping", reason: t }), this.cleanupTriggers();
372
- const s = this.getTasksStartOrder().reverse(), r = [];
373
- for (const i of s) if (this.tasks.has(i)) {
374
- const { instance: o } = this.tasks.get(i), { status: a } = o.getState();
375
- a === h.STARTED && r.push(o.stop("project-stop"));
460
+ const s = this.getTasksStartOrder().reverse(), i = [];
461
+ for (const r of s) if (this.tasks.has(r)) {
462
+ const { instance: o } = this.tasks.get(r), { status: a } = o.getState();
463
+ a === g.STARTED && i.push(o.stop("project-stop"));
376
464
  }
377
- await Promise.allSettled(r), this.updateState({ status: "stopped" });
465
+ await Promise.allSettled(i), this.updateState({ status: "stopped" });
378
466
  }
379
467
  extendValidationSchema(t) {
380
- this.schema = ct(this.schema, t);
468
+ this.schema = Et(this.schema, t);
381
469
  }
382
470
  registerAction(t, s) {
383
471
  if (this.actionProcessors.has(t)) throw new p(`Action processor for type "${t}" already registered`, "project-action-processor-already-registered", { type: t });
@@ -386,12 +474,12 @@ class wt extends v {
386
474
  }
387
475
  registerTask(t, s) {
388
476
  if (this.taskProcessors.has(t)) throw new p(`Task processor for type "${t}" already registered`, "project-task-processor-already-registered", { type: t });
389
- if (!(s.prototype instanceof D)) throw new p(`Task processor for type "${t}" must be a subclass of "RuniumTask"`, "project-task-processor-incorrect", { type: t });
477
+ if (!(s.prototype instanceof U)) throw new p(`Task processor for type "${t}" must be a subclass of "RuniumTask"`, "project-task-processor-incorrect", { type: t });
390
478
  this.taskProcessors.set(t, s);
391
479
  }
392
480
  registerTrigger(t, s) {
393
481
  if (this.triggerProcessors.has(t)) throw new p(`Trigger processor for type "${t}" already registered`, "project-trigger-processor-already-registered", { type: t });
394
- if (!(s.prototype instanceof R)) throw new p(`Trigger processor for type "${t}" must be a subclass of "RuniumTrigger"`, "project-trigger-processor-incorrect", { type: t });
482
+ if (!(s.prototype instanceof I)) throw new p(`Trigger processor for type "${t}" must be a subclass of "RuniumTrigger"`, "project-trigger-processor-incorrect", { type: t });
395
483
  this.triggerProcessors.set(t, s);
396
484
  }
397
485
  updateState(t) {
@@ -400,59 +488,59 @@ class wt extends v {
400
488
  initTasks() {
401
489
  this.tasks.clear();
402
490
  for (const t of this.config.tasks) {
403
- const s = t.type || T.DEFAULT, r = this.taskProcessors.get(s);
404
- if (!r) throw new p(`Task processor for type "${s}" not found`, "project-task-processor-not-found", { type: s });
405
- const i = new r(t.options);
406
- i.on(k.STATE_CHANGE, (o) => {
491
+ const s = t.type || S.DEFAULT, i = this.taskProcessors.get(s);
492
+ if (!i) throw new p(`Task processor for type "${s}" not found`, "project-task-processor-not-found", { type: s });
493
+ const r = new i(t.options);
494
+ r.on(A.STATE_CHANGE, (o) => {
407
495
  this.emit("task-state-change", t.id, o), this.onTaskStateChange(t.id, o);
408
- }), i.on(k.STDOUT, (o) => {
496
+ }), r.on(A.STDOUT, (o) => {
409
497
  this.emit("task-stdout", t.id, o);
410
- }), i.on(k.STDERR, (o) => {
498
+ }), r.on(A.STDERR, (o) => {
411
499
  this.emit("task-stderr", t.id, o);
412
- }), this.tasks.set(t.id, { instance: i, config: t, dependencies: [...t.dependencies || []], dependents: null });
500
+ }), this.tasks.set(t.id, { instance: r, config: t, dependencies: [...t.dependencies || []], dependents: null });
413
501
  }
414
502
  }
415
503
  getTasksStartOrder() {
416
- const t = [], s = /* @__PURE__ */ new Set(), r = (i) => {
417
- if (s.has(i)) return;
418
- s.add(i);
419
- const { dependencies: o = [] } = this.tasks.get(i) || {};
420
- for (const a of o) this.tasks.has(a.taskId) && r(a.taskId);
421
- t.push(i);
504
+ const t = [], s = /* @__PURE__ */ new Set(), i = (r) => {
505
+ if (s.has(r)) return;
506
+ s.add(r);
507
+ const { dependencies: o = [] } = this.tasks.get(r) || {};
508
+ for (const a of o) this.tasks.has(a.taskId) && i(a.taskId);
509
+ t.push(r);
422
510
  };
423
- for (const i of this.tasks.keys()) r(i);
511
+ for (const r of this.tasks.keys()) i(r);
424
512
  return t;
425
513
  }
426
514
  onTaskStateChange(t, s) {
427
- const { config: r, instance: i } = this.tasks.get(t), o = this.getDependentTasks(t);
515
+ const { config: i, instance: r } = this.tasks.get(t), o = this.getDependentTasks(t);
428
516
  for (const a of o) this.isDependentTaskReady(a) && this.startTask(a);
429
- if (s.status === h.COMPLETED || s.status === h.FAILED) {
430
- const { restart: a } = r;
517
+ if (s.status === g.COMPLETED || s.status === g.FAILED) {
518
+ const { restart: a } = i;
431
519
  if (a && s.exitCode !== -1) {
432
520
  const { policy: c } = a;
433
- if (c === m.ALWAYS || c === m.ON_FAILURE && s.exitCode !== 0) {
521
+ if (c === E.ALWAYS || c === E.ON_FAILURE && s.exitCode !== 0) {
434
522
  const { maxRetries: n = 1 / 0, delay: u = 0 } = a;
435
- s.iteration <= n && setTimeout(i.restart.bind(i), u);
523
+ s.iteration <= n && setTimeout(r.restart.bind(r), u);
436
524
  }
437
525
  }
438
526
  }
439
- (r.handlers || []).forEach((a) => {
527
+ (i.handlers || []).forEach((a) => {
440
528
  this.checkTaskStateCondition(a.condition, s) && this.processAction(a.action);
441
529
  });
442
530
  }
443
531
  checkTaskStateCondition(t, s) {
444
- return typeof t == "string" ? q.evaluate(t, s) === !0 : typeof t == "object" ? Object.entries(t).every(([r, i]) => s[r] === i) : typeof t == "boolean" && t;
532
+ return typeof t == "string" ? Z.evaluate(t, s) === !0 : typeof t == "object" ? Object.entries(t).every(([i, r]) => s[i] === r) : typeof t == "boolean" && t;
445
533
  }
446
534
  async startTask(t) {
447
535
  if (this.tasks.has(t)) {
448
- const { instance: s } = this.tasks.get(t), { status: r } = s.getState();
449
- if (r !== h.STARTED && r !== h.STARTING && r !== h.STOPPING) return this.emit("start-task", t), s.start();
536
+ const { instance: s } = this.tasks.get(t), { status: i } = s.getState();
537
+ if (i !== g.STARTED && i !== g.STARTING && i !== g.STOPPING) return this.emit("start-task", t), s.start();
450
538
  }
451
539
  }
452
540
  async stopTask(t) {
453
541
  if (this.tasks.has(t)) {
454
- const { instance: s } = this.tasks.get(t), { status: r } = s.getState();
455
- if (r === h.STARTED) return this.emit("stop-task", t), s.stop("action-stop");
542
+ const { instance: s } = this.tasks.get(t), { status: i } = s.getState();
543
+ if (i === g.STARTED) return this.emit("stop-task", t), s.stop("action-stop");
456
544
  }
457
545
  }
458
546
  async restartTask(t) {
@@ -470,10 +558,10 @@ class wt extends v {
470
558
  }
471
559
  isDependentTaskReady(t) {
472
560
  if (this.tasks.has(t)) {
473
- const { dependencies: s = [], config: r } = this.tasks.get(t);
474
- if (r.mode === f.IGNORE) return !1;
475
- for (const { taskId: i, condition: o } of s) {
476
- const { instance: a } = this.tasks.get(i);
561
+ const { dependencies: s = [], config: i } = this.tasks.get(t);
562
+ if (i.mode === y.IGNORE) return !1;
563
+ for (const { taskId: r, condition: o } of s) {
564
+ const { instance: a } = this.tasks.get(r);
477
565
  if (!this.checkTaskStateCondition(o, a.getState())) return !1;
478
566
  }
479
567
  return !0;
@@ -483,60 +571,71 @@ class wt extends v {
483
571
  getDependentTasks(t) {
484
572
  let s = [];
485
573
  if (this.tasks.has(t)) {
486
- const { dependents: r } = this.tasks.get(t);
487
- if (r) s = r;
574
+ const { dependents: i } = this.tasks.get(t);
575
+ if (i) s = i;
488
576
  else {
489
- for (const [i, { dependencies: o }] of this.tasks) for (const a of o) a.taskId === t && s.push(i);
577
+ for (const [r, { dependencies: o }] of this.tasks) for (const a of o) a.taskId === t && s.push(r);
490
578
  this.tasks.get(t).dependents = s;
491
579
  }
492
580
  }
493
581
  return s;
494
582
  }
495
583
  processAction(t) {
496
- if (this.emit("process-action", t), Z(t)) {
584
+ if (this.emit("process-action", t), P(t)) {
585
+ const s = t.options.taskId;
586
+ switch (t.type) {
587
+ case d.START_TASK:
588
+ this.startTask(s);
589
+ break;
590
+ case d.RESTART_TASK:
591
+ this.restartTask(s);
592
+ break;
593
+ case d.STOP_TASK:
594
+ this.stopTask(s);
595
+ }
596
+ return;
597
+ }
598
+ if (j(t)) {
599
+ const s = t.options.triggerId;
600
+ switch (t.type) {
601
+ case d.ENABLE_TRIGGER:
602
+ this.enableTrigger(s);
603
+ break;
604
+ case d.DISABLE_TRIGGER:
605
+ this.disableTrigger(s);
606
+ }
607
+ return;
608
+ }
609
+ if (ut(t)) {
497
610
  const s = this.actionProcessors.get(t.type);
498
- s && s(t.payload || {});
499
- } else switch (t.type) {
500
- case d.START_TASK:
501
- this.startTask(t.taskId);
502
- break;
503
- case d.RESTART_TASK:
504
- this.restartTask(t.taskId);
505
- break;
506
- case d.STOP_TASK:
507
- this.stopTask(t.taskId);
508
- break;
611
+ return void (s && s(t.options || {}));
612
+ }
613
+ switch (t.type) {
509
614
  case d.EMIT_EVENT:
510
- this.emit(t.event);
615
+ this.emit(t.options.event);
511
616
  break;
512
617
  case d.STOP_PROJECT:
513
618
  this.stop("action");
514
- break;
515
- case d.ENABLE_TRIGGER:
516
- this.enableTrigger(t.triggerId);
517
- break;
518
- case d.DISABLE_TRIGGER:
519
- this.disableTrigger(t.triggerId);
520
619
  }
521
620
  }
522
621
  initTriggers() {
523
622
  const t = { processAction: this.processAction.bind(this), on: this.on.bind(this), off: this.off.bind(this) };
524
623
  let s = null;
525
- for (const r of this.config.triggers || []) {
526
- if (Q(r)) {
527
- const i = this.triggerProcessors.get(r.type);
528
- i && (s = new i(r, t));
529
- } else switch (r.type) {
530
- case l.EVENT:
531
- s = new pt(r, t);
624
+ for (const i of this.config.triggers || []) {
625
+ if (ht(i)) {
626
+ const r = this.triggerProcessors.get(i.type);
627
+ r && (s = new r(i, t));
628
+ } else switch (i.type) {
629
+ case f.EVENT:
630
+ s = new Rt(i, t);
532
631
  break;
533
- case l.INTERVAL:
534
- s = new dt(r, t);
632
+ case f.INTERVAL:
633
+ s = new kt(i, t);
535
634
  break;
536
- case l.TIMEOUT:
537
- s = new ut(r, t);
635
+ case f.TIMEOUT:
636
+ s = new At(i, t);
538
637
  }
539
- s && (this.triggers.set(r.id, s), r.disabled !== !0 && s.enable());
638
+ s && (this.triggers.set(i.id, s), i.disabled !== !0 && s.enable());
540
639
  }
541
640
  }
542
641
  cleanupTriggers() {
@@ -556,39 +655,41 @@ class wt extends v {
556
655
  }
557
656
  }
558
657
  export {
559
- pt as EventTrigger,
560
- Y as FileErrorCode,
561
- $ as ID_REGEX,
562
- dt as IntervalTrigger,
563
- J as MacrosErrorCode,
564
- wt as Project,
658
+ Rt as EventTrigger,
659
+ st as FileErrorCode,
660
+ b as ID_REGEX,
661
+ kt as IntervalTrigger,
662
+ it as MacrosErrorCode,
663
+ Yt as Project,
565
664
  d as ProjectActionType,
566
- B as ProjectConfigErrorCode,
567
- lt as ProjectErrorCode,
568
- gt as ProjectEvent,
569
- rt as ProjectSchemaErrorCode,
570
- ht as ProjectStatus,
571
- m as ProjectTaskRestartPolicyType,
572
- f as ProjectTaskStartMode,
573
- T as ProjectTaskType,
574
- l as ProjectTriggerType,
665
+ nt as ProjectConfigErrorCode,
666
+ wt as ProjectErrorCode,
667
+ _t as ProjectEvent,
668
+ Tt as ProjectSchemaErrorCode,
669
+ It as ProjectStatus,
670
+ E as ProjectTaskRestartPolicyType,
671
+ y as ProjectTaskStartMode,
672
+ S as ProjectTaskType,
673
+ f as ProjectTriggerType,
575
674
  p as RuniumError,
576
- D as RuniumTask,
577
- R as RuniumTrigger,
578
- jt as SILENT_EXIT_CODE,
579
- st as Task,
580
- k as TaskEvent,
581
- h as TaskStatus,
582
- ut as TimeoutTrigger,
583
- $t as applyMacros,
584
- ct as extendProjectSchema,
585
- at as getProjectSchema,
586
- Z as isCustomAction,
587
- Q as isCustomTrigger,
588
- b as isProcessTaskAction,
589
- At as isRuniumError,
590
- O as isToggleTriggerAction,
591
- _t as readJsonFile,
592
- et as validateProject,
593
- It as writeJsonFile
675
+ U as RuniumTask,
676
+ I as RuniumTrigger,
677
+ Ft as SILENT_EXIT_CODE,
678
+ lt as Task,
679
+ A as TaskEvent,
680
+ g as TaskStatus,
681
+ At as TimeoutTrigger,
682
+ qt as applyMacros,
683
+ Et as extendProjectSchema,
684
+ Ut as getProcessTreePids,
685
+ St as getProjectSchema,
686
+ ut as isCustomAction,
687
+ ht as isCustomTrigger,
688
+ P as isProcessTaskAction,
689
+ xt as isRuniumError,
690
+ j as isToggleTriggerAction,
691
+ ot as killProcessTree,
692
+ Mt as readJsonFile,
693
+ ft as validateProject,
694
+ Kt as writeJsonFile
594
695
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runium/core",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Runium Core",
5
5
  "author": "TheBeastApp",
6
6
  "license": "MIT",