@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.
Files changed (202) hide show
  1. package/dist-server/controllers/index.js +5 -0
  2. package/dist-server/controllers/index.js.map +1 -0
  3. package/dist-server/controllers/scenario-controller.js +87 -0
  4. package/dist-server/controllers/scenario-controller.js.map +1 -0
  5. package/dist-server/engine/connection-manager.js +37 -6
  6. package/dist-server/engine/connection-manager.js.map +1 -1
  7. package/dist-server/engine/connector/echo-back-connector.js +1 -1
  8. package/dist-server/engine/connector/echo-back-connector.js.map +1 -1
  9. package/dist-server/engine/connector/echo-back-server.js +1 -1
  10. package/dist-server/engine/connector/echo-back-server.js.map +1 -1
  11. package/dist-server/engine/connector/graphql-connector.js +6 -6
  12. package/dist-server/engine/connector/graphql-connector.js.map +1 -1
  13. package/dist-server/engine/connector/http-connector.js.map +1 -1
  14. package/dist-server/engine/connector/mqtt-connector.js.map +1 -1
  15. package/dist-server/engine/connector/mssql-connector.js.map +1 -1
  16. package/dist-server/engine/connector/mysql-connector.js +3 -3
  17. package/dist-server/engine/connector/mysql-connector.js.map +1 -1
  18. package/dist-server/engine/connector/operato-connector.js +19 -22
  19. package/dist-server/engine/connector/operato-connector.js.map +1 -1
  20. package/dist-server/engine/connector/oracle-connector.js +113 -17
  21. package/dist-server/engine/connector/oracle-connector.js.map +1 -1
  22. package/dist-server/engine/connector/postgresql-connector.js.map +1 -1
  23. package/dist-server/engine/connector/proxy-connector.js +44 -0
  24. package/dist-server/engine/connector/proxy-connector.js.map +1 -0
  25. package/dist-server/engine/connector/socket-server.js +1 -1
  26. package/dist-server/engine/connector/socket-server.js.map +1 -1
  27. package/dist-server/engine/connector/sqlite-connector.js.map +1 -1
  28. package/dist-server/engine/edge-client.js +38 -0
  29. package/dist-server/engine/edge-client.js.map +1 -0
  30. package/dist-server/engine/index.js +1 -0
  31. package/dist-server/engine/index.js.map +1 -1
  32. package/dist-server/engine/task/book-up-scenario.js.map +1 -1
  33. package/dist-server/engine/task/csv-readline.js.map +1 -1
  34. package/dist-server/engine/task/data-accessor.js.map +1 -1
  35. package/dist-server/engine/task/data-mapper.js.map +1 -1
  36. package/dist-server/engine/task/database-query.js.map +1 -1
  37. package/dist-server/engine/task/echo-receive.js.map +1 -1
  38. package/dist-server/engine/task/echo-send.js.map +1 -1
  39. package/dist-server/engine/task/empty-check.js.map +1 -1
  40. package/dist-server/engine/task/end.js.map +1 -1
  41. package/dist-server/engine/task/floating-point.js.map +1 -1
  42. package/dist-server/engine/task/goto.js.map +1 -1
  43. package/dist-server/engine/task/graphql-mutate.js.map +1 -1
  44. package/dist-server/engine/task/graphql-query.js.map +1 -1
  45. package/dist-server/engine/task/headless-post.js.map +1 -1
  46. package/dist-server/engine/task/headless-scrap.js.map +1 -1
  47. package/dist-server/engine/task/http-get.js.map +1 -1
  48. package/dist-server/engine/task/http-post.js.map +1 -1
  49. package/dist-server/engine/task/jsonata.js +1 -1
  50. package/dist-server/engine/task/jsonata.js.map +1 -1
  51. package/dist-server/engine/task/local-graphql-mutate.js.map +1 -1
  52. package/dist-server/engine/task/local-graphql-query.js.map +1 -1
  53. package/dist-server/engine/task/log.js.map +1 -1
  54. package/dist-server/engine/task/mqtt-publish.js.map +1 -1
  55. package/dist-server/engine/task/mqtt-subscribe.js.map +1 -1
  56. package/dist-server/engine/task/oracle-procedure.js +1 -15
  57. package/dist-server/engine/task/oracle-procedure.js.map +1 -1
  58. package/dist-server/engine/task/pick-pending-scenario.js.map +1 -1
  59. package/dist-server/engine/task/publish.js.map +1 -1
  60. package/dist-server/engine/task/random.js.map +1 -1
  61. package/dist-server/engine/task/reset-pending-queue.js.map +1 -1
  62. package/dist-server/engine/task/script.js +1 -0
  63. package/dist-server/engine/task/script.js.map +1 -1
  64. package/dist-server/engine/task/set-domain.js.map +1 -1
  65. package/dist-server/engine/task/sleep.js.map +1 -1
  66. package/dist-server/engine/task/socket-listener.js.map +1 -1
  67. package/dist-server/engine/task/state-read.js.map +1 -1
  68. package/dist-server/engine/task/state-write.js.map +1 -1
  69. package/dist-server/engine/task/stop-scenario.js.map +1 -1
  70. package/dist-server/engine/task/sub-scenario.js.map +1 -1
  71. package/dist-server/engine/task/switch-goto.js.map +1 -1
  72. package/dist-server/engine/task/switch-range-goto.js.map +1 -1
  73. package/dist-server/engine/task/switch-range-scenario.js.map +1 -1
  74. package/dist-server/engine/task/switch-range-set.js.map +1 -1
  75. package/dist-server/engine/task/switch-scenario.js.map +1 -1
  76. package/dist-server/engine/task/switch-set.js.map +1 -1
  77. package/dist-server/engine/task/throw.js.map +1 -1
  78. package/dist-server/engine/task/utils/headless-pool-for-scenario.js +1 -1
  79. package/dist-server/engine/task/utils/headless-pool-for-scenario.js.map +1 -1
  80. package/dist-server/engine/task/variables.js.map +1 -1
  81. package/dist-server/engine/types.js.map +1 -1
  82. package/dist-server/index.js +1 -0
  83. package/dist-server/index.js.map +1 -1
  84. package/dist-server/restful/unstable/run-scenario.js.map +1 -1
  85. package/dist-server/restful/unstable/start-scenario.js +1 -1
  86. package/dist-server/restful/unstable/start-scenario.js.map +1 -1
  87. package/dist-server/restful/unstable/stop-scenario.js +1 -1
  88. package/dist-server/restful/unstable/stop-scenario.js.map +1 -1
  89. package/dist-server/service/connection/connection-mutation.js +4 -8
  90. package/dist-server/service/connection/connection-mutation.js.map +1 -1
  91. package/dist-server/service/connection/connection-query.js +17 -14
  92. package/dist-server/service/connection/connection-query.js.map +1 -1
  93. package/dist-server/service/connection/connection-subscription.js +11 -14
  94. package/dist-server/service/connection/connection-subscription.js.map +1 -1
  95. package/dist-server/service/connection/connection-type.js +66 -13
  96. package/dist-server/service/connection/connection-type.js.map +1 -1
  97. package/dist-server/service/scenario-instance/scenario-instance-mutation.js +4 -71
  98. package/dist-server/service/scenario-instance/scenario-instance-mutation.js.map +1 -1
  99. package/dist-server/service/scenario-instance/scenario-instance-subscription.js +8 -9
  100. package/dist-server/service/scenario-instance/scenario-instance-subscription.js.map +1 -1
  101. package/dist-server/service/scenario-instance/scenario-instance-type.js +18 -5
  102. package/dist-server/service/scenario-instance/scenario-instance-type.js.map +1 -1
  103. package/dist-server/service/scenario-queue/scenario-queue-subscription.js +4 -4
  104. package/dist-server/service/scenario-queue/scenario-queue-subscription.js.map +1 -1
  105. package/dist-server/service/step/step-type.js +41 -28
  106. package/dist-server/service/step/step-type.js.map +1 -1
  107. package/dist-server/tsconfig.tsbuildinfo +1 -1
  108. package/helps/integration/concept/script-internal-variables.ja.md +21 -1
  109. package/helps/integration/concept/script-internal-variables.ko.md +17 -0
  110. package/helps/integration/concept/script-internal-variables.md +18 -0
  111. package/helps/integration/concept/script-internal-variables.ms.md +19 -1
  112. package/helps/integration/concept/script-internal-variables.zh.md +18 -0
  113. package/helps/integration/connector/oracle-connector.ja.md +90 -0
  114. package/helps/integration/connector/oracle-connector.ko.md +87 -0
  115. package/helps/integration/connector/oracle-connector.md +46 -25
  116. package/helps/integration/connector/oracle-connector.ms.md +87 -0
  117. package/helps/integration/connector/oracle-connector.zh.md +87 -0
  118. package/helps/integration/task/script.ja.md +1 -1
  119. package/helps/integration/task/script.ko.md +1 -1
  120. package/helps/integration/task/script.md +1 -1
  121. package/helps/integration/task/script.ms.md +1 -1
  122. package/helps/integration/task/script.zh.md +1 -1
  123. package/openapi/unstable/scenario.yaml +100 -100
  124. package/openapi/unstable.yaml +11 -11
  125. package/package.json +8 -11
  126. package/server/controllers/index.ts +1 -0
  127. package/server/controllers/scenario-controller.ts +116 -0
  128. package/server/engine/connection-manager.ts +49 -7
  129. package/server/engine/connector/echo-back-connector.ts +4 -3
  130. package/server/engine/connector/echo-back-server.ts +5 -4
  131. package/server/engine/connector/graphql-connector.ts +12 -13
  132. package/server/engine/connector/http-connector.ts +4 -3
  133. package/server/engine/connector/mqtt-connector.ts +4 -3
  134. package/server/engine/connector/mssql-connector.ts +4 -3
  135. package/server/engine/connector/mysql-connector.ts +8 -6
  136. package/server/engine/connector/operato-connector.ts +27 -35
  137. package/server/engine/connector/oracle-connector.ts +136 -23
  138. package/server/engine/connector/postgresql-connector.ts +4 -3
  139. package/server/engine/connector/proxy-connector.ts +53 -0
  140. package/server/engine/connector/socket-server.ts +5 -4
  141. package/server/engine/connector/sqlite-connector.ts +5 -3
  142. package/server/engine/edge-client.ts +45 -0
  143. package/server/engine/index.ts +1 -0
  144. package/server/engine/task/book-up-scenario.ts +3 -1
  145. package/server/engine/task/csv-readline.ts +4 -1
  146. package/server/engine/task/data-accessor.ts +4 -1
  147. package/server/engine/task/data-mapper.ts +4 -1
  148. package/server/engine/task/database-query.ts +3 -1
  149. package/server/engine/task/echo-receive.ts +4 -1
  150. package/server/engine/task/echo-send.ts +3 -1
  151. package/server/engine/task/empty-check.ts +4 -1
  152. package/server/engine/task/end.ts +4 -1
  153. package/server/engine/task/floating-point.ts +4 -1
  154. package/server/engine/task/goto.ts +4 -1
  155. package/server/engine/task/graphql-mutate.ts +3 -1
  156. package/server/engine/task/graphql-query.ts +3 -1
  157. package/server/engine/task/headless-post.ts +4 -1
  158. package/server/engine/task/headless-scrap.ts +3 -1
  159. package/server/engine/task/http-get.ts +3 -1
  160. package/server/engine/task/http-post.ts +3 -1
  161. package/server/engine/task/jsonata.ts +5 -2
  162. package/server/engine/task/local-graphql-mutate.ts +5 -1
  163. package/server/engine/task/local-graphql-query.ts +3 -1
  164. package/server/engine/task/log.ts +3 -1
  165. package/server/engine/task/mqtt-publish.ts +3 -1
  166. package/server/engine/task/mqtt-subscribe.ts +3 -1
  167. package/server/engine/task/oracle-procedure.ts +4 -17
  168. package/server/engine/task/pick-pending-scenario.ts +3 -1
  169. package/server/engine/task/publish.ts +3 -1
  170. package/server/engine/task/random.ts +4 -1
  171. package/server/engine/task/reset-pending-queue.ts +3 -1
  172. package/server/engine/task/script.ts +5 -1
  173. package/server/engine/task/set-domain.ts +4 -1
  174. package/server/engine/task/sleep.ts +3 -1
  175. package/server/engine/task/socket-listener.ts +3 -1
  176. package/server/engine/task/state-read.ts +3 -1
  177. package/server/engine/task/state-write.ts +3 -1
  178. package/server/engine/task/stop-scenario.ts +3 -1
  179. package/server/engine/task/sub-scenario.ts +3 -1
  180. package/server/engine/task/switch-goto.ts +4 -1
  181. package/server/engine/task/switch-range-goto.ts +3 -1
  182. package/server/engine/task/switch-range-scenario.ts +3 -1
  183. package/server/engine/task/switch-range-set.ts +3 -1
  184. package/server/engine/task/switch-scenario.ts +3 -1
  185. package/server/engine/task/switch-set.ts +3 -1
  186. package/server/engine/task/throw.ts +3 -1
  187. package/server/engine/task/utils/headless-pool-for-scenario.ts +1 -1
  188. package/server/engine/task/variables.ts +3 -1
  189. package/server/engine/types.ts +80 -4
  190. package/server/index.ts +1 -0
  191. package/server/restful/unstable/run-scenario.ts +0 -1
  192. package/server/restful/unstable/start-scenario.ts +1 -1
  193. package/server/restful/unstable/stop-scenario.ts +1 -1
  194. package/server/service/connection/connection-mutation.ts +9 -29
  195. package/server/service/connection/connection-query.ts +13 -12
  196. package/server/service/connection/connection-subscription.ts +18 -24
  197. package/server/service/connection/connection-type.ts +100 -21
  198. package/server/service/scenario-instance/scenario-instance-mutation.ts +10 -121
  199. package/server/service/scenario-instance/scenario-instance-subscription.ts +16 -23
  200. package/server/service/scenario-instance/scenario-instance-type.ts +24 -13
  201. package/server/service/scenario-queue/scenario-queue-subscription.ts +7 -7
  202. 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
- Column,
4
- CreateDateColumn,
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
- @Column({
63
- nullable: true
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
- @Column({
72
- nullable: true
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
- var connector = ConnectionManager.getConnector(this.type)
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
- var connector = ConnectionManager.getConnector(this.type)
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 { getRepository, Domain, GraphqlLocalClient, ScalarObject } from '@things-factory/shell'
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
- const debug = require('debug')('things-factory:integration-base:scenario-instance-mutation')
12
-
13
- async function findScenario(
14
- scenarioName: string,
15
- domain: Domain
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
- const { domain, user, lng, unsafeIP, prohibitedPrivileges } = context.state
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
- const { domain, user, lng, unsafeIP, prohibitedPrivileges } = context.state
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
- @Arg('instanceName', { nullable: true }) instanceName: string,
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 { withFilter } from 'graphql-subscriptions'
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: (_, args, context, info) => {
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 withFilter(
28
- () => pubsub.asyncIterator('scenario-instance-log'),
29
- (payload, variables, context, info) => {
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
- )(_, args, context, info)
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: (_, args, context, info) => {
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 withFilter(
93
- () => pubsub.asyncIterator('scenario-instance-state'),
94
- (payload, variables, context, info) => {
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
- )(_, args, context, info)
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
- private message: string
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
- ScenarioInstanceStatus[state]
381
- }${message ? ' caused by ' + util.inspect(message, false, 2, true) : ''}`
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
- var handler = TaskRegistry.getTaskHandler(step.task)
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
- var retval: any = await handler(step, context)
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 { withFilter } from 'graphql-subscriptions'
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: (_, args, context, info) => {
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 withFilter(
39
- () => pubsub.asyncIterator('scenario-queue-state'),
40
- (payload, variables, context, info) => {
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
- )(_, args, context, info)
48
+ })
49
+ )
50
50
  }
51
51
  })
52
52
  scenarioQueueState(@Root() payload: { scenarioQueueState: ScenarioQueueState }): ScenarioQueueState {