@webiny/app-websockets 5.43.2 → 6.0.0-alpha.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/WebsocketsContextProvider.js +74 -83
- package/WebsocketsContextProvider.js.map +1 -1
- package/domain/WebsocketsAction.js +20 -33
- package/domain/WebsocketsAction.js.map +1 -1
- package/domain/WebsocketsActions.js +73 -85
- package/domain/WebsocketsActions.js.map +1 -1
- package/domain/WebsocketsConnection.js +86 -114
- package/domain/WebsocketsConnection.js.map +1 -1
- package/domain/WebsocketsManager.js +31 -60
- package/domain/WebsocketsManager.js.map +1 -1
- package/domain/WebsocketsSubscriptionManager.js +62 -95
- package/domain/WebsocketsSubscriptionManager.js.map +1 -1
- package/domain/abstractions/IWebsocketsAction.js +1 -5
- package/domain/abstractions/IWebsocketsActions.js +1 -5
- package/domain/abstractions/IWebsocketsConnection.js +1 -7
- package/domain/abstractions/IWebsocketsConnection.js.map +1 -1
- package/domain/abstractions/IWebsocketsManager.js +1 -5
- package/domain/abstractions/IWebsocketsSubscriptionManager.js +1 -5
- package/domain/abstractions/types.js +1 -7
- package/domain/abstractions/types.js.map +1 -1
- package/domain/index.js +5 -60
- package/domain/index.js.map +1 -1
- package/domain/types.js +6 -71
- package/domain/types.js.map +1 -1
- package/hooks/index.js +1 -16
- package/hooks/index.js.map +1 -1
- package/hooks/useWebsockets.js +4 -10
- package/hooks/useWebsockets.js.map +1 -1
- package/index.js +10 -42
- package/index.js.map +1 -1
- package/package.json +8 -8
- package/types.js +2 -16
- package/types.js.map +1 -1
- package/utils/getUrl.js +2 -8
- package/utils/getUrl.js.map +1 -1
|
@@ -1,45 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
var _useSecurity = (0, _appSecurity.useSecurity)(),
|
|
24
|
-
getIdToken = _useSecurity.getIdToken;
|
|
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 () {
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { useTenancy } from "@webiny/app-tenancy";
|
|
3
|
+
import { useI18N } from "@webiny/app-i18n";
|
|
4
|
+
import { useSecurity } from "@webiny/app-security";
|
|
5
|
+
import { WebsocketsCloseCode } from "./types";
|
|
6
|
+
import { createWebsocketsAction, createWebsocketsActions, createWebsocketsConnection, createWebsocketsManager, createWebsocketsSubscriptionManager } from "./domain";
|
|
7
|
+
import { getUrl } from "./utils/getUrl";
|
|
8
|
+
export const WebsocketsContext = /*#__PURE__*/React.createContext(undefined);
|
|
9
|
+
export const WebsocketsContextProvider = props => {
|
|
10
|
+
const {
|
|
11
|
+
tenant
|
|
12
|
+
} = useTenancy();
|
|
13
|
+
const {
|
|
14
|
+
getCurrentLocale
|
|
15
|
+
} = useI18N();
|
|
16
|
+
const {
|
|
17
|
+
getIdToken
|
|
18
|
+
} = useSecurity();
|
|
19
|
+
const locale = getCurrentLocale("default");
|
|
20
|
+
const socketsRef = useRef();
|
|
21
|
+
const [current, setCurrent] = useState({});
|
|
22
|
+
const getToken = useCallback(async () => {
|
|
32
23
|
return await getIdToken();
|
|
33
24
|
}, [getIdToken]);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
manager.onClose(
|
|
38
|
-
if (currentIteration > 5 || event.code !==
|
|
25
|
+
const subscriptionManager = useMemo(() => {
|
|
26
|
+
const manager = createWebsocketsSubscriptionManager();
|
|
27
|
+
let currentIteration = 0;
|
|
28
|
+
manager.onClose(event => {
|
|
29
|
+
if (currentIteration > 5 || event.code !== WebsocketsCloseCode.GOING_AWAY) {
|
|
39
30
|
return;
|
|
40
31
|
}
|
|
41
32
|
currentIteration++;
|
|
42
|
-
setTimeout(
|
|
33
|
+
setTimeout(() => {
|
|
43
34
|
if (!socketsRef.current) {
|
|
44
35
|
return;
|
|
45
36
|
} else if (socketsRef.current.isClosed()) {
|
|
@@ -57,12 +48,12 @@ var WebsocketsContextProvider = exports.WebsocketsContextProvider = function Web
|
|
|
57
48
|
*
|
|
58
49
|
* If we did not disconnect on component unmount, we would have a memory leak - multiple connections would be opened.
|
|
59
50
|
*/
|
|
60
|
-
|
|
51
|
+
useEffect(() => {
|
|
61
52
|
/**
|
|
62
53
|
* We want to add a window event listener which will check if the connection is closed, and if its - it will connect again.
|
|
63
54
|
*/
|
|
64
|
-
|
|
65
|
-
window.addEventListener("focus",
|
|
55
|
+
const abortController = new AbortController();
|
|
56
|
+
window.addEventListener("focus", () => {
|
|
66
57
|
if (!socketsRef.current) {
|
|
67
58
|
return;
|
|
68
59
|
} else if (socketsRef.current.isClosed()) {
|
|
@@ -72,99 +63,99 @@ var WebsocketsContextProvider = exports.WebsocketsContextProvider = function Web
|
|
|
72
63
|
}, {
|
|
73
64
|
signal: abortController.signal
|
|
74
65
|
});
|
|
75
|
-
window.addEventListener("close",
|
|
66
|
+
window.addEventListener("close", () => {
|
|
76
67
|
subscriptionManager.triggerOnClose(new CloseEvent("windowClose", {
|
|
77
|
-
code:
|
|
68
|
+
code: WebsocketsCloseCode.GOING_AWAY,
|
|
78
69
|
reason: "Closing Window or Tab."
|
|
79
70
|
}));
|
|
80
71
|
}, {
|
|
81
72
|
signal: abortController.signal
|
|
82
73
|
});
|
|
83
|
-
return
|
|
74
|
+
return () => {
|
|
84
75
|
abortController.abort();
|
|
85
76
|
};
|
|
86
77
|
}, []);
|
|
87
|
-
|
|
88
|
-
(async
|
|
89
|
-
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
(async () => {
|
|
80
|
+
const token = await getToken();
|
|
90
81
|
if (!token || !tenant || !locale) {
|
|
91
82
|
return;
|
|
92
83
|
} else if (current.tenant === tenant && current.locale === locale) {
|
|
93
84
|
return;
|
|
94
85
|
} else if (socketsRef.current) {
|
|
95
|
-
await socketsRef.current.close(
|
|
86
|
+
await socketsRef.current.close(WebsocketsCloseCode.NORMAL, "Changing tenant/locale.");
|
|
96
87
|
}
|
|
97
|
-
|
|
88
|
+
const url = getUrl();
|
|
98
89
|
if (!url) {
|
|
99
90
|
console.error("Not possible to connect to the websocket without a valid URL.", {
|
|
100
|
-
tenant
|
|
101
|
-
locale
|
|
102
|
-
token
|
|
91
|
+
tenant,
|
|
92
|
+
locale,
|
|
93
|
+
token
|
|
103
94
|
});
|
|
104
95
|
return;
|
|
105
96
|
}
|
|
106
|
-
socketsRef.current =
|
|
107
|
-
subscriptionManager
|
|
108
|
-
url
|
|
109
|
-
tenant
|
|
110
|
-
locale
|
|
111
|
-
getToken
|
|
97
|
+
socketsRef.current = createWebsocketsManager(createWebsocketsConnection({
|
|
98
|
+
subscriptionManager,
|
|
99
|
+
url,
|
|
100
|
+
tenant,
|
|
101
|
+
locale,
|
|
102
|
+
getToken,
|
|
112
103
|
protocol: ["webiny-ws-v1"]
|
|
113
104
|
}));
|
|
114
105
|
await socketsRef.current.connect();
|
|
115
106
|
setCurrent({
|
|
116
|
-
tenant
|
|
117
|
-
locale
|
|
107
|
+
tenant,
|
|
108
|
+
locale
|
|
118
109
|
});
|
|
119
110
|
})();
|
|
120
111
|
}, [tenant, locale, subscriptionManager, getToken]);
|
|
121
|
-
|
|
122
|
-
return
|
|
112
|
+
const websocketActions = useMemo(() => {
|
|
113
|
+
return createWebsocketsActions({
|
|
123
114
|
manager: socketsRef.current,
|
|
124
|
-
tenant
|
|
125
|
-
locale
|
|
126
|
-
getToken
|
|
115
|
+
tenant,
|
|
116
|
+
locale,
|
|
117
|
+
getToken
|
|
127
118
|
});
|
|
128
119
|
}, [socketsRef.current, tenant, locale, getToken]);
|
|
129
|
-
|
|
120
|
+
const send = useCallback(async (action, data, timeout) => {
|
|
130
121
|
return websocketActions.run({
|
|
131
|
-
action
|
|
132
|
-
data
|
|
133
|
-
timeout
|
|
122
|
+
action,
|
|
123
|
+
data,
|
|
124
|
+
timeout
|
|
134
125
|
});
|
|
135
126
|
}, [websocketActions]);
|
|
136
|
-
|
|
137
|
-
return
|
|
127
|
+
const createAction = useCallback(name => {
|
|
128
|
+
return createWebsocketsAction(websocketActions, name);
|
|
138
129
|
}, [websocketActions]);
|
|
139
|
-
|
|
140
|
-
return socketsRef.current.onMessage(async
|
|
130
|
+
const onMessage = useCallback((action, cb) => {
|
|
131
|
+
return socketsRef.current.onMessage(async event => {
|
|
141
132
|
if (event.data.action !== action) {
|
|
142
133
|
return;
|
|
143
134
|
}
|
|
144
135
|
cb(event.data);
|
|
145
136
|
});
|
|
146
137
|
}, [socketsRef.current]);
|
|
147
|
-
|
|
148
|
-
return socketsRef.current.onError(
|
|
138
|
+
const onError = useCallback(cb => {
|
|
139
|
+
return socketsRef.current.onError(data => {
|
|
149
140
|
return cb(data);
|
|
150
141
|
});
|
|
151
142
|
}, [socketsRef.current]);
|
|
152
|
-
|
|
153
|
-
return socketsRef.current.onClose(
|
|
143
|
+
const onClose = useCallback(cb => {
|
|
144
|
+
return socketsRef.current.onClose(data => {
|
|
154
145
|
return cb(data);
|
|
155
146
|
});
|
|
156
147
|
}, [socketsRef.current]);
|
|
157
148
|
if (!socketsRef.current) {
|
|
158
149
|
return props.loader || null;
|
|
159
150
|
}
|
|
160
|
-
|
|
161
|
-
send
|
|
162
|
-
createAction
|
|
163
|
-
onMessage
|
|
164
|
-
onError
|
|
165
|
-
onClose
|
|
151
|
+
const value = {
|
|
152
|
+
send,
|
|
153
|
+
createAction,
|
|
154
|
+
onMessage,
|
|
155
|
+
onError,
|
|
156
|
+
onClose
|
|
166
157
|
};
|
|
167
|
-
return /*#__PURE__*/
|
|
158
|
+
return /*#__PURE__*/React.createElement(WebsocketsContext.Provider, Object.assign({
|
|
168
159
|
value: value
|
|
169
160
|
}, props));
|
|
170
161
|
};
|
|
@@ -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","abortController","AbortController","window","addEventListener","signal","triggerOnClose","CloseEvent","reason","abort","token","close","NORMAL","url","getUrl","error","createWebsocketsManager","createWebsocketsConnection","protocol","websocketActions","createWebsocketsActions","send","action","data","timeout","run","createAction","name","createWebsocketsAction","onMessage","cb","onError","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 IWebsocketsManagerCloseEvent,\n IWebsocketsManagerErrorEvent,\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 /**\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 || !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 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
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","useState","useTenancy","useI18N","useSecurity","WebsocketsCloseCode","createWebsocketsAction","createWebsocketsActions","createWebsocketsConnection","createWebsocketsManager","createWebsocketsSubscriptionManager","getUrl","WebsocketsContext","createContext","undefined","WebsocketsContextProvider","props","tenant","getCurrentLocale","getIdToken","locale","socketsRef","current","setCurrent","getToken","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 { 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 IWebsocketsManagerCloseEvent,\n IWebsocketsManagerErrorEvent,\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 /**\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 || !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 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,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 {\n IGenericData,\n IWebsocketsAction,\n IWebsocketsActions,\n IWebsocketsActionsTriggerParams\n} from \"./types\";\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,95 +1,83 @@
|
|
|
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
5
|
this.locale = params.locale;
|
|
16
6
|
this.getToken = params.getToken;
|
|
17
7
|
}
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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;
|
|
8
|
+
async run(params) {
|
|
9
|
+
const {
|
|
10
|
+
action,
|
|
11
|
+
timeout,
|
|
12
|
+
data
|
|
13
|
+
} = params;
|
|
14
|
+
const token = await this.getToken();
|
|
15
|
+
if (!token) {
|
|
16
|
+
console.error("Token is not set - cannot send a websocket message.");
|
|
17
|
+
return null;
|
|
18
|
+
} else if (!this.tenant) {
|
|
19
|
+
console.error("Tenant is not set - cannot send a websocket message.");
|
|
20
|
+
return null;
|
|
21
|
+
} else if (!this.locale) {
|
|
22
|
+
console.error("Locale is not set - cannot send a websocket message.");
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* If no timeout was sent, we will just send the message and return null.
|
|
27
|
+
* No waiting for the response.
|
|
28
|
+
*/
|
|
29
|
+
if (!timeout || timeout < 0) {
|
|
30
|
+
this.manager.send({
|
|
31
|
+
/**
|
|
32
|
+
* It is ok to cast as we are checking the values a few lines above.
|
|
33
|
+
*/
|
|
34
|
+
token,
|
|
35
|
+
tenant: this.tenant,
|
|
36
|
+
locale: this.locale,
|
|
37
|
+
action,
|
|
38
|
+
data: data || {}
|
|
88
39
|
});
|
|
40
|
+
return null;
|
|
89
41
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
42
|
+
/**
|
|
43
|
+
* In case of a timeout, we will send the message and wait for the response.
|
|
44
|
+
*/
|
|
45
|
+
return await new Promise((resolve, reject) => {
|
|
46
|
+
let promiseTimeout = null;
|
|
47
|
+
const subscription = this.manager.onMessage(async event => {
|
|
48
|
+
if (event.data.messageId !== subscription.id) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
resolve(event.data);
|
|
52
|
+
subscription.off();
|
|
53
|
+
if (!promiseTimeout) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
clearTimeout(promiseTimeout);
|
|
57
|
+
});
|
|
58
|
+
promiseTimeout = setTimeout(() => {
|
|
59
|
+
const message = `Websocket action "${action}" timeout.`;
|
|
60
|
+
subscription.off();
|
|
61
|
+
reject(new Error(message));
|
|
62
|
+
}, timeout);
|
|
63
|
+
this.manager.send({
|
|
64
|
+
/**
|
|
65
|
+
* It is ok to cast as we are checking the values a few lines above.
|
|
66
|
+
*/
|
|
67
|
+
token,
|
|
68
|
+
tenant: this.tenant,
|
|
69
|
+
locale: this.locale,
|
|
70
|
+
messageId: subscription.id,
|
|
71
|
+
action,
|
|
72
|
+
data: data || {}
|
|
73
|
+
});
|
|
74
|
+
}).catch(ex => {
|
|
75
|
+
console.error("Error while sending websocket message.", ex);
|
|
76
|
+
return null;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export const createWebsocketsActions = params => {
|
|
93
81
|
return new WebsocketsActions(params);
|
|
94
82
|
};
|
|
95
83
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebsocketsActions","
|
|
1
|
+
{"version":3,"names":["WebsocketsActions","constructor","params","manager","tenant","locale","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 {\n IGenericData,\n IWebsocketsActions,\n IWebsocketsActionsRunParams,\n IWebsocketsManager,\n IWebsocketManagerSendData\n} from \"./types\";\n\nexport interface IWebsocketActionsParams {\n manager: IWebsocketsManager;\n tenant: string | null;\n locale: 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 private readonly locale: string | null;\n\n public constructor(params: IWebsocketActionsParams) {\n this.manager = params.manager;\n this.tenant = params.tenant;\n this.locale = params.locale;\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 } else if (!this.locale) {\n console.error(\"Locale is not set - cannot send a websocket message.\");\n return null;\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 locale: this.locale 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 locale: this.locale 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":"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","ignoreList":[]}
|