@things-factory/integration-base 6.1.129 → 6.1.141

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 (51) hide show
  1. package/dist-server/engine/task/database-query.js +2 -1
  2. package/dist-server/engine/task/database-query.js.map +1 -1
  3. package/dist-server/engine/task/graphql-mutate.js +2 -1
  4. package/dist-server/engine/task/graphql-mutate.js.map +1 -1
  5. package/dist-server/engine/task/graphql-query.js +2 -1
  6. package/dist-server/engine/task/graphql-query.js.map +1 -1
  7. package/dist-server/engine/task/http-get.js +2 -1
  8. package/dist-server/engine/task/http-get.js.map +1 -1
  9. package/dist-server/engine/task/http-post.js +2 -1
  10. package/dist-server/engine/task/http-post.js.map +1 -1
  11. package/dist-server/engine/task/local-graphql-mutate.js +8 -5
  12. package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
  13. package/dist-server/engine/task/local-graphql-query.js +8 -5
  14. package/dist-server/engine/task/local-graphql-query.js.map +1 -1
  15. package/dist-server/engine/task/log.js +2 -1
  16. package/dist-server/engine/task/log.js.map +1 -1
  17. package/dist-server/engine/task/oracle-procedure.js +3 -3
  18. package/dist-server/engine/task/oracle-procedure.js.map +1 -1
  19. package/dist-server/engine/task/script.js +3 -2
  20. package/dist-server/engine/task/script.js.map +1 -1
  21. package/dist-server/engine/types.js.map +1 -1
  22. package/dist-server/routers/scenario-schedule-callback-router.js +7 -2
  23. package/dist-server/routers/scenario-schedule-callback-router.js.map +1 -1
  24. package/dist-server/service/scenario/scenario-type.js +1 -1
  25. package/dist-server/service/scenario/scenario-type.js.map +1 -1
  26. package/dist-server/service/scenario-instance/scenario-instance-mutation.js +2 -2
  27. package/dist-server/service/scenario-instance/scenario-instance-mutation.js.map +1 -1
  28. package/dist-server/service/scenario-instance/scenario-instance-type.js +9 -1
  29. package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
  30. package/dist-server/tsconfig.tsbuildinfo +1 -1
  31. package/helps/integration/task/oracle-procedure.ja.md +46 -46
  32. package/helps/integration/task/oracle-procedure.ko.md +4 -5
  33. package/helps/integration/task/oracle-procedure.md +42 -43
  34. package/helps/integration/task/oracle-procedure.ms.md +46 -47
  35. package/helps/integration/task/oracle-procedure.zh.md +43 -44
  36. package/package.json +8 -8
  37. package/server/engine/task/database-query.ts +2 -1
  38. package/server/engine/task/graphql-mutate.ts +2 -1
  39. package/server/engine/task/graphql-query.ts +2 -1
  40. package/server/engine/task/http-get.ts +2 -1
  41. package/server/engine/task/http-post.ts +2 -1
  42. package/server/engine/task/local-graphql-mutate.ts +8 -5
  43. package/server/engine/task/local-graphql-query.ts +8 -5
  44. package/server/engine/task/log.ts +2 -1
  45. package/server/engine/task/oracle-procedure.ts +3 -4
  46. package/server/engine/task/script.ts +3 -2
  47. package/server/engine/types.ts +1 -0
  48. package/server/routers/scenario-schedule-callback-router.ts +6 -2
  49. package/server/service/scenario/scenario-type.ts +1 -1
  50. package/server/service/scenario-instance/scenario-instance-mutation.ts +2 -2
  51. package/server/service/scenario-instance/scenario-instance-type.ts +9 -1
@@ -1,61 +1,65 @@
1
1
  # Oracle 存储过程任务
2
2
 
3
- 这是用于调用存储在 Oracle 数据库中的存储过程的任务,根据不同的数据类型返回数据列表或特定数据类型的值。
3
+ 这个任务涉及调用存储在 Oracle 数据库中的存储过程。根据不同的数据类型,它可以返回数据列表或特定数据类型的值。
4
4
 
5
5
  ## 参数
6
6
 
7
7
  ### 存储过程代码
8
8
 
9
- - 存储过程代码是根据*存储过程名称*和*参数*自动生成的代码,用户无需单独输入。
10
- - 如果存储过程名称是*mcs.myproc*,并且具有参数*id*和*out_name*,则表示如下:
11
- ```text
12
- mcs.myproc(:id, :out_name);
13
- ```
9
+ - 存储过程代码是根据*存储过程名称*和*参数*自动生成的代码,用户无需手动输入。
10
+ - 例如,如果存储过程的名称是*mcs.myproc*,参数是*id*和*out_name*,则应表示如下:
11
+
12
+ ```text
13
+ mcs.myproc(:id, :out_name);
14
+ ```
14
15
 
15
16
  ### 存储过程名称
16
17
 
17
18
  - 指定存储过程的名称。
18
- - 如果需要按包或用户名进行区分,使用'.'来分隔它们。
19
- - 例子:
20
- ```text
21
- mcs.myproc
22
- ```
19
+ - 如果需要按包或用户名称区分存储过程,请使用句点(.)进行分隔。
20
+ - 示例:
21
+
22
+ ```text
23
+ mcs.myproc
24
+ ```
23
25
 
24
26
  ### 参数
25
27
 
26
- - 参数包括以下元素:
28
+ - 参数由以下元素组成:
27
29
  - 参数名称
28
- - 输入/输出规范:IN、INOUT、OUT
29
- - 参数类型:String、Number、Date、Cursor
30
- - 值:如果变量是输入,则指定该输入的值。
31
- - 最大大小:如果变量类型为 String 或 Buffer,则指定变量的最大大小。
30
+ - 方向:IN、INOUT、OUT
31
+ - 数据类型:String、Number、Date、Cursor
32
+ - 值:对于输入变量,是相应的值
33
+ - 最大大小:对于数据类型为 String 或 Buffer 的变量,指定变量的最大大小。
32
34
 
33
35
  #### 参数名称
34
36
 
35
- 参数名称指定存储过程中使用的参数的名称。在上面的示例中,“id”和“out_name”是参数名称。
37
+ 参数名称指定存储过程中使用的参数的名称。在上面的示例中,'id'和'out_name'是参数名称。
36
38
 
37
- ### 输入/输出规范
39
+ ### 方向
38
40
 
39
- 指定变量是输入(IN)还是输出(OUT)。
41
+ 指定变量是输入(IN)还是输出(OUT)变量。
40
42
 
41
- ### 参数类型
43
+ ### 数据类型
42
44
 
43
- 指定参数类型。在创建存储过程时,类型应该与创建存储过程时指定的名称完全一致。
45
+ 指定参数的数据类型。数据类型应与创建存储过程时命名的数据类型完全一致。
44
46
 
45
- 如果存储过程如下实现:
47
+ 例如,如果存储过程实现如下:
46
48
 
47
49
  ```sql
48
50
  CREATE OR REPLACE NONEDITIONABLE PROCEDURE myproc (in_id IN VARCHAR2, out_name OUT VARCHAR2) AS
49
51
  BEGIN
50
- SELECT name INTO out_name FROM
51
-
52
- MCS.FMB_USERS WHERE id = in_id;
52
+ SELECT name INTO out_name FROM MCS.FMB_USERS WHERE id = in_id ;
53
53
  END;
54
54
  ```
55
55
 
56
- 第一个和第二个参数都指定为 VARCHAR2。当调用这样的存储过程时,必须为两者都指定 String 作为参数类型,并且对于输出,还必须指定最大大小。
56
+ 第一个和第二个参数都是 VARCHAR2 类型。
57
57
 
58
- 以下是参数配置示例:
58
+ 在调用这样的存储过程时,应将参数类型指定为 String,并且对于输出,还应指定最大大小。
59
+
60
+ 以下是如何
61
+
62
+ 指定的示例:
59
63
 
60
64
  ![procedure example1](./assets/../../../../assets/images/oracle-procedure-example1.png 'procedure example1')
61
65
 
@@ -63,30 +67,25 @@ END;
63
67
 
64
68
  配置遵循[JSONATA 文档](http://docs.jsonata.org/overview.html)。
65
69
 
66
- 如果指定了“访问器”,则使用此访问器构建的值将用作存储过程的参数。
67
-
68
- 如果下面的“值”设置是“常量”,那么可以将访问器设置视为“变量”。
69
-
70
- 访问器配置优先于下面的“值”设置。换句话说,如果设置了“值”,则它将作为存储过程的参数值优先考虑。这是因为当设置访问器时,通常将配置的“值”理解为用于测试目的的值,而不是主要用途的值。
70
+ 如果指定了“访问器”,则该访问器生成的值将用作参数值。如果“访问器”操作没有结果,则使用“值(val)”设置。
71
71
 
72
- ###
72
+ ### 值(val)
73
73
 
74
- 如果参数是输入(IN),请指定其值。
75
- 直接在此字段中输入“常量”值。
74
+ 如果参数是输入(IN),则在此字段中指定值。直接为此字段输入“常数”值。
76
75
 
77
- 在上面的示例中,如果指定“id”的输入值为“ID”,则它将设置为 ID 任务的输入值。
76
+ 在前面提到的示例中,如果将“ID”指定为“id”参数的输入值,则应将 ID 任务返回的值用作输入值。
78
77
 
79
- 此值优先于上面的“访问器”配置。这是因为当设置访问器时,通常将配置的“值”理解为用于测试目的的值,而不是主要用途的值。
78
+ 如果“访问器”设置没有结果,将使用“值”中设置的值。
80
79
 
81
80
  ### 最大大小
82
81
 
83
- 如果参数类型为 String 或 Buffer,请指定最大大小。对于其他类型,请忽略此设置。
82
+ 对于数据类型为 String 或 Buffer 的参数,指定最大大小。对于其他数据类型,请忽略此设置。
84
83
 
85
84
  ## 任务结果
86
85
 
87
- 过程调用的结果以对象形式返回,其中指定为输出的参数成为返回值的键。
86
+ 调用存储过程的结果以对象格式返回,指定为输出的参数名称变为键,其对应的值返回。
88
87
 
89
- 例如,在上面介绍的任务的情况下,它返回以下结果值:
88
+ 例如,在上述任务中,结果值将如下所示:
90
89
 
91
90
  ```javascript
92
91
  {
@@ -94,9 +93,9 @@ END;
94
93
  }
95
94
  ```
96
95
 
97
- ## 另一个用例(游标)
96
+ ## 另一个示例(游标)
98
97
 
99
- ### 存储过程创建示例
98
+ ### 存储过程实施示例
100
99
 
101
100
  ```sql
102
101
  CREATE OR REPLACE NONEDITIONABLE PROCEDURE PROCEDURE1(out_cursor OUT SYS_REFCURSOR) AS
@@ -108,11 +107,11 @@ BEGIN
108
107
  END PROCEDURE1;
109
108
  ```
110
109
 
111
- ### 存储过程调用示例
110
+ ### 调用存储过程示例
112
111
 
113
112
  ![procedure example2](./assets/../../../../assets/images/oracle-procedure-example2.png 'procedure example2')
114
113
 
115
- ### 存储过程任务调用结果
114
+ ### 存储过程调用的任务结果
116
115
 
117
116
  ```javascript
118
117
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-base",
3
- "version": "6.1.129",
3
+ "version": "6.1.141",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -26,12 +26,12 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@apollo/client": "^3.6.9",
29
- "@things-factory/api": "^6.1.129",
30
- "@things-factory/auth-base": "^6.1.129",
31
- "@things-factory/env": "^6.1.129",
32
- "@things-factory/oauth2-client": "^6.1.129",
33
- "@things-factory/scheduler-client": "^6.1.129",
34
- "@things-factory/shell": "^6.1.129",
29
+ "@things-factory/api": "^6.1.141",
30
+ "@things-factory/auth-base": "^6.1.141",
31
+ "@things-factory/env": "^6.1.141",
32
+ "@things-factory/oauth2-client": "^6.1.141",
33
+ "@things-factory/scheduler-client": "^6.1.141",
34
+ "@things-factory/shell": "^6.1.141",
35
35
  "async-mqtt": "^2.5.0",
36
36
  "chance": "^1.1.11",
37
37
  "cross-fetch": "^3.0.4",
@@ -46,5 +46,5 @@
46
46
  "devDependencies": {
47
47
  "@types/cron": "^2.0.1"
48
48
  },
49
- "gitHead": "34348ec14b8648940212758df1945b9321a13593"
49
+ "gitHead": "e3d3ba0a80acd94b85b4ee881c5e9374fc3ee04d"
50
50
  }
@@ -3,7 +3,7 @@ import { ConnectionManager } from '../connection-manager'
3
3
  import { TaskRegistry } from '../task-registry'
4
4
 
5
5
  async function DatabaseQuery(step, context) {
6
- var { domain, data, variables } = context
6
+ var { domain, user, data, variables } = context
7
7
  var {
8
8
  connection: connectionName,
9
9
  params: { query }
@@ -14,6 +14,7 @@ async function DatabaseQuery(step, context) {
14
14
  const vm = new VM({
15
15
  sandbox: {
16
16
  domain,
17
+ user,
17
18
  data,
18
19
  variables
19
20
  }
@@ -10,11 +10,12 @@ async function GraphqlMutate(step, context) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { mutation, variables: variablesAccessorMap, headers } = stepOptions || {}
12
12
 
13
- var { domain, data, variables } = context
13
+ var { domain, user, data, variables } = context
14
14
 
15
15
  const vm = new VM({
16
16
  sandbox: {
17
17
  domain,
18
+ user,
18
19
  data,
19
20
  variables
20
21
  }
@@ -9,11 +9,12 @@ import { TaskRegistry } from '../task-registry'
9
9
  async function GraphqlQuery(step, context) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { query, variables: variablesAccessorMap, headers } = stepOptions || {}
12
- var { domain, data, variables } = context
12
+ var { domain, user, data, variables } = context
13
13
 
14
14
  const vm = new VM({
15
15
  sandbox: {
16
16
  domain,
17
+ user,
17
18
  data,
18
19
  variables
19
20
  }
@@ -6,7 +6,7 @@ import { TaskRegistry } from '../task-registry'
6
6
  import { ConnectionManager } from '../connection-manager'
7
7
  import { substitute } from './utils/substitute'
8
8
 
9
- async function HttpGet(step, { logger, data, domain, variables }) {
9
+ async function HttpGet(step, { logger, data, domain, user, variables }) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { headers: requestHeaders, searchParams = {}, path } = stepOptions || {}
12
12
  var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
@@ -20,6 +20,7 @@ async function HttpGet(step, { logger, data, domain, variables }) {
20
20
  const vm = new VM({
21
21
  sandbox: {
22
22
  domain,
23
+ user,
23
24
  data,
24
25
  variables
25
26
  }
@@ -6,7 +6,7 @@ import { TaskRegistry } from '../task-registry'
6
6
  import { ConnectionManager } from '../connection-manager'
7
7
  import https from 'https'
8
8
 
9
- async function HttpPost(step, { logger, data, domain, variables }) {
9
+ async function HttpPost(step, { logger, data, domain, user, variables }) {
10
10
  var { connection: connectionName, params: stepOptions } = step
11
11
  var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}
12
12
 
@@ -21,6 +21,7 @@ async function HttpPost(step, { logger, data, domain, variables }) {
21
21
  const vm = new VM({
22
22
  sandbox: {
23
23
  domain,
24
+ user,
24
25
  data,
25
26
  variables
26
27
  }
@@ -10,16 +10,19 @@ import { TaskRegistry } from '../task-registry'
10
10
  async function LocalGraphqlMutate(step, context) {
11
11
  var { params, updaterId } = step
12
12
  var { mutation, variables: variablesAccessorMap, headers } = params || {}
13
- var { client, domain, data, variables } = context
13
+ var { client, domain, user, data, variables } = context
14
14
 
15
- const user = await getRepository(User).findOne({
16
- where: { id: updaterId },
17
- relations: ['domains']
18
- })
15
+ user =
16
+ user ||
17
+ (await getRepository(User).findOne({
18
+ where: { id: updaterId },
19
+ relations: ['domains']
20
+ }))
19
21
 
20
22
  const vm = new VM({
21
23
  sandbox: {
22
24
  domain,
25
+ user,
23
26
  data,
24
27
  variables
25
28
  }
@@ -10,16 +10,19 @@ import { TaskRegistry } from '../task-registry'
10
10
  async function LocalGraphqlQuery(step, context) {
11
11
  var { params, updaterId } = step
12
12
  var { query, variables: variablesAccessorMap, headers } = params || {}
13
- var { client, domain, data, variables } = context
13
+ var { client, domain, user, data, variables } = context
14
14
 
15
- const user = await getRepository(User).findOne({
16
- where: { id: updaterId },
17
- relations: ['domains']
18
- })
15
+ user =
16
+ user ||
17
+ (await getRepository(User).findOne({
18
+ where: { id: updaterId },
19
+ relations: ['domains']
20
+ }))
19
21
 
20
22
  const vm = new VM({
21
23
  sandbox: {
22
24
  domain,
25
+ user,
23
26
  data,
24
27
  variables
25
28
  }
@@ -2,7 +2,7 @@ import { access, hasTemplateExpression } from '@things-factory/utils'
2
2
  import { VM } from 'vm2'
3
3
  import { TaskRegistry } from '../task-registry'
4
4
 
5
- async function Log(step, { logger, data, variables, domain }) {
5
+ async function Log(step, { logger, data, variables, domain, user }) {
6
6
  var {
7
7
  params: { message, accessor, level = 'info' }
8
8
  } = step
@@ -11,6 +11,7 @@ async function Log(step, { logger, data, variables, domain }) {
11
11
  const vm = new VM({
12
12
  sandbox: {
13
13
  domain,
14
+ user,
14
15
  data,
15
16
  variables
16
17
  }
@@ -42,7 +42,7 @@ const DIR = {
42
42
  }
43
43
 
44
44
  async function OracleProcedure(step, context) {
45
- var { domain, data, variables } = context
45
+ var { domain, user, data, variables } = context
46
46
  var { connection: connectionName, params } = step
47
47
 
48
48
  var { code = '', parameters = [] } = params.parameters as ValueType
@@ -52,6 +52,7 @@ async function OracleProcedure(step, context) {
52
52
  const vm = new VM({
53
53
  sandbox: {
54
54
  domain,
55
+ user,
55
56
  data,
56
57
  variables
57
58
  }
@@ -71,7 +72,7 @@ async function OracleProcedure(step, context) {
71
72
  type: TYPES[type]
72
73
  }
73
74
 
74
- const calculated = val !== undefined ? val : accessor ? access(accessor, data) : undefined
75
+ const calculated = accessor ? access(accessor, data) || val : val
75
76
 
76
77
  if (calculated !== undefined) {
77
78
  sum[name].val =
@@ -108,8 +109,6 @@ async function OracleProcedure(step, context) {
108
109
  }
109
110
  }
110
111
 
111
- console.log('taskResult: ', taskResult)
112
-
113
112
  return {
114
113
  data: taskResult
115
114
  }
@@ -6,7 +6,7 @@ async function Script(step, context) {
6
6
  params: { script }
7
7
  } = step
8
8
 
9
- const { domain, data, variables } = context
9
+ const { domain, user, data, variables, logger } = context
10
10
 
11
11
  const vm = new NodeVM({
12
12
  timeout: 5000,
@@ -14,12 +14,13 @@ async function Script(step, context) {
14
14
  console: 'inherit',
15
15
  sandbox: {
16
16
  domain,
17
+ user,
17
18
  data,
18
19
  variables
19
20
  }
20
21
  })
21
22
 
22
- const result = await vm.run(`return (async () => {\n${script}\n})()`)
23
+ var result = await vm.run(`return (async () => {\n${script}\n})()`)
23
24
 
24
25
  return {
25
26
  data: result
@@ -12,6 +12,7 @@ export interface Connector {
12
12
 
13
13
  export type Context = {
14
14
  domain: Object
15
+ user: Object
15
16
  logger: any
16
17
  publish: Function
17
18
  load: Function
@@ -18,7 +18,7 @@ scenarioScheduleCallbackRouter.post('/callback-schedule-for-scenario', async (co
18
18
  // key: scenario.id,
19
19
  // operation: 'start'
20
20
 
21
- const { domain } = context.state
21
+ const { domain, user } = context.state
22
22
 
23
23
  if (!domain) {
24
24
  throw new Error('cannot identify the current domain.')
@@ -58,7 +58,11 @@ scenarioScheduleCallbackRouter.post('/callback-schedule-for-scenario', async (co
58
58
  // TODO prepare the secure authentication method
59
59
  context.state.user = scenario.creator
60
60
 
61
- ScenarioEngine.load(scenario.name, scenario, context)
61
+ ScenarioEngine.load(scenario.name, scenario, {
62
+ domain,
63
+ user,
64
+ variables: client.task?.data
65
+ })
62
66
 
63
67
  context.status = 200
64
68
  })
@@ -92,7 +92,7 @@ export class Scenario {
92
92
 
93
93
  async start(instanceName, variables?: any) {
94
94
  try {
95
- await ScenarioEngine.load(instanceName || this.name, this, { variables })
95
+ await ScenarioEngine.load(instanceName || this.name, this, { domain: this.domain, user: this.updater, variables })
96
96
  } catch (ex) {}
97
97
  }
98
98
 
@@ -71,7 +71,7 @@ export class ScenarioInstanceMutation {
71
71
  @Arg('variables', type => ScalarObject, { nullable: true }) variables: any,
72
72
  @Ctx() context: ResolverContext
73
73
  ): Promise<ScenarioInstance> {
74
- const { domain } = context.state
74
+ const { domain, user } = context.state
75
75
 
76
76
  debug('startScenario', instanceName, scenarioName, variables)
77
77
 
@@ -86,7 +86,7 @@ export class ScenarioInstanceMutation {
86
86
  }
87
87
 
88
88
  instanceName = instanceName || scenarioName
89
- return await ScenarioEngine.load(instanceName, scenario, { domain, variables })
89
+ return await ScenarioEngine.load(instanceName, scenario, { domain, user, variables })
90
90
  }
91
91
 
92
92
  @Mutation(returns => ScenarioInstance, { nullable: true, description: 'To start new scenario instance' })
@@ -7,6 +7,7 @@ import util from 'util'
7
7
  import { createLogger, format, transports } from 'winston'
8
8
 
9
9
  import { Domain, pubsub, PubSubLogTransport, ScalarObject } from '@things-factory/shell'
10
+ import { User } from '@things-factory/auth-base'
10
11
  import { sleep } from '@things-factory/utils'
11
12
 
12
13
  import { TaskRegistry } from '../../engine'
@@ -93,6 +94,9 @@ export class ScenarioInstance {
93
94
  @Field({ nullable: true })
94
95
  public domain: Domain
95
96
 
97
+ @Field({ nullable: true })
98
+ public user: User
99
+
96
100
  @Field({ nullable: true })
97
101
  public scenarioName: string
98
102
 
@@ -149,16 +153,18 @@ export class ScenarioInstance {
149
153
  }
150
154
 
151
155
  constructor(instanceName, { name: scenarioName, steps, domain: scenarioDomain }, context?) {
152
- const domain = context?.domain || scenarioDomain
156
+ const { domain = scenarioDomain, user } = context || {}
153
157
 
154
158
  this.instanceName = instanceName
155
159
  this.scenarioName = scenarioName
156
160
  this.steps = orderBy(steps || [], step => step.sequence)
157
161
  this.domain = domain
162
+ this.user = user
158
163
  this.disposer = context?.disposer
159
164
 
160
165
  this.context = {
161
166
  domain,
167
+ user,
162
168
  logger:
163
169
  context?.logger ||
164
170
  createLogger({
@@ -254,6 +260,8 @@ export class ScenarioInstance {
254
260
  const message = ex.stack ? ex.stack : ex
255
261
  const { scenarioName, domain } = this
256
262
 
263
+ this.context.logger.error(ex.message ? ex.message : ex)
264
+
257
265
  debug('failed to run ', `[ Domain: ${domain.name}, Scenario: ${scenarioName} ]\n`, ex)
258
266
  this.setState(
259
267
  ScenarioInstanceStatus.HALTED,