@webiny/tasks 5.40.6 → 5.41.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.
Files changed (79) hide show
  1. package/context.d.ts +1 -2
  2. package/context.js +8 -16
  3. package/context.js.map +1 -1
  4. package/crud/model.js +2 -2
  5. package/crud/model.js.map +1 -1
  6. package/crud/service.tasks.d.ts +2 -0
  7. package/crud/{trigger.tasks.js → service.tasks.js} +30 -16
  8. package/crud/service.tasks.js.map +1 -0
  9. package/graphql/index.js +0 -4
  10. package/graphql/index.js.map +1 -1
  11. package/handler/index.d.ts +1 -3
  12. package/handler/index.js.map +1 -1
  13. package/handler/register.js +4 -2
  14. package/handler/register.js.map +1 -1
  15. package/handler/types.d.ts +2 -0
  16. package/handler/types.js.map +1 -1
  17. package/package.json +21 -20
  18. package/plugins/TaskServicePlugin.d.ts +21 -0
  19. package/plugins/TaskServicePlugin.js +17 -0
  20. package/plugins/TaskServicePlugin.js.map +1 -0
  21. package/plugins/index.d.ts +1 -1
  22. package/plugins/index.js +4 -4
  23. package/plugins/index.js.map +1 -1
  24. package/response/Response.js +48 -1
  25. package/response/Response.js.map +1 -1
  26. package/response/ResponseDoneResult.js +1 -1
  27. package/response/ResponseDoneResult.js.map +1 -1
  28. package/response/TaskResponse.js +4 -4
  29. package/response/TaskResponse.js.map +1 -1
  30. package/response/abstractions/Response.d.ts +2 -2
  31. package/response/abstractions/ResponseContinueResult.d.ts +1 -0
  32. package/response/abstractions/ResponseContinueResult.js.map +1 -1
  33. package/response/abstractions/ResponseErrorResult.d.ts +3 -2
  34. package/response/abstractions/ResponseErrorResult.js.map +1 -1
  35. package/response/abstractions/TaskResponse.d.ts +7 -10
  36. package/response/abstractions/TaskResponse.js.map +1 -1
  37. package/runner/TaskControl.js +44 -17
  38. package/runner/TaskControl.js.map +1 -1
  39. package/runner/TaskManager.js.map +1 -1
  40. package/runner/TaskManagerStore.d.ts +11 -2
  41. package/runner/TaskManagerStore.js +30 -6
  42. package/runner/TaskManagerStore.js.map +1 -1
  43. package/runner/abstractions/TaskEventValidation.d.ts +1 -1
  44. package/runner/abstractions/TaskManagerStore.d.ts +14 -8
  45. package/runner/abstractions/TaskManagerStore.js.map +1 -1
  46. package/runner/abstractions/TaskRunner.d.ts +4 -1
  47. package/runner/abstractions/TaskRunner.js.map +1 -1
  48. package/service/EventBridgeEventTransportPlugin.d.ts +18 -0
  49. package/{crud/transport → service}/EventBridgeEventTransportPlugin.js +9 -7
  50. package/service/EventBridgeEventTransportPlugin.js.map +1 -0
  51. package/service/StepFunctionServicePlugin.d.ts +26 -0
  52. package/service/StepFunctionServicePlugin.js +84 -0
  53. package/service/StepFunctionServicePlugin.js.map +1 -0
  54. package/service/createService.d.ts +6 -0
  55. package/service/createService.js +31 -0
  56. package/service/createService.js.map +1 -0
  57. package/service/index.d.ts +4 -0
  58. package/service/index.js +31 -0
  59. package/service/index.js.map +1 -0
  60. package/task/plugin.d.ts +3 -3
  61. package/types.d.ts +64 -65
  62. package/types.js +7 -16
  63. package/types.js.map +1 -1
  64. package/utils/getErrorProperties.d.ts +1 -1
  65. package/utils/getErrorProperties.js +3 -1
  66. package/utils/getErrorProperties.js.map +1 -1
  67. package/utils/index.d.ts +3 -0
  68. package/utils/index.js +40 -0
  69. package/utils/index.js.map +1 -0
  70. package/crud/transport/EventBridgeEventTransportPlugin.d.ts +0 -5
  71. package/crud/transport/EventBridgeEventTransportPlugin.js.map +0 -1
  72. package/crud/trigger.tasks.d.ts +0 -2
  73. package/crud/trigger.tasks.js.map +0 -1
  74. package/plugins/TaskTriggerTransportPlugin.d.ts +0 -17
  75. package/plugins/TaskTriggerTransportPlugin.js +0 -20
  76. package/plugins/TaskTriggerTransportPlugin.js.map +0 -1
  77. package/transport/createTransport.d.ts +0 -7
  78. package/transport/createTransport.js +0 -32
  79. package/transport/createTransport.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ import { Plugin } from "@webiny/plugins";
2
+ import { Context, ITask } from "../types";
3
+ export interface ITaskServiceCreatePluginParams {
4
+ context: Context;
5
+ getTenant(): string;
6
+ getLocale(): string;
7
+ }
8
+ export type ITaskServiceTask = Pick<ITask, "id" | "definitionId">;
9
+ export interface ITaskService {
10
+ send(task: ITaskServiceTask, delay: number): Promise<unknown | null>;
11
+ fetch(task: ITask): Promise<unknown | null>;
12
+ }
13
+ export interface ITaskServicePluginParams {
14
+ default?: boolean;
15
+ }
16
+ export declare abstract class TaskServicePlugin extends Plugin {
17
+ static readonly type: string;
18
+ readonly default: boolean;
19
+ constructor(params?: ITaskServicePluginParams);
20
+ abstract createService(params: ITaskServiceCreatePluginParams): ITaskService;
21
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TaskServicePlugin = void 0;
7
+ var _plugins = require("@webiny/plugins");
8
+ class TaskServicePlugin extends _plugins.Plugin {
9
+ static type = "tasks.taskService";
10
+ constructor(params) {
11
+ super();
12
+ this.default = !!params?.default;
13
+ }
14
+ }
15
+ exports.TaskServicePlugin = TaskServicePlugin;
16
+
17
+ //# sourceMappingURL=TaskServicePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_plugins","require","TaskServicePlugin","Plugin","type","constructor","params","default","exports"],"sources":["TaskServicePlugin.ts"],"sourcesContent":["import { Plugin } from \"@webiny/plugins\";\nimport { Context, ITask } from \"~/types\";\n\nexport interface ITaskServiceCreatePluginParams {\n context: Context;\n getTenant(): string;\n getLocale(): string;\n}\n\nexport type ITaskServiceTask = Pick<ITask, \"id\" | \"definitionId\">;\n\nexport interface ITaskService {\n send(task: ITaskServiceTask, delay: number): Promise<unknown | null>;\n fetch(task: ITask): Promise<unknown | null>;\n}\n\nexport interface ITaskServicePluginParams {\n default?: boolean;\n}\n\nexport abstract class TaskServicePlugin extends Plugin {\n public static override readonly type: string = \"tasks.taskService\";\n public readonly default: boolean;\n\n public constructor(params?: ITaskServicePluginParams) {\n super();\n this.default = !!params?.default;\n }\n\n public abstract createService(params: ITaskServiceCreatePluginParams): ITaskService;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAoBO,MAAeC,iBAAiB,SAASC,eAAM,CAAC;EACnD,OAAgCC,IAAI,GAAW,mBAAmB;EAG3DC,WAAWA,CAACC,MAAiC,EAAE;IAClD,KAAK,CAAC,CAAC;IACP,IAAI,CAACC,OAAO,GAAG,CAAC,CAACD,MAAM,EAAEC,OAAO;EACpC;AAGJ;AAACC,OAAA,CAAAN,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- export * from "./TaskTriggerTransportPlugin";
1
+ export * from "./TaskServicePlugin";
package/plugins/index.js CHANGED
@@ -3,14 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var _TaskTriggerTransportPlugin = require("./TaskTriggerTransportPlugin");
7
- Object.keys(_TaskTriggerTransportPlugin).forEach(function (key) {
6
+ var _TaskServicePlugin = require("./TaskServicePlugin");
7
+ Object.keys(_TaskServicePlugin).forEach(function (key) {
8
8
  if (key === "default" || key === "__esModule") return;
9
- if (key in exports && exports[key] === _TaskTriggerTransportPlugin[key]) return;
9
+ if (key in exports && exports[key] === _TaskServicePlugin[key]) return;
10
10
  Object.defineProperty(exports, key, {
11
11
  enumerable: true,
12
12
  get: function () {
13
- return _TaskTriggerTransportPlugin[key];
13
+ return _TaskServicePlugin[key];
14
14
  }
15
15
  });
16
16
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_TaskTriggerTransportPlugin","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["index.ts"],"sourcesContent":["export * from \"./TaskTriggerTransportPlugin\";\n"],"mappings":";;;;;AAAA,IAAAA,2BAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,2BAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,2BAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,2BAAA,CAAAK,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["_TaskServicePlugin","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["index.ts"],"sourcesContent":["export * from \"./TaskServicePlugin\";\n"],"mappings":";;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,kBAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,kBAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,kBAAA,CAAAK,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -1,15 +1,61 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.Response = void 0;
8
+ var _objectSizeof = _interopRequireDefault(require("object-sizeof"));
7
9
  var _types = require("../types");
8
10
  var _ResponseContinueResult = require("./ResponseContinueResult");
9
11
  var _ResponseDoneResult = require("./ResponseDoneResult");
10
12
  var _ResponseErrorResult = require("./ResponseErrorResult");
11
13
  var _ResponseAbortedResult = require("./ResponseAbortedResult");
12
14
  var _getErrorProperties = require("../utils/getErrorProperties");
15
+ /**
16
+ * Step Functions has a limit of 256KB for the output size.
17
+ * We will set the max output to be 232KB to leave some room for the rest of the data.
18
+ */
19
+ const MAX_SIZE_BYTES = 232 * 1024;
20
+ const createMaxSizeOutput = ({
21
+ size
22
+ }) => {
23
+ return {
24
+ message: `Output size exceeds the maximum allowed size.`,
25
+ size,
26
+ max: MAX_SIZE_BYTES
27
+ };
28
+ };
29
+ /**
30
+ * Figure out the size of the output object and remove the stack trace if the size exceeds the maximum allowed size.
31
+ * If the size is still greater than the maximum allowed size, just return the message that the output size exceeds the maximum allowed size.
32
+ */
33
+ const getOutput = output => {
34
+ if (!output || Object.keys(output).length === 0) {
35
+ return undefined;
36
+ }
37
+ let size = (0, _objectSizeof.default)(output);
38
+ if (size > MAX_SIZE_BYTES) {
39
+ if (output.stack) {
40
+ delete output.stack;
41
+ size = (0, _objectSizeof.default)(output);
42
+ if (size <= MAX_SIZE_BYTES) {
43
+ return output;
44
+ }
45
+ }
46
+ if (output.error?.stack) {
47
+ delete output.error.stack;
48
+ size = (0, _objectSizeof.default)(output);
49
+ if (size <= MAX_SIZE_BYTES) {
50
+ return output;
51
+ }
52
+ }
53
+ return createMaxSizeOutput({
54
+ size
55
+ });
56
+ }
57
+ return output;
58
+ };
13
59
  class Response {
14
60
  get event() {
15
61
  return this._event;
@@ -32,6 +78,7 @@ class Response {
32
78
  }
33
79
  continue(params) {
34
80
  return new _ResponseContinueResult.ResponseContinueResult({
81
+ message: params.message,
35
82
  input: params.input,
36
83
  webinyTaskId: params?.webinyTaskId || this.event.webinyTaskId,
37
84
  webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,
@@ -47,7 +94,7 @@ class Response {
47
94
  tenant: params?.tenant || this.event.tenant,
48
95
  locale: params?.locale || this.event.locale,
49
96
  message: params?.message,
50
- output: params?.output
97
+ output: getOutput(params?.output)
51
98
  });
52
99
  }
53
100
  aborted() {
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_ResponseContinueResult","_ResponseDoneResult","_ResponseErrorResult","_ResponseAbortedResult","_getErrorProperties","Response","event","_event","constructor","setEvent","from","params","status","TaskResponseStatus","DONE","done","CONTINUE","continue","ERROR","error","ResponseContinueResult","input","webinyTaskId","webinyTaskDefinitionId","tenant","locale","wait","ResponseDoneResult","message","output","aborted","ResponseAbortedResult","ResponseErrorResult","Error","getErrorProperties","exports"],"sources":["Response.ts"],"sourcesContent":["import { ITaskEvent } from \"~/handler/types\";\nimport { TaskResponseStatus } from \"~/types\";\nimport {\n IResponse,\n IResponseAbortedResult,\n IResponseContinueParams,\n IResponseContinueResult,\n IResponseDoneParams,\n IResponseDoneResult,\n IResponseErrorParams,\n IResponseErrorResult,\n IResponseFromParams,\n IResponseResult,\n ITaskResponseDoneResultOutput\n} from \"./abstractions\";\nimport { ResponseContinueResult } from \"~/response/ResponseContinueResult\";\nimport { ResponseDoneResult } from \"~/response/ResponseDoneResult\";\nimport { ResponseErrorResult } from \"~/response/ResponseErrorResult\";\nimport { ResponseAbortedResult } from \"./ResponseAbortedResult\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\nexport class Response implements IResponse {\n private _event: ITaskEvent;\n\n public get event(): ITaskEvent {\n return this._event;\n }\n\n public constructor(event: ITaskEvent) {\n this._event = event;\n }\n\n public setEvent(event: ITaskEvent) {\n this._event = event;\n }\n\n public from(params: IResponseFromParams): IResponseResult {\n switch (params.status) {\n case TaskResponseStatus.DONE:\n return this.done(params);\n case TaskResponseStatus.CONTINUE:\n return this.continue(params);\n case TaskResponseStatus.ERROR:\n return this.error(params);\n }\n }\n\n public continue(params: IResponseContinueParams): IResponseContinueResult {\n return new ResponseContinueResult({\n input: params.input,\n webinyTaskId: params?.webinyTaskId || this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: params?.tenant || this.event.tenant,\n locale: params?.locale || this.event.locale,\n wait: params.wait\n });\n }\n\n public done<O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput>(\n params?: IResponseDoneParams<O>\n ): IResponseDoneResult<O> {\n return new ResponseDoneResult<O>({\n webinyTaskId: params?.webinyTaskId || this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: params?.tenant || this.event.tenant,\n locale: params?.locale || this.event.locale,\n message: params?.message,\n output: params?.output\n });\n }\n\n public aborted(): IResponseAbortedResult {\n return new ResponseAbortedResult({\n webinyTaskId: this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: this.event.tenant,\n locale: this.event.locale\n });\n }\n\n public error(params: IResponseErrorParams): IResponseErrorResult {\n return new ResponseErrorResult({\n webinyTaskId: params.webinyTaskId || this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: params.tenant || this.event.tenant,\n locale: params.locale || this.event.locale,\n error: params.error instanceof Error ? getErrorProperties(params.error) : params.error\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_objectSizeof","_interopRequireDefault","require","_types","_ResponseContinueResult","_ResponseDoneResult","_ResponseErrorResult","_ResponseAbortedResult","_getErrorProperties","MAX_SIZE_BYTES","createMaxSizeOutput","size","message","max","getOutput","output","Object","keys","length","undefined","sizeOfObject","stack","error","Response","event","_event","constructor","setEvent","from","params","status","TaskResponseStatus","DONE","done","CONTINUE","continue","ERROR","ResponseContinueResult","input","webinyTaskId","webinyTaskDefinitionId","tenant","locale","wait","ResponseDoneResult","aborted","ResponseAbortedResult","ResponseErrorResult","Error","getErrorProperties","exports"],"sources":["Response.ts"],"sourcesContent":["import sizeOfObject from \"object-sizeof\";\n\nimport { ITaskEvent } from \"~/handler/types\";\nimport { TaskResponseStatus } from \"~/types\";\nimport {\n IResponse,\n IResponseAbortedResult,\n IResponseContinueParams,\n IResponseContinueResult,\n IResponseDoneParams,\n IResponseDoneResult,\n IResponseErrorParams,\n IResponseErrorResult,\n IResponseFromParams,\n IResponseResult,\n ITaskResponseDoneResultOutput\n} from \"./abstractions\";\nimport { ResponseContinueResult } from \"~/response/ResponseContinueResult\";\nimport { ResponseDoneResult } from \"~/response/ResponseDoneResult\";\nimport { ResponseErrorResult } from \"~/response/ResponseErrorResult\";\nimport { ResponseAbortedResult } from \"./ResponseAbortedResult\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\n/**\n * Step Functions has a limit of 256KB for the output size.\n * We will set the max output to be 232KB to leave some room for the rest of the data.\n */\nconst MAX_SIZE_BYTES: number = 232 * 1024;\n\ninterface ICreateMaxSizeOutputParams {\n size: number;\n}\n\nconst createMaxSizeOutput = <O extends ITaskResponseDoneResultOutput>({\n size\n}: ICreateMaxSizeOutputParams): O => {\n return {\n message: `Output size exceeds the maximum allowed size.`,\n size,\n max: MAX_SIZE_BYTES\n } as unknown as O;\n};\n/**\n * Figure out the size of the output object and remove the stack trace if the size exceeds the maximum allowed size.\n * If the size is still greater than the maximum allowed size, just return the message that the output size exceeds the maximum allowed size.\n */\nconst getOutput = <O extends ITaskResponseDoneResultOutput>(output?: O): O | undefined => {\n if (!output || Object.keys(output).length === 0) {\n return undefined;\n }\n let size = sizeOfObject(output);\n if (size > MAX_SIZE_BYTES) {\n if (output.stack) {\n delete output.stack;\n size = sizeOfObject(output);\n if (size <= MAX_SIZE_BYTES) {\n return output;\n }\n }\n if (output.error?.stack) {\n delete output.error.stack;\n size = sizeOfObject(output);\n if (size <= MAX_SIZE_BYTES) {\n return output;\n }\n }\n return createMaxSizeOutput<O>({ size });\n }\n return output;\n};\n\nexport class Response implements IResponse {\n private _event: ITaskEvent;\n\n public get event(): ITaskEvent {\n return this._event;\n }\n\n public constructor(event: ITaskEvent) {\n this._event = event;\n }\n\n public setEvent(event: ITaskEvent) {\n this._event = event;\n }\n\n public from(params: IResponseFromParams): IResponseResult {\n switch (params.status) {\n case TaskResponseStatus.DONE:\n return this.done(params);\n case TaskResponseStatus.CONTINUE:\n return this.continue(params);\n case TaskResponseStatus.ERROR:\n return this.error(params);\n }\n }\n\n public continue(params: IResponseContinueParams): IResponseContinueResult {\n return new ResponseContinueResult({\n message: params.message,\n input: params.input,\n webinyTaskId: params?.webinyTaskId || this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: params?.tenant || this.event.tenant,\n locale: params?.locale || this.event.locale,\n wait: params.wait\n });\n }\n\n public done<O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput>(\n params?: IResponseDoneParams<O>\n ): IResponseDoneResult<O> {\n return new ResponseDoneResult<O>({\n webinyTaskId: params?.webinyTaskId || this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: params?.tenant || this.event.tenant,\n locale: params?.locale || this.event.locale,\n message: params?.message,\n output: getOutput<O>(params?.output)\n });\n }\n\n public aborted(): IResponseAbortedResult {\n return new ResponseAbortedResult({\n webinyTaskId: this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: this.event.tenant,\n locale: this.event.locale\n });\n }\n\n public error(params: IResponseErrorParams): IResponseErrorResult {\n return new ResponseErrorResult({\n webinyTaskId: params.webinyTaskId || this.event.webinyTaskId,\n webinyTaskDefinitionId: this.event.webinyTaskDefinitionId,\n tenant: params.tenant || this.event.tenant,\n locale: params.locale || this.event.locale,\n error: params.error instanceof Error ? getErrorProperties(params.error) : params.error\n });\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,MAAA,GAAAD,OAAA;AAcA,IAAAE,uBAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AACA,IAAAI,oBAAA,GAAAJ,OAAA;AACA,IAAAK,sBAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AAEA;AACA;AACA;AACA;AACA,MAAMO,cAAsB,GAAG,GAAG,GAAG,IAAI;AAMzC,MAAMC,mBAAmB,GAAGA,CAA0C;EAClEC;AACwB,CAAC,KAAQ;EACjC,OAAO;IACHC,OAAO,EAAG,+CAA8C;IACxDD,IAAI;IACJE,GAAG,EAAEJ;EACT,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA,MAAMK,SAAS,GAA6CC,MAAU,IAAoB;EACtF,IAAI,CAACA,MAAM,IAAIC,MAAM,CAACC,IAAI,CAACF,MAAM,CAAC,CAACG,MAAM,KAAK,CAAC,EAAE;IAC7C,OAAOC,SAAS;EACpB;EACA,IAAIR,IAAI,GAAG,IAAAS,qBAAY,EAACL,MAAM,CAAC;EAC/B,IAAIJ,IAAI,GAAGF,cAAc,EAAE;IACvB,IAAIM,MAAM,CAACM,KAAK,EAAE;MACd,OAAON,MAAM,CAACM,KAAK;MACnBV,IAAI,GAAG,IAAAS,qBAAY,EAACL,MAAM,CAAC;MAC3B,IAAIJ,IAAI,IAAIF,cAAc,EAAE;QACxB,OAAOM,MAAM;MACjB;IACJ;IACA,IAAIA,MAAM,CAACO,KAAK,EAAED,KAAK,EAAE;MACrB,OAAON,MAAM,CAACO,KAAK,CAACD,KAAK;MACzBV,IAAI,GAAG,IAAAS,qBAAY,EAACL,MAAM,CAAC;MAC3B,IAAIJ,IAAI,IAAIF,cAAc,EAAE;QACxB,OAAOM,MAAM;MACjB;IACJ;IACA,OAAOL,mBAAmB,CAAI;MAAEC;IAAK,CAAC,CAAC;EAC3C;EACA,OAAOI,MAAM;AACjB,CAAC;AAEM,MAAMQ,QAAQ,CAAsB;EAGvC,IAAWC,KAAKA,CAAA,EAAe;IAC3B,OAAO,IAAI,CAACC,MAAM;EACtB;EAEOC,WAAWA,CAACF,KAAiB,EAAE;IAClC,IAAI,CAACC,MAAM,GAAGD,KAAK;EACvB;EAEOG,QAAQA,CAACH,KAAiB,EAAE;IAC/B,IAAI,CAACC,MAAM,GAAGD,KAAK;EACvB;EAEOI,IAAIA,CAACC,MAA2B,EAAmB;IACtD,QAAQA,MAAM,CAACC,MAAM;MACjB,KAAKC,yBAAkB,CAACC,IAAI;QACxB,OAAO,IAAI,CAACC,IAAI,CAACJ,MAAM,CAAC;MAC5B,KAAKE,yBAAkB,CAACG,QAAQ;QAC5B,OAAO,IAAI,CAACC,QAAQ,CAACN,MAAM,CAAC;MAChC,KAAKE,yBAAkB,CAACK,KAAK;QACzB,OAAO,IAAI,CAACd,KAAK,CAACO,MAAM,CAAC;IACjC;EACJ;EAEOM,QAAQA,CAACN,MAA+B,EAA2B;IACtE,OAAO,IAAIQ,8CAAsB,CAAC;MAC9BzB,OAAO,EAAEiB,MAAM,CAACjB,OAAO;MACvB0B,KAAK,EAAET,MAAM,CAACS,KAAK;MACnBC,YAAY,EAAEV,MAAM,EAAEU,YAAY,IAAI,IAAI,CAACf,KAAK,CAACe,YAAY;MAC7DC,sBAAsB,EAAE,IAAI,CAAChB,KAAK,CAACgB,sBAAsB;MACzDC,MAAM,EAAEZ,MAAM,EAAEY,MAAM,IAAI,IAAI,CAACjB,KAAK,CAACiB,MAAM;MAC3CC,MAAM,EAAEb,MAAM,EAAEa,MAAM,IAAI,IAAI,CAAClB,KAAK,CAACkB,MAAM;MAC3CC,IAAI,EAAEd,MAAM,CAACc;IACjB,CAAC,CAAC;EACN;EAEOV,IAAIA,CACPJ,MAA+B,EACT;IACtB,OAAO,IAAIe,sCAAkB,CAAI;MAC7BL,YAAY,EAAEV,MAAM,EAAEU,YAAY,IAAI,IAAI,CAACf,KAAK,CAACe,YAAY;MAC7DC,sBAAsB,EAAE,IAAI,CAAChB,KAAK,CAACgB,sBAAsB;MACzDC,MAAM,EAAEZ,MAAM,EAAEY,MAAM,IAAI,IAAI,CAACjB,KAAK,CAACiB,MAAM;MAC3CC,MAAM,EAAEb,MAAM,EAAEa,MAAM,IAAI,IAAI,CAAClB,KAAK,CAACkB,MAAM;MAC3C9B,OAAO,EAAEiB,MAAM,EAAEjB,OAAO;MACxBG,MAAM,EAAED,SAAS,CAAIe,MAAM,EAAEd,MAAM;IACvC,CAAC,CAAC;EACN;EAEO8B,OAAOA,CAAA,EAA2B;IACrC,OAAO,IAAIC,4CAAqB,CAAC;MAC7BP,YAAY,EAAE,IAAI,CAACf,KAAK,CAACe,YAAY;MACrCC,sBAAsB,EAAE,IAAI,CAAChB,KAAK,CAACgB,sBAAsB;MACzDC,MAAM,EAAE,IAAI,CAACjB,KAAK,CAACiB,MAAM;MACzBC,MAAM,EAAE,IAAI,CAAClB,KAAK,CAACkB;IACvB,CAAC,CAAC;EACN;EAEOpB,KAAKA,CAACO,MAA4B,EAAwB;IAC7D,OAAO,IAAIkB,wCAAmB,CAAC;MAC3BR,YAAY,EAAEV,MAAM,CAACU,YAAY,IAAI,IAAI,CAACf,KAAK,CAACe,YAAY;MAC5DC,sBAAsB,EAAE,IAAI,CAAChB,KAAK,CAACgB,sBAAsB;MACzDC,MAAM,EAAEZ,MAAM,CAACY,MAAM,IAAI,IAAI,CAACjB,KAAK,CAACiB,MAAM;MAC1CC,MAAM,EAAEb,MAAM,CAACa,MAAM,IAAI,IAAI,CAAClB,KAAK,CAACkB,MAAM;MAC1CpB,KAAK,EAAEO,MAAM,CAACP,KAAK,YAAY0B,KAAK,GAAG,IAAAC,sCAAkB,EAACpB,MAAM,CAACP,KAAK,CAAC,GAAGO,MAAM,CAACP;IACrF,CAAC,CAAC;EACN;AACJ;AAAC4B,OAAA,CAAA3B,QAAA,GAAAA,QAAA","ignoreList":[]}
@@ -13,7 +13,7 @@ class ResponseDoneResult {
13
13
  this.webinyTaskDefinitionId = params.webinyTaskDefinitionId;
14
14
  this.tenant = params.tenant;
15
15
  this.locale = params.locale;
16
- this.output = params.output;
16
+ this.output = Object.keys(params.output || {}).length > 0 ? params.output : undefined;
17
17
  }
18
18
  }
19
19
  exports.ResponseDoneResult = ResponseDoneResult;
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","ResponseDoneResult","status","TaskResponseStatus","DONE","constructor","params","message","webinyTaskId","webinyTaskDefinitionId","tenant","locale","output","exports"],"sources":["ResponseDoneResult.ts"],"sourcesContent":["import { ITaskResponseDoneResultOutput, TaskResponseStatus } from \"~/types\";\nimport { IResponseDoneResult } from \"./abstractions\";\n\nexport class ResponseDoneResult<\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> implements IResponseDoneResult<O>\n{\n public readonly message?: string | undefined;\n public readonly webinyTaskId: string;\n public readonly webinyTaskDefinitionId: string;\n public readonly tenant: string;\n public readonly locale: string;\n public readonly output?: O;\n public readonly status: TaskResponseStatus.DONE = TaskResponseStatus.DONE;\n\n public constructor(params: Omit<IResponseDoneResult<O>, \"status\">) {\n this.message = params.message;\n this.webinyTaskId = params.webinyTaskId;\n this.webinyTaskDefinitionId = params.webinyTaskDefinitionId;\n this.tenant = params.tenant;\n this.locale = params.locale;\n this.output = params.output;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGO,MAAMC,kBAAkB,CAG/B;EAOoBC,MAAM,GAA4BC,yBAAkB,CAACC,IAAI;EAElEC,WAAWA,CAACC,MAA8C,EAAE;IAC/D,IAAI,CAACC,OAAO,GAAGD,MAAM,CAACC,OAAO;IAC7B,IAAI,CAACC,YAAY,GAAGF,MAAM,CAACE,YAAY;IACvC,IAAI,CAACC,sBAAsB,GAAGH,MAAM,CAACG,sBAAsB;IAC3D,IAAI,CAACC,MAAM,GAAGJ,MAAM,CAACI,MAAM;IAC3B,IAAI,CAACC,MAAM,GAAGL,MAAM,CAACK,MAAM;IAC3B,IAAI,CAACC,MAAM,GAAGN,MAAM,CAACM,MAAM;EAC/B;AACJ;AAACC,OAAA,CAAAZ,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","ResponseDoneResult","status","TaskResponseStatus","DONE","constructor","params","message","webinyTaskId","webinyTaskDefinitionId","tenant","locale","output","Object","keys","length","undefined","exports"],"sources":["ResponseDoneResult.ts"],"sourcesContent":["import { ITaskResponseDoneResultOutput, TaskResponseStatus } from \"~/types\";\nimport { IResponseDoneResult } from \"./abstractions\";\n\nexport class ResponseDoneResult<\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> implements IResponseDoneResult<O>\n{\n public readonly message?: string | undefined;\n public readonly webinyTaskId: string;\n public readonly webinyTaskDefinitionId: string;\n public readonly tenant: string;\n public readonly locale: string;\n public readonly output?: O;\n public readonly status: TaskResponseStatus.DONE = TaskResponseStatus.DONE;\n\n public constructor(params: Omit<IResponseDoneResult<O>, \"status\">) {\n this.message = params.message;\n this.webinyTaskId = params.webinyTaskId;\n this.webinyTaskDefinitionId = params.webinyTaskDefinitionId;\n this.tenant = params.tenant;\n this.locale = params.locale;\n this.output = Object.keys(params.output || {}).length > 0 ? params.output : undefined;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGO,MAAMC,kBAAkB,CAG/B;EAOoBC,MAAM,GAA4BC,yBAAkB,CAACC,IAAI;EAElEC,WAAWA,CAACC,MAA8C,EAAE;IAC/D,IAAI,CAACC,OAAO,GAAGD,MAAM,CAACC,OAAO;IAC7B,IAAI,CAACC,YAAY,GAAGF,MAAM,CAACE,YAAY;IACvC,IAAI,CAACC,sBAAsB,GAAGH,MAAM,CAACG,sBAAsB;IAC3D,IAAI,CAACC,MAAM,GAAGJ,MAAM,CAACI,MAAM;IAC3B,IAAI,CAACC,MAAM,GAAGL,MAAM,CAACK,MAAM;IAC3B,IAAI,CAACC,MAAM,GAAGC,MAAM,CAACC,IAAI,CAACR,MAAM,CAACM,MAAM,IAAI,CAAC,CAAC,CAAC,CAACG,MAAM,GAAG,CAAC,GAAGT,MAAM,CAACM,MAAM,GAAGI,SAAS;EACzF;AACJ;AAACC,OAAA,CAAAhB,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -50,11 +50,11 @@ class TaskResponse {
50
50
  const wait = getWaitingTime(options);
51
51
  if (!wait || wait < 1) {
52
52
  return this.response.continue({
53
- input
53
+ input: input
54
54
  });
55
55
  }
56
56
  return this.response.continue({
57
- input,
57
+ input: input,
58
58
  wait
59
59
  });
60
60
  }
@@ -70,9 +70,9 @@ class TaskResponse {
70
70
  if (error instanceof Error) {
71
71
  return (0, _getErrorProperties.getErrorProperties)(error);
72
72
  } else if (typeof error === "string") {
73
- return new Error(error);
73
+ return (0, _getErrorProperties.getErrorProperties)(new Error(error));
74
74
  }
75
- return error;
75
+ return (0, _getErrorProperties.getErrorProperties)(error);
76
76
  }
77
77
  }
78
78
  exports.TaskResponse = TaskResponse;
@@ -1 +1 @@
1
- {"version":3,"names":["_getErrorProperties","require","MAX_WAITING_TIME","getWaitingTime","options","waitingTime","undefined","seconds","now","Date","date","getTime","TaskResponse","constructor","response","done","message","output","continue","input","wait","error","getError","aborted","Error","getErrorProperties","exports"],"sources":["TaskResponse.ts"],"sourcesContent":["import {\n IResponse,\n IResponseError,\n ITaskResponse,\n ITaskResponseAbortedResult,\n ITaskResponseContinueOptions,\n ITaskResponseContinueResult,\n ITaskResponseDoneResult,\n ITaskResponseDoneResultOutput,\n ITaskResponseErrorResult\n} from \"./abstractions\";\nimport { ITaskDataInput } from \"~/types\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\n/**\n * 355 days transformed into seconds.\n */\nconst MAX_WAITING_TIME = 30672000;\n\n/**\n * There are options to send:\n * * seconds - number of seconds to wait\n * * date - date until which to wait\n */\nconst getWaitingTime = (options?: ITaskResponseContinueOptions): number | undefined => {\n let waitingTime: number | undefined;\n if (!options) {\n return undefined;\n }\n if (\"seconds\" in options) {\n waitingTime = options.seconds;\n } else if (\"date\" in options) {\n const now = new Date();\n waitingTime = (options.date.getTime() - now.getTime()) / 1000;\n }\n if (!waitingTime || waitingTime < 0) {\n return undefined;\n }\n return waitingTime > MAX_WAITING_TIME ? MAX_WAITING_TIME : waitingTime;\n};\n\nexport class TaskResponse implements ITaskResponse {\n private readonly response: IResponse;\n\n public constructor(response: IResponse) {\n this.response = response;\n }\n\n public done<O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput>(\n message?: string | O,\n output?: O\n ): ITaskResponseDoneResult<O> {\n if (typeof message === \"object\" && !output) {\n return this.response.done({\n output: message\n });\n }\n return this.response.done<O>({\n message: message as string,\n output\n });\n }\n\n public continue<T = ITaskDataInput>(\n input: T,\n options?: ITaskResponseContinueOptions\n ): ITaskResponseContinueResult {\n const wait = getWaitingTime(options);\n if (!wait || wait < 1) {\n return this.response.continue({\n input\n });\n }\n return this.response.continue({\n input,\n wait\n });\n }\n\n public error(error: IResponseError | Error | string): ITaskResponseErrorResult {\n return this.response.error({\n error: this.getError(error)\n });\n }\n\n public aborted(): ITaskResponseAbortedResult {\n return this.response.aborted();\n }\n\n private getError(error: IResponseError | Error | string): IResponseError | Error {\n if (error instanceof Error) {\n return getErrorProperties(error);\n } else if (typeof error === \"string\") {\n return new Error(error);\n }\n return error;\n }\n}\n"],"mappings":";;;;;;AAYA,IAAAA,mBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAG,QAAQ;;AAEjC;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAc,GAAIC,OAAsC,IAAyB;EACnF,IAAIC,WAA+B;EACnC,IAAI,CAACD,OAAO,EAAE;IACV,OAAOE,SAAS;EACpB;EACA,IAAI,SAAS,IAAIF,OAAO,EAAE;IACtBC,WAAW,GAAGD,OAAO,CAACG,OAAO;EACjC,CAAC,MAAM,IAAI,MAAM,IAAIH,OAAO,EAAE;IAC1B,MAAMI,GAAG,GAAG,IAAIC,IAAI,CAAC,CAAC;IACtBJ,WAAW,GAAG,CAACD,OAAO,CAACM,IAAI,CAACC,OAAO,CAAC,CAAC,GAAGH,GAAG,CAACG,OAAO,CAAC,CAAC,IAAI,IAAI;EACjE;EACA,IAAI,CAACN,WAAW,IAAIA,WAAW,GAAG,CAAC,EAAE;IACjC,OAAOC,SAAS;EACpB;EACA,OAAOD,WAAW,GAAGH,gBAAgB,GAAGA,gBAAgB,GAAGG,WAAW;AAC1E,CAAC;AAEM,MAAMO,YAAY,CAA0B;EAGxCC,WAAWA,CAACC,QAAmB,EAAE;IACpC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC5B;EAEOC,IAAIA,CACPC,OAAoB,EACpBC,MAAU,EACgB;IAC1B,IAAI,OAAOD,OAAO,KAAK,QAAQ,IAAI,CAACC,MAAM,EAAE;MACxC,OAAO,IAAI,CAACH,QAAQ,CAACC,IAAI,CAAC;QACtBE,MAAM,EAAED;MACZ,CAAC,CAAC;IACN;IACA,OAAO,IAAI,CAACF,QAAQ,CAACC,IAAI,CAAI;MACzBC,OAAO,EAAEA,OAAiB;MAC1BC;IACJ,CAAC,CAAC;EACN;EAEOC,QAAQA,CACXC,KAAQ,EACRf,OAAsC,EACX;IAC3B,MAAMgB,IAAI,GAAGjB,cAAc,CAACC,OAAO,CAAC;IACpC,IAAI,CAACgB,IAAI,IAAIA,IAAI,GAAG,CAAC,EAAE;MACnB,OAAO,IAAI,CAACN,QAAQ,CAACI,QAAQ,CAAC;QAC1BC;MACJ,CAAC,CAAC;IACN;IACA,OAAO,IAAI,CAACL,QAAQ,CAACI,QAAQ,CAAC;MAC1BC,KAAK;MACLC;IACJ,CAAC,CAAC;EACN;EAEOC,KAAKA,CAACA,KAAsC,EAA4B;IAC3E,OAAO,IAAI,CAACP,QAAQ,CAACO,KAAK,CAAC;MACvBA,KAAK,EAAE,IAAI,CAACC,QAAQ,CAACD,KAAK;IAC9B,CAAC,CAAC;EACN;EAEOE,OAAOA,CAAA,EAA+B;IACzC,OAAO,IAAI,CAACT,QAAQ,CAACS,OAAO,CAAC,CAAC;EAClC;EAEQD,QAAQA,CAACD,KAAsC,EAA0B;IAC7E,IAAIA,KAAK,YAAYG,KAAK,EAAE;MACxB,OAAO,IAAAC,sCAAkB,EAACJ,KAAK,CAAC;IACpC,CAAC,MAAM,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAClC,OAAO,IAAIG,KAAK,CAACH,KAAK,CAAC;IAC3B;IACA,OAAOA,KAAK;EAChB;AACJ;AAACK,OAAA,CAAAd,YAAA,GAAAA,YAAA","ignoreList":[]}
1
+ {"version":3,"names":["_getErrorProperties","require","MAX_WAITING_TIME","getWaitingTime","options","waitingTime","undefined","seconds","now","Date","date","getTime","TaskResponse","constructor","response","done","message","output","continue","input","wait","error","getError","aborted","Error","getErrorProperties","exports"],"sources":["TaskResponse.ts"],"sourcesContent":["import {\n IResponse,\n IResponseError,\n ITaskResponse,\n ITaskResponseAbortedResult,\n ITaskResponseContinueOptions,\n ITaskResponseContinueResult,\n ITaskResponseDoneResult,\n ITaskResponseDoneResultOutput,\n ITaskResponseErrorResult\n} from \"./abstractions\";\nimport { ITaskDataInput } from \"~/types\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\n/**\n * 355 days transformed into seconds.\n */\nconst MAX_WAITING_TIME = 30672000;\n\n/**\n * There are options to send:\n * * seconds - number of seconds to wait\n * * date - date until which to wait\n */\nconst getWaitingTime = (options?: ITaskResponseContinueOptions): number | undefined => {\n let waitingTime: number | undefined;\n if (!options) {\n return undefined;\n }\n if (\"seconds\" in options) {\n waitingTime = options.seconds;\n } else if (\"date\" in options) {\n const now = new Date();\n waitingTime = (options.date.getTime() - now.getTime()) / 1000;\n }\n if (!waitingTime || waitingTime < 0) {\n return undefined;\n }\n return waitingTime > MAX_WAITING_TIME ? MAX_WAITING_TIME : waitingTime;\n};\n\nexport class TaskResponse implements ITaskResponse {\n private readonly response: IResponse;\n\n public constructor(response: IResponse) {\n this.response = response;\n }\n\n public done<O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput>(\n message?: string | O,\n output?: O\n ): ITaskResponseDoneResult<O> {\n if (typeof message === \"object\" && !output) {\n return this.response.done({\n output: message\n });\n }\n return this.response.done<O>({\n message: message as string,\n output\n });\n }\n\n public continue<T = ITaskDataInput>(\n input: T,\n options?: ITaskResponseContinueOptions\n ): ITaskResponseContinueResult {\n const wait = getWaitingTime(options);\n if (!wait || wait < 1) {\n return this.response.continue({\n input: input as ITaskDataInput\n });\n }\n return this.response.continue({\n input: input as ITaskDataInput,\n wait\n });\n }\n\n public error(error: IResponseError | Error | string): ITaskResponseErrorResult {\n return this.response.error({\n error: this.getError(error)\n });\n }\n\n public aborted(): ITaskResponseAbortedResult {\n return this.response.aborted();\n }\n\n private getError(error: IResponseError | Error | string): IResponseError | Error {\n if (error instanceof Error) {\n return getErrorProperties(error);\n } else if (typeof error === \"string\") {\n return getErrorProperties(new Error(error));\n }\n return getErrorProperties(error);\n }\n}\n"],"mappings":";;;;;;AAYA,IAAAA,mBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAG,QAAQ;;AAEjC;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAc,GAAIC,OAAsC,IAAyB;EACnF,IAAIC,WAA+B;EACnC,IAAI,CAACD,OAAO,EAAE;IACV,OAAOE,SAAS;EACpB;EACA,IAAI,SAAS,IAAIF,OAAO,EAAE;IACtBC,WAAW,GAAGD,OAAO,CAACG,OAAO;EACjC,CAAC,MAAM,IAAI,MAAM,IAAIH,OAAO,EAAE;IAC1B,MAAMI,GAAG,GAAG,IAAIC,IAAI,CAAC,CAAC;IACtBJ,WAAW,GAAG,CAACD,OAAO,CAACM,IAAI,CAACC,OAAO,CAAC,CAAC,GAAGH,GAAG,CAACG,OAAO,CAAC,CAAC,IAAI,IAAI;EACjE;EACA,IAAI,CAACN,WAAW,IAAIA,WAAW,GAAG,CAAC,EAAE;IACjC,OAAOC,SAAS;EACpB;EACA,OAAOD,WAAW,GAAGH,gBAAgB,GAAGA,gBAAgB,GAAGG,WAAW;AAC1E,CAAC;AAEM,MAAMO,YAAY,CAA0B;EAGxCC,WAAWA,CAACC,QAAmB,EAAE;IACpC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC5B;EAEOC,IAAIA,CACPC,OAAoB,EACpBC,MAAU,EACgB;IAC1B,IAAI,OAAOD,OAAO,KAAK,QAAQ,IAAI,CAACC,MAAM,EAAE;MACxC,OAAO,IAAI,CAACH,QAAQ,CAACC,IAAI,CAAC;QACtBE,MAAM,EAAED;MACZ,CAAC,CAAC;IACN;IACA,OAAO,IAAI,CAACF,QAAQ,CAACC,IAAI,CAAI;MACzBC,OAAO,EAAEA,OAAiB;MAC1BC;IACJ,CAAC,CAAC;EACN;EAEOC,QAAQA,CACXC,KAAQ,EACRf,OAAsC,EACX;IAC3B,MAAMgB,IAAI,GAAGjB,cAAc,CAACC,OAAO,CAAC;IACpC,IAAI,CAACgB,IAAI,IAAIA,IAAI,GAAG,CAAC,EAAE;MACnB,OAAO,IAAI,CAACN,QAAQ,CAACI,QAAQ,CAAC;QAC1BC,KAAK,EAAEA;MACX,CAAC,CAAC;IACN;IACA,OAAO,IAAI,CAACL,QAAQ,CAACI,QAAQ,CAAC;MAC1BC,KAAK,EAAEA,KAAuB;MAC9BC;IACJ,CAAC,CAAC;EACN;EAEOC,KAAKA,CAACA,KAAsC,EAA4B;IAC3E,OAAO,IAAI,CAACP,QAAQ,CAACO,KAAK,CAAC;MACvBA,KAAK,EAAE,IAAI,CAACC,QAAQ,CAACD,KAAK;IAC9B,CAAC,CAAC;EACN;EAEOE,OAAOA,CAAA,EAA+B;IACzC,OAAO,IAAI,CAACT,QAAQ,CAACS,OAAO,CAAC,CAAC;EAClC;EAEQD,QAAQA,CAACD,KAAsC,EAA0B;IAC7E,IAAIA,KAAK,YAAYG,KAAK,EAAE;MACxB,OAAO,IAAAC,sCAAkB,EAACJ,KAAK,CAAC;IACpC,CAAC,MAAM,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAClC,OAAO,IAAAI,sCAAkB,EAAC,IAAID,KAAK,CAACH,KAAK,CAAC,CAAC;IAC/C;IACA,OAAO,IAAAI,sCAAkB,EAACJ,KAAK,CAAC;EACpC;AACJ;AAACK,OAAA,CAAAd,YAAA,GAAAA,YAAA","ignoreList":[]}
@@ -4,8 +4,8 @@ import { IResponseDoneParams, IResponseDoneResult } from "./ResponseDoneResult";
4
4
  import { IResponseErrorParams, IResponseErrorResult } from "./ResponseErrorResult";
5
5
  import { IResponseAbortedResult } from "./ResponseAbortedResult";
6
6
  import { ITaskResponseDoneResultOutput } from "./TaskResponse";
7
- export declare type IResponseFromParams = IResponseDoneResult | IResponseContinueResult | IResponseErrorResult;
8
- export declare type IResponseResult = IResponseDoneResult | IResponseContinueResult | IResponseErrorResult | IResponseAbortedResult;
7
+ export type IResponseFromParams = IResponseDoneResult | IResponseContinueResult | IResponseErrorResult;
8
+ export type IResponseResult = IResponseDoneResult | IResponseContinueResult | IResponseErrorResult | IResponseAbortedResult;
9
9
  export interface IResponse {
10
10
  readonly event: ITaskEvent;
11
11
  setEvent: (event: ITaskEvent) => void;
@@ -5,6 +5,7 @@ import { IResponseBaseResult } from "./ResponseBaseResult";
5
5
  * For example, if the task is hammering the Elasticsearch cluster too much, you can use this to pause the execution for some time.
6
6
  */
7
7
  export interface IResponseContinueParams<T = ITaskDataInput> {
8
+ message?: string;
8
9
  tenant?: string;
9
10
  locale?: string;
10
11
  webinyTaskId?: string;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["ResponseContinueResult.ts"],"sourcesContent":["import { ITaskDataInput, TaskResponseStatus } from \"~/types\";\nimport { IResponseBaseResult } from \"./ResponseBaseResult\";\n\n/**\n * Wait can be used to pause next iteration of the Lambda execution.\n * For example, if the task is hammering the Elasticsearch cluster too much, you can use this to pause the execution for some time.\n */\n\nexport interface IResponseContinueParams<T = ITaskDataInput> {\n tenant?: string;\n locale?: string;\n webinyTaskId?: string;\n input: T;\n wait?: number;\n}\n\nexport interface IResponseContinueResult<T = ITaskDataInput> extends IResponseBaseResult {\n message?: string;\n input: T;\n wait?: number;\n delay: -1;\n status: TaskResponseStatus.CONTINUE;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["ResponseContinueResult.ts"],"sourcesContent":["import { ITaskDataInput, TaskResponseStatus } from \"~/types\";\nimport { IResponseBaseResult } from \"./ResponseBaseResult\";\n\n/**\n * Wait can be used to pause next iteration of the Lambda execution.\n * For example, if the task is hammering the Elasticsearch cluster too much, you can use this to pause the execution for some time.\n */\n\nexport interface IResponseContinueParams<T = ITaskDataInput> {\n message?: string;\n tenant?: string;\n locale?: string;\n webinyTaskId?: string;\n input: T;\n wait?: number;\n}\n\nexport interface IResponseContinueResult<T = ITaskDataInput> extends IResponseBaseResult {\n message?: string;\n input: T;\n wait?: number;\n delay: -1;\n status: TaskResponseStatus.CONTINUE;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,9 +1,10 @@
1
1
  import { TaskResponseStatus } from "../../types";
2
2
  import { IResponseBaseResult } from "./ResponseBaseResult";
3
+ import { GenericRecord } from "@webiny/api/types";
3
4
  export interface IResponseError {
4
5
  message: string;
5
- code?: string;
6
- data?: Record<string, any>;
6
+ code?: string | null;
7
+ data?: GenericRecord | null;
7
8
  stack?: string;
8
9
  }
9
10
  export interface IResponseErrorParams {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["ResponseErrorResult.ts"],"sourcesContent":["import { TaskResponseStatus } from \"~/types\";\nimport { IResponseBaseResult } from \"./ResponseBaseResult\";\n\nexport interface IResponseError {\n message: string;\n code?: string;\n data?: Record<string, any>;\n stack?: string;\n}\n\nexport interface IResponseErrorParams {\n error: IResponseError | Error;\n tenant?: string;\n locale?: string;\n webinyTaskId?: string;\n}\n\nexport interface IResponseErrorResult extends IResponseBaseResult {\n error: IResponseError;\n status: TaskResponseStatus.ERROR;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["ResponseErrorResult.ts"],"sourcesContent":["import { TaskResponseStatus } from \"~/types\";\nimport { IResponseBaseResult } from \"./ResponseBaseResult\";\nimport { GenericRecord } from \"@webiny/api/types\";\n\nexport interface IResponseError {\n message: string;\n code?: string | null;\n data?: GenericRecord | null;\n stack?: string;\n}\n\nexport interface IResponseErrorParams {\n error: IResponseError | Error;\n tenant?: string;\n locale?: string;\n webinyTaskId?: string;\n}\n\nexport interface IResponseErrorResult extends IResponseBaseResult {\n error: IResponseError;\n status: TaskResponseStatus.ERROR;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import { ITaskDataInput, TaskResponseStatus } from "../../types";
2
2
  import { IResponseError } from "./ResponseErrorResult";
3
- export declare type ITaskResponseResult<I = ITaskDataInput, O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> = ITaskResponseDoneResult<O> | ITaskResponseContinueResult<I> | ITaskResponseErrorResult | ITaskResponseAbortedResult;
3
+ export type ITaskResponseResult<I = ITaskDataInput, O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> = ITaskResponseDoneResult<O> | ITaskResponseContinueResult<I> | ITaskResponseErrorResult | ITaskResponseAbortedResult;
4
4
  export interface ITaskResponseDoneResultOutput {
5
5
  error?: IResponseError;
6
6
  [key: string]: string | string[] | number | boolean | undefined | Record<string, any> | IResponseError;
@@ -28,14 +28,11 @@ export interface ITaskResponseContinueOptionsUntil {
28
28
  export interface ITaskResponseContinueOptionsSeconds {
29
29
  seconds: number;
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
+ export type ITaskResponseContinueOptions = ITaskResponseContinueOptionsUntil | ITaskResponseContinueOptionsSeconds;
36
32
  export interface ITaskResponse<T = ITaskDataInput, O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput> {
37
- done: ITaskResponseDoneCallable<O>;
38
- continue: (data: T, options?: ITaskResponseContinueOptions) => ITaskResponseContinueResult<T>;
39
- error: (error: IResponseError | Error | string) => ITaskResponseErrorResult;
40
- aborted: () => ITaskResponseAbortedResult;
33
+ done(output?: O): ITaskResponseDoneResult<O>;
34
+ done(message?: string, output?: O): ITaskResponseDoneResult<O>;
35
+ continue(data: T, options?: ITaskResponseContinueOptions): ITaskResponseContinueResult<T>;
36
+ error(error: IResponseError | Error | string): ITaskResponseErrorResult;
37
+ aborted(): ITaskResponseAbortedResult;
41
38
  }
@@ -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 error?: IResponseError;\n [key: string]:\n | string\n | string[]\n | number\n | boolean\n | undefined\n | Record<string, any>\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":"","ignoreList":[]}
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, any>\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 ITaskResponse<\n T = ITaskDataInput,\n O extends ITaskResponseDoneResultOutput = ITaskResponseDoneResultOutput\n> {\n done(output?: O): ITaskResponseDoneResult<O>;\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":"","ignoreList":[]}
@@ -29,17 +29,37 @@ class TaskControl {
29
29
  task = await this.getTask(taskId);
30
30
  this.context.security.setIdentity(task.createdBy);
31
31
  } catch (error) {
32
+ /**
33
+ * TODO Refactor error handling.
34
+ */
35
+ // @ts-expect-error
32
36
  return this.response.error({
33
- error
37
+ ...(0, _getErrorProperties.getErrorProperties)(error)
34
38
  });
35
39
  }
36
40
  /**
37
- * As this as a run of the task, we need to create a new log entry.
41
+ * Let's get the task definition.
38
42
  */
43
+ const definition = this.context.tasks.getDefinition(task.definitionId);
44
+ if (!definition) {
45
+ return this.response.error({
46
+ error: {
47
+ message: `Task "${task.id}" cannot be executed because there is no "${task.definitionId}" definition plugin.`,
48
+ code: "TASK_DEFINITION_ERROR",
49
+ data: {
50
+ definitionId: task.definitionId
51
+ }
52
+ }
53
+ });
54
+ }
55
+ const disableDatabaseLogs = !!definition.disableDatabaseLogs;
39
56
 
57
+ /**
58
+ * As this as a run of the task, we need to create a new log entry.
59
+ */
40
60
  let taskLog;
41
61
  try {
42
- taskLog = await this.getTaskLog(task);
62
+ taskLog = await this.getTaskLog(task, disableDatabaseLogs);
43
63
  } catch (error) {
44
64
  return this.response.error({
45
65
  error
@@ -75,21 +95,14 @@ class TaskControl {
75
95
  });
76
96
  }
77
97
  const taskResponse = new _response.TaskResponse(this.response);
78
- const store = new _TaskManagerStore.TaskManagerStore(this.context, task, taskLog);
98
+ const store = new _TaskManagerStore.TaskManagerStore({
99
+ context: this.context,
100
+ task,
101
+ log: taskLog,
102
+ disableDatabaseLogs
103
+ });
79
104
  const manager = new _TaskManager.TaskManager(this.runner, this.context, this.response, taskResponse, store);
80
105
  const databaseResponse = new _response.DatabaseResponse(this.response, store);
81
- const definition = this.context.tasks.getDefinition(task.definitionId);
82
- if (!definition) {
83
- return await databaseResponse.error({
84
- error: {
85
- message: `Task "${task.id}" cannot be executed because there is no "${task.definitionId}" definition plugin.`,
86
- code: "TASK_DEFINITION_ERROR",
87
- data: {
88
- definitionId: task.definitionId
89
- }
90
- }
91
- });
92
- }
93
106
  try {
94
107
  const result = await manager.run(definition);
95
108
  await this.runEvents(result, definition, task);
@@ -157,7 +170,21 @@ class TaskControl {
157
170
  }
158
171
  });
159
172
  }
160
- async getTaskLog(task) {
173
+ async getTaskLog(task, disableDatabaseLogs) {
174
+ /**
175
+ * If logs are disabled, let's return a mocked one.
176
+ */
177
+ if (disableDatabaseLogs) {
178
+ return {
179
+ id: `${task.id}-log`,
180
+ createdOn: task.createdOn,
181
+ createdBy: task.createdBy,
182
+ executionName: task.executionName,
183
+ task: task.id,
184
+ iteration: task.iterations,
185
+ items: []
186
+ };
187
+ }
161
188
  let taskLog = null;
162
189
  /**
163
190
  * First we are trying to get existing latest log.
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_TaskManager","_response","_TaskManagerStore","_handlerGraphql","_getErrorProperties","TaskControl","constructor","runner","response","context","run","event","taskId","webinyTaskId","task","getTask","security","setIdentity","createdBy","error","taskLog","getTaskLog","taskStatus","TaskDataStatus","ABORTED","aborted","SUCCESS","message","FAILED","taskResponse","TaskResponse","store","TaskManagerStore","manager","TaskManager","databaseResponse","DatabaseResponse","definition","tasks","getDefinition","definitionId","id","code","data","result","runEvents","from","ex","stack","input","status","TaskResponseStatus","ERROR","onError","console","log","getErrorProperties","DONE","onDone","getLatestLog","NotFoundError","currentIteration","iteration","createLog","executionName","exports"],"sources":["TaskControl.ts"],"sourcesContent":["import { ITaskEvent } from \"~/handler/types\";\nimport {\n Context,\n ITask,\n ITaskDataInput,\n ITaskDefinition,\n ITaskLog,\n TaskDataStatus,\n TaskResponseStatus\n} from \"~/types\";\nimport { ITaskControl, ITaskRunner } from \"./abstractions\";\nimport { TaskManager } from \"./TaskManager\";\nimport { IResponse, IResponseResult } from \"~/response/abstractions\";\nimport { DatabaseResponse, TaskResponse } from \"~/response\";\nimport { TaskManagerStore } from \"./TaskManagerStore\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n\n public constructor(runner: ITaskRunner, response: IResponse, context: Context) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n }\n\n public async run(event: Pick<ITaskEvent, \"webinyTaskId\">): Promise<IResponseResult> {\n const taskId = event.webinyTaskId;\n /**\n * This is the initial getTask idea.\n * We will need to take care of child tasks:\n * * child tasks can be in multiple levels (child task creates a child task, etc...).\n * * child tasks could be executed in parallel.\n */\n let task: ITask<ITaskDataInput>;\n try {\n task = await this.getTask(taskId);\n this.context.security.setIdentity(task.createdBy);\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * As this as a run of the task, we need to create a new log entry.\n */\n\n let taskLog: ITaskLog;\n try {\n taskLog = await this.getTaskLog(task);\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * Make sure that task does not run if it is aborted.\n * This will effectively end the Step Function execution with a \"success\" status.\n */\n if (task.taskStatus === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * Do not run if already a success (done).\n */\n //\n else if (task.taskStatus === TaskDataStatus.SUCCESS) {\n return this.response.error({\n error: {\n message: \"Task is already done, cannot run it again.\"\n }\n });\n }\n /**\n * Do not run if already failed.\n */\n //\n else if (task.taskStatus === TaskDataStatus.FAILED) {\n return this.response.error({\n error: {\n message: \"Task has failed, cannot run it again.\"\n }\n });\n }\n const taskResponse = new TaskResponse(this.response);\n const store = new TaskManagerStore(this.context, task, taskLog);\n\n const manager = new TaskManager(\n this.runner,\n this.context,\n this.response,\n taskResponse,\n store\n );\n\n const databaseResponse = new DatabaseResponse(this.response, store);\n\n const definition = this.context.tasks.getDefinition(task.definitionId);\n if (!definition) {\n return await databaseResponse.error({\n error: {\n message: `Task \"${task.id}\" cannot be executed because there is no \"${task.definitionId}\" definition plugin.`,\n code: \"TASK_DEFINITION_ERROR\",\n data: {\n definitionId: task.definitionId\n }\n }\n });\n }\n\n try {\n const result = await manager.run(definition);\n\n await this.runEvents(result, definition, task);\n\n return await databaseResponse.from(result);\n } catch (ex) {\n /**\n * We always want to store the error in the task log.\n */\n return await databaseResponse.from(\n this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: {\n ...ex.data,\n input: task.input\n }\n }\n })\n );\n }\n }\n\n private async runEvents(\n result: IResponseResult,\n definition: ITaskDefinition,\n task: ITask\n ): Promise<void> {\n if (result.status === TaskResponseStatus.ERROR && definition.onError) {\n try {\n await definition.onError({\n task,\n context: this.context\n });\n } catch (ex) {\n console.error(`Error executing onError hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n } else if (result.status === TaskResponseStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({\n task,\n context: this.context\n });\n } catch (ex) {\n console.error(`Error executing onDone hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n }\n\n private async getTask<T = any>(id: string): Promise<ITask<T>> {\n try {\n const task = await this.runner.context.tasks.getTask<T>(id);\n if (task) {\n return task;\n }\n } catch (ex) {\n throw this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: ex.data\n }\n });\n }\n throw this.response.error({\n error: {\n message: `Task \"${id}\" cannot be executed because it does not exist.`,\n code: \"TASK_NOT_FOUND\"\n }\n });\n }\n\n private async getTaskLog(task: ITask): Promise<ITaskLog> {\n let taskLog: ITaskLog | null = null;\n /**\n * First we are trying to get existing latest log.\n */\n try {\n taskLog = await this.context.tasks.getLatestLog(task.id);\n } catch (error) {\n /**\n * If error is not the NotFoundError, we need to throw it.\n */\n if (error instanceof NotFoundError === false) {\n throw this.response.error({\n error\n });\n }\n /**\n * Otherwise just continue and create a new log.\n */\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n try {\n return await this.context.tasks.createLog(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n } catch (error) {\n throw this.response.error({\n error\n });\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_TaskManager","_response","_TaskManagerStore","_handlerGraphql","_getErrorProperties","TaskControl","constructor","runner","response","context","run","event","taskId","webinyTaskId","task","getTask","security","setIdentity","createdBy","error","getErrorProperties","definition","tasks","getDefinition","definitionId","message","id","code","data","disableDatabaseLogs","taskLog","getTaskLog","taskStatus","TaskDataStatus","ABORTED","aborted","SUCCESS","FAILED","taskResponse","TaskResponse","store","TaskManagerStore","log","manager","TaskManager","databaseResponse","DatabaseResponse","result","runEvents","from","ex","stack","input","status","TaskResponseStatus","ERROR","onError","console","DONE","onDone","createdOn","executionName","iteration","iterations","items","getLatestLog","NotFoundError","currentIteration","createLog","exports"],"sources":["TaskControl.ts"],"sourcesContent":["import { ITaskEvent } from \"~/handler/types\";\nimport {\n Context,\n ITask,\n ITaskDataInput,\n ITaskDefinition,\n ITaskLog,\n TaskDataStatus,\n TaskResponseStatus\n} from \"~/types\";\nimport { ITaskControl, ITaskRunner } from \"./abstractions\";\nimport { TaskManager } from \"./TaskManager\";\nimport { IResponse, IResponseResult } from \"~/response/abstractions\";\nimport { DatabaseResponse, TaskResponse } from \"~/response\";\nimport { TaskManagerStore } from \"./TaskManagerStore\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties\";\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n\n public constructor(runner: ITaskRunner, response: IResponse, context: Context) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n }\n\n public async run(event: Pick<ITaskEvent, \"webinyTaskId\">): Promise<IResponseResult> {\n const taskId = event.webinyTaskId;\n /**\n * This is the initial getTask idea.\n * We will need to take care of child tasks:\n * * child tasks can be in multiple levels (child task creates a child task, etc...).\n * * child tasks could be executed in parallel.\n */\n let task: ITask<ITaskDataInput>;\n try {\n task = await this.getTask(taskId);\n this.context.security.setIdentity(task.createdBy);\n } catch (error) {\n /**\n * TODO Refactor error handling.\n */\n // @ts-expect-error\n return this.response.error({\n ...getErrorProperties(error)\n });\n }\n /**\n * Let's get the task definition.\n */\n const definition = this.context.tasks.getDefinition(task.definitionId);\n if (!definition) {\n return this.response.error({\n error: {\n message: `Task \"${task.id}\" cannot be executed because there is no \"${task.definitionId}\" definition plugin.`,\n code: \"TASK_DEFINITION_ERROR\",\n data: {\n definitionId: task.definitionId\n }\n }\n });\n }\n const disableDatabaseLogs = !!definition.disableDatabaseLogs;\n\n /**\n * As this as a run of the task, we need to create a new log entry.\n */\n let taskLog: ITaskLog;\n try {\n taskLog = await this.getTaskLog(task, disableDatabaseLogs);\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * Make sure that task does not run if it is aborted.\n * This will effectively end the Step Function execution with a \"success\" status.\n */\n if (task.taskStatus === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * Do not run if already a success (done).\n */\n //\n else if (task.taskStatus === TaskDataStatus.SUCCESS) {\n return this.response.error({\n error: {\n message: \"Task is already done, cannot run it again.\"\n }\n });\n }\n /**\n * Do not run if already failed.\n */\n //\n else if (task.taskStatus === TaskDataStatus.FAILED) {\n return this.response.error({\n error: {\n message: \"Task has failed, cannot run it again.\"\n }\n });\n }\n\n const taskResponse = new TaskResponse(this.response);\n const store = new TaskManagerStore({\n context: this.context,\n task,\n log: taskLog,\n disableDatabaseLogs\n });\n\n const manager = new TaskManager(\n this.runner,\n this.context,\n this.response,\n taskResponse,\n store\n );\n\n const databaseResponse = new DatabaseResponse(this.response, store);\n\n try {\n const result = await manager.run(definition);\n\n await this.runEvents(result, definition, task);\n\n return await databaseResponse.from(result);\n } catch (ex) {\n /**\n * We always want to store the error in the task log.\n */\n return await databaseResponse.from(\n this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: {\n ...ex.data,\n input: task.input\n }\n }\n })\n );\n }\n }\n\n private async runEvents(\n result: IResponseResult,\n definition: ITaskDefinition,\n task: ITask\n ): Promise<void> {\n if (result.status === TaskResponseStatus.ERROR && definition.onError) {\n try {\n await definition.onError({\n task,\n context: this.context\n });\n } catch (ex) {\n console.error(`Error executing onError hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n } else if (result.status === TaskResponseStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({\n task,\n context: this.context\n });\n } catch (ex) {\n console.error(`Error executing onDone hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n }\n\n private async getTask<T = any>(id: string): Promise<ITask<T>> {\n try {\n const task = await this.runner.context.tasks.getTask<T>(id);\n if (task) {\n return task;\n }\n } catch (ex) {\n throw this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: ex.data\n }\n });\n }\n throw this.response.error({\n error: {\n message: `Task \"${id}\" cannot be executed because it does not exist.`,\n code: \"TASK_NOT_FOUND\"\n }\n });\n }\n\n private async getTaskLog(task: ITask, disableDatabaseLogs: boolean): Promise<ITaskLog> {\n /**\n * If logs are disabled, let's return a mocked one.\n */\n if (disableDatabaseLogs) {\n return {\n id: `${task.id}-log`,\n createdOn: task.createdOn,\n createdBy: task.createdBy,\n executionName: task.executionName,\n task: task.id,\n iteration: task.iterations,\n items: []\n };\n }\n let taskLog: ITaskLog | null = null;\n /**\n * First we are trying to get existing latest log.\n */\n try {\n taskLog = await this.context.tasks.getLatestLog(task.id);\n } catch (error) {\n /**\n * If error is not the NotFoundError, we need to throw it.\n */\n if (error instanceof NotFoundError === false) {\n throw this.response.error({\n error\n });\n }\n /**\n * Otherwise just continue and create a new log.\n */\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n try {\n return await this.context.tasks.createLog(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n } catch (error) {\n throw this.response.error({\n error\n });\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -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","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":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAeA,IAAAC,mBAAA,GAAAD,OAAA;AAEO,MAAME,WAAW,CAAgD;EAO7DC,WAAWA,CACdC,MAA6C,EAC7CC,OAAgB,EAChBC,QAAmB,EACnBC,YAA2B,EAC3BC,KAA+B,EACjC;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,IAAI,CAAC,CAAC;MAC3B,CAAC,CAAC,OAAOC,KAAK,EAAE;QACZ,OAAO,IAAI,CAACpB,QAAQ,CAACoB,KAAK,CAAC;UACvBA;QACJ,CAAC,CAAC;MACN;IACJ;IACA;AACR;AACA;AACA;IACQ;IAAA,KACK,IAAI,IAAI,CAAClB,KAAK,CAACmB,OAAO,CAAC,CAAC,CAACH,UAAU,IAAId,UAAU,CAACkB,aAAa,EAAE;MAClE,IAAI;QACA,IAAIlB,UAAU,CAACmB,eAAe,EAAE;UAC5B,MAAMnB,UAAU,CAACmB,eAAe,CAAC;YAC7BC,IAAI,EAAE,IAAI,CAACtB,KAAK,CAACmB,OAAO,CAAC,CAAC;YAC1BtB,OAAO,EAAE,IAAI,CAACA;UAClB,CAAC,CAAC;QACN;QACA,OAAO,IAAI,CAACC,QAAQ,CAACoB,KAAK,CAAC;UACvBA,KAAK,EAAE;YACHK,OAAO,EAAE;UACb;QACJ,CAAC,CAAC;MACN,CAAC,CAAC,OAAOC,EAAE,EAAE;QACT,OAAO,IAAI,CAAC1B,QAAQ,CAACoB,KAAK,CAAC;UACvBA,KAAK,EAAE;YACHK,OAAO,EAAE,4CAA4C;YACrDE,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,CAACc,IAAI,IAAI;UAChC,OAAO;YACHN,UAAU,EAAEM,IAAI,CAACN,UAAU,GAAG;UAClC,CAAC;QACL,CAAC,CAAC;MACN,CAAC,CAAC,OAAOE,KAAK,EAAE;QACZ,OAAO,IAAI,CAACpB,QAAQ,CAACoB,KAAK,CAAC;UACvBA;QACJ,CAAC,CAAC;MACN;IACJ;IAEA,IAAIS,MAA2B;IAE/B,IAAI;MACA,MAAMC,KAAK,GAAGC,eAAe,CAAC,IAAI,CAAC7B,KAAK,CAAC8B,QAAQ,CAAC,CAAC,CAAC;MACpD;AACZ;AACA;MACYH,MAAM,GAAG,MAAM,IAAI,CAAC9B,OAAO,CAACkC,QAAQ,CAACC,oBAAoB,CAAC,YAAY;QAClE,OAAO,MAAM9B,UAAU,CAACD,GAAG,CAAC;UACxB2B,KAAK;UACL/B,OAAO,EAAE,IAAI,CAACA,OAAO;UACrBC,QAAQ,EAAE,IAAI,CAACC,YAAY;UAC3BkC,gBAAgB,EAAGC,OAAgB,IAAK;YACpC,OAAO,IAAI,CAACtC,MAAM,CAACqC,gBAAgB,CAACC,OAAO,CAAC;UAChD,CAAC;UACDC,SAAS,EAAEA,CAAA,KAAM;YACb,OAAO,IAAI,CAACnC,KAAK,CAACG,SAAS,CAAC,CAAC,KAAKC,qBAAc,CAACC,OAAO;UAC5D,CAAC;UACDL,KAAK,EAAE,IAAI,CAACA,KAAK;UACjBoC,OAAO,EAAE,MACLC,MAA6C,IACzB;YACpB,OAAO,IAAI,CAACxC,OAAO,CAACyC,KAAK,CAACF,OAAO,CAAC;cAC9B,GAAGC,MAAM;cACTE,MAAM,EAAE,IAAI,CAACvC,KAAK,CAACmB,OAAO,CAAC;YAC/B,CAAC,CAAC;UACN;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC,OAAOK,EAAE,EAAE;MACT,OAAO,IAAI,CAAC1B,QAAQ,CAACoB,KAAK,CAAC;QACvBA,KAAK,EAAE,IAAAQ,sCAAkB,EAACF,EAAE;MAChC,CAAC,CAAC;IACN;IAEA,IAAIG,MAAM,CAACa,MAAM,KAAKC,yBAAkB,CAACC,QAAQ,EAAE;MAC/C,OAAO,IAAI,CAAC5C,QAAQ,CAAC6C,QAAQ,CAAC;QAC1Bf,KAAK,EAAED,MAAM,CAACC,KAAK;QACnBgB,IAAI,EAAEjB,MAAM,CAACiB;MACjB,CAAC,CAAC;IACN,CAAC,MAAM,IAAIjB,MAAM,CAACa,MAAM,KAAKC,yBAAkB,CAACI,KAAK,EAAE;MACnD,OAAO,IAAI,CAAC/C,QAAQ,CAACoB,KAAK,CAAC;QACvBA,KAAK,EAAES,MAAM,CAACT;MAClB,CAAC,CAAC;IACN,CAAC,MAAM,IAAIS,MAAM,CAACa,MAAM,KAAKC,yBAAkB,CAACpC,OAAO,EAAE;MACrD,OAAO,IAAI,CAACP,QAAQ,CAACQ,OAAO,CAAC,CAAC;IAClC;IACA,OAAO,IAAI,CAACR,QAAQ,CAACgD,IAAI,CAAC;MACtBvB,OAAO,EAAEI,MAAM,CAACJ,OAAO;MACvBwB,MAAM,EAAEpB,MAAM,CAACoB;IACnB,CAAC,CAAC;EACN;AACJ;AAACC,OAAA,CAAAtD,WAAA,GAAAA,WAAA","ignoreList":[]}
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 => {\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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","ignoreList":[]}