@webda/async 3.9.3 → 4.0.0-beta.10
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/README.md +92 -8
- package/lib/asyncaction.model.d.ts +207 -0
- package/lib/asyncaction.model.d.ts.map +1 -0
- package/lib/asyncaction.model.js +269 -0
- package/lib/asyncaction.model.js.map +1 -0
- package/lib/index.d.ts +7 -5
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +6 -5
- package/lib/index.js.map +1 -1
- package/lib/services/asyncevents.service.d.ts +154 -0
- package/lib/services/asyncevents.service.d.ts.map +1 -0
- package/lib/services/asyncevents.service.js +219 -0
- package/lib/services/asyncevents.service.js.map +1 -0
- package/lib/services/{asyncjobservice.d.ts → asyncjobservice.service.d.ts} +81 -87
- package/lib/services/asyncjobservice.service.d.ts.map +1 -0
- package/lib/services/asyncjobservice.service.js +596 -0
- package/lib/services/asyncjobservice.service.js.map +1 -0
- package/lib/services/{localrunner.d.ts → localrunner.service.d.ts} +24 -9
- package/lib/services/localrunner.service.d.ts.map +1 -0
- package/lib/services/localrunner.service.js +87 -0
- package/lib/services/localrunner.service.js.map +1 -0
- package/lib/services/{runner.d.ts → runner.service.d.ts} +17 -11
- package/lib/services/runner.service.d.ts.map +1 -0
- package/lib/services/{runner.js → runner.service.js} +16 -13
- package/lib/services/runner.service.js.map +1 -0
- package/lib/services/{servicerunner.d.ts → servicerunner.service.d.ts} +39 -37
- package/lib/services/servicerunner.service.d.ts.map +1 -0
- package/lib/services/servicerunner.service.js +131 -0
- package/lib/services/servicerunner.service.js.map +1 -0
- package/package.json +35 -39
- package/webda.module.json +1910 -868
- package/lib/models.d.ts +0 -169
- package/lib/models.js +0 -177
- package/lib/models.js.map +0 -1
- package/lib/services/asyncjobservice.js +0 -521
- package/lib/services/asyncjobservice.js.map +0 -1
- package/lib/services/localrunner.js +0 -70
- package/lib/services/localrunner.js.map +0 -1
- package/lib/services/runner.js.map +0 -1
- package/lib/services/servicerunner.js +0 -152
- package/lib/services/servicerunner.js.map +0 -1
|
@@ -1,521 +0,0 @@
|
|
|
1
|
-
import { CancelableLoopPromise, CancelablePromise, Core, CronService, FileUtils, JSONUtils, OperationError, Service, ServiceParameters, SimpleOperationContext, WebdaError } from "@webda/core";
|
|
2
|
-
import axios from "axios";
|
|
3
|
-
import * as crypto from "crypto";
|
|
4
|
-
import { schedule as crontabSchedule } from "node-cron";
|
|
5
|
-
import { AsyncOperationAction, AsyncWebdaAction } from "../models.js";
|
|
6
|
-
import { Runner } from "./runner.js";
|
|
7
|
-
import ServiceRunner, { ActionMemoryLogger } from "./servicerunner.js";
|
|
8
|
-
/**
|
|
9
|
-
* @inheritdoc
|
|
10
|
-
*/
|
|
11
|
-
export class AsyncJobServiceParameters extends ServiceParameters {
|
|
12
|
-
constructor(params) {
|
|
13
|
-
super(params);
|
|
14
|
-
this.url ?? (this.url = "/async/jobs");
|
|
15
|
-
this.queue ?? (this.queue = "AsyncActionsQueue");
|
|
16
|
-
this.runners ?? (this.runners = []);
|
|
17
|
-
this.schedulerResolution ?? (this.schedulerResolution = 60000);
|
|
18
|
-
this.onlyHttpHook ?? (this.onlyHttpHook = false);
|
|
19
|
-
this.includeCron ?? (this.includeCron = true);
|
|
20
|
-
this.logsLimit ?? (this.logsLimit = 500);
|
|
21
|
-
this.asyncActionModel ?? (this.asyncActionModel = "Webda/AsyncWebdaAction");
|
|
22
|
-
this.asyncOperationModel ?? (this.asyncOperationModel = "Webda/AsyncOperationAction");
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* AsyncService allows you to launch jobs and report status
|
|
27
|
-
*
|
|
28
|
-
* @WebdaModda
|
|
29
|
-
*/
|
|
30
|
-
class AsyncJobService extends Service {
|
|
31
|
-
constructor() {
|
|
32
|
-
super(...arguments);
|
|
33
|
-
/**
|
|
34
|
-
* Validator of sessions
|
|
35
|
-
*/
|
|
36
|
-
this.operationsQueries = {};
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* @inheritdoc
|
|
40
|
-
*/
|
|
41
|
-
loadParameters(params) {
|
|
42
|
-
return new AsyncJobServiceParameters(params);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* @inheritdoc
|
|
46
|
-
*/
|
|
47
|
-
resolve() {
|
|
48
|
-
super.resolve();
|
|
49
|
-
this.model = this.getWebda().getModel(this.parameters.asyncActionModel);
|
|
50
|
-
this.queue = this.getService(this.parameters.queue);
|
|
51
|
-
if (!this.queue && !this.parameters.localLaunch) {
|
|
52
|
-
throw new Error(`AsyncService requires a valid queue. '${this.parameters.queue}' is invalid`);
|
|
53
|
-
}
|
|
54
|
-
// Get all runners
|
|
55
|
-
this.runners = this.parameters.runners
|
|
56
|
-
.map(n => {
|
|
57
|
-
const res = this.getService(n);
|
|
58
|
-
if (res === undefined) {
|
|
59
|
-
this.log("WARN", `Runner ${n} does not exist`);
|
|
60
|
-
}
|
|
61
|
-
return res;
|
|
62
|
-
})
|
|
63
|
-
.filter(r => r !== undefined);
|
|
64
|
-
// Add route for operations launch
|
|
65
|
-
if (this.parameters.asyncOperationDefinition) {
|
|
66
|
-
this.log("INFO", "Loading operations", this.parameters.asyncOperationDefinition);
|
|
67
|
-
this.addRoute(`${this.parameters.url}{?full}`, ["GET"], this.listOperations);
|
|
68
|
-
this.addRoute(`${this.parameters.url}/{operationId}{?schedule}`, ["PUT"], this.launchOperation);
|
|
69
|
-
this.registerOperations(FileUtils.load(this.parameters.asyncOperationDefinition));
|
|
70
|
-
}
|
|
71
|
-
// Load operations model
|
|
72
|
-
this.operationModel = this.getWebda().getModel(this.parameters.asyncOperationModel);
|
|
73
|
-
// This is internal job reporting so no need to document the api
|
|
74
|
-
this.addRoute(`${this.parameters.url}/status`, ["POST"], this.statusHook, { hidden: true });
|
|
75
|
-
// Add upload/download route if needed
|
|
76
|
-
if (this.parameters.binaryStore) {
|
|
77
|
-
this.binaryStore = this.getService(this.parameters.binaryStore);
|
|
78
|
-
// Call directly Webda addRoute as we are setting a route for another service in fact
|
|
79
|
-
this.getWebda().addRoute(`${this.parameters.url}/download/{store}/{uuid}/{property}/{index}`, {
|
|
80
|
-
_method: ctx => this.binaryStore.httpGet(ctx),
|
|
81
|
-
executor: this.parameters.binaryStore,
|
|
82
|
-
openapi: { hidden: true },
|
|
83
|
-
methods: ["GET"]
|
|
84
|
-
});
|
|
85
|
-
this.getWebda().addRoute(`${this.parameters.url}/upload/{store}/{uuid}/{property}`, {
|
|
86
|
-
_method: ctx => this.binaryStore.httpChallenge(ctx),
|
|
87
|
-
executor: this.parameters.binaryStore,
|
|
88
|
-
openapi: { hidden: true },
|
|
89
|
-
methods: ["PUT"]
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
this.getWebda().registerRequestFilter(this);
|
|
93
|
-
return this;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Register new operations
|
|
97
|
-
* @param operations
|
|
98
|
-
*/
|
|
99
|
-
registerOperations(operations) {
|
|
100
|
-
this.operations ?? (this.operations = {
|
|
101
|
-
application: operations.application || { name: "Unknown", version: "0.0.0" },
|
|
102
|
-
operations: {},
|
|
103
|
-
schemas: {}
|
|
104
|
-
});
|
|
105
|
-
// Register all schemas
|
|
106
|
-
Object.keys(operations?.schemas || {})
|
|
107
|
-
.filter(key => !this.getWebda().getApplication().hasSchema(key))
|
|
108
|
-
.forEach(key => {
|
|
109
|
-
this.getWebda().getApplication().registerSchema(key, operations.schemas[key]);
|
|
110
|
-
this.operations.schemas[key] = operations.schemas[key];
|
|
111
|
-
});
|
|
112
|
-
// Register all operations now
|
|
113
|
-
Object.keys(operations?.operations || {}).forEach(key => {
|
|
114
|
-
this.getWebda().registerOperation(key, {
|
|
115
|
-
...operations.operations[key],
|
|
116
|
-
method: "callOperation",
|
|
117
|
-
service: this.getName()
|
|
118
|
-
});
|
|
119
|
-
this.operations.operations[key] = operations.operations[key];
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Allow job status report url
|
|
124
|
-
*/
|
|
125
|
-
async checkRequest(context) {
|
|
126
|
-
const url = context.getHttpContext().getRelativeUri();
|
|
127
|
-
// Only for status endpoint - operations endpoint should still be authorized by something else
|
|
128
|
-
if (url === `${this.parameters.url}/status`) {
|
|
129
|
-
// Allow status url to be called without other mechanism
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Status hook for job report
|
|
136
|
-
*
|
|
137
|
-
* Only updates specific fields: status, errorMessage, statusDetails, results, logs (appending)
|
|
138
|
-
*/
|
|
139
|
-
async statusHook(context) {
|
|
140
|
-
if (!context.getHttpContext().getUniqueHeader("X-Job-Id")) {
|
|
141
|
-
throw new WebdaError.NotFound("X-Job-Id header required");
|
|
142
|
-
}
|
|
143
|
-
const action = await this.model.ref(context.getHttpContext().getUniqueHeader("X-Job-Id")).get();
|
|
144
|
-
if (!action) {
|
|
145
|
-
throw new WebdaError.NotFound(`Unknown Job Id '${context.getHttpContext().getUniqueHeader("X-Job-Id")}'`);
|
|
146
|
-
}
|
|
147
|
-
await action.checkAct(context, "status");
|
|
148
|
-
await action.statusAction(context);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Worker
|
|
152
|
-
*
|
|
153
|
-
* This will launch actions based on defined runners
|
|
154
|
-
*/
|
|
155
|
-
worker() {
|
|
156
|
-
if (this.runners.length === 0) {
|
|
157
|
-
throw new Error(`AsyncJobService.worker requires runners`);
|
|
158
|
-
}
|
|
159
|
-
let p = [this.queue.consume(this.handleEvent.bind(this))];
|
|
160
|
-
if (this.parameters.includeSchedulerInWorker) {
|
|
161
|
-
p.push(this.scheduler());
|
|
162
|
-
}
|
|
163
|
-
// Return a cancelable promise for both worker and scheduler
|
|
164
|
-
return new CancelablePromise((resolve, reject) => {
|
|
165
|
-
Promise.all(p).then(() => resolve(), reject);
|
|
166
|
-
}, async () => {
|
|
167
|
-
this.log("INFO", "Worker stopped");
|
|
168
|
-
await Promise.all(p.map(pi => (pi.cancel ? pi.cancel() : "")));
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Handle one event from the queue and launch the job
|
|
173
|
-
* @param event
|
|
174
|
-
*/
|
|
175
|
-
async handleEvent(event) {
|
|
176
|
-
let selectedRunner;
|
|
177
|
-
// Take first to acknowledge the job
|
|
178
|
-
for (let runner of this.runners) {
|
|
179
|
-
if (runner.handleType(event.type)) {
|
|
180
|
-
selectedRunner = runner;
|
|
181
|
-
break;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
// Fallback if needed
|
|
185
|
-
if (selectedRunner === undefined && this.parameters.fallbackOnFirst) {
|
|
186
|
-
selectedRunner = this.runners[0];
|
|
187
|
-
}
|
|
188
|
-
if (selectedRunner === undefined) {
|
|
189
|
-
this.log("ERROR", `Cannot find a runner for action ${event.uuid}`);
|
|
190
|
-
await this.model.ref(event.uuid).patch({ status: "ERROR", errorMessage: `No runner found for the job` });
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
this.log("INFO", `Starting action ${event.uuid}`);
|
|
194
|
-
await this.model.ref(event.uuid).patch({ uuid: event.uuid, status: "STARTING" });
|
|
195
|
-
const action = await this.model.ref(event.uuid).get();
|
|
196
|
-
const job = await selectedRunner.launchAction(action, this.getJobInfo(action));
|
|
197
|
-
await action.patch({ job }, null);
|
|
198
|
-
return job.promise || Promise.resolve();
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Get the job info
|
|
202
|
-
* @param action
|
|
203
|
-
* @returns
|
|
204
|
-
*/
|
|
205
|
-
getJobInfo(action) {
|
|
206
|
-
return {
|
|
207
|
-
JOB_SECRET_KEY: action.__secretKey,
|
|
208
|
-
JOB_ID: action.getUuid(),
|
|
209
|
-
JOB_HOOK: this.parameters.onlyHttpHook || !action.isInternal()
|
|
210
|
-
? action.getHookUrl() || this.getWebda().getApiUrl(this.parameters.url)
|
|
211
|
-
: "store", // How to find the absolute url
|
|
212
|
-
JOB_ORCHESTRATOR: this.getName()
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* List available operations through this service
|
|
217
|
-
* @param context
|
|
218
|
-
*/
|
|
219
|
-
async listOperations(context) {
|
|
220
|
-
let filtered = JSONUtils.duplicate(this.operations);
|
|
221
|
-
// Filter operations based on permissions
|
|
222
|
-
Object.keys(filtered.operations)
|
|
223
|
-
.filter(key => filtered.operations[key].permission && !this.getWebda().checkOperationPermission(context, key))
|
|
224
|
-
.forEach(key => delete filtered.operations[key]);
|
|
225
|
-
// Remove permission definition
|
|
226
|
-
Object.values(filtered.operations)
|
|
227
|
-
.filter(def => def.permission)
|
|
228
|
-
.forEach(def => delete def.permission);
|
|
229
|
-
if (!context.getParameters().full) {
|
|
230
|
-
context.write(Object.keys(filtered.operations));
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const schemas = [];
|
|
234
|
-
Object.values(filtered.operations).forEach((operation) => {
|
|
235
|
-
if (operation.input) {
|
|
236
|
-
schemas.push(operation.input);
|
|
237
|
-
}
|
|
238
|
-
if (operation.output) {
|
|
239
|
-
schemas.push(operation.output);
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
// Filter schemas
|
|
243
|
-
Object.keys(filtered.schemas)
|
|
244
|
-
.filter(key => !schemas.includes(key))
|
|
245
|
-
.forEach(key => {
|
|
246
|
-
delete filtered.schemas[key];
|
|
247
|
-
});
|
|
248
|
-
context.write(filtered);
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Call an operation for an external system
|
|
252
|
-
* @param context
|
|
253
|
-
* @returns
|
|
254
|
-
*/
|
|
255
|
-
async callOperation(context) {
|
|
256
|
-
return await this.launchAction(new this.operationModel(context.getExtension("operation"), context));
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Launch an operation through this service
|
|
260
|
-
*/
|
|
261
|
-
async launchOperation(context) {
|
|
262
|
-
const { operationId, schedule } = context.getParameters();
|
|
263
|
-
try {
|
|
264
|
-
await this.getWebda().checkOperation(context, operationId);
|
|
265
|
-
}
|
|
266
|
-
catch (err) {
|
|
267
|
-
if (err instanceof OperationError) {
|
|
268
|
-
if (err.type === "InvalidInput") {
|
|
269
|
-
throw new WebdaError.BadRequest("Invalid Input");
|
|
270
|
-
}
|
|
271
|
-
else if (err.type === "PermissionDenied") {
|
|
272
|
-
throw new WebdaError.Forbidden("Permission Denied");
|
|
273
|
-
}
|
|
274
|
-
else if (err.type === "Unknown") {
|
|
275
|
-
throw new WebdaError.NotFound("Operation not found");
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
throw err;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
let action;
|
|
283
|
-
if (schedule) {
|
|
284
|
-
action = await this.scheduleAction(new this.operationModel(operationId, await SimpleOperationContext.fromContext(context)), schedule);
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
action = await this.callOperation((await SimpleOperationContext.fromContext(context)).setExtension("operation", operationId));
|
|
288
|
-
}
|
|
289
|
-
context.write(action);
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Launch the action asynchronously
|
|
293
|
-
* @param action
|
|
294
|
-
* @returns
|
|
295
|
-
*/
|
|
296
|
-
async launchAction(action) {
|
|
297
|
-
action.status = "QUEUED";
|
|
298
|
-
action.type = action.constructor.name;
|
|
299
|
-
action.__secretKey = this.getWebda().getUuid();
|
|
300
|
-
await action.save();
|
|
301
|
-
if (this.parameters.localLaunch) {
|
|
302
|
-
// Directly call the handler but not wait for its result
|
|
303
|
-
this.handleEvent({ uuid: action.getUuid(), __secretKey: action.__secretKey, type: action.type });
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
await this.queue.sendMessage({ uuid: action.getUuid(), __secretKey: action.__secretKey, type: action.type });
|
|
307
|
-
}
|
|
308
|
-
return action;
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Schedule action for later execution
|
|
312
|
-
*
|
|
313
|
-
* @param action
|
|
314
|
-
* @param timestamp
|
|
315
|
-
*/
|
|
316
|
-
async scheduleAction(action, timestamp) {
|
|
317
|
-
action.status = "SCHEDULED";
|
|
318
|
-
action.type = action.constructor.name;
|
|
319
|
-
// Schedule based on the scheduler resolution
|
|
320
|
-
action.scheduled = timestamp - (timestamp % this.parameters.schedulerResolution);
|
|
321
|
-
await action.save();
|
|
322
|
-
return action;
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Return headers to request status hook
|
|
326
|
-
*
|
|
327
|
-
* @param jobInfo
|
|
328
|
-
* @returns
|
|
329
|
-
*/
|
|
330
|
-
getHeaders(jobInfo) {
|
|
331
|
-
let res = { "X-Job-Id": jobInfo.JOB_ID, "X-Job-Time": Date.now().toString() };
|
|
332
|
-
res["X-Job-Hash"] = crypto
|
|
333
|
-
.createHmac(AsyncJobService.HMAC_ALGO, jobInfo.JOB_SECRET_KEY)
|
|
334
|
-
.update(res["X-Job-Time"])
|
|
335
|
-
.digest("hex");
|
|
336
|
-
return res;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Post hook to a remote url or use local store to update status
|
|
340
|
-
* @param jobInfo
|
|
341
|
-
* @param message
|
|
342
|
-
* @returns
|
|
343
|
-
*/
|
|
344
|
-
async postHook(jobInfo, message) {
|
|
345
|
-
// Http allow to break paradigm between the executor and the orchestrator
|
|
346
|
-
if (jobInfo.JOB_HOOK.startsWith("http")) {
|
|
347
|
-
const data = (await axios.post(jobInfo.JOB_HOOK, message, {
|
|
348
|
-
headers: this.getHeaders(jobInfo)
|
|
349
|
-
})).data;
|
|
350
|
-
if (data.operationId) {
|
|
351
|
-
return new this.operationModel(data.operationId, data.context, data.logLevel);
|
|
352
|
-
}
|
|
353
|
-
else if (data.service && data.method) {
|
|
354
|
-
data.arguments ?? (data.arguments = []);
|
|
355
|
-
return new this.model(data.service, data.method, ...data.arguments);
|
|
356
|
-
}
|
|
357
|
-
throw new Error("Unknown action received from hook");
|
|
358
|
-
}
|
|
359
|
-
else if (jobInfo.JOB_HOOK === "store") {
|
|
360
|
-
// If executor and orchestrator runs within same privilege it simplify the infrastructure
|
|
361
|
-
const model = await this.model.ref(jobInfo.JOB_ID).get();
|
|
362
|
-
await model.patch(message, null);
|
|
363
|
-
return model;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Launch a service.method as an AsyncAction
|
|
368
|
-
* @param serviceName
|
|
369
|
-
* @param method
|
|
370
|
-
* @param args
|
|
371
|
-
*/
|
|
372
|
-
async launchAsAsyncAction(serviceName, method, ...args) {
|
|
373
|
-
return this.launchAction(new this.model(serviceName, method, ...args));
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Execute a service.method as an AsyncAction
|
|
377
|
-
*
|
|
378
|
-
* Useful for crontab execution
|
|
379
|
-
* @param serviceName
|
|
380
|
-
* @param method
|
|
381
|
-
* @param args
|
|
382
|
-
*/
|
|
383
|
-
async executeAsAsyncAction(serviceName, method, ...args) {
|
|
384
|
-
let runner = Object.values(this.getWebda().getServicesOfType(ServiceRunner)).shift();
|
|
385
|
-
// Create a temporary one if needed
|
|
386
|
-
runner ?? (runner = await new ServiceRunner(this.getWebda(), this.getName() + "_temprunner").resolve().init());
|
|
387
|
-
// Save action
|
|
388
|
-
const action = await new this.model(serviceName, method, ...args).save();
|
|
389
|
-
// Run it
|
|
390
|
-
return (await runner.launchAction(action, this.getJobInfo(action))).promise;
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Wrap async job and call the job status hook
|
|
394
|
-
*/
|
|
395
|
-
async runAsyncOperationAction(jobInfo) {
|
|
396
|
-
// Get it from environment
|
|
397
|
-
if (jobInfo === undefined) {
|
|
398
|
-
jobInfo = {};
|
|
399
|
-
Object.keys(process.env)
|
|
400
|
-
.filter(k => k.startsWith("JOB_"))
|
|
401
|
-
// @ts-ignore
|
|
402
|
-
.forEach((k) => (jobInfo[k] = process.env[k]));
|
|
403
|
-
}
|
|
404
|
-
// Ensure correct context
|
|
405
|
-
if (!jobInfo.JOB_ORCHESTRATOR || !jobInfo.JOB_ID || !jobInfo.JOB_SECRET_KEY || !jobInfo.JOB_HOOK) {
|
|
406
|
-
this.log("ERROR", "Cannot run AsyncAction without context");
|
|
407
|
-
throw new Error("Cannot run AsyncAction without context");
|
|
408
|
-
}
|
|
409
|
-
// If we are not the target redirect to the right one
|
|
410
|
-
if (jobInfo.JOB_ORCHESTRATOR !== this.getName()) {
|
|
411
|
-
this.log("DEBUG", `Passing jobInfo ${JSON.stringify(jobInfo)} to targeted service`);
|
|
412
|
-
return this.getService(jobInfo.JOB_ORCHESTRATOR).runAsyncOperationAction(jobInfo);
|
|
413
|
-
}
|
|
414
|
-
this.log("DEBUG", "Getting action to execute from hook", jobInfo);
|
|
415
|
-
let results, logger, errorMessage;
|
|
416
|
-
let status = "SUCCESS";
|
|
417
|
-
try {
|
|
418
|
-
// Get action info by calling the hook
|
|
419
|
-
let action = await this.postHook(jobInfo, {
|
|
420
|
-
agent: { ...Runner.getAgentInfo(), nodeVersion: process.version },
|
|
421
|
-
status: "RUNNING"
|
|
422
|
-
});
|
|
423
|
-
logger = new ActionMemoryLogger(this.getWebda().getWorkerOutput(), action.logLevel, this.parameters.logsLimit || 5000, async (logs) => {
|
|
424
|
-
// Send logs to the hook
|
|
425
|
-
if (jobInfo && jobInfo.JOB_HOOK) {
|
|
426
|
-
await this.postHook(jobInfo, {
|
|
427
|
-
logs
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
}, this.parameters.logSaveDelay, this.parameters.logFormat);
|
|
431
|
-
if (action instanceof AsyncWebdaAction) {
|
|
432
|
-
// Check it contains the right info
|
|
433
|
-
if (!action.method || !action.serviceName) {
|
|
434
|
-
throw new Error("WebdaAsyncAction must have method and serviceName defined at least");
|
|
435
|
-
}
|
|
436
|
-
// Call the service[method](...args)
|
|
437
|
-
let service = this.getService(action.serviceName);
|
|
438
|
-
if (!service) {
|
|
439
|
-
throw new Error(`WebdaAsyncAction Service '${action.serviceName}' not found: mismatch app version`);
|
|
440
|
-
}
|
|
441
|
-
// @ts-ignore
|
|
442
|
-
if (!service[action.method]) {
|
|
443
|
-
throw new Error(`WebdaAsyncAction Method '${action.method}' not found in service ${action.serviceName}: mismatch app version`);
|
|
444
|
-
}
|
|
445
|
-
// @ts-ignore
|
|
446
|
-
results = await service[action.method](...(action.arguments || []));
|
|
447
|
-
}
|
|
448
|
-
else if (action instanceof AsyncOperationAction) {
|
|
449
|
-
// Call the operation
|
|
450
|
-
let ctx = new SimpleOperationContext(this.getWebda());
|
|
451
|
-
// Unserialization might not have happened
|
|
452
|
-
ctx.setSession(action.context.getSession ? action.context.getSession() : action.context["session"]);
|
|
453
|
-
// Unserialization might not have happened
|
|
454
|
-
ctx.setInput(Buffer.from(action.context["input"]?.data || []));
|
|
455
|
-
// Set the logger in extension
|
|
456
|
-
ctx.setExtension("actionLogger", logger);
|
|
457
|
-
// Call the operation
|
|
458
|
-
this.log("TRACE", `Calling operation ${action.operationId}`);
|
|
459
|
-
await this.getWebda().callOperation(ctx, action.operationId);
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
catch (err) {
|
|
463
|
-
// Job is in error
|
|
464
|
-
errorMessage = err?.message;
|
|
465
|
-
status = "ERROR";
|
|
466
|
-
}
|
|
467
|
-
logger?.close(true);
|
|
468
|
-
// Update status
|
|
469
|
-
await this.postHook(jobInfo, { results, status, errorMessage, logs: logger?.getFormattedLogs() });
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* Get the cron callback function
|
|
473
|
-
* @param cron
|
|
474
|
-
* @returns
|
|
475
|
-
*/
|
|
476
|
-
getCronExecutor(cron) {
|
|
477
|
-
return async () => {
|
|
478
|
-
try {
|
|
479
|
-
this.log("INFO", `Execute cron ${cron.cron}: ${cron.serviceName}.${cron.method}(...) # ${cron.description} as an AsyncOperationAction`);
|
|
480
|
-
await this.launchAction(new this.model(cron.serviceName, cron.method, cron.args));
|
|
481
|
-
}
|
|
482
|
-
catch (err) {
|
|
483
|
-
this.log("ERROR", `Execution error cron ${cron.cron}: ${cron.serviceName}.${cron.method}(...) # ${cron.description} - ${err}`);
|
|
484
|
-
}
|
|
485
|
-
};
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* Manage scheduled actions and crontab actions
|
|
489
|
-
* @returns
|
|
490
|
-
*/
|
|
491
|
-
scheduler() {
|
|
492
|
-
// Map cron to an AsyncOperationAction
|
|
493
|
-
// It allows you to keep a trace of the cron execution in the AsyncAction
|
|
494
|
-
if (this.parameters.includeCron) {
|
|
495
|
-
CronService.loadAnnotations(this._webda.getServices()).forEach(cron => {
|
|
496
|
-
this.log("INFO", `Schedule cron ${cron.cron}: ${cron.serviceName}.${cron.method}(...) # ${cron.description}`);
|
|
497
|
-
crontabSchedule(cron.cron, this.getCronExecutor(cron));
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
// Every schedulerResolution will check for scheduled task
|
|
501
|
-
return new CancelableLoopPromise(async () => {
|
|
502
|
-
let time = Date.now();
|
|
503
|
-
time -= time % this.parameters.schedulerResolution;
|
|
504
|
-
// Queue all actions
|
|
505
|
-
await Promise.all((await this.model.query(`status = 'SCHEDULED' AND scheduled < ${time + 1}`)).results.map(a => this.launchAction(a)));
|
|
506
|
-
time += this.parameters.schedulerResolution;
|
|
507
|
-
// Wait for next scheduler resolution
|
|
508
|
-
if (time > Date.now()) {
|
|
509
|
-
await Core.sleep(time - Date.now());
|
|
510
|
-
/* c8 ignore next */
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* HMAC Algorithm used for simple auth
|
|
517
|
-
*/
|
|
518
|
-
AsyncJobService.HMAC_ALGO = "sha256";
|
|
519
|
-
export default AsyncJobService;
|
|
520
|
-
export { AsyncJobService };
|
|
521
|
-
//# sourceMappingURL=asyncjobservice.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"asyncjobservice.js","sourceRoot":"","sources":["../../src/services/asyncjobservice.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EAGjB,IAAI,EAGJ,WAAW,EACX,SAAS,EACT,SAAS,EAET,cAAc,EAGd,OAAO,EACP,iBAAiB,EACjB,sBAAsB,EAGtB,UAAU,EAEX,MAAM,aAAa,CAAC;AAErB,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAqC,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACtG,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,aAAa,EAAE,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAYpE;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,iBAAiB;IA4G9D,YAAY,MAAW;QACrB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,KAAR,IAAI,CAAC,GAAG,GAAK,aAAa,EAAC;QAC3B,IAAI,CAAC,KAAK,KAAV,IAAI,CAAC,KAAK,GAAK,mBAAmB,EAAC;QACnC,IAAI,CAAC,OAAO,KAAZ,IAAI,CAAC,OAAO,GAAK,EAAE,EAAC;QACpB,IAAI,CAAC,mBAAmB,KAAxB,IAAI,CAAC,mBAAmB,GAAK,KAAK,EAAC;QACnC,IAAI,CAAC,YAAY,KAAjB,IAAI,CAAC,YAAY,GAAK,KAAK,EAAC;QAC5B,IAAI,CAAC,WAAW,KAAhB,IAAI,CAAC,WAAW,GAAK,IAAI,EAAC;QAC1B,IAAI,CAAC,SAAS,KAAd,IAAI,CAAC,SAAS,GAAK,GAAG,EAAC;QACvB,IAAI,CAAC,gBAAgB,KAArB,IAAI,CAAC,gBAAgB,GAAK,wBAAwB,EAAC;QACnD,IAAI,CAAC,mBAAmB,KAAxB,IAAI,CAAC,mBAAmB,GAAK,4BAA4B,EAAC;IAC5D,CAAC;CACF;AAED;;;;GAIG;AACH,MAAqB,eACnB,SAAQ,OAAU;IADpB;;QAyCE;;WAEG;QACO,sBAAiB,GAA8C,EAAE,CAAC;IAkhB9E,CAAC;IAhhBC;;OAEG;IACH,cAAc,CAAC,MAAW;QACxB,OAAO,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD;;OAEG;IACH,OAAO;QACL,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,UAAU,CAAC,KAAK,cAAc,CAAC,CAAC;QAChG,CAAC;QACD,kBAAkB;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAS,CAAC,CAAC,CAAC;YACvC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAEhC,kCAAkC;QAClC,IAAI,IAAI,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;YACjF,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7E,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,2BAA2B,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAChG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,cAAc,GAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QAEzF,gEAAgE;QAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5F,sCAAsC;QACtC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAc,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7E,qFAAqF;YACrF,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,6CAA6C,EAAE;gBAC5F,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;gBAC7C,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;gBACrC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACzB,OAAO,EAAE,CAAC,KAAK,CAAC;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,mCAAmC,EAAE;gBAClF,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC;gBACnD,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;gBACrC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBACzB,OAAO,EAAE,CAAC,KAAK,CAAC;aACjB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,UAAkC;QACnD,IAAI,CAAC,UAAU,KAAf,IAAI,CAAC,UAAU,GAAK;YAClB,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;YAC5E,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,EAAE;SACZ,EAAC;QACF,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;aACnC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;aAC/D,OAAO,CAAC,GAAG,CAAC,EAAE;YACb,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QACL,8BAA8B;QAC9B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtD,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE;gBACrC,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC7B,MAAM,EAAE,eAAe;gBACvB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aACxB,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAmB;QACpC,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,cAAc,EAAE,CAAC;QACtD,8FAA8F;QAC9F,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC;YAC5C,wDAAwD;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,UAAU,CAAC,OAAmB;QAC5C,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAChG,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,mBAAmB,OAAO,CAAC,cAAc,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,GAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,4DAA4D;QAC5D,OAAO,IAAI,iBAAiB,CAC1B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACnC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,WAAW,CAAC,KAA2B;QACrD,IAAI,cAAc,CAAC;QACnB,oCAAoC;QACpC,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,cAAc,GAAG,MAAM,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;QACD,qBAAqB;QACrB,IAAI,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YACpE,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,mCAAmC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACzG,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,MAAmB;QAC5B,OAAO;YACL,cAAc,EAAE,MAAM,CAAC,WAAW;YAClC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE;YACxB,QAAQ,EACN,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAClD,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACvE,CAAC,CAAC,OAAO,EAAE,+BAA+B;YAC9C,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE;SACjC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,OAQC;QAED,IAAI,QAAQ,GAA2B,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5E,yCAAyC;QACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;aAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;aAC7G,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAEnD,+BAA+B;QAC/B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;aAC/B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;aAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,SAAc,EAAE,EAAE;YAC5D,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,iBAAiB;QACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;aAC1B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aACrC,OAAO,CAAC,GAAG,CAAC,EAAE;YACb,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACL,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,OAAyB;QAC3C,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACtG,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAmB;QACvC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;gBAClC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAChC,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;gBACnD,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBAC3C,MAAM,IAAI,UAAU,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;gBACtD,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAClC,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC;QACX,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAChC,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EACvF,QAAQ,CACT,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAC/B,CAAC,MAAM,sBAAsB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAC3F,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,MAAmB;QACpC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;QACtC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAChC,wDAAwD;YACxD,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,MAAmB,EAAE,SAAiB;QACzD,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;QAC5B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;QACtC,6CAA6C;QAC7C,MAAM,CAAC,SAAS,GAAG,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACjF,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,GAAG,GAA8B,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzG,GAAG,CAAC,YAAY,CAAC,GAAG,MAAM;aACvB,UAAU,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC;aAC7D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aACzB,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAgB,EAAE,OAAY;QAC3C,yEAAyE;QACzE,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAQ,CAChB,MAAM,KAAK,CAAC,IAAI,CAAuC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE;gBAChF,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;aAClC,CAAC,CACH,CAAC,IAAI,CAAC;YACP,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChF,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvC,IAAI,CAAC,SAAS,KAAd,IAAI,CAAC,SAAS,GAAK,EAAE,EAAC;gBACtB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACxC,yFAAyF;YACzF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACjC,OAAyB,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,MAAc,EAAE,GAAG,IAAW;QAC3E,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,oBAAoB,CAAC,WAAmB,EAAE,MAAc,EAAE,GAAG,IAAI;QACrE,IAAI,MAAM,GAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACpG,mCAAmC;QACnC,MAAM,KAAN,MAAM,GAAK,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAC;QACrG,cAAc;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,SAAS;QACT,OAAO,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAAC,OAAiB;QAC7C,0BAA0B;QAC1B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClC,aAAa;iBACZ,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,yBAAyB;QACzB,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,wCAAwC,CAAC,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,qDAAqD;QACrD,IAAI,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACpF,OAAO,IAAI,CAAC,UAAU,CAAkB,OAAO,CAAC,gBAAgB,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qCAAqC,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC;QAClC,IAAI,MAAM,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC;YACH,sCAAsC;YACtC,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBACxC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE;gBACjE,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YACH,MAAM,GAAG,IAAI,kBAAkB,CAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE,EACjC,MAAM,CAAC,QAAQ,EACf,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,EACjC,KAAK,EAAE,IAAc,EAAE,EAAE;gBACvB,wBAAwB;gBACxB,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;wBAC3B,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,EACD,IAAI,CAAC,UAAU,CAAC,YAAY,EAC5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAC1B,CAAC;YACF,IAAI,MAAM,YAAY,gBAAgB,EAAE,CAAC;gBACvC,mCAAmC;gBACnC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC1C,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACxF,CAAC;gBACD,oCAAoC;gBACpC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,WAAW,mCAAmC,CAAC,CAAC;gBACtG,CAAC;gBACD,aAAa;gBACb,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,CAAC,MAAM,0BAA0B,MAAM,CAAC,WAAW,wBAAwB,CAC9G,CAAC;gBACJ,CAAC;gBACD,aAAa;gBACb,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,IAAI,MAAM,YAAY,oBAAoB,EAAE,CAAC;gBAClD,qBAAqB;gBACrB,IAAI,GAAG,GAA2B,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9E,0CAA0C;gBAC1C,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpG,0CAA0C;gBAC1C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/D,8BAA8B;gBAC9B,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBACzC,qBAAqB;gBACrB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7D,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB;YAClB,YAAY,GAAG,GAAG,EAAE,OAAO,CAAC;YAC5B,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;QACD,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,gBAAgB;QAChB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,IAAoB;QAClC,OAAO,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CACN,MAAM,EACN,gBAAgB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,WAAW,6BAA6B,CACtH,CAAC;gBACF,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CACN,OAAO,EACP,wBAAwB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,WAAW,MAAM,GAAG,EAAE,CAC5G,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,sCAAsC;QACtC,yEAAyE;QACzE,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAChC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACpE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9G,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC;QACD,0DAA0D;QAC1D,OAAO,IAAI,qBAAqB,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;YACnD,oBAAoB;YACpB,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC3F,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CACrB,CACF,CAAC;YACF,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAC5C,qCAAqC;YACrC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpC,oBAAoB;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;;AA5iBD;;GAEG;AACI,yBAAS,GAAW,QAAQ,AAAnB,CAAoB;eApBjB,eAAe;AAgkBpC,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { spawn } from "child_process";
|
|
2
|
-
import { Runner, RunnerParameters } from "./runner.js";
|
|
3
|
-
export class LocalRunnerParameters extends RunnerParameters {
|
|
4
|
-
constructor(params) {
|
|
5
|
-
var _a;
|
|
6
|
-
super(params);
|
|
7
|
-
this.options ?? (this.options = {});
|
|
8
|
-
(_a = this.options).env ?? (_a.env = {});
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Run a Job locally on the server by spawning a child process
|
|
13
|
-
*
|
|
14
|
-
* @WebdaModda
|
|
15
|
-
*/
|
|
16
|
-
export default class LocalRunner extends Runner {
|
|
17
|
-
/**
|
|
18
|
-
* @inheritdoc
|
|
19
|
-
*/
|
|
20
|
-
loadParameters(params) {
|
|
21
|
-
return new LocalRunnerParameters(params);
|
|
22
|
-
}
|
|
23
|
-
spawn(command, args, options) {
|
|
24
|
-
/* c8 ignore next 2 */
|
|
25
|
-
return spawn(command, args, options);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* @inheritdoc
|
|
29
|
-
*/
|
|
30
|
-
async launchAction(action, info) {
|
|
31
|
-
let envs = {
|
|
32
|
-
...this.parameters.options?.env,
|
|
33
|
-
...info
|
|
34
|
-
};
|
|
35
|
-
this.log("INFO", "Job", action.getUuid(), "started with", Object.keys(envs)
|
|
36
|
-
.map(k => `${k}=${envs[k]}`)
|
|
37
|
-
.join(" "), this.parameters.command, this.parameters.args ? this.parameters.args.map(a => `'${a}'`).join(" ") : "");
|
|
38
|
-
const child = this.spawn(this.parameters.command, this.parameters.args || [], {
|
|
39
|
-
...this.parameters.options,
|
|
40
|
-
env: envs,
|
|
41
|
-
detached: true
|
|
42
|
-
});
|
|
43
|
-
// AutoStatus based on process info
|
|
44
|
-
if (this.parameters.autoStatus && child) {
|
|
45
|
-
child.stdout?.on("data", data => {
|
|
46
|
-
action.getStore().upsertItemToCollection(action.getUuid(), "logs", data);
|
|
47
|
-
});
|
|
48
|
-
child.stderr?.on("data", data => {
|
|
49
|
-
action.getStore().upsertItemToCollection(action.getUuid(), "logs", data);
|
|
50
|
-
});
|
|
51
|
-
// As this is local just and mostly used for batch auto status it
|
|
52
|
-
await action.getStore().patch({ uuid: action.getUuid(), status: "RUNNING" });
|
|
53
|
-
child.on("exit", async (code) => {
|
|
54
|
-
if (code !== 0) {
|
|
55
|
-
this.log("INFO", "Job", action.getUuid(), "errored with", code);
|
|
56
|
-
await action.getStore().patch({ uuid: action.getUuid(), status: "ERROR" });
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
this.log("INFO", "Job", action.getUuid(), "successful");
|
|
60
|
-
await action.getStore().patch({ uuid: action.getUuid(), status: "SUCCESS" });
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
agent: Runner.getAgentInfo(),
|
|
66
|
-
pid: child?.pid || -1
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=localrunner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"localrunner.js","sourceRoot":"","sources":["../../src/services/localrunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/services/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAIzB,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IAOrD,YAAY,MAAW;QACrB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,OAAO,KAAZ,IAAI,CAAC,OAAO,GAAK,EAAE,EAAC;IACtB,CAAC;CACF;AAoBD;;GAEG;AACH,MAAM,OAAgB,MAAsD,SAAQ,OAAU;IAC5F;;OAEG;IACH,cAAc,CAAC,MAAW;QACxB,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD;;;;OAIG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO;YACL,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;YACrB,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE;YACrB,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;SAChB,CAAC;IACJ,CAAC;CAMF"}
|