@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,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());
|