@things-factory/integration-base 8.0.0-beta.9 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/connector/http-connector.js +1 -1
- package/dist-server/engine/connector/http-connector.js.map +1 -1
- package/dist-server/engine/connector/index.d.ts +0 -1
- package/dist-server/engine/connector/index.js +0 -1
- package/dist-server/engine/connector/index.js.map +1 -1
- package/dist-server/engine/index.d.ts +0 -1
- package/dist-server/engine/index.js +0 -1
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/task/headless-post.js +33 -19
- package/dist-server/engine/task/headless-post.js.map +1 -1
- package/dist-server/engine/task/headless-scrap.js +13 -20
- package/dist-server/engine/task/headless-scrap.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -12
- package/server/controllers/index.ts +2 -0
- package/server/controllers/publish-data.ts +29 -0
- package/server/controllers/scenario-controller.ts +156 -0
- package/server/engine/analyzer/analyze-integration.ts +115 -0
- package/server/engine/connection-manager.ts +239 -0
- package/server/engine/connector/echo-back-connector.ts +51 -0
- package/server/engine/connector/echo-back-server.ts +72 -0
- package/server/engine/connector/graphql-connector.ts +126 -0
- package/server/engine/connector/http-connector.ts +65 -0
- package/server/engine/connector/index.ts +12 -0
- package/server/engine/connector/mqtt-connector.ts +78 -0
- package/server/engine/connector/mssql-connector.ts +152 -0
- package/server/engine/connector/mysql-connector.ts +94 -0
- package/server/engine/connector/operato-connector.ts +264 -0
- package/server/engine/connector/oracle-connector.ts +218 -0
- package/server/engine/connector/postgresql-connector.ts +152 -0
- package/server/engine/connector/proxy-connector.ts +53 -0
- package/server/engine/connector/socket-server.ts +86 -0
- package/server/engine/connector/sqlite-connector.ts +69 -0
- package/server/engine/edge-client.ts +45 -0
- package/server/engine/index.ts +10 -0
- package/server/engine/pending-queue.ts +97 -0
- package/server/engine/scenario-engine.ts +106 -0
- package/server/engine/task/book-up-scenario.ts +73 -0
- package/server/engine/task/csv-readline.ts +127 -0
- package/server/engine/task/data-accessor.ts +36 -0
- package/server/engine/task/data-mapper.ts +47 -0
- package/server/engine/task/database-query.ts +56 -0
- package/server/engine/task/echo-receive.ts +21 -0
- package/server/engine/task/echo-send.ts +32 -0
- package/server/engine/task/empty-check.ts +38 -0
- package/server/engine/task/end.ts +18 -0
- package/server/engine/task/floating-point.ts +71 -0
- package/server/engine/task/goto.ts +27 -0
- package/server/engine/task/graphql-mutate.ts +79 -0
- package/server/engine/task/graphql-query.ts +78 -0
- package/server/engine/task/headless-post.ts +147 -0
- package/server/engine/task/headless-scrap.ts +80 -0
- package/server/engine/task/http-get.ts +117 -0
- package/server/engine/task/http-post.ts +148 -0
- package/server/engine/task/index.ts +45 -0
- package/server/engine/task/jsonata.ts +45 -0
- package/server/engine/task/local-graphql-mutate.ts +100 -0
- package/server/engine/task/local-graphql-query.ts +100 -0
- package/server/engine/task/log.ts +78 -0
- package/server/engine/task/mqtt-publish.ts +45 -0
- package/server/engine/task/mqtt-subscribe.ts +139 -0
- package/server/engine/task/mssql-procedure.ts +128 -0
- package/server/engine/task/oracle-procedure.ts +124 -0
- package/server/engine/task/pick-pending-scenario.ts +80 -0
- package/server/engine/task/publish.ts +40 -0
- package/server/engine/task/random.ts +53 -0
- package/server/engine/task/reset-pending-queue.ts +17 -0
- package/server/engine/task/script.ts +63 -0
- package/server/engine/task/set-domain.ts +37 -0
- package/server/engine/task/sleep.ts +34 -0
- package/server/engine/task/socket-listener.ts +96 -0
- package/server/engine/task/state-group-read.ts +69 -0
- package/server/engine/task/state-read.ts +56 -0
- package/server/engine/task/state-write.ts +65 -0
- package/server/engine/task/stop-scenario.ts +44 -0
- package/server/engine/task/sub-scenario.ts +57 -0
- package/server/engine/task/switch-goto.ts +43 -0
- package/server/engine/task/switch-range-goto.ts +53 -0
- package/server/engine/task/switch-range-scenario.ts +79 -0
- package/server/engine/task/switch-range-set.ts +48 -0
- package/server/engine/task/switch-scenario.ts +67 -0
- package/server/engine/task/switch-set.ts +37 -0
- package/server/engine/task/throw.ts +27 -0
- package/server/engine/task/utils/headless-pool-for-scenario.ts +71 -0
- package/server/engine/task/utils/substitute.ts +44 -0
- package/server/engine/task/variables.ts +17 -0
- package/server/engine/task-registry.ts +23 -0
- package/server/engine/types.ts +114 -0
- package/server/index.ts +20 -0
- package/server/migrations/index.ts +9 -0
- package/server/restful/index.ts +1 -0
- package/server/restful/unstable/index.ts +7 -0
- package/server/restful/unstable/run-scenario.ts +51 -0
- package/server/restful/unstable/scenario-instance.ts +52 -0
- package/server/restful/unstable/scenario-instances.ts +80 -0
- package/server/restful/unstable/scenario.ts +41 -0
- package/server/restful/unstable/scenarios.ts +69 -0
- package/server/restful/unstable/start-scenario.ts +33 -0
- package/server/restful/unstable/stop-scenario.ts +30 -0
- package/server/routers/scenario-schedule-callback-router.ts +69 -0
- package/server/routers/scenario-view-router.ts +46 -0
- package/server/routes.ts +30 -0
- package/server/service/analysis/analysis-query.ts +13 -0
- package/server/service/analysis/index.ts +3 -0
- package/server/service/connection/connection-mutation.ts +190 -0
- package/server/service/connection/connection-query.ts +87 -0
- package/server/service/connection/connection-subscription.ts +104 -0
- package/server/service/connection/connection-type.ts +288 -0
- package/server/service/connection/index.ts +7 -0
- package/server/service/connector/connector-query.ts +62 -0
- package/server/service/connector/connector-type.ts +29 -0
- package/server/service/connector/index.ts +4 -0
- package/server/service/index.ts +52 -0
- package/server/service/payload-log/index.ts +7 -0
- package/server/service/payload-log/payload-log-mutation.ts +151 -0
- package/server/service/payload-log/payload-log-query.ts +49 -0
- package/server/service/payload-log/payload-log-type.ts +36 -0
- package/server/service/payload-log/payload-log.ts +100 -0
- package/server/service/property-spec.ts +24 -0
- package/server/service/scenario/index.ts +6 -0
- package/server/service/scenario/scenario-mutation.ts +396 -0
- package/server/service/scenario/scenario-query.ts +109 -0
- package/server/service/scenario/scenario-type.ts +78 -0
- package/server/service/scenario/scenario.ts +124 -0
- package/server/service/scenario-flow/scenario-flow.ts +17 -0
- package/server/service/scenario-instance/index.ts +6 -0
- package/server/service/scenario-instance/scenario-instance-mutation.ts +44 -0
- package/server/service/scenario-instance/scenario-instance-query.ts +42 -0
- package/server/service/scenario-instance/scenario-instance-subscription.ts +118 -0
- package/server/service/scenario-instance/scenario-instance-type.ts +563 -0
- package/server/service/scenario-queue/index.ts +4 -0
- package/server/service/scenario-queue/scenario-queue-subscription.ts +55 -0
- package/server/service/scenario-queue/scenario-queue-type.ts +27 -0
- package/server/service/state-register/data-resolver.ts +56 -0
- package/server/service/state-register/index.ts +8 -0
- package/server/service/state-register/state-register-mutation.ts +166 -0
- package/server/service/state-register/state-register-query.ts +80 -0
- package/server/service/state-register/state-register-type.ts +80 -0
- package/server/service/state-register/state-register.ts +113 -0
- package/server/service/step/index.ts +6 -0
- package/server/service/step/step-mutation.ts +52 -0
- package/server/service/step/step-query.ts +55 -0
- package/server/service/step/step-type.ts +215 -0
- package/server/service/task-type/index.ts +4 -0
- package/server/service/task-type/task-type-query.ts +95 -0
- package/server/service/task-type/task-type-type.ts +29 -0
- package/translations/en.json +4 -12
- package/translations/ja.json +4 -12
- package/translations/ko.json +4 -12
- package/translations/ms.json +4 -12
- package/translations/zh.json +4 -12
- package/dist-server/engine/connector/headless-connector.d.ts +0 -23
- package/dist-server/engine/connector/headless-connector.js +0 -357
- package/dist-server/engine/connector/headless-connector.js.map +0 -1
- package/dist-server/engine/resource-pool/headless-pool.d.ts +0 -1
- package/dist-server/engine/resource-pool/headless-pool.js +0 -62
- package/dist-server/engine/resource-pool/headless-pool.js.map +0 -1
- package/dist-server/engine/resource-pool/index.d.ts +0 -1
- package/dist-server/engine/resource-pool/index.js +0 -5
- 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)
|