@webda/async 4.0.0-beta.1 → 4.0.0-beta.3

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 (41) hide show
  1. package/README.md +89 -4
  2. package/lib/{models.d.ts → asyncaction.model.d.ts} +76 -42
  3. package/lib/asyncaction.model.d.ts.map +1 -0
  4. package/lib/asyncaction.model.js +269 -0
  5. package/lib/asyncaction.model.js.map +1 -0
  6. package/lib/index.d.ts +7 -4
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.js +6 -4
  9. package/lib/index.js.map +1 -1
  10. package/lib/services/asyncevents.service.d.ts +154 -0
  11. package/lib/services/asyncevents.service.d.ts.map +1 -0
  12. package/lib/services/asyncevents.service.js +219 -0
  13. package/lib/services/asyncevents.service.js.map +1 -0
  14. package/lib/services/{asyncjobservice.d.ts → asyncjobservice.service.d.ts} +79 -74
  15. package/lib/services/asyncjobservice.service.d.ts.map +1 -0
  16. package/lib/services/asyncjobservice.service.js +584 -0
  17. package/lib/services/asyncjobservice.service.js.map +1 -0
  18. package/lib/services/{localrunner.d.ts → localrunner.service.d.ts} +24 -9
  19. package/lib/services/localrunner.service.d.ts.map +1 -0
  20. package/lib/services/localrunner.service.js +87 -0
  21. package/lib/services/localrunner.service.js.map +1 -0
  22. package/lib/services/{runner.d.ts → runner.service.d.ts} +17 -11
  23. package/lib/services/runner.service.d.ts.map +1 -0
  24. package/lib/services/{runner.js → runner.service.js} +16 -13
  25. package/lib/services/runner.service.js.map +1 -0
  26. package/lib/services/servicerunner.service.d.ts +105 -0
  27. package/lib/services/servicerunner.service.d.ts.map +1 -0
  28. package/lib/services/servicerunner.service.js +131 -0
  29. package/lib/services/servicerunner.service.js.map +1 -0
  30. package/package.json +33 -37
  31. package/webda.module.json +1895 -857
  32. package/lib/models.js +0 -177
  33. package/lib/models.js.map +0 -1
  34. package/lib/services/asyncjobservice.js +0 -505
  35. package/lib/services/asyncjobservice.js.map +0 -1
  36. package/lib/services/localrunner.js +0 -70
  37. package/lib/services/localrunner.js.map +0 -1
  38. package/lib/services/runner.js.map +0 -1
  39. package/lib/services/servicerunner.d.ts +0 -67
  40. package/lib/services/servicerunner.js +0 -97
  41. package/lib/services/servicerunner.js.map +0 -1
@@ -1,8 +1,10 @@
1
- import { ServiceParameters } from "@webda/core";
2
- import { SpawnOptions } from "child_process";
3
- import { AsyncAction } from "../models.js";
4
- import { JobInfo } from "./asyncjobservice.js";
5
- import { AgentInfo, Runner, RunnerParameters } from "./runner.js";
1
+ import { SpawnOptions } from "node:child_process";
2
+ import type { AsyncAction } from "../asyncaction.model.js";
3
+ import type { JobInfo } from "./asyncjobservice.service.js";
4
+ import { AgentInfo, Runner, RunnerParameters } from "./runner.service.js";
5
+ /**
6
+ * LocalRunner parameters
7
+ */
6
8
  export declare class LocalRunnerParameters extends RunnerParameters {
7
9
  /**
8
10
  * Command to launch
@@ -22,7 +24,12 @@ export declare class LocalRunnerParameters extends RunnerParameters {
22
24
  * Use the observability of ChildProcess to update status accordingly
23
25
  */
24
26
  autoStatus?: boolean;
25
- constructor(params: any);
27
+ /**
28
+ * @override
29
+ * @param params - the input parameters
30
+ * @returns this
31
+ */
32
+ load(params?: any): this;
26
33
  }
27
34
  /**
28
35
  * Type of action returned by LocalRunner
@@ -38,12 +45,20 @@ export interface ProcessAction {
38
45
  */
39
46
  export default class LocalRunner<T extends LocalRunnerParameters = LocalRunnerParameters> extends Runner<T> {
40
47
  /**
41
- * @inheritdoc
48
+ * Spawn the process
49
+ * @param command - the command
50
+ * @param args - the arguments
51
+ * @param options - the spawn options
52
+ * @returns the child process
42
53
  */
43
- loadParameters(params: any): ServiceParameters;
44
- spawn(command: string, args: string[], options?: SpawnOptions | undefined): import("child_process").ChildProcess;
54
+ spawn(command: string, args: string[], options?: SpawnOptions | undefined): import("node:child_process").ChildProcess;
45
55
  /**
46
56
  * @inheritdoc
57
+ * @param action - the action to launch
58
+ * @param info - the job information
59
+ * @returns the process information
47
60
  */
48
61
  launchAction(action: AsyncAction, info: JobInfo): Promise<ProcessAction>;
49
62
  }
63
+ export { LocalRunner };
64
+ //# sourceMappingURL=localrunner.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localrunner.service.d.ts","sourceRoot":"","sources":["../../src/services/localrunner.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAK3B;CACF;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,WAAW,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACzG;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,6CAGxE;IAED;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAkD7E;CACF;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { spawn } from "node:child_process";
2
+ import { Runner, RunnerParameters } from "./runner.service.js";
3
+ /**
4
+ * LocalRunner parameters
5
+ */
6
+ export class LocalRunnerParameters extends RunnerParameters {
7
+ /**
8
+ * @override
9
+ * @param params - the input parameters
10
+ * @returns this
11
+ */
12
+ load(params = {}) {
13
+ var _a;
14
+ super.load(params);
15
+ this.options ?? (this.options = {});
16
+ (_a = this.options).env ?? (_a.env = {});
17
+ return this;
18
+ }
19
+ }
20
+ /**
21
+ * Run a Job locally on the server by spawning a child process
22
+ *
23
+ * @WebdaModda
24
+ */
25
+ export default class LocalRunner extends Runner {
26
+ /**
27
+ * Spawn the process
28
+ * @param command - the command
29
+ * @param args - the arguments
30
+ * @param options - the spawn options
31
+ * @returns the child process
32
+ */
33
+ spawn(command, args, options) {
34
+ /* c8 ignore next 2 */
35
+ return spawn(command, args, options);
36
+ }
37
+ /**
38
+ * @inheritdoc
39
+ * @param action - the action to launch
40
+ * @param info - the job information
41
+ * @returns the process information
42
+ */
43
+ async launchAction(action, info) {
44
+ const envs = {
45
+ ...this.parameters.options?.env,
46
+ ...info
47
+ };
48
+ this.log("INFO", "Job", action.uuid, "started with", Object.keys(envs)
49
+ .map(k => `${k}=${envs[k]}`)
50
+ .join(" "), this.parameters.command, this.parameters.args ? this.parameters.args.map(a => `'${a}'`).join(" ") : "");
51
+ const child = this.spawn(this.parameters.command, this.parameters.args || [], {
52
+ ...this.parameters.options,
53
+ env: envs,
54
+ detached: true
55
+ });
56
+ // AutoStatus based on process info
57
+ if (this.parameters.autoStatus && child) {
58
+ const repository = action.getRepository();
59
+ // Chain the writes so concurrent output does not lose lines
60
+ let logs = Promise.resolve();
61
+ const addLog = data => {
62
+ logs = logs.then(() => repository.upsertItemToCollection(action.uuid, "logs", data.toString()));
63
+ return logs;
64
+ };
65
+ child.stdout?.on("data", addLog);
66
+ child.stderr?.on("data", addLog);
67
+ // As this is local just and mostly used for batch auto status it
68
+ await repository.patch(action.uuid, { status: "RUNNING" });
69
+ child.on("exit", async (code) => {
70
+ if (code !== 0) {
71
+ this.log("INFO", "Job", action.uuid, "errored with", code);
72
+ await repository.patch(action.uuid, { status: "ERROR" });
73
+ }
74
+ else {
75
+ this.log("INFO", "Job", action.uuid, "successful");
76
+ await repository.patch(action.uuid, { status: "SUCCESS" });
77
+ }
78
+ });
79
+ }
80
+ return {
81
+ agent: Runner.getAgentInfo(),
82
+ pid: child?.pid || -1
83
+ };
84
+ }
85
+ }
86
+ export { LocalRunner };
87
+ //# sourceMappingURL=localrunner.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localrunner.service.js","sourceRoot":"","sources":["../../src/services/localrunner.service.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,21 @@
1
1
  import { Service, ServiceParameters } from "@webda/core";
2
- import { AsyncAction } from "../models.js";
3
- import { JobInfo } from "./asyncjobservice.js";
2
+ import type { AsyncAction } from "../asyncaction.model.js";
3
+ import type { JobInfo } from "./asyncjobservice.service.js";
4
+ /**
5
+ * Runner parameters
6
+ */
4
7
  export declare class RunnerParameters extends ServiceParameters {
5
8
  /**
6
9
  * Actions managed by the runner
7
10
  * @default []
8
11
  */
9
12
  actions?: string[];
10
- constructor(params: any);
13
+ /**
14
+ * @override
15
+ * @param params - the input parameters
16
+ * @returns this
17
+ */
18
+ load(params?: any): this;
11
19
  }
12
20
  /**
13
21
  * Agent Information
@@ -29,24 +37,22 @@ export interface NodeAgentInfo extends AgentInfo {
29
37
  * Runner take and launch an action
30
38
  */
31
39
  export declare abstract class Runner<T extends RunnerParameters = RunnerParameters> extends Service<T> {
32
- /**
33
- * @inheritdoc
34
- */
35
- loadParameters(params: any): ServiceParameters;
36
40
  /**
37
41
  * Handle this type of action
38
- * @param type
39
- * @returns
42
+ * @param type - the action type
43
+ * @returns true if the runner handles it
40
44
  */
41
45
  handleType(type: string): boolean;
42
46
  /**
43
47
  * Return agent information
44
- * @returns
48
+ * @returns the agent information
45
49
  */
46
50
  static getAgentInfo(): AgentInfo;
47
51
  /**
48
52
  * Launch the action
49
- * @param action
53
+ * @param action - the action to launch
54
+ * @param info - the job information
50
55
  */
51
56
  abstract launchAction(action: AsyncAction, info: JobInfo): Promise<any>;
52
57
  }
58
+ //# sourceMappingURL=runner.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.service.d.ts","sourceRoot":"","sources":["../../src/services/runner.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE5D;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB;IACrD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAI3B;CACF;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,8BAAsB,MAAM,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAC5F;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,SAAS,CAQ/B;IACD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACzE"}
@@ -1,32 +1,35 @@
1
1
  import { Service, ServiceParameters } from "@webda/core";
2
- import * as os from "os";
2
+ import * as os from "node:os";
3
+ /**
4
+ * Runner parameters
5
+ */
3
6
  export class RunnerParameters extends ServiceParameters {
4
- constructor(params) {
5
- super(params);
7
+ /**
8
+ * @override
9
+ * @param params - the input parameters
10
+ * @returns this
11
+ */
12
+ load(params = {}) {
13
+ super.load(params);
6
14
  this.actions ?? (this.actions = []);
15
+ return this;
7
16
  }
8
17
  }
9
18
  /**
10
19
  * Runner take and launch an action
11
20
  */
12
21
  export class Runner extends Service {
13
- /**
14
- * @inheritdoc
15
- */
16
- loadParameters(params) {
17
- return new RunnerParameters(params);
18
- }
19
22
  /**
20
23
  * Handle this type of action
21
- * @param type
22
- * @returns
24
+ * @param type - the action type
25
+ * @returns true if the runner handles it
23
26
  */
24
27
  handleType(type) {
25
28
  return this.parameters.actions?.includes(type) ?? false;
26
29
  }
27
30
  /**
28
31
  * Return agent information
29
- * @returns
32
+ * @returns the agent information
30
33
  */
31
34
  static getAgentInfo() {
32
35
  return {
@@ -38,4 +41,4 @@ export class Runner extends Service {
38
41
  };
39
42
  }
40
43
  }
41
- //# sourceMappingURL=runner.js.map
44
+ //# sourceMappingURL=runner.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.service.js","sourceRoot":"","sources":["../../src/services/runner.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IAOrD;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAQ,EAAE;QACnB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,IAAI,CAAC,OAAO,KAAZ,IAAI,CAAC,OAAO,GAAK,EAAE,EAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAoBD;;GAEG;AACH,MAAM,OAAgB,MAAsD,SAAQ,OAAU;IAC5F;;;;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;CAOF"}
@@ -0,0 +1,105 @@
1
+ import { OperationContext } from "@webda/core";
2
+ import { MemoryLogger, WorkerLogLevel, WorkerMessage, WorkerOutput } from "@webda/workout";
3
+ import { AsyncAction } from "../asyncaction.model.js";
4
+ import type { JobInfo } from "./asyncjobservice.service.js";
5
+ import { AgentInfo, Runner, RunnerParameters } from "./runner.service.js";
6
+ /**
7
+ * Type of action returned by LocalRunner
8
+ */
9
+ export interface ServiceAction {
10
+ /**
11
+ * Info on the server running it
12
+ */
13
+ agent: AgentInfo;
14
+ /**
15
+ * Promise of the implementation
16
+ *
17
+ * Useful for unit test
18
+ */
19
+ promise: Promise<void>;
20
+ }
21
+ /**
22
+ * Object receiving the captured logs
23
+ */
24
+ export type ActionLogTarget = {
25
+ patch(data: {
26
+ logs: string[];
27
+ }): Promise<any>;
28
+ };
29
+ /**
30
+ * Keep log in memory and save it to the action object every 5s
31
+ */
32
+ export declare class ActionMemoryLogger extends MemoryLogger {
33
+ protected action: ActionLogTarget;
34
+ logSaveDelay: number;
35
+ format?: string;
36
+ protected timeout: NodeJS.Timeout;
37
+ /**
38
+ * @param output - the worker output to listen to
39
+ * @param level - the log level
40
+ * @param limit - the maximum number of logs
41
+ * @param action - the action to save logs to
42
+ * @param logSaveDelay - delay before saving logs
43
+ * @param format - the log format
44
+ */
45
+ constructor(output: WorkerOutput, level: WorkerLogLevel, limit: number, action: ActionLogTarget, logSaveDelay: number, format?: string);
46
+ /**
47
+ * Schedule a save on each message
48
+ * @param msg - the message
49
+ */
50
+ onMessage(msg: WorkerMessage): void;
51
+ /**
52
+ * Save the logs to the action
53
+ */
54
+ save(): Promise<void>;
55
+ /**
56
+ * Close the logger and save the logs
57
+ * @returns the save promise
58
+ */
59
+ saveAndClose(): Promise<void>;
60
+ }
61
+ /**
62
+ * Add the log format to capture
63
+ */
64
+ export declare class ServiceRunnerParameters extends RunnerParameters {
65
+ /**
66
+ * Define the log format
67
+ *
68
+ * @default ConsoleLoggerDefaultFormat
69
+ */
70
+ logFormat?: string;
71
+ /**
72
+ * How long before saving logs (in ms)
73
+ *
74
+ * @default 5000
75
+ */
76
+ logSaveDelay?: number;
77
+ /**
78
+ * @override
79
+ * @param params - the input parameters
80
+ * @returns this
81
+ */
82
+ load(params?: any): this;
83
+ }
84
+ /**
85
+ * Run a Job locally on the server by spawning a child process
86
+ *
87
+ * @WebdaModda
88
+ */
89
+ export default class ServiceRunner<T extends ServiceRunnerParameters = ServiceRunnerParameters> extends Runner<T> {
90
+ /**
91
+ * Rebuild an operation context if the action was loaded from a store
92
+ * @param context - the stored context
93
+ * @returns an operation context
94
+ */
95
+ protected getOperationContext(context: any): OperationContext;
96
+ /**
97
+ * @inheritdoc
98
+ * @param action - the action to launch
99
+ * @param info - the job information
100
+ * @returns the service action
101
+ */
102
+ launchAction(action: AsyncAction, info: JobInfo): Promise<ServiceAction>;
103
+ }
104
+ export { ServiceRunner };
105
+ //# sourceMappingURL=servicerunner.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servicerunner.service.d.ts","sourceRoot":"","sources":["../../src/services/servicerunner.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAIjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,YAAY,EAEZ,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAA0C,MAAM,yBAAyB,CAAC;AAC9F,OAAO,KAAK,EAAmB,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC;AAEhF;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAehD,SAAS,CAAC,MAAM,EAAE,eAAe;IAC1B,YAAY,EAAE,MAAM;IACpB,MAAM,CAAC,EAAE,MAAM;IAhBxB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;IAElC;;;;;;;OAOG;IACH,YACE,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,MAAM,EACH,MAAM,EAAE,eAAe,EAC1B,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EAGvB;IAED;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,aAAa,QAK3B;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1B;IAED;;;OAGG;IACG,YAAY,kBAGjB;CACF;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,gBAAgB;IAC3D;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAI3B;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC/G;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,GAAG,gBAAgB,CAQ5D;IAED;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CA6C7E;CACF;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { callOperation, OperationContext, SimpleOperationContext, useApplication, useDynamicService } from "@webda/core";
2
+ import { ConsoleLogger, MemoryLogger, useWorkerOutput } from "@webda/workout";
3
+ import { AsyncOperationAction, AsyncWebdaAction } from "../asyncaction.model.js";
4
+ import { Runner, RunnerParameters } from "./runner.service.js";
5
+ /**
6
+ * Keep log in memory and save it to the action object every 5s
7
+ */
8
+ export class ActionMemoryLogger extends MemoryLogger {
9
+ /**
10
+ * @param output - the worker output to listen to
11
+ * @param level - the log level
12
+ * @param limit - the maximum number of logs
13
+ * @param action - the action to save logs to
14
+ * @param logSaveDelay - delay before saving logs
15
+ * @param format - the log format
16
+ */
17
+ constructor(output, level, limit, action, logSaveDelay, format) {
18
+ super(output, level, limit);
19
+ this.action = action;
20
+ this.logSaveDelay = logSaveDelay;
21
+ this.format = format;
22
+ }
23
+ /**
24
+ * Schedule a save on each message
25
+ * @param msg - the message
26
+ */
27
+ onMessage(msg) {
28
+ super.onMessage(msg);
29
+ if (!this.timeout) {
30
+ this.timeout = setTimeout(() => this.save(), this.logSaveDelay);
31
+ }
32
+ }
33
+ /**
34
+ * Save the logs to the action
35
+ */
36
+ async save() {
37
+ if (this.timeout) {
38
+ clearTimeout(this.timeout);
39
+ this.timeout = undefined;
40
+ }
41
+ await this.action.patch({ logs: this.getLogs().map(msg => ConsoleLogger.format(msg, this.format)) });
42
+ }
43
+ /**
44
+ * Close the logger and save the logs
45
+ * @returns the save promise
46
+ */
47
+ async saveAndClose() {
48
+ this.close();
49
+ return this.save();
50
+ }
51
+ }
52
+ /**
53
+ * Add the log format to capture
54
+ */
55
+ export class ServiceRunnerParameters extends RunnerParameters {
56
+ /**
57
+ * @override
58
+ * @param params - the input parameters
59
+ * @returns this
60
+ */
61
+ load(params = {}) {
62
+ super.load(params);
63
+ this.logSaveDelay ?? (this.logSaveDelay = 5000);
64
+ return this;
65
+ }
66
+ }
67
+ /**
68
+ * Run a Job locally on the server by spawning a child process
69
+ *
70
+ * @WebdaModda
71
+ */
72
+ export default class ServiceRunner extends Runner {
73
+ /**
74
+ * Rebuild an operation context if the action was loaded from a store
75
+ * @param context - the stored context
76
+ * @returns an operation context
77
+ */
78
+ getOperationContext(context) {
79
+ if (context instanceof OperationContext) {
80
+ return context;
81
+ }
82
+ const input = context?.input;
83
+ return new SimpleOperationContext().setInput(Buffer.isBuffer(input) ? input : input?.type === "Buffer" ? Buffer.from(input.data) : Buffer.from("{}"));
84
+ }
85
+ /**
86
+ * @inheritdoc
87
+ * @param action - the action to launch
88
+ * @param info - the job information
89
+ * @returns the service action
90
+ */
91
+ async launchAction(action, info) {
92
+ if (!(action instanceof AsyncWebdaAction || action instanceof AsyncOperationAction)) {
93
+ this.log("ERROR", "Can only handle AsyncWebdaAction or AsyncOperationAction got", action.constructor.name);
94
+ throw new Error("Can only handle AsyncWebdaAction or AsyncOperationAction got " + action.constructor.name);
95
+ }
96
+ // Launch within current process
97
+ const promise = (async (action) => {
98
+ let logger;
99
+ try {
100
+ await action.patch({ status: "RUNNING" });
101
+ this.log("INFO", "Job", action.uuid, "started");
102
+ // Inject a MemoryLogger to capture and report any logs
103
+ logger = new ActionMemoryLogger(useApplication()?.getWorkerOutput() || useWorkerOutput(), action.logLevel, useDynamicService(info.JOB_ORCHESTRATOR)?.getParameters().logsLimit || 5000, action, this.parameters.logSaveDelay, this.parameters.logFormat);
104
+ if (action instanceof AsyncWebdaAction) {
105
+ await useDynamicService(action.serviceName)[action.method](...(action.arguments || []));
106
+ }
107
+ else {
108
+ await callOperation(this.getOperationContext(action.context), action.operationId);
109
+ }
110
+ await logger.saveAndClose();
111
+ await action.patch({ status: "SUCCESS" });
112
+ this.log("INFO", "Job", action.uuid, "finished");
113
+ }
114
+ catch (err) {
115
+ await logger?.saveAndClose();
116
+ await action.patch({
117
+ status: "ERROR",
118
+ errorMessage: err.message,
119
+ errorName: err.name
120
+ });
121
+ this.log("ERROR", "Job", action.uuid, "errored", err);
122
+ }
123
+ })(action);
124
+ return {
125
+ agent: Runner.getAgentInfo(),
126
+ promise
127
+ };
128
+ }
129
+ }
130
+ export { ServiceRunner };
131
+ //# sourceMappingURL=servicerunner.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servicerunner.service.js","sourceRoot":"","sources":["../../src/services/servicerunner.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,8 @@
1
1
  {
2
2
  "name": "@webda/async",
3
- "version": "4.0.0-beta.1",
3
+ "version": "4.0.0-beta.3",
4
4
  "description": "Async System",
5
5
  "main": "lib/index.js",
6
- "scripts": {
7
- "build": "tsc-esm",
8
- "build:module": "webda build",
9
- "build:watch": "webda build --watch",
10
- "pretest": "npm run build",
11
- "test": "c8 mocha -r ../../node_modules/ts-node/register",
12
- "test:debug": "mocha --recursive --exit --no-timeouts 'src/**/*.spec.ts'",
13
- "run": "node core"
14
- },
15
6
  "keywords": [
16
7
  "webda-module"
17
8
  ],
@@ -21,33 +12,26 @@
21
12
  "package.json"
22
13
  ],
23
14
  "dependencies": {
24
- "@webda/core": "^4.0.0-beta.1",
25
- "@webda/workout": "^4.0.0-beta.1",
26
- "axios": "^1.1.3",
15
+ "axios": "^1.14.0",
27
16
  "json-schema": "^0.4.0",
28
- "node-cron": "^3.0.2"
17
+ "node-cron": "^4.2.1",
18
+ "@webda/core": "4.0.0-beta.3",
19
+ "@webda/ql": "4.0.0-beta.3",
20
+ "@webda/utils": "4.0.0-beta.3",
21
+ "@webda/workout": "4.0.0-beta.3"
29
22
  },
30
23
  "devDependencies": {
31
- "@testdeck/mocha": "^0.3.3",
32
- "@types/node": "18.11.13",
33
- "@webda/tsc-esm": "^4.0.0-beta.1",
34
- "mocha": "^10.0.0",
35
- "sinon": "^18.0.0",
36
- "source-map-support": "^0.5.19",
37
- "ts-node": "^10.2.0",
38
- "typescript": "~5.5.3"
39
- },
40
- "c8": {
41
- "report-dir": "./reports",
42
- "reporter": [
43
- "html",
44
- "lcov",
45
- "json",
46
- "text"
47
- ],
48
- "exclude": [
49
- "**/*.spec.ts"
50
- ]
24
+ "@types/json-schema": "^7.0.15",
25
+ "@types/node": "25.5.0",
26
+ "@vitest/coverage-v8": "^4.1.2",
27
+ "jscodeshift": "^17.3.0",
28
+ "sinon": "^21.0.3",
29
+ "skott": "^0.35.8",
30
+ "typescript": "7.1.0-dev.20260929.1",
31
+ "vite": "^6.0.0",
32
+ "vitest": "^4.1.2",
33
+ "@webda/test": "4.0.0-beta.3",
34
+ "@webda/compiler": "^4.0.0-beta.3"
51
35
  },
52
36
  "bugs": {
53
37
  "url": "https://github.com/loopingz/webda.io/issues"
@@ -65,7 +49,7 @@
65
49
  },
66
50
  "type": "module",
67
51
  "engines": {
68
- "node": ">=18.0.0"
52
+ "node": ">=22.0.0"
69
53
  },
70
54
  "nx": {
71
55
  "implicitDependencies": [
@@ -73,5 +57,17 @@
73
57
  "@webda/tsc-esm"
74
58
  ]
75
59
  },
76
- "gitHead": "9f0c12d5e43b3484794b2a49c5701b8b9675c4a8"
77
- }
60
+ "license": "LGPL-3.0-only",
61
+ "scripts": {
62
+ "build": "webdac build",
63
+ "build:watch": "webdac build --watch",
64
+ "pretest": "npm run build",
65
+ "test": "vitest run",
66
+ "format": "prettier --check src/**/*",
67
+ "lint": "eslint",
68
+ "lint:fix": "eslint --fix",
69
+ "format:fix": "prettier --write src/**/*",
70
+ "deps:graph": "skott --showCircularDependencies --no-trackTypeOnlyDependencies --displayMode=raw -e .ts",
71
+ "codemod": "jscodeshift --parser=ts --extensions=tsx,ts -t ../codemod/current.mjs src"
72
+ }
73
+ }