@webiny/tasks 6.3.0-beta.4 → 6.4.0-beta.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/context.js +31 -43
- package/context.js.map +1 -1
- package/crud/TaskLogPrivateModel.js +33 -27
- package/crud/TaskLogPrivateModel.js.map +1 -1
- package/crud/TaskPrivateModel.js +48 -39
- package/crud/TaskPrivateModel.js.map +1 -1
- package/crud/cleanupTaskSubtree.js +55 -69
- package/crud/cleanupTaskSubtree.js.map +1 -1
- package/crud/crud.tasks.js +289 -352
- package/crud/crud.tasks.js.map +1 -1
- package/crud/definition.tasks.js +13 -16
- package/crud/definition.tasks.js.map +1 -1
- package/crud/service.tasks.js +119 -155
- package/crud/service.tasks.js.map +1 -1
- package/decorators/RunnableTaskDecorator.js +61 -77
- package/decorators/RunnableTaskDecorator.js.map +1 -1
- package/decorators/SelfCleaningTaskDecorator.js +75 -89
- package/decorators/SelfCleaningTaskDecorator.js.map +1 -1
- package/domain/errors.js +35 -39
- package/domain/errors.js.map +1 -1
- package/events/TaskAfterCreateEvent.js +8 -5
- package/events/TaskAfterCreateEvent.js.map +1 -1
- package/events/TaskAfterDeleteEvent.js +8 -5
- package/events/TaskAfterDeleteEvent.js.map +1 -1
- package/events/TaskAfterUpdateEvent.js +8 -5
- package/events/TaskAfterUpdateEvent.js.map +1 -1
- package/events/TaskBeforeCreateEvent.js +8 -5
- package/events/TaskBeforeCreateEvent.js.map +1 -1
- package/events/TaskBeforeDeleteEvent.js +8 -5
- package/events/TaskBeforeDeleteEvent.js.map +1 -1
- package/events/TaskBeforeUpdateEvent.js +8 -5
- package/events/TaskBeforeUpdateEvent.js.map +1 -1
- package/events/abstractions.js +7 -36
- package/events/abstractions.js.map +1 -1
- package/events/index.js +0 -2
- package/features/AbortTask/AbortTaskUseCase.js +9 -8
- package/features/AbortTask/AbortTaskUseCase.js.map +1 -1
- package/features/AbortTask/abstractions.js +2 -1
- package/features/AbortTask/abstractions.js.map +1 -1
- package/features/AbortTask/feature.js +6 -5
- package/features/AbortTask/feature.js.map +1 -1
- package/features/AbortTask/index.js +0 -2
- package/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +8 -7
- package/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
- package/features/CleanupTaskSubtree/abstractions.js +2 -1
- package/features/CleanupTaskSubtree/abstractions.js.map +1 -1
- package/features/CleanupTaskSubtree/index.js +0 -2
- package/features/GetTask/GetTaskUseCase.js +8 -7
- package/features/GetTask/GetTaskUseCase.js.map +1 -1
- package/features/GetTask/abstractions.js +2 -1
- package/features/GetTask/abstractions.js.map +1 -1
- package/features/GetTask/feature.js +6 -5
- package/features/GetTask/feature.js.map +1 -1
- package/features/GetTask/index.js +0 -2
- package/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +18 -16
- package/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +1 -1
- package/features/GetTaskDefinition/abstractions.js +2 -1
- package/features/GetTaskDefinition/abstractions.js.map +1 -1
- package/features/GetTaskDefinition/feature.js +6 -5
- package/features/GetTaskDefinition/feature.js.map +1 -1
- package/features/GetTaskDefinition/index.js +0 -2
- package/features/ListTaskDefinitions/ListTaskDefinitionsUseCase.js +18 -12
- package/features/ListTaskDefinitions/ListTaskDefinitionsUseCase.js.map +1 -1
- package/features/ListTaskDefinitions/abstractions.js +2 -1
- package/features/ListTaskDefinitions/abstractions.js.map +1 -1
- package/features/ListTaskDefinitions/feature.js +6 -5
- package/features/ListTaskDefinitions/feature.js.map +1 -1
- package/features/ListTaskDefinitions/index.js +0 -2
- package/features/ListTasks/ListTasksUseCase.js +8 -7
- package/features/ListTasks/ListTasksUseCase.js.map +1 -1
- package/features/ListTasks/abstractions.js +2 -1
- package/features/ListTasks/abstractions.js.map +1 -1
- package/features/ListTasks/feature.js +6 -5
- package/features/ListTasks/feature.js.map +1 -1
- package/features/ListTasks/index.js +0 -2
- package/features/TaskController/TaskController.js +60 -60
- package/features/TaskController/TaskController.js.map +1 -1
- package/features/TaskController/augmentation.js +0 -3
- package/features/TaskController/index.js +0 -5
- package/features/TaskExecutionContext/TaskExecutionContext.js +38 -45
- package/features/TaskExecutionContext/TaskExecutionContext.js.map +1 -1
- package/features/TaskExecutionContext/abstractions.js +2 -10
- package/features/TaskExecutionContext/abstractions.js.map +1 -1
- package/features/TaskExecutionContext/feature.js +6 -5
- package/features/TaskExecutionContext/feature.js.map +1 -1
- package/features/TaskExecutionContext/index.js +0 -2
- package/features/TriggerTask/TriggerTaskUseCase.js +9 -8
- package/features/TriggerTask/TriggerTaskUseCase.js.map +1 -1
- package/features/TriggerTask/abstractions.js +2 -1
- package/features/TriggerTask/abstractions.js.map +1 -1
- package/features/TriggerTask/feature.js +6 -5
- package/features/TriggerTask/feature.js.map +1 -1
- package/features/TriggerTask/index.js +0 -2
- package/global.js +0 -2
- package/graphql/checkPermissions.js +16 -35
- package/graphql/checkPermissions.js.map +1 -1
- package/graphql/index.js +154 -187
- package/graphql/index.js.map +1 -1
- package/graphql/utils.js +15 -14
- package/graphql/utils.js.map +1 -1
- package/handler/index.js +46 -53
- package/handler/index.js.map +1 -1
- package/handler/register.js +7 -15
- package/handler/register.js.map +1 -1
- package/handler/types.js +0 -3
- package/index.js +2 -4
- package/package.json +17 -17
- package/plugins/TaskServicePlugin.js +9 -6
- package/plugins/TaskServicePlugin.js.map +1 -1
- package/plugins/index.js +0 -2
- package/response/DatabaseResponse.js +113 -132
- package/response/DatabaseResponse.js.map +1 -1
- package/response/Response.js +78 -96
- package/response/Response.js.map +1 -1
- package/response/ResponseAbortedResult.js +8 -7
- package/response/ResponseAbortedResult.js.map +1 -1
- package/response/ResponseContinueResult.js +12 -14
- package/response/ResponseContinueResult.js.map +1 -1
- package/response/ResponseDoneResult.js +10 -9
- package/response/ResponseDoneResult.js.map +1 -1
- package/response/ResponseErrorResult.js +9 -8
- package/response/ResponseErrorResult.js.map +1 -1
- package/response/TaskResponse.js +44 -64
- package/response/TaskResponse.js.map +1 -1
- package/response/abstractions/Response.js +0 -3
- package/response/abstractions/ResponseAbortedResult.js +0 -3
- package/response/abstractions/ResponseBaseResult.js +0 -3
- package/response/abstractions/ResponseContinueResult.js +0 -3
- package/response/abstractions/ResponseDoneResult.js +0 -3
- package/response/abstractions/ResponseErrorResult.js +0 -3
- package/response/abstractions/TaskResponse.js +0 -3
- package/response/abstractions/index.js +0 -2
- package/response/index.js +0 -2
- package/runner/TaskControl.js +150 -221
- package/runner/TaskControl.js.map +1 -1
- package/runner/TaskEventValidation.js +12 -13
- package/runner/TaskEventValidation.js.map +1 -1
- package/runner/TaskManager.js +68 -106
- package/runner/TaskManager.js.map +1 -1
- package/runner/TaskManagerStore.js +90 -139
- package/runner/TaskManagerStore.js.map +1 -1
- package/runner/TaskRunner.js +45 -65
- package/runner/TaskRunner.js.map +1 -1
- package/runner/abstractions/TaskControl.js +0 -3
- package/runner/abstractions/TaskEventValidation.js +0 -3
- package/runner/abstractions/TaskManager.js +0 -3
- package/runner/abstractions/TaskManagerStore.js +0 -3
- package/runner/abstractions/TaskRunner.js +0 -3
- package/runner/abstractions/index.js +0 -2
- package/runner/index.js +0 -2
- package/service/EventBridgeEventTransportPlugin.js +43 -42
- package/service/EventBridgeEventTransportPlugin.js.map +1 -1
- package/service/StepFunctionServicePlugin.js +65 -66
- package/service/StepFunctionServicePlugin.js.map +1 -1
- package/service/createService.js +10 -13
- package/service/createService.js.map +1 -1
- package/service/index.js +7 -5
- package/service/index.js.map +1 -1
- package/tasks/testingRunTask.js +11 -10
- package/tasks/testingRunTask.js.map +1 -1
- package/types.js +12 -12
- package/types.js.map +1 -1
- package/utils/ObjectUpdater.js +25 -31
- package/utils/ObjectUpdater.js.map +1 -1
- package/utils/getErrorProperties.js +5 -4
- package/utils/getErrorProperties.js.map +1 -1
- package/utils/getObjectProperties.js +8 -15
- package/utils/getObjectProperties.js.map +1 -1
- package/utils/index.js +0 -2
- package/utils/normalizeSelfCleanup.js +13 -12
- package/utils/normalizeSelfCleanup.js.map +1 -1
- package/events/index.js.map +0 -1
- package/features/AbortTask/index.js.map +0 -1
- package/features/CleanupTaskSubtree/index.js.map +0 -1
- package/features/GetTask/index.js.map +0 -1
- package/features/GetTaskDefinition/index.js.map +0 -1
- package/features/ListTaskDefinitions/index.js.map +0 -1
- package/features/ListTasks/index.js.map +0 -1
- package/features/TaskController/augmentation.js.map +0 -1
- package/features/TaskController/index.js.map +0 -1
- package/features/TaskExecutionContext/index.js.map +0 -1
- package/features/TriggerTask/index.js.map +0 -1
- package/global.js.map +0 -1
- package/handler/types.js.map +0 -1
- package/index.js.map +0 -1
- package/plugins/index.js.map +0 -1
- package/response/abstractions/Response.js.map +0 -1
- package/response/abstractions/ResponseAbortedResult.js.map +0 -1
- package/response/abstractions/ResponseBaseResult.js.map +0 -1
- package/response/abstractions/ResponseContinueResult.js.map +0 -1
- package/response/abstractions/ResponseDoneResult.js.map +0 -1
- package/response/abstractions/ResponseErrorResult.js.map +0 -1
- package/response/abstractions/TaskResponse.js.map +0 -1
- package/response/abstractions/index.js.map +0 -1
- package/response/index.js.map +0 -1
- package/runner/abstractions/TaskControl.js.map +0 -1
- package/runner/abstractions/TaskEventValidation.js.map +0 -1
- package/runner/abstractions/TaskManager.js.map +0 -1
- package/runner/abstractions/TaskManagerStore.js.map +0 -1
- package/runner/abstractions/TaskRunner.js.map +0 -1
- package/runner/abstractions/index.js.map +0 -1
- package/runner/index.js.map +0 -1
- package/utils/index.js.map +0 -1
package/runner/TaskManager.js
CHANGED
|
@@ -2,118 +2,80 @@ import { TaskDataStatus } from "../types.js";
|
|
|
2
2
|
import { getErrorProperties } from "../utils/getErrorProperties.js";
|
|
3
3
|
import { TaskResultStatus } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
4
4
|
import { TaskController } from "@webiny/api-core/features/task/TaskController/abstractions.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
async run(definition) {
|
|
12
|
-
/**
|
|
13
|
-
* If task was aborted, do not run it again, return as it was done.
|
|
14
|
-
*/
|
|
15
|
-
if (this.store.getStatus() === TaskDataStatus.ABORTED) {
|
|
16
|
-
return this.response.aborted();
|
|
5
|
+
class TaskManager {
|
|
6
|
+
constructor(context, response, store){
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.response = response;
|
|
9
|
+
this.store = store;
|
|
17
10
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return this.response.error({
|
|
33
|
-
error
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* We do not want to run the task indefinitely.
|
|
39
|
-
* If the task has reached the max iterations, we will stop it and execute the onMaxIterations handler, if any.
|
|
40
|
-
*/
|
|
41
|
-
//
|
|
42
|
-
else if (this.store.getTask().iterations >= definition.maxIterations) {
|
|
43
|
-
try {
|
|
44
|
-
if (definition.onMaxIterations) {
|
|
45
|
-
await definition.onMaxIterations({
|
|
46
|
-
task: this.store.getTask()
|
|
47
|
-
});
|
|
11
|
+
async run(definition) {
|
|
12
|
+
if (this.store.getStatus() === TaskDataStatus.ABORTED) return this.response.aborted();
|
|
13
|
+
if (this.store.getStatus() === TaskDataStatus.PENDING) try {
|
|
14
|
+
await this.store.updateTask({
|
|
15
|
+
taskStatus: TaskDataStatus.RUNNING,
|
|
16
|
+
startedOn: new Date().toISOString(),
|
|
17
|
+
executionName: this.response.event.executionName,
|
|
18
|
+
iterations: 1
|
|
19
|
+
});
|
|
20
|
+
await this.store.save();
|
|
21
|
+
} catch (error) {
|
|
22
|
+
return this.response.error({
|
|
23
|
+
error
|
|
24
|
+
});
|
|
48
25
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
26
|
+
else if (this.store.getTask().iterations >= definition.maxIterations) try {
|
|
27
|
+
if (definition.onMaxIterations) await definition.onMaxIterations({
|
|
28
|
+
task: this.store.getTask()
|
|
29
|
+
});
|
|
30
|
+
return this.response.error({
|
|
31
|
+
error: {
|
|
32
|
+
message: "Task reached max iterations."
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
} catch (ex) {
|
|
36
|
+
return this.response.error({
|
|
37
|
+
error: {
|
|
38
|
+
message: "Failed to execute onMaxIterations handler.",
|
|
39
|
+
data: getErrorProperties(ex)
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else try {
|
|
44
|
+
await this.store.updateTask((task)=>({
|
|
45
|
+
iterations: task.iterations + 1
|
|
46
|
+
}));
|
|
47
|
+
} catch (error) {
|
|
48
|
+
return this.response.error({
|
|
49
|
+
error
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
let result;
|
|
53
|
+
try {
|
|
54
|
+
const input = structuredClone(this.store.getInput());
|
|
55
|
+
const controller = this.context.container.resolve(TaskController);
|
|
56
|
+
result = await this.context.security.withoutAuthorization(async ()=>await definition.run({
|
|
57
|
+
input,
|
|
58
|
+
controller
|
|
59
|
+
}));
|
|
60
|
+
} catch (ex) {
|
|
61
|
+
return this.response.error({
|
|
62
|
+
error: getErrorProperties(ex)
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (result.status === TaskResultStatus.CONTINUE) return this.response.continue({
|
|
66
|
+
input: result.input,
|
|
67
|
+
wait: result.wait
|
|
73
68
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
error
|
|
69
|
+
if (result.status === TaskResultStatus.ERROR) return this.response.error({
|
|
70
|
+
error: result.error
|
|
77
71
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const input = structuredClone(this.store.getInput());
|
|
83
|
-
const controller = this.context.container.resolve(TaskController);
|
|
84
|
-
/**
|
|
85
|
-
* We always run the task without authorization because we are running a task without a user - nothing to authorize against.
|
|
86
|
-
*/
|
|
87
|
-
result = await this.context.security.withoutAuthorization(async () => {
|
|
88
|
-
return await definition.run({
|
|
89
|
-
input,
|
|
90
|
-
controller
|
|
72
|
+
if (result.status === TaskResultStatus.ABORTED) return this.response.aborted();
|
|
73
|
+
return this.response.done({
|
|
74
|
+
message: result.message,
|
|
75
|
+
output: result.output
|
|
91
76
|
});
|
|
92
|
-
});
|
|
93
|
-
} catch (ex) {
|
|
94
|
-
return this.response.error({
|
|
95
|
-
error: getErrorProperties(ex)
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Convert TaskDefinition.Result to IResponseResult
|
|
100
|
-
if (result.status === TaskResultStatus.CONTINUE) {
|
|
101
|
-
return this.response.continue({
|
|
102
|
-
input: result.input,
|
|
103
|
-
wait: result.wait
|
|
104
|
-
});
|
|
105
|
-
} else if (result.status === TaskResultStatus.ERROR) {
|
|
106
|
-
return this.response.error({
|
|
107
|
-
error: result.error
|
|
108
|
-
});
|
|
109
|
-
} else if (result.status === TaskResultStatus.ABORTED) {
|
|
110
|
-
return this.response.aborted();
|
|
111
77
|
}
|
|
112
|
-
return this.response.done({
|
|
113
|
-
message: result.message,
|
|
114
|
-
output: result.output
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
78
|
}
|
|
79
|
+
export { TaskManager };
|
|
118
80
|
|
|
119
81
|
//# sourceMappingURL=TaskManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"runner/TaskManager.js","sources":["../../src/runner/TaskManager.ts"],"sourcesContent":["import type { ITaskManager, ITaskManagerStorePrivate } from \"./abstractions/index.js\";\nimport type { Context } from \"~/types.js\";\nimport { TaskDataStatus } from \"~/types.js\";\nimport type { IResponse, IResponseResult } from \"~/response/abstractions/index.js\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\n\nexport class TaskManager implements ITaskManager {\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly store: ITaskManagerStorePrivate;\n\n public constructor(context: Context, response: IResponse, store: ITaskManagerStorePrivate) {\n this.context = context;\n this.response = response;\n this.store = store;\n }\n\n public async run(definition: TaskDefinition.Runnable): Promise<IResponseResult> {\n /**\n * If task was aborted, do not run it again, return as it was done.\n */\n if (this.store.getStatus() === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * If the task status is pending, update it to running and add a log.\n */\n //\n else if (this.store.getStatus() === TaskDataStatus.PENDING) {\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.RUNNING,\n startedOn: new Date().toISOString(),\n executionName: this.response.event.executionName,\n iterations: 1\n });\n await this.store.save();\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n /**\n * We do not want to run the task indefinitely.\n * If the task has reached the max iterations, we will stop it and execute the onMaxIterations handler, if any.\n */\n //\n else if (this.store.getTask().iterations >= definition.maxIterations) {\n try {\n if (definition.onMaxIterations) {\n await definition.onMaxIterations({\n task: this.store.getTask()\n });\n }\n return this.response.error({\n error: {\n message: \"Task reached max iterations.\"\n }\n });\n } catch (ex) {\n return this.response.error({\n error: {\n message: \"Failed to execute onMaxIterations handler.\",\n data: getErrorProperties(ex)\n }\n });\n }\n }\n /**\n * Always update the task iteration.\n */\n //\n else {\n try {\n await this.store.updateTask(task => {\n return {\n iterations: task.iterations + 1\n };\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n\n let result: TaskDefinition.Result;\n\n try {\n const input = structuredClone(this.store.getInput());\n const controller = this.context.container.resolve(TaskController);\n /**\n * We always run the task without authorization because we are running a task without a user - nothing to authorize against.\n */\n result = await this.context.security.withoutAuthorization(async () => {\n return await definition.run({\n input,\n controller\n });\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n // Convert TaskDefinition.Result to IResponseResult\n if (result.status === TaskResultStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResultStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResultStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"names":["TaskManager","context","response","store","definition","TaskDataStatus","Date","error","ex","getErrorProperties","task","result","input","structuredClone","controller","TaskController","TaskResultStatus"],"mappings":";;;;AAWO,MAAMA;IAKT,YAAmBC,OAAgB,EAAEC,QAAmB,EAAEC,KAA+B,CAAE;QACvF,IAAI,CAAC,OAAO,GAAGF;QACf,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,KAAK,GAAGC;IACjB;IAEA,MAAa,IAAIC,UAAmC,EAA4B;QAI5E,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOC,eAAe,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;QAM3B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOA,eAAe,OAAO,EACtD,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxB,YAAYA,eAAe,OAAO;gBAClC,WAAW,IAAIC,OAAO,WAAW;gBACjC,eAAe,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAChD,YAAY;YAChB;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;QACzB,EAAE,OAAOC,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;aAOC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,IAAIH,WAAW,aAAa,EAChE,IAAI;YACA,IAAIA,WAAW,eAAe,EAC1B,MAAMA,WAAW,eAAe,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;YAC5B;YAEJ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;gBACb;YACJ;QACJ,EAAE,OAAOI,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;oBACT,MAAMC,mBAAmBD;gBAC7B;YACJ;QACJ;aAOA,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAACE,CAAAA,OACjB;oBACH,YAAYA,KAAK,UAAU,GAAG;gBAClC;QAER,EAAE,OAAOH,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;QAGJ,IAAII;QAEJ,IAAI;YACA,MAAMC,QAAQC,gBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACjD,MAAMC,aAAa,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAACC;YAIlDJ,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,UAC/C,MAAMP,WAAW,GAAG,CAAC;oBACxBQ;oBACAE;gBACJ;QAER,EAAE,OAAON,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAOC,mBAAmBD;YAC9B;QACJ;QAGA,IAAIG,OAAO,MAAM,KAAKK,iBAAiB,QAAQ,EAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAOL,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;QACrB;QACG,IAAIA,OAAO,MAAM,KAAKK,iBAAiB,KAAK,EAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAOL,OAAO,KAAK;QACvB;QACG,IAAIA,OAAO,MAAM,KAAKK,iBAAiB,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;QAEhC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtB,SAASL,OAAO,OAAO;YACvB,QAAQA,OAAO,MAAM;QACzB;IACJ;AACJ"}
|
|
@@ -1,158 +1,109 @@
|
|
|
1
1
|
import { TaskLogItemType } from "../types.js";
|
|
2
|
-
|
|
3
|
-
* Package deep-equal does not have types.
|
|
4
|
-
*/
|
|
5
|
-
import deepEqual from "deep-equal";
|
|
2
|
+
import deep_equal from "deep-equal";
|
|
6
3
|
import { getObjectProperties } from "../utils/getObjectProperties.js";
|
|
7
4
|
import { ObjectUpdater } from "../utils/ObjectUpdater.js";
|
|
8
|
-
const getInput = (originalInput, input)
|
|
9
|
-
|
|
10
|
-
return
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
...originalInput,
|
|
14
|
-
...input
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
export class TaskManagerStore {
|
|
18
|
-
taskUpdater = new ObjectUpdater();
|
|
19
|
-
taskLogUpdater = new ObjectUpdater();
|
|
20
|
-
constructor(params) {
|
|
21
|
-
this.context = params.context;
|
|
22
|
-
this.task = params.task;
|
|
23
|
-
this.taskLog = params.log;
|
|
24
|
-
this.databaseLogs = params.databaseLogs === true;
|
|
25
|
-
}
|
|
26
|
-
getStatus() {
|
|
27
|
-
return this.task.taskStatus;
|
|
28
|
-
}
|
|
29
|
-
getTask() {
|
|
30
|
-
return this.task;
|
|
31
|
-
}
|
|
32
|
-
async listChildTasks(definitionId) {
|
|
33
|
-
const where = {
|
|
34
|
-
parentId: this.task.id
|
|
5
|
+
const getInput = (originalInput, input)=>{
|
|
6
|
+
if ("function" == typeof input) return input(originalInput);
|
|
7
|
+
return {
|
|
8
|
+
...originalInput,
|
|
9
|
+
...input
|
|
35
10
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
async updateTask(param, options) {
|
|
47
|
-
const data = typeof param === "function" ? param(this.task) : param;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* No need to update if nothing changed.
|
|
51
|
-
*/
|
|
52
|
-
if (deepEqual(data, this.task)) {
|
|
53
|
-
return;
|
|
11
|
+
};
|
|
12
|
+
class TaskManagerStore {
|
|
13
|
+
constructor(params){
|
|
14
|
+
this.taskUpdater = new ObjectUpdater();
|
|
15
|
+
this.taskLogUpdater = new ObjectUpdater();
|
|
16
|
+
this.context = params.context;
|
|
17
|
+
this.task = params.task;
|
|
18
|
+
this.taskLog = params.log;
|
|
19
|
+
this.databaseLogs = true === params.databaseLogs;
|
|
54
20
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return;
|
|
21
|
+
getStatus() {
|
|
22
|
+
return this.task.taskStatus;
|
|
58
23
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
async updateInput(param, options) {
|
|
62
|
-
const input = getInput(this.task.input, param);
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* No need to update if nothing changed.
|
|
66
|
-
*/
|
|
67
|
-
if (deepEqual(input, this.task.input)) {
|
|
68
|
-
return;
|
|
24
|
+
getTask() {
|
|
25
|
+
return this.task;
|
|
69
26
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
27
|
+
async listChildTasks(definitionId) {
|
|
28
|
+
const where = {
|
|
29
|
+
parentId: this.task.id
|
|
30
|
+
};
|
|
31
|
+
if (definitionId) where.definitionId = definitionId;
|
|
32
|
+
const result = await this.context.tasks.listTasks({
|
|
33
|
+
where,
|
|
34
|
+
sort: [
|
|
35
|
+
"createdOn_ASC"
|
|
36
|
+
],
|
|
37
|
+
limit: 1000000
|
|
38
|
+
});
|
|
39
|
+
return result.items;
|
|
75
40
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.taskUpdater.update({
|
|
83
|
-
output: values
|
|
84
|
-
});
|
|
85
|
-
if (options?.save === false) {
|
|
86
|
-
return;
|
|
41
|
+
async updateTask(param, options) {
|
|
42
|
+
const data = "function" == typeof param ? param(this.task) : param;
|
|
43
|
+
if (deep_equal(data, this.task)) return;
|
|
44
|
+
this.taskUpdater.update(data);
|
|
45
|
+
if (options?.save === false) return;
|
|
46
|
+
await this.save();
|
|
87
47
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
*/
|
|
97
|
-
async addInfoLog(log, options) {
|
|
98
|
-
if (!this.databaseLogs) {
|
|
99
|
-
return;
|
|
48
|
+
async updateInput(param, options) {
|
|
49
|
+
const input = getInput(this.task.input, param);
|
|
50
|
+
if (deep_equal(input, this.task.input)) return;
|
|
51
|
+
this.taskUpdater.update({
|
|
52
|
+
input: input
|
|
53
|
+
});
|
|
54
|
+
if (options?.save === false) return;
|
|
55
|
+
await this.save();
|
|
100
56
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
message: log.message,
|
|
104
|
-
data: log.data,
|
|
105
|
-
type: TaskLogItemType.INFO,
|
|
106
|
-
createdOn: new Date().toISOString()
|
|
107
|
-
}]
|
|
108
|
-
});
|
|
109
|
-
if (options?.save === false) {
|
|
110
|
-
return;
|
|
57
|
+
getInput() {
|
|
58
|
+
return this.task.input;
|
|
111
59
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
async addErrorLog(log, options) {
|
|
119
|
-
if (!this.databaseLogs) {
|
|
120
|
-
return;
|
|
60
|
+
async updateOutput(values, options = {}) {
|
|
61
|
+
this.taskUpdater.update({
|
|
62
|
+
output: values
|
|
63
|
+
});
|
|
64
|
+
if (options?.save === false) return;
|
|
65
|
+
await this.save();
|
|
121
66
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
*/
|
|
125
|
-
console.error(log.error);
|
|
126
|
-
/**
|
|
127
|
-
* Then update the log object.
|
|
128
|
-
*/
|
|
129
|
-
this.taskLogUpdater.update({
|
|
130
|
-
items: [{
|
|
131
|
-
message: log.message,
|
|
132
|
-
error: log.error instanceof Error ? getObjectProperties(log.error) : log.error,
|
|
133
|
-
type: TaskLogItemType.ERROR,
|
|
134
|
-
createdOn: new Date().toISOString()
|
|
135
|
-
}]
|
|
136
|
-
});
|
|
137
|
-
if (options?.save === false) {
|
|
138
|
-
return;
|
|
67
|
+
getOutput() {
|
|
68
|
+
return this.task.output;
|
|
139
69
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
70
|
+
async addInfoLog(log, options) {
|
|
71
|
+
if (!this.databaseLogs) return;
|
|
72
|
+
this.taskLogUpdater.update({
|
|
73
|
+
items: [
|
|
74
|
+
{
|
|
75
|
+
message: log.message,
|
|
76
|
+
data: log.data,
|
|
77
|
+
type: TaskLogItemType.INFO,
|
|
78
|
+
createdOn: new Date().toISOString()
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
if (options?.save === false) return;
|
|
83
|
+
await this.save();
|
|
148
84
|
}
|
|
149
|
-
|
|
150
|
-
|
|
85
|
+
async addErrorLog(log, options) {
|
|
86
|
+
if (!this.databaseLogs) return;
|
|
87
|
+
console.error(log.error);
|
|
88
|
+
this.taskLogUpdater.update({
|
|
89
|
+
items: [
|
|
90
|
+
{
|
|
91
|
+
message: log.message,
|
|
92
|
+
error: log.error instanceof Error ? getObjectProperties(log.error) : log.error,
|
|
93
|
+
type: TaskLogItemType.ERROR,
|
|
94
|
+
createdOn: new Date().toISOString()
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
});
|
|
98
|
+
if (options?.save === false) return;
|
|
99
|
+
await this.save();
|
|
151
100
|
}
|
|
152
|
-
|
|
153
|
-
|
|
101
|
+
async save() {
|
|
102
|
+
if (this.taskUpdater.isDirty()) this.task = await this.context.tasks.updateTask(this.task.id, this.taskUpdater.fetch());
|
|
103
|
+
if (!this.databaseLogs) return;
|
|
104
|
+
if (this.taskLogUpdater.isDirty()) this.taskLog = await this.context.tasks.updateLog(this.taskLog.id, this.taskLogUpdater.fetch());
|
|
154
105
|
}
|
|
155
|
-
}
|
|
156
106
|
}
|
|
107
|
+
export { TaskManagerStore };
|
|
157
108
|
|
|
158
109
|
//# sourceMappingURL=TaskManagerStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TaskLogItemType","deepEqual","getObjectProperties","ObjectUpdater","getInput","originalInput","input","TaskManagerStore","taskUpdater","taskLogUpdater","constructor","params","context","task","taskLog","log","databaseLogs","getStatus","taskStatus","getTask","listChildTasks","definitionId","where","parentId","id","result","tasks","listTasks","sort","limit","items","updateTask","param","options","data","update","save","updateInput","updateOutput","values","output","getOutput","addInfoLog","message","type","INFO","createdOn","Date","toISOString","addErrorLog","console","error","Error","ERROR","isDirty","fetch","updateLog"],"sources":["TaskManagerStore.ts"],"sourcesContent":["import type {\n IListTaskParamsWhere,\n ITask,\n ITaskDataInput,\n ITaskLog,\n ITaskManagerStoreInfoLog,\n ITaskManagerStorePrivate,\n ITaskManagerStoreSetOutputOptions,\n ITaskManagerStoreUpdateTaskInputOptions,\n ITaskManagerStoreUpdateTaskOptions,\n ITasksContextObject,\n TaskDataStatus\n} from \"~/types.js\";\nimport { TaskLogItemType } from \"~/types.js\";\nimport type {\n ITaskManagerStoreAddLogOptions,\n ITaskManagerStoreErrorLog,\n ITaskManagerStoreUpdateTaskInputParam,\n ITaskManagerStoreUpdateTaskParams\n} from \"./abstractions/index.js\";\n/**\n * Package deep-equal does not have types.\n */\nimport deepEqual from \"deep-equal\";\nimport { getObjectProperties } from \"~/utils/getObjectProperties.js\";\nimport { ObjectUpdater } from \"~/utils/ObjectUpdater.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nconst getInput = <T extends ITaskDataInput = ITaskDataInput>(\n originalInput: T,\n input: ITaskManagerStoreUpdateTaskInputParam<T>\n): T => {\n if (typeof input === \"function\") {\n return input(originalInput);\n }\n return {\n ...originalInput,\n ...input\n };\n};\n\nexport interface TaskManagerStoreContext {\n tasks: Pick<ITasksContextObject, \"updateTask\" | \"updateLog\" | \"listTasks\">;\n}\n\nexport interface ITaskManagerStoreParams {\n context: TaskManagerStoreContext;\n task: ITask;\n log: ITaskLog;\n databaseLogs: boolean;\n}\n\nexport class TaskManagerStore<\n T extends ITaskDataInput = ITaskDataInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n> implements ITaskManagerStorePrivate<T, O> {\n private readonly context: TaskManagerStoreContext;\n private task: ITask<T, O>;\n private taskLog: ITaskLog;\n private readonly databaseLogs: boolean;\n\n private readonly taskUpdater = new ObjectUpdater<ITask<T, O>>();\n private readonly taskLogUpdater = new ObjectUpdater<ITaskLog>();\n\n public constructor(params: ITaskManagerStoreParams) {\n this.context = params.context;\n this.task = params.task as ITask<T, O>;\n this.taskLog = params.log;\n this.databaseLogs = params.databaseLogs === true;\n }\n\n public getStatus(): TaskDataStatus {\n return this.task.taskStatus;\n }\n\n public getTask(): ITask<T, O> {\n return this.task as ITask<T, O>;\n }\n\n public async listChildTasks<\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(definitionId?: string): Promise<ITask<I, O>[]> {\n const where: IListTaskParamsWhere = {\n parentId: this.task.id\n };\n if (definitionId) {\n where.definitionId = definitionId;\n }\n const result = await this.context.tasks.listTasks<I, O>({\n where,\n sort: [\"createdOn_ASC\"],\n limit: 1000000\n });\n return result.items;\n }\n\n public async updateTask(\n param: ITaskManagerStoreUpdateTaskParams<T, O>,\n options?: ITaskManagerStoreUpdateTaskOptions\n ): Promise<void> {\n const data = typeof param === \"function\" ? param(this.task) : param;\n\n /**\n * No need to update if nothing changed.\n */\n if (deepEqual(data, this.task)) {\n return;\n }\n\n this.taskUpdater.update(data);\n\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public async updateInput(\n param: ITaskManagerStoreUpdateTaskInputParam<T>,\n options?: ITaskManagerStoreUpdateTaskInputOptions\n ): Promise<void> {\n const input = getInput<T>(this.task.input, param);\n\n /**\n * No need to update if nothing changed.\n */\n if (deepEqual(input, this.task.input)) {\n return;\n }\n this.taskUpdater.update({\n input: input as T\n });\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public getInput(): T {\n return this.task.input as T;\n }\n\n public async updateOutput(\n values: Partial<O>,\n options: ITaskManagerStoreSetOutputOptions = {}\n ): Promise<void> {\n this.taskUpdater.update({\n output: values as O\n });\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public getOutput(): O {\n return this.task.output as O;\n }\n /**\n * Currently the methods throws an error if something goes wrong during the database update.\n * TODO: Maybe we should wrap it into try/catch and return error if any?\n */\n public async addInfoLog(\n log: ITaskManagerStoreInfoLog,\n options?: ITaskManagerStoreAddLogOptions\n ): Promise<void> {\n if (!this.databaseLogs) {\n return;\n }\n this.taskLogUpdater.update({\n items: [\n {\n message: log.message,\n data: log.data,\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ]\n });\n if (options?.save === false) {\n return;\n }\n\n await this.save();\n }\n /**\n * Currently the methods throws an error if something goes wrong during the database update.\n * TODO: Maybe we should wrap it into try/catch and return error if any?\n */\n public async addErrorLog(\n log: ITaskManagerStoreErrorLog,\n options?: ITaskManagerStoreAddLogOptions\n ): Promise<void> {\n if (!this.databaseLogs) {\n return;\n }\n /**\n * Let's log the error to the console as well.\n */\n console.error(log.error);\n /**\n * Then update the log object.\n */\n this.taskLogUpdater.update({\n items: [\n {\n message: log.message,\n error: log.error instanceof Error ? getObjectProperties(log.error) : log.error,\n type: TaskLogItemType.ERROR,\n createdOn: new Date().toISOString()\n }\n ]\n });\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public async save(): Promise<void> {\n /**\n * Update both task and the log, if anything to update.\n */\n if (this.taskUpdater.isDirty()) {\n this.task = await this.context.tasks.updateTask<T, O>(\n this.task.id,\n this.taskUpdater.fetch()\n );\n }\n if (!this.databaseLogs) {\n return;\n }\n if (this.taskLogUpdater.isDirty()) {\n this.taskLog = await this.context.tasks.updateLog(\n this.taskLog.id,\n this.taskLogUpdater.fetch()\n );\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"runner/TaskManagerStore.js","sources":["../../src/runner/TaskManagerStore.ts"],"sourcesContent":["import type {\n IListTaskParamsWhere,\n ITask,\n ITaskDataInput,\n ITaskLog,\n ITaskManagerStoreInfoLog,\n ITaskManagerStorePrivate,\n ITaskManagerStoreSetOutputOptions,\n ITaskManagerStoreUpdateTaskInputOptions,\n ITaskManagerStoreUpdateTaskOptions,\n ITasksContextObject,\n TaskDataStatus\n} from \"~/types.js\";\nimport { TaskLogItemType } from \"~/types.js\";\nimport type {\n ITaskManagerStoreAddLogOptions,\n ITaskManagerStoreErrorLog,\n ITaskManagerStoreUpdateTaskInputParam,\n ITaskManagerStoreUpdateTaskParams\n} from \"./abstractions/index.js\";\n/**\n * Package deep-equal does not have types.\n */\nimport deepEqual from \"deep-equal\";\nimport { getObjectProperties } from \"~/utils/getObjectProperties.js\";\nimport { ObjectUpdater } from \"~/utils/ObjectUpdater.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nconst getInput = <T extends ITaskDataInput = ITaskDataInput>(\n originalInput: T,\n input: ITaskManagerStoreUpdateTaskInputParam<T>\n): T => {\n if (typeof input === \"function\") {\n return input(originalInput);\n }\n return {\n ...originalInput,\n ...input\n };\n};\n\nexport interface TaskManagerStoreContext {\n tasks: Pick<ITasksContextObject, \"updateTask\" | \"updateLog\" | \"listTasks\">;\n}\n\nexport interface ITaskManagerStoreParams {\n context: TaskManagerStoreContext;\n task: ITask;\n log: ITaskLog;\n databaseLogs: boolean;\n}\n\nexport class TaskManagerStore<\n T extends ITaskDataInput = ITaskDataInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n> implements ITaskManagerStorePrivate<T, O> {\n private readonly context: TaskManagerStoreContext;\n private task: ITask<T, O>;\n private taskLog: ITaskLog;\n private readonly databaseLogs: boolean;\n\n private readonly taskUpdater = new ObjectUpdater<ITask<T, O>>();\n private readonly taskLogUpdater = new ObjectUpdater<ITaskLog>();\n\n public constructor(params: ITaskManagerStoreParams) {\n this.context = params.context;\n this.task = params.task as ITask<T, O>;\n this.taskLog = params.log;\n this.databaseLogs = params.databaseLogs === true;\n }\n\n public getStatus(): TaskDataStatus {\n return this.task.taskStatus;\n }\n\n public getTask(): ITask<T, O> {\n return this.task as ITask<T, O>;\n }\n\n public async listChildTasks<\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(definitionId?: string): Promise<ITask<I, O>[]> {\n const where: IListTaskParamsWhere = {\n parentId: this.task.id\n };\n if (definitionId) {\n where.definitionId = definitionId;\n }\n const result = await this.context.tasks.listTasks<I, O>({\n where,\n sort: [\"createdOn_ASC\"],\n limit: 1000000\n });\n return result.items;\n }\n\n public async updateTask(\n param: ITaskManagerStoreUpdateTaskParams<T, O>,\n options?: ITaskManagerStoreUpdateTaskOptions\n ): Promise<void> {\n const data = typeof param === \"function\" ? param(this.task) : param;\n\n /**\n * No need to update if nothing changed.\n */\n if (deepEqual(data, this.task)) {\n return;\n }\n\n this.taskUpdater.update(data);\n\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public async updateInput(\n param: ITaskManagerStoreUpdateTaskInputParam<T>,\n options?: ITaskManagerStoreUpdateTaskInputOptions\n ): Promise<void> {\n const input = getInput<T>(this.task.input, param);\n\n /**\n * No need to update if nothing changed.\n */\n if (deepEqual(input, this.task.input)) {\n return;\n }\n this.taskUpdater.update({\n input: input as T\n });\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public getInput(): T {\n return this.task.input as T;\n }\n\n public async updateOutput(\n values: Partial<O>,\n options: ITaskManagerStoreSetOutputOptions = {}\n ): Promise<void> {\n this.taskUpdater.update({\n output: values as O\n });\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public getOutput(): O {\n return this.task.output as O;\n }\n /**\n * Currently the methods throws an error if something goes wrong during the database update.\n * TODO: Maybe we should wrap it into try/catch and return error if any?\n */\n public async addInfoLog(\n log: ITaskManagerStoreInfoLog,\n options?: ITaskManagerStoreAddLogOptions\n ): Promise<void> {\n if (!this.databaseLogs) {\n return;\n }\n this.taskLogUpdater.update({\n items: [\n {\n message: log.message,\n data: log.data,\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ]\n });\n if (options?.save === false) {\n return;\n }\n\n await this.save();\n }\n /**\n * Currently the methods throws an error if something goes wrong during the database update.\n * TODO: Maybe we should wrap it into try/catch and return error if any?\n */\n public async addErrorLog(\n log: ITaskManagerStoreErrorLog,\n options?: ITaskManagerStoreAddLogOptions\n ): Promise<void> {\n if (!this.databaseLogs) {\n return;\n }\n /**\n * Let's log the error to the console as well.\n */\n console.error(log.error);\n /**\n * Then update the log object.\n */\n this.taskLogUpdater.update({\n items: [\n {\n message: log.message,\n error: log.error instanceof Error ? getObjectProperties(log.error) : log.error,\n type: TaskLogItemType.ERROR,\n createdOn: new Date().toISOString()\n }\n ]\n });\n if (options?.save === false) {\n return;\n }\n await this.save();\n }\n\n public async save(): Promise<void> {\n /**\n * Update both task and the log, if anything to update.\n */\n if (this.taskUpdater.isDirty()) {\n this.task = await this.context.tasks.updateTask<T, O>(\n this.task.id,\n this.taskUpdater.fetch()\n );\n }\n if (!this.databaseLogs) {\n return;\n }\n if (this.taskLogUpdater.isDirty()) {\n this.taskLog = await this.context.tasks.updateLog(\n this.taskLog.id,\n this.taskLogUpdater.fetch()\n );\n }\n }\n}\n"],"names":["getInput","originalInput","input","TaskManagerStore","params","ObjectUpdater","definitionId","where","result","param","options","data","deepEqual","values","log","TaskLogItemType","Date","console","Error","getObjectProperties"],"mappings":"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"}
|