@things-factory/integration-base 8.0.0-beta.9 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist-server/engine/connector/http-connector.js +1 -1
  2. package/dist-server/engine/connector/http-connector.js.map +1 -1
  3. package/dist-server/engine/connector/index.d.ts +0 -1
  4. package/dist-server/engine/connector/index.js +0 -1
  5. package/dist-server/engine/connector/index.js.map +1 -1
  6. package/dist-server/engine/index.d.ts +0 -1
  7. package/dist-server/engine/index.js +0 -1
  8. package/dist-server/engine/index.js.map +1 -1
  9. package/dist-server/engine/task/headless-post.js +33 -19
  10. package/dist-server/engine/task/headless-post.js.map +1 -1
  11. package/dist-server/engine/task/headless-scrap.js +13 -20
  12. package/dist-server/engine/task/headless-scrap.js.map +1 -1
  13. package/dist-server/tsconfig.tsbuildinfo +1 -1
  14. package/package.json +11 -12
  15. package/server/controllers/index.ts +2 -0
  16. package/server/controllers/publish-data.ts +29 -0
  17. package/server/controllers/scenario-controller.ts +156 -0
  18. package/server/engine/analyzer/analyze-integration.ts +115 -0
  19. package/server/engine/connection-manager.ts +239 -0
  20. package/server/engine/connector/echo-back-connector.ts +51 -0
  21. package/server/engine/connector/echo-back-server.ts +72 -0
  22. package/server/engine/connector/graphql-connector.ts +126 -0
  23. package/server/engine/connector/http-connector.ts +65 -0
  24. package/server/engine/connector/index.ts +12 -0
  25. package/server/engine/connector/mqtt-connector.ts +78 -0
  26. package/server/engine/connector/mssql-connector.ts +152 -0
  27. package/server/engine/connector/mysql-connector.ts +94 -0
  28. package/server/engine/connector/operato-connector.ts +264 -0
  29. package/server/engine/connector/oracle-connector.ts +218 -0
  30. package/server/engine/connector/postgresql-connector.ts +152 -0
  31. package/server/engine/connector/proxy-connector.ts +53 -0
  32. package/server/engine/connector/socket-server.ts +86 -0
  33. package/server/engine/connector/sqlite-connector.ts +69 -0
  34. package/server/engine/edge-client.ts +45 -0
  35. package/server/engine/index.ts +10 -0
  36. package/server/engine/pending-queue.ts +97 -0
  37. package/server/engine/scenario-engine.ts +106 -0
  38. package/server/engine/task/book-up-scenario.ts +73 -0
  39. package/server/engine/task/csv-readline.ts +127 -0
  40. package/server/engine/task/data-accessor.ts +36 -0
  41. package/server/engine/task/data-mapper.ts +47 -0
  42. package/server/engine/task/database-query.ts +56 -0
  43. package/server/engine/task/echo-receive.ts +21 -0
  44. package/server/engine/task/echo-send.ts +32 -0
  45. package/server/engine/task/empty-check.ts +38 -0
  46. package/server/engine/task/end.ts +18 -0
  47. package/server/engine/task/floating-point.ts +71 -0
  48. package/server/engine/task/goto.ts +27 -0
  49. package/server/engine/task/graphql-mutate.ts +79 -0
  50. package/server/engine/task/graphql-query.ts +78 -0
  51. package/server/engine/task/headless-post.ts +147 -0
  52. package/server/engine/task/headless-scrap.ts +80 -0
  53. package/server/engine/task/http-get.ts +117 -0
  54. package/server/engine/task/http-post.ts +148 -0
  55. package/server/engine/task/index.ts +45 -0
  56. package/server/engine/task/jsonata.ts +45 -0
  57. package/server/engine/task/local-graphql-mutate.ts +100 -0
  58. package/server/engine/task/local-graphql-query.ts +100 -0
  59. package/server/engine/task/log.ts +78 -0
  60. package/server/engine/task/mqtt-publish.ts +45 -0
  61. package/server/engine/task/mqtt-subscribe.ts +139 -0
  62. package/server/engine/task/mssql-procedure.ts +128 -0
  63. package/server/engine/task/oracle-procedure.ts +124 -0
  64. package/server/engine/task/pick-pending-scenario.ts +80 -0
  65. package/server/engine/task/publish.ts +40 -0
  66. package/server/engine/task/random.ts +53 -0
  67. package/server/engine/task/reset-pending-queue.ts +17 -0
  68. package/server/engine/task/script.ts +63 -0
  69. package/server/engine/task/set-domain.ts +37 -0
  70. package/server/engine/task/sleep.ts +34 -0
  71. package/server/engine/task/socket-listener.ts +96 -0
  72. package/server/engine/task/state-group-read.ts +69 -0
  73. package/server/engine/task/state-read.ts +56 -0
  74. package/server/engine/task/state-write.ts +65 -0
  75. package/server/engine/task/stop-scenario.ts +44 -0
  76. package/server/engine/task/sub-scenario.ts +57 -0
  77. package/server/engine/task/switch-goto.ts +43 -0
  78. package/server/engine/task/switch-range-goto.ts +53 -0
  79. package/server/engine/task/switch-range-scenario.ts +79 -0
  80. package/server/engine/task/switch-range-set.ts +48 -0
  81. package/server/engine/task/switch-scenario.ts +67 -0
  82. package/server/engine/task/switch-set.ts +37 -0
  83. package/server/engine/task/throw.ts +27 -0
  84. package/server/engine/task/utils/headless-pool-for-scenario.ts +71 -0
  85. package/server/engine/task/utils/substitute.ts +44 -0
  86. package/server/engine/task/variables.ts +17 -0
  87. package/server/engine/task-registry.ts +23 -0
  88. package/server/engine/types.ts +114 -0
  89. package/server/index.ts +20 -0
  90. package/server/migrations/index.ts +9 -0
  91. package/server/restful/index.ts +1 -0
  92. package/server/restful/unstable/index.ts +7 -0
  93. package/server/restful/unstable/run-scenario.ts +51 -0
  94. package/server/restful/unstable/scenario-instance.ts +52 -0
  95. package/server/restful/unstable/scenario-instances.ts +80 -0
  96. package/server/restful/unstable/scenario.ts +41 -0
  97. package/server/restful/unstable/scenarios.ts +69 -0
  98. package/server/restful/unstable/start-scenario.ts +33 -0
  99. package/server/restful/unstable/stop-scenario.ts +30 -0
  100. package/server/routers/scenario-schedule-callback-router.ts +69 -0
  101. package/server/routers/scenario-view-router.ts +46 -0
  102. package/server/routes.ts +30 -0
  103. package/server/service/analysis/analysis-query.ts +13 -0
  104. package/server/service/analysis/index.ts +3 -0
  105. package/server/service/connection/connection-mutation.ts +190 -0
  106. package/server/service/connection/connection-query.ts +87 -0
  107. package/server/service/connection/connection-subscription.ts +104 -0
  108. package/server/service/connection/connection-type.ts +288 -0
  109. package/server/service/connection/index.ts +7 -0
  110. package/server/service/connector/connector-query.ts +62 -0
  111. package/server/service/connector/connector-type.ts +29 -0
  112. package/server/service/connector/index.ts +4 -0
  113. package/server/service/index.ts +52 -0
  114. package/server/service/payload-log/index.ts +7 -0
  115. package/server/service/payload-log/payload-log-mutation.ts +151 -0
  116. package/server/service/payload-log/payload-log-query.ts +49 -0
  117. package/server/service/payload-log/payload-log-type.ts +36 -0
  118. package/server/service/payload-log/payload-log.ts +100 -0
  119. package/server/service/property-spec.ts +24 -0
  120. package/server/service/scenario/index.ts +6 -0
  121. package/server/service/scenario/scenario-mutation.ts +396 -0
  122. package/server/service/scenario/scenario-query.ts +109 -0
  123. package/server/service/scenario/scenario-type.ts +78 -0
  124. package/server/service/scenario/scenario.ts +124 -0
  125. package/server/service/scenario-flow/scenario-flow.ts +17 -0
  126. package/server/service/scenario-instance/index.ts +6 -0
  127. package/server/service/scenario-instance/scenario-instance-mutation.ts +44 -0
  128. package/server/service/scenario-instance/scenario-instance-query.ts +42 -0
  129. package/server/service/scenario-instance/scenario-instance-subscription.ts +118 -0
  130. package/server/service/scenario-instance/scenario-instance-type.ts +563 -0
  131. package/server/service/scenario-queue/index.ts +4 -0
  132. package/server/service/scenario-queue/scenario-queue-subscription.ts +55 -0
  133. package/server/service/scenario-queue/scenario-queue-type.ts +27 -0
  134. package/server/service/state-register/data-resolver.ts +56 -0
  135. package/server/service/state-register/index.ts +8 -0
  136. package/server/service/state-register/state-register-mutation.ts +166 -0
  137. package/server/service/state-register/state-register-query.ts +80 -0
  138. package/server/service/state-register/state-register-type.ts +80 -0
  139. package/server/service/state-register/state-register.ts +113 -0
  140. package/server/service/step/index.ts +6 -0
  141. package/server/service/step/step-mutation.ts +52 -0
  142. package/server/service/step/step-query.ts +55 -0
  143. package/server/service/step/step-type.ts +215 -0
  144. package/server/service/task-type/index.ts +4 -0
  145. package/server/service/task-type/task-type-query.ts +95 -0
  146. package/server/service/task-type/task-type-type.ts +29 -0
  147. package/translations/en.json +4 -12
  148. package/translations/ja.json +4 -12
  149. package/translations/ko.json +4 -12
  150. package/translations/ms.json +4 -12
  151. package/translations/zh.json +4 -12
  152. package/dist-server/engine/connector/headless-connector.d.ts +0 -23
  153. package/dist-server/engine/connector/headless-connector.js +0 -357
  154. package/dist-server/engine/connector/headless-connector.js.map +0 -1
  155. package/dist-server/engine/resource-pool/headless-pool.d.ts +0 -1
  156. package/dist-server/engine/resource-pool/headless-pool.js +0 -62
  157. package/dist-server/engine/resource-pool/headless-pool.js.map +0 -1
  158. package/dist-server/engine/resource-pool/index.d.ts +0 -1
  159. package/dist-server/engine/resource-pool/index.js +0 -5
  160. package/dist-server/engine/resource-pool/index.js.map +0 -1
@@ -0,0 +1,78 @@
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ObjectRef } from '@things-factory/shell'
4
+
5
+ import { Scenario } from './scenario'
6
+ import { StepPatch } from '../step/step-type'
7
+
8
+ @InputType()
9
+ export class NewScenario {
10
+ @Field()
11
+ name: string
12
+
13
+ @Field({ nullable: true })
14
+ description?: string
15
+
16
+ @Field({ nullable: true })
17
+ type?: string
18
+
19
+ @Field({ nullable: true })
20
+ schedule?: string
21
+
22
+ @Field({ nullable: true })
23
+ timezone?: string
24
+
25
+ @Field({ nullable: true })
26
+ ttl?: number
27
+
28
+ @Field({ nullable: true })
29
+ active?: boolean
30
+
31
+ @Field(type => ObjectRef, { nullable: true })
32
+ role?: ObjectRef
33
+ }
34
+
35
+ @InputType()
36
+ export class ScenarioPatch {
37
+ @Field(type => ID, { nullable: true })
38
+ id?: string
39
+
40
+ @Field({ nullable: true })
41
+ name?: string
42
+
43
+ @Field({ nullable: true })
44
+ description?: string
45
+
46
+ @Field({ nullable: true })
47
+ type?: string
48
+
49
+ @Field({ nullable: true })
50
+ schedule?: string
51
+
52
+ @Field({ nullable: true })
53
+ timezone?: string
54
+
55
+ @Field({ nullable: true })
56
+ ttl?: number
57
+
58
+ @Field({ nullable: true })
59
+ active?: boolean
60
+
61
+ @Field(type => [StepPatch], { nullable: true })
62
+ steps?: StepPatch[]
63
+
64
+ @Field(type => ObjectRef, { nullable: true })
65
+ role?: ObjectRef
66
+
67
+ @Field({ nullable: true })
68
+ cuFlag?: string
69
+ }
70
+
71
+ @ObjectType()
72
+ export class ScenarioList {
73
+ @Field(type => [Scenario])
74
+ items: Scenario[]
75
+
76
+ @Field(type => Int)
77
+ total: number
78
+ }
@@ -0,0 +1,124 @@
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ OneToMany,
9
+ PrimaryGeneratedColumn,
10
+ RelationId,
11
+ UpdateDateColumn
12
+ } from 'typeorm'
13
+
14
+ import { PrivilegeObject, Role, User } from '@things-factory/auth-base'
15
+ import { Domain } from '@things-factory/shell'
16
+
17
+ import { ScenarioEngine } from '../../engine'
18
+ import { Step } from '../step/step-type'
19
+
20
+ @Entity()
21
+ @Index('ix_scenario_0', (scenario: Scenario) => [scenario.domain, scenario.name], { unique: true })
22
+ @ObjectType()
23
+ export class Scenario {
24
+ @PrimaryGeneratedColumn('uuid')
25
+ @Field(type => ID)
26
+ id?: string
27
+
28
+ @ManyToOne(type => Domain)
29
+ @Field(type => Domain)
30
+ domain?: Domain
31
+
32
+ @RelationId((scenario: Scenario) => scenario.domain)
33
+ domainId?: string
34
+
35
+ @Column()
36
+ @Field()
37
+ name?: string
38
+
39
+ @Column({ nullable: true })
40
+ @Field({ nullable: true })
41
+ description?: string
42
+
43
+ @Column({ nullable: true })
44
+ @Field({ nullable: true })
45
+ type?: string
46
+
47
+ @Column({ nullable: true })
48
+ @Field({ nullable: true, description: 'accessible and executable system-wide' })
49
+ public?: boolean
50
+
51
+ @Column({ nullable: true })
52
+ @Field({ nullable: true, description: '[will be deprecated] automatically be started when this server start' })
53
+ active?: boolean
54
+
55
+ @Column({ nullable: true })
56
+ @Field({ nullable: true })
57
+ schedule?: string
58
+
59
+ @Column({ nullable: true })
60
+ @Field({ nullable: true })
61
+ scheduleId?: string
62
+
63
+ @Column({ nullable: true })
64
+ @Field({ nullable: true })
65
+ timezone?: string
66
+
67
+ @Column({ nullable: true })
68
+ @Field({ nullable: true })
69
+ ttl?: number
70
+
71
+ @OneToMany(type => Step, step => step.scenario)
72
+ @Field(type => [Step], { nullable: true })
73
+ steps?: Step[]
74
+
75
+ @Column({ type: 'simple-json', nullable: true })
76
+ @Field(type => PrivilegeObject, { nullable: true })
77
+ privilege?: PrivilegeObject
78
+
79
+ @ManyToOne(type => Role)
80
+ @Field(type => Role, { nullable: true })
81
+ role?: Role
82
+
83
+ @RelationId((scenario: Scenario) => scenario.role)
84
+ roleId?: string
85
+
86
+ @CreateDateColumn()
87
+ @Field({ nullable: true })
88
+ createdAt?: Date
89
+
90
+ @UpdateDateColumn()
91
+ @Field({ nullable: true })
92
+ updatedAt?: Date
93
+
94
+ @ManyToOne(type => User, { nullable: true })
95
+ @Field(type => User, { nullable: true })
96
+ creator?: User
97
+
98
+ @RelationId((scenario: Scenario) => scenario.creator)
99
+ creatorId?: string
100
+
101
+ @ManyToOne(type => User, { nullable: true })
102
+ @Field(type => User, { nullable: true })
103
+ updater?: User
104
+
105
+ @RelationId((scenario: Scenario) => scenario.updater)
106
+ updaterId?: string
107
+
108
+ async start(options?: { instanceName?: string; domain?: Domain; user?: User; variables?: any }) {
109
+ try {
110
+ await ScenarioEngine.load(options?.instanceName || this.name, this, {
111
+ domain: options?.domain || this.domain,
112
+ user: options?.user || this.updater,
113
+ variables: options?.variables
114
+ })
115
+ } catch (ex) {}
116
+ }
117
+
118
+ async stop(options?: { instanceName?: string; domain?: Domain; user?: User }) {
119
+ try {
120
+ await ScenarioEngine.unload(options?.domain || this.domain, options?.instanceName || this.name)
121
+ } finally {
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,17 @@
1
+ import { Domain } from '@things-factory/shell'
2
+ import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'
3
+
4
+ @Entity()
5
+ @Index('ix_scenario_flows_0', (scenarioFlow: ScenarioFlow) => [scenarioFlow.domain], { unique: true })
6
+ export class ScenarioFlow {
7
+ @PrimaryGeneratedColumn('uuid')
8
+ id: string
9
+
10
+ @ManyToOne(type => Domain)
11
+ domain: Domain
12
+
13
+ @Column({
14
+ nullable: true
15
+ })
16
+ flow: string
17
+ }
@@ -0,0 +1,6 @@
1
+ import { ScenarioInstanceQuery } from './scenario-instance-query'
2
+ import { ScenarioInstanceMutation } from './scenario-instance-mutation'
3
+ import { ScenarioInstanceSubscription } from './scenario-instance-subscription'
4
+
5
+ export const entities = []
6
+ export const resolvers = [ScenarioInstanceQuery, ScenarioInstanceMutation, ScenarioInstanceSubscription]
@@ -0,0 +1,44 @@
1
+ import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'
2
+
3
+ import { ScalarObject } from '@things-factory/shell'
4
+
5
+ import { ScenarioInstance, ScenarioInstanceRunResult } from './scenario-instance-type'
6
+
7
+ import {
8
+ runScenario as controllerRunScenario,
9
+ startScenario as controllerStartScenario,
10
+ stopScenario as controllerStopScenario
11
+ } from '../../controllers/scenario-controller'
12
+
13
+ @Resolver(ScenarioInstance)
14
+ export class ScenarioInstanceMutation {
15
+ @Mutation(returns => ScenarioInstanceRunResult, {
16
+ description: 'To run new scenario instance and will return the result after the scenario stop.'
17
+ })
18
+ async runScenario(
19
+ @Arg('instanceName', { nullable: true }) instanceName: string,
20
+ @Arg('scenarioName') scenarioName: string,
21
+ @Arg('variables', type => ScalarObject, { nullable: true }) variables: any,
22
+ @Ctx() context: ResolverContext
23
+ ): Promise<ScenarioInstanceRunResult> {
24
+ return await controllerRunScenario(instanceName, scenarioName, variables, context)
25
+ }
26
+
27
+ @Mutation(returns => ScenarioInstance, { description: 'To start new scenario instance' })
28
+ async startScenario(
29
+ @Arg('instanceName', { nullable: true }) instanceName: string,
30
+ @Arg('scenarioName') scenarioName: string,
31
+ @Arg('variables', type => ScalarObject, { nullable: true }) variables: any,
32
+ @Ctx() context: ResolverContext
33
+ ): Promise<ScenarioInstance> {
34
+ return await controllerStartScenario(instanceName, scenarioName, variables, context)
35
+ }
36
+
37
+ @Mutation(returns => ScenarioInstance, { nullable: true, description: 'To start new scenario instance' })
38
+ async stopScenario(
39
+ @Arg('instanceName', { nullable: true }) instanceName: string,
40
+ @Ctx() context: ResolverContext
41
+ ): Promise<ScenarioInstance | undefined> {
42
+ return await controllerStopScenario(instanceName, context)
43
+ }
44
+ }
@@ -0,0 +1,42 @@
1
+ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+
3
+ import { ListParam, ScalarObject } from '@things-factory/shell'
4
+
5
+ import { ScenarioEngine } from '../../engine'
6
+ import {
7
+ ScenarioInstance,
8
+ ScenarioInstanceList,
9
+ ScenarioInstanceProgress,
10
+ ScenarioInstanceStatus
11
+ } from './scenario-instance-type'
12
+
13
+ @Resolver(ScenarioInstance)
14
+ export class ScenarioInstanceQuery {
15
+ @Query(returns => ScenarioInstance, { description: 'To fetch a scenario instance' })
16
+ async scenarioInstance(
17
+ @Arg('instanceName') instanceName: string,
18
+ @Ctx() context: ResolverContext
19
+ ): Promise<ScenarioInstance> {
20
+ const { domain } = context.state
21
+
22
+ return ScenarioEngine.getScenarioInstance(domain, instanceName)
23
+ }
24
+
25
+ @Query(returns => ScenarioInstanceList, { description: 'To fetch multiple scenario instances' })
26
+ async scenarioInstances(
27
+ @Args(type => ListParam) params: ListParam,
28
+ @Ctx() context: ResolverContext
29
+ ): Promise<ScenarioInstanceList> {
30
+ const { domain } = context.state
31
+
32
+ var scenarioInstances = ScenarioEngine.getScenarioInstances(domain)
33
+
34
+ /* IMPLEMENT-ME 검색 기능.. */
35
+ var items = scenarioInstances
36
+
37
+ return {
38
+ items,
39
+ total: items.length
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,118 @@
1
+ import { Resolver, Subscription, Root, Arg } from 'type-graphql'
2
+ import { filter, pipe } from 'graphql-yoga'
3
+ import { pubsub, Log } from '@things-factory/shell'
4
+ import { ScenarioInstance, ScenarioInstanceState } from './scenario-instance-type'
5
+ import { ScenarioEngine } from '../../engine'
6
+
7
+ const debug = require('debug')('things-factory:integration:scenario-instance-subscription')
8
+
9
+ @Resolver(ScenarioInstance)
10
+ export class ScenarioInstanceSubscription {
11
+ @Subscription({
12
+ subscribe: ({ args, context, info }) => {
13
+ const { domain, user } = context.state
14
+ const { instanceName, scenarioName, level } = args
15
+ const subdomain = domain?.subdomain
16
+
17
+ debug('subscribe', subdomain, scenarioName, instanceName)
18
+
19
+ if (!domain) {
20
+ throw new Error('domain required')
21
+ }
22
+
23
+ if (!user.domains?.find(d => d.subdomain === subdomain) && !process.superUserGranted(domain, user)) {
24
+ throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)
25
+ }
26
+
27
+ return pipe(
28
+ pubsub.subscribe('scenario-instance-log'),
29
+ filter((payload: { scenarioInstanceLog: Log }) => {
30
+ const { source, level: plevel } = payload.scenarioInstanceLog
31
+ const { domain: pdomain, scenarioName: pscenarioName, instanceName: pinstanceName } = source as any
32
+
33
+ if (subdomain !== pdomain?.subdomain) {
34
+ return false
35
+ }
36
+
37
+ if (scenarioName && pscenarioName !== scenarioName) {
38
+ return false
39
+ }
40
+
41
+ if (instanceName && pinstanceName !== instanceName) {
42
+ return false
43
+ }
44
+
45
+ if (level && level !== plevel) {
46
+ return false
47
+ }
48
+
49
+ return true
50
+ })
51
+ )
52
+ }
53
+ })
54
+ scenarioInstanceLog(
55
+ @Root() payload: { scenarioInstanceLog: Log },
56
+ @Arg('scenarioName', { nullable: true }) scenarioName: string,
57
+ @Arg('instanceName', { nullable: true }) instanceName: string,
58
+ @Arg('level', { nullable: true }) level: string
59
+ ): Log {
60
+ return payload.scenarioInstanceLog
61
+ }
62
+
63
+ @Subscription({
64
+ subscribe: ({ args, context, info }) => {
65
+ const { domain, user } = context.state
66
+ const { instanceName, scenarioName } = args
67
+ const subdomain = domain?.subdomain
68
+
69
+ debug('subscribe', subdomain, scenarioName, instanceName)
70
+
71
+ if (!domain) {
72
+ throw new Error('domain required')
73
+ }
74
+
75
+ if (!user.domains?.find(d => d.subdomain === subdomain) && !process.superUserGranted(domain, user)) {
76
+ throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)
77
+ }
78
+
79
+ process.nextTick(() => {
80
+ ScenarioEngine.getScenarioInstances(domain)
81
+ .filter(instance => {
82
+ return (!instanceName || instance.instanceName === instanceName) && (!scenarioName || instance.scenarioName === scenarioName)
83
+ })
84
+ .forEach(instance => {
85
+ instance.publishState()
86
+ })
87
+ })
88
+
89
+ return pipe(
90
+ pubsub.subscribe('scenario-instance-state'),
91
+ filter((payload: { scenarioInstanceState: ScenarioInstanceState }) => {
92
+ const { domain: pdomain, scenarioName: pscenarioName, instanceName: pinstanceName } = payload.scenarioInstanceState
93
+
94
+ if (subdomain !== pdomain?.subdomain) {
95
+ return false
96
+ }
97
+
98
+ if (scenarioName && pscenarioName !== scenarioName) {
99
+ return false
100
+ }
101
+
102
+ if (instanceName && pinstanceName !== instanceName) {
103
+ return false
104
+ }
105
+
106
+ return true
107
+ })
108
+ )
109
+ }
110
+ })
111
+ scenarioInstanceState(
112
+ @Root() payload: { scenarioInstanceState: ScenarioInstanceState },
113
+ @Arg('scenarioName', { nullable: true }) scenarioName: string,
114
+ @Arg('instanceName', { nullable: true }) instanceName: string
115
+ ): ScenarioInstanceState {
116
+ return payload.scenarioInstanceState
117
+ }
118
+ }