@things-factory/integration-base 8.0.0 → 9.0.0-beta.3
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/headless-connector.d.ts +23 -0
- package/dist-server/engine/connector/headless-connector.js +357 -0
- package/dist-server/engine/connector/headless-connector.js.map +1 -0
- 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 +1 -0
- package/dist-server/engine/connector/index.js +1 -0
- package/dist-server/engine/connector/index.js.map +1 -1
- package/dist-server/engine/index.d.ts +1 -0
- package/dist-server/engine/index.js +1 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/resource-pool/headless-pool.d.ts +1 -0
- package/dist-server/engine/resource-pool/headless-pool.js +62 -0
- package/dist-server/engine/resource-pool/headless-pool.js.map +1 -0
- package/dist-server/engine/resource-pool/index.d.ts +1 -0
- package/dist-server/engine/resource-pool/index.js +5 -0
- package/dist-server/engine/resource-pool/index.js.map +1 -0
- package/dist-server/engine/task/headless-post.js +19 -33
- package/dist-server/engine/task/headless-post.js.map +1 -1
- package/dist-server/engine/task/headless-scrap.js +20 -13
- package/dist-server/engine/task/headless-scrap.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -11
- package/translations/en.json +12 -4
- package/translations/ja.json +12 -4
- package/translations/ko.json +12 -4
- package/translations/ms.json +12 -4
- package/translations/zh.json +12 -4
- package/server/controllers/index.ts +0 -2
- package/server/controllers/publish-data.ts +0 -29
- package/server/controllers/scenario-controller.ts +0 -156
- package/server/engine/analyzer/analyze-integration.ts +0 -115
- package/server/engine/connection-manager.ts +0 -239
- package/server/engine/connector/echo-back-connector.ts +0 -51
- package/server/engine/connector/echo-back-server.ts +0 -72
- package/server/engine/connector/graphql-connector.ts +0 -126
- package/server/engine/connector/http-connector.ts +0 -65
- package/server/engine/connector/index.ts +0 -12
- package/server/engine/connector/mqtt-connector.ts +0 -78
- package/server/engine/connector/mssql-connector.ts +0 -152
- package/server/engine/connector/mysql-connector.ts +0 -94
- package/server/engine/connector/operato-connector.ts +0 -264
- package/server/engine/connector/oracle-connector.ts +0 -218
- package/server/engine/connector/postgresql-connector.ts +0 -152
- package/server/engine/connector/proxy-connector.ts +0 -53
- package/server/engine/connector/socket-server.ts +0 -86
- package/server/engine/connector/sqlite-connector.ts +0 -69
- package/server/engine/edge-client.ts +0 -45
- package/server/engine/index.ts +0 -10
- package/server/engine/pending-queue.ts +0 -97
- package/server/engine/scenario-engine.ts +0 -106
- package/server/engine/task/book-up-scenario.ts +0 -73
- package/server/engine/task/csv-readline.ts +0 -127
- package/server/engine/task/data-accessor.ts +0 -36
- package/server/engine/task/data-mapper.ts +0 -47
- package/server/engine/task/database-query.ts +0 -56
- package/server/engine/task/echo-receive.ts +0 -21
- package/server/engine/task/echo-send.ts +0 -32
- package/server/engine/task/empty-check.ts +0 -38
- package/server/engine/task/end.ts +0 -18
- package/server/engine/task/floating-point.ts +0 -71
- package/server/engine/task/goto.ts +0 -27
- package/server/engine/task/graphql-mutate.ts +0 -79
- package/server/engine/task/graphql-query.ts +0 -78
- package/server/engine/task/headless-post.ts +0 -147
- package/server/engine/task/headless-scrap.ts +0 -80
- package/server/engine/task/http-get.ts +0 -117
- package/server/engine/task/http-post.ts +0 -148
- package/server/engine/task/index.ts +0 -45
- package/server/engine/task/jsonata.ts +0 -45
- package/server/engine/task/local-graphql-mutate.ts +0 -100
- package/server/engine/task/local-graphql-query.ts +0 -100
- package/server/engine/task/log.ts +0 -78
- package/server/engine/task/mqtt-publish.ts +0 -45
- package/server/engine/task/mqtt-subscribe.ts +0 -139
- package/server/engine/task/mssql-procedure.ts +0 -128
- package/server/engine/task/oracle-procedure.ts +0 -124
- package/server/engine/task/pick-pending-scenario.ts +0 -80
- package/server/engine/task/publish.ts +0 -40
- package/server/engine/task/random.ts +0 -53
- package/server/engine/task/reset-pending-queue.ts +0 -17
- package/server/engine/task/script.ts +0 -63
- package/server/engine/task/set-domain.ts +0 -37
- package/server/engine/task/sleep.ts +0 -34
- package/server/engine/task/socket-listener.ts +0 -96
- package/server/engine/task/state-group-read.ts +0 -69
- package/server/engine/task/state-read.ts +0 -56
- package/server/engine/task/state-write.ts +0 -65
- package/server/engine/task/stop-scenario.ts +0 -44
- package/server/engine/task/sub-scenario.ts +0 -57
- package/server/engine/task/switch-goto.ts +0 -43
- package/server/engine/task/switch-range-goto.ts +0 -53
- package/server/engine/task/switch-range-scenario.ts +0 -79
- package/server/engine/task/switch-range-set.ts +0 -48
- package/server/engine/task/switch-scenario.ts +0 -67
- package/server/engine/task/switch-set.ts +0 -37
- package/server/engine/task/throw.ts +0 -27
- package/server/engine/task/utils/headless-pool-for-scenario.ts +0 -71
- package/server/engine/task/utils/substitute.ts +0 -44
- package/server/engine/task/variables.ts +0 -17
- package/server/engine/task-registry.ts +0 -23
- package/server/engine/types.ts +0 -114
- package/server/index.ts +0 -20
- package/server/migrations/index.ts +0 -9
- package/server/restful/index.ts +0 -1
- package/server/restful/unstable/index.ts +0 -7
- package/server/restful/unstable/run-scenario.ts +0 -51
- package/server/restful/unstable/scenario-instance.ts +0 -52
- package/server/restful/unstable/scenario-instances.ts +0 -80
- package/server/restful/unstable/scenario.ts +0 -41
- package/server/restful/unstable/scenarios.ts +0 -69
- package/server/restful/unstable/start-scenario.ts +0 -33
- package/server/restful/unstable/stop-scenario.ts +0 -30
- package/server/routers/scenario-schedule-callback-router.ts +0 -69
- package/server/routers/scenario-view-router.ts +0 -46
- package/server/routes.ts +0 -30
- package/server/service/analysis/analysis-query.ts +0 -13
- package/server/service/analysis/index.ts +0 -3
- package/server/service/connection/connection-mutation.ts +0 -190
- package/server/service/connection/connection-query.ts +0 -87
- package/server/service/connection/connection-subscription.ts +0 -104
- package/server/service/connection/connection-type.ts +0 -288
- package/server/service/connection/index.ts +0 -7
- package/server/service/connector/connector-query.ts +0 -62
- package/server/service/connector/connector-type.ts +0 -29
- package/server/service/connector/index.ts +0 -4
- package/server/service/index.ts +0 -52
- package/server/service/payload-log/index.ts +0 -7
- package/server/service/payload-log/payload-log-mutation.ts +0 -151
- package/server/service/payload-log/payload-log-query.ts +0 -49
- package/server/service/payload-log/payload-log-type.ts +0 -36
- package/server/service/payload-log/payload-log.ts +0 -100
- package/server/service/property-spec.ts +0 -24
- package/server/service/scenario/index.ts +0 -6
- package/server/service/scenario/scenario-mutation.ts +0 -396
- package/server/service/scenario/scenario-query.ts +0 -109
- package/server/service/scenario/scenario-type.ts +0 -78
- package/server/service/scenario/scenario.ts +0 -124
- package/server/service/scenario-flow/scenario-flow.ts +0 -17
- package/server/service/scenario-instance/index.ts +0 -6
- package/server/service/scenario-instance/scenario-instance-mutation.ts +0 -44
- package/server/service/scenario-instance/scenario-instance-query.ts +0 -42
- package/server/service/scenario-instance/scenario-instance-subscription.ts +0 -118
- package/server/service/scenario-instance/scenario-instance-type.ts +0 -563
- package/server/service/scenario-queue/index.ts +0 -4
- package/server/service/scenario-queue/scenario-queue-subscription.ts +0 -55
- package/server/service/scenario-queue/scenario-queue-type.ts +0 -27
- package/server/service/state-register/data-resolver.ts +0 -56
- package/server/service/state-register/index.ts +0 -8
- package/server/service/state-register/state-register-mutation.ts +0 -166
- package/server/service/state-register/state-register-query.ts +0 -80
- package/server/service/state-register/state-register-type.ts +0 -80
- package/server/service/state-register/state-register.ts +0 -113
- package/server/service/step/index.ts +0 -6
- package/server/service/step/step-mutation.ts +0 -52
- package/server/service/step/step-query.ts +0 -55
- package/server/service/step/step-type.ts +0 -215
- package/server/service/task-type/index.ts +0 -4
- package/server/service/task-type/task-type-query.ts +0 -95
- package/server/service/task-type/task-type-type.ts +0 -29
@@ -1,218 +0,0 @@
|
|
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 oracledb = require('oracledb')
|
9
|
-
} catch (err) {
|
10
|
-
logger.error('oracledb module loading failed', err)
|
11
|
-
}
|
12
|
-
|
13
|
-
export class OracleConnector implements Connector {
|
14
|
-
async ready(connectionConfigs: InputConnection[]) {
|
15
|
-
await Promise.all(connectionConfigs.map(this.connect))
|
16
|
-
|
17
|
-
ConnectionManager.logger.info('oracle-connector connections are ready')
|
18
|
-
}
|
19
|
-
|
20
|
-
async recreatePool(connection: InputConnection) {
|
21
|
-
const {
|
22
|
-
name,
|
23
|
-
endpoint,
|
24
|
-
params: { user, password, database, poolMin, poolMax, poolIncrement },
|
25
|
-
domain
|
26
|
-
} = connection
|
27
|
-
|
28
|
-
if (!oracledb) {
|
29
|
-
throw new Error('oracledb module loading failed')
|
30
|
-
}
|
31
|
-
|
32
|
-
const poolAlias = `${domain.name}-${name}`
|
33
|
-
await oracledb.getPool(poolAlias).close(10)
|
34
|
-
await oracledb.createPool({
|
35
|
-
user,
|
36
|
-
password,
|
37
|
-
// when oracle not using default port must add connection string with port like localhost:port
|
38
|
-
connectString: `${endpoint.trim()}/${database}`,
|
39
|
-
poolMin,
|
40
|
-
poolMax,
|
41
|
-
poolIncrement,
|
42
|
-
poolAlias
|
43
|
-
})
|
44
|
-
|
45
|
-
ConnectionManager.logger.info(`Oracle Database(${connection.name}:${database}) at ${endpoint} recreated.`)
|
46
|
-
}
|
47
|
-
|
48
|
-
async connect(connection: InputConnection) {
|
49
|
-
const {
|
50
|
-
name,
|
51
|
-
endpoint,
|
52
|
-
params: { user, password, database, poolMin, poolMax, poolIncrement },
|
53
|
-
domain
|
54
|
-
} = connection
|
55
|
-
|
56
|
-
if (!oracledb) {
|
57
|
-
throw new Error('oracledb module loading failed')
|
58
|
-
}
|
59
|
-
|
60
|
-
const poolAlias = `${domain.name}-${name}`
|
61
|
-
|
62
|
-
var enableStatistics = true
|
63
|
-
const pool = await oracledb.createPool({
|
64
|
-
user,
|
65
|
-
password,
|
66
|
-
// when oracle not using default port must add connection string with port like localhost:port
|
67
|
-
connectString: `${endpoint.trim()}/${database}`,
|
68
|
-
poolMin,
|
69
|
-
poolMax,
|
70
|
-
poolIncrement,
|
71
|
-
poolAlias,
|
72
|
-
enableStatistics
|
73
|
-
})
|
74
|
-
|
75
|
-
ConnectionManager.addConnectionInstance(connection, {
|
76
|
-
query: async (query, params) => {
|
77
|
-
let dbConnection: any = {}
|
78
|
-
let taskResult: any = {}
|
79
|
-
try {
|
80
|
-
dbConnection = await oracledb.getConnection(poolAlias)
|
81
|
-
|
82
|
-
taskResult = (
|
83
|
-
await dbConnection.execute(query, params, {
|
84
|
-
outFormat: oracledb.OBJECT
|
85
|
-
})
|
86
|
-
).rows
|
87
|
-
} catch (e) {
|
88
|
-
if (e.name === 'Error' && e.message.includes('NJS-040')) {
|
89
|
-
await this.recreatePool(connection)
|
90
|
-
}
|
91
|
-
throw e
|
92
|
-
} finally {
|
93
|
-
await dbConnection.close()
|
94
|
-
}
|
95
|
-
return taskResult
|
96
|
-
},
|
97
|
-
execute: async (procedure, params) => {
|
98
|
-
let dbConnection: any = {}
|
99
|
-
let taskResult: any = {}
|
100
|
-
try {
|
101
|
-
// TODO: need to check if this is available when procedure string is a common query.
|
102
|
-
procedure = `BEGIN
|
103
|
-
${procedure}
|
104
|
-
END;`
|
105
|
-
dbConnection = await oracledb.getConnection(poolAlias)
|
106
|
-
|
107
|
-
// console.log('\n************* stat after get ****************')
|
108
|
-
// await oracledb.getPool(poolAlias).logStatistics()
|
109
|
-
|
110
|
-
const result = await dbConnection.execute(procedure, params, {
|
111
|
-
outFormat: oracledb.OBJECT
|
112
|
-
})
|
113
|
-
|
114
|
-
let paramKeys = Object.keys(params)
|
115
|
-
|
116
|
-
for (const paramKey of paramKeys) {
|
117
|
-
if (params[paramKey].dir === oracledb?.BIND_OUT) {
|
118
|
-
if (params[paramKey].type === oracledb?.CURSOR) {
|
119
|
-
const resultSetTemp = result.outBinds[paramKey]
|
120
|
-
taskResult[paramKey] = await resultSetTemp.getRows()
|
121
|
-
await resultSetTemp.close()
|
122
|
-
} else {
|
123
|
-
taskResult[paramKey] = result.outBinds[paramKey]
|
124
|
-
}
|
125
|
-
}
|
126
|
-
}
|
127
|
-
} catch (e) {
|
128
|
-
if (e.name === 'Error' && e.message.includes('NJS-040')) {
|
129
|
-
await this.recreatePool(connection)
|
130
|
-
}
|
131
|
-
throw e
|
132
|
-
} finally {
|
133
|
-
await dbConnection.close()
|
134
|
-
|
135
|
-
// console.log('\n************* stat after close ****************')
|
136
|
-
// await oracledb.getPool(poolAlias).logStatistics()
|
137
|
-
}
|
138
|
-
return taskResult
|
139
|
-
},
|
140
|
-
close: async () => {
|
141
|
-
await oracledb.getPool(poolAlias).close(10)
|
142
|
-
}
|
143
|
-
})
|
144
|
-
|
145
|
-
ConnectionManager.logger.info(`Oracle Database(${connection.name}:${database}) at ${endpoint} connected.`)
|
146
|
-
}
|
147
|
-
|
148
|
-
async disconnect(connection: InputConnection) {
|
149
|
-
var client = ConnectionManager.getConnectionInstance(connection)
|
150
|
-
|
151
|
-
try {
|
152
|
-
await client.close()
|
153
|
-
ConnectionManager.logger.info(`Oracle Database(${connection.name}) closed.`)
|
154
|
-
} catch (e) {
|
155
|
-
ConnectionManager.logger.error(e)
|
156
|
-
}
|
157
|
-
|
158
|
-
ConnectionManager.removeConnectionInstance(connection)
|
159
|
-
}
|
160
|
-
|
161
|
-
get parameterSpec() {
|
162
|
-
return [
|
163
|
-
{
|
164
|
-
type: 'string',
|
165
|
-
name: 'user',
|
166
|
-
label: 'user'
|
167
|
-
},
|
168
|
-
{
|
169
|
-
type: 'password',
|
170
|
-
name: 'password',
|
171
|
-
label: 'password'
|
172
|
-
},
|
173
|
-
{
|
174
|
-
type: 'string',
|
175
|
-
name: 'database',
|
176
|
-
placeholder: 'SID',
|
177
|
-
label: 'database'
|
178
|
-
},
|
179
|
-
{
|
180
|
-
type: 'number',
|
181
|
-
name: 'poolMin',
|
182
|
-
placeholder: 'minimum connection-pool size',
|
183
|
-
label: 'pool-min',
|
184
|
-
value: 0
|
185
|
-
},
|
186
|
-
{
|
187
|
-
type: 'number',
|
188
|
-
name: 'poolMax',
|
189
|
-
placeholder: 'maximum connection-pool size',
|
190
|
-
label: 'pool-max',
|
191
|
-
value: 4
|
192
|
-
},
|
193
|
-
{
|
194
|
-
type: 'number',
|
195
|
-
name: 'poolIncrement',
|
196
|
-
placeholder: 'connection incremental size',
|
197
|
-
label: 'pool-increment',
|
198
|
-
value: 1
|
199
|
-
}
|
200
|
-
]
|
201
|
-
}
|
202
|
-
|
203
|
-
get taskPrefixes() {
|
204
|
-
return ['database', 'oracle']
|
205
|
-
}
|
206
|
-
|
207
|
-
get help() {
|
208
|
-
return 'integration/connector/oracle-connector'
|
209
|
-
}
|
210
|
-
}
|
211
|
-
|
212
|
-
ConnectionManager.registerConnector('oracle-connector', new OracleConnector())
|
213
|
-
|
214
|
-
// need reference:
|
215
|
-
// https://download.oracle.com/otn_software/mac/instantclient/193000/instantclient-basiclite-macos.x64-19.3.0.0.0dbru.zip
|
216
|
-
// https://node-oracledb.readthedocs.io/en/latest/index.html
|
217
|
-
|
218
|
-
// docker pull store/oracle/database-instantclient:12.2.0.1
|
@@ -1,152 +0,0 @@
|
|
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 { Client, Pool } = require('pg')
|
9
|
-
} catch (err) {
|
10
|
-
logger.error('postgresql module loading failed', err)
|
11
|
-
}
|
12
|
-
|
13
|
-
export class PostgresqlConnector implements Connector {
|
14
|
-
async ready(connectionConfigs: InputConnection[]) {
|
15
|
-
await Promise.all(connectionConfigs.map(this.connect.bind(this)))
|
16
|
-
|
17
|
-
ConnectionManager.logger.info('postgresql-connector connections are ready')
|
18
|
-
}
|
19
|
-
|
20
|
-
async connect(connection: InputConnection) {
|
21
|
-
const {
|
22
|
-
endpoint,
|
23
|
-
params: { user, password, database, maxPoolConnection, idleTimeoutMillis, connectionTimeoutMillis }
|
24
|
-
} = connection
|
25
|
-
const [host, port = 5432] = endpoint.split(':')
|
26
|
-
|
27
|
-
if (!Pool) {
|
28
|
-
throw new Error('postgresql module loading failed')
|
29
|
-
}
|
30
|
-
|
31
|
-
// create a new pool
|
32
|
-
const pool = new Pool({
|
33
|
-
user,
|
34
|
-
host,
|
35
|
-
database,
|
36
|
-
password,
|
37
|
-
port: Number(port),
|
38
|
-
max: maxPoolConnection || 10,
|
39
|
-
idleTimeoutMillis: idleTimeoutMillis || 30000,
|
40
|
-
connectionTimeoutMillis: connectionTimeoutMillis || 2000
|
41
|
-
})
|
42
|
-
|
43
|
-
pool.on('error', (err, client) => {
|
44
|
-
logger.error('unexpected error on postgres pool.', err)
|
45
|
-
})
|
46
|
-
|
47
|
-
try {
|
48
|
-
// try to connect to database to check the connection at initial time
|
49
|
-
const entryConnection = await pool.connect().catch(async e => {
|
50
|
-
ConnectionManager.logger.error(e)
|
51
|
-
throw e
|
52
|
-
})
|
53
|
-
entryConnection.release()
|
54
|
-
|
55
|
-
ConnectionManager.addConnectionInstance(connection, {
|
56
|
-
query: async (query, params) => {
|
57
|
-
try {
|
58
|
-
// get a connection from the pool
|
59
|
-
var client = await pool.connect().catch(async e => {
|
60
|
-
ConnectionManager.logger.error(e)
|
61
|
-
throw e
|
62
|
-
})
|
63
|
-
|
64
|
-
client?.on('error', async err => {
|
65
|
-
logger.error('unexpected error on postgres client.', err)
|
66
|
-
ConnectionManager.logger.error(err)
|
67
|
-
})
|
68
|
-
|
69
|
-
// try to query
|
70
|
-
var result = (await client.query(query, params)).rows
|
71
|
-
} catch (e) {
|
72
|
-
ConnectionManager.logger.error(e)
|
73
|
-
throw e
|
74
|
-
} finally {
|
75
|
-
// release the connection back to the pool
|
76
|
-
client?.release()
|
77
|
-
}
|
78
|
-
return result
|
79
|
-
},
|
80
|
-
close: async () => {
|
81
|
-
// close the pool
|
82
|
-
await pool?.end()
|
83
|
-
}
|
84
|
-
})
|
85
|
-
|
86
|
-
ConnectionManager.logger.info(`PostgresSQL Database(${connection.name}:${database}) at ${endpoint} connected.`)
|
87
|
-
} catch (e) {
|
88
|
-
ConnectionManager.logger.error(
|
89
|
-
`PostgresSQL Database(${connection.name}:${database}) at ${endpoint} not connected.`,
|
90
|
-
e
|
91
|
-
)
|
92
|
-
}
|
93
|
-
}
|
94
|
-
|
95
|
-
async disconnect(connection: InputConnection) {
|
96
|
-
var connectionInstance = ConnectionManager.getConnectionInstance(connection)
|
97
|
-
try {
|
98
|
-
await connectionInstance.close()
|
99
|
-
ConnectionManager.logger.info(`PostgresSQL Database(${connection.name}) closed.`)
|
100
|
-
} catch (e) {
|
101
|
-
ConnectionManager.logger.error(e)
|
102
|
-
}
|
103
|
-
ConnectionManager.removeConnectionInstance(connection)
|
104
|
-
}
|
105
|
-
|
106
|
-
get parameterSpec() {
|
107
|
-
return [
|
108
|
-
{
|
109
|
-
type: 'string',
|
110
|
-
name: 'user',
|
111
|
-
label: 'user'
|
112
|
-
},
|
113
|
-
{
|
114
|
-
type: 'password',
|
115
|
-
name: 'password',
|
116
|
-
label: 'password'
|
117
|
-
},
|
118
|
-
{
|
119
|
-
type: 'string',
|
120
|
-
name: 'database',
|
121
|
-
label: 'database'
|
122
|
-
},
|
123
|
-
{
|
124
|
-
type: 'number',
|
125
|
-
name: 'maxPoolConnection',
|
126
|
-
label: 'maxPoolConnection'
|
127
|
-
},
|
128
|
-
{
|
129
|
-
type: 'number',
|
130
|
-
name: 'idleTimeoutMillis',
|
131
|
-
label: 'idleTimeoutMillis',
|
132
|
-
placeHolder: 'milli-seconds'
|
133
|
-
},
|
134
|
-
{
|
135
|
-
type: 'number',
|
136
|
-
name: 'connectionTimeoutMillis',
|
137
|
-
label: 'connectionTimeoutMillis',
|
138
|
-
placeHolder: 'milli-seconds'
|
139
|
-
}
|
140
|
-
]
|
141
|
-
}
|
142
|
-
|
143
|
-
get taskPrefixes() {
|
144
|
-
return ['database']
|
145
|
-
}
|
146
|
-
|
147
|
-
get help() {
|
148
|
-
return 'integration/connector/postgresql-connector'
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
ConnectionManager.registerConnector('postgresql-connector', new PostgresqlConnector())
|
@@ -1,53 +0,0 @@
|
|
1
|
-
import { ConnectionManager } from '../connection-manager'
|
2
|
-
import { Connector } from '../types'
|
3
|
-
import { InputConnection } from '../../service/connection/connection-type'
|
4
|
-
import { connectConnections, disconnectConnections } from '../edge-client'
|
5
|
-
|
6
|
-
/**
|
7
|
-
* This connector is a proxy connector installed on the edge server to manage connections from the host.
|
8
|
-
* It interacts with connections established on the edge server and provides synchronization functionality.
|
9
|
-
*/
|
10
|
-
export class ProxyConnector implements Connector {
|
11
|
-
public static instance = new ProxyConnector()
|
12
|
-
|
13
|
-
async ready(connectionConfigs: InputConnection[]) {
|
14
|
-
await Promise.all(connectionConfigs.map(this.connect.bind(this)))
|
15
|
-
|
16
|
-
ConnectionManager.logger.info('proxy-connector connections are ready')
|
17
|
-
}
|
18
|
-
|
19
|
-
async connect(connection: InputConnection) {
|
20
|
-
// TODO 원래 커넥션과 에지설정을 참고하여, 에지 서버로 CONNECT/DISCONNECT 명령을 보낸다.
|
21
|
-
const proxy = {
|
22
|
-
disconnect: async () => {
|
23
|
-
ConnectionManager.logger.info('[proxy-connector] trying disconnect')
|
24
|
-
await disconnectConnections([connection])
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
await connectConnections([connection])
|
29
|
-
|
30
|
-
ConnectionManager.addConnectionInstance(connection, proxy)
|
31
|
-
|
32
|
-
ConnectionManager.logger.info(`proxy-connector connection(${connection.name}:${connection.endpoint}) is connected`)
|
33
|
-
}
|
34
|
-
|
35
|
-
async disconnect(connection: InputConnection) {
|
36
|
-
const proxy = ConnectionManager.removeConnectionInstance(connection)
|
37
|
-
await proxy.disconnect()
|
38
|
-
|
39
|
-
ConnectionManager.logger.info(`proxy-connector connection(${connection.name}) is disconnected`)
|
40
|
-
}
|
41
|
-
|
42
|
-
get parameterSpec() {
|
43
|
-
return []
|
44
|
-
}
|
45
|
-
|
46
|
-
get taskPrefixes() {
|
47
|
-
return []
|
48
|
-
}
|
49
|
-
|
50
|
-
get description() {
|
51
|
-
return 'Operato Proxy Connector'
|
52
|
-
}
|
53
|
-
}
|
@@ -1,86 +0,0 @@
|
|
1
|
-
import net from 'net'
|
2
|
-
import { EventEmitter } from 'events'
|
3
|
-
|
4
|
-
import { Connector } from '../types'
|
5
|
-
import { ConnectionManager } from '../connection-manager'
|
6
|
-
import { InputConnection } from '../../service/connection/connection-type'
|
7
|
-
|
8
|
-
export class SocketServer implements Connector {
|
9
|
-
// socket: any
|
10
|
-
|
11
|
-
async ready(connectionConfigs: InputConnection[]) {
|
12
|
-
await Promise.all(connectionConfigs.map(this.connect))
|
13
|
-
ConnectionManager.logger.info('socket servers are ready')
|
14
|
-
}
|
15
|
-
|
16
|
-
async connect(config: InputConnection): Promise<void> {
|
17
|
-
var em = new EventEmitter()
|
18
|
-
var [host = '0.0.0.0', port = 8124] = config.endpoint.split(':')
|
19
|
-
return new Promise((resolve, reject) => {
|
20
|
-
var server = net.createServer(tcp => {
|
21
|
-
ConnectionManager.logger.info('Client connection: ')
|
22
|
-
ConnectionManager.logger.info(' local = %s:%s', tcp.localAddress, tcp.localPort)
|
23
|
-
ConnectionManager.logger.info(' remote = %s:%s', tcp.remoteAddress, tcp.remotePort)
|
24
|
-
tcp.on('data', (data: any) => {
|
25
|
-
em['__tcp__'] = tcp
|
26
|
-
var message = data.toString()
|
27
|
-
message = message.replace('SB#', '')
|
28
|
-
message = message.replace(/(\r\n|\n|\r)/gm, '')
|
29
|
-
em.emit('socket-message-arrive', message)
|
30
|
-
ConnectionManager.logger.info(`socket ${message}`)
|
31
|
-
tcp.write('ok')
|
32
|
-
})
|
33
|
-
|
34
|
-
tcp.on('end', () => {
|
35
|
-
ConnectionManager.logger.info('Client disconnected')
|
36
|
-
})
|
37
|
-
|
38
|
-
tcp.on('error', ex => {
|
39
|
-
ConnectionManager.logger.info('Server socket error: ')
|
40
|
-
var logger = ConnectionManager.logger
|
41
|
-
let message = ex.stack ? ex.stack : ex
|
42
|
-
let msg = typeof message == 'object' ? JSON.stringify(message, null, 2) : message
|
43
|
-
logger.error(msg, ex)
|
44
|
-
reject(ex)
|
45
|
-
})
|
46
|
-
})
|
47
|
-
|
48
|
-
server.listen(port, async () => {
|
49
|
-
ConnectionManager.logger.info(`tcp echo server listening on ${host}:${port}`)
|
50
|
-
|
51
|
-
/* default client connection */
|
52
|
-
try {
|
53
|
-
em['__server__'] = server
|
54
|
-
ConnectionManager.addConnectionInstance(config, em)
|
55
|
-
ConnectionManager.logger.info(`socket server connection(${config.name}:${config.endpoint}) is connected`)
|
56
|
-
|
57
|
-
resolve()
|
58
|
-
} catch (err) {
|
59
|
-
ConnectionManager.logger.error(err)
|
60
|
-
reject(err)
|
61
|
-
}
|
62
|
-
})
|
63
|
-
})
|
64
|
-
}
|
65
|
-
|
66
|
-
async disconnect(connection: InputConnection) {
|
67
|
-
let em = ConnectionManager.removeConnectionInstance(connection)
|
68
|
-
var tcp = em['__tcp__']
|
69
|
-
var server = em['__server__']
|
70
|
-
|
71
|
-
tcp && (await tcp.destroy())
|
72
|
-
server && (await server.close())
|
73
|
-
|
74
|
-
ConnectionManager.logger.info(`socket server connection(${connection.name}) is disconnected`)
|
75
|
-
}
|
76
|
-
|
77
|
-
get parameterSpec() {
|
78
|
-
return []
|
79
|
-
}
|
80
|
-
|
81
|
-
get taskPrefixes() {
|
82
|
-
return ['socket']
|
83
|
-
}
|
84
|
-
}
|
85
|
-
|
86
|
-
ConnectionManager.registerConnector('socket-server', new SocketServer())
|
@@ -1,69 +0,0 @@
|
|
1
|
-
import { promisify } from 'util'
|
2
|
-
|
3
|
-
import { logger } from '@things-factory/env'
|
4
|
-
|
5
|
-
import { ConnectionManager } from '../connection-manager'
|
6
|
-
import { Connector } from '../types'
|
7
|
-
import { InputConnection } from '../../service/connection/connection-type'
|
8
|
-
|
9
|
-
try {
|
10
|
-
var sqlite3 = require('sqlite3').verbose()
|
11
|
-
} catch (err) {
|
12
|
-
logger.error('sqlite3 module loading failed', err)
|
13
|
-
}
|
14
|
-
|
15
|
-
export class SqliteConnector implements Connector {
|
16
|
-
async ready(connectionConfigs: InputConnection[]) {
|
17
|
-
await Promise.all(connectionConfigs.map(this.connect.bind(this)))
|
18
|
-
|
19
|
-
ConnectionManager.logger.info('sqlite-connector connections are ready')
|
20
|
-
}
|
21
|
-
|
22
|
-
async connect(connection: InputConnection) {
|
23
|
-
var { endpoint } = connection
|
24
|
-
|
25
|
-
if (!sqlite3) {
|
26
|
-
throw new Error('sqlite3 module loading failed')
|
27
|
-
}
|
28
|
-
|
29
|
-
var database = new sqlite3.Database(endpoint, sqlite3.OPEN_READWRITE, err => {
|
30
|
-
if (err) {
|
31
|
-
ConnectionManager.logger.error(`SQLite Database(${connection.name}) at ${endpoint} not connected.`, err)
|
32
|
-
return
|
33
|
-
}
|
34
|
-
|
35
|
-
ConnectionManager.addConnectionInstance(connection, {
|
36
|
-
query: promisify(database.all.bind(database)),
|
37
|
-
close: promisify(database.close.bind(database))
|
38
|
-
})
|
39
|
-
|
40
|
-
ConnectionManager.logger.info(`SQLite Database(${connection.name}) at ${endpoint} connected.`)
|
41
|
-
})
|
42
|
-
}
|
43
|
-
|
44
|
-
async disconnect(connection: InputConnection) {
|
45
|
-
var database = ConnectionManager.getConnectionInstance(connection)
|
46
|
-
try {
|
47
|
-
await database.close()
|
48
|
-
ConnectionManager.logger.info(`SQLite Database(${connection.name}) closed.`)
|
49
|
-
} catch (e) {
|
50
|
-
ConnectionManager.logger.error(e)
|
51
|
-
}
|
52
|
-
|
53
|
-
ConnectionManager.removeConnectionInstance(connection)
|
54
|
-
}
|
55
|
-
|
56
|
-
get parameterSpec() {
|
57
|
-
return []
|
58
|
-
}
|
59
|
-
|
60
|
-
get taskPrefixes() {
|
61
|
-
return ['database']
|
62
|
-
}
|
63
|
-
|
64
|
-
get help() {
|
65
|
-
return 'integration/connector/sqlite-connector'
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
ConnectionManager.registerConnector('sqlite-connector', new SqliteConnector())
|
@@ -1,45 +0,0 @@
|
|
1
|
-
import { Connection } from '../service/connection/connection-type'
|
2
|
-
import { Step } from '../service/step/step-type'
|
3
|
-
import { Context, TaskHandler } from './types'
|
4
|
-
|
5
|
-
export type EdgeClient = {
|
6
|
-
handler: TaskHandler
|
7
|
-
syncConnections(connections: Connection[], context?: ResolverContext): Promise<any>
|
8
|
-
connectConnections(connections: Connection[], context?: ResolverContext): Promise<any>
|
9
|
-
disconnectConnections(connections: Connection[], context?: ResolverContext): Promise<any>
|
10
|
-
}
|
11
|
-
|
12
|
-
var edgeClient: EdgeClient = {
|
13
|
-
async handler(step: Step, scenarioContext: Context) {
|
14
|
-
throw 'edgeClient not supported'
|
15
|
-
},
|
16
|
-
async syncConnections(connections: Connection[], context: ResolverContext): Promise<any> {
|
17
|
-
throw 'edgeClient not supported'
|
18
|
-
},
|
19
|
-
async connectConnections(connections: Connection[], context: ResolverContext): Promise<any> {
|
20
|
-
throw 'edgeClient not supported'
|
21
|
-
},
|
22
|
-
async disconnectConnections(connections: Connection[], context: ResolverContext): Promise<any> {
|
23
|
-
throw 'edgeClient not supported'
|
24
|
-
}
|
25
|
-
}
|
26
|
-
|
27
|
-
export async function handler(step: Step, scenarioContext: Context) {
|
28
|
-
return await edgeClient.handler(step, scenarioContext)
|
29
|
-
}
|
30
|
-
|
31
|
-
export async function syncConnections(connections: Connection[], context?: ResolverContext): Promise<any> {
|
32
|
-
return await edgeClient.syncConnections(connections, context)
|
33
|
-
}
|
34
|
-
|
35
|
-
export async function connectConnections(connections: Connection[], context?: ResolverContext): Promise<any> {
|
36
|
-
return await edgeClient.connectConnections(connections, context)
|
37
|
-
}
|
38
|
-
|
39
|
-
export async function disconnectConnections(connections: Connection[], context?: ResolverContext): Promise<any> {
|
40
|
-
return await edgeClient.disconnectConnections(connections, context)
|
41
|
-
}
|
42
|
-
|
43
|
-
export function setEdgeClient(edge: EdgeClient) {
|
44
|
-
edgeClient = edge
|
45
|
-
}
|
package/server/engine/index.ts
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
import './connector'
|
2
|
-
import './task'
|
3
|
-
|
4
|
-
export * from './connection-manager'
|
5
|
-
export * from './scenario-engine'
|
6
|
-
export * from './task-registry'
|
7
|
-
export * from './analyzer/analyze-integration'
|
8
|
-
export * from './edge-client'
|
9
|
-
|
10
|
-
export { Connector, Context, TaskHandler } from './types'
|