@webiny/app-websockets 6.0.0-beta.0 β 6.0.0-rc.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.
- package/README.md +8 -9
- package/WebsocketsContextProvider.d.ts +1 -1
- package/WebsocketsContextProvider.js +88 -88
- package/WebsocketsContextProvider.js.map +1 -1
- package/domain/WebsocketsAction.d.ts +1 -1
- package/domain/WebsocketsAction.js +20 -33
- package/domain/WebsocketsAction.js.map +1 -1
- package/domain/WebsocketsActions.d.ts +1 -3
- package/domain/WebsocketsActions.js +69 -86
- package/domain/WebsocketsActions.js.map +1 -1
- package/domain/WebsocketsConnection.d.ts +1 -4
- package/domain/WebsocketsConnection.js +83 -104
- package/domain/WebsocketsConnection.js.map +1 -1
- package/domain/WebsocketsManager.d.ts +1 -1
- package/domain/WebsocketsManager.js +31 -60
- package/domain/WebsocketsManager.js.map +1 -1
- package/domain/WebsocketsSubscriptionManager.d.ts +2 -2
- package/domain/WebsocketsSubscriptionManager.js +62 -95
- package/domain/WebsocketsSubscriptionManager.js.map +1 -1
- package/domain/abstractions/IWebsocketsAction.d.ts +1 -1
- package/domain/abstractions/IWebsocketsAction.js +1 -5
- package/domain/abstractions/IWebsocketsAction.js.map +1 -1
- package/domain/abstractions/IWebsocketsActions.d.ts +2 -2
- package/domain/abstractions/IWebsocketsActions.js +1 -5
- package/domain/abstractions/IWebsocketsActions.js.map +1 -1
- package/domain/abstractions/IWebsocketsConnection.d.ts +3 -3
- package/domain/abstractions/IWebsocketsConnection.js +1 -7
- package/domain/abstractions/IWebsocketsConnection.js.map +1 -1
- package/domain/abstractions/IWebsocketsManager.d.ts +2 -6
- package/domain/abstractions/IWebsocketsManager.js +1 -5
- package/domain/abstractions/IWebsocketsManager.js.map +1 -1
- package/domain/abstractions/IWebsocketsSubscriptionManager.d.ts +3 -3
- package/domain/abstractions/IWebsocketsSubscriptionManager.js +1 -5
- package/domain/abstractions/IWebsocketsSubscriptionManager.js.map +1 -1
- package/domain/abstractions/types.d.ts +6 -6
- package/domain/abstractions/types.js +1 -7
- package/domain/abstractions/types.js.map +1 -1
- package/domain/index.d.ts +5 -5
- package/domain/index.js +5 -60
- package/domain/index.js.map +1 -1
- package/domain/types.d.ts +6 -6
- package/domain/types.js +2 -71
- package/domain/types.js.map +1 -1
- package/hooks/index.d.ts +1 -1
- package/hooks/index.js +1 -16
- package/hooks/index.js.map +1 -1
- package/hooks/useWebsockets.d.ts +1 -1
- package/hooks/useWebsockets.js +4 -10
- package/hooks/useWebsockets.js.map +1 -1
- package/index.d.ts +2 -2
- package/index.js +10 -42
- package/index.js.map +1 -1
- package/package.json +9 -21
- package/types.d.ts +10 -2
- package/types.js +2 -16
- package/types.js.map +1 -1
- package/utils/getUrl.js +2 -8
- package/utils/getUrl.js.map +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
# @webiny/app-websockets
|
|
2
|
-
[](https://www.npmjs.com/package/@webiny/app-websockets)
|
|
3
|
-
[](https://www.npmjs.com/package/@webiny/app-websockets)
|
|
4
|
-
[](https://github.com/prettier/prettier)
|
|
5
|
-
[](http://makeapullrequest.com)
|
|
6
2
|
|
|
7
|
-
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This package is part of the [Webiny](https://www.webiny.com) monorepo.
|
|
5
|
+
> Itβs **included in every Webiny project by default** and is not meant to be used as a standalone package.
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
π **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
_This README file is automatically generated during the publish process._
|
|
@@ -1,45 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
var locale = getCurrentLocale("default");
|
|
26
|
-
var socketsRef = (0, _react.useRef)();
|
|
27
|
-
var _useState = (0, _react.useState)({}),
|
|
28
|
-
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
29
|
-
current = _useState2[0],
|
|
30
|
-
setCurrent = _useState2[1];
|
|
31
|
-
var getToken = (0, _react.useCallback)(async function () {
|
|
32
|
-
return await getIdToken();
|
|
33
|
-
}, [getIdToken]);
|
|
34
|
-
var subscriptionManager = (0, _react.useMemo)(function () {
|
|
35
|
-
var manager = (0, _domain.createWebsocketsSubscriptionManager)();
|
|
36
|
-
var currentIteration = 0;
|
|
37
|
-
manager.onClose(function (event) {
|
|
38
|
-
if (currentIteration > 5 || event.code !== _types.WebsocketsCloseCode.GOING_AWAY) {
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { useFeature, useTenantContext } from "@webiny/app-admin";
|
|
3
|
+
import { AuthenticationContextFeature } from "@webiny/app-admin/features/security/AuthenticationContext/feature.js";
|
|
4
|
+
import { WebsocketsCloseCode } from "./types.js";
|
|
5
|
+
import { createWebsocketsAction, createWebsocketsActions, createWebsocketsConnection, createWebsocketsManager, createWebsocketsSubscriptionManager } from "./domain/index.js";
|
|
6
|
+
import { getUrl } from "./utils/getUrl.js";
|
|
7
|
+
export const WebsocketsContext = /*#__PURE__*/React.createContext(undefined);
|
|
8
|
+
export const WebsocketsContextProvider = props => {
|
|
9
|
+
const {
|
|
10
|
+
tenant
|
|
11
|
+
} = useTenantContext();
|
|
12
|
+
const {
|
|
13
|
+
authenticationContext
|
|
14
|
+
} = useFeature(AuthenticationContextFeature);
|
|
15
|
+
const socketsRef = useRef();
|
|
16
|
+
const [current, setCurrent] = useState({});
|
|
17
|
+
const getToken = useCallback(async () => {
|
|
18
|
+
return await authenticationContext.getIdToken();
|
|
19
|
+
}, [authenticationContext]);
|
|
20
|
+
const subscriptionManager = useMemo(() => {
|
|
21
|
+
const manager = createWebsocketsSubscriptionManager();
|
|
22
|
+
let currentIteration = 0;
|
|
23
|
+
manager.onClose(event => {
|
|
24
|
+
if (currentIteration > 5 || event.code !== WebsocketsCloseCode.GOING_AWAY) {
|
|
39
25
|
return;
|
|
40
26
|
}
|
|
41
27
|
currentIteration++;
|
|
42
|
-
setTimeout(
|
|
28
|
+
setTimeout(() => {
|
|
43
29
|
if (!socketsRef.current) {
|
|
44
30
|
return;
|
|
45
31
|
} else if (socketsRef.current.isClosed()) {
|
|
@@ -50,103 +36,117 @@ var WebsocketsContextProvider = exports.WebsocketsContextProvider = function Web
|
|
|
50
36
|
});
|
|
51
37
|
return manager;
|
|
52
38
|
}, []);
|
|
39
|
+
|
|
53
40
|
/**
|
|
54
41
|
* We need this useEffect to close the websocket connection and remove window focus event in case component is unmounted.
|
|
55
42
|
* This will, probably, happen only during the development phase.
|
|
56
43
|
*
|
|
57
44
|
* If we did not disconnect on component unmount, we would have a memory leak - multiple connections would be opened.
|
|
58
45
|
*/
|
|
59
|
-
|
|
46
|
+
useEffect(() => {
|
|
60
47
|
/**
|
|
61
48
|
* We want to add a window event listener which will check if the connection is closed, and if its - it will connect again.
|
|
62
49
|
*/
|
|
63
|
-
|
|
50
|
+
const abortController = new AbortController();
|
|
51
|
+
window.addEventListener("focus", () => {
|
|
64
52
|
if (!socketsRef.current) {
|
|
65
53
|
return;
|
|
66
54
|
} else if (socketsRef.current.isClosed()) {
|
|
67
55
|
console.log("Running auto-reconnect on focus.");
|
|
68
56
|
socketsRef.current.connect();
|
|
69
57
|
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
58
|
+
}, {
|
|
59
|
+
signal: abortController.signal
|
|
60
|
+
});
|
|
61
|
+
window.addEventListener("close", () => {
|
|
62
|
+
subscriptionManager.triggerOnClose(new CloseEvent("windowClose", {
|
|
63
|
+
code: WebsocketsCloseCode.GOING_AWAY,
|
|
64
|
+
reason: "Closing Window or Tab."
|
|
65
|
+
}));
|
|
66
|
+
}, {
|
|
67
|
+
signal: abortController.signal
|
|
68
|
+
});
|
|
69
|
+
return () => {
|
|
70
|
+
abortController.abort();
|
|
79
71
|
};
|
|
80
72
|
}, []);
|
|
81
|
-
|
|
82
|
-
(async
|
|
83
|
-
|
|
84
|
-
if (!token || !tenant
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
(async () => {
|
|
75
|
+
const token = await getToken();
|
|
76
|
+
if (!token || !tenant) {
|
|
85
77
|
return;
|
|
86
|
-
} else if (current.tenant === tenant
|
|
78
|
+
} else if (current.tenant === tenant) {
|
|
87
79
|
return;
|
|
88
80
|
} else if (socketsRef.current) {
|
|
89
|
-
await socketsRef.current.close(
|
|
81
|
+
await socketsRef.current.close(WebsocketsCloseCode.NORMAL, "Changing tenant.");
|
|
90
82
|
}
|
|
91
|
-
|
|
83
|
+
const url = getUrl();
|
|
92
84
|
if (!url) {
|
|
93
85
|
console.error("Not possible to connect to the websocket without a valid URL.", {
|
|
94
|
-
tenant
|
|
95
|
-
|
|
96
|
-
token: token
|
|
86
|
+
tenant,
|
|
87
|
+
token
|
|
97
88
|
});
|
|
98
89
|
return;
|
|
99
90
|
}
|
|
100
|
-
socketsRef.current =
|
|
101
|
-
subscriptionManager
|
|
102
|
-
url
|
|
103
|
-
tenant
|
|
104
|
-
|
|
105
|
-
getToken: getToken,
|
|
91
|
+
socketsRef.current = createWebsocketsManager(createWebsocketsConnection({
|
|
92
|
+
subscriptionManager,
|
|
93
|
+
url,
|
|
94
|
+
tenant,
|
|
95
|
+
getToken,
|
|
106
96
|
protocol: ["webiny-ws-v1"]
|
|
107
97
|
}));
|
|
108
98
|
await socketsRef.current.connect();
|
|
109
99
|
setCurrent({
|
|
110
|
-
tenant
|
|
111
|
-
locale: locale
|
|
100
|
+
tenant
|
|
112
101
|
});
|
|
113
102
|
})();
|
|
114
|
-
}, [tenant,
|
|
115
|
-
|
|
116
|
-
return
|
|
103
|
+
}, [tenant, subscriptionManager, getToken]);
|
|
104
|
+
const websocketActions = useMemo(() => {
|
|
105
|
+
return createWebsocketsActions({
|
|
117
106
|
manager: socketsRef.current,
|
|
118
|
-
tenant
|
|
119
|
-
|
|
120
|
-
getToken: getToken
|
|
107
|
+
tenant,
|
|
108
|
+
getToken
|
|
121
109
|
});
|
|
122
|
-
}, [socketsRef.current, tenant,
|
|
123
|
-
|
|
110
|
+
}, [socketsRef.current, tenant, getToken]);
|
|
111
|
+
const send = useCallback(async (action, data, timeout) => {
|
|
124
112
|
return websocketActions.run({
|
|
125
|
-
action
|
|
126
|
-
data
|
|
127
|
-
timeout
|
|
113
|
+
action,
|
|
114
|
+
data,
|
|
115
|
+
timeout
|
|
128
116
|
});
|
|
129
117
|
}, [websocketActions]);
|
|
130
|
-
|
|
131
|
-
return
|
|
118
|
+
const createAction = useCallback(name => {
|
|
119
|
+
return createWebsocketsAction(websocketActions, name);
|
|
132
120
|
}, [websocketActions]);
|
|
133
|
-
|
|
134
|
-
return socketsRef.current.onMessage(async
|
|
121
|
+
const onMessage = useCallback((action, cb) => {
|
|
122
|
+
return socketsRef.current.onMessage(async event => {
|
|
135
123
|
if (event.data.action !== action) {
|
|
136
124
|
return;
|
|
137
125
|
}
|
|
138
126
|
cb(event.data);
|
|
139
127
|
});
|
|
140
128
|
}, [socketsRef.current]);
|
|
129
|
+
const onError = useCallback(cb => {
|
|
130
|
+
return socketsRef.current.onError(data => {
|
|
131
|
+
return cb(data);
|
|
132
|
+
});
|
|
133
|
+
}, [socketsRef.current]);
|
|
134
|
+
const onClose = useCallback(cb => {
|
|
135
|
+
return socketsRef.current.onClose(data => {
|
|
136
|
+
return cb(data);
|
|
137
|
+
});
|
|
138
|
+
}, [socketsRef.current]);
|
|
141
139
|
if (!socketsRef.current) {
|
|
142
140
|
return props.loader || null;
|
|
143
141
|
}
|
|
144
|
-
|
|
145
|
-
send
|
|
146
|
-
createAction
|
|
147
|
-
onMessage
|
|
142
|
+
const value = {
|
|
143
|
+
send,
|
|
144
|
+
createAction,
|
|
145
|
+
onMessage,
|
|
146
|
+
onError,
|
|
147
|
+
onClose
|
|
148
148
|
};
|
|
149
|
-
return /*#__PURE__*/
|
|
149
|
+
return /*#__PURE__*/React.createElement(WebsocketsContext.Provider, Object.assign({
|
|
150
150
|
value: value
|
|
151
151
|
}, props));
|
|
152
152
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_appTenancy","_appI18n","_appSecurity","_types","_domain","_getUrl","WebsocketsContext","exports","React","createContext","undefined","WebsocketsContextProvider","props","_useTenancy","useTenancy","tenant","_useI18N","useI18N","getCurrentLocale","_useSecurity","useSecurity","getIdToken","locale","socketsRef","useRef","_useState","useState","_useState2","_slicedToArray2","default","current","setCurrent","getToken","useCallback","subscriptionManager","useMemo","manager","createWebsocketsSubscriptionManager","currentIteration","onClose","event","code","WebsocketsCloseCode","GOING_AWAY","setTimeout","isClosed","console","log","connect","useEffect","fn","window","addEventListener","removeEventListener","token","close","NORMAL","url","getUrl","error","createWebsocketsManager","createWebsocketsConnection","protocol","websocketActions","createWebsocketsActions","send","action","data","timeout","run","createAction","name","createWebsocketsAction","onMessage","cb","loader","value","createElement","Provider","Object","assign"],"sources":["WebsocketsContextProvider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTenancy } from \"@webiny/app-tenancy\";\nimport { useI18N } from \"@webiny/app-i18n\";\nimport { useSecurity } from \"@webiny/app-security\";\nimport {\n IncomingGenericData,\n IWebsocketsContext,\n IWebsocketsContextSendCallable,\n WebsocketsCloseCode\n} from \"~/types\";\nimport {\n createWebsocketsAction,\n createWebsocketsActions,\n createWebsocketsConnection,\n createWebsocketsManager,\n createWebsocketsSubscriptionManager\n} from \"./domain\";\nimport { IGenericData, IWebsocketsManager } from \"./domain/types\";\nimport { getUrl } from \"./utils/getUrl\";\n\nexport interface IWebsocketsContextProviderProps {\n loader?: React.ReactElement;\n children: React.ReactNode;\n}\n\nexport const WebsocketsContext = React.createContext<IWebsocketsContext>(\n undefined as unknown as IWebsocketsContext\n);\n\ninterface ICurrentData {\n tenant?: string;\n locale?: string;\n}\n\nexport const WebsocketsContextProvider = (props: IWebsocketsContextProviderProps) => {\n const { tenant } = useTenancy();\n const { getCurrentLocale } = useI18N();\n const { getIdToken } = useSecurity();\n const locale = getCurrentLocale(\"default\");\n\n const socketsRef = useRef<IWebsocketsManager>();\n\n const [current, setCurrent] = useState<ICurrentData>({});\n\n const getToken = useCallback(async () => {\n return await getIdToken();\n }, [getIdToken]);\n\n const subscriptionManager = useMemo(() => {\n const manager = createWebsocketsSubscriptionManager();\n\n let currentIteration = 0;\n manager.onClose(event => {\n if (currentIteration > 5 || event.code !== WebsocketsCloseCode.GOING_AWAY) {\n return;\n }\n currentIteration++;\n setTimeout(() => {\n if (!socketsRef.current) {\n return;\n } else if (socketsRef.current.isClosed()) {\n console.log(\"Running auto-reconnect.\");\n\n socketsRef.current.connect();\n }\n }, 1000);\n });\n\n return manager;\n }, []);\n /**\n * We need this useEffect to close the websocket connection and remove window focus event in case component is unmounted.\n * This will, probably, happen only during the development phase.\n *\n * If we did not disconnect on component unmount, we would have a memory leak - multiple connections would be opened.\n */\n useEffect(() => {\n /**\n * We want to add a window event listener which will check if the connection is closed, and if its - it will connect again.\n */\n const fn = () => {\n if (!socketsRef.current) {\n return;\n } else if (socketsRef.current.isClosed()) {\n console.log(\"Running auto-reconnect on focus.\");\n socketsRef.current.connect();\n }\n };\n window.addEventListener(\"focus\", fn);\n\n return () => {\n window.removeEventListener(\"focus\", fn);\n // if (!socketsRef.current) {\n // return;\n // }\n\n // socketsRef.current.close(WebsocketsCloseCode.NORMAL, \"Component unmounted.\");\n };\n }, []);\n\n useEffect(() => {\n (async () => {\n const token = await getToken();\n if (!token || !tenant || !locale) {\n return;\n } else if (current.tenant === tenant && current.locale === locale) {\n return;\n } else if (socketsRef.current) {\n await socketsRef.current.close(\n WebsocketsCloseCode.NORMAL,\n \"Changing tenant/locale.\"\n );\n }\n const url = getUrl();\n\n if (!url) {\n console.error(\"Not possible to connect to the websocket without a valid URL.\", {\n tenant,\n locale,\n token\n });\n return;\n }\n\n socketsRef.current = createWebsocketsManager(\n createWebsocketsConnection({\n subscriptionManager,\n url,\n tenant,\n locale,\n getToken,\n protocol: [\"webiny-ws-v1\"]\n })\n );\n await socketsRef.current.connect();\n\n setCurrent({\n tenant,\n locale\n });\n })();\n }, [tenant, locale, subscriptionManager, getToken]);\n\n const websocketActions = useMemo(() => {\n return createWebsocketsActions({\n manager: socketsRef.current!,\n tenant,\n locale,\n getToken\n });\n }, [socketsRef.current, tenant, locale, getToken]);\n\n const send = useCallback<IWebsocketsContextSendCallable>(\n async (action, data, timeout) => {\n return websocketActions.run({\n action,\n data,\n timeout\n });\n },\n [websocketActions]\n );\n\n const createAction = useCallback(\n <T extends IGenericData = IGenericData, R extends IGenericData = IGenericData>(\n name: string\n ) => {\n return createWebsocketsAction<T, R>(websocketActions, name);\n },\n [websocketActions]\n );\n\n const onMessage = useCallback(\n <T extends IncomingGenericData = IncomingGenericData>(\n action: string,\n cb: (data: T) => void\n ) => {\n return socketsRef.current!.onMessage<T>(async event => {\n if (event.data.action !== action) {\n return;\n }\n cb(event.data);\n });\n },\n [socketsRef.current]\n );\n\n if (!socketsRef.current) {\n return props.loader || null;\n }\n\n const value: IWebsocketsContext = {\n send,\n createAction,\n onMessage\n };\n return <WebsocketsContext.Provider value={value} {...props} />;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","useFeature","useTenantContext","AuthenticationContextFeature","WebsocketsCloseCode","createWebsocketsAction","createWebsocketsActions","createWebsocketsConnection","createWebsocketsManager","createWebsocketsSubscriptionManager","getUrl","WebsocketsContext","createContext","undefined","WebsocketsContextProvider","props","tenant","authenticationContext","socketsRef","current","setCurrent","getToken","getIdToken","subscriptionManager","manager","currentIteration","onClose","event","code","GOING_AWAY","setTimeout","isClosed","console","log","connect","abortController","AbortController","window","addEventListener","signal","triggerOnClose","CloseEvent","reason","abort","token","close","NORMAL","url","error","protocol","websocketActions","send","action","data","timeout","run","createAction","name","onMessage","cb","onError","loader","value","createElement","Provider","Object","assign"],"sources":["WebsocketsContextProvider.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useFeature, useTenantContext } from \"@webiny/app-admin\";\nimport { AuthenticationContextFeature } from \"@webiny/app-admin/features/security/AuthenticationContext/feature.js\";\nimport type {\n IncomingGenericData,\n IWebsocketsContext,\n IWebsocketsContextSendCallable,\n IWebsocketsManagerCloseEvent,\n IWebsocketsManagerErrorEvent\n} from \"~/types.js\";\nimport { WebsocketsCloseCode } from \"~/types.js\";\nimport {\n createWebsocketsAction,\n createWebsocketsActions,\n createWebsocketsConnection,\n createWebsocketsManager,\n createWebsocketsSubscriptionManager\n} from \"./domain/index.js\";\nimport type { IGenericData, IWebsocketsManager } from \"./domain/types.js\";\nimport { getUrl } from \"./utils/getUrl.js\";\n\nexport interface IWebsocketsContextProviderProps {\n loader?: React.ReactElement;\n children: React.ReactNode;\n}\n\nexport const WebsocketsContext = React.createContext<IWebsocketsContext>(\n undefined as unknown as IWebsocketsContext\n);\n\ninterface ICurrentData {\n tenant?: string;\n}\n\nexport const WebsocketsContextProvider = (props: IWebsocketsContextProviderProps) => {\n const { tenant } = useTenantContext();\n const { authenticationContext } = useFeature(AuthenticationContextFeature);\n\n const socketsRef = useRef<IWebsocketsManager>();\n\n const [current, setCurrent] = useState<ICurrentData>({});\n\n const getToken = useCallback(async () => {\n return await authenticationContext.getIdToken();\n }, [authenticationContext]);\n\n const subscriptionManager = useMemo(() => {\n const manager = createWebsocketsSubscriptionManager();\n\n let currentIteration = 0;\n manager.onClose(event => {\n if (currentIteration > 5 || event.code !== WebsocketsCloseCode.GOING_AWAY) {\n return;\n }\n currentIteration++;\n setTimeout(() => {\n if (!socketsRef.current) {\n return;\n } else if (socketsRef.current.isClosed()) {\n console.log(\"Running auto-reconnect.\");\n\n socketsRef.current.connect();\n }\n }, 1000);\n });\n\n return manager;\n }, []);\n\n /**\n * We need this useEffect to close the websocket connection and remove window focus event in case component is unmounted.\n * This will, probably, happen only during the development phase.\n *\n * If we did not disconnect on component unmount, we would have a memory leak - multiple connections would be opened.\n */\n useEffect(() => {\n /**\n * We want to add a window event listener which will check if the connection is closed, and if its - it will connect again.\n */\n const abortController = new AbortController();\n\n window.addEventListener(\n \"focus\",\n () => {\n if (!socketsRef.current) {\n return;\n } else if (socketsRef.current.isClosed()) {\n console.log(\"Running auto-reconnect on focus.\");\n socketsRef.current.connect();\n }\n },\n { signal: abortController.signal }\n );\n window.addEventListener(\n \"close\",\n () => {\n subscriptionManager.triggerOnClose(\n new CloseEvent(\"windowClose\", {\n code: WebsocketsCloseCode.GOING_AWAY,\n reason: \"Closing Window or Tab.\"\n })\n );\n },\n { signal: abortController.signal }\n );\n\n return () => {\n abortController.abort();\n };\n }, []);\n\n useEffect(() => {\n (async () => {\n const token = await getToken();\n if (!token || !tenant) {\n return;\n } else if (current.tenant === tenant) {\n return;\n } else if (socketsRef.current) {\n await socketsRef.current.close(WebsocketsCloseCode.NORMAL, \"Changing tenant.\");\n }\n const url = getUrl();\n\n if (!url) {\n console.error(\"Not possible to connect to the websocket without a valid URL.\", {\n tenant,\n token\n });\n return;\n }\n\n socketsRef.current = createWebsocketsManager(\n createWebsocketsConnection({\n subscriptionManager,\n url,\n tenant,\n getToken,\n protocol: [\"webiny-ws-v1\"]\n })\n );\n await socketsRef.current.connect();\n\n setCurrent({ tenant });\n })();\n }, [tenant, subscriptionManager, getToken]);\n\n const websocketActions = useMemo(() => {\n return createWebsocketsActions({\n manager: socketsRef.current!,\n tenant,\n getToken\n });\n }, [socketsRef.current, tenant, getToken]);\n\n const send = useCallback<IWebsocketsContextSendCallable>(\n async (action, data, timeout) => {\n return websocketActions.run({\n action,\n data,\n timeout\n });\n },\n [websocketActions]\n );\n\n const createAction = useCallback(\n <T extends IGenericData = IGenericData, R extends IGenericData = IGenericData>(\n name: string\n ) => {\n return createWebsocketsAction<T, R>(websocketActions, name);\n },\n [websocketActions]\n );\n\n const onMessage = useCallback(\n <T extends IncomingGenericData = IncomingGenericData>(\n action: string,\n cb: (data: T) => void\n ) => {\n return socketsRef.current!.onMessage<T>(async event => {\n if (event.data.action !== action) {\n return;\n }\n cb(event.data);\n });\n },\n [socketsRef.current]\n );\n\n const onError = useCallback(\n (cb: (data: IWebsocketsManagerErrorEvent) => void) => {\n return socketsRef.current!.onError(data => {\n return cb(data);\n });\n },\n [socketsRef.current]\n );\n\n const onClose = useCallback(\n (cb: (data: IWebsocketsManagerCloseEvent) => void) => {\n return socketsRef.current!.onClose(data => {\n return cb(data);\n });\n },\n [socketsRef.current]\n );\n\n if (!socketsRef.current) {\n return props.loader || null;\n }\n\n const value: IWebsocketsContext = {\n send,\n createAction,\n onMessage,\n onError,\n onClose\n };\n return <WebsocketsContext.Provider value={value} {...props} />;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IGenericData, IWebsocketsAction, IWebsocketsActions, IWebsocketsActionsTriggerParams } from "./types";
|
|
1
|
+
import type { IGenericData, IWebsocketsAction, IWebsocketsActions, IWebsocketsActionsTriggerParams } from "./types.js";
|
|
2
2
|
export declare class WebsocketsAction<T extends IGenericData = IGenericData, R extends IGenericData = IGenericData> implements IWebsocketsAction<T, R> {
|
|
3
3
|
private readonly actions;
|
|
4
4
|
private readonly name;
|
|
@@ -1,40 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.createWebsocketsAction = exports.WebsocketsAction = void 0;
|
|
8
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
-
var WebsocketsAction = exports.WebsocketsAction = /*#__PURE__*/function () {
|
|
11
|
-
function WebsocketsAction(actions, name) {
|
|
12
|
-
(0, _classCallCheck2.default)(this, WebsocketsAction);
|
|
1
|
+
export class WebsocketsAction {
|
|
2
|
+
constructor(actions, name) {
|
|
13
3
|
this.name = name;
|
|
14
4
|
this.actions = actions;
|
|
15
5
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!onResponse) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
var result = await promise;
|
|
33
|
-
return onResponse(result);
|
|
6
|
+
async trigger(params) {
|
|
7
|
+
const {
|
|
8
|
+
data,
|
|
9
|
+
onResponse,
|
|
10
|
+
timeout = 10000
|
|
11
|
+
} = params || {};
|
|
12
|
+
const promise = this.actions.run({
|
|
13
|
+
action: this.name,
|
|
14
|
+
data,
|
|
15
|
+
timeout: onResponse && timeout > 0 ? timeout : undefined
|
|
16
|
+
});
|
|
17
|
+
if (!onResponse) {
|
|
18
|
+
return null;
|
|
34
19
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
20
|
+
const result = await promise;
|
|
21
|
+
return onResponse(result);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const createWebsocketsAction = (actions, name) => {
|
|
38
25
|
return new WebsocketsAction(actions, name);
|
|
39
26
|
};
|
|
40
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebsocketsAction","
|
|
1
|
+
{"version":3,"names":["WebsocketsAction","constructor","actions","name","trigger","params","data","onResponse","timeout","promise","run","action","undefined","result","createWebsocketsAction"],"sources":["WebsocketsAction.ts"],"sourcesContent":["import type {\n IGenericData,\n IWebsocketsAction,\n IWebsocketsActions,\n IWebsocketsActionsTriggerParams\n} from \"./types.js\";\n\nexport class WebsocketsAction<\n T extends IGenericData = IGenericData,\n R extends IGenericData = IGenericData\n> implements IWebsocketsAction<T, R>\n{\n private readonly actions: IWebsocketsActions;\n private readonly name: string;\n\n public constructor(actions: IWebsocketsActions, name: string) {\n this.name = name;\n this.actions = actions;\n }\n\n public async trigger(params?: IWebsocketsActionsTriggerParams<T, R>): Promise<R | null> {\n const { data, onResponse, timeout = 10000 } = params || {};\n const promise = this.actions.run<T, R>({\n action: this.name,\n data,\n timeout: onResponse && timeout > 0 ? timeout : undefined\n });\n if (!onResponse) {\n return null;\n }\n const result = await promise;\n\n return onResponse(result);\n }\n}\n\nexport const createWebsocketsAction = <\n T extends IGenericData = IGenericData,\n R extends IGenericData = IGenericData\n>(\n actions: IWebsocketsActions,\n name: string\n): IWebsocketsAction<T, R> => {\n return new WebsocketsAction<T, R>(actions, name);\n};\n"],"mappings":"AAOA,OAAO,MAAMA,gBAAgB,CAI7B;EAIWC,WAAWA,CAACC,OAA2B,EAAEC,IAAY,EAAE;IAC1D,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACD,OAAO,GAAGA,OAAO;EAC1B;EAEA,MAAaE,OAAOA,CAACC,MAA8C,EAAqB;IACpF,MAAM;MAAEC,IAAI;MAAEC,UAAU;MAAEC,OAAO,GAAG;IAAM,CAAC,GAAGH,MAAM,IAAI,CAAC,CAAC;IAC1D,MAAMI,OAAO,GAAG,IAAI,CAACP,OAAO,CAACQ,GAAG,CAAO;MACnCC,MAAM,EAAE,IAAI,CAACR,IAAI;MACjBG,IAAI;MACJE,OAAO,EAAED,UAAU,IAAIC,OAAO,GAAG,CAAC,GAAGA,OAAO,GAAGI;IACnD,CAAC,CAAC;IACF,IAAI,CAACL,UAAU,EAAE;MACb,OAAO,IAAI;IACf;IACA,MAAMM,MAAM,GAAG,MAAMJ,OAAO;IAE5B,OAAOF,UAAU,CAACM,MAAM,CAAC;EAC7B;AACJ;AAEA,OAAO,MAAMC,sBAAsB,GAAGA,CAIlCZ,OAA2B,EAC3BC,IAAY,KACc;EAC1B,OAAO,IAAIH,gBAAgB,CAAOE,OAAO,EAAEC,IAAI,CAAC;AACpD,CAAC","ignoreList":[]}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import { IGenericData, IWebsocketsActions, IWebsocketsActionsRunParams, IWebsocketsManager } from "./types";
|
|
1
|
+
import type { IGenericData, IWebsocketsActions, IWebsocketsActionsRunParams, IWebsocketsManager } from "./types.js";
|
|
2
2
|
export interface IWebsocketActionsParams {
|
|
3
3
|
manager: IWebsocketsManager;
|
|
4
4
|
tenant: string | null;
|
|
5
|
-
locale: string | null;
|
|
6
5
|
getToken: () => Promise<string | undefined>;
|
|
7
6
|
}
|
|
8
7
|
export declare class WebsocketsActions implements IWebsocketsActions {
|
|
9
8
|
readonly manager: IWebsocketsManager;
|
|
10
9
|
private readonly getToken;
|
|
11
10
|
private readonly tenant;
|
|
12
|
-
private readonly locale;
|
|
13
11
|
constructor(params: IWebsocketActionsParams);
|
|
14
12
|
run<T extends IGenericData = IGenericData, R extends IGenericData = IGenericData>(params: IWebsocketsActionsRunParams<T>): Promise<R | null>;
|
|
15
13
|
}
|
|
@@ -1,95 +1,78 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.createWebsocketsActions = exports.WebsocketsActions = void 0;
|
|
8
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
-
var WebsocketsActions = exports.WebsocketsActions = /*#__PURE__*/function () {
|
|
11
|
-
function WebsocketsActions(params) {
|
|
12
|
-
(0, _classCallCheck2.default)(this, WebsocketsActions);
|
|
1
|
+
export class WebsocketsActions {
|
|
2
|
+
constructor(params) {
|
|
13
3
|
this.manager = params.manager;
|
|
14
4
|
this.tenant = params.tenant;
|
|
15
|
-
this.locale = params.locale;
|
|
16
5
|
this.getToken = params.getToken;
|
|
17
6
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
tenant: this.tenant,
|
|
47
|
-
locale: this.locale,
|
|
48
|
-
action: action,
|
|
49
|
-
data: data || {}
|
|
50
|
-
});
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* In case of a timeout, we will send the message and wait for the response.
|
|
55
|
-
*/
|
|
56
|
-
return await new Promise(function (resolve, reject) {
|
|
57
|
-
var promiseTimeout = null;
|
|
58
|
-
var subscription = _this.manager.onMessage(async function (event) {
|
|
59
|
-
if (event.data.messageId !== subscription.id) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
resolve(event.data);
|
|
63
|
-
subscription.off();
|
|
64
|
-
if (!promiseTimeout) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
clearTimeout(promiseTimeout);
|
|
68
|
-
});
|
|
69
|
-
promiseTimeout = setTimeout(function () {
|
|
70
|
-
var message = "Websocket action \"".concat(action, "\" timeout.");
|
|
71
|
-
subscription.off();
|
|
72
|
-
reject(new Error(message));
|
|
73
|
-
}, timeout);
|
|
74
|
-
_this.manager.send({
|
|
75
|
-
/**
|
|
76
|
-
* It is ok to cast as we are checking the values a few lines above.
|
|
77
|
-
*/
|
|
78
|
-
token: token,
|
|
79
|
-
tenant: _this.tenant,
|
|
80
|
-
locale: _this.locale,
|
|
81
|
-
messageId: subscription.id,
|
|
82
|
-
action: action,
|
|
83
|
-
data: data || {}
|
|
84
|
-
});
|
|
85
|
-
}).catch(function (ex) {
|
|
86
|
-
console.error("Error while sending websocket message.", ex);
|
|
87
|
-
return null;
|
|
7
|
+
async run(params) {
|
|
8
|
+
const {
|
|
9
|
+
action,
|
|
10
|
+
timeout,
|
|
11
|
+
data
|
|
12
|
+
} = params;
|
|
13
|
+
const token = await this.getToken();
|
|
14
|
+
if (!token) {
|
|
15
|
+
console.error("Token is not set - cannot send a websocket message.");
|
|
16
|
+
return null;
|
|
17
|
+
} else if (!this.tenant) {
|
|
18
|
+
console.error("Tenant is not set - cannot send a websocket message.");
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* If no timeout was sent, we will just send the message and return null.
|
|
24
|
+
* No waiting for the response.
|
|
25
|
+
*/
|
|
26
|
+
if (!timeout || timeout < 0) {
|
|
27
|
+
this.manager.send({
|
|
28
|
+
/**
|
|
29
|
+
* It is ok to cast as we are checking the values a few lines above.
|
|
30
|
+
*/
|
|
31
|
+
token,
|
|
32
|
+
tenant: this.tenant,
|
|
33
|
+
action,
|
|
34
|
+
data: data || {}
|
|
88
35
|
});
|
|
36
|
+
return null;
|
|
89
37
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
38
|
+
/**
|
|
39
|
+
* In case of a timeout, we will send the message and wait for the response.
|
|
40
|
+
*/
|
|
41
|
+
return await new Promise((resolve, reject) => {
|
|
42
|
+
let promiseTimeout = null;
|
|
43
|
+
const subscription = this.manager.onMessage(async event => {
|
|
44
|
+
if (event.data.messageId !== subscription.id) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
resolve(event.data);
|
|
48
|
+
subscription.off();
|
|
49
|
+
if (!promiseTimeout) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
clearTimeout(promiseTimeout);
|
|
53
|
+
});
|
|
54
|
+
promiseTimeout = setTimeout(() => {
|
|
55
|
+
const message = `Websocket action "${action}" timeout.`;
|
|
56
|
+
subscription.off();
|
|
57
|
+
reject(new Error(message));
|
|
58
|
+
}, timeout);
|
|
59
|
+
this.manager.send({
|
|
60
|
+
/**
|
|
61
|
+
* It is ok to cast as we are checking the values a few lines above.
|
|
62
|
+
*/
|
|
63
|
+
token,
|
|
64
|
+
tenant: this.tenant,
|
|
65
|
+
messageId: subscription.id,
|
|
66
|
+
action,
|
|
67
|
+
data: data || {}
|
|
68
|
+
});
|
|
69
|
+
}).catch(ex => {
|
|
70
|
+
console.error("Error while sending websocket message.", ex);
|
|
71
|
+
return null;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export const createWebsocketsActions = params => {
|
|
93
76
|
return new WebsocketsActions(params);
|
|
94
77
|
};
|
|
95
78
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebsocketsActions","
|
|
1
|
+
{"version":3,"names":["WebsocketsActions","constructor","params","manager","tenant","getToken","run","action","timeout","data","token","console","error","send","Promise","resolve","reject","promiseTimeout","subscription","onMessage","event","messageId","id","off","clearTimeout","setTimeout","message","Error","catch","ex","createWebsocketsActions"],"sources":["WebsocketsActions.ts"],"sourcesContent":["import type {\n IGenericData,\n IWebsocketsActions,\n IWebsocketsActionsRunParams,\n IWebsocketsManager,\n IWebsocketManagerSendData\n} from \"./types.js\";\n\nexport interface IWebsocketActionsParams {\n manager: IWebsocketsManager;\n tenant: string | null;\n getToken: () => Promise<string | undefined>;\n}\n\nexport class WebsocketsActions implements IWebsocketsActions {\n public readonly manager: IWebsocketsManager;\n\n private readonly getToken: () => Promise<string | undefined>;\n private readonly tenant: string | null;\n\n public constructor(params: IWebsocketActionsParams) {\n this.manager = params.manager;\n this.tenant = params.tenant;\n this.getToken = params.getToken;\n }\n\n public async run<T extends IGenericData = IGenericData, R extends IGenericData = IGenericData>(\n params: IWebsocketsActionsRunParams<T>\n ): Promise<R | null> {\n const { action, timeout, data } = params;\n const token = await this.getToken();\n if (!token) {\n console.error(\"Token is not set - cannot send a websocket message.\");\n return null;\n } else if (!this.tenant) {\n console.error(\"Tenant is not set - cannot send a websocket message.\");\n return null;\n }\n\n /**\n * If no timeout was sent, we will just send the message and return null.\n * No waiting for the response.\n */\n if (!timeout || timeout < 0) {\n this.manager.send<IWebsocketManagerSendData<T>>({\n /**\n * It is ok to cast as we are checking the values a few lines above.\n */\n token,\n tenant: this.tenant as string,\n action,\n data: data || ({} as T)\n });\n return null;\n }\n /**\n * In case of a timeout, we will send the message and wait for the response.\n */\n return await new Promise<R>((resolve, reject) => {\n let promiseTimeout: NodeJS.Timeout | null = null;\n const subscription = this.manager.onMessage<R>(async event => {\n if (event.data.messageId !== subscription.id) {\n return;\n }\n resolve(event.data);\n subscription.off();\n if (!promiseTimeout) {\n return;\n }\n clearTimeout(promiseTimeout);\n });\n\n promiseTimeout = setTimeout(() => {\n const message = `Websocket action \"${action}\" timeout.`;\n subscription.off();\n reject(new Error(message));\n }, timeout);\n\n this.manager.send<IWebsocketManagerSendData<T>>({\n /**\n * It is ok to cast as we are checking the values a few lines above.\n */\n token,\n tenant: this.tenant as string,\n messageId: subscription.id,\n action,\n data: data || ({} as T)\n });\n }).catch(ex => {\n console.error(\"Error while sending websocket message.\", ex);\n return null;\n });\n }\n}\n\nexport const createWebsocketsActions = (params: IWebsocketActionsParams): IWebsocketsActions => {\n return new WebsocketsActions(params);\n};\n"],"mappings":"AAcA,OAAO,MAAMA,iBAAiB,CAA+B;EAMlDC,WAAWA,CAACC,MAA+B,EAAE;IAChD,IAAI,CAACC,OAAO,GAAGD,MAAM,CAACC,OAAO;IAC7B,IAAI,CAACC,MAAM,GAAGF,MAAM,CAACE,MAAM;IAC3B,IAAI,CAACC,QAAQ,GAAGH,MAAM,CAACG,QAAQ;EACnC;EAEA,MAAaC,GAAGA,CACZJ,MAAsC,EACrB;IACjB,MAAM;MAAEK,MAAM;MAAEC,OAAO;MAAEC;IAAK,CAAC,GAAGP,MAAM;IACxC,MAAMQ,KAAK,GAAG,MAAM,IAAI,CAACL,QAAQ,CAAC,CAAC;IACnC,IAAI,CAACK,KAAK,EAAE;MACRC,OAAO,CAACC,KAAK,CAAC,qDAAqD,CAAC;MACpE,OAAO,IAAI;IACf,CAAC,MAAM,IAAI,CAAC,IAAI,CAACR,MAAM,EAAE;MACrBO,OAAO,CAACC,KAAK,CAAC,sDAAsD,CAAC;MACrE,OAAO,IAAI;IACf;;IAEA;AACR;AACA;AACA;IACQ,IAAI,CAACJ,OAAO,IAAIA,OAAO,GAAG,CAAC,EAAE;MACzB,IAAI,CAACL,OAAO,CAACU,IAAI,CAA+B;QAC5C;AAChB;AACA;QACgBH,KAAK;QACLN,MAAM,EAAE,IAAI,CAACA,MAAgB;QAC7BG,MAAM;QACNE,IAAI,EAAEA,IAAI,IAAK,CAAC;MACpB,CAAC,CAAC;MACF,OAAO,IAAI;IACf;IACA;AACR;AACA;IACQ,OAAO,MAAM,IAAIK,OAAO,CAAI,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC7C,IAAIC,cAAqC,GAAG,IAAI;MAChD,MAAMC,YAAY,GAAG,IAAI,CAACf,OAAO,CAACgB,SAAS,CAAI,MAAMC,KAAK,IAAI;QAC1D,IAAIA,KAAK,CAACX,IAAI,CAACY,SAAS,KAAKH,YAAY,CAACI,EAAE,EAAE;UAC1C;QACJ;QACAP,OAAO,CAACK,KAAK,CAACX,IAAI,CAAC;QACnBS,YAAY,CAACK,GAAG,CAAC,CAAC;QAClB,IAAI,CAACN,cAAc,EAAE;UACjB;QACJ;QACAO,YAAY,CAACP,cAAc,CAAC;MAChC,CAAC,CAAC;MAEFA,cAAc,GAAGQ,UAAU,CAAC,MAAM;QAC9B,MAAMC,OAAO,GAAG,qBAAqBnB,MAAM,YAAY;QACvDW,YAAY,CAACK,GAAG,CAAC,CAAC;QAClBP,MAAM,CAAC,IAAIW,KAAK,CAACD,OAAO,CAAC,CAAC;MAC9B,CAAC,EAAElB,OAAO,CAAC;MAEX,IAAI,CAACL,OAAO,CAACU,IAAI,CAA+B;QAC5C;AAChB;AACA;QACgBH,KAAK;QACLN,MAAM,EAAE,IAAI,CAACA,MAAgB;QAC7BiB,SAAS,EAAEH,YAAY,CAACI,EAAE;QAC1Bf,MAAM;QACNE,IAAI,EAAEA,IAAI,IAAK,CAAC;MACpB,CAAC,CAAC;IACN,CAAC,CAAC,CAACmB,KAAK,CAACC,EAAE,IAAI;MACXlB,OAAO,CAACC,KAAK,CAAC,wCAAwC,EAAEiB,EAAE,CAAC;MAC3D,OAAO,IAAI;IACf,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMC,uBAAuB,GAAI5B,MAA+B,IAAyB;EAC5F,OAAO,IAAIF,iBAAiB,CAACE,MAAM,CAAC;AACxC,CAAC","ignoreList":[]}
|