@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.
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,117 @@
1
+ import fetch from 'node-fetch'
2
+ import 'ses'
3
+ import { URL } from 'url'
4
+ import https from 'https'
5
+ import { TaskRegistry } from '../task-registry'
6
+ import { ConnectionManager } from '../connection-manager'
7
+ import { substitute } from './utils/substitute'
8
+ import { InputStep } from '../../service/step/step-type'
9
+ import { Context } from '../types'
10
+
11
+ async function HttpGet(step: InputStep, { logger, data, domain, user, variables, lng }: Context) {
12
+ var { connection: connectionName, params: stepOptions } = step
13
+ var { headers: requestHeaders, searchParams = {}, path } = stepOptions || {}
14
+ var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
15
+
16
+ if (!connection) {
17
+ throw new Error(`connection '${connectionName}' is not established.`)
18
+ }
19
+
20
+ var { endpoint, params: connectionParams, authHeaders = {} } = connection
21
+
22
+ const compartment = new Compartment({
23
+ domain,
24
+ user,
25
+ lng,
26
+ data,
27
+ variables,
28
+ console
29
+ })
30
+
31
+ let evalPath
32
+ try {
33
+ evalPath = compartment.evaluate('`' + path + '`')
34
+ } catch (err) {
35
+ throw new Error(`Failed to evaluate path: ${err.message}`)
36
+ }
37
+
38
+ path = evalPath
39
+
40
+ requestHeaders =
41
+ requestHeaders &&
42
+ Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
43
+ try {
44
+ sum[key] = compartment.evaluate('`' + value + '`')
45
+ } catch (err) {
46
+ throw new Error(`Failed to evaluate header value: ${err.message}`)
47
+ }
48
+ return sum
49
+ }, {})
50
+
51
+ searchParams =
52
+ searchParams &&
53
+ Object.entries(searchParams as { [key: string]: string }).reduce((sum, [key, value]) => {
54
+ try {
55
+ sum[key] = compartment.evaluate('`' + value + '`')
56
+ } catch (err) {
57
+ throw new Error(`Failed to evaluate search param value: ${err.message}`)
58
+ }
59
+ return sum
60
+ }, {})
61
+
62
+ var url = new URL(path, endpoint)
63
+ if (searchParams) {
64
+ Object.keys(searchParams).forEach(key => {
65
+ let value = substitute(searchParams[key], data)
66
+ url.searchParams.append(key, value)
67
+ })
68
+ }
69
+
70
+ var fetchOptions: any = {
71
+ method: 'GET',
72
+ headers: {
73
+ ...requestHeaders,
74
+ ...authHeaders
75
+ }
76
+ }
77
+
78
+ var { rejectUnauthorized } = connectionParams
79
+
80
+ if (!rejectUnauthorized) {
81
+ const httpsAgent = new https.Agent({
82
+ rejectUnauthorized
83
+ })
84
+ fetchOptions.agent = httpsAgent
85
+ }
86
+
87
+ var response = await fetch(url, fetchOptions)
88
+
89
+ return {
90
+ data:
91
+ response.ok && response.headers.get('content-type').includes('application/json')
92
+ ? await response.json()
93
+ : await response.text()
94
+ }
95
+ }
96
+
97
+ HttpGet.parameterSpec = [
98
+ {
99
+ type: 'string',
100
+ name: 'path',
101
+ label: 'path'
102
+ },
103
+ {
104
+ type: 'http-headers',
105
+ name: 'headers',
106
+ label: 'headers'
107
+ },
108
+ {
109
+ type: 'http-parameters',
110
+ name: 'searchParams',
111
+ label: 'search-params'
112
+ }
113
+ ]
114
+
115
+ HttpGet.help = 'integration/task/http-get'
116
+
117
+ TaskRegistry.registerTaskHandler('http-get', HttpGet)
@@ -0,0 +1,148 @@
1
+ import fetch from 'node-fetch'
2
+ import { URL } from 'url'
3
+ import 'ses'
4
+ import { access } from '@things-factory/utils'
5
+ import { TaskRegistry } from '../task-registry'
6
+ import { ConnectionManager } from '../connection-manager'
7
+ import https from 'https'
8
+ import { InputStep } from '../../service/step/step-type'
9
+ import { Context } from '../types'
10
+
11
+ async function HttpPost(step: InputStep, { logger, data, domain, user, variables, lng }: Context) {
12
+ var { connection: connectionName, params: stepOptions } = step
13
+ var { headers: requestHeaders, contentType, path, accessor } = stepOptions || {}
14
+
15
+ var connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
16
+
17
+ if (!connection) {
18
+ throw new Error(`connection '${connectionName}' is not established.`)
19
+ }
20
+
21
+ var { endpoint, params: connectionParams, authHeaders = {} } = connection
22
+
23
+ const compartment = new Compartment({
24
+ domain,
25
+ user,
26
+ lng,
27
+ data,
28
+ variables,
29
+ console
30
+ })
31
+
32
+ let evalPath
33
+ try {
34
+ evalPath = compartment.evaluate('`' + path + '`')
35
+ } catch (err) {
36
+ throw new Error(`Failed to evaluate path: ${err.message}`)
37
+ }
38
+
39
+ path = evalPath
40
+
41
+ requestHeaders =
42
+ requestHeaders &&
43
+ Object.entries(requestHeaders as { [key: string]: string }).reduce((sum, [key, value]) => {
44
+ try {
45
+ sum[key] = compartment.evaluate('`' + value + '`')
46
+ } catch (err) {
47
+ throw new Error(`Failed to evaluate header value: ${err.message}`)
48
+ }
49
+ return sum
50
+ }, {})
51
+
52
+ var url = new URL(path, endpoint)
53
+ var headers = {
54
+ ...authHeaders,
55
+ ...requestHeaders
56
+ }
57
+
58
+ var body = access(accessor, data)
59
+ if (contentType && body) {
60
+ headers['content-type'] = contentType
61
+ switch (contentType) {
62
+ case 'text/plain':
63
+ body = JSON.stringify(body)
64
+ break
65
+ case 'application/json':
66
+ body = JSON.stringify(body)
67
+ break
68
+ case 'application/x-www-form-urlencoded':
69
+ const searchParams = new URLSearchParams()
70
+ for (const prop in body) {
71
+ searchParams.set(prop, body[prop])
72
+ }
73
+ body = searchParams
74
+ break
75
+ }
76
+ }
77
+
78
+ var fetchOptions: any = {
79
+ method: 'POST',
80
+ headers,
81
+ body
82
+ }
83
+
84
+ var { rejectUnauthorized } = connectionParams
85
+
86
+ if (!rejectUnauthorized) {
87
+ const httpsAgent = new https.Agent({
88
+ rejectUnauthorized
89
+ })
90
+ fetchOptions.agent = httpsAgent
91
+ }
92
+
93
+ var response = await fetch(url, fetchOptions)
94
+
95
+ return {
96
+ data:
97
+ response.ok && response.headers.get('content-type').includes('application/json')
98
+ ? await response.json()
99
+ : await response.text()
100
+ }
101
+ }
102
+
103
+ HttpPost.parameterSpec = [
104
+ {
105
+ type: 'string',
106
+ name: 'path',
107
+ label: 'path'
108
+ },
109
+ {
110
+ type: 'http-headers',
111
+ name: 'headers',
112
+ label: 'headers'
113
+ },
114
+ {
115
+ type: 'select',
116
+ name: 'contentType',
117
+ label: 'content-type',
118
+ property: {
119
+ options: [
120
+ {
121
+ display: '',
122
+ value: ''
123
+ },
124
+ {
125
+ display: 'application/json',
126
+ value: 'application/json'
127
+ },
128
+ {
129
+ display: 'text/plain',
130
+ value: 'text/plain'
131
+ },
132
+ {
133
+ display: 'application/x-www-form-urlencoded',
134
+ value: 'application/x-www-form-urlencoded'
135
+ }
136
+ ]
137
+ }
138
+ },
139
+ {
140
+ type: 'scenario-step-input',
141
+ name: 'accessor',
142
+ label: 'accessor'
143
+ }
144
+ ]
145
+
146
+ HttpPost.help = 'integration/task/http-post'
147
+
148
+ TaskRegistry.registerTaskHandler('http-post', HttpPost)
@@ -0,0 +1,45 @@
1
+ import './echo-send'
2
+ import './echo-receive'
3
+ import './sleep'
4
+ import './log'
5
+ import './publish'
6
+ import './http-get'
7
+ import './http-post'
8
+ import './graphql-query'
9
+ import './graphql-mutate'
10
+ import './local-graphql-query'
11
+ import './local-graphql-mutate'
12
+ import './sub-scenario'
13
+ import './stop-scenario'
14
+ import './book-up-scenario'
15
+ import './pick-pending-scenario'
16
+ import './reset-pending-queue'
17
+ import './empty-check'
18
+ import './goto'
19
+ import './end'
20
+ import './switch-goto'
21
+ import './switch-range-goto'
22
+ import './switch-scenario'
23
+ import './switch-range-scenario'
24
+ import './switch-set'
25
+ import './switch-range-set'
26
+ import './script'
27
+ import './database-query'
28
+ import './mqtt-subscribe'
29
+ import './mqtt-publish'
30
+ import './throw'
31
+ import './variables'
32
+ import './floating-point'
33
+ import './socket-listener'
34
+ import './random'
35
+ import './csv-readline'
36
+ import './data-mapper'
37
+ import './headless-post'
38
+ import './headless-scrap'
39
+ import './set-domain'
40
+ import './mssql-procedure'
41
+ import './oracle-procedure'
42
+ import './jsonata'
43
+ import './state-read'
44
+ import './state-write'
45
+ import './state-group-read'
@@ -0,0 +1,45 @@
1
+ import jsonata from 'jsonata'
2
+
3
+ import { TaskRegistry } from '../task-registry'
4
+ import { InputStep } from '../../service/step/step-type'
5
+ import { Context } from '../types'
6
+
7
+ async function JSonata(step: InputStep, context: Context) {
8
+ var {
9
+ params: { expression }
10
+ } = step
11
+
12
+ const { domain, user, data, variables, lng, logger } = context
13
+
14
+ var result = jsonata(expression).evaluate({
15
+ domain,
16
+ user,
17
+ lng,
18
+ data,
19
+ variables
20
+ })
21
+
22
+ return {
23
+ data: result
24
+ }
25
+ }
26
+
27
+ JSonata.parameterSpec = [
28
+ {
29
+ type: 'textarea',
30
+ name: 'expression',
31
+ label: 'jsonata-expression',
32
+ property: {
33
+ language: 'javascript',
34
+ showLineNumbers: true
35
+ },
36
+ styles: {
37
+ flex: '1'
38
+ }
39
+ }
40
+ ]
41
+
42
+ JSonata.connectorFree = true
43
+ JSonata.help = 'integration/task/jsonata'
44
+
45
+ TaskRegistry.registerTaskHandler('jsonata', JSonata)
@@ -0,0 +1,100 @@
1
+ import gql from 'graphql-tag'
2
+ import 'ses'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { getRepository } from '@things-factory/shell'
6
+ import { access } from '@things-factory/utils'
7
+
8
+ import { TaskRegistry } from '../task-registry'
9
+ import { InputStep } from '../../service/step/step-type'
10
+ import { Context } from '../types'
11
+
12
+ async function LocalGraphqlMutate(step: InputStep, context: Context) {
13
+ var { params, updaterId } = step
14
+ var { mutation, variables: variablesAccessorMap, headers } = params || {}
15
+ var { logger, client, domain, user, data, variables, lng } = context
16
+
17
+ user =
18
+ user ||
19
+ (await getRepository(User).findOne({
20
+ where: { id: updaterId },
21
+ relations: ['domains']
22
+ }))
23
+
24
+ const compartment = new Compartment({
25
+ domain,
26
+ user,
27
+ lng,
28
+ data,
29
+ variables,
30
+ console
31
+ })
32
+
33
+ let evalMutation
34
+ try {
35
+ evalMutation = compartment.evaluate('`' + mutation + '`')
36
+ } catch (err) {
37
+ throw new Error(`Failed to evaluate mutation: ${err.message}`)
38
+ }
39
+
40
+ mutation = evalMutation
41
+
42
+ const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
43
+ const accessor = variablesAccessorMap[key]
44
+ variables[key] = access(accessor, data)
45
+ return variables
46
+ }, {})
47
+
48
+ var { data: mutateResult, errors } = await client.mutate({
49
+ mutation: gql`
50
+ ${mutation}
51
+ `,
52
+ variables: queryVariables,
53
+ headers,
54
+ context: {
55
+ state: {
56
+ domain,
57
+ user
58
+ }
59
+ }
60
+ })
61
+
62
+ if (errors) {
63
+ errors.forEach(error => {
64
+ logger.error('GraphQL Error: %s', error)
65
+ })
66
+ }
67
+
68
+ return {
69
+ data: mutateResult
70
+ }
71
+ }
72
+
73
+ LocalGraphqlMutate.parameterSpec = [
74
+ {
75
+ type: 'graphql',
76
+ name: 'mutation',
77
+ label: 'mutation',
78
+ property: {
79
+ showLineNumbers: true
80
+ },
81
+ styles: {
82
+ flex: 1
83
+ }
84
+ },
85
+ {
86
+ type: 'key-values',
87
+ name: 'variables',
88
+ label: 'variables'
89
+ },
90
+ {
91
+ type: 'key-values',
92
+ name: 'headers',
93
+ label: 'headers'
94
+ }
95
+ ]
96
+
97
+ LocalGraphqlMutate.connectorFree = true
98
+ LocalGraphqlMutate.help = 'integration/task/local-graphql-mutate'
99
+
100
+ TaskRegistry.registerTaskHandler('local-graphql-mutate', LocalGraphqlMutate)
@@ -0,0 +1,100 @@
1
+ import gql from 'graphql-tag'
2
+ import 'ses'
3
+
4
+ import { User } from '@things-factory/auth-base'
5
+ import { getRepository } from '@things-factory/shell'
6
+ import { access } from '@things-factory/utils'
7
+
8
+ import { TaskRegistry } from '../task-registry'
9
+ import { InputStep } from '../../service/step/step-type'
10
+ import { Context } from '../types'
11
+
12
+ async function LocalGraphqlQuery(step: InputStep, context: Context) {
13
+ var { params, updaterId } = step
14
+ var { query, variables: variablesAccessorMap, headers } = params || {}
15
+ var { logger, client, domain, user, data, variables, lng } = context
16
+
17
+ user =
18
+ user ||
19
+ (await getRepository(User).findOne({
20
+ where: { id: updaterId },
21
+ relations: ['domains']
22
+ }))
23
+
24
+ const compartment = new Compartment({
25
+ domain,
26
+ user,
27
+ lng,
28
+ data,
29
+ variables,
30
+ console
31
+ })
32
+
33
+ let evalQuery
34
+ try {
35
+ evalQuery = compartment.evaluate('`' + query + '`')
36
+ } catch (err) {
37
+ throw new Error(`Failed to evaluate query: ${err.message}`)
38
+ }
39
+
40
+ query = evalQuery
41
+
42
+ const queryVariables = Object.keys(variablesAccessorMap || {}).reduce((variables, key) => {
43
+ const accessor = variablesAccessorMap[key]
44
+ variables[key] = access(accessor, data)
45
+ return variables
46
+ }, {})
47
+
48
+ var { data: queryResult, errors } = await client.query({
49
+ query: gql`
50
+ ${query}
51
+ `,
52
+ variables: queryVariables,
53
+ headers,
54
+ context: {
55
+ state: {
56
+ domain,
57
+ user
58
+ }
59
+ }
60
+ })
61
+
62
+ if (errors) {
63
+ errors.forEach(error => {
64
+ logger.error('GraphQL Error: %s', error)
65
+ })
66
+ }
67
+
68
+ return {
69
+ data: queryResult
70
+ }
71
+ }
72
+
73
+ LocalGraphqlQuery.parameterSpec = [
74
+ {
75
+ type: 'graphql',
76
+ name: 'query',
77
+ label: 'query',
78
+ property: {
79
+ showLineNumbers: true
80
+ },
81
+ styles: {
82
+ flex: 1
83
+ }
84
+ },
85
+ {
86
+ type: 'key-values',
87
+ name: 'variables',
88
+ label: 'variables'
89
+ },
90
+ {
91
+ type: 'key-values',
92
+ name: 'headers',
93
+ label: 'headers'
94
+ }
95
+ ]
96
+
97
+ LocalGraphqlQuery.connectorFree = true
98
+ LocalGraphqlQuery.help = 'integration/task/local-graphql-query'
99
+
100
+ TaskRegistry.registerTaskHandler('local-graphql-query', LocalGraphqlQuery)
@@ -0,0 +1,78 @@
1
+ import { access, hasTemplateExpression } from '@things-factory/utils'
2
+ import 'ses'
3
+ import { TaskRegistry } from '../task-registry'
4
+ import { InputStep } from '../../service/step/step-type'
5
+ import { Context } from '../types'
6
+
7
+ async function Log(step: InputStep, { logger, data, variables, domain, user, lng }: Context) {
8
+ var {
9
+ params: { message, accessor, level = 'info' }
10
+ } = step
11
+
12
+ if (hasTemplateExpression(message)) {
13
+ const compartment = new Compartment({
14
+ domain,
15
+ user,
16
+ lng,
17
+ data,
18
+ variables,
19
+ console
20
+ })
21
+
22
+ try {
23
+ message = compartment.evaluate('`' + message + '`')
24
+ } catch (err) {
25
+ throw new Error(`Failed to evaluate message: ${err.message}`)
26
+ }
27
+ }
28
+
29
+ accessor = access(accessor, data)
30
+
31
+ if (accessor) {
32
+ if (typeof accessor !== 'string') {
33
+ accessor = JSON.stringify(accessor, null, 2)
34
+ }
35
+ message += ': ' + accessor
36
+ }
37
+
38
+ switch (level) {
39
+ case 'error':
40
+ logger.error(message)
41
+ return
42
+ case 'warn':
43
+ logger.warn(message)
44
+ return
45
+ default:
46
+ logger.info(message)
47
+ }
48
+
49
+ return {
50
+ data: message
51
+ }
52
+ }
53
+
54
+ Log.parameterSpec = [
55
+ {
56
+ type: 'string',
57
+ name: 'message',
58
+ label: 'message'
59
+ },
60
+ {
61
+ type: 'scenario-step-input',
62
+ name: 'accessor',
63
+ label: 'accessor'
64
+ },
65
+ {
66
+ type: 'select',
67
+ name: 'level',
68
+ label: 'level',
69
+ property: {
70
+ options: ['info', 'warn', 'error']
71
+ }
72
+ }
73
+ ]
74
+
75
+ Log.connectorFree = true
76
+ Log.help = 'integration/task/log'
77
+
78
+ TaskRegistry.registerTaskHandler('log', Log)
@@ -0,0 +1,45 @@
1
+ import { access } 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
+ async function MqttPublish(step: InputStep, { logger, data, domain }: Context) {
8
+ var {
9
+ connection: connectionName,
10
+ params: { topic, accessor }
11
+ } = step
12
+
13
+ const { client } = ConnectionManager.getConnectionInstanceByName(domain, connectionName)
14
+ if (!client) {
15
+ throw Error(`connection is not found : ${connectionName}`)
16
+ }
17
+
18
+ if (!topic || !accessor) {
19
+ throw Error(`topic and accessor should be defined: : topic - '${topic}', accessor - '${accessor}'`)
20
+ }
21
+
22
+ var message = JSON.stringify(access(accessor, data))
23
+ await client.publish(topic, message)
24
+
25
+ return {
26
+ data: message
27
+ }
28
+ }
29
+
30
+ MqttPublish.parameterSpec = [
31
+ {
32
+ type: 'string',
33
+ name: 'topic',
34
+ label: 'topic'
35
+ },
36
+ {
37
+ type: 'scenario-step-input',
38
+ name: 'accessor',
39
+ label: 'accessor'
40
+ }
41
+ ]
42
+
43
+ MqttPublish.help = 'integration/task/mqtt-publish'
44
+
45
+ TaskRegistry.registerTaskHandler('mqtt-publish', MqttPublish)