@operato/scene-integration 1.0.0-alpha.35 → 1.0.0-alpha.38
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/CHANGELOG.md +28 -0
- package/assets/favicon.ico +0 -0
- package/assets/images/spinner.png +0 -0
- package/dist/client-api.js +2 -2
- package/dist/client-api.js.map +1 -1
- package/dist/connection-control.d.ts +0 -5
- package/dist/connection-control.js +2 -27
- package/dist/connection-control.js.map +1 -1
- package/dist/connection-state-subscription.js +2 -2
- package/dist/connection-state-subscription.js.map +1 -1
- package/dist/data-subscription.js +1 -1
- package/dist/data-subscription.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/scenario-control.d.ts +0 -4
- package/dist/scenario-control.js +11 -32
- package/dist/scenario-control.js.map +1 -1
- package/dist/scenario-instance-subscription.js +1 -1
- package/dist/scenario-instance-subscription.js.map +1 -1
- package/dist/scenario-queue-subscription.js +1 -1
- package/dist/scenario-queue-subscription.js.map +1 -1
- package/dist/scenario-run.d.ts +0 -4
- package/dist/scenario-run.js +6 -26
- package/dist/scenario-run.js.map +1 -1
- package/dist/scenario-start.d.ts +0 -5
- package/dist/scenario-start.js +1 -27
- package/dist/scenario-start.js.map +1 -1
- package/dist/scenario-stop.d.ts +0 -5
- package/dist/scenario-stop.js +1 -27
- package/dist/scenario-stop.js.map +1 -1
- package/logs/.08636eb59927f12972f6774f5947c8507b3564c2-audit.json +20 -0
- package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +20 -0
- package/logs/application-2022-07-17-17.log +13 -0
- package/logs/application-2022-07-17-18.log +8 -0
- package/logs/connections-2022-07-17-17.log +105 -0
- package/logs/connections-2022-07-17-18.log +70 -0
- package/package.json +6 -7
- package/src/client-api.ts +2 -2
- package/src/connection-control.ts +2 -34
- package/src/connection-state-subscription.ts +2 -3
- package/src/data-subscription.ts +1 -2
- package/src/scenario-control.ts +13 -36
- package/src/scenario-instance-subscription.ts +1 -1
- package/src/scenario-queue-subscription.ts +1 -2
- package/src/scenario-run.ts +7 -30
- package/src/scenario-start.ts +1 -33
- package/src/scenario-stop.ts +1 -33
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/origin-client.d.ts +0 -5
- package/dist/origin-client.js +0 -110
- package/dist/origin-client.js.map +0 -1
- package/src/origin-client.ts +0 -133
package/dist/origin-client.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { ApolloClient, HttpLink, InMemoryCache, from } from '@apollo/client/core';
|
|
2
|
-
import { onError } from '@apollo/client/link/error';
|
|
3
|
-
import { SubscriptionClient } from 'subscriptions-transport-ws';
|
|
4
|
-
const defaultOptions = {
|
|
5
|
-
watchQuery: {
|
|
6
|
-
fetchPolicy: 'no-cache',
|
|
7
|
-
errorPolicy: 'ignore'
|
|
8
|
-
},
|
|
9
|
-
query: {
|
|
10
|
-
fetchPolicy: 'no-cache',
|
|
11
|
-
errorPolicy: 'all'
|
|
12
|
-
},
|
|
13
|
-
mutate: {
|
|
14
|
-
errorPolicy: 'all'
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
const ERROR_HANDLER = ({ graphQLErrors, networkError }) => {
|
|
18
|
-
if (graphQLErrors) {
|
|
19
|
-
document.dispatchEvent(new CustomEvent('notify', {
|
|
20
|
-
detail: {
|
|
21
|
-
level: 'error',
|
|
22
|
-
message: graphQLErrors[0].message,
|
|
23
|
-
ex: graphQLErrors
|
|
24
|
-
}
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
if (networkError) {
|
|
28
|
-
const code = networkError.statusCode || '';
|
|
29
|
-
const message = `[Response-${code}]: ${networkError.message}`;
|
|
30
|
-
document.dispatchEvent(new CustomEvent('notify', {
|
|
31
|
-
detail: {
|
|
32
|
-
level: 'error',
|
|
33
|
-
message,
|
|
34
|
-
ex: networkError
|
|
35
|
-
}
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
var client;
|
|
40
|
-
export function getClient() {
|
|
41
|
-
if (!client) {
|
|
42
|
-
var cache = new InMemoryCache();
|
|
43
|
-
client = new ApolloClient({
|
|
44
|
-
defaultOptions,
|
|
45
|
-
cache,
|
|
46
|
-
link: from([
|
|
47
|
-
onError(ERROR_HANDLER),
|
|
48
|
-
new HttpLink({
|
|
49
|
-
uri: '/graphql',
|
|
50
|
-
credentials: 'include'
|
|
51
|
-
})
|
|
52
|
-
])
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
return client;
|
|
56
|
-
}
|
|
57
|
-
/* SubscriptionClient */
|
|
58
|
-
var subscriptionClient;
|
|
59
|
-
const getSubscriptionClient = async () => {
|
|
60
|
-
if (!subscriptionClient) {
|
|
61
|
-
subscriptionClient = new Promise((resolve, reject) => {
|
|
62
|
-
var client = new SubscriptionClient(location.origin.replace(/^http/, 'ws') + '/subscriptions', {
|
|
63
|
-
reconnect: true,
|
|
64
|
-
connectionParams: {
|
|
65
|
-
headers: {
|
|
66
|
-
/*
|
|
67
|
-
특정 도메인의 데이타만 받고자 하는 경우에, referer 정보를 제공해서 서버에서 서브도메인 정보를 취득하도록 한다.
|
|
68
|
-
referer: location.href
|
|
69
|
-
또는, 이미 서브도메인 정보를 알고 있다면,
|
|
70
|
-
'x-things-factory-domain': '[subdomain]'
|
|
71
|
-
을 보낼 수 있다.
|
|
72
|
-
관련 정보를 보내지 않는다면, 사용자가 권한을 가진 모든 도메인의 데이타를 수신하게 된다.
|
|
73
|
-
*/
|
|
74
|
-
referer: location.href
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
client.onError(err => {
|
|
79
|
-
//readyState === 3 인 경우 url을 잘 못 입력했거나, 서버에 문제가 있는 경우이므로 reconnect = false로 변경한다.
|
|
80
|
-
if (client.status === 3) {
|
|
81
|
-
// client.reconnect = false // reconnect is private property
|
|
82
|
-
client.close(true);
|
|
83
|
-
}
|
|
84
|
-
reject(err);
|
|
85
|
-
});
|
|
86
|
-
client.onConnected(() => {
|
|
87
|
-
resolve(client);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
return await subscriptionClient;
|
|
92
|
-
};
|
|
93
|
-
var subscriptions = [];
|
|
94
|
-
export const subscribe = async (request, subscribe) => {
|
|
95
|
-
var client = await getSubscriptionClient();
|
|
96
|
-
var { unsubscribe } = client.request(request).subscribe(subscribe);
|
|
97
|
-
subscriptions.push(unsubscribe);
|
|
98
|
-
return {
|
|
99
|
-
unsubscribe() {
|
|
100
|
-
subscriptions.splice(subscriptions.indexOf(unsubscribe), 1);
|
|
101
|
-
unsubscribe();
|
|
102
|
-
if (subscriptions.length == 0) {
|
|
103
|
-
client.unsubscribeAll();
|
|
104
|
-
client.close(true);
|
|
105
|
-
subscriptionClient = null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
};
|
|
110
|
-
//# sourceMappingURL=origin-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/src/origin-client.ts
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { ApolloClient, HttpLink, InMemoryCache, from } from '@apollo/client/core'
|
|
2
|
-
import { ErrorResponse, onError } from '@apollo/client/link/error'
|
|
3
|
-
|
|
4
|
-
import { DefaultOptions } from '@apollo/client'
|
|
5
|
-
import { SubscriptionClient } from 'subscriptions-transport-ws'
|
|
6
|
-
|
|
7
|
-
const defaultOptions: DefaultOptions = {
|
|
8
|
-
watchQuery: {
|
|
9
|
-
fetchPolicy: 'no-cache',
|
|
10
|
-
errorPolicy: 'ignore'
|
|
11
|
-
},
|
|
12
|
-
query: {
|
|
13
|
-
fetchPolicy: 'no-cache', //'network-only'
|
|
14
|
-
errorPolicy: 'all'
|
|
15
|
-
},
|
|
16
|
-
mutate: {
|
|
17
|
-
errorPolicy: 'all'
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const ERROR_HANDLER = ({ graphQLErrors, networkError }: ErrorResponse) => {
|
|
22
|
-
if (graphQLErrors) {
|
|
23
|
-
document.dispatchEvent(
|
|
24
|
-
new CustomEvent('notify', {
|
|
25
|
-
detail: {
|
|
26
|
-
level: 'error',
|
|
27
|
-
message: graphQLErrors[0].message,
|
|
28
|
-
ex: graphQLErrors
|
|
29
|
-
}
|
|
30
|
-
})
|
|
31
|
-
)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (networkError) {
|
|
35
|
-
const code = (networkError as any).statusCode || ''
|
|
36
|
-
const message = `[Response-${code}]: ${networkError.message}`
|
|
37
|
-
|
|
38
|
-
document.dispatchEvent(
|
|
39
|
-
new CustomEvent('notify', {
|
|
40
|
-
detail: {
|
|
41
|
-
level: 'error',
|
|
42
|
-
message,
|
|
43
|
-
ex: networkError
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
var client: ApolloClient<any>
|
|
51
|
-
|
|
52
|
-
export function getClient() {
|
|
53
|
-
if (!client) {
|
|
54
|
-
var cache = new InMemoryCache()
|
|
55
|
-
client = new ApolloClient({
|
|
56
|
-
defaultOptions,
|
|
57
|
-
cache,
|
|
58
|
-
link: from([
|
|
59
|
-
onError(ERROR_HANDLER),
|
|
60
|
-
new HttpLink({
|
|
61
|
-
uri: '/graphql',
|
|
62
|
-
credentials: 'include'
|
|
63
|
-
})
|
|
64
|
-
])
|
|
65
|
-
})
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return client
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/* SubscriptionClient */
|
|
72
|
-
var subscriptionClient: Promise<SubscriptionClient> | null
|
|
73
|
-
|
|
74
|
-
const getSubscriptionClient = async () => {
|
|
75
|
-
if (!subscriptionClient) {
|
|
76
|
-
subscriptionClient = new Promise((resolve, reject) => {
|
|
77
|
-
var client = new SubscriptionClient(location.origin.replace(/^http/, 'ws') + '/subscriptions', {
|
|
78
|
-
reconnect: true,
|
|
79
|
-
connectionParams: {
|
|
80
|
-
headers: {
|
|
81
|
-
/*
|
|
82
|
-
특정 도메인의 데이타만 받고자 하는 경우에, referer 정보를 제공해서 서버에서 서브도메인 정보를 취득하도록 한다.
|
|
83
|
-
referer: location.href
|
|
84
|
-
또는, 이미 서브도메인 정보를 알고 있다면,
|
|
85
|
-
'x-things-factory-domain': '[subdomain]'
|
|
86
|
-
을 보낼 수 있다.
|
|
87
|
-
관련 정보를 보내지 않는다면, 사용자가 권한을 가진 모든 도메인의 데이타를 수신하게 된다.
|
|
88
|
-
*/
|
|
89
|
-
referer: location.href
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
client.onError(err => {
|
|
95
|
-
//readyState === 3 인 경우 url을 잘 못 입력했거나, 서버에 문제가 있는 경우이므로 reconnect = false로 변경한다.
|
|
96
|
-
if (client.status === 3) {
|
|
97
|
-
// client.reconnect = false // reconnect is private property
|
|
98
|
-
client.close(true)
|
|
99
|
-
}
|
|
100
|
-
reject(err)
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
client.onConnected(() => {
|
|
104
|
-
resolve(client)
|
|
105
|
-
})
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return await subscriptionClient
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
var subscriptions: (() => void)[] = []
|
|
113
|
-
|
|
114
|
-
export const subscribe = async (request: any, subscribe: any) => {
|
|
115
|
-
var client = await getSubscriptionClient()
|
|
116
|
-
var { unsubscribe } = client.request(request).subscribe(subscribe)
|
|
117
|
-
|
|
118
|
-
subscriptions.push(unsubscribe)
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
unsubscribe() {
|
|
122
|
-
subscriptions.splice(subscriptions.indexOf(unsubscribe), 1)
|
|
123
|
-
unsubscribe()
|
|
124
|
-
|
|
125
|
-
if (subscriptions.length == 0) {
|
|
126
|
-
client.unsubscribeAll()
|
|
127
|
-
client.close(true)
|
|
128
|
-
|
|
129
|
-
subscriptionClient = null
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|