@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.
- 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,67 @@
|
|
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 SwitchScenario(step: InputStep, context: Context) {
|
10
|
+
var { logger, data, load } = context
|
11
|
+
var {
|
12
|
+
params: { accessor, cases, variables }
|
13
|
+
} = step
|
14
|
+
|
15
|
+
var value = access(accessor, data)
|
16
|
+
|
17
|
+
var scenarioName = cases[value] || cases['default']
|
18
|
+
logger.info(`switch to scenario '${scenarioName}' by value '${value}' .`)
|
19
|
+
|
20
|
+
var subscenario = await getRepository(Scenario).findOne({
|
21
|
+
where: {
|
22
|
+
name: scenarioName
|
23
|
+
},
|
24
|
+
relations: ['steps', 'domain']
|
25
|
+
})
|
26
|
+
|
27
|
+
logger.info(`Sub Scenario '${subscenario.name}' started.`)
|
28
|
+
var subContext = await load(step, subscenario, {
|
29
|
+
...context,
|
30
|
+
data: {},
|
31
|
+
/*
|
32
|
+
FIXME variables 설정이 안된 경우에 subscenario의 variables는 undefined가 되는 것이 맞겠지만,
|
33
|
+
하위 호환성 유지를 위해서 부모의 variables를 사용함
|
34
|
+
*/
|
35
|
+
variables: variables ? deepClone(access(variables, data)) : context.variables
|
36
|
+
})
|
37
|
+
logger.info(`Sub Scenario '${subscenario.name}' done.`)
|
38
|
+
|
39
|
+
return {
|
40
|
+
data: subContext.data
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
SwitchScenario.parameterSpec = [
|
45
|
+
{
|
46
|
+
type: 'scenario-step-input',
|
47
|
+
name: 'accessor',
|
48
|
+
label: 'accessor'
|
49
|
+
},
|
50
|
+
{
|
51
|
+
type: 'map',
|
52
|
+
name: 'cases',
|
53
|
+
label: 'cases',
|
54
|
+
property: {
|
55
|
+
valuetype: 'scenario-input'
|
56
|
+
}
|
57
|
+
},
|
58
|
+
{
|
59
|
+
type: 'scenario-step-input',
|
60
|
+
name: 'variables',
|
61
|
+
label: 'variables'
|
62
|
+
}
|
63
|
+
]
|
64
|
+
|
65
|
+
SwitchScenario.connectorFree = true
|
66
|
+
|
67
|
+
TaskRegistry.registerTaskHandler('switch-scenario', SwitchScenario)
|
@@ -0,0 +1,37 @@
|
|
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 SwitchSet(step: InputStep, { logger, data }: Context) {
|
7
|
+
var {
|
8
|
+
params: { accessor, cases }
|
9
|
+
} = step
|
10
|
+
|
11
|
+
var value = access(accessor, data)
|
12
|
+
|
13
|
+
var data = cases[value] || cases['default']
|
14
|
+
|
15
|
+
logger.info(`switch to data '${data}' by value '${value}' .`)
|
16
|
+
|
17
|
+
return {
|
18
|
+
data
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
SwitchSet.parameterSpec = [
|
23
|
+
{
|
24
|
+
type: 'scenario-step-input',
|
25
|
+
name: 'accessor',
|
26
|
+
label: 'accessor'
|
27
|
+
},
|
28
|
+
{
|
29
|
+
type: 'map',
|
30
|
+
name: 'cases',
|
31
|
+
label: 'cases'
|
32
|
+
}
|
33
|
+
]
|
34
|
+
|
35
|
+
SwitchSet.connectorFree = true
|
36
|
+
|
37
|
+
TaskRegistry.registerTaskHandler('switch-set', SwitchSet)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { TaskRegistry } from '../task-registry'
|
2
|
+
import { InputStep } from '../../service/step/step-type'
|
3
|
+
import { Context } from '../types'
|
4
|
+
|
5
|
+
async function Throw(step: InputStep, { logger }: Context) {
|
6
|
+
var {
|
7
|
+
name,
|
8
|
+
params: { message }
|
9
|
+
} = step
|
10
|
+
|
11
|
+
throw `'${message}' is thrown by step '${name}'`
|
12
|
+
|
13
|
+
return {}
|
14
|
+
}
|
15
|
+
|
16
|
+
Throw.parameterSpec = [
|
17
|
+
{
|
18
|
+
type: 'string',
|
19
|
+
name: 'message',
|
20
|
+
label: 'message'
|
21
|
+
}
|
22
|
+
]
|
23
|
+
|
24
|
+
Throw.connectorFree = true
|
25
|
+
Throw.help = 'integration/task/throw'
|
26
|
+
|
27
|
+
TaskRegistry.registerTaskHandler('throw', Throw)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
import * as genericPool from 'generic-pool'
|
2
|
+
|
3
|
+
import { config, logger } from '@things-factory/env'
|
4
|
+
|
5
|
+
try {
|
6
|
+
var puppeteer = require('puppeteer')
|
7
|
+
} catch (err) {
|
8
|
+
logger.error(err)
|
9
|
+
}
|
10
|
+
|
11
|
+
var headlessPool
|
12
|
+
|
13
|
+
export function getHeadlessPool() {
|
14
|
+
if (!headlessPool) {
|
15
|
+
headlessPool = genericPool.createPool(
|
16
|
+
{
|
17
|
+
create() {
|
18
|
+
console.log('headless instance in headless-pool-for-scensrio about to create')
|
19
|
+
return initializeChromium()
|
20
|
+
},
|
21
|
+
validate(browser) {
|
22
|
+
return Promise.race([
|
23
|
+
new Promise(res => setTimeout(() => res(false), 1500)),
|
24
|
+
browser
|
25
|
+
//@ts-ignore
|
26
|
+
.version()
|
27
|
+
.then(_ => true)
|
28
|
+
.catch(_ => false)
|
29
|
+
])
|
30
|
+
},
|
31
|
+
destroy(browser) {
|
32
|
+
//@ts-ignore
|
33
|
+
return browser.close()
|
34
|
+
}
|
35
|
+
},
|
36
|
+
{
|
37
|
+
min: 2,
|
38
|
+
max: 10,
|
39
|
+
testOnBorrow: true,
|
40
|
+
acquireTimeoutMillis: 15000
|
41
|
+
}
|
42
|
+
)
|
43
|
+
}
|
44
|
+
|
45
|
+
return headlessPool
|
46
|
+
}
|
47
|
+
|
48
|
+
const CHROMIUM_PATH = config.get('CHROMIUM_PATH')
|
49
|
+
|
50
|
+
async function initializeChromium() {
|
51
|
+
try {
|
52
|
+
if (!puppeteer) {
|
53
|
+
return
|
54
|
+
}
|
55
|
+
|
56
|
+
var launchSetting = {
|
57
|
+
args: ['--mute-audio', '--no-sandbox'],
|
58
|
+
headless: 'shell'
|
59
|
+
}
|
60
|
+
|
61
|
+
if (CHROMIUM_PATH) {
|
62
|
+
launchSetting['executablePath'] = CHROMIUM_PATH
|
63
|
+
}
|
64
|
+
|
65
|
+
const browser = await puppeteer.launch(launchSetting)
|
66
|
+
|
67
|
+
return browser
|
68
|
+
} catch (err) {
|
69
|
+
logger.error(err)
|
70
|
+
}
|
71
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
const SELF = function (o) {
|
2
|
+
return o
|
3
|
+
}
|
4
|
+
|
5
|
+
function parse(text) {
|
6
|
+
var defaultIndex = text.indexOf('||')
|
7
|
+
var originText = ''
|
8
|
+
var defaultValue = ''
|
9
|
+
if (defaultIndex != -1) {
|
10
|
+
originText = text
|
11
|
+
defaultValue = text.substring(defaultIndex + 2, text.length - 1).trim()
|
12
|
+
text = text.replace(text.substring(defaultIndex, text.length - 1), '').trim()
|
13
|
+
}
|
14
|
+
var parsed = text
|
15
|
+
.substr(2, text.length - 3)
|
16
|
+
.trim()
|
17
|
+
.replace(/\[(\w+)\]/g, '.$1')
|
18
|
+
.replace(/^\./, '')
|
19
|
+
.split('.')
|
20
|
+
.filter(accessor => !!accessor.trim())
|
21
|
+
var accessors = parsed.slice(1)
|
22
|
+
return {
|
23
|
+
defaultValue: defaultValue,
|
24
|
+
match: text,
|
25
|
+
originText: originText || text,
|
26
|
+
target: parsed[0],
|
27
|
+
accessor:
|
28
|
+
accessors.length > 0
|
29
|
+
? function (o) {
|
30
|
+
return accessors.reduce((o, accessor) => (o ? o[accessor] : undefined), o)
|
31
|
+
}
|
32
|
+
: SELF
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
export function substitute(value, data) {
|
37
|
+
var text = String(value)
|
38
|
+
var substituteVal = text.match(/#{[^}]*}/gi)
|
39
|
+
var prop = substituteVal ? parse(substituteVal[0]) : undefined
|
40
|
+
if (prop && data.hasOwnProperty(prop.target)) {
|
41
|
+
return prop.accessor(data[prop.target])
|
42
|
+
}
|
43
|
+
return value
|
44
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { TaskRegistry } from '../task-registry'
|
2
|
+
import { InputStep } from '../../service/step/step-type'
|
3
|
+
import { Context } from '../types'
|
4
|
+
|
5
|
+
async function Variables(step: InputStep, { variables }: Context) {
|
6
|
+
return {
|
7
|
+
data: variables instanceof Array ? [...variables] : typeof variables == 'object' ? { ...variables } : variables
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
Variables.parameterSpec = []
|
12
|
+
|
13
|
+
Variables.connectorFree = true
|
14
|
+
|
15
|
+
Variables.help = 'integration/task/variables'
|
16
|
+
|
17
|
+
TaskRegistry.registerTaskHandler('variables', Variables)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import { TaskHandler } from './types'
|
2
|
+
|
3
|
+
export class TaskRegistry {
|
4
|
+
static handlers: { [type: string]: TaskHandler } = {}
|
5
|
+
|
6
|
+
static getTaskHandler(type: string): TaskHandler {
|
7
|
+
return TaskRegistry.handlers[type]
|
8
|
+
}
|
9
|
+
|
10
|
+
static registerTaskHandler(type: string, handler: TaskHandler) {
|
11
|
+
TaskRegistry.handlers[type] = handler
|
12
|
+
}
|
13
|
+
|
14
|
+
static unregisterTaskHandler(type: string) {
|
15
|
+
delete TaskRegistry.handlers[type]
|
16
|
+
}
|
17
|
+
|
18
|
+
static getTaskHandlers(): { [propName: string]: TaskHandler } {
|
19
|
+
return {
|
20
|
+
...TaskRegistry.handlers
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
import { Connection, PropertySpec, ScenarioInstance, ScenarioInstanceStatus, Step } from '../service'
|
2
|
+
import { Domain } from '@things-factory/shell'
|
3
|
+
import { User } from '@things-factory/auth-base'
|
4
|
+
|
5
|
+
export interface Connector {
|
6
|
+
ready(connections: Connection[]): Promise<any>
|
7
|
+
connect(connection: Connection): Promise<any>
|
8
|
+
disconnect(connection: Connection): Promise<any>
|
9
|
+
parameterSpec: PropertySpec[]
|
10
|
+
taskPrefixes?: string[]
|
11
|
+
description?: string
|
12
|
+
help?: string
|
13
|
+
}
|
14
|
+
|
15
|
+
export type Context = {
|
16
|
+
/**
|
17
|
+
* Represents the domain context.
|
18
|
+
*/
|
19
|
+
domain: Domain
|
20
|
+
|
21
|
+
/**
|
22
|
+
* User information.
|
23
|
+
*/
|
24
|
+
user: User
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Language code, for example 'en', 'ko'.
|
28
|
+
*/
|
29
|
+
lng: string
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Flag to indicate if the IP is unsafe, can be undefined.
|
33
|
+
*/
|
34
|
+
unsafeIP: boolean | undefined
|
35
|
+
|
36
|
+
/**
|
37
|
+
* List of prohibited privileges, can be undefined.
|
38
|
+
*/
|
39
|
+
prohibitedPrivileges: { category: string; privilege: string }[] | undefined
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Logger for logging purposes.
|
43
|
+
*/
|
44
|
+
logger: any
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Function to publish events or messages.
|
48
|
+
*/
|
49
|
+
publish: Function
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Function to load resources or data.
|
53
|
+
*/
|
54
|
+
load: Function
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Current status of the scenario instance.
|
58
|
+
*/
|
59
|
+
state: ScenarioInstanceStatus
|
60
|
+
|
61
|
+
/**
|
62
|
+
* General data storage object.
|
63
|
+
*/
|
64
|
+
data: any
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Variables related to the context.
|
68
|
+
*/
|
69
|
+
variables: Object
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Local GraphQL client object.
|
73
|
+
*/
|
74
|
+
client: any /* graphql local client */
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Root object, can be used for various purposes.
|
78
|
+
*/
|
79
|
+
root?: ScenarioInstance
|
80
|
+
|
81
|
+
/**
|
82
|
+
* Array of function closures.
|
83
|
+
*/
|
84
|
+
closures: Function[]
|
85
|
+
|
86
|
+
/**
|
87
|
+
* Function to check the state.
|
88
|
+
*/
|
89
|
+
checkState: Function
|
90
|
+
|
91
|
+
/**
|
92
|
+
* MQTT subscriber context object.
|
93
|
+
*/
|
94
|
+
__mqtt_subscriber?: any
|
95
|
+
|
96
|
+
/**
|
97
|
+
* socket listener context object.
|
98
|
+
*/
|
99
|
+
__socket_listener?: any
|
100
|
+
|
101
|
+
/**
|
102
|
+
* csv readline context object.
|
103
|
+
*/
|
104
|
+
__csv_resources?: any
|
105
|
+
}
|
106
|
+
|
107
|
+
export type TaskHandler = (
|
108
|
+
step: Step,
|
109
|
+
context: Context
|
110
|
+
) => Promise<{
|
111
|
+
next?: string
|
112
|
+
state?: ScenarioInstanceStatus
|
113
|
+
data?: any
|
114
|
+
}>
|
package/server/index.ts
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
export * from './migrations'
|
2
|
+
export * from './engine'
|
3
|
+
export * from './controllers'
|
4
|
+
export * from './service'
|
5
|
+
|
6
|
+
import './routes'
|
7
|
+
import './restful' /* APIs */
|
8
|
+
|
9
|
+
import { ConnectionManager, ScenarioEngine } from './engine'
|
10
|
+
|
11
|
+
process.on('bootstrap-module-start' as any, async ({ app, config, client }: any) => {
|
12
|
+
try {
|
13
|
+
await ConnectionManager.ready()
|
14
|
+
await ScenarioEngine.loadAll()
|
15
|
+
|
16
|
+
console.log('Scenario Engine has just started.')
|
17
|
+
} catch (ex) {
|
18
|
+
ConnectionManager.logger.error('Just has failed to start Scenario Engine.', ex)
|
19
|
+
}
|
20
|
+
})
|
@@ -0,0 +1,9 @@
|
|
1
|
+
const glob = require('glob')
|
2
|
+
const path = require('path')
|
3
|
+
|
4
|
+
export var migrations = []
|
5
|
+
|
6
|
+
glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
|
7
|
+
if (file.indexOf('index.js') !== -1) return
|
8
|
+
migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
|
9
|
+
})
|
@@ -0,0 +1 @@
|
|
1
|
+
import './unstable'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
|
3
|
+
import { restfulApiRouter as router } from '@things-factory/api'
|
4
|
+
|
5
|
+
const debug = require('debug')('things-factory:integration-base:restful:unstable:run-scenario')
|
6
|
+
|
7
|
+
router.post('/unstable/run-scenario/:scenarioName', async (context, next) => {
|
8
|
+
const { client } = context.state
|
9
|
+
const { scenarioName } = context.params
|
10
|
+
const body = context.request.body || {}
|
11
|
+
let { instanceName = '', variables = {} } = body
|
12
|
+
|
13
|
+
if (Object.keys(variables).length === 0) {
|
14
|
+
variables = body
|
15
|
+
}
|
16
|
+
|
17
|
+
debug('post:/unstable/run-scenario/:scenarioName', scenarioName)
|
18
|
+
let response = await client.mutate({
|
19
|
+
mutation: gql`
|
20
|
+
mutation ($instanceName: String, $scenarioName: String!, $variables: Object) {
|
21
|
+
runScenario(instanceName: $instanceName, scenarioName: $scenarioName, variables: $variables) {
|
22
|
+
instanceName
|
23
|
+
scenarioName
|
24
|
+
data
|
25
|
+
result
|
26
|
+
message
|
27
|
+
timestamp
|
28
|
+
}
|
29
|
+
}
|
30
|
+
`,
|
31
|
+
variables: {
|
32
|
+
instanceName,
|
33
|
+
scenarioName,
|
34
|
+
variables
|
35
|
+
},
|
36
|
+
context
|
37
|
+
})
|
38
|
+
|
39
|
+
const { errors, data } = response
|
40
|
+
|
41
|
+
if (!data) {
|
42
|
+
context.status = 500
|
43
|
+
context.body = errors
|
44
|
+
|
45
|
+
return
|
46
|
+
}
|
47
|
+
|
48
|
+
const { result } = data.runScenario
|
49
|
+
|
50
|
+
context.body = result
|
51
|
+
})
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
import { restfulApiRouter as router } from '@things-factory/api'
|
3
|
+
|
4
|
+
const debug = require('debug')('things-factory:integration-base:restful:unstable:scenario-instance')
|
5
|
+
|
6
|
+
router.get('/unstable/scenario-instance/:instanceName', async (context, next) => {
|
7
|
+
const { client } = context.state
|
8
|
+
const { instanceName } = context.params
|
9
|
+
|
10
|
+
debug('get:/unstable/scenario-instance/:instanceName', context.params)
|
11
|
+
|
12
|
+
context.body = await client.query({
|
13
|
+
query: gql`
|
14
|
+
query($instanceName: String!) {
|
15
|
+
scenarioInstance(instanceName: $instanceName) {
|
16
|
+
root {
|
17
|
+
instanceName
|
18
|
+
scenarioName
|
19
|
+
state
|
20
|
+
progress {
|
21
|
+
rounds
|
22
|
+
rate
|
23
|
+
steps
|
24
|
+
step
|
25
|
+
}
|
26
|
+
variables
|
27
|
+
data
|
28
|
+
message
|
29
|
+
timestamp
|
30
|
+
}
|
31
|
+
instanceName
|
32
|
+
scenarioName
|
33
|
+
state
|
34
|
+
progress {
|
35
|
+
rounds
|
36
|
+
rate
|
37
|
+
steps
|
38
|
+
step
|
39
|
+
}
|
40
|
+
variables
|
41
|
+
data
|
42
|
+
message
|
43
|
+
timestamp
|
44
|
+
}
|
45
|
+
}
|
46
|
+
`,
|
47
|
+
variables: {
|
48
|
+
instanceName
|
49
|
+
},
|
50
|
+
context
|
51
|
+
})
|
52
|
+
})
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
import { restfulApiRouter as router } from '@things-factory/api'
|
3
|
+
|
4
|
+
const debug = require('debug')('things-factory:integration-base:restful:unstable:scenario-instances')
|
5
|
+
|
6
|
+
function FPSparams(query) {
|
7
|
+
var { page, limit } = query
|
8
|
+
|
9
|
+
var filters = []
|
10
|
+
var sortings = []
|
11
|
+
|
12
|
+
page = parseInt(page)
|
13
|
+
limit = parseInt(limit)
|
14
|
+
|
15
|
+
var pagination = {
|
16
|
+
page: isNaN(page) ? 0 : page,
|
17
|
+
limit: isNaN(limit) ? 100 : limit
|
18
|
+
}
|
19
|
+
|
20
|
+
return {
|
21
|
+
filters,
|
22
|
+
sortings,
|
23
|
+
pagination
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
router.get('/unstable/scenario-instances', async (context, next) => {
|
28
|
+
const { client } = context.state
|
29
|
+
|
30
|
+
var { filters, sortings, pagination } = FPSparams(context.query)
|
31
|
+
|
32
|
+
debug('get:/unstable/scenario-instances', context.params)
|
33
|
+
|
34
|
+
context.body = await client.query({
|
35
|
+
query: gql`
|
36
|
+
query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
|
37
|
+
scenarioInstances(filters: $filters, pagination: $pagination, sortings: $sortings) {
|
38
|
+
items {
|
39
|
+
root {
|
40
|
+
instanceName
|
41
|
+
scenarioName
|
42
|
+
state
|
43
|
+
progress {
|
44
|
+
rounds
|
45
|
+
rate
|
46
|
+
steps
|
47
|
+
step
|
48
|
+
}
|
49
|
+
variables
|
50
|
+
data
|
51
|
+
message
|
52
|
+
timestamp
|
53
|
+
}
|
54
|
+
instanceName
|
55
|
+
scenarioName
|
56
|
+
state
|
57
|
+
progress {
|
58
|
+
rounds
|
59
|
+
rate
|
60
|
+
steps
|
61
|
+
step
|
62
|
+
}
|
63
|
+
variables
|
64
|
+
data
|
65
|
+
message
|
66
|
+
timestamp
|
67
|
+
}
|
68
|
+
|
69
|
+
total
|
70
|
+
}
|
71
|
+
}
|
72
|
+
`,
|
73
|
+
variables: {
|
74
|
+
filters,
|
75
|
+
pagination,
|
76
|
+
sortings
|
77
|
+
},
|
78
|
+
context
|
79
|
+
})
|
80
|
+
})
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import gql from 'graphql-tag'
|
2
|
+
import { restfulApiRouter as router } from '@things-factory/api'
|
3
|
+
|
4
|
+
const debug = require('debug')('things-factory:integration-base:restful:unstable:scenario')
|
5
|
+
|
6
|
+
router.get('/unstable/scenario/:id', async (context, next) => {
|
7
|
+
const { client } = context.state
|
8
|
+
const { id } = context.params
|
9
|
+
|
10
|
+
debug('get:/unstable/scenario/:id', context.params)
|
11
|
+
|
12
|
+
context.body = await client.query({
|
13
|
+
query: gql`
|
14
|
+
query ($id: String!) {
|
15
|
+
scenario(id: $id) {
|
16
|
+
id
|
17
|
+
name
|
18
|
+
description
|
19
|
+
state
|
20
|
+
schedule
|
21
|
+
timezone
|
22
|
+
steps {
|
23
|
+
id
|
24
|
+
name
|
25
|
+
description
|
26
|
+
sequence
|
27
|
+
task
|
28
|
+
skip
|
29
|
+
log
|
30
|
+
connection
|
31
|
+
params
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
`,
|
36
|
+
variables: {
|
37
|
+
id
|
38
|
+
},
|
39
|
+
context
|
40
|
+
})
|
41
|
+
})
|