@operato/scene-integration 0.0.5 → 0.0.9

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 (52) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/connection-control.d.ts +41 -0
  3. package/dist/connection-control.js +137 -0
  4. package/dist/connection-control.js.map +1 -0
  5. package/dist/connection-state-subscription.d.ts +29 -0
  6. package/dist/connection-state-subscription.js +89 -0
  7. package/dist/connection-state-subscription.js.map +1 -0
  8. package/dist/data-subscription.d.ts +29 -0
  9. package/dist/data-subscription.js +76 -0
  10. package/dist/data-subscription.js.map +1 -0
  11. package/dist/editors/index.d.ts +2 -0
  12. package/dist/editors/index.js +2 -0
  13. package/dist/editors/index.js.map +1 -0
  14. package/dist/index.d.ts +11 -0
  15. package/dist/index.js +21 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/origin-client.d.ts +5 -0
  18. package/dist/origin-client.js +110 -0
  19. package/dist/origin-client.js.map +1 -0
  20. package/dist/scenario-control.d.ts +44 -0
  21. package/dist/scenario-control.js +142 -0
  22. package/dist/scenario-control.js.map +1 -0
  23. package/dist/scenario-instance-subscription.d.ts +34 -0
  24. package/dist/scenario-instance-subscription.js +107 -0
  25. package/dist/scenario-instance-subscription.js.map +1 -0
  26. package/dist/scenario-queue-subscription.d.ts +22 -0
  27. package/dist/scenario-queue-subscription.js +68 -0
  28. package/dist/scenario-queue-subscription.js.map +1 -0
  29. package/dist/scenario-run.d.ts +39 -0
  30. package/dist/scenario-run.js +136 -0
  31. package/dist/scenario-run.js.map +1 -0
  32. package/dist/scenario-start.d.ts +39 -0
  33. package/dist/scenario-start.js +134 -0
  34. package/dist/scenario-start.js.map +1 -0
  35. package/dist/scenario-stop.d.ts +39 -0
  36. package/dist/scenario-stop.js +122 -0
  37. package/dist/scenario-stop.js.map +1 -0
  38. package/package.json +4 -4
  39. package/src/connection-control.ts +1 -5
  40. package/src/connection-state-subscription.ts +2 -7
  41. package/src/data-subscription.ts +1 -6
  42. package/src/editors/index.ts +1 -0
  43. package/src/origin-client.ts +0 -3
  44. package/src/scenario-control.ts +0 -3
  45. package/src/scenario-instance-subscription.ts +2 -7
  46. package/src/scenario-queue-subscription.ts +1 -6
  47. package/src/scenario-run.ts +0 -3
  48. package/src/scenario-start.ts +0 -3
  49. package/src/scenario-stop.ts +0 -3
  50. package/tsconfig.json +1 -1
  51. package/tsconfig.tsbuildinfo +1 -1
  52. package/src/editors/index.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-client.js","sourceRoot":"","sources":["../src/origin-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApolloClient, HttpLink, InMemoryCache, from } from '@apollo/client/core'\nimport { ErrorResponse, onError } from '@apollo/client/link/error'\n\nimport { DefaultOptions } from '@apollo/client'\nimport { SubscriptionClient } from 'subscriptions-transport-ws'\n\nconst defaultOptions: DefaultOptions = {\n watchQuery: {\n fetchPolicy: 'no-cache',\n errorPolicy: 'ignore'\n },\n query: {\n fetchPolicy: 'no-cache', //'network-only'\n errorPolicy: 'all'\n },\n mutate: {\n errorPolicy: 'all'\n }\n}\n\nconst ERROR_HANDLER = ({ graphQLErrors, networkError }: ErrorResponse) => {\n if (graphQLErrors) {\n document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n level: 'error',\n message: graphQLErrors[0].message,\n ex: graphQLErrors\n }\n })\n )\n }\n\n if (networkError) {\n const code = (networkError as any).statusCode || ''\n const message = `[Response-${code}]: ${networkError.message}`\n\n document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n level: 'error',\n message,\n ex: networkError\n }\n })\n )\n }\n}\n\nvar client: ApolloClient<any>\n\nexport function getClient() {\n if (!client) {\n var cache = new InMemoryCache()\n client = new ApolloClient({\n defaultOptions,\n cache,\n link: from([\n onError(ERROR_HANDLER),\n new HttpLink({\n uri: '/graphql',\n credentials: 'include'\n })\n ])\n })\n }\n\n return client\n}\n\n/* SubscriptionClient */\nvar subscriptionClient: Promise<SubscriptionClient> | null\n\nconst getSubscriptionClient = async () => {\n if (!subscriptionClient) {\n subscriptionClient = new Promise((resolve, reject) => {\n var client = new SubscriptionClient(location.origin.replace(/^http/, 'ws') + '/subscriptions', {\n reconnect: true,\n connectionParams: {\n headers: {\n /* \n 특정 도메인의 데이타만 받고자 하는 경우에, referer 정보를 제공해서 서버에서 서브도메인 정보를 취득하도록 한다.\n referer: location.href\n 또는, 이미 서브도메인 정보를 알고 있다면,\n 'x-things-factory-domain': '[subdomain]'\n 을 보낼 수 있다.\n 관련 정보를 보내지 않는다면, 사용자가 권한을 가진 모든 도메인의 데이타를 수신하게 된다.\n */\n referer: location.href\n }\n }\n })\n\n client.onError(err => {\n //readyState === 3 인 경우 url을 잘 못 입력했거나, 서버에 문제가 있는 경우이므로 reconnect = false로 변경한다.\n if (client.status === 3) {\n // client.reconnect = false // reconnect is private property\n client.close(true)\n }\n reject(err)\n })\n\n client.onConnected(() => {\n resolve(client)\n })\n })\n }\n\n return await subscriptionClient\n}\n\nvar subscriptions: (() => void)[] = []\n\nexport const subscribe = async (request: any, subscribe: any) => {\n var client = await getSubscriptionClient()\n var { unsubscribe } = client.request(request).subscribe(subscribe)\n\n subscriptions.push(unsubscribe)\n\n return {\n unsubscribe() {\n subscriptions.splice(subscriptions.indexOf(unsubscribe), 1)\n unsubscribe()\n\n if (subscriptions.length == 0) {\n client.unsubscribeAll()\n client.close(true)\n\n subscriptionClient = null\n }\n }\n }\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import { Properties, Shape } from '@hatiolab/things-scene';
2
+ declare const ScenarioControl_base: (new (...args: any[]) => {
3
+ isDataSource(): boolean;
4
+ }) & typeof Shape;
5
+ export default class ScenarioControl extends ScenarioControl_base {
6
+ static _image: HTMLImageElement;
7
+ static get image(): HTMLImageElement;
8
+ private _client;
9
+ render(context: CanvasRenderingContext2D): void;
10
+ ready(): void;
11
+ _initScenario(): void;
12
+ dispose(): void;
13
+ get nature(): {
14
+ mutable: boolean;
15
+ resizable: boolean;
16
+ rotatable: boolean;
17
+ properties: ({
18
+ type: string;
19
+ label: string;
20
+ name: string;
21
+ property: {
22
+ options: () => Promise<string[]>;
23
+ };
24
+ } | {
25
+ type: string;
26
+ label: string;
27
+ name: string;
28
+ property: {
29
+ options: {
30
+ display: string;
31
+ value: string;
32
+ }[];
33
+ };
34
+ })[];
35
+ 'value-property': string;
36
+ help: string;
37
+ };
38
+ onchange(after: Properties): void;
39
+ get client(): any;
40
+ get controlType(): any;
41
+ set controlType(controlType: any);
42
+ requestData(): Promise<void>;
43
+ }
44
+ export {};
@@ -0,0 +1,142 @@
1
+ import { Component, DataSource, RectPath, Shape } from '@hatiolab/things-scene';
2
+ import COMPONENT_IMAGE from '../assets/symbol-scenario-control.png';
3
+ import { getClient } from './origin-client';
4
+ import gql from 'graphql-tag';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [
10
+ {
11
+ type: 'select',
12
+ label: 'scenario-name',
13
+ name: 'scenarioName',
14
+ property: {
15
+ options: async () => {
16
+ var response = await getClient().query({
17
+ query: gql `
18
+ query {
19
+ scenarios {
20
+ items {
21
+ name
22
+ }
23
+ }
24
+ }
25
+ `
26
+ });
27
+ if (response.errors) {
28
+ return [''];
29
+ }
30
+ return [''].concat(response.data.scenarios.items.map((item) => item.name));
31
+ }
32
+ }
33
+ },
34
+ {
35
+ type: 'select',
36
+ label: 'control-type',
37
+ name: 'controlType',
38
+ property: {
39
+ options: [
40
+ {
41
+ display: '',
42
+ value: ''
43
+ },
44
+ {
45
+ display: 'start',
46
+ value: 'start'
47
+ },
48
+ {
49
+ display: 'stop',
50
+ value: 'stop'
51
+ }
52
+ ]
53
+ }
54
+ }
55
+ ],
56
+ 'value-property': 'controlType',
57
+ help: 'scene/component/scenario-control'
58
+ };
59
+ export default class ScenarioControl extends DataSource(RectPath(Shape)) {
60
+ static get image() {
61
+ if (!ScenarioControl._image) {
62
+ ScenarioControl._image = new Image();
63
+ ScenarioControl._image.src = COMPONENT_IMAGE;
64
+ }
65
+ return ScenarioControl._image;
66
+ }
67
+ render(context) {
68
+ var { left, top, width, height } = this.bounds;
69
+ context.beginPath();
70
+ this.drawImage(context, ScenarioControl.image, left, top, width, height);
71
+ }
72
+ ready() {
73
+ super.ready();
74
+ this._initScenario();
75
+ }
76
+ _initScenario() {
77
+ if (!this.app.isViewMode)
78
+ return;
79
+ this._client = getClient();
80
+ this.requestData();
81
+ }
82
+ dispose() {
83
+ super.dispose();
84
+ try {
85
+ if (this._client) {
86
+ this._client.stop();
87
+ }
88
+ }
89
+ catch (e) {
90
+ console.error(e);
91
+ }
92
+ delete this._client;
93
+ }
94
+ get nature() {
95
+ return NATURE;
96
+ }
97
+ onchange(after) {
98
+ if ('controlType' in after) {
99
+ this.requestData();
100
+ }
101
+ }
102
+ get client() {
103
+ return this._client;
104
+ }
105
+ get controlType() {
106
+ return this.getState('controlType');
107
+ }
108
+ set controlType(controlType) {
109
+ this.setState('controlType', controlType);
110
+ }
111
+ async requestData() {
112
+ let { controlType, scenarioName } = this.state;
113
+ if (!controlType || !scenarioName || !this.app.isViewMode)
114
+ return;
115
+ var client = this._client;
116
+ var query = '';
117
+ if (controlType == 'start') {
118
+ query = `mutation{
119
+ ${controlType}Scenario(instanceName: "${scenarioName}", scenarioName: "${scenarioName}", variables: {}) {
120
+ state
121
+ }
122
+ }`;
123
+ }
124
+ else {
125
+ query = `mutation{
126
+ ${controlType}Scenario(instanceName: "${scenarioName}") {
127
+ state
128
+ }
129
+ }`;
130
+ }
131
+ if (client) {
132
+ var response = await client.query({
133
+ query: gql `
134
+ ${query}
135
+ `
136
+ });
137
+ this.data = response;
138
+ }
139
+ }
140
+ }
141
+ Component.register('scenario-control', ScenarioControl);
142
+ //# sourceMappingURL=scenario-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-control.js","sourceRoot":"","sources":["../src/scenario-control.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, DataSource, Properties, RectPath, Shape } from '@hatiolab/things-scene'\n\nimport COMPONENT_IMAGE from '../assets/symbol-scenario-control.png'\nimport { getClient } from './origin-client'\nimport gql from 'graphql-tag'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'select',\n label: 'scenario-name',\n name: 'scenarioName',\n property: {\n options: async () => {\n var response = await getClient().query({\n query: gql`\n query {\n scenarios {\n items {\n name\n }\n }\n }\n `\n })\n if (response.errors) {\n return ['']\n }\n\n return [''].concat(response.data.scenarios.items.map((item: any) => item.name))\n }\n }\n },\n {\n type: 'select',\n label: 'control-type',\n name: 'controlType',\n property: {\n options: [\n {\n display: '',\n value: ''\n },\n {\n display: 'start',\n value: 'start'\n },\n {\n display: 'stop',\n value: 'stop'\n }\n ]\n }\n }\n ],\n 'value-property': 'controlType',\n help: 'scene/component/scenario-control'\n}\n\nexport default class ScenarioControl extends DataSource(RectPath(Shape)) {\n static _image: HTMLImageElement\n\n static get image() {\n if (!ScenarioControl._image) {\n ScenarioControl._image = new Image()\n ScenarioControl._image.src = COMPONENT_IMAGE\n }\n return ScenarioControl._image\n }\n\n private _client: any\n\n render(context: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n context.beginPath()\n this.drawImage(context, ScenarioControl.image, left, top, width, height)\n }\n\n ready() {\n super.ready()\n this._initScenario()\n }\n\n _initScenario() {\n if (!this.app.isViewMode) return\n\n this._client = getClient()\n this.requestData()\n }\n\n dispose() {\n super.dispose()\n\n try {\n if (this._client) {\n this._client.stop()\n }\n } catch (e) {\n console.error(e)\n }\n delete this._client\n }\n\n get nature() {\n return NATURE\n }\n\n onchange(after: Properties) {\n if ('controlType' in after) {\n this.requestData()\n }\n }\n\n get client() {\n return this._client\n }\n\n get controlType() {\n return this.getState('controlType')\n }\n\n set controlType(controlType) {\n this.setState('controlType', controlType)\n }\n\n async requestData() {\n let { controlType, scenarioName } = this.state\n if (!controlType || !scenarioName || !this.app.isViewMode) return\n var client = this._client\n var query = ''\n if (controlType == 'start') {\n query = `mutation{\n ${controlType}Scenario(instanceName: \"${scenarioName}\", scenarioName: \"${scenarioName}\", variables: {}) {\n state\n }\n }`\n } else {\n query = `mutation{\n ${controlType}Scenario(instanceName: \"${scenarioName}\") {\n state\n }\n }`\n }\n\n if (client) {\n var response = await client.query({\n query: gql`\n ${query}\n `\n })\n\n this.data = response\n }\n }\n}\n\nComponent.register('scenario-control', ScenarioControl)\n"]}
@@ -0,0 +1,34 @@
1
+ import { Shape } from '@hatiolab/things-scene';
2
+ declare const ScenarioInstanceSubscription_base: (new (...args: any[]) => {
3
+ isDataSource(): boolean;
4
+ }) & typeof Shape;
5
+ export default class ScenarioInstanceSubscription extends ScenarioInstanceSubscription_base {
6
+ static _image: HTMLImageElement;
7
+ static get image(): HTMLImageElement;
8
+ private subscription?;
9
+ dispose(): void;
10
+ render(context: CanvasRenderingContext2D): void;
11
+ ready(): void;
12
+ get nature(): {
13
+ mutable: boolean;
14
+ resizable: boolean;
15
+ rotatable: boolean;
16
+ properties: ({
17
+ type: string;
18
+ label: string;
19
+ name: string;
20
+ property: {
21
+ options: () => Promise<string[]>;
22
+ };
23
+ } | {
24
+ type: string;
25
+ label: string;
26
+ name: string;
27
+ property?: undefined;
28
+ })[];
29
+ help: string;
30
+ };
31
+ _initScenarioInstanceSubscription(): void;
32
+ startSubscribe(): Promise<void>;
33
+ }
34
+ export {};
@@ -0,0 +1,107 @@
1
+ import { Component, DataSource, RectPath, Shape } from '@hatiolab/things-scene';
2
+ import { getClient, subscribe } from './origin-client';
3
+ import COMPONENT_IMAGE from '../assets/symbol-scenario-instance-subscription.png';
4
+ import gql from 'graphql-tag';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [
10
+ {
11
+ type: 'select',
12
+ label: 'scenario-name',
13
+ name: 'scenarioName',
14
+ property: {
15
+ options: async () => {
16
+ var response = await getClient().query({
17
+ query: gql `
18
+ query {
19
+ scenarios {
20
+ items {
21
+ name
22
+ }
23
+ }
24
+ }
25
+ `
26
+ });
27
+ if (response.errors) {
28
+ return [''];
29
+ }
30
+ return [''].concat(response.data.scenarios.items.map((item) => item.name));
31
+ }
32
+ }
33
+ },
34
+ {
35
+ type: 'string',
36
+ label: 'instance-name',
37
+ name: 'instanceName'
38
+ }
39
+ ],
40
+ help: 'scene/component/scenario-instance-subscription'
41
+ };
42
+ export default class ScenarioInstanceSubscription extends DataSource(RectPath(Shape)) {
43
+ static get image() {
44
+ if (!ScenarioInstanceSubscription._image) {
45
+ ScenarioInstanceSubscription._image = new Image();
46
+ ScenarioInstanceSubscription._image.src = COMPONENT_IMAGE;
47
+ }
48
+ return ScenarioInstanceSubscription._image;
49
+ }
50
+ dispose() {
51
+ var _a;
52
+ super.dispose();
53
+ (_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
54
+ delete this.subscription;
55
+ }
56
+ render(context) {
57
+ var { left, top, width, height } = this.bounds;
58
+ context.beginPath();
59
+ this.drawImage(context, ScenarioInstanceSubscription.image, left, top, width, height);
60
+ }
61
+ ready() {
62
+ if (!this.app.isViewMode)
63
+ return;
64
+ this._initScenarioInstanceSubscription();
65
+ }
66
+ get nature() {
67
+ return NATURE;
68
+ }
69
+ _initScenarioInstanceSubscription() {
70
+ if (!this.app.isViewMode)
71
+ return;
72
+ this.startSubscribe();
73
+ }
74
+ async startSubscribe() {
75
+ var { instanceName, scenarioName = '' } = this.state;
76
+ instanceName = instanceName || scenarioName;
77
+ this.subscription = await subscribe({
78
+ query: gql `
79
+ subscription {
80
+ scenarioInstanceState(instanceName: "${instanceName}", scenarioName: "${scenarioName}") {
81
+ instanceName
82
+ scenarioName
83
+ state
84
+ variables
85
+ progress{
86
+ rounds
87
+ rate
88
+ steps
89
+ step
90
+ }
91
+ data
92
+ message
93
+ timestamp
94
+ }
95
+ }
96
+ `
97
+ }, {
98
+ next: async ({ data }) => {
99
+ if (data) {
100
+ this.data = data.scenarioInstanceState;
101
+ }
102
+ }
103
+ });
104
+ }
105
+ }
106
+ Component.register('scenario-instance-subscription', ScenarioInstanceSubscription);
107
+ //# sourceMappingURL=scenario-instance-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-instance-subscription.js","sourceRoot":"","sources":["../src/scenario-instance-subscription.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, DataSource, RectPath, Shape } from '@hatiolab/things-scene'\nimport { getClient, subscribe } from './origin-client'\n\nimport COMPONENT_IMAGE from '../assets/symbol-scenario-instance-subscription.png'\nimport gql from 'graphql-tag'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'select',\n label: 'scenario-name',\n name: 'scenarioName',\n property: {\n options: async () => {\n var response = await getClient().query({\n query: gql`\n query {\n scenarios {\n items {\n name\n }\n }\n }\n `\n })\n if (response.errors) {\n return ['']\n }\n\n return [''].concat(response.data.scenarios.items.map((item: any) => item.name))\n }\n }\n },\n {\n type: 'string',\n label: 'instance-name',\n name: 'instanceName'\n }\n ],\n help: 'scene/component/scenario-instance-subscription'\n}\n\nexport default class ScenarioInstanceSubscription extends DataSource(RectPath(Shape)) {\n static _image: HTMLImageElement\n\n static get image() {\n if (!ScenarioInstanceSubscription._image) {\n ScenarioInstanceSubscription._image = new Image()\n ScenarioInstanceSubscription._image.src = COMPONENT_IMAGE\n }\n\n return ScenarioInstanceSubscription._image\n }\n\n private subscription?: {\n unsubscribe(): void\n }\n\n dispose() {\n super.dispose()\n\n this.subscription?.unsubscribe()\n delete this.subscription\n }\n\n render(context: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n\n context.beginPath()\n this.drawImage(context, ScenarioInstanceSubscription.image, left, top, width, height)\n }\n\n ready() {\n if (!this.app.isViewMode) return\n this._initScenarioInstanceSubscription()\n }\n\n get nature() {\n return NATURE\n }\n\n _initScenarioInstanceSubscription() {\n if (!this.app.isViewMode) return\n this.startSubscribe()\n }\n\n async startSubscribe() {\n var { instanceName, scenarioName = '' } = this.state\n\n instanceName = instanceName || scenarioName\n\n this.subscription = await subscribe(\n {\n query: gql`\n subscription {\n scenarioInstanceState(instanceName: \"${instanceName}\", scenarioName: \"${scenarioName}\") {\n instanceName\n scenarioName\n state\n variables\n progress{\n rounds\n rate\n steps\n step\n }\n data\n message\n timestamp\n }\n }\n `\n },\n {\n next: async ({ data }: { data: any }) => {\n if (data) {\n this.data = data.scenarioInstanceState\n }\n }\n }\n )\n }\n}\n\nComponent.register('scenario-instance-subscription', ScenarioInstanceSubscription)\n"]}
@@ -0,0 +1,22 @@
1
+ import { Shape } from '@hatiolab/things-scene';
2
+ declare const ScenarioQueueSubscription_base: (new (...args: any[]) => {
3
+ isDataSource(): boolean;
4
+ }) & typeof Shape;
5
+ export default class ScenarioQueueSubscription extends ScenarioQueueSubscription_base {
6
+ static _image: HTMLImageElement;
7
+ static get image(): HTMLImageElement;
8
+ private subscription?;
9
+ dispose(): void;
10
+ render(context: CanvasRenderingContext2D): void;
11
+ ready(): void;
12
+ get nature(): {
13
+ mutable: boolean;
14
+ resizable: boolean;
15
+ rotatable: boolean;
16
+ properties: never[];
17
+ help: string;
18
+ };
19
+ _initScenarioQueueSubscription(): void;
20
+ startSubscribe(): Promise<void>;
21
+ }
22
+ export {};
@@ -0,0 +1,68 @@
1
+ import { Component, DataSource, RectPath, Shape } from '@hatiolab/things-scene';
2
+ import COMPONENT_IMAGE from '../assets/symbol-scenario-queue-subscription.png';
3
+ import gql from 'graphql-tag';
4
+ import { subscribe } from './origin-client';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [],
10
+ help: 'scene/component/scenario-queue-subscription'
11
+ };
12
+ export default class ScenarioQueueSubscription extends DataSource(RectPath(Shape)) {
13
+ static get image() {
14
+ if (!ScenarioQueueSubscription._image) {
15
+ ScenarioQueueSubscription._image = new Image();
16
+ ScenarioQueueSubscription._image.src = COMPONENT_IMAGE;
17
+ }
18
+ return ScenarioQueueSubscription._image;
19
+ }
20
+ dispose() {
21
+ var _a;
22
+ super.dispose();
23
+ (_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
24
+ delete this.subscription;
25
+ }
26
+ render(context) {
27
+ var { left, top, width, height } = this.bounds;
28
+ context.beginPath();
29
+ this.drawImage(context, ScenarioQueueSubscription.image, left, top, width, height);
30
+ }
31
+ ready() {
32
+ if (!this.app.isViewMode)
33
+ return;
34
+ this._initScenarioQueueSubscription();
35
+ }
36
+ get nature() {
37
+ return NATURE;
38
+ }
39
+ _initScenarioQueueSubscription() {
40
+ if (!this.app.isViewMode)
41
+ return;
42
+ this.startSubscribe();
43
+ }
44
+ async startSubscribe() {
45
+ this.subscription = await subscribe({
46
+ query: gql `
47
+ subscription {
48
+ scenarioQueueState {
49
+ queue {
50
+ stuff
51
+ due
52
+ priority
53
+ tag
54
+ }
55
+ }
56
+ }
57
+ `
58
+ }, {
59
+ next: async ({ data }) => {
60
+ if (data) {
61
+ this.data = data.scenarioQueueState;
62
+ }
63
+ }
64
+ });
65
+ }
66
+ }
67
+ Component.register('scenario-queue-subscription', ScenarioQueueSubscription);
68
+ //# sourceMappingURL=scenario-queue-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-queue-subscription.js","sourceRoot":"","sources":["../src/scenario-queue-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE/E,OAAO,eAAe,MAAM,kDAAkD,CAAA;AAC9E,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,EAAE;IACd,IAAI,EAAE,6CAA6C;CACpD,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAGhF,MAAM,KAAK,KAAK;QACd,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE;YACrC,yBAAyB,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,CAAA;YAC9C,yBAAyB,CAAC,MAAM,CAAC,GAAG,GAAG,eAAe,CAAA;SACvD;QAED,OAAO,yBAAyB,CAAC,MAAM,CAAA;IACzC,CAAC;IAMD,OAAO;;QACL,KAAK,CAAC,OAAO,EAAE,CAAA;QAEf,MAAA,IAAI,CAAC,YAAY,0CAAE,WAAW,EAAE,CAAA;QAChC,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,OAAiC;QACtC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAE9C,OAAO,CAAC,SAAS,EAAE,CAAA;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAM;QAChC,IAAI,CAAC,8BAA8B,EAAE,CAAA;IACvC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;IAED,8BAA8B;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAM;QAChC,IAAI,CAAC,cAAc,EAAE,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,YAAY,GAAG,MAAM,SAAS,CACjC;YACE,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;SAWT;SACF,EACD;YACE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAiB,EAAE,EAAE;gBACtC,IAAI,IAAI,EAAE;oBACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAA;iBACpC;YACH,CAAC;SACF,CACF,CAAA;IACH,CAAC;CACF;AAED,SAAS,CAAC,QAAQ,CAAC,6BAA6B,EAAE,yBAAyB,CAAC,CAAA","sourcesContent":["import { Component, DataSource, RectPath, Shape } from '@hatiolab/things-scene'\n\nimport COMPONENT_IMAGE from '../assets/symbol-scenario-queue-subscription.png'\nimport gql from 'graphql-tag'\nimport { subscribe } from './origin-client'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [],\n help: 'scene/component/scenario-queue-subscription'\n}\n\nexport default class ScenarioQueueSubscription extends DataSource(RectPath(Shape)) {\n static _image: HTMLImageElement\n\n static get image() {\n if (!ScenarioQueueSubscription._image) {\n ScenarioQueueSubscription._image = new Image()\n ScenarioQueueSubscription._image.src = COMPONENT_IMAGE\n }\n\n return ScenarioQueueSubscription._image\n }\n\n private subscription?: {\n unsubscribe(): void\n }\n\n dispose() {\n super.dispose()\n\n this.subscription?.unsubscribe()\n delete this.subscription\n }\n\n render(context: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n\n context.beginPath()\n this.drawImage(context, ScenarioQueueSubscription.image, left, top, width, height)\n }\n\n ready() {\n if (!this.app.isViewMode) return\n this._initScenarioQueueSubscription()\n }\n\n get nature() {\n return NATURE\n }\n\n _initScenarioQueueSubscription() {\n if (!this.app.isViewMode) return\n this.startSubscribe()\n }\n\n async startSubscribe() {\n this.subscription = await subscribe(\n {\n query: gql`\n subscription {\n scenarioQueueState {\n queue {\n stuff\n due\n priority\n tag\n }\n }\n }\n `\n },\n {\n next: async ({ data }: { data: any }) => {\n if (data) {\n this.data = data.scenarioQueueState\n }\n }\n }\n )\n }\n}\n\nComponent.register('scenario-queue-subscription', ScenarioQueueSubscription)\n"]}
@@ -0,0 +1,39 @@
1
+ import { Properties, Shape } from '@hatiolab/things-scene';
2
+ declare const ScenarioRun_base: (new (...args: any[]) => {
3
+ isDataSource(): boolean;
4
+ }) & typeof Shape;
5
+ export default class ScenarioRun extends ScenarioRun_base {
6
+ static _image: HTMLImageElement;
7
+ static get image(): HTMLImageElement;
8
+ private _client;
9
+ render(context: CanvasRenderingContext2D): void;
10
+ ready(): void;
11
+ _initScenario(): void;
12
+ dispose(): void;
13
+ get nature(): {
14
+ mutable: boolean;
15
+ resizable: boolean;
16
+ rotatable: boolean;
17
+ properties: ({
18
+ type: string;
19
+ label: string;
20
+ name: string;
21
+ property: {
22
+ options: () => Promise<string[]>;
23
+ };
24
+ } | {
25
+ type: string;
26
+ label: string;
27
+ name: string;
28
+ property?: undefined;
29
+ })[];
30
+ 'value-property': string;
31
+ help: string;
32
+ };
33
+ onchange(after: Properties): void;
34
+ get variables(): any;
35
+ set variables(variables: any);
36
+ get client(): any;
37
+ requestData(): Promise<void>;
38
+ }
39
+ export {};
@@ -0,0 +1,136 @@
1
+ import { Component, DataSource, RectPath, Shape } from '@hatiolab/things-scene';
2
+ import COMPONENT_IMAGE from '../assets/symbol-scenario-run.png';
3
+ import { getClient } from './origin-client';
4
+ import gql from 'graphql-tag';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [
10
+ {
11
+ type: 'select',
12
+ label: 'scenario-name',
13
+ name: 'scenarioName',
14
+ property: {
15
+ options: async () => {
16
+ var response = await getClient().query({
17
+ query: gql `
18
+ query {
19
+ scenarios {
20
+ items {
21
+ name
22
+ }
23
+ }
24
+ }
25
+ `
26
+ });
27
+ if (response.errors) {
28
+ return [''];
29
+ }
30
+ return [''].concat(response.data.scenarios.items.map((item) => item.name));
31
+ }
32
+ }
33
+ },
34
+ {
35
+ type: 'data',
36
+ label: 'variables',
37
+ name: 'variables'
38
+ },
39
+ {
40
+ type: 'checkbox',
41
+ label: 'run-on-start',
42
+ name: 'runOnStart'
43
+ }
44
+ ],
45
+ 'value-property': 'variables',
46
+ help: 'scene/component/scenario-run'
47
+ };
48
+ export default class ScenarioRun extends DataSource(RectPath(Shape)) {
49
+ static get image() {
50
+ if (!ScenarioRun._image) {
51
+ ScenarioRun._image = new Image();
52
+ ScenarioRun._image.src = COMPONENT_IMAGE;
53
+ }
54
+ return ScenarioRun._image;
55
+ }
56
+ render(context) {
57
+ var { left, top, width, height } = this.bounds;
58
+ context.beginPath();
59
+ this.drawImage(context, ScenarioRun.image, left, top, width, height);
60
+ }
61
+ ready() {
62
+ super.ready();
63
+ this._initScenario();
64
+ }
65
+ _initScenario() {
66
+ if (!this.app.isViewMode) {
67
+ return;
68
+ }
69
+ this._client = getClient();
70
+ if (this.state.runOnStart) {
71
+ this.requestData();
72
+ }
73
+ }
74
+ dispose() {
75
+ super.dispose();
76
+ try {
77
+ if (this._client) {
78
+ this._client.stop();
79
+ }
80
+ }
81
+ catch (e) {
82
+ console.error(e);
83
+ }
84
+ delete this._client;
85
+ }
86
+ get nature() {
87
+ return NATURE;
88
+ }
89
+ onchange(after) {
90
+ if ('variables' in after) {
91
+ this.requestData();
92
+ }
93
+ }
94
+ get variables() {
95
+ return this.state.variables;
96
+ }
97
+ set variables(variables) {
98
+ this.setState('variables', variables);
99
+ }
100
+ get client() {
101
+ return this._client;
102
+ }
103
+ async requestData() {
104
+ var _a, _b;
105
+ let { scenarioName, variables } = this.state;
106
+ if (!scenarioName || !this.app.isViewMode)
107
+ return;
108
+ var client = this._client;
109
+ try {
110
+ variables = typeof variables == 'string' ? JSON.parse(variables) : variables;
111
+ }
112
+ catch (e) {
113
+ console.warn('runScenario mutation variable is not an object');
114
+ }
115
+ if (client) {
116
+ var response = await client.query({
117
+ query: gql `
118
+ mutation ($scenarioName: String!, $variables: Object) {
119
+ runScenario(scenarioName: $scenarioName, variables: $variables) {
120
+ state
121
+ message
122
+ data
123
+ }
124
+ }
125
+ `,
126
+ variables: {
127
+ scenarioName: scenarioName,
128
+ variables
129
+ }
130
+ });
131
+ this.data = (_b = (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.runScenario) === null || _b === void 0 ? void 0 : _b.data;
132
+ }
133
+ }
134
+ }
135
+ Component.register('scenario-run', ScenarioRun);
136
+ //# sourceMappingURL=scenario-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-run.js","sourceRoot":"","sources":["../src/scenario-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, DataSource, Properties, RectPath, Shape } from '@hatiolab/things-scene'\n\nimport COMPONENT_IMAGE from '../assets/symbol-scenario-run.png'\nimport { getClient } from './origin-client'\nimport gql from 'graphql-tag'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'select',\n label: 'scenario-name',\n name: 'scenarioName',\n property: {\n options: async () => {\n var response = await getClient().query({\n query: gql`\n query {\n scenarios {\n items {\n name\n }\n }\n }\n `\n })\n if (response.errors) {\n return ['']\n }\n\n return [''].concat(response.data.scenarios.items.map((item: any) => item.name))\n }\n }\n },\n {\n type: 'data',\n label: 'variables',\n name: 'variables'\n },\n {\n type: 'checkbox',\n label: 'run-on-start',\n name: 'runOnStart'\n }\n ],\n 'value-property': 'variables',\n help: 'scene/component/scenario-run'\n}\n\nexport default class ScenarioRun extends DataSource(RectPath(Shape)) {\n static _image: HTMLImageElement\n\n static get image() {\n if (!ScenarioRun._image) {\n ScenarioRun._image = new Image()\n ScenarioRun._image.src = COMPONENT_IMAGE\n }\n return ScenarioRun._image\n }\n\n private _client: any\n\n render(context: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n context.beginPath()\n this.drawImage(context, ScenarioRun.image, left, top, width, height)\n }\n\n ready() {\n super.ready()\n this._initScenario()\n }\n\n _initScenario() {\n if (!this.app.isViewMode) {\n return\n }\n this._client = getClient()\n if (this.state.runOnStart) {\n this.requestData()\n }\n }\n\n dispose() {\n super.dispose()\n\n try {\n if (this._client) {\n this._client.stop()\n }\n } catch (e) {\n console.error(e)\n }\n delete this._client\n }\n\n get nature() {\n return NATURE\n }\n\n onchange(after: Properties) {\n if ('variables' in after) {\n this.requestData()\n }\n }\n\n get variables() {\n return this.state.variables\n }\n\n set variables(variables) {\n this.setState('variables', variables)\n }\n\n get client() {\n return this._client\n }\n\n async requestData() {\n let { scenarioName, variables } = this.state\n if (!scenarioName || !this.app.isViewMode) return\n\n var client = this._client\n try {\n variables = typeof variables == 'string' ? JSON.parse(variables) : variables\n } catch (e) {\n console.warn('runScenario mutation variable is not an object')\n }\n\n if (client) {\n var response = await client.query({\n query: gql`\n mutation ($scenarioName: String!, $variables: Object) {\n runScenario(scenarioName: $scenarioName, variables: $variables) {\n state\n message\n data\n }\n }\n `,\n variables: {\n scenarioName: scenarioName,\n variables\n }\n })\n\n this.data = response?.data?.runScenario?.data\n }\n }\n}\n\nComponent.register('scenario-run', ScenarioRun)\n"]}