@things-factory/integration-base 8.0.0-beta.8 → 8.0.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 (160) hide show
  1. package/dist-server/engine/connector/http-connector.js +1 -1
  2. package/dist-server/engine/connector/http-connector.js.map +1 -1
  3. package/dist-server/engine/connector/index.d.ts +0 -1
  4. package/dist-server/engine/connector/index.js +0 -1
  5. package/dist-server/engine/connector/index.js.map +1 -1
  6. package/dist-server/engine/index.d.ts +0 -1
  7. package/dist-server/engine/index.js +0 -1
  8. package/dist-server/engine/index.js.map +1 -1
  9. package/dist-server/engine/task/headless-post.js +33 -19
  10. package/dist-server/engine/task/headless-post.js.map +1 -1
  11. package/dist-server/engine/task/headless-scrap.js +13 -20
  12. package/dist-server/engine/task/headless-scrap.js.map +1 -1
  13. package/dist-server/tsconfig.tsbuildinfo +1 -1
  14. package/package.json +11 -12
  15. package/server/controllers/index.ts +2 -0
  16. package/server/controllers/publish-data.ts +29 -0
  17. package/server/controllers/scenario-controller.ts +156 -0
  18. package/server/engine/analyzer/analyze-integration.ts +115 -0
  19. package/server/engine/connection-manager.ts +239 -0
  20. package/server/engine/connector/echo-back-connector.ts +51 -0
  21. package/server/engine/connector/echo-back-server.ts +72 -0
  22. package/server/engine/connector/graphql-connector.ts +126 -0
  23. package/server/engine/connector/http-connector.ts +65 -0
  24. package/server/engine/connector/index.ts +12 -0
  25. package/server/engine/connector/mqtt-connector.ts +78 -0
  26. package/server/engine/connector/mssql-connector.ts +152 -0
  27. package/server/engine/connector/mysql-connector.ts +94 -0
  28. package/server/engine/connector/operato-connector.ts +264 -0
  29. package/server/engine/connector/oracle-connector.ts +218 -0
  30. package/server/engine/connector/postgresql-connector.ts +152 -0
  31. package/server/engine/connector/proxy-connector.ts +53 -0
  32. package/server/engine/connector/socket-server.ts +86 -0
  33. package/server/engine/connector/sqlite-connector.ts +69 -0
  34. package/server/engine/edge-client.ts +45 -0
  35. package/server/engine/index.ts +10 -0
  36. package/server/engine/pending-queue.ts +97 -0
  37. package/server/engine/scenario-engine.ts +106 -0
  38. package/server/engine/task/book-up-scenario.ts +73 -0
  39. package/server/engine/task/csv-readline.ts +127 -0
  40. package/server/engine/task/data-accessor.ts +36 -0
  41. package/server/engine/task/data-mapper.ts +47 -0
  42. package/server/engine/task/database-query.ts +56 -0
  43. package/server/engine/task/echo-receive.ts +21 -0
  44. package/server/engine/task/echo-send.ts +32 -0
  45. package/server/engine/task/empty-check.ts +38 -0
  46. package/server/engine/task/end.ts +18 -0
  47. package/server/engine/task/floating-point.ts +71 -0
  48. package/server/engine/task/goto.ts +27 -0
  49. package/server/engine/task/graphql-mutate.ts +79 -0
  50. package/server/engine/task/graphql-query.ts +78 -0
  51. package/server/engine/task/headless-post.ts +147 -0
  52. package/server/engine/task/headless-scrap.ts +80 -0
  53. package/server/engine/task/http-get.ts +117 -0
  54. package/server/engine/task/http-post.ts +148 -0
  55. package/server/engine/task/index.ts +45 -0
  56. package/server/engine/task/jsonata.ts +45 -0
  57. package/server/engine/task/local-graphql-mutate.ts +100 -0
  58. package/server/engine/task/local-graphql-query.ts +100 -0
  59. package/server/engine/task/log.ts +78 -0
  60. package/server/engine/task/mqtt-publish.ts +45 -0
  61. package/server/engine/task/mqtt-subscribe.ts +139 -0
  62. package/server/engine/task/mssql-procedure.ts +128 -0
  63. package/server/engine/task/oracle-procedure.ts +124 -0
  64. package/server/engine/task/pick-pending-scenario.ts +80 -0
  65. package/server/engine/task/publish.ts +40 -0
  66. package/server/engine/task/random.ts +53 -0
  67. package/server/engine/task/reset-pending-queue.ts +17 -0
  68. package/server/engine/task/script.ts +63 -0
  69. package/server/engine/task/set-domain.ts +37 -0
  70. package/server/engine/task/sleep.ts +34 -0
  71. package/server/engine/task/socket-listener.ts +96 -0
  72. package/server/engine/task/state-group-read.ts +69 -0
  73. package/server/engine/task/state-read.ts +56 -0
  74. package/server/engine/task/state-write.ts +65 -0
  75. package/server/engine/task/stop-scenario.ts +44 -0
  76. package/server/engine/task/sub-scenario.ts +57 -0
  77. package/server/engine/task/switch-goto.ts +43 -0
  78. package/server/engine/task/switch-range-goto.ts +53 -0
  79. package/server/engine/task/switch-range-scenario.ts +79 -0
  80. package/server/engine/task/switch-range-set.ts +48 -0
  81. package/server/engine/task/switch-scenario.ts +67 -0
  82. package/server/engine/task/switch-set.ts +37 -0
  83. package/server/engine/task/throw.ts +27 -0
  84. package/server/engine/task/utils/headless-pool-for-scenario.ts +71 -0
  85. package/server/engine/task/utils/substitute.ts +44 -0
  86. package/server/engine/task/variables.ts +17 -0
  87. package/server/engine/task-registry.ts +23 -0
  88. package/server/engine/types.ts +114 -0
  89. package/server/index.ts +20 -0
  90. package/server/migrations/index.ts +9 -0
  91. package/server/restful/index.ts +1 -0
  92. package/server/restful/unstable/index.ts +7 -0
  93. package/server/restful/unstable/run-scenario.ts +51 -0
  94. package/server/restful/unstable/scenario-instance.ts +52 -0
  95. package/server/restful/unstable/scenario-instances.ts +80 -0
  96. package/server/restful/unstable/scenario.ts +41 -0
  97. package/server/restful/unstable/scenarios.ts +69 -0
  98. package/server/restful/unstable/start-scenario.ts +33 -0
  99. package/server/restful/unstable/stop-scenario.ts +30 -0
  100. package/server/routers/scenario-schedule-callback-router.ts +69 -0
  101. package/server/routers/scenario-view-router.ts +46 -0
  102. package/server/routes.ts +30 -0
  103. package/server/service/analysis/analysis-query.ts +13 -0
  104. package/server/service/analysis/index.ts +3 -0
  105. package/server/service/connection/connection-mutation.ts +190 -0
  106. package/server/service/connection/connection-query.ts +87 -0
  107. package/server/service/connection/connection-subscription.ts +104 -0
  108. package/server/service/connection/connection-type.ts +288 -0
  109. package/server/service/connection/index.ts +7 -0
  110. package/server/service/connector/connector-query.ts +62 -0
  111. package/server/service/connector/connector-type.ts +29 -0
  112. package/server/service/connector/index.ts +4 -0
  113. package/server/service/index.ts +52 -0
  114. package/server/service/payload-log/index.ts +7 -0
  115. package/server/service/payload-log/payload-log-mutation.ts +151 -0
  116. package/server/service/payload-log/payload-log-query.ts +49 -0
  117. package/server/service/payload-log/payload-log-type.ts +36 -0
  118. package/server/service/payload-log/payload-log.ts +100 -0
  119. package/server/service/property-spec.ts +24 -0
  120. package/server/service/scenario/index.ts +6 -0
  121. package/server/service/scenario/scenario-mutation.ts +396 -0
  122. package/server/service/scenario/scenario-query.ts +109 -0
  123. package/server/service/scenario/scenario-type.ts +78 -0
  124. package/server/service/scenario/scenario.ts +124 -0
  125. package/server/service/scenario-flow/scenario-flow.ts +17 -0
  126. package/server/service/scenario-instance/index.ts +6 -0
  127. package/server/service/scenario-instance/scenario-instance-mutation.ts +44 -0
  128. package/server/service/scenario-instance/scenario-instance-query.ts +42 -0
  129. package/server/service/scenario-instance/scenario-instance-subscription.ts +118 -0
  130. package/server/service/scenario-instance/scenario-instance-type.ts +563 -0
  131. package/server/service/scenario-queue/index.ts +4 -0
  132. package/server/service/scenario-queue/scenario-queue-subscription.ts +55 -0
  133. package/server/service/scenario-queue/scenario-queue-type.ts +27 -0
  134. package/server/service/state-register/data-resolver.ts +56 -0
  135. package/server/service/state-register/index.ts +8 -0
  136. package/server/service/state-register/state-register-mutation.ts +166 -0
  137. package/server/service/state-register/state-register-query.ts +80 -0
  138. package/server/service/state-register/state-register-type.ts +80 -0
  139. package/server/service/state-register/state-register.ts +113 -0
  140. package/server/service/step/index.ts +6 -0
  141. package/server/service/step/step-mutation.ts +52 -0
  142. package/server/service/step/step-query.ts +55 -0
  143. package/server/service/step/step-type.ts +215 -0
  144. package/server/service/task-type/index.ts +4 -0
  145. package/server/service/task-type/task-type-query.ts +95 -0
  146. package/server/service/task-type/task-type-type.ts +29 -0
  147. package/translations/en.json +4 -12
  148. package/translations/ja.json +4 -12
  149. package/translations/ko.json +4 -12
  150. package/translations/ms.json +4 -12
  151. package/translations/zh.json +4 -12
  152. package/dist-server/engine/connector/headless-connector.d.ts +0 -23
  153. package/dist-server/engine/connector/headless-connector.js +0 -357
  154. package/dist-server/engine/connector/headless-connector.js.map +0 -1
  155. package/dist-server/engine/resource-pool/headless-pool.d.ts +0 -1
  156. package/dist-server/engine/resource-pool/headless-pool.js +0 -62
  157. package/dist-server/engine/resource-pool/headless-pool.js.map +0 -1
  158. package/dist-server/engine/resource-pool/index.d.ts +0 -1
  159. package/dist-server/engine/resource-pool/index.js +0 -5
  160. package/dist-server/engine/resource-pool/index.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ import { sleep } from '@things-factory/utils'
2
+ import { TaskRegistry } from '../task-registry'
3
+ import { InputStep } from '../../service/step/step-type'
4
+ import { Context } from '../types'
5
+
6
+ async function Sleep(step: InputStep, { logger }: Context) {
7
+ var {
8
+ params: { duration }
9
+ } = step
10
+
11
+ logger.info(`sleep ${duration}ms`)
12
+
13
+ if (duration) {
14
+ await sleep(duration)
15
+ }
16
+
17
+ return {
18
+ data: duration
19
+ }
20
+ }
21
+
22
+ Sleep.parameterSpec = [
23
+ {
24
+ type: 'number',
25
+ name: 'duration',
26
+ placeholder: 'milli-seconds',
27
+ label: 'duration'
28
+ }
29
+ ]
30
+
31
+ Sleep.connectorFree = true
32
+ Sleep.help = 'integration/task/sleep'
33
+
34
+ TaskRegistry.registerTaskHandler('sleep', Sleep)
@@ -0,0 +1,96 @@
1
+ import { sleep } from '@things-factory/utils'
2
+ import { TaskRegistry } from '../task-registry'
3
+ import { ConnectionManager } from '../connection-manager'
4
+ import { InputStep } from '../../service/step/step-type'
5
+ import { Context } from '../types'
6
+
7
+ function convertDataFormat(data, format) {
8
+ try {
9
+ if (format == 'json') {
10
+ return JSON.parse(data)
11
+ } else if (format == 'csv') {
12
+ return data.split(',')
13
+ }
14
+ } catch (e) {
15
+ return data.toString()
16
+ }
17
+
18
+ return data
19
+ }
20
+
21
+ async function SocketListener(step: InputStep, context: Context) {
22
+ //get connection data
23
+ const {
24
+ connection: connectionName,
25
+ params: { dataFormat = 'JSON' },
26
+ name
27
+ } = step
28
+
29
+ const { domain, logger, closures, __socket_listener } = context
30
+ logger.info('\r\n')
31
+ if (!__socket_listener) {
32
+ context.__socket_listener = {}
33
+ }
34
+
35
+ // get socket information from connection
36
+ var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
37
+ if (!connection) {
38
+ throw new Error(`connector '${connectionName}' is not established.`)
39
+ }
40
+
41
+ /*
42
+ * 1. listner list에서 listner를 찾는다. 없으면, 생성한다.
43
+ */
44
+ if (!context.__socket_listener[name]) {
45
+ try {
46
+ var MESSAGES = []
47
+ context.__socket_listener[name] = async () => {
48
+ while (MESSAGES.length == 0) {
49
+ await sleep(100)
50
+ }
51
+ var message = MESSAGES.shift()
52
+ return {
53
+ message
54
+ }
55
+ }
56
+
57
+ await connection.addListener('socket-message-arrive', async message => {
58
+ logger.info(message.toString())
59
+ MESSAGES.push(convertDataFormat(message.toString(), dataFormat))
60
+ })
61
+ } catch (e) {
62
+ logger.error(e)
63
+ }
64
+ }
65
+
66
+ var { message } = await context.__socket_listener[name]()
67
+
68
+ return {
69
+ data: message
70
+ }
71
+ }
72
+
73
+ SocketListener.parameterSpec = [
74
+ {
75
+ type: 'select',
76
+ label: 'data-format',
77
+ name: 'dataFormat',
78
+ property: {
79
+ options: [
80
+ {
81
+ display: 'CSV',
82
+ value: 'csv'
83
+ },
84
+ {
85
+ display: 'JSON',
86
+ value: 'json'
87
+ },
88
+ {
89
+ display: 'String',
90
+ value: 'string'
91
+ }
92
+ ]
93
+ }
94
+ }
95
+ ]
96
+ TaskRegistry.registerTaskHandler('socket-listener', SocketListener)
@@ -0,0 +1,69 @@
1
+ import gql from 'graphql-tag'
2
+ import { TaskRegistry } from '../task-registry'
3
+ import { InputStep } from '../../service/step/step-type'
4
+ import { Context } from '../types'
5
+
6
+ async function StateGroupRead(step: InputStep, { logger, publish, data, domain, user, client }: Context) {
7
+ var {
8
+ params: { group }
9
+ } = step
10
+
11
+ if (!group) {
12
+ throw Error(`group should be defined: group - '${group}'`)
13
+ }
14
+
15
+ var { data: queryResult, errors } = await client.query({
16
+ query: gql`
17
+ query ($filters: [Filter!]) {
18
+ stateRegisters(filters: $filters) {
19
+ items {
20
+ name
21
+ state
22
+ }
23
+ }
24
+ }
25
+ `,
26
+ variables: {
27
+ filters: [
28
+ {
29
+ name: 'group',
30
+ operator: 'eq',
31
+ value: group
32
+ }
33
+ ]
34
+ },
35
+ context: {
36
+ state: {
37
+ domain,
38
+ user
39
+ }
40
+ }
41
+ })
42
+
43
+ if (errors) {
44
+ errors.forEach(error => {
45
+ logger.error('GraphQL Error: %s', error)
46
+ })
47
+ }
48
+
49
+ return {
50
+ data: queryResult?.stateRegisters?.items.reduce((status, item) => {
51
+ const { name, state } = item
52
+ status[name] = state
53
+ return status
54
+ }, {})
55
+ }
56
+ }
57
+
58
+ StateGroupRead.parameterSpec = [
59
+ {
60
+ type: 'string',
61
+ name: 'group',
62
+ label: 'group'
63
+ }
64
+ ]
65
+
66
+ StateGroupRead.connectorFree = true
67
+ StateGroupRead.help = 'integration/task/state-group-read'
68
+
69
+ TaskRegistry.registerTaskHandler('state-group-read', StateGroupRead)
@@ -0,0 +1,56 @@
1
+ import gql from 'graphql-tag'
2
+ import { TaskRegistry } from '../task-registry'
3
+ import { InputStep } from '../../service/step/step-type'
4
+ import { Context } from '../types'
5
+
6
+ async function StateRead(step: InputStep, { logger, publish, data, domain, user, client }: Context) {
7
+ var {
8
+ params: { name }
9
+ } = step
10
+
11
+ if (!name) {
12
+ throw Error(`name should be defined: name - '${name}'`)
13
+ }
14
+
15
+ var { data: queryResult, errors } = await client.query({
16
+ query: gql`
17
+ query ($name: String!) {
18
+ stateRegisterByName(name: $name) {
19
+ state
20
+ }
21
+ }
22
+ `,
23
+ variables: {
24
+ name
25
+ },
26
+ context: {
27
+ state: {
28
+ domain,
29
+ user
30
+ }
31
+ }
32
+ })
33
+
34
+ if (errors) {
35
+ errors.forEach(error => {
36
+ logger.error('GraphQL Error: %s', error)
37
+ })
38
+ }
39
+
40
+ return {
41
+ data: queryResult?.stateRegisterByName?.state
42
+ }
43
+ }
44
+
45
+ StateRead.parameterSpec = [
46
+ {
47
+ type: 'string',
48
+ name: 'name',
49
+ label: 'name'
50
+ }
51
+ ]
52
+
53
+ StateRead.connectorFree = true
54
+ StateRead.help = 'integration/task/state-read'
55
+
56
+ TaskRegistry.registerTaskHandler('state-read', StateRead)
@@ -0,0 +1,65 @@
1
+ import gql from 'graphql-tag'
2
+ import { access } from '@things-factory/utils'
3
+ import { TaskRegistry } from '../task-registry'
4
+ import { InputStep } from '../../service/step/step-type'
5
+ import { Context } from '../types'
6
+
7
+ async function StateWrite(step: InputStep, { logger, publish, data, domain, user, client }: Context) {
8
+ var {
9
+ params: { name, accessor }
10
+ } = step
11
+
12
+ if (!name || !accessor) {
13
+ throw Error(`name and accessor should be defined: name - '${name}', accessor - '${accessor}'`)
14
+ }
15
+
16
+ var state = access(accessor, data)
17
+
18
+ var { data: mutateResult, errors } = await client.mutate({
19
+ mutation: gql`
20
+ mutation ($state: Object!, $name: String!) {
21
+ updateStateRegisterByName(state: $state, name: $name) {
22
+ state
23
+ }
24
+ }
25
+ `,
26
+ variables: {
27
+ name,
28
+ state
29
+ },
30
+ context: {
31
+ state: {
32
+ domain,
33
+ user
34
+ }
35
+ }
36
+ })
37
+
38
+ if (errors) {
39
+ errors.forEach(error => {
40
+ logger.error('GraphQL Error: %s', error)
41
+ })
42
+ }
43
+
44
+ return {
45
+ data: mutateResult?.updateStateRegisterByName?.state
46
+ }
47
+ }
48
+
49
+ StateWrite.parameterSpec = [
50
+ {
51
+ type: 'string',
52
+ name: 'name',
53
+ label: 'name'
54
+ },
55
+ {
56
+ type: 'scenario-step-input',
57
+ name: 'accessor',
58
+ label: 'accessor'
59
+ }
60
+ ]
61
+
62
+ StateWrite.connectorFree = true
63
+ StateWrite.help = 'integration/task/state-write'
64
+
65
+ TaskRegistry.registerTaskHandler('state-write', StateWrite)
@@ -0,0 +1,44 @@
1
+ import { getRepository } from '@things-factory/shell'
2
+
3
+ import { Scenario } from '../../service/scenario/scenario'
4
+ import { ScenarioEngine } from '../../engine'
5
+ import { TaskRegistry } from '../task-registry'
6
+ import { InputStep } from '../../service/step/step-type'
7
+ import { Context } from '../types'
8
+
9
+ async function StopScenario(step: InputStep, context: Context) {
10
+ var { logger, domain } = context
11
+ var {
12
+ params: { scenario }
13
+ } = step
14
+
15
+ // find the name of the input scenario
16
+ var foundScenario = await getRepository(Scenario).findOne({
17
+ where: {
18
+ id: scenario
19
+ },
20
+ relations: ['steps', 'domain']
21
+ })
22
+
23
+ await ScenarioEngine.unload(domain, foundScenario?.name)
24
+ logger.info(`Scenario '${foundScenario?.name}' is about to be stopped.`)
25
+
26
+ return {
27
+ data: foundScenario?.name
28
+ }
29
+ }
30
+
31
+ StopScenario.parameterSpec = [
32
+ {
33
+ type: 'entity-selector',
34
+ name: 'scenario',
35
+ label: 'scenario',
36
+ property: {
37
+ queryName: 'scenarios'
38
+ }
39
+ }
40
+ ]
41
+
42
+ StopScenario.connectorFree = true
43
+
44
+ TaskRegistry.registerTaskHandler('scenario-stop', StopScenario)
@@ -0,0 +1,57 @@
1
+ import { getRepository } from '@things-factory/shell'
2
+ import { access, deepClone } from '@things-factory/utils'
3
+
4
+ import { Scenario } from '../../service/scenario/scenario'
5
+ import { TaskRegistry } from '../task-registry'
6
+ import { InputStep } from '../../service/step/step-type'
7
+ import { Context } from '../types'
8
+
9
+ async function SubScenario(step: InputStep, context: Context) {
10
+ var { logger, load, data } = context
11
+ var {
12
+ params: { scenario, variables }
13
+ } = step
14
+
15
+ var subscenario = await getRepository(Scenario).findOne({
16
+ where: {
17
+ id: scenario
18
+ },
19
+ relations: ['steps', 'domain']
20
+ })
21
+
22
+ logger.info(`Sub Scenario '${subscenario.name}' Started.`)
23
+ var subContext = await load(step, subscenario, {
24
+ ...context,
25
+ data: {},
26
+ /*
27
+ FIXME variables 설정이 안된 경우에 subscenario의 variables는 undefined가 되는 것이 맞겠지만,
28
+ 하위 호환성 유지를 위해서 부모의 variables를 사용함
29
+ */
30
+ variables: variables ? deepClone(access(variables, data)) : context.variables
31
+ })
32
+ logger.info(`Sub Scenario '${subscenario.name}' done.`)
33
+
34
+ return {
35
+ data: subContext.data
36
+ }
37
+ }
38
+
39
+ SubScenario.parameterSpec = [
40
+ {
41
+ type: 'entity-selector',
42
+ name: 'scenario',
43
+ label: 'scenario',
44
+ property: {
45
+ queryName: 'scenarios'
46
+ }
47
+ },
48
+ {
49
+ type: 'scenario-step-input',
50
+ name: 'variables',
51
+ label: 'variables'
52
+ }
53
+ ]
54
+
55
+ SubScenario.connectorFree = true
56
+
57
+ TaskRegistry.registerTaskHandler('scenario', SubScenario)
@@ -0,0 +1,43 @@
1
+ import { access } from '@things-factory/utils'
2
+
3
+ import { TaskRegistry } from '../task-registry'
4
+
5
+ import { InputStep } from '../../service/step/step-type'
6
+ import { Context } from '../types'
7
+
8
+ async function SwitchGoTo(step: InputStep, { logger, data }: Context) {
9
+ var {
10
+ params: { accessor, cases }
11
+ } = step
12
+
13
+ var value = access(accessor, data)
14
+
15
+ var next = cases[value] || cases['default']
16
+
17
+ logger.info(`switch to next '${next}' by value '${value}' .`)
18
+
19
+ return {
20
+ next
21
+ }
22
+ }
23
+
24
+ SwitchGoTo.parameterSpec = [
25
+ {
26
+ type: 'scenario-step-input',
27
+ name: 'accessor',
28
+ label: 'accessor'
29
+ },
30
+ {
31
+ type: 'map',
32
+ name: 'cases',
33
+ label: 'cases',
34
+ property: {
35
+ valuetype: 'scenario-step-input'
36
+ }
37
+ }
38
+ ]
39
+
40
+ SwitchGoTo.connectorFree = true
41
+
42
+ TaskRegistry.registerTaskHandler('switch', SwitchGoTo)
43
+ TaskRegistry.registerTaskHandler('switch-goto', SwitchGoTo)
@@ -0,0 +1,53 @@
1
+ import { access } from '@things-factory/utils'
2
+
3
+ import { TaskRegistry } from '../task-registry'
4
+ import { InputStep } from '../../service/step/step-type'
5
+ import { Context } from '../types'
6
+
7
+ async function SwitchRangeGoTo(step: InputStep, { logger, data }: Context) {
8
+ var {
9
+ params: { accessor, cases }
10
+ } = step
11
+
12
+ var value = Number(access(accessor, data))
13
+
14
+ var range =
15
+ Object.keys(cases).find(key => {
16
+ if (key == 'default') {
17
+ return
18
+ }
19
+
20
+ var [from, to] = key.split('~')
21
+
22
+ return Number(from) <= value && Number(to) > value
23
+ }) || 'default'
24
+
25
+ var next = cases[range]
26
+
27
+ logger.info(`switch-range to next '${next}' by value '${value}' .`)
28
+
29
+ return {
30
+ next
31
+ }
32
+ }
33
+
34
+ SwitchRangeGoTo.parameterSpec = [
35
+ {
36
+ type: 'scenario-step-input',
37
+ name: 'accessor',
38
+ label: 'accessor'
39
+ },
40
+ {
41
+ type: 'range',
42
+ name: 'cases',
43
+ label: 'cases',
44
+ property: {
45
+ valuetype: 'scenario-step-input'
46
+ }
47
+ }
48
+ ]
49
+
50
+ SwitchRangeGoTo.connectorFree = true
51
+
52
+ TaskRegistry.registerTaskHandler('switch-range', SwitchRangeGoTo)
53
+ TaskRegistry.registerTaskHandler('switch-range-goto', SwitchRangeGoTo)
@@ -0,0 +1,79 @@
1
+ import { getRepository } from '@things-factory/shell'
2
+ import { access, deepClone } from '@things-factory/utils'
3
+
4
+ import { Scenario } from '../../service/scenario/scenario'
5
+ import { TaskRegistry } from '../task-registry'
6
+ import { InputStep } from '../../service/step/step-type'
7
+ import { Context } from '../types'
8
+
9
+ async function SwitchRangeScenario(step: InputStep, context: Context) {
10
+ var { logger, data, load } = context
11
+ var {
12
+ params: { accessor, cases, variables }
13
+ } = step
14
+
15
+ var value = Number(access(accessor, data))
16
+
17
+ var range =
18
+ Object.keys(cases).find(key => {
19
+ if (key == 'default') {
20
+ return
21
+ }
22
+
23
+ var [from, to] = key.split('~')
24
+
25
+ return Number(from) <= value && Number(to) > value
26
+ }) || 'default'
27
+
28
+ var scenarioName = cases[range]
29
+
30
+ logger.info(`switch-range to scenario '${scenarioName}' by value '${value}' .`)
31
+
32
+ var subscenario = await getRepository(Scenario).findOne({
33
+ where: {
34
+ name: scenarioName
35
+ },
36
+ relations: ['steps', 'domain']
37
+ })
38
+
39
+ logger.info(`Sub Scenario '${subscenario.name}' started.`)
40
+ var subContext = await load(step, subscenario, {
41
+ ...context,
42
+ data: {},
43
+ /*
44
+ FIXME variables 설정이 안된 경우에 subscenario의 variables는 undefined가 되는 것이 맞겠지만,
45
+ 하위 호환성 유지를 위해서 부모의 variables를 사용함
46
+ */
47
+ variables: variables ? deepClone(access(variables, data)) : context.variables
48
+ })
49
+ logger.info(`Sub Scenario '${subscenario.name}' done.`)
50
+
51
+ return {
52
+ data: subContext.data
53
+ }
54
+ }
55
+
56
+ SwitchRangeScenario.parameterSpec = [
57
+ {
58
+ type: 'scenario-step-input',
59
+ name: 'accessor',
60
+ label: 'accessor'
61
+ },
62
+ {
63
+ type: 'range',
64
+ name: 'cases',
65
+ label: 'cases',
66
+ property: {
67
+ valuetype: 'scenario-input'
68
+ }
69
+ },
70
+ {
71
+ type: 'scenario-step-input',
72
+ name: 'variables',
73
+ label: 'variables'
74
+ }
75
+ ]
76
+
77
+ SwitchRangeScenario.connectorFree = true
78
+
79
+ TaskRegistry.registerTaskHandler('switch-range-scenario', SwitchRangeScenario)
@@ -0,0 +1,48 @@
1
+ import { access } from '@things-factory/utils'
2
+ import { TaskRegistry } from '../task-registry'
3
+ import { InputStep } from '../../service/step/step-type'
4
+ import { Context } from '../types'
5
+
6
+ async function SwitchRangeSet(step: InputStep, { logger, data }: Context) {
7
+ var {
8
+ params: { accessor, cases }
9
+ } = step
10
+
11
+ var value = Number(access(accessor, data))
12
+
13
+ var range =
14
+ Object.keys(cases).find(key => {
15
+ if (key == 'default') {
16
+ return
17
+ }
18
+
19
+ var [from, to] = key.split('~')
20
+
21
+ return Number(from) <= value && Number(to) > value
22
+ }) || 'default'
23
+
24
+ var data = cases[range]
25
+
26
+ logger.info(`switch-range to data '${data}' by value '${value}' .`)
27
+
28
+ return {
29
+ data
30
+ }
31
+ }
32
+
33
+ SwitchRangeSet.parameterSpec = [
34
+ {
35
+ type: 'scenario-step-input',
36
+ name: 'accessor',
37
+ label: 'accessor'
38
+ },
39
+ {
40
+ type: 'range',
41
+ name: 'cases',
42
+ label: 'cases'
43
+ }
44
+ ]
45
+
46
+ SwitchRangeSet.connectorFree = true
47
+
48
+ TaskRegistry.registerTaskHandler('switch-range-set', SwitchRangeSet)