@things-factory/integration-base 7.0.0-alpha.0 → 7.0.0-alpha.18
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/controllers/index.js +5 -0
- package/dist-server/controllers/index.js.map +1 -0
- package/dist-server/controllers/scenario-controller.js +87 -0
- package/dist-server/controllers/scenario-controller.js.map +1 -0
- package/dist-server/engine/connection-manager.js +37 -6
- package/dist-server/engine/connection-manager.js.map +1 -1
- package/dist-server/engine/connector/echo-back-connector.js +1 -1
- package/dist-server/engine/connector/echo-back-connector.js.map +1 -1
- package/dist-server/engine/connector/echo-back-server.js +1 -1
- package/dist-server/engine/connector/echo-back-server.js.map +1 -1
- package/dist-server/engine/connector/graphql-connector.js +6 -6
- package/dist-server/engine/connector/graphql-connector.js.map +1 -1
- package/dist-server/engine/connector/http-connector.js.map +1 -1
- package/dist-server/engine/connector/mqtt-connector.js.map +1 -1
- package/dist-server/engine/connector/mssql-connector.js.map +1 -1
- package/dist-server/engine/connector/mysql-connector.js +3 -3
- package/dist-server/engine/connector/mysql-connector.js.map +1 -1
- package/dist-server/engine/connector/operato-connector.js +19 -22
- package/dist-server/engine/connector/operato-connector.js.map +1 -1
- package/dist-server/engine/connector/oracle-connector.js +113 -17
- package/dist-server/engine/connector/oracle-connector.js.map +1 -1
- package/dist-server/engine/connector/postgresql-connector.js.map +1 -1
- package/dist-server/engine/connector/proxy-connector.js +44 -0
- package/dist-server/engine/connector/proxy-connector.js.map +1 -0
- package/dist-server/engine/connector/socket-server.js +1 -1
- package/dist-server/engine/connector/socket-server.js.map +1 -1
- package/dist-server/engine/connector/sqlite-connector.js.map +1 -1
- package/dist-server/engine/edge-client.js +38 -0
- package/dist-server/engine/edge-client.js.map +1 -0
- package/dist-server/engine/index.js +1 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/task/book-up-scenario.js.map +1 -1
- package/dist-server/engine/task/csv-readline.js.map +1 -1
- package/dist-server/engine/task/data-accessor.js.map +1 -1
- package/dist-server/engine/task/data-mapper.js.map +1 -1
- package/dist-server/engine/task/database-query.js.map +1 -1
- package/dist-server/engine/task/echo-receive.js.map +1 -1
- package/dist-server/engine/task/echo-send.js.map +1 -1
- package/dist-server/engine/task/empty-check.js.map +1 -1
- package/dist-server/engine/task/end.js.map +1 -1
- package/dist-server/engine/task/floating-point.js.map +1 -1
- package/dist-server/engine/task/goto.js.map +1 -1
- package/dist-server/engine/task/graphql-mutate.js.map +1 -1
- package/dist-server/engine/task/graphql-query.js.map +1 -1
- package/dist-server/engine/task/headless-post.js.map +1 -1
- package/dist-server/engine/task/headless-scrap.js.map +1 -1
- package/dist-server/engine/task/http-get.js.map +1 -1
- package/dist-server/engine/task/http-post.js.map +1 -1
- package/dist-server/engine/task/jsonata.js +1 -1
- package/dist-server/engine/task/jsonata.js.map +1 -1
- package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
- package/dist-server/engine/task/local-graphql-query.js.map +1 -1
- package/dist-server/engine/task/log.js.map +1 -1
- package/dist-server/engine/task/mqtt-publish.js.map +1 -1
- package/dist-server/engine/task/mqtt-subscribe.js.map +1 -1
- package/dist-server/engine/task/oracle-procedure.js +1 -15
- package/dist-server/engine/task/oracle-procedure.js.map +1 -1
- package/dist-server/engine/task/pick-pending-scenario.js.map +1 -1
- package/dist-server/engine/task/publish.js.map +1 -1
- package/dist-server/engine/task/random.js.map +1 -1
- package/dist-server/engine/task/reset-pending-queue.js.map +1 -1
- package/dist-server/engine/task/script.js +1 -0
- package/dist-server/engine/task/script.js.map +1 -1
- package/dist-server/engine/task/set-domain.js.map +1 -1
- package/dist-server/engine/task/sleep.js.map +1 -1
- package/dist-server/engine/task/socket-listener.js.map +1 -1
- package/dist-server/engine/task/state-read.js.map +1 -1
- package/dist-server/engine/task/state-write.js.map +1 -1
- package/dist-server/engine/task/stop-scenario.js.map +1 -1
- package/dist-server/engine/task/sub-scenario.js.map +1 -1
- package/dist-server/engine/task/switch-goto.js.map +1 -1
- package/dist-server/engine/task/switch-range-goto.js.map +1 -1
- package/dist-server/engine/task/switch-range-scenario.js.map +1 -1
- package/dist-server/engine/task/switch-range-set.js.map +1 -1
- package/dist-server/engine/task/switch-scenario.js.map +1 -1
- package/dist-server/engine/task/switch-set.js.map +1 -1
- package/dist-server/engine/task/throw.js.map +1 -1
- package/dist-server/engine/task/utils/headless-pool-for-scenario.js +1 -1
- package/dist-server/engine/task/utils/headless-pool-for-scenario.js.map +1 -1
- package/dist-server/engine/task/variables.js.map +1 -1
- package/dist-server/engine/types.js.map +1 -1
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/restful/unstable/run-scenario.js.map +1 -1
- package/dist-server/restful/unstable/start-scenario.js +1 -1
- package/dist-server/restful/unstable/start-scenario.js.map +1 -1
- package/dist-server/restful/unstable/stop-scenario.js +1 -1
- package/dist-server/restful/unstable/stop-scenario.js.map +1 -1
- package/dist-server/service/connection/connection-mutation.js +4 -8
- package/dist-server/service/connection/connection-mutation.js.map +1 -1
- package/dist-server/service/connection/connection-query.js +17 -14
- package/dist-server/service/connection/connection-query.js.map +1 -1
- package/dist-server/service/connection/connection-subscription.js +11 -14
- package/dist-server/service/connection/connection-subscription.js.map +1 -1
- package/dist-server/service/connection/connection-type.js +66 -13
- package/dist-server/service/connection/connection-type.js.map +1 -1
- package/dist-server/service/scenario-instance/scenario-instance-mutation.js +4 -71
- package/dist-server/service/scenario-instance/scenario-instance-mutation.js.map +1 -1
- package/dist-server/service/scenario-instance/scenario-instance-subscription.js +8 -9
- package/dist-server/service/scenario-instance/scenario-instance-subscription.js.map +1 -1
- package/dist-server/service/scenario-instance/scenario-instance-type.js +18 -5
- package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
- package/dist-server/service/scenario-queue/scenario-queue-subscription.js +4 -4
- package/dist-server/service/scenario-queue/scenario-queue-subscription.js.map +1 -1
- package/dist-server/service/step/step-type.js +41 -28
- package/dist-server/service/step/step-type.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/concept/script-internal-variables.ja.md +21 -1
- package/helps/integration/concept/script-internal-variables.ko.md +17 -0
- package/helps/integration/concept/script-internal-variables.md +18 -0
- package/helps/integration/concept/script-internal-variables.ms.md +19 -1
- package/helps/integration/concept/script-internal-variables.zh.md +18 -0
- package/helps/integration/connector/oracle-connector.ja.md +90 -0
- package/helps/integration/connector/oracle-connector.ko.md +87 -0
- package/helps/integration/connector/oracle-connector.md +46 -25
- package/helps/integration/connector/oracle-connector.ms.md +87 -0
- package/helps/integration/connector/oracle-connector.zh.md +87 -0
- package/helps/integration/task/script.ja.md +1 -1
- package/helps/integration/task/script.ko.md +1 -1
- package/helps/integration/task/script.md +1 -1
- package/helps/integration/task/script.ms.md +1 -1
- package/helps/integration/task/script.zh.md +1 -1
- package/openapi/unstable/scenario.yaml +100 -100
- package/openapi/unstable.yaml +11 -11
- package/package.json +8 -11
- package/server/controllers/index.ts +1 -0
- package/server/controllers/scenario-controller.ts +116 -0
- package/server/engine/connection-manager.ts +49 -7
- package/server/engine/connector/echo-back-connector.ts +4 -3
- package/server/engine/connector/echo-back-server.ts +5 -4
- package/server/engine/connector/graphql-connector.ts +12 -13
- package/server/engine/connector/http-connector.ts +4 -3
- package/server/engine/connector/mqtt-connector.ts +4 -3
- package/server/engine/connector/mssql-connector.ts +4 -3
- package/server/engine/connector/mysql-connector.ts +8 -6
- package/server/engine/connector/operato-connector.ts +27 -35
- package/server/engine/connector/oracle-connector.ts +136 -23
- package/server/engine/connector/postgresql-connector.ts +4 -3
- package/server/engine/connector/proxy-connector.ts +53 -0
- package/server/engine/connector/socket-server.ts +5 -4
- package/server/engine/connector/sqlite-connector.ts +5 -3
- package/server/engine/edge-client.ts +45 -0
- package/server/engine/index.ts +1 -0
- package/server/engine/task/book-up-scenario.ts +3 -1
- package/server/engine/task/csv-readline.ts +4 -1
- package/server/engine/task/data-accessor.ts +4 -1
- package/server/engine/task/data-mapper.ts +4 -1
- package/server/engine/task/database-query.ts +3 -1
- package/server/engine/task/echo-receive.ts +4 -1
- package/server/engine/task/echo-send.ts +3 -1
- package/server/engine/task/empty-check.ts +4 -1
- package/server/engine/task/end.ts +4 -1
- package/server/engine/task/floating-point.ts +4 -1
- package/server/engine/task/goto.ts +4 -1
- package/server/engine/task/graphql-mutate.ts +3 -1
- package/server/engine/task/graphql-query.ts +3 -1
- package/server/engine/task/headless-post.ts +4 -1
- package/server/engine/task/headless-scrap.ts +3 -1
- package/server/engine/task/http-get.ts +3 -1
- package/server/engine/task/http-post.ts +3 -1
- package/server/engine/task/jsonata.ts +5 -2
- package/server/engine/task/local-graphql-mutate.ts +5 -1
- package/server/engine/task/local-graphql-query.ts +3 -1
- package/server/engine/task/log.ts +3 -1
- package/server/engine/task/mqtt-publish.ts +3 -1
- package/server/engine/task/mqtt-subscribe.ts +3 -1
- package/server/engine/task/oracle-procedure.ts +4 -17
- package/server/engine/task/pick-pending-scenario.ts +3 -1
- package/server/engine/task/publish.ts +3 -1
- package/server/engine/task/random.ts +4 -1
- package/server/engine/task/reset-pending-queue.ts +3 -1
- package/server/engine/task/script.ts +5 -1
- package/server/engine/task/set-domain.ts +4 -1
- package/server/engine/task/sleep.ts +3 -1
- package/server/engine/task/socket-listener.ts +3 -1
- package/server/engine/task/state-read.ts +3 -1
- package/server/engine/task/state-write.ts +3 -1
- package/server/engine/task/stop-scenario.ts +3 -1
- package/server/engine/task/sub-scenario.ts +3 -1
- package/server/engine/task/switch-goto.ts +4 -1
- package/server/engine/task/switch-range-goto.ts +3 -1
- package/server/engine/task/switch-range-scenario.ts +3 -1
- package/server/engine/task/switch-range-set.ts +3 -1
- package/server/engine/task/switch-scenario.ts +3 -1
- package/server/engine/task/switch-set.ts +3 -1
- package/server/engine/task/throw.ts +3 -1
- package/server/engine/task/utils/headless-pool-for-scenario.ts +1 -1
- package/server/engine/task/variables.ts +3 -1
- package/server/engine/types.ts +80 -4
- package/server/index.ts +1 -0
- package/server/restful/unstable/run-scenario.ts +0 -1
- package/server/restful/unstable/start-scenario.ts +1 -1
- package/server/restful/unstable/stop-scenario.ts +1 -1
- package/server/service/connection/connection-mutation.ts +9 -29
- package/server/service/connection/connection-query.ts +13 -12
- package/server/service/connection/connection-subscription.ts +18 -24
- package/server/service/connection/connection-type.ts +100 -21
- package/server/service/scenario-instance/scenario-instance-mutation.ts +10 -121
- package/server/service/scenario-instance/scenario-instance-subscription.ts +16 -23
- package/server/service/scenario-instance/scenario-instance-type.ts +24 -13
- package/server/service/scenario-queue/scenario-queue-subscription.ts +7 -7
- package/server/service/step/step-type.ts +78 -22
@@ -1,20 +1,12 @@
|
|
1
1
|
import { Field, ID, InputType, Int, ObjectType, registerEnumType } from 'type-graphql'
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
5
|
-
Entity,
|
6
|
-
Index,
|
7
|
-
ManyToOne,
|
8
|
-
PrimaryGeneratedColumn,
|
9
|
-
RelationId,
|
10
|
-
UpdateDateColumn
|
11
|
-
} from 'typeorm'
|
12
|
-
|
13
|
-
import { User } from '@things-factory/auth-base'
|
2
|
+
import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'
|
3
|
+
|
4
|
+
import { User, Appliance } from '@things-factory/auth-base'
|
14
5
|
import { logger } from '@things-factory/env'
|
15
|
-
import { Domain } from '@things-factory/shell'
|
6
|
+
import { Domain, ObjectRef } from '@things-factory/shell'
|
16
7
|
|
17
8
|
import { ConnectionManager } from '../../engine'
|
9
|
+
import { ProxyConnector } from '../../engine/connector/proxy-connector'
|
18
10
|
|
19
11
|
export enum ConnectionStatus {
|
20
12
|
CONNECTED = 'CONNECTED',
|
@@ -30,74 +22,138 @@ registerEnumType(ConnectionStatus, {
|
|
30
22
|
@Index('ix_connection_0', (connection: Connection) => [connection.domain, connection.name], { unique: true })
|
31
23
|
@ObjectType()
|
32
24
|
export class Connection {
|
25
|
+
/**
|
26
|
+
* Unique identifier for the connection, generated in UUID format.
|
27
|
+
*/
|
33
28
|
@PrimaryGeneratedColumn('uuid')
|
34
29
|
@Field(type => ID)
|
35
30
|
readonly id: string
|
36
31
|
|
32
|
+
/**
|
33
|
+
* Many-to-One relationship with the Domain entity.
|
34
|
+
*/
|
37
35
|
@ManyToOne(type => Domain)
|
38
36
|
@Field({ nullable: true })
|
39
37
|
domain: Domain
|
40
38
|
|
39
|
+
/**
|
40
|
+
* Stores the ID of the associated Domain.
|
41
|
+
*/
|
41
42
|
@RelationId((connection: Connection) => connection.domain)
|
42
43
|
domainId: string
|
43
44
|
|
45
|
+
/**
|
46
|
+
* The name of the connection.
|
47
|
+
*/
|
44
48
|
@Column()
|
45
49
|
@Field()
|
46
50
|
name: string
|
47
51
|
|
52
|
+
/**
|
53
|
+
* Optional description for the connection.
|
54
|
+
*/
|
48
55
|
@Column({
|
49
56
|
nullable: true
|
50
57
|
})
|
51
58
|
@Field({ nullable: true })
|
52
59
|
description: string
|
53
60
|
|
61
|
+
/**
|
62
|
+
* The type of the connection.
|
63
|
+
*/
|
54
64
|
@Column()
|
55
65
|
@Field({ nullable: true })
|
56
66
|
type: string
|
57
67
|
|
68
|
+
/**
|
69
|
+
* Many-to-One relationship with the Appliance entity which delegate the connection. Optional field.
|
70
|
+
*/
|
71
|
+
@ManyToOne(type => Appliance, { nullable: true })
|
72
|
+
@Field({ nullable: true })
|
73
|
+
edge: Appliance
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Stores the ID of the Appliance who delegate the connection.
|
77
|
+
*/
|
78
|
+
@RelationId((connection: Connection) => connection.edge)
|
79
|
+
edgeId: string
|
80
|
+
|
81
|
+
/**
|
82
|
+
* The endpoint for the connection.
|
83
|
+
*/
|
58
84
|
@Column()
|
59
85
|
@Field({ nullable: true })
|
60
86
|
endpoint: string
|
61
87
|
|
62
|
-
|
63
|
-
|
64
|
-
|
88
|
+
/**
|
89
|
+
* Indicates the active status of the connection.
|
90
|
+
*/
|
91
|
+
@Column({ nullable: true })
|
65
92
|
@Field({ nullable: true })
|
66
93
|
active: boolean
|
67
94
|
|
95
|
+
/**
|
96
|
+
* The status of the connection, using the ConnectionStatus type.
|
97
|
+
*/
|
68
98
|
@Field({ nullable: true })
|
69
99
|
state: ConnectionStatus
|
70
100
|
|
71
|
-
|
72
|
-
|
73
|
-
|
101
|
+
/**
|
102
|
+
* Additional parameters for the connection, stored as a JSON string.
|
103
|
+
*/
|
104
|
+
@Column({ nullable: true })
|
74
105
|
@Field({ nullable: true })
|
75
106
|
params: string
|
76
107
|
|
108
|
+
/**
|
109
|
+
* The date and time when the connection was created.
|
110
|
+
*/
|
77
111
|
@CreateDateColumn()
|
78
112
|
@Field({ nullable: true })
|
79
113
|
createdAt: Date
|
80
114
|
|
115
|
+
/**
|
116
|
+
* The date and time when the connection was last updated.
|
117
|
+
*/
|
81
118
|
@UpdateDateColumn()
|
82
119
|
@Field({ nullable: true })
|
83
120
|
updatedAt: Date
|
84
121
|
|
122
|
+
/**
|
123
|
+
* Many-to-One relationship with the User entity who created the connection. Optional field.
|
124
|
+
*/
|
85
125
|
@ManyToOne(type => User, { nullable: true })
|
86
126
|
@Field({ nullable: true })
|
87
127
|
creator: User
|
88
128
|
|
129
|
+
/**
|
130
|
+
* Stores the ID of the User who created the connection.
|
131
|
+
*/
|
89
132
|
@RelationId((connection: Connection) => connection.creator)
|
90
133
|
creatorId: string
|
91
134
|
|
135
|
+
/**
|
136
|
+
* Many-to-One relationship with the User entity who last updated the connection.
|
137
|
+
* Optional field.
|
138
|
+
*/
|
92
139
|
@ManyToOne(type => User, { nullable: true })
|
93
140
|
@Field({ nullable: true })
|
94
141
|
updater: User
|
95
142
|
|
143
|
+
/**
|
144
|
+
* Stores the ID of the User who last updated the connection.
|
145
|
+
*
|
146
|
+
*/
|
96
147
|
@RelationId((connection: Connection) => connection.updater)
|
97
148
|
updaterId: string
|
98
149
|
|
150
|
+
/**
|
151
|
+
* Asynchronous method to establish the connection.
|
152
|
+
*
|
153
|
+
*/
|
99
154
|
async connect() {
|
100
|
-
|
155
|
+
const { type, edge } = this
|
156
|
+
const connector = edge ? ProxyConnector.instance : ConnectionManager.getConnector(type)
|
101
157
|
var params = {}
|
102
158
|
|
103
159
|
try {
|
@@ -112,15 +168,29 @@ export class Connection {
|
|
112
168
|
})
|
113
169
|
}
|
114
170
|
|
171
|
+
/**
|
172
|
+
* @brief Asynchronous method to disconnect the connection.
|
173
|
+
*
|
174
|
+
*/
|
115
175
|
async disconnect() {
|
116
176
|
try {
|
117
|
-
|
177
|
+
const { type, edge } = this
|
178
|
+
const connector = edge ? ProxyConnector.instance : ConnectionManager.getConnector(type)
|
118
179
|
await connector.disconnect(this)
|
119
180
|
} finally {
|
120
181
|
}
|
121
182
|
}
|
122
183
|
}
|
123
184
|
|
185
|
+
/**
|
186
|
+
* Connection의 params의 원 타입과 사용 시에 타입 불일치로 인해 임시적으로 생성한 타입으로
|
187
|
+
* 추후, 타입 일치를 통해서 제거할 예정임.
|
188
|
+
*
|
189
|
+
*/
|
190
|
+
export interface InputConnection extends Connection {
|
191
|
+
params: any
|
192
|
+
}
|
193
|
+
|
124
194
|
@ObjectType()
|
125
195
|
export class ConnectionState {
|
126
196
|
@Field({ nullable: true })
|
@@ -138,6 +208,9 @@ export class ConnectionState {
|
|
138
208
|
@Field({ nullable: true })
|
139
209
|
type?: string
|
140
210
|
|
211
|
+
@Field(type => Appliance, { nullable: true })
|
212
|
+
edge?: Appliance
|
213
|
+
|
141
214
|
@Field({ nullable: true })
|
142
215
|
state?: ConnectionStatus
|
143
216
|
|
@@ -156,6 +229,9 @@ export class NewConnection {
|
|
156
229
|
@Field({ nullable: true })
|
157
230
|
type?: string
|
158
231
|
|
232
|
+
@Field(type => ObjectRef, { nullable: true })
|
233
|
+
edge?: Appliance
|
234
|
+
|
159
235
|
@Field({ nullable: true })
|
160
236
|
endpoint?: string
|
161
237
|
|
@@ -177,6 +253,9 @@ export class ConnectionPatch {
|
|
177
253
|
@Field({ nullable: true })
|
178
254
|
type?: string
|
179
255
|
|
256
|
+
@Field(type => ObjectRef, { nullable: true })
|
257
|
+
edge?: Appliance
|
258
|
+
|
180
259
|
@Field({ nullable: true })
|
181
260
|
endpoint?: string
|
182
261
|
|
@@ -1,35 +1,14 @@
|
|
1
1
|
import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'
|
2
2
|
|
3
|
-
import {
|
3
|
+
import { ScalarObject } from '@things-factory/shell'
|
4
4
|
|
5
|
-
import { ScenarioEngine } from '../../engine'
|
6
|
-
import { Scenario } from '../scenario/scenario'
|
7
5
|
import { ScenarioInstance } from './scenario-instance-type'
|
8
|
-
import { PrivilegeObject, User, checkPermission } from '@things-factory/auth-base'
|
9
|
-
import { Step } from '../step/step-type'
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
): Promise<{ name: string; steps: Step[]; domain: Domain; privilege?: PrivilegeObject }> {
|
17
|
-
var repository = getRepository(Scenario)
|
18
|
-
|
19
|
-
var scenario = await repository.findOne({
|
20
|
-
where: { domain: { id: domain.id }, name: scenarioName },
|
21
|
-
relations: ['domain', 'steps', 'creator', 'updater']
|
22
|
-
})
|
23
|
-
|
24
|
-
if (!scenario && domain.parentId) {
|
25
|
-
scenario = await repository.findOne({
|
26
|
-
where: { domain: { id: domain.parentId }, name: scenarioName },
|
27
|
-
relations: ['domain', 'steps', 'creator', 'updater']
|
28
|
-
})
|
29
|
-
}
|
30
|
-
|
31
|
-
return scenario as any
|
32
|
-
}
|
7
|
+
import {
|
8
|
+
runScenario as controllerRunScenario,
|
9
|
+
startScenario as controllerStartScenario,
|
10
|
+
stopScenario as controllerStopScenario
|
11
|
+
} from '../../controllers/scenario-controller'
|
33
12
|
|
34
13
|
@Resolver(ScenarioInstance)
|
35
14
|
export class ScenarioInstanceMutation {
|
@@ -42,42 +21,7 @@ export class ScenarioInstanceMutation {
|
|
42
21
|
@Arg('variables', type => ScalarObject, { nullable: true }) variables: any,
|
43
22
|
@Ctx() context: ResolverContext
|
44
23
|
): Promise<ScenarioInstance> {
|
45
|
-
|
46
|
-
|
47
|
-
debug('runScenario', scenarioName, instanceName, variables)
|
48
|
-
|
49
|
-
var scenario = await findScenario(scenarioName, domain)
|
50
|
-
|
51
|
-
if (!scenario) {
|
52
|
-
throw new Error(
|
53
|
-
context.t('error.scenario not found', {
|
54
|
-
scenario: scenarioName
|
55
|
-
})
|
56
|
-
)
|
57
|
-
}
|
58
|
-
|
59
|
-
if (!(await checkPermission(scenario.privilege, user, domain, unsafeIP, prohibitedPrivileges))) {
|
60
|
-
const { category, privilege } = scenario.privilege || {}
|
61
|
-
throw new Error(
|
62
|
-
`Unauthorized! ${
|
63
|
-
category && privilege ? category + ':' + privilege + ' privilege' : 'ownership granted'
|
64
|
-
} required`
|
65
|
-
)
|
66
|
-
}
|
67
|
-
|
68
|
-
/* 시나리오 인스턴스를 생성한다. */
|
69
|
-
instanceName = instanceName || scenarioName + '-' + String(Date.now())
|
70
|
-
var instance = new ScenarioInstance(instanceName, scenario, {
|
71
|
-
domain,
|
72
|
-
user,
|
73
|
-
lng,
|
74
|
-
variables,
|
75
|
-
client: GraphqlLocalClient.client
|
76
|
-
})
|
77
|
-
|
78
|
-
await instance.run()
|
79
|
-
|
80
|
-
return instance
|
24
|
+
return await controllerRunScenario(instanceName, scenarioName, variables, context)
|
81
25
|
}
|
82
26
|
|
83
27
|
@Mutation(returns => ScenarioInstance, { description: 'To start new scenario instance' })
|
@@ -87,66 +31,11 @@ export class ScenarioInstanceMutation {
|
|
87
31
|
@Arg('variables', type => ScalarObject, { nullable: true }) variables: any,
|
88
32
|
@Ctx() context: ResolverContext
|
89
33
|
): Promise<ScenarioInstance> {
|
90
|
-
|
91
|
-
|
92
|
-
debug('startScenario', instanceName, scenarioName, variables)
|
93
|
-
|
94
|
-
var scenario = await findScenario(scenarioName, domain)
|
95
|
-
|
96
|
-
if (!scenario) {
|
97
|
-
throw new Error(
|
98
|
-
context.t('error.scenario not found', {
|
99
|
-
scenario: scenarioName
|
100
|
-
})
|
101
|
-
)
|
102
|
-
}
|
103
|
-
|
104
|
-
if (!(await checkPermission(scenario.privilege, user, domain, unsafeIP, prohibitedPrivileges))) {
|
105
|
-
const { category, privilege } = scenario.privilege || {}
|
106
|
-
throw new Error(
|
107
|
-
`Unauthorized! ${
|
108
|
-
category && privilege ? category + ':' + privilege + ' privilege' : 'ownership granted'
|
109
|
-
} required`
|
110
|
-
)
|
111
|
-
}
|
112
|
-
|
113
|
-
instanceName = instanceName || scenarioName
|
114
|
-
return await ScenarioEngine.load(instanceName, scenario, { domain, user, lng, variables })
|
34
|
+
return await controllerStartScenario(instanceName, scenarioName, variables, context)
|
115
35
|
}
|
116
36
|
|
117
37
|
@Mutation(returns => ScenarioInstance, { nullable: true, description: 'To start new scenario instance' })
|
118
|
-
async stopScenario(
|
119
|
-
|
120
|
-
@Ctx() context: ResolverContext
|
121
|
-
): Promise<ScenarioInstance | undefined> {
|
122
|
-
const { domain, user, unsafeIP, prohibitedPrivileges } = context.state
|
123
|
-
|
124
|
-
debug('stopScenario', instanceName)
|
125
|
-
|
126
|
-
var scenarioInstance = ScenarioEngine.getScenarioInstance(domain, instanceName)
|
127
|
-
|
128
|
-
if (!scenarioInstance) {
|
129
|
-
debug('stopScenario', `ScenarioInstance(${instanceName}) Not Found.`)
|
130
|
-
throw new Error(
|
131
|
-
context.t('error.scenario instance not found', {
|
132
|
-
instance: instanceName
|
133
|
-
})
|
134
|
-
)
|
135
|
-
}
|
136
|
-
|
137
|
-
var scenario = await findScenario(scenarioInstance.scenarioName, domain)
|
138
|
-
|
139
|
-
if (!(await checkPermission(scenario.privilege, user, domain, unsafeIP, prohibitedPrivileges))) {
|
140
|
-
const { category, privilege } = scenario.privilege || {}
|
141
|
-
throw new Error(
|
142
|
-
`Unauthorized! ${
|
143
|
-
category && privilege ? category + ':' + privilege + ' privilege' : 'ownership granted'
|
144
|
-
} required`
|
145
|
-
)
|
146
|
-
}
|
147
|
-
|
148
|
-
await ScenarioEngine.unload(domain, instanceName)
|
149
|
-
|
150
|
-
return scenarioInstance
|
38
|
+
async stopScenario(@Arg('instanceName', { nullable: true }) instanceName: string, @Ctx() context: ResolverContext): Promise<ScenarioInstance | undefined> {
|
39
|
+
return await controllerStopScenario(instanceName, context)
|
151
40
|
}
|
152
41
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Resolver, Subscription, Root, Arg } from 'type-graphql'
|
2
|
-
import {
|
2
|
+
import { filter, pipe } from 'graphql-yoga'
|
3
3
|
import { pubsub, Log } from '@things-factory/shell'
|
4
4
|
import { ScenarioInstance, ScenarioInstanceState } from './scenario-instance-type'
|
5
5
|
import { ScenarioEngine } from '../../engine'
|
@@ -9,7 +9,7 @@ const debug = require('debug')('things-factory:integration:scenario-instance-sub
|
|
9
9
|
@Resolver(ScenarioInstance)
|
10
10
|
export class ScenarioInstanceSubscription {
|
11
11
|
@Subscription({
|
12
|
-
subscribe: (
|
12
|
+
subscribe: ({ args, context, info }) => {
|
13
13
|
const { domain, user } = context.state
|
14
14
|
const { instanceName, scenarioName, level } = args
|
15
15
|
const subdomain = domain?.subdomain
|
@@ -24,11 +24,11 @@ export class ScenarioInstanceSubscription {
|
|
24
24
|
throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)
|
25
25
|
}
|
26
26
|
|
27
|
-
return
|
28
|
-
|
29
|
-
(payload
|
27
|
+
return pipe(
|
28
|
+
pubsub.subscribe('scenario-instance-log'),
|
29
|
+
filter((payload: { scenarioInstanceLog: Log }) => {
|
30
30
|
const { source, level: plevel } = payload.scenarioInstanceLog
|
31
|
-
const { domain: pdomain, scenarioName: pscenarioName, instanceName: pinstanceName } = source
|
31
|
+
const { domain: pdomain, scenarioName: pscenarioName, instanceName: pinstanceName } = source as any
|
32
32
|
|
33
33
|
if (subdomain !== pdomain?.subdomain) {
|
34
34
|
return false
|
@@ -47,8 +47,8 @@ export class ScenarioInstanceSubscription {
|
|
47
47
|
}
|
48
48
|
|
49
49
|
return true
|
50
|
-
}
|
51
|
-
)
|
50
|
+
})
|
51
|
+
)
|
52
52
|
}
|
53
53
|
})
|
54
54
|
scenarioInstanceLog(
|
@@ -61,7 +61,7 @@ export class ScenarioInstanceSubscription {
|
|
61
61
|
}
|
62
62
|
|
63
63
|
@Subscription({
|
64
|
-
subscribe: (
|
64
|
+
subscribe: ({ args, context, info }) => {
|
65
65
|
const { domain, user } = context.state
|
66
66
|
const { instanceName, scenarioName } = args
|
67
67
|
const subdomain = domain?.subdomain
|
@@ -79,24 +79,17 @@ export class ScenarioInstanceSubscription {
|
|
79
79
|
process.nextTick(() => {
|
80
80
|
ScenarioEngine.getScenarioInstances(domain)
|
81
81
|
.filter(instance => {
|
82
|
-
return (
|
83
|
-
(!instanceName || instance.instanceName === instanceName) &&
|
84
|
-
(!scenarioName || instance.scenarioName === scenarioName)
|
85
|
-
)
|
82
|
+
return (!instanceName || instance.instanceName === instanceName) && (!scenarioName || instance.scenarioName === scenarioName)
|
86
83
|
})
|
87
84
|
.forEach(instance => {
|
88
85
|
instance.publishState()
|
89
86
|
})
|
90
87
|
})
|
91
88
|
|
92
|
-
return
|
93
|
-
|
94
|
-
(payload
|
95
|
-
const {
|
96
|
-
domain: pdomain,
|
97
|
-
scenarioName: pscenarioName,
|
98
|
-
instanceName: pinstanceName
|
99
|
-
} = payload.scenarioInstanceState
|
89
|
+
return pipe(
|
90
|
+
pubsub.subscribe('scenario-instance-state'),
|
91
|
+
filter((payload: { scenarioInstanceState: ScenarioInstanceState }) => {
|
92
|
+
const { domain: pdomain, scenarioName: pscenarioName, instanceName: pinstanceName } = payload.scenarioInstanceState
|
100
93
|
|
101
94
|
if (subdomain !== pdomain?.subdomain) {
|
102
95
|
return false
|
@@ -111,8 +104,8 @@ export class ScenarioInstanceSubscription {
|
|
111
104
|
}
|
112
105
|
|
113
106
|
return true
|
114
|
-
}
|
115
|
-
)
|
107
|
+
})
|
108
|
+
)
|
116
109
|
}
|
117
110
|
})
|
118
111
|
scenarioInstanceState(
|
@@ -10,9 +10,11 @@ import { Domain, pubsub, PubSubLogTransport, ScalarObject } from '@things-factor
|
|
10
10
|
import { User } from '@things-factory/auth-base'
|
11
11
|
import { sleep } from '@things-factory/utils'
|
12
12
|
|
13
|
+
import { ConnectionManager } from '../../engine/connection-manager'
|
13
14
|
import { TaskRegistry } from '../../engine'
|
14
15
|
import { Context } from '../../engine/types'
|
15
16
|
import { Step } from '../step/step-type'
|
17
|
+
import { handler as edgeHandler } from '../../engine/edge-client'
|
16
18
|
|
17
19
|
const debug = require('debug')('things-factory:integration-base:scenario-instance')
|
18
20
|
const { combine, timestamp, splat, printf } = format
|
@@ -125,7 +127,7 @@ export class ScenarioInstance {
|
|
125
127
|
timestamp: Date
|
126
128
|
|
127
129
|
@Field({ nullable: true })
|
128
|
-
|
130
|
+
public message: string
|
129
131
|
|
130
132
|
private steps: Step[]
|
131
133
|
private rounds: number = 0
|
@@ -267,10 +269,7 @@ export class ScenarioInstance {
|
|
267
269
|
this.context.logger.error(ex.message ? ex.message : ex)
|
268
270
|
|
269
271
|
debug('failed to run ', `[ Domain: ${domain.name}, Scenario: ${scenarioName} ]\n`, ex)
|
270
|
-
this.setState(
|
271
|
-
ScenarioInstanceStatus.HALTED,
|
272
|
-
typeof message == 'object' ? JSON.stringify(message, null, 2) : message
|
273
|
-
)
|
272
|
+
this.setState(ScenarioInstanceStatus.HALTED, typeof message == 'object' ? JSON.stringify(message, null, 2) : message)
|
274
273
|
|
275
274
|
throw ex
|
276
275
|
}
|
@@ -376,9 +375,9 @@ export class ScenarioInstance {
|
|
376
375
|
return
|
377
376
|
}
|
378
377
|
|
379
|
-
this.message = `${this.instanceName}:[state changed] ${ScenarioInstanceStatus[this.getState()]} => ${
|
380
|
-
|
381
|
-
}
|
378
|
+
this.message = `${this.instanceName}:[state changed] ${ScenarioInstanceStatus[this.getState()]} => ${ScenarioInstanceStatus[state]}${
|
379
|
+
message ? ' caused by ' + util.inspect(message, false, 2, true) : ''
|
380
|
+
}`
|
382
381
|
|
383
382
|
this.context.state = state
|
384
383
|
|
@@ -421,6 +420,12 @@ export class ScenarioInstance {
|
|
421
420
|
if (this.disposer) {
|
422
421
|
await this.disposer.call(this)
|
423
422
|
}
|
423
|
+
|
424
|
+
// {{ CHECKPOINT 본 인스턴스를 위해서 생성된 logger를 닫는다.
|
425
|
+
if (this.context?.logger) {
|
426
|
+
this.context.logger.close()
|
427
|
+
}
|
428
|
+
// }}
|
424
429
|
}
|
425
430
|
|
426
431
|
async process(step, context): Promise<{ next: string; state: ScenarioInstanceStatus; data: object }> {
|
@@ -437,12 +442,18 @@ export class ScenarioInstance {
|
|
437
442
|
}
|
438
443
|
step.params = step.params || {}
|
439
444
|
|
440
|
-
|
441
|
-
if (!handler) {
|
442
|
-
throw new Error(`no task handler for step '${step.name}'(${step.id})`)
|
443
|
-
}
|
445
|
+
const connection = step.connection && ConnectionManager.getConnectionInstanceEntityByName(this.domain, step.connection)
|
444
446
|
|
445
|
-
|
447
|
+
if (!connection || !connection.edgeId) {
|
448
|
+
var handler = TaskRegistry.getTaskHandler(step.task)
|
449
|
+
if (!handler) {
|
450
|
+
throw new Error(`no task handler for step '${step.name}'(${step.id})`)
|
451
|
+
}
|
452
|
+
|
453
|
+
var retval: any = await handler(step, context)
|
454
|
+
} else {
|
455
|
+
var retval: any = await edgeHandler(step, context)
|
456
|
+
}
|
446
457
|
|
447
458
|
if (step.log) {
|
448
459
|
var { data } = retval || {}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { Resolver, Subscription, Root, Arg } from 'type-graphql'
|
2
2
|
import { ScenarioQueueState } from './scenario-queue-type'
|
3
3
|
import { pubsub } from '@things-factory/shell'
|
4
|
-
import {
|
4
|
+
import { filter, pipe } from 'graphql-yoga'
|
5
5
|
import { ScenarioEngine } from '../../engine'
|
6
6
|
|
7
7
|
const debug = require('debug')('things-factory:integration:connection-subscription')
|
@@ -9,7 +9,7 @@ const debug = require('debug')('things-factory:integration:connection-subscripti
|
|
9
9
|
@Resolver()
|
10
10
|
export class ScenarioQueueSubscription {
|
11
11
|
@Subscription({
|
12
|
-
subscribe: (
|
12
|
+
subscribe: ({ args, context, info }) => {
|
13
13
|
const { domain, user } = context.state
|
14
14
|
const subdomain = domain?.subdomain
|
15
15
|
|
@@ -35,9 +35,9 @@ export class ScenarioQueueSubscription {
|
|
35
35
|
}
|
36
36
|
})
|
37
37
|
|
38
|
-
return
|
39
|
-
|
40
|
-
(payload
|
38
|
+
return pipe(
|
39
|
+
pubsub.subscribe('scenario-queue-state'),
|
40
|
+
filter((payload: { scenarioQueueState: ScenarioQueueState }) => {
|
41
41
|
const { domain: pdomain } = payload.scenarioQueueState
|
42
42
|
|
43
43
|
if (pdomain?.subdomain !== subdomain) {
|
@@ -45,8 +45,8 @@ export class ScenarioQueueSubscription {
|
|
45
45
|
}
|
46
46
|
|
47
47
|
return true
|
48
|
-
}
|
49
|
-
)
|
48
|
+
})
|
49
|
+
)
|
50
50
|
}
|
51
51
|
})
|
52
52
|
scenarioQueueState(@Root() payload: { scenarioQueueState: ScenarioQueueState }): ScenarioQueueState {
|