@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.
- package/index.js +347 -246
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,97 +1,183 @@
|
|
|
1
|
-
import { readFile as
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
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,
|
|
13
|
-
super(t), this.code = s, this.payload =
|
|
15
|
+
constructor(t, s, i = null) {
|
|
16
|
+
super(t), this.code = s, this.payload = i;
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
|
-
function
|
|
19
|
+
function xt(e) {
|
|
17
20
|
return !!e && e instanceof p;
|
|
18
21
|
}
|
|
19
|
-
var
|
|
20
|
-
async function
|
|
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
|
|
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
|
|
31
|
+
async function Kt(e, t) {
|
|
29
32
|
try {
|
|
30
|
-
await
|
|
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
|
|
36
|
-
var
|
|
37
|
-
function
|
|
38
|
-
const s = Object.keys(t),
|
|
39
|
-
const a = new RegExp(
|
|
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,
|
|
44
|
+
for (; n; ) n = !1, c = c.replace(a, (u, l, Y) => {
|
|
42
45
|
n = !0;
|
|
43
|
-
const
|
|
44
|
-
let
|
|
45
|
-
for (const
|
|
46
|
-
|
|
47
|
-
const
|
|
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[
|
|
50
|
-
} catch (
|
|
51
|
-
throw new p(`Can not apply macro "${
|
|
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(
|
|
60
|
+
const a = new RegExp(rt, "g");
|
|
58
61
|
return o.replace(a, (c, n) => n.trim());
|
|
59
|
-
})(s.length ?
|
|
62
|
+
})(s.length ? r(e) : e);
|
|
60
63
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
67
|
-
|
|
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
|
|
70
|
-
return
|
|
152
|
+
function j(e) {
|
|
153
|
+
return ct.has(e.type);
|
|
71
154
|
}
|
|
72
|
-
function
|
|
73
|
-
return !
|
|
155
|
+
function ut(e) {
|
|
156
|
+
return !pt.has(e.type);
|
|
74
157
|
}
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
79
|
-
const
|
|
80
|
-
for (const
|
|
81
|
-
for (const o of
|
|
82
|
-
if (!s.has(o.taskId)) throw new p(`Task "${
|
|
83
|
-
t.get(o.taskId).push(
|
|
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
|
|
86
|
-
if (
|
|
87
|
-
if (
|
|
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
|
|
91
|
-
if (
|
|
92
|
-
if (
|
|
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(
|
|
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
|
|
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
|
|
192
|
+
for (const n of r.keys()) o.has(n) || c(n);
|
|
107
193
|
})(t);
|
|
108
194
|
}
|
|
109
|
-
function
|
|
110
|
-
(function(s,
|
|
111
|
-
const
|
|
112
|
-
if (!
|
|
113
|
-
})(e, t),
|
|
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
|
-
|
|
116
|
-
var
|
|
117
|
-
const
|
|
118
|
-
class
|
|
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
|
|
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 =
|
|
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:
|
|
148
|
-
this.process =
|
|
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
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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(([
|
|
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
|
|
177
|
-
await
|
|
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
|
|
181
|
-
await
|
|
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
|
-
|
|
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
|
|
213
|
-
const
|
|
214
|
-
function
|
|
215
|
-
return { type: "object", properties: { ...structuredClone(
|
|
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
|
|
218
|
-
|
|
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
|
|
221
|
-
const s = t ? {
|
|
222
|
-
return { type: "object", properties: { ...structuredClone(
|
|
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
|
|
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:
|
|
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
|
|
313
|
+
function Et(e, t) {
|
|
229
314
|
let s = structuredClone(e);
|
|
230
|
-
return t.project && (s = (function(
|
|
231
|
-
return
|
|
232
|
-
})(s, t.project)), t.definitions && (s = (function(
|
|
233
|
-
return
|
|
234
|
-
})(s, t.definitions)), t.tasks && (s = (function(
|
|
235
|
-
if (
|
|
236
|
-
const o = new Set(
|
|
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
|
|
323
|
+
return i.$defs[n]?.properties?.type?.const || S.DEFAULT;
|
|
239
324
|
})), a = {};
|
|
240
|
-
for (const [c, n] of Object.entries(
|
|
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] =
|
|
327
|
+
a[c] = F(n.type, n.options), i.properties.tasks.items.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
|
|
243
328
|
}
|
|
244
|
-
|
|
329
|
+
i.$defs = { ...a, ...i.$defs };
|
|
245
330
|
}
|
|
246
|
-
return
|
|
247
|
-
})(s, t.tasks)), t.actions && (s = (function(
|
|
248
|
-
if (
|
|
249
|
-
const o = new Set(
|
|
250
|
-
const n = c.$ref.split("/").pop() || "", u =
|
|
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(
|
|
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] =
|
|
340
|
+
a[c] = T(n.type, n.options), i.$defs.Runium_Action.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
|
|
256
341
|
}
|
|
257
|
-
|
|
342
|
+
i.$defs = { ...a, ...i.$defs };
|
|
258
343
|
}
|
|
259
|
-
return
|
|
260
|
-
})(s, t.actions)), t.triggers && (s = (function(
|
|
261
|
-
if (
|
|
262
|
-
const o = new Set(
|
|
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
|
|
349
|
+
return i.$defs[n]?.properties?.type?.const;
|
|
265
350
|
})), a = {};
|
|
266
|
-
for (const [c, n] of Object.entries(
|
|
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] =
|
|
353
|
+
a[c] = _(n.type, n.options), i.$defs.Runium_Trigger.oneOf.push({ $ref: `#/$defs/${c}` }), o.add(n.type);
|
|
269
354
|
}
|
|
270
|
-
|
|
355
|
+
i.$defs = { ...a, ...i.$defs };
|
|
271
356
|
}
|
|
272
|
-
return
|
|
357
|
+
return i;
|
|
273
358
|
})(s, t.triggers)), Object.freeze(s);
|
|
274
359
|
}
|
|
275
|
-
class
|
|
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
|
|
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.
|
|
390
|
+
this.processAction();
|
|
303
391
|
};
|
|
304
392
|
}
|
|
305
|
-
class
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
336
|
-
class
|
|
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 =
|
|
341
|
-
taskProcessors = /* @__PURE__ */ new Map([[
|
|
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
|
-
|
|
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:
|
|
365
|
-
o ===
|
|
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(),
|
|
373
|
-
for (const
|
|
374
|
-
const { instance: o } = this.tasks.get(
|
|
375
|
-
a ===
|
|
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(
|
|
465
|
+
await Promise.allSettled(i), this.updateState({ status: "stopped" });
|
|
378
466
|
}
|
|
379
467
|
extendValidationSchema(t) {
|
|
380
|
-
this.schema =
|
|
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
|
|
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
|
|
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 ||
|
|
404
|
-
if (!
|
|
405
|
-
const
|
|
406
|
-
|
|
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
|
-
}),
|
|
496
|
+
}), r.on(A.STDOUT, (o) => {
|
|
409
497
|
this.emit("task-stdout", t.id, o);
|
|
410
|
-
}),
|
|
498
|
+
}), r.on(A.STDERR, (o) => {
|
|
411
499
|
this.emit("task-stderr", t.id, o);
|
|
412
|
-
}), this.tasks.set(t.id, { instance:
|
|
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(),
|
|
417
|
-
if (s.has(
|
|
418
|
-
s.add(
|
|
419
|
-
const { dependencies: o = [] } = this.tasks.get(
|
|
420
|
-
for (const a of o) this.tasks.has(a.taskId) &&
|
|
421
|
-
t.push(
|
|
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
|
|
511
|
+
for (const r of this.tasks.keys()) i(r);
|
|
424
512
|
return t;
|
|
425
513
|
}
|
|
426
514
|
onTaskStateChange(t, s) {
|
|
427
|
-
const { config:
|
|
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 ===
|
|
430
|
-
const { restart: a } =
|
|
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 ===
|
|
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(
|
|
523
|
+
s.iteration <= n && setTimeout(r.restart.bind(r), u);
|
|
436
524
|
}
|
|
437
525
|
}
|
|
438
526
|
}
|
|
439
|
-
(
|
|
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" ?
|
|
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:
|
|
449
|
-
if (
|
|
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:
|
|
455
|
-
if (
|
|
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:
|
|
474
|
-
if (
|
|
475
|
-
for (const { taskId:
|
|
476
|
-
const { instance: a } = this.tasks.get(
|
|
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:
|
|
487
|
-
if (
|
|
574
|
+
const { dependents: i } = this.tasks.get(t);
|
|
575
|
+
if (i) s = i;
|
|
488
576
|
else {
|
|
489
|
-
for (const [
|
|
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),
|
|
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.
|
|
499
|
-
}
|
|
500
|
-
|
|
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
|
|
526
|
-
if (
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
} else switch (
|
|
530
|
-
case
|
|
531
|
-
s = new
|
|
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
|
|
534
|
-
s = new
|
|
632
|
+
case f.INTERVAL:
|
|
633
|
+
s = new kt(i, t);
|
|
535
634
|
break;
|
|
536
|
-
case
|
|
537
|
-
s = new
|
|
635
|
+
case f.TIMEOUT:
|
|
636
|
+
s = new At(i, t);
|
|
538
637
|
}
|
|
539
|
-
s && (this.triggers.set(
|
|
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
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
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
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
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
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
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
|
};
|