@webiny/tasks 5.39.2 → 5.39.3-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.
Files changed (82) hide show
  1. package/crud/EventBridgeEventTransport.d.ts +16 -0
  2. package/crud/EventBridgeEventTransport.js +57 -0
  3. package/crud/EventBridgeEventTransport.js.map +1 -0
  4. package/crud/crud.tasks.js +89 -52
  5. package/crud/crud.tasks.js.map +1 -1
  6. package/crud/model.js +1 -5
  7. package/crud/model.js.map +1 -1
  8. package/crud/trigger.tasks.js +26 -5
  9. package/crud/trigger.tasks.js.map +1 -1
  10. package/graphql/index.js +1 -1
  11. package/graphql/index.js.map +1 -1
  12. package/handler/index.d.ts +2 -2
  13. package/handler/index.js +17 -3
  14. package/handler/index.js.map +1 -1
  15. package/handler/types.d.ts +4 -0
  16. package/handler/types.js.map +1 -1
  17. package/package.json +19 -18
  18. package/response/DatabaseResponse.d.ts +2 -2
  19. package/response/DatabaseResponse.js +7 -1
  20. package/response/DatabaseResponse.js.map +1 -1
  21. package/response/Response.d.ts +3 -1
  22. package/response/Response.js +7 -1
  23. package/response/Response.js.map +1 -1
  24. package/response/ResponseAbortedResult.js +1 -1
  25. package/response/ResponseAbortedResult.js.map +1 -1
  26. package/response/ResponseContinueResult.d.ts +5 -1
  27. package/response/ResponseContinueResult.js +4 -0
  28. package/response/ResponseContinueResult.js.map +1 -1
  29. package/response/TaskResponse.d.ts +1 -1
  30. package/response/TaskResponse.js +6 -1
  31. package/response/TaskResponse.js.map +1 -1
  32. package/response/abstractions/Response.d.ts +1 -0
  33. package/response/abstractions/Response.js.map +1 -1
  34. package/response/abstractions/ResponseContinueResult.d.ts +1 -0
  35. package/response/abstractions/ResponseContinueResult.js.map +1 -1
  36. package/response/abstractions/TaskResponse.d.ts +7 -2
  37. package/response/abstractions/TaskResponse.js.map +1 -1
  38. package/runner/TaskManager.d.ts +2 -3
  39. package/runner/TaskManager.js +23 -20
  40. package/runner/TaskManager.js.map +1 -1
  41. package/runner/TaskManagerStore.d.ts +14 -10
  42. package/runner/TaskManagerStore.js +56 -19
  43. package/runner/TaskManagerStore.js.map +1 -1
  44. package/runner/TaskRunner.d.ts +7 -12
  45. package/runner/TaskRunner.js +22 -15
  46. package/runner/TaskRunner.js.map +1 -1
  47. package/runner/abstractions/TaskManagerStore.d.ts +52 -13
  48. package/runner/abstractions/TaskManagerStore.js.map +1 -1
  49. package/runner/abstractions/TaskRunner.d.ts +1 -7
  50. package/runner/abstractions/TaskRunner.js.map +1 -1
  51. package/task/plugin.js +1 -1
  52. package/task/plugin.js.map +1 -1
  53. package/timer/CustomTimer.d.ts +6 -0
  54. package/timer/CustomTimer.js +21 -0
  55. package/timer/CustomTimer.js.map +1 -0
  56. package/timer/Timer.d.ts +9 -0
  57. package/timer/Timer.js +17 -0
  58. package/timer/Timer.js.map +1 -0
  59. package/timer/abstractions/ITimer.d.ts +6 -0
  60. package/timer/abstractions/ITimer.js +7 -0
  61. package/timer/abstractions/ITimer.js.map +1 -0
  62. package/timer/factory.d.ts +4 -0
  63. package/timer/factory.js +20 -0
  64. package/timer/factory.js.map +1 -0
  65. package/timer/index.d.ts +4 -0
  66. package/timer/index.js +51 -0
  67. package/timer/index.js.map +1 -0
  68. package/types.d.ts +62 -35
  69. package/types.js +11 -5
  70. package/types.js.map +1 -1
  71. package/utils/ObjectUpdater.d.ts +8 -0
  72. package/utils/ObjectUpdater.js +46 -0
  73. package/utils/ObjectUpdater.js.map +1 -0
  74. package/crud/createEventBridgeEvent.d.ts +0 -9
  75. package/crud/createEventBridgeEvent.js +0 -73
  76. package/crud/createEventBridgeEvent.js.map +0 -1
  77. package/runner/utils/getErrorProperties.d.ts +0 -5
  78. package/runner/utils/getErrorProperties.js +0 -18
  79. package/runner/utils/getErrorProperties.js.map +0 -1
  80. package/runner/utils/getObjectProperties.d.ts +0 -4
  81. package/runner/utils/getObjectProperties.js +0 -21
  82. package/runner/utils/getObjectProperties.js.map +0 -1
@@ -2,7 +2,8 @@ import { ITaskDataInput, TaskResponseStatus } from "../../types";
2
2
  import { IResponseError } from "./ResponseErrorResult";
3
3
  export declare type ITaskResponseResult<I = ITaskDataInput, O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> = ITaskResponseDoneResult<O> | ITaskResponseContinueResult<I> | ITaskResponseErrorResult | ITaskResponseAbortedResult;
4
4
  export interface ITaskResponseDoneResultOutput {
5
- [key: string]: string | string[] | number | boolean | Record<string, string | number>;
5
+ error?: IResponseError;
6
+ [key: string]: string | string[] | number | boolean | undefined | Record<string, string | number> | IResponseError;
6
7
  }
7
8
  export interface ITaskResponseDoneResult<O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> {
8
9
  message?: string;
@@ -28,8 +29,12 @@ export interface ITaskResponseContinueOptionsSeconds {
28
29
  seconds: number;
29
30
  }
30
31
  export declare type ITaskResponseContinueOptions = ITaskResponseContinueOptionsUntil | ITaskResponseContinueOptionsSeconds;
32
+ export interface ITaskResponseDoneCallable<O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> {
33
+ (output?: O): ITaskResponseDoneResult<O>;
34
+ (message?: string, output?: O): ITaskResponseDoneResult<O>;
35
+ }
31
36
  export interface ITaskResponse<T = ITaskDataInput, O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> {
32
- done: (message?: string, output?: O) => ITaskResponseDoneResult<O>;
37
+ done: ITaskResponseDoneCallable<O>;
33
38
  continue: (data: T, options?: ITaskResponseContinueOptions) => ITaskResponseContinueResult<T>;
34
39
  error: (error: IResponseError | Error | string) => ITaskResponseErrorResult;
35
40
  aborted: () => ITaskResponseAbortedResult;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["TaskResponse.ts"],"sourcesContent":["import { ITaskDataInput, TaskResponseStatus } from \"~/types\";\nimport { IResponseError } from \"./ResponseErrorResult\";\n\nexport type ITaskResponseResult<\n I = ITaskDataInput,\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> =\n | ITaskResponseDoneResult<O>\n | ITaskResponseContinueResult<I>\n | ITaskResponseErrorResult\n | ITaskResponseAbortedResult;\n\nexport interface ITaskResponseDoneResultOutput {\n [key: string]: string | string[] | number | boolean | Record<string, string | number>;\n}\nexport interface ITaskResponseDoneResult<\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> {\n message?: string;\n output?: O;\n status: TaskResponseStatus.DONE;\n}\n\nexport interface ITaskResponseContinueResult<T = ITaskDataInput> {\n input: T;\n wait?: number;\n status: TaskResponseStatus.CONTINUE;\n}\n\nexport interface ITaskResponseErrorResult {\n error: IResponseError;\n status: TaskResponseStatus.ERROR;\n}\n\nexport interface ITaskResponseAbortedResult {\n status: TaskResponseStatus.ABORTED;\n}\n\nexport interface ITaskResponseContinueOptionsUntil {\n date: Date;\n}\nexport interface ITaskResponseContinueOptionsSeconds {\n seconds: number;\n}\n\nexport type ITaskResponseContinueOptions =\n | ITaskResponseContinueOptionsUntil\n | ITaskResponseContinueOptionsSeconds;\n\nexport interface ITaskResponse<\n T = ITaskDataInput,\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> {\n done: (message?: string, output?: O) => ITaskResponseDoneResult<O>;\n continue: (data: T, options?: ITaskResponseContinueOptions) => ITaskResponseContinueResult<T>;\n error: (error: IResponseError | Error | string) => ITaskResponseErrorResult;\n aborted: () => ITaskResponseAbortedResult;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["TaskResponse.ts"],"sourcesContent":["import { ITaskDataInput, TaskResponseStatus } from \"~/types\";\nimport { IResponseError } from \"./ResponseErrorResult\";\n\nexport type ITaskResponseResult<\n I = ITaskDataInput,\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> =\n | ITaskResponseDoneResult<O>\n | ITaskResponseContinueResult<I>\n | ITaskResponseErrorResult\n | ITaskResponseAbortedResult;\n\nexport interface ITaskResponseDoneResultOutput {\n error?: IResponseError;\n [key: string]:\n | string\n | string[]\n | number\n | boolean\n | undefined\n | Record<string, string | number>\n | IResponseError;\n}\nexport interface ITaskResponseDoneResult<\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> {\n message?: string;\n output?: O;\n status: TaskResponseStatus.DONE;\n}\n\nexport interface ITaskResponseContinueResult<T = ITaskDataInput> {\n input: T;\n wait?: number;\n status: TaskResponseStatus.CONTINUE;\n}\n\nexport interface ITaskResponseErrorResult {\n error: IResponseError;\n status: TaskResponseStatus.ERROR;\n}\n\nexport interface ITaskResponseAbortedResult {\n status: TaskResponseStatus.ABORTED;\n}\n\nexport interface ITaskResponseContinueOptionsUntil {\n date: Date;\n}\nexport interface ITaskResponseContinueOptionsSeconds {\n seconds: number;\n}\n\nexport type ITaskResponseContinueOptions =\n | ITaskResponseContinueOptionsUntil\n | ITaskResponseContinueOptionsSeconds;\n\nexport interface ITaskResponseDoneCallable<\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> {\n (output?: O): ITaskResponseDoneResult<O>;\n (message?: string, output?: O): ITaskResponseDoneResult<O>;\n}\n\nexport interface ITaskResponse<\n T = ITaskDataInput,\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> {\n done: ITaskResponseDoneCallable<O>;\n continue: (data: T, options?: ITaskResponseContinueOptions) => ITaskResponseContinueResult<T>;\n error: (error: IResponseError | Error | string) => ITaskResponseErrorResult;\n aborted: () => ITaskResponseAbortedResult;\n}\n"],"mappings":""}
@@ -1,13 +1,12 @@
1
- import { ITaskManager, ITaskRunner } from "./abstractions";
1
+ import { ITaskManager, ITaskManagerStorePrivate, ITaskRunner } from "./abstractions";
2
2
  import { Context, ITaskDataInput, ITaskDefinition } from "../types";
3
3
  import { IResponse, IResponseResult, ITaskResponse } from "../response/abstractions";
4
- import { ITaskManagerStore } from "./abstractions";
5
4
  export declare class TaskManager<T = ITaskDataInput> implements ITaskManager<T> {
6
5
  private readonly runner;
7
6
  private readonly context;
8
7
  private readonly response;
9
8
  private readonly taskResponse;
10
9
  private readonly store;
11
- constructor(runner: Pick<ITaskRunner, "isCloseToTimeout">, context: Context, response: IResponse, taskResponse: ITaskResponse, store: ITaskManagerStore);
10
+ constructor(runner: Pick<ITaskRunner, "isCloseToTimeout">, context: Context, response: IResponse, taskResponse: ITaskResponse, store: ITaskManagerStorePrivate);
12
11
  run(definition: ITaskDefinition): Promise<IResponseResult>;
13
12
  }
@@ -33,9 +33,7 @@ class TaskManager {
33
33
  executionName: this.response.event.executionName,
34
34
  iterations: 1
35
35
  });
36
- await this.store.addInfoLog({
37
- message: "Task started."
38
- });
36
+ await this.store.save();
39
37
  } catch (error) {
40
38
  return this.response.error({
41
39
  error
@@ -89,23 +87,28 @@ class TaskManager {
89
87
  let result;
90
88
  try {
91
89
  const input = structuredClone(this.store.getInput());
92
- result = await definition.run({
93
- input,
94
- context: this.context,
95
- response: this.taskResponse,
96
- isCloseToTimeout: seconds => {
97
- return this.runner.isCloseToTimeout(seconds);
98
- },
99
- isAborted: () => {
100
- return this.store.getStatus() === _types.TaskDataStatus.ABORTED;
101
- },
102
- store: this.store,
103
- trigger: async params => {
104
- return this.context.tasks.trigger({
105
- ...params,
106
- parent: this.store.getTask()
107
- });
108
- }
90
+ /**
91
+ * We always run the task without authorization because we are running a task without a user - nothing to authorize against.
92
+ */
93
+ result = await this.context.security.withoutAuthorization(async () => {
94
+ return await definition.run({
95
+ input,
96
+ context: this.context,
97
+ response: this.taskResponse,
98
+ isCloseToTimeout: seconds => {
99
+ return this.runner.isCloseToTimeout(seconds);
100
+ },
101
+ isAborted: () => {
102
+ return this.store.getStatus() === _types.TaskDataStatus.ABORTED;
103
+ },
104
+ store: this.store,
105
+ trigger: async params => {
106
+ return this.context.tasks.trigger({
107
+ ...params,
108
+ parent: this.store.getTask()
109
+ });
110
+ }
111
+ });
109
112
  });
110
113
  } catch (ex) {
111
114
  return this.response.error({
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_getErrorProperties","TaskManager","constructor","runner","context","response","taskResponse","store","run","definition","getStatus","TaskDataStatus","ABORTED","aborted","PENDING","updateTask","taskStatus","RUNNING","startedOn","Date","toISOString","executionName","event","iterations","addInfoLog","message","error","getTask","maxIterations","onMaxIterations","task","ex","data","getErrorProperties","result","input","structuredClone","getInput","isCloseToTimeout","seconds","isAborted","trigger","params","tasks","parent","status","TaskResponseStatus","CONTINUE","continue","wait","ERROR","done","output","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import { ITaskManager, ITaskRunner } from \"./abstractions\";\nimport {\n Context,\n ITask,\n ITaskDataInput,\n ITaskDefinition,\n ITaskTriggerParams,\n TaskDataStatus,\n TaskResponseStatus\n} from \"~/types\";\nimport {\n IResponse,\n IResponseResult,\n ITaskResponse,\n ITaskResponseResult\n} from \"~/response/abstractions\";\nimport { ITaskManagerStore } from \"~/runner/abstractions\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\nexport class TaskManager<T = ITaskDataInput> implements ITaskManager<T> {\n private readonly runner: Pick<ITaskRunner, \"isCloseToTimeout\">;\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly taskResponse: ITaskResponse;\n private readonly store: ITaskManagerStore;\n\n public constructor(\n runner: Pick<ITaskRunner, \"isCloseToTimeout\">,\n context: Context,\n response: IResponse,\n taskResponse: ITaskResponse,\n store: ITaskManagerStore\n ) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n this.taskResponse = taskResponse;\n this.store = store;\n }\n\n public async run(definition: ITaskDefinition): 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.addInfoLog({\n message: \"Task started.\"\n });\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 context: this.context\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: ITaskResponseResult;\n\n try {\n const input = structuredClone(this.store.getInput());\n result = await definition.run({\n input,\n context: this.context,\n response: this.taskResponse,\n isCloseToTimeout: (seconds?: number) => {\n return this.runner.isCloseToTimeout(seconds);\n },\n isAborted: () => {\n return this.store.getStatus() === TaskDataStatus.ABORTED;\n },\n store: this.store,\n trigger: async <I = ITaskDataInput>(\n params: Omit<ITaskTriggerParams<I>, \"parent\">\n ): Promise<ITask<I>> => {\n return this.context.tasks.trigger({\n ...params,\n parent: this.store.getTask()\n });\n }\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n if (result.status === TaskResponseStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResponseStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResponseStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAgBA,IAAAC,mBAAA,GAAAD,OAAA;AAEO,MAAME,WAAW,CAAgD;EAO7DC,WAAWA,CACdC,MAA6C,EAC7CC,OAAgB,EAChBC,QAAmB,EACnBC,YAA2B,EAC3BC,KAAwB,EAC1B;IACE,IAAI,CAACJ,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACC,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACC,KAAK,GAAGA,KAAK;EACtB;EAEA,MAAaC,GAAGA,CAACC,UAA2B,EAA4B;IACpE;AACR;AACA;IACQ,IAAI,IAAI,CAACF,KAAK,CAACG,SAAS,CAAC,CAAC,KAAKC,qBAAc,CAACC,OAAO,EAAE;MACnD,OAAO,IAAI,CAACP,QAAQ,CAACQ,OAAO,CAAC,CAAC;IAClC;IACA;AACR;AACA;IACQ;IAAA,KACK,IAAI,IAAI,CAACN,KAAK,CAACG,SAAS,CAAC,CAAC,KAAKC,qBAAc,CAACG,OAAO,EAAE;MACxD,IAAI;QACA,MAAM,IAAI,CAACP,KAAK,CAACQ,UAAU,CAAC;UACxBC,UAAU,EAAEL,qBAAc,CAACM,OAAO;UAClCC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UACnCC,aAAa,EAAE,IAAI,CAAChB,QAAQ,CAACiB,KAAK,CAACD,aAAa;UAChDE,UAAU,EAAE;QAChB,CAAC,CAAC;QACF,MAAM,IAAI,CAAChB,KAAK,CAACiB,UAAU,CAAC;UACxBC,OAAO,EAAE;QACb,CAAC,CAAC;MACN,CAAC,CAAC,OAAOC,KAAK,EAAE;QACZ,OAAO,IAAI,CAACrB,QAAQ,CAACqB,KAAK,CAAC;UACvBA;QACJ,CAAC,CAAC;MACN;IACJ;IACA;AACR;AACA;AACA;IACQ;IAAA,KACK,IAAI,IAAI,CAACnB,KAAK,CAACoB,OAAO,CAAC,CAAC,CAACJ,UAAU,IAAId,UAAU,CAACmB,aAAa,EAAE;MAClE,IAAI;QACA,IAAInB,UAAU,CAACoB,eAAe,EAAE;UAC5B,MAAMpB,UAAU,CAACoB,eAAe,CAAC;YAC7BC,IAAI,EAAE,IAAI,CAACvB,KAAK,CAACoB,OAAO,CAAC,CAAC;YAC1BvB,OAAO,EAAE,IAAI,CAACA;UAClB,CAAC,CAAC;QACN;QACA,OAAO,IAAI,CAACC,QAAQ,CAACqB,KAAK,CAAC;UACvBA,KAAK,EAAE;YACHD,OAAO,EAAE;UACb;QACJ,CAAC,CAAC;MACN,CAAC,CAAC,OAAOM,EAAE,EAAE;QACT,OAAO,IAAI,CAAC1B,QAAQ,CAACqB,KAAK,CAAC;UACvBA,KAAK,EAAE;YACHD,OAAO,EAAE,4CAA4C;YACrDO,IAAI,EAAE,IAAAC,sCAAkB,EAACF,EAAE;UAC/B;QACJ,CAAC,CAAC;MACN;IACJ;IACA;AACR;AACA;IACQ;IAAA,KACK;MACD,IAAI;QACA,MAAM,IAAI,CAACxB,KAAK,CAACQ,UAAU,CAACe,IAAI,IAAI;UAChC,OAAO;YACHP,UAAU,EAAEO,IAAI,CAACP,UAAU,GAAG;UAClC,CAAC;QACL,CAAC,CAAC;MACN,CAAC,CAAC,OAAOG,KAAK,EAAE;QACZ,OAAO,IAAI,CAACrB,QAAQ,CAACqB,KAAK,CAAC;UACvBA;QACJ,CAAC,CAAC;MACN;IACJ;IAEA,IAAIQ,MAA2B;IAE/B,IAAI;MACA,MAAMC,KAAK,GAAGC,eAAe,CAAC,IAAI,CAAC7B,KAAK,CAAC8B,QAAQ,CAAC,CAAC,CAAC;MACpDH,MAAM,GAAG,MAAMzB,UAAU,CAACD,GAAG,CAAC;QAC1B2B,KAAK;QACL/B,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,QAAQ,EAAE,IAAI,CAACC,YAAY;QAC3BgC,gBAAgB,EAAGC,OAAgB,IAAK;UACpC,OAAO,IAAI,CAACpC,MAAM,CAACmC,gBAAgB,CAACC,OAAO,CAAC;QAChD,CAAC;QACDC,SAAS,EAAEA,CAAA,KAAM;UACb,OAAO,IAAI,CAACjC,KAAK,CAACG,SAAS,CAAC,CAAC,KAAKC,qBAAc,CAACC,OAAO;QAC5D,CAAC;QACDL,KAAK,EAAE,IAAI,CAACA,KAAK;QACjBkC,OAAO,EAAE,MACLC,MAA6C,IACzB;UACpB,OAAO,IAAI,CAACtC,OAAO,CAACuC,KAAK,CAACF,OAAO,CAAC;YAC9B,GAAGC,MAAM;YACTE,MAAM,EAAE,IAAI,CAACrC,KAAK,CAACoB,OAAO,CAAC;UAC/B,CAAC,CAAC;QACN;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOI,EAAE,EAAE;MACT,OAAO,IAAI,CAAC1B,QAAQ,CAACqB,KAAK,CAAC;QACvBA,KAAK,EAAE,IAAAO,sCAAkB,EAACF,EAAE;MAChC,CAAC,CAAC;IACN;IAEA,IAAIG,MAAM,CAACW,MAAM,KAAKC,yBAAkB,CAACC,QAAQ,EAAE;MAC/C,OAAO,IAAI,CAAC1C,QAAQ,CAAC2C,QAAQ,CAAC;QAC1Bb,KAAK,EAAED,MAAM,CAACC,KAAK;QACnBc,IAAI,EAAEf,MAAM,CAACe;MACjB,CAAC,CAAC;IACN,CAAC,MAAM,IAAIf,MAAM,CAACW,MAAM,KAAKC,yBAAkB,CAACI,KAAK,EAAE;MACnD,OAAO,IAAI,CAAC7C,QAAQ,CAACqB,KAAK,CAAC;QACvBA,KAAK,EAAEQ,MAAM,CAACR;MAClB,CAAC,CAAC;IACN,CAAC,MAAM,IAAIQ,MAAM,CAACW,MAAM,KAAKC,yBAAkB,CAAClC,OAAO,EAAE;MACrD,OAAO,IAAI,CAACP,QAAQ,CAACQ,OAAO,CAAC,CAAC;IAClC;IACA,OAAO,IAAI,CAACR,QAAQ,CAAC8C,IAAI,CAAC;MACtB1B,OAAO,EAAES,MAAM,CAACT,OAAO;MACvB2B,MAAM,EAAElB,MAAM,CAACkB;IACnB,CAAC,CAAC;EACN;AACJ;AAACC,OAAA,CAAApD,WAAA,GAAAA,WAAA"}
1
+ {"version":3,"names":["_types","require","_getErrorProperties","TaskManager","constructor","runner","context","response","taskResponse","store","run","definition","getStatus","TaskDataStatus","ABORTED","aborted","PENDING","updateTask","taskStatus","RUNNING","startedOn","Date","toISOString","executionName","event","iterations","save","error","getTask","maxIterations","onMaxIterations","task","message","ex","data","getErrorProperties","result","input","structuredClone","getInput","security","withoutAuthorization","isCloseToTimeout","seconds","isAborted","trigger","params","tasks","parent","status","TaskResponseStatus","CONTINUE","continue","wait","ERROR","done","output","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import { ITaskManager, ITaskManagerStorePrivate, ITaskRunner } from \"./abstractions\";\nimport {\n Context,\n ITask,\n ITaskDataInput,\n ITaskDefinition,\n ITaskTriggerParams,\n TaskDataStatus,\n TaskResponseStatus\n} from \"~/types\";\nimport {\n IResponse,\n IResponseResult,\n ITaskResponse,\n ITaskResponseResult\n} from \"~/response/abstractions\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\nexport class TaskManager<T = ITaskDataInput> implements ITaskManager<T> {\n private readonly runner: Pick<ITaskRunner, \"isCloseToTimeout\">;\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly taskResponse: ITaskResponse;\n private readonly store: ITaskManagerStorePrivate;\n\n public constructor(\n runner: Pick<ITaskRunner, \"isCloseToTimeout\">,\n context: Context,\n response: IResponse,\n taskResponse: ITaskResponse,\n store: ITaskManagerStorePrivate\n ) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n this.taskResponse = taskResponse;\n this.store = store;\n }\n\n public async run(definition: ITaskDefinition): 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 context: this.context\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: ITaskResponseResult;\n\n try {\n const input = structuredClone(this.store.getInput());\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 context: this.context,\n response: this.taskResponse,\n isCloseToTimeout: (seconds?: number) => {\n return this.runner.isCloseToTimeout(seconds);\n },\n isAborted: () => {\n return this.store.getStatus() === TaskDataStatus.ABORTED;\n },\n store: this.store,\n trigger: async <I = ITaskDataInput>(\n params: Omit<ITaskTriggerParams<I>, \"parent\">\n ): Promise<ITask<I>> => {\n return this.context.tasks.trigger({\n ...params,\n parent: this.store.getTask()\n });\n }\n });\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n if (result.status === TaskResponseStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResponseStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResponseStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"mappings":"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"}
@@ -1,27 +1,31 @@
1
- import { ITask, ITaskDataInput, ITaskLog, ITaskManagerStoreInfoLog, ITasksContextObject, TaskDataStatus } from "../types";
2
- import { ITaskManagerStore, ITaskManagerStoreErrorLog, ITaskManagerStoreUpdateTaskInputParam, ITaskManagerStoreUpdateTaskParam } from "./abstractions";
1
+ import { ITask, ITaskDataInput, ITaskLog, ITaskManagerStoreInfoLog, ITaskManagerStorePrivate, ITaskManagerStoreSetOutputOptions, ITaskManagerStoreUpdateTaskInputOptions, ITaskManagerStoreUpdateTaskOptions, ITaskResponseDoneResultOutput, ITasksContextObject, TaskDataStatus } from "../types";
2
+ import { ITaskManagerStoreAddLogOptions, ITaskManagerStoreErrorLog, ITaskManagerStoreUpdateTaskInputParam, ITaskManagerStoreUpdateTaskParams } from "./abstractions";
3
3
  export interface TaskManagerStoreContext {
4
4
  tasks: Pick<ITasksContextObject, "updateTask" | "updateLog">;
5
5
  }
6
- export declare class TaskManagerStore implements ITaskManagerStore {
6
+ export declare class TaskManagerStore<T extends ITaskDataInput = ITaskDataInput, O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> implements ITaskManagerStorePrivate<T, O> {
7
7
  private readonly context;
8
8
  private task;
9
9
  private taskLog;
10
+ private readonly taskUpdater;
11
+ private readonly taskLogUpdater;
10
12
  constructor(context: TaskManagerStoreContext, task: ITask, log: ITaskLog);
11
13
  getStatus(): TaskDataStatus;
12
- setTask(task: ITask): void;
13
- getTask<T extends ITaskDataInput = ITaskDataInput>(): ITask<T>;
14
- updateTask(param: ITaskManagerStoreUpdateTaskParam): Promise<void>;
15
- updateInput<T extends ITaskDataInput = ITaskDataInput>(param: ITaskManagerStoreUpdateTaskInputParam<T>): Promise<void>;
16
- getInput<T extends ITaskDataInput = ITaskDataInput>(): T;
14
+ getTask(): ITask<T, O>;
15
+ updateTask(param: ITaskManagerStoreUpdateTaskParams<T, O>, options?: ITaskManagerStoreUpdateTaskOptions): Promise<void>;
16
+ updateInput(param: ITaskManagerStoreUpdateTaskInputParam<T>, options?: ITaskManagerStoreUpdateTaskInputOptions): Promise<void>;
17
+ getInput(): T;
18
+ updateOutput(values: Partial<O>, options?: ITaskManagerStoreSetOutputOptions): Promise<void>;
19
+ getOutput(): O;
17
20
  /**
18
21
  * Currently the methods throws an error if something goes wrong during the database update.
19
22
  * TODO: Maybe we should wrap it into try/catch and return error if any?
20
23
  */
21
- addInfoLog(log: ITaskManagerStoreInfoLog): Promise<void>;
24
+ addInfoLog(log: ITaskManagerStoreInfoLog, options?: ITaskManagerStoreAddLogOptions): Promise<void>;
22
25
  /**
23
26
  * Currently the methods throws an error if something goes wrong during the database update.
24
27
  * TODO: Maybe we should wrap it into try/catch and return error if any?
25
28
  */
26
- addErrorLog(log: ITaskManagerStoreErrorLog): Promise<void>;
29
+ addErrorLog(log: ITaskManagerStoreErrorLog, options?: ITaskManagerStoreAddLogOptions): Promise<void>;
30
+ save(): Promise<void>;
27
31
  }
@@ -8,6 +8,7 @@ exports.TaskManagerStore = void 0;
8
8
  var _types = require("../types");
9
9
  var _deepEqual = _interopRequireDefault(require("deep-equal"));
10
10
  var _getObjectProperties = require("../utils/getObjectProperties");
11
+ var _ObjectUpdater = require("../utils/ObjectUpdater");
11
12
  /**
12
13
  * Package deep-equal does not have types.
13
14
  */ // @ts-expect-error
@@ -21,6 +22,8 @@ const getInput = (originalInput, input) => {
21
22
  };
22
23
  };
23
24
  class TaskManagerStore {
25
+ taskUpdater = new _ObjectUpdater.ObjectUpdater();
26
+ taskLogUpdater = new _ObjectUpdater.ObjectUpdater();
24
27
  constructor(context, task, log) {
25
28
  this.context = context;
26
29
  this.task = task;
@@ -29,26 +32,25 @@ class TaskManagerStore {
29
32
  getStatus() {
30
33
  return this.task.taskStatus;
31
34
  }
32
- setTask(task) {
33
- this.task = task;
34
- }
35
35
  getTask() {
36
36
  return this.task;
37
37
  }
38
- async updateTask(param) {
38
+ async updateTask(param, options) {
39
39
  const data = typeof param === "function" ? param(this.task) : param;
40
+
40
41
  /**
41
42
  * No need to update if nothing changed.
42
43
  */
43
44
  if ((0, _deepEqual.default)(data, this.task)) {
44
45
  return;
45
46
  }
46
- this.task = await this.context.tasks.updateTask(this.task.id, {
47
- ...this.task,
48
- ...data
49
- });
47
+ this.taskUpdater.update(data);
48
+ if (options?.save === false) {
49
+ return;
50
+ }
51
+ await this.save();
50
52
  }
51
- async updateInput(param) {
53
+ async updateInput(param, options) {
52
54
  const input = getInput(this.task.input, param);
53
55
 
54
56
  /**
@@ -57,40 +59,75 @@ class TaskManagerStore {
57
59
  if ((0, _deepEqual.default)(input, this.task.input)) {
58
60
  return;
59
61
  }
60
- this.task = await this.context.tasks.updateTask(this.task.id, {
61
- input
62
+ this.taskUpdater.update({
63
+ input: input
62
64
  });
65
+ if (options?.save === false) {
66
+ return;
67
+ }
68
+ await this.save();
63
69
  }
64
70
  getInput() {
65
71
  return this.task.input;
66
72
  }
73
+ async updateOutput(values, options = {}) {
74
+ this.taskUpdater.update({
75
+ output: values
76
+ });
77
+ if (options?.save === false) {
78
+ return;
79
+ }
80
+ await this.save();
81
+ }
82
+ getOutput() {
83
+ return this.task.output;
84
+ }
67
85
  /**
68
86
  * Currently the methods throws an error if something goes wrong during the database update.
69
87
  * TODO: Maybe we should wrap it into try/catch and return error if any?
70
88
  */
71
- async addInfoLog(log) {
72
- this.taskLog = await this.context.tasks.updateLog(this.taskLog.id, {
73
- items: this.taskLog.items.concat([{
89
+ async addInfoLog(log, options) {
90
+ this.taskLogUpdater.update({
91
+ items: [{
74
92
  message: log.message,
75
93
  data: log.data,
76
94
  type: _types.ITaskLogItemType.INFO,
77
95
  createdOn: new Date().toISOString()
78
- }])
96
+ }]
79
97
  });
98
+ if (options?.save === false) {
99
+ return;
100
+ }
101
+ await this.save();
80
102
  }
81
103
  /**
82
104
  * Currently the methods throws an error if something goes wrong during the database update.
83
105
  * TODO: Maybe we should wrap it into try/catch and return error if any?
84
106
  */
85
- async addErrorLog(log) {
86
- this.taskLog = await this.context.tasks.updateLog(this.taskLog.id, {
87
- items: this.taskLog.items.concat([{
107
+ async addErrorLog(log, options) {
108
+ this.taskLogUpdater.update({
109
+ items: [{
88
110
  message: log.message,
89
111
  error: log.error instanceof Error ? (0, _getObjectProperties.getObjectProperties)(log.error) : log.error,
90
112
  type: _types.ITaskLogItemType.ERROR,
91
113
  createdOn: new Date().toISOString()
92
- }])
114
+ }]
93
115
  });
116
+ if (options?.save === false) {
117
+ return;
118
+ }
119
+ await this.save();
120
+ }
121
+ async save() {
122
+ /**
123
+ * Update both task and the log, if anything to update.
124
+ */
125
+ if (this.taskUpdater.isDirty()) {
126
+ this.task = await this.context.tasks.updateTask(this.task.id, this.taskUpdater.fetch());
127
+ }
128
+ if (this.taskLogUpdater.isDirty()) {
129
+ this.taskLog = await this.context.tasks.updateLog(this.taskLog.id, this.taskLogUpdater.fetch());
130
+ }
94
131
  }
95
132
  }
96
133
  exports.TaskManagerStore = TaskManagerStore;
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_deepEqual","_interopRequireDefault","_getObjectProperties","getInput","originalInput","input","TaskManagerStore","constructor","context","task","log","taskLog","getStatus","taskStatus","setTask","getTask","updateTask","param","data","deepEqual","tasks","id","updateInput","addInfoLog","updateLog","items","concat","message","type","ITaskLogItemType","INFO","createdOn","Date","toISOString","addErrorLog","error","Error","getObjectProperties","ERROR","exports"],"sources":["TaskManagerStore.ts"],"sourcesContent":["import {\n ITask,\n ITaskDataInput,\n ITaskLog,\n ITaskLogItemType,\n ITaskManagerStoreInfoLog,\n ITasksContextObject,\n TaskDataStatus\n} from \"~/types\";\nimport {\n ITaskManagerStore,\n ITaskManagerStoreErrorLog,\n ITaskManagerStoreUpdateTaskInputParam,\n ITaskManagerStoreUpdateTaskParam\n} from \"./abstractions\";\n/**\n * Package deep-equal does not have types.\n */\n// @ts-expect-error\nimport deepEqual from \"deep-equal\";\nimport { getObjectProperties } from \"~/utils/getObjectProperties\";\n\nconst getInput = <T extends ITaskDataInput = ITaskDataInput>(\n originalInput: T,\n input: ITaskManagerStoreUpdateTaskInputParam<T>\n) => {\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\">;\n}\n\nexport class TaskManagerStore implements ITaskManagerStore {\n private readonly context: TaskManagerStoreContext;\n private task: ITask;\n private taskLog: ITaskLog;\n\n public constructor(context: TaskManagerStoreContext, task: ITask, log: ITaskLog) {\n this.context = context;\n this.task = task;\n this.taskLog = log;\n }\n\n public getStatus(): TaskDataStatus {\n return this.task.taskStatus;\n }\n\n public setTask(task: ITask): void {\n this.task = task;\n }\n\n public getTask<T extends ITaskDataInput = ITaskDataInput>(): ITask<T> {\n return this.task as ITask<T>;\n }\n\n public async updateTask(param: ITaskManagerStoreUpdateTaskParam): Promise<void> {\n const data = typeof param === \"function\" ? param(this.task) : param;\n /**\n * No need to update if nothing changed.\n */\n if (deepEqual(data, this.task)) {\n return;\n }\n this.task = await this.context.tasks.updateTask(this.task.id, {\n ...this.task,\n ...data\n });\n }\n\n public async updateInput<T extends ITaskDataInput = ITaskDataInput>(\n param: ITaskManagerStoreUpdateTaskInputParam<T>\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.task = await this.context.tasks.updateTask(this.task.id, {\n input\n });\n }\n\n public getInput<T extends ITaskDataInput = ITaskDataInput>(): T {\n return this.task.input as T;\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(log: ITaskManagerStoreInfoLog): Promise<void> {\n this.taskLog = await this.context.tasks.updateLog(this.taskLog.id, {\n items: this.taskLog.items.concat([\n {\n message: log.message,\n data: log.data,\n type: ITaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\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(log: ITaskManagerStoreErrorLog): Promise<void> {\n this.taskLog = await this.context.tasks.updateLog(this.taskLog.id, {\n items: this.taskLog.items.concat([\n {\n message: log.message,\n error: log.error instanceof Error ? getObjectProperties(log.error) : log.error,\n type: ITaskLogItemType.ERROR,\n createdOn: new Date().toISOString()\n }\n ])\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_types","require","_deepEqual","_interopRequireDefault","_getObjectProperties","_ObjectUpdater","getInput","originalInput","input","TaskManagerStore","taskUpdater","ObjectUpdater","taskLogUpdater","constructor","context","task","log","taskLog","getStatus","taskStatus","getTask","updateTask","param","options","data","deepEqual","update","save","updateInput","updateOutput","values","output","getOutput","addInfoLog","items","message","type","ITaskLogItemType","INFO","createdOn","Date","toISOString","addErrorLog","error","Error","getObjectProperties","ERROR","isDirty","tasks","id","fetch","updateLog","exports"],"sources":["TaskManagerStore.ts"],"sourcesContent":["import {\n ITask,\n ITaskDataInput,\n ITaskLog,\n ITaskLogItemType,\n ITaskManagerStoreInfoLog,\n ITaskManagerStorePrivate,\n ITaskManagerStoreSetOutputOptions,\n ITaskManagerStoreUpdateTaskInputOptions,\n ITaskManagerStoreUpdateTaskOptions,\n ITaskResponseDoneResultOutput,\n ITasksContextObject,\n TaskDataStatus\n} from \"~/types\";\nimport {\n ITaskManagerStoreAddLogOptions,\n ITaskManagerStoreErrorLog,\n ITaskManagerStoreUpdateTaskInputParam,\n ITaskManagerStoreUpdateTaskParams\n} from \"./abstractions\";\n/**\n * Package deep-equal does not have types.\n */\n// @ts-expect-error\nimport deepEqual from \"deep-equal\";\nimport { getObjectProperties } from \"~/utils/getObjectProperties\";\nimport { ObjectUpdater } from \"~/utils/ObjectUpdater\";\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\">;\n}\n\nexport class TaskManagerStore<\n T extends ITaskDataInput = ITaskDataInput,\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> implements ITaskManagerStorePrivate<T, O>\n{\n private readonly context: TaskManagerStoreContext;\n private task: ITask<T, O>;\n private taskLog: ITaskLog;\n\n private readonly taskUpdater = new ObjectUpdater<ITask<T, O>>();\n private readonly taskLogUpdater = new ObjectUpdater<ITaskLog>();\n\n public constructor(context: TaskManagerStoreContext, task: ITask, log: ITaskLog) {\n this.context = context;\n this.task = task as ITask<T, O>;\n this.taskLog = log;\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 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 this.taskLogUpdater.update({\n items: [\n {\n message: log.message,\n data: log.data,\n type: ITaskLogItemType.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 this.taskLogUpdater.update({\n items: [\n {\n message: log.message,\n error: log.error instanceof Error ? getObjectProperties(log.error) : log.error,\n type: ITaskLogItemType.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.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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"}
@@ -1,10 +1,8 @@
1
- import { Context as LambdaContext } from "aws-lambda/handler";
2
- import { Reply, Request } from "@webiny/handler/types";
3
- import { ITaskEvent } from "../handler/types";
4
- import { ITaskRunner } from "./abstractions";
1
+ import { ITaskRawEvent } from "../handler/types";
2
+ import { ITaskEventValidation, ITaskRunner } from "./abstractions";
5
3
  import { Context } from "../types";
6
- import { TaskEventValidation } from "./TaskEventValidation";
7
4
  import { IResponseResult } from "../response/abstractions";
5
+ import { ITimer } from "../timer";
8
6
  export declare class TaskRunner<C extends Context = Context> implements ITaskRunner<C> {
9
7
  /**
10
8
  * When DI is introduced, these will get injected.
@@ -14,17 +12,14 @@ export declare class TaskRunner<C extends Context = Context> implements ITaskRun
14
12
  *
15
13
  * Follow the same example for the rest of the properties.
16
14
  */
17
- readonly request: Request;
18
- readonly reply: Reply;
19
15
  readonly context: C;
20
- readonly lambdaContext: Pick<LambdaContext, "getRemainingTimeInMillis">;
21
16
  private readonly validation;
17
+ private readonly timer;
22
18
  /**
23
19
  * We take all required variables separately because they will get injected via DI - so less refactoring is required in the future.
24
20
  */
25
- constructor(lambdaContext: Pick<LambdaContext, "getRemainingTimeInMillis">, request: Request, reply: Reply, context: C, validation?: TaskEventValidation);
21
+ constructor(context: C, timer: ITimer, validation: ITaskEventValidation);
26
22
  isCloseToTimeout(seconds?: number): boolean;
27
- getRemainingTime(): number;
28
- run(input: ITaskEvent): Promise<IResponseResult>;
29
- private getIsCloseToTimeoutMinutes;
23
+ run(rawEvent: ITaskRawEvent): Promise<IResponseResult>;
24
+ private getIsCloseToTimeoutMilliseconds;
30
25
  }
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.TaskRunner = void 0;
7
7
  var _response = require("../response");
8
8
  var _TaskControl = require("./TaskControl");
9
- var _TaskEventValidation = require("./TaskEventValidation");
10
9
  var _getErrorProperties = require("../utils/getErrorProperties");
11
10
  const transformMinutesIntoMilliseconds = minutes => {
12
11
  return minutes * 60000;
@@ -25,30 +24,37 @@ class TaskRunner {
25
24
  /**
26
25
  * We take all required variables separately because they will get injected via DI - so less refactoring is required in the future.
27
26
  */
28
- constructor(lambdaContext, request, reply, context, validation = new _TaskEventValidation.TaskEventValidation()) {
29
- this.request = request;
30
- this.reply = reply;
27
+ constructor(context, timer, validation) {
31
28
  this.context = context;
32
- this.lambdaContext = lambdaContext;
29
+ this.timer = timer;
33
30
  this.validation = validation;
34
31
  }
35
32
  isCloseToTimeout(seconds) {
36
- const milliseconds = seconds ? seconds * 1000 : transformMinutesIntoMilliseconds(this.getIsCloseToTimeoutMinutes());
37
- return this.lambdaContext.getRemainingTimeInMillis() < milliseconds;
33
+ const milliseconds = seconds ? seconds * 1000 : this.getIsCloseToTimeoutMilliseconds();
34
+ return this.timer.getRemainingMilliseconds() < milliseconds;
38
35
  }
39
- getRemainingTime() {
40
- return this.lambdaContext.getRemainingTimeInMillis();
41
- }
42
- async run(input) {
43
- const response = new _response.Response(input);
36
+ async run(rawEvent) {
37
+ const response = new _response.Response({
38
+ ...rawEvent
39
+ });
44
40
  let event;
45
41
  try {
46
- event = this.validation.validate(input);
42
+ event = this.validation.validate(rawEvent);
47
43
  } catch (ex) {
48
44
  return response.error({
49
45
  error: (0, _getErrorProperties.getErrorProperties)(ex)
50
46
  });
51
47
  }
48
+ response.setEvent(event);
49
+ /**
50
+ * If we received a delay when initiating the task, we need to send the continue response immediately.
51
+ */
52
+ if (rawEvent.delay && rawEvent.delay > 0) {
53
+ return response.continue({
54
+ input: {},
55
+ wait: rawEvent.delay
56
+ });
57
+ }
52
58
  const control = new _TaskControl.TaskControl(this, response, this.context);
53
59
  try {
54
60
  return await control.run(event);
@@ -58,9 +64,10 @@ class TaskRunner {
58
64
  });
59
65
  }
60
66
  }
61
- getIsCloseToTimeoutMinutes() {
67
+ getIsCloseToTimeoutMilliseconds() {
62
68
  const value = parseInt(process.env["WEBINY_TASKS_TIMEOUT_CLOSE_MINUTES"] || "");
63
- return value > 0 ? value : DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES;
69
+ const result = value > 0 ? value : DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES;
70
+ return transformMinutesIntoMilliseconds(result);
64
71
  }
65
72
  }
66
73
  exports.TaskRunner = TaskRunner;
@@ -1 +1 @@
1
- {"version":3,"names":["_response","require","_TaskControl","_TaskEventValidation","_getErrorProperties","transformMinutesIntoMilliseconds","minutes","DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES","TaskRunner","constructor","lambdaContext","request","reply","context","validation","TaskEventValidation","isCloseToTimeout","seconds","milliseconds","getIsCloseToTimeoutMinutes","getRemainingTimeInMillis","getRemainingTime","run","input","response","Response","event","validate","ex","error","getErrorProperties","control","TaskControl","value","parseInt","process","env","exports"],"sources":["TaskRunner.ts"],"sourcesContent":["import { Context as LambdaContext } from \"aws-lambda/handler\";\nimport { Reply, Request } from \"@webiny/handler/types\";\nimport { ITaskEvent } from \"~/handler/types\";\nimport { ITaskRunner } from \"./abstractions\";\nimport { Context } from \"~/types\";\nimport { Response } from \"~/response\";\nimport { TaskControl } from \"./TaskControl\";\nimport { TaskEventValidation } from \"./TaskEventValidation\";\nimport { IResponseResult } from \"~/response/abstractions\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\nconst transformMinutesIntoMilliseconds = (minutes: number) => {\n return minutes * 60000;\n};\n\nconst DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES = 3;\n\nexport class TaskRunner<C extends Context = Context> implements ITaskRunner<C> {\n /**\n * When DI is introduced, these will get injected.\n *\n * container.bind<Request>(\"Request\").toConstantValue(request);\n * @inject(\"Request\") public readonly request: Request;\n *\n * Follow the same example for the rest of the properties.\n */\n public readonly request: Request;\n public readonly reply: Reply;\n public readonly context: C;\n public readonly lambdaContext: Pick<LambdaContext, \"getRemainingTimeInMillis\">;\n private readonly validation: TaskEventValidation;\n\n /**\n * We take all required variables separately because they will get injected via DI - so less refactoring is required in the future.\n */\n public constructor(\n lambdaContext: Pick<LambdaContext, \"getRemainingTimeInMillis\">,\n request: Request,\n reply: Reply,\n context: C,\n validation: TaskEventValidation = new TaskEventValidation()\n ) {\n this.request = request;\n this.reply = reply;\n this.context = context;\n this.lambdaContext = lambdaContext;\n this.validation = validation;\n }\n\n public isCloseToTimeout(seconds?: number) {\n const milliseconds = seconds\n ? seconds * 1000\n : transformMinutesIntoMilliseconds(this.getIsCloseToTimeoutMinutes());\n return this.lambdaContext.getRemainingTimeInMillis() < milliseconds;\n }\n\n public getRemainingTime() {\n return this.lambdaContext.getRemainingTimeInMillis();\n }\n\n public async run(input: ITaskEvent): Promise<IResponseResult> {\n const response = new Response(input);\n\n let event: ITaskEvent;\n try {\n event = this.validation.validate(input);\n } catch (ex) {\n return response.error({\n error: getErrorProperties(ex)\n });\n }\n\n const control = new TaskControl(this, response, this.context);\n\n try {\n return await control.run(event);\n } catch (ex) {\n return response.error({\n error: getErrorProperties(ex)\n });\n }\n }\n\n private getIsCloseToTimeoutMinutes() {\n const value = parseInt(process.env[\"WEBINY_TASKS_TIMEOUT_CLOSE_MINUTES\"] || \"\");\n return value > 0 ? value : DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES;\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,oBAAA,GAAAF,OAAA;AAEA,IAAAG,mBAAA,GAAAH,OAAA;AAEA,MAAMI,gCAAgC,GAAIC,OAAe,IAAK;EAC1D,OAAOA,OAAO,GAAG,KAAK;AAC1B,CAAC;AAED,MAAMC,mCAAmC,GAAG,CAAC;AAEtC,MAAMC,UAAU,CAAwD;EAC3E;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;EAOI;AACJ;AACA;EACWC,WAAWA,CACdC,aAA8D,EAC9DC,OAAgB,EAChBC,KAAY,EACZC,OAAU,EACVC,UAA+B,GAAG,IAAIC,wCAAmB,CAAC,CAAC,EAC7D;IACE,IAAI,CAACJ,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACH,aAAa,GAAGA,aAAa;IAClC,IAAI,CAACI,UAAU,GAAGA,UAAU;EAChC;EAEOE,gBAAgBA,CAACC,OAAgB,EAAE;IACtC,MAAMC,YAAY,GAAGD,OAAO,GACtBA,OAAO,GAAG,IAAI,GACdZ,gCAAgC,CAAC,IAAI,CAACc,0BAA0B,CAAC,CAAC,CAAC;IACzE,OAAO,IAAI,CAACT,aAAa,CAACU,wBAAwB,CAAC,CAAC,GAAGF,YAAY;EACvE;EAEOG,gBAAgBA,CAAA,EAAG;IACtB,OAAO,IAAI,CAACX,aAAa,CAACU,wBAAwB,CAAC,CAAC;EACxD;EAEA,MAAaE,GAAGA,CAACC,KAAiB,EAA4B;IAC1D,MAAMC,QAAQ,GAAG,IAAIC,kBAAQ,CAACF,KAAK,CAAC;IAEpC,IAAIG,KAAiB;IACrB,IAAI;MACAA,KAAK,GAAG,IAAI,CAACZ,UAAU,CAACa,QAAQ,CAACJ,KAAK,CAAC;IAC3C,CAAC,CAAC,OAAOK,EAAE,EAAE;MACT,OAAOJ,QAAQ,CAACK,KAAK,CAAC;QAClBA,KAAK,EAAE,IAAAC,sCAAkB,EAACF,EAAE;MAChC,CAAC,CAAC;IACN;IAEA,MAAMG,OAAO,GAAG,IAAIC,wBAAW,CAAC,IAAI,EAAER,QAAQ,EAAE,IAAI,CAACX,OAAO,CAAC;IAE7D,IAAI;MACA,OAAO,MAAMkB,OAAO,CAACT,GAAG,CAACI,KAAK,CAAC;IACnC,CAAC,CAAC,OAAOE,EAAE,EAAE;MACT,OAAOJ,QAAQ,CAACK,KAAK,CAAC;QAClBA,KAAK,EAAE,IAAAC,sCAAkB,EAACF,EAAE;MAChC,CAAC,CAAC;IACN;EACJ;EAEQT,0BAA0BA,CAAA,EAAG;IACjC,MAAMc,KAAK,GAAGC,QAAQ,CAACC,OAAO,CAACC,GAAG,CAAC,oCAAoC,CAAC,IAAI,EAAE,CAAC;IAC/E,OAAOH,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG1B,mCAAmC;EAClE;AACJ;AAAC8B,OAAA,CAAA7B,UAAA,GAAAA,UAAA"}
1
+ {"version":3,"names":["_response","require","_TaskControl","_getErrorProperties","transformMinutesIntoMilliseconds","minutes","DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES","TaskRunner","constructor","context","timer","validation","isCloseToTimeout","seconds","milliseconds","getIsCloseToTimeoutMilliseconds","getRemainingMilliseconds","run","rawEvent","response","Response","event","validate","ex","error","getErrorProperties","setEvent","delay","continue","input","wait","control","TaskControl","value","parseInt","process","env","result","exports"],"sources":["TaskRunner.ts"],"sourcesContent":["import { ITaskEvent, ITaskRawEvent } from \"~/handler/types\";\nimport { ITaskEventValidation, ITaskRunner } from \"./abstractions\";\nimport { Context } from \"~/types\";\nimport { Response } from \"~/response\";\nimport { TaskControl } from \"./TaskControl\";\nimport { IResponseResult } from \"~/response/abstractions\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\nimport { ITimer } from \"~/timer\";\n\nconst transformMinutesIntoMilliseconds = (minutes: number) => {\n return minutes * 60000;\n};\n\nconst DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES = 3;\n\nexport class TaskRunner<C extends Context = Context> implements ITaskRunner<C> {\n /**\n * When DI is introduced, these will get injected.\n *\n * container.bind<Request>(\"Request\").toConstantValue(request);\n * @inject(\"Request\") public readonly request: Request;\n *\n * Follow the same example for the rest of the properties.\n */\n public readonly context: C;\n private readonly validation: ITaskEventValidation;\n private readonly timer: ITimer;\n\n /**\n * We take all required variables separately because they will get injected via DI - so less refactoring is required in the future.\n */\n public constructor(context: C, timer: ITimer, validation: ITaskEventValidation) {\n this.context = context;\n this.timer = timer;\n this.validation = validation;\n }\n\n public isCloseToTimeout(seconds?: number) {\n const milliseconds = seconds ? seconds * 1000 : this.getIsCloseToTimeoutMilliseconds();\n return this.timer.getRemainingMilliseconds() < milliseconds;\n }\n\n public async run(rawEvent: ITaskRawEvent): Promise<IResponseResult> {\n const response = new Response({\n ...rawEvent\n });\n\n let event: ITaskEvent;\n try {\n event = this.validation.validate(rawEvent);\n } catch (ex) {\n return response.error({\n error: getErrorProperties(ex)\n });\n }\n response.setEvent(event);\n /**\n * If we received a delay when initiating the task, we need to send the continue response immediately.\n */\n if (rawEvent.delay && rawEvent.delay > 0) {\n return response.continue({\n input: {},\n wait: rawEvent.delay\n });\n }\n\n const control = new TaskControl(this, response, this.context);\n\n try {\n return await control.run(event);\n } catch (ex) {\n return response.error({\n error: getErrorProperties(ex)\n });\n }\n }\n\n private getIsCloseToTimeoutMilliseconds() {\n const value = parseInt(process.env[\"WEBINY_TASKS_TIMEOUT_CLOSE_MINUTES\"] || \"\");\n const result = value > 0 ? value : DEFAULT_TASKS_TIMEOUT_CLOSE_MINUTES;\n return transformMinutesIntoMilliseconds(result);\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,mBAAA,GAAAF,OAAA;AAGA,MAAMG,gCAAgC,GAAIC,OAAe,IAAK;EAC1D,OAAOA,OAAO,GAAG,KAAK;AAC1B,CAAC;AAED,MAAMC,mCAAmC,GAAG,CAAC;AAEtC,MAAMC,UAAU,CAAwD;EAC3E;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;EAKI;AACJ;AACA;EACWC,WAAWA,CAACC,OAAU,EAAEC,KAAa,EAAEC,UAAgC,EAAE;IAC5E,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,UAAU,GAAGA,UAAU;EAChC;EAEOC,gBAAgBA,CAACC,OAAgB,EAAE;IACtC,MAAMC,YAAY,GAAGD,OAAO,GAAGA,OAAO,GAAG,IAAI,GAAG,IAAI,CAACE,+BAA+B,CAAC,CAAC;IACtF,OAAO,IAAI,CAACL,KAAK,CAACM,wBAAwB,CAAC,CAAC,GAAGF,YAAY;EAC/D;EAEA,MAAaG,GAAGA,CAACC,QAAuB,EAA4B;IAChE,MAAMC,QAAQ,GAAG,IAAIC,kBAAQ,CAAC;MAC1B,GAAGF;IACP,CAAC,CAAC;IAEF,IAAIG,KAAiB;IACrB,IAAI;MACAA,KAAK,GAAG,IAAI,CAACV,UAAU,CAACW,QAAQ,CAACJ,QAAQ,CAAC;IAC9C,CAAC,CAAC,OAAOK,EAAE,EAAE;MACT,OAAOJ,QAAQ,CAACK,KAAK,CAAC;QAClBA,KAAK,EAAE,IAAAC,sCAAkB,EAACF,EAAE;MAChC,CAAC,CAAC;IACN;IACAJ,QAAQ,CAACO,QAAQ,CAACL,KAAK,CAAC;IACxB;AACR;AACA;IACQ,IAAIH,QAAQ,CAACS,KAAK,IAAIT,QAAQ,CAACS,KAAK,GAAG,CAAC,EAAE;MACtC,OAAOR,QAAQ,CAACS,QAAQ,CAAC;QACrBC,KAAK,EAAE,CAAC,CAAC;QACTC,IAAI,EAAEZ,QAAQ,CAACS;MACnB,CAAC,CAAC;IACN;IAEA,MAAMI,OAAO,GAAG,IAAIC,wBAAW,CAAC,IAAI,EAAEb,QAAQ,EAAE,IAAI,CAACV,OAAO,CAAC;IAE7D,IAAI;MACA,OAAO,MAAMsB,OAAO,CAACd,GAAG,CAACI,KAAK,CAAC;IACnC,CAAC,CAAC,OAAOE,EAAE,EAAE;MACT,OAAOJ,QAAQ,CAACK,KAAK,CAAC;QAClBA,KAAK,EAAE,IAAAC,sCAAkB,EAACF,EAAE;MAChC,CAAC,CAAC;IACN;EACJ;EAEQR,+BAA+BA,CAAA,EAAG;IACtC,MAAMkB,KAAK,GAAGC,QAAQ,CAACC,OAAO,CAACC,GAAG,CAAC,oCAAoC,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAMC,MAAM,GAAGJ,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG3B,mCAAmC;IACtE,OAAOF,gCAAgC,CAACiC,MAAM,CAAC;EACnD;AACJ;AAACC,OAAA,CAAA/B,UAAA,GAAAA,UAAA"}