resend request on lost ws connection

main
alex 2023-10-19 20:29:31 +02:00
parent 730eee9751
commit f56a4235e7
9 changed files with 132 additions and 45 deletions

View File

@ -1,5 +1,10 @@
import { createContext, useContext, useEffect, useRef } from "react"; import { createContext, useContext, useEffect, useRef } from "react";
import { BrowserTabSession, Constants, myFetch } from "../utils"; import {
BrowserTabSession,
Constants,
myFetch,
wsConnectionCustomEventName,
} from "../utils";
import { useSideBarContext } from "./SideBarContext"; import { useSideBarContext } from "./SideBarContext";
import { useAppContext } from "./AppContext"; import { useAppContext } from "./AppContext";
import { handleWebSocketMessage } from "../Handlers/WebSocketMessageHandler"; import { handleWebSocketMessage } from "../Handlers/WebSocketMessageHandler";
@ -15,6 +20,8 @@ const WebSocketContext = createContext(null);
export const useWebSocketContext = () => useContext(WebSocketContext); export const useWebSocketContext = () => useContext(WebSocketContext);
let wsConnectionEvent = null;
export default function WebSocketProvider({ export default function WebSocketProvider({
children, children,
userSession, userSession,
@ -35,6 +42,12 @@ export default function WebSocketProvider({
const usersContext = useUsersContext(); const usersContext = useUsersContext();
const consolesContext = useConsolesContext(); const consolesContext = useConsolesContext();
if (wsConnectionEvent === null) {
wsConnectionEvent = new CustomEvent(wsConnectionCustomEventName, {
detail: "wsReconnect",
});
}
const connect = () => { const connect = () => {
ws.current = new WebSocket( ws.current = new WebSocket(
`${Constants.WS_ADDRESS}?auth=${userSession}&bts=${BrowserTabSession}` `${Constants.WS_ADDRESS}?auth=${userSession}&bts=${BrowserTabSession}`
@ -45,6 +58,9 @@ export default function WebSocketProvider({
sideBarContext.setConnectionBadgeStatus("success"); sideBarContext.setConnectionBadgeStatus("success");
setIsWebSocketReady(true); setIsWebSocketReady(true);
console.log("dispatchEvent");
document.dispatchEvent(wsConnectionEvent);
myFetch("/user/", "GET").then((data) => { myFetch("/user/", "GET").then((data) => {
appContext.userId.current = data.UserId; appContext.userId.current = data.UserId;
appContext.setUserPermissions( appContext.setUserPermissions(

View File

@ -8,6 +8,7 @@ import {
FormatDatetime, FormatDatetime,
hasPermission, hasPermission,
myFetch, myFetch,
wsConnectionCustomEventName,
} from "../../../utils"; } from "../../../utils";
import { useAppContext } from "../../../Contexts/AppContext"; import { useAppContext } from "../../../Contexts/AppContext";
import { useConsolesContext } from "../../../Contexts/ConsolesContext"; import { useConsolesContext } from "../../../Contexts/ConsolesContext";
@ -136,9 +137,14 @@ function LogManagerServersTable({ t, webSocketContext, appContext }) {
}; };
useEffect(() => { useEffect(() => {
myFetch("/lmsc", "GET").then((data) => const lmscRequest = () =>
consolesContext.setConnectedLogManagerServers(data) myFetch("/lmsc", "GET").then((data) =>
); consolesContext.setConnectedLogManagerServers(data)
);
lmscRequest();
document.addEventListener(wsConnectionCustomEventName, () => lmscRequest());
}, []); }, []);
return ( return (

View File

@ -12,7 +12,12 @@ import {
Typography, Typography,
notification, notification,
} from "antd"; } from "antd";
import { Constants, hasPermission, myFetch } from "../../../utils"; import {
Constants,
hasPermission,
myFetch,
wsConnectionCustomEventName,
} from "../../../utils";
import { import {
ArrowDownOutlined, ArrowDownOutlined,
ArrowUpOutlined, ArrowUpOutlined,
@ -118,11 +123,18 @@ export default function AdminAreaRoles() {
); );
useEffect(() => { useEffect(() => {
myFetch("/adminarea/roles", "GET").then((data) => { const rolesRequest = () =>
adminAreaRolesContext.setRoles(data.Roles); myFetch("/adminarea/roles", "GET").then((data) => {
adminAreaRolesContext.setRolesPermissions(data.RolesPermissions); adminAreaRolesContext.setRoles(data.Roles);
adminAreaRolesContext.setUsers(data.Users); adminAreaRolesContext.setRolesPermissions(data.RolesPermissions);
}); adminAreaRolesContext.setUsers(data.Users);
});
rolesRequest();
document.addEventListener(wsConnectionCustomEventName, () =>
rolesRequest()
);
}, []); }, []);
return ( return (

View File

@ -15,6 +15,7 @@ import {
hasOnePermission, hasOnePermission,
hasPermission, hasPermission,
myFetch, myFetch,
wsConnectionCustomEventName,
} from "../../utils"; } from "../../utils";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
@ -331,11 +332,18 @@ export default function AllUsers() {
}; };
useEffect(() => { useEffect(() => {
myFetch("/users", "GET").then((data) => { const usersRequest = () =>
usersContext.setRoleId(data.RoleId); myFetch("/users", "GET").then((data) => {
usersContext.setUsers(data.Users); usersContext.setRoleId(data.RoleId);
usersContext.setRoles(data.Roles); usersContext.setUsers(data.Users);
}); usersContext.setRoles(data.Roles);
});
usersRequest();
document.addEventListener(wsConnectionCustomEventName, () =>
usersRequest()
);
}, []); }, []);
return ( return (

View File

@ -1,7 +1,7 @@
import { Col, Result, Row, Select, Space } from "antd"; import { Col, Result, Row, Select, Space } from "antd";
import LogCard from "../../Components/LogCard"; import LogCard from "../../Components/LogCard";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { AppStyle, myFetch } from "../../utils"; import { AppStyle, myFetch, wsConnectionCustomEventName } from "../../utils";
import { useConsolesContext } from "../../Contexts/ConsolesContext"; import { useConsolesContext } from "../../Contexts/ConsolesContext";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@ -15,11 +15,16 @@ export default function Consoles() {
const [result, setResult] = useState(); const [result, setResult] = useState();
useEffect(() => { useEffect(() => {
myFetch("/lmsc", "GET").then((data) => { const lmscRequest = () =>
consolesContext.setConnectedLogManagerServers(data); myFetch("/lmsc", "GET").then((data) => {
consolesContext.setConnectedLogManagerServers(data);
setSelectedLogServer(data.length > 0 ? data[0].Address : ""); setSelectedLogServer(data.length > 0 ? data[0].Address : "");
}); });
lmscRequest();
document.addEventListener(wsConnectionCustomEventName, () => lmscRequest());
}, []); }, []);
useEffect(() => { useEffect(() => {

View File

@ -3,7 +3,12 @@ import { useEffect, useState } from "react";
import GroupTasksViewModal from "./GroupTasksViewModal"; import GroupTasksViewModal from "./GroupTasksViewModal";
import GroupTypeSelectionModal from "./GroupTypeSelectionModal"; import GroupTypeSelectionModal from "./GroupTypeSelectionModal";
import GroupTaskTableList from "./GroupTasksTableList"; import GroupTaskTableList from "./GroupTasksTableList";
import { Constants, hasPermission, myFetch } from "../../../utils"; import {
Constants,
hasPermission,
myFetch,
wsConnectionCustomEventName,
} from "../../../utils";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { ReloadOutlined } from "@ant-design/icons"; import { ReloadOutlined } from "@ant-design/icons";
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext"; import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
@ -75,10 +80,16 @@ export default function GroupTasks({ isGroupTasksViewModalOpen }) {
} }
}, [paramCategory]); }, [paramCategory]);
useEffect( useEffect(() => {
() => fetchGroupTasks(groupTasksContext.paginationPage), const groupTasksRequest = () =>
[groupTasksContext.paginationPage] fetchGroupTasks(groupTasksContext.paginationPage);
);
groupTasksRequest();
document.addEventListener(wsConnectionCustomEventName, () =>
groupTasksRequest()
);
}, [groupTasksContext.paginationPage]);
useEffect( useEffect(
() => groupTasksContext.setSelectInputs({}), () => groupTasksContext.setSelectInputs({}),

View File

@ -19,6 +19,7 @@ import {
hasPermission, hasPermission,
myFetch, myFetch,
myFetchContentType, myFetchContentType,
wsConnectionCustomEventName,
} from "../../../utils"; } from "../../../utils";
import MyPagination from "../../../Components/MyPagination"; import MyPagination from "../../../Components/MyPagination";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
@ -508,22 +509,40 @@ export default function Robots() {
}); });
}; };
useEffect(() => fetchRobots(0, robotsPaginationPage), [robotsPaginationPage]); const initRequest = () => fetchRobots(0, robotsPaginationPage);
useEffect(
() => fetchRobots(1, unauthorizedRobotsPaginationPage),
[unauthorizedRobotsPaginationPage]
);
useEffect(() => { useEffect(() => {
myFetch( initRequest();
"/permitjoin",
"GET", document.addEventListener(wsConnectionCustomEventName, () => initRequest());
null, }, [robotsPaginationPage]);
{},
myFetchContentType.JSON, const initRequest2 = () => fetchRobots(1, unauthorizedRobotsPaginationPage);
Constants.ROBOTICS_API_ADDRESS
).then((data) => setPermitJoinEnabled(data.Enabled)); useEffect(() => {
initRequest2();
document.addEventListener(wsConnectionCustomEventName, () =>
initRequest2()
);
}, [unauthorizedRobotsPaginationPage]);
useEffect(() => {
const permitJoinRequest = () =>
myFetch(
"/permitjoin",
"GET",
null,
{},
myFetchContentType.JSON,
Constants.ROBOTICS_API_ADDRESS
).then((data) => setPermitJoinEnabled(data.Enabled));
permitJoinRequest();
document.addEventListener(wsConnectionCustomEventName, () =>
permitJoinRequest()
);
sseEventSource.current = new EventSource( sseEventSource.current = new EventSource(
`${Constants.ROBOTICS_API_ADDRESS}/sse` `${Constants.ROBOTICS_API_ADDRESS}/sse`

View File

@ -24,6 +24,7 @@ import {
hasPermission, hasPermission,
isEmailValid, isEmailValid,
myFetch, myFetch,
wsConnectionCustomEventName,
} from "../../utils"; } from "../../utils";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@ -271,13 +272,20 @@ export default function UserProfile() {
}; };
useEffect(() => { useEffect(() => {
myFetch("/user/profile", "GET").then((data) => { const userProfileRequest = () =>
userProfileContext.setEmail(data.Email); myFetch("/user/profile", "GET").then((data) => {
userProfileContext.setSessions(data.Sessions); userProfileContext.setEmail(data.Email);
userProfileContext.setApiKeys(data.ApiKeys); userProfileContext.setSessions(data.Sessions);
userProfileContext.setApiKeys(data.ApiKeys);
setEmail(data.Email); setEmail(data.Email);
}); });
userProfileRequest();
document.addEventListener(wsConnectionCustomEventName, () =>
userProfileRequest()
);
}, []); }, []);
useEffect( useEffect(

View File

@ -261,6 +261,8 @@ export function setUserSessionToLocalStorage(session) {
// not receive any messages // not receive any messages
export const BrowserTabSession = GetUuid(); export const BrowserTabSession = GetUuid();
export const wsConnectionCustomEventName = "wsConnection";
/** /**
* websocket * websocket
*/ */