@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,72 @@
1
+ import net from 'net'
2
+ import PromiseSocket from 'promise-socket'
3
+
4
+ import { Connector } from '../types'
5
+ import { ConnectionManager } from '../connection-manager'
6
+ import { InputConnection } from '../../service/connection/connection-type'
7
+
8
+ export class EchoBack implements Connector {
9
+ async ready(connectionConfigs: InputConnection[]) {
10
+ await Promise.all(connectionConfigs.map(this.connect.bind(this)))
11
+
12
+ ConnectionManager.logger.info('echo-back-servers are ready')
13
+ }
14
+
15
+ async connect(config: InputConnection): Promise<void> {
16
+ var [host = '0.0.0.0', port = 8124] = config.endpoint.split(':')
17
+
18
+ return new Promise((resolve, reject) => {
19
+ var server = net.createServer(socket => {
20
+ socket.on('data', function (data) {
21
+ socket.write(data.toString())
22
+ })
23
+
24
+ socket.on('error', function (err) {
25
+ ConnectionManager.logger.error(err)
26
+ reject(err)
27
+ })
28
+ })
29
+
30
+ server.listen(port, async () => {
31
+ ConnectionManager.logger.info(`Echo-back server listening on ${host}:${port}`)
32
+
33
+ /* default client connection */
34
+ let socket = new net.Socket()
35
+ socket.on('error', console.error)
36
+
37
+ try {
38
+ let promiseSocket = new PromiseSocket(socket)
39
+ await promiseSocket.connect(Number(port), 'localhost')
40
+ promiseSocket['__server__'] = server
41
+
42
+ ConnectionManager.addConnectionInstance(config, promiseSocket)
43
+
44
+ ConnectionManager.logger.info(`echo-back-server connection(${config.name}:${config.endpoint}) is connected`)
45
+
46
+ resolve()
47
+ } catch (err) {
48
+ ConnectionManager.logger.error(
49
+ `echo-back-server connection(${config.name}:${config.endpoint}) is connected.\ncause: ${err}`
50
+ )
51
+ reject(err)
52
+ }
53
+ })
54
+ })
55
+ }
56
+
57
+ async disconnect(connection: InputConnection) {
58
+ let socket = ConnectionManager.removeConnectionInstance(connection)
59
+ var server = socket['__server__']
60
+
61
+ await socket.destroy()
62
+ server && (await server.close())
63
+
64
+ ConnectionManager.logger.info(`echo-back-server connection(${connection.name}) is disconnected`)
65
+ }
66
+
67
+ get parameterSpec() {
68
+ return []
69
+ }
70
+ }
71
+
72
+ ConnectionManager.registerConnector('echo-back-server', new EchoBack())
@@ -0,0 +1,126 @@
1
+ import 'cross-fetch/polyfill'
2
+
3
+ import { ApolloClient, ApolloLink, from, HttpLink, InMemoryCache } from '@apollo/client/core'
4
+ import { onError } from '@apollo/client/link/error'
5
+ import { Oauth2Client } from '@things-factory/oauth2-client'
6
+ import { getRepository } from '@things-factory/shell'
7
+
8
+ import { ConnectionManager } from '../connection-manager'
9
+ import { Connector } from '../types'
10
+ import { InputConnection } from '../../service/connection/connection-type'
11
+
12
+ const defaultOptions: any = {
13
+ watchQuery: {
14
+ fetchPolicy: 'no-cache',
15
+ errorPolicy: 'ignore'
16
+ },
17
+ query: {
18
+ fetchPolicy: 'no-cache', //'network-only'
19
+ errorPolicy: 'all'
20
+ },
21
+ mutate: {
22
+ errorPolicy: 'all'
23
+ }
24
+ }
25
+
26
+ export class GraphqlConnector implements Connector {
27
+ async ready(connectionConfigs: InputConnection[]) {
28
+ await Promise.all(connectionConfigs.map(this.connect.bind(this)))
29
+
30
+ ConnectionManager.logger.info('graphql-connector connections are ready')
31
+ }
32
+
33
+ async connect(connection: InputConnection) {
34
+ const {
35
+ endpoint: uri,
36
+ params: { authClient }
37
+ } = connection
38
+
39
+ const ERROR_HANDLER: any = ({ graphQLErrors, networkError }) => {
40
+ if (graphQLErrors)
41
+ graphQLErrors.map(({ message, locations, path }) => {
42
+ ConnectionManager.logger.error(
43
+ `[GraphQL error] Message: ${message}, Location: ${locations}, Path: ${path}`,
44
+ graphQLErrors
45
+ )
46
+ })
47
+
48
+ if (networkError) {
49
+ ConnectionManager.logger.error(`[Network error - ${networkError.statusCode}]`, networkError)
50
+ }
51
+ }
52
+
53
+ const oauth2Client: Oauth2Client = await getRepository(Oauth2Client).findOneBy({ id: authClient })
54
+
55
+ const authMiddleware = new ApolloLink((operation, forward) => {
56
+ // add the authorization to the headers
57
+ operation.setContext(({ headers = {} }) => ({
58
+ headers: {
59
+ ...headers,
60
+ ...oauth2Client.getAuthHeaders()
61
+ }
62
+ }))
63
+
64
+ return forward(operation)
65
+ })
66
+
67
+ const cache = new InMemoryCache({
68
+ addTypename: false
69
+ })
70
+
71
+ ConnectionManager.addConnectionInstance(
72
+ connection,
73
+ new ApolloClient({
74
+ defaultOptions,
75
+ cache,
76
+ link: from([
77
+ authMiddleware,
78
+ onError(ERROR_HANDLER),
79
+ new HttpLink({
80
+ uri,
81
+ credentials: 'include'
82
+ })
83
+ ])
84
+ })
85
+ )
86
+
87
+ ConnectionManager.logger.info(
88
+ `graphql-connector connection(${connection.name}:${connection.endpoint}) is connected`
89
+ )
90
+ }
91
+
92
+ async disconnect(connection: InputConnection) {
93
+ const client = ConnectionManager.getConnectionInstance(connection)
94
+ client.stop()
95
+ ConnectionManager.removeConnectionInstance(connection)
96
+
97
+ ConnectionManager.logger.info(`graphql-connector connection(${connection.name}) is disconnected`)
98
+ }
99
+
100
+ get parameterSpec() {
101
+ return [
102
+ {
103
+ type: 'entity-selector',
104
+ name: 'authClient',
105
+ label: 'auth-client',
106
+ property: {
107
+ queryName: 'oauth2Clients'
108
+ }
109
+ }
110
+ ]
111
+ }
112
+
113
+ get taskPrefixes() {
114
+ return ['graphql']
115
+ }
116
+
117
+ get description() {
118
+ return 'Graphql Http Connector'
119
+ }
120
+
121
+ get help() {
122
+ return 'integration/connector/graphql-connector'
123
+ }
124
+ }
125
+
126
+ ConnectionManager.registerConnector('graphql-connector', new GraphqlConnector())
@@ -0,0 +1,65 @@
1
+ import { Oauth2Client } from '@things-factory/oauth2-client'
2
+ import { getRepository } from '@things-factory/shell'
3
+
4
+ import { ConnectionManager } from '../connection-manager'
5
+ import { Connector } from '../types'
6
+ import { InputConnection } from '../../service/connection/connection-type'
7
+
8
+ export class HttpConnector implements Connector {
9
+ async ready(connectionConfigs: InputConnection[]) {
10
+ await Promise.all(connectionConfigs.map(this.connect.bind(this)))
11
+
12
+ ConnectionManager.logger.info('http-connector connections are ready')
13
+ }
14
+
15
+ async connect(connection: InputConnection) {
16
+ var { params } = connection
17
+ params.rejectUnauthorized = (params.rejectUnauthorized || 'Y') === 'Y'
18
+
19
+ if (params.authClient) {
20
+ const oauth2Client: Oauth2Client = await getRepository(Oauth2Client).findOneBy({ id: params.authClient })
21
+ var authHeaders = oauth2Client.getAuthHeaders()
22
+ }
23
+
24
+ ConnectionManager.addConnectionInstance(connection, {
25
+ ...connection,
26
+ authHeaders: authHeaders || {},
27
+ params
28
+ })
29
+
30
+ ConnectionManager.logger.info(`http-connector connection(${connection.name}:${connection.endpoint}) is connected`)
31
+ }
32
+
33
+ async disconnect(connection: InputConnection) {
34
+ ConnectionManager.removeConnectionInstance(connection)
35
+
36
+ ConnectionManager.logger.info(`http-connector connection(${connection.name}) is disconnected`)
37
+ }
38
+
39
+ get parameterSpec() {
40
+ return [
41
+ {
42
+ type: 'entity-selector',
43
+ name: 'authClient',
44
+ label: 'auth-client',
45
+ property: {
46
+ queryName: 'oauth2Clients'
47
+ }
48
+ },
49
+ {
50
+ type: 'select',
51
+ name: 'rejectUnauthorized',
52
+ label: 'reject-unauthorized',
53
+ property: {
54
+ options: ['Y', 'N']
55
+ }
56
+ }
57
+ ]
58
+ }
59
+
60
+ get taskPrefixes() {
61
+ return ['http', 'headless-post', 'headless-scrap']
62
+ }
63
+ }
64
+
65
+ ConnectionManager.registerConnector('http-connector', new HttpConnector())
@@ -0,0 +1,12 @@
1
+ import './echo-back-server'
2
+ import './echo-back-connector'
3
+ import './http-connector'
4
+ import './graphql-connector'
5
+ import './sqlite-connector'
6
+ import './postgresql-connector'
7
+ import './mqtt-connector'
8
+ import './mssql-connector'
9
+ import './oracle-connector'
10
+ import './mysql-connector'
11
+ import './socket-server'
12
+ import './operato-connector'
@@ -0,0 +1,78 @@
1
+ import { Connector } from '../types'
2
+ import { ConnectionManager } from '../connection-manager'
3
+ import { InputConnection } from '../../service/connection/connection-type'
4
+
5
+ import mqtt from 'async-mqtt'
6
+
7
+ export class MqttConnector implements Connector {
8
+ async ready(connectionConfigs: InputConnection[]) {
9
+ await Promise.all(connectionConfigs.map(this.connect.bind(this)))
10
+
11
+ ConnectionManager.logger.info('mqtt-connector connections are ready')
12
+ }
13
+
14
+ async connect(connection: InputConnection) {
15
+ const {
16
+ endpoint: uri,
17
+ params: { user, password }
18
+ } = connection
19
+
20
+ try {
21
+ var client = null
22
+ if (user && password) {
23
+ client = await mqtt.connectAsync(uri, { username: user, password: password })
24
+ } else {
25
+ client = await mqtt.connectAsync(uri)
26
+ }
27
+
28
+ if (!client) {
29
+ throw new Error(
30
+ `the initialization of mqtt connector is failed. uri: ${uri}, user: ${user} password: ${password}`
31
+ )
32
+ }
33
+
34
+ ConnectionManager.addConnectionInstance(connection, {
35
+ client,
36
+ connection
37
+ })
38
+
39
+ ConnectionManager.logger.info(`mqtt-connector connection(${connection.name}:${connection.endpoint}) is connected`)
40
+ } catch (err) {
41
+ ConnectionManager.logger.error(
42
+ `mqtt-connector connection(${connection.name}:${connection.endpoint}) is failed.`,
43
+ err
44
+ )
45
+ }
46
+ }
47
+
48
+ async disconnect(connection: InputConnection) {
49
+ const { client } = ConnectionManager.removeConnectionInstance(connection)
50
+
51
+ client && (await client.end())
52
+ }
53
+
54
+ get parameterSpec() {
55
+ return [
56
+ {
57
+ type: 'string',
58
+ name: 'user',
59
+ label: 'user'
60
+ },
61
+ {
62
+ type: 'password',
63
+ name: 'password',
64
+ label: 'password'
65
+ }
66
+ ]
67
+ }
68
+
69
+ get taskPrefixes() {
70
+ return ['mqtt']
71
+ }
72
+
73
+ get help() {
74
+ return 'integration/connector/mqtt-connector'
75
+ }
76
+ }
77
+
78
+ ConnectionManager.registerConnector('mqtt-connector', new MqttConnector())
@@ -0,0 +1,152 @@
1
+ import { logger } from '@things-factory/env'
2
+
3
+ import { ConnectionManager } from '../connection-manager'
4
+ import { Connector } from '../types'
5
+ import { InputConnection } from '../../service/connection/connection-type'
6
+
7
+ try {
8
+ var mssql = require('mssql')
9
+ } catch (err) {
10
+ logger.error('mssql module loading failed', err)
11
+ }
12
+
13
+ export class MssqlConnector implements Connector {
14
+ async ready(connectionConfigs: InputConnection[]) {
15
+ await Promise.all(connectionConfigs.map(this.connect))
16
+
17
+ ConnectionManager.logger.info('mssql-connector connections are ready')
18
+ }
19
+
20
+ async connect(connection: InputConnection) {
21
+ const {
22
+ endpoint,
23
+ params: { user, password, database, poolMin = 0, poolMax = 4, encrypt = 'Y', trustServerCertificate }
24
+ } = connection
25
+
26
+ const [host, port = 1433] = endpoint.split(':')
27
+
28
+ if (!mssql) {
29
+ throw new Error('mssql module loading failed')
30
+ }
31
+
32
+ const pool = await mssql.connect({
33
+ user,
34
+ password,
35
+ server: host,
36
+ port: Number(port),
37
+ database,
38
+ pool: {
39
+ max: Math.max(2, poolMax),
40
+ min: Math.max(0, poolMin),
41
+ idleTimeoutMillis: 30000
42
+ },
43
+ options: {
44
+ encrypt: encrypt === 'Y',
45
+ trustServerCertificate: trustServerCertificate === 'Y'
46
+ }
47
+ })
48
+
49
+ ConnectionManager.addConnectionInstance(connection, {
50
+ query: async (query, params) => {
51
+ var result = await pool.request().query(query)
52
+ return result.recordset
53
+ },
54
+ execute: async (procedure, params) => {
55
+ let request = pool.request()
56
+
57
+ Object.keys(params).forEach(key => {
58
+ let { dir, type, val } = params[key]
59
+
60
+ if (dir === 'in' || dir === 'inout') {
61
+ request.input(key, type, val)
62
+ } else if (dir === 'out') {
63
+ request.output(key, type)
64
+ } else {
65
+ console.error(`Invalid parameter direction(${dir}) for mssql stored procedure`)
66
+ }
67
+ })
68
+
69
+ var result = await request.execute(procedure)
70
+ return result
71
+ },
72
+ close: () => {
73
+ pool.close()
74
+ }
75
+ })
76
+
77
+ ConnectionManager.logger.info(`MSSql Database(${connection.name}:${database}) at ${endpoint} connected.`)
78
+ }
79
+
80
+ async disconnect(connection: InputConnection) {
81
+ var client = ConnectionManager.getConnectionInstance(connection)
82
+ try {
83
+ await client.close()
84
+ ConnectionManager.logger.info(`MSSql Database(${connection.name}) closed.`)
85
+ } catch (e) {
86
+ ConnectionManager.logger.error(e)
87
+ }
88
+
89
+ ConnectionManager.removeConnectionInstance(connection)
90
+ }
91
+
92
+ get parameterSpec() {
93
+ return [
94
+ {
95
+ type: 'string',
96
+ name: 'user',
97
+ label: 'user'
98
+ },
99
+ {
100
+ type: 'password',
101
+ name: 'password',
102
+ label: 'password'
103
+ },
104
+ {
105
+ type: 'string',
106
+ name: 'database',
107
+ placeholder: 'SID',
108
+ label: 'database'
109
+ },
110
+ {
111
+ type: 'select',
112
+ name: 'encrypt',
113
+ label: 'encrypt',
114
+ property: {
115
+ options: ['Y', 'N']
116
+ }
117
+ },
118
+ {
119
+ type: 'number',
120
+ name: 'poolMin',
121
+ placeholder: 'minimum connection-pool size',
122
+ label: 'pool-min',
123
+ value: 0
124
+ },
125
+ {
126
+ type: 'number',
127
+ name: 'poolMax',
128
+ placeholder: 'maximum connection-pool size',
129
+ label: 'pool-max',
130
+ value: 4
131
+ },
132
+ {
133
+ type: 'select',
134
+ name: 'trustServerCertificate',
135
+ label: 'trust-server-certificate',
136
+ property: {
137
+ options: ['Y', 'N']
138
+ }
139
+ }
140
+ ]
141
+ }
142
+
143
+ get taskPrefixes() {
144
+ return ['database', 'mssql']
145
+ }
146
+
147
+ get help() {
148
+ return 'integration/connector/mssql-connector'
149
+ }
150
+ }
151
+
152
+ ConnectionManager.registerConnector('mssql-connector', new MssqlConnector())
@@ -0,0 +1,94 @@
1
+ import Mysql from "mysql2/promise";
2
+
3
+ import { Connector } from '../types'
4
+ import { ConnectionManager } from '../connection-manager'
5
+ import { InputConnection } from '../../service/connection/connection-type'
6
+
7
+ export class mysqlConnector implements Connector {
8
+ async ready(connectionConfigs: InputConnection[]) {
9
+ await Promise.all(connectionConfigs.map(this.connect));
10
+ ConnectionManager.logger.info("mysql-connector connections are ready");
11
+ }
12
+
13
+ async connect(connection: InputConnection) {
14
+ const {
15
+ endpoint,
16
+ params: { user, password, database },
17
+ } = connection;
18
+
19
+ let [host, port = '3306'] = endpoint.split(":");
20
+
21
+ if (!Mysql) {
22
+ throw new Error("mysql module loading failed");
23
+ }
24
+
25
+ let pool = await Mysql.createPool({
26
+ user,
27
+ password,
28
+ host,
29
+ port: Number(port),
30
+ database,
31
+ });
32
+
33
+ const client = await pool.getConnection();
34
+ ConnectionManager.addConnectionInstance(connection, {
35
+ query: async (query, params) => {
36
+ var result;
37
+ try {
38
+ const results = await client.query(query);
39
+ if (results && results.length > 0) {
40
+ result = results[0];
41
+ }
42
+ } catch (e) {
43
+ ConnectionManager.logger.error(e);
44
+ }
45
+ return result;
46
+ },
47
+ close: client.end(),
48
+ });
49
+
50
+ ConnectionManager.logger.info(
51
+ `mysql Database(${connection.name}:${database}) at ${endpoint} connected.`
52
+ );
53
+ }
54
+
55
+ async disconnect(connection: InputConnection) {
56
+ var client = ConnectionManager.getConnectionInstance(connection);
57
+ try {
58
+ await client.close();
59
+ ConnectionManager.logger.info(
60
+ `mysql Database(${connection.name}) closed.`
61
+ );
62
+ } catch (e) {
63
+ ConnectionManager.logger.error(e);
64
+ }
65
+
66
+ ConnectionManager.removeConnectionInstance(connection);
67
+ }
68
+
69
+ get parameterSpec() {
70
+ return [
71
+ {
72
+ type: "string",
73
+ name: "user",
74
+ label: "user",
75
+ },
76
+ {
77
+ type: "password",
78
+ name: "password",
79
+ label: "password",
80
+ },
81
+ {
82
+ type: "string",
83
+ name: "database",
84
+ label: "database",
85
+ },
86
+ ];
87
+ }
88
+
89
+ get taskPrefixes() {
90
+ return ["database"];
91
+ }
92
+ }
93
+
94
+ ConnectionManager.registerConnector("mysql-connector", new mysqlConnector());