Fix server unreachable message showing too often (#6890)
This commit is contained in:
parent
7663276710
commit
25291b04f1
7 changed files with 33 additions and 22 deletions
|
|
@ -86,7 +86,7 @@ export async function handleFirstConnect(serverUrl: string) {
|
|||
|
||||
// ESR: 5.37
|
||||
if (lastDisconnect && config?.EnableReliableWebSockets !== 'true' && alreadyConnected.has(serverUrl)) {
|
||||
handleReconnect(serverUrl);
|
||||
await handleReconnect(serverUrl);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -100,8 +100,8 @@ export async function handleFirstConnect(serverUrl: string) {
|
|||
}
|
||||
}
|
||||
|
||||
export function handleReconnect(serverUrl: string) {
|
||||
doReconnect(serverUrl);
|
||||
export async function handleReconnect(serverUrl: string) {
|
||||
await doReconnect(serverUrl);
|
||||
}
|
||||
|
||||
export async function handleClose(serverUrl: string, lastDisconnect: number) {
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import {makeStyleSheetFromTheme} from '@utils/theme';
|
|||
import {typography} from '@utils/typography';
|
||||
|
||||
type Props = {
|
||||
isConnected: boolean;
|
||||
websocketState: WebsocketConnectedState;
|
||||
}
|
||||
|
||||
const getStyle = makeStyleSheetFromTheme((theme: Theme) => {
|
||||
|
|
@ -74,7 +74,7 @@ const TIME_TO_OPEN = toMilliseconds({seconds: 3});
|
|||
const TIME_TO_CLOSE = toMilliseconds({seconds: 1});
|
||||
|
||||
const ConnectionBanner = ({
|
||||
isConnected,
|
||||
websocketState,
|
||||
}: Props) => {
|
||||
const intl = useIntl();
|
||||
const closeTimeout = useRef<NodeJS.Timeout | null>();
|
||||
|
|
@ -86,6 +86,8 @@ const ConnectionBanner = ({
|
|||
const appState = useAppState();
|
||||
const netInfo = useNetInfo();
|
||||
|
||||
const isConnected = websocketState === 'connected';
|
||||
|
||||
const openCallback = useCallback(() => {
|
||||
setVisible(true);
|
||||
clearTimeoutRef(openTimeout);
|
||||
|
|
@ -97,7 +99,9 @@ const ConnectionBanner = ({
|
|||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!isConnected) {
|
||||
if (websocketState === 'connecting') {
|
||||
openCallback();
|
||||
} else if (!isConnected) {
|
||||
openTimeout.current = setTimeout(openCallback, TIME_TO_OPEN);
|
||||
}
|
||||
return () => {
|
||||
|
|
@ -158,6 +162,8 @@ const ConnectionBanner = ({
|
|||
let text;
|
||||
if (isConnected) {
|
||||
text = intl.formatMessage({id: 'connection_banner.connected', defaultMessage: 'Connection restored'});
|
||||
} else if (websocketState === 'connecting') {
|
||||
text = intl.formatMessage({id: 'connection_banner.connecting', defaultMessage: 'Connecting...'});
|
||||
} else if (netInfo.isInternetReachable) {
|
||||
text = intl.formatMessage({id: 'connection_banner.not_reachable', defaultMessage: 'The server is not reachable'});
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import websocket_manager from '@managers/websocket_manager';
|
|||
import ConnectionBanner from './connection_banner';
|
||||
|
||||
const enhanced = withObservables(['serverUrl'], ({serverUrl}: {serverUrl: string}) => ({
|
||||
isConnected: websocket_manager.observeConnected(serverUrl),
|
||||
websocketState: websocket_manager.observeWebsocketState(serverUrl),
|
||||
}));
|
||||
|
||||
export default withServerUrl(enhanced(ConnectionBanner));
|
||||
|
|
|
|||
|
|
@ -21,10 +21,10 @@ import {isMainActivity} from '@utils/helpers';
|
|||
import {logError} from '@utils/log';
|
||||
|
||||
const WAIT_TO_CLOSE = toMilliseconds({seconds: 15});
|
||||
const WAIT_UNTIL_NEXT = toMilliseconds({seconds: 20});
|
||||
const WAIT_UNTIL_NEXT = toMilliseconds({seconds: 5});
|
||||
|
||||
class WebsocketManager {
|
||||
private connectedSubjects: {[serverUrl: string]: BehaviorSubject<boolean>} = {};
|
||||
private connectedSubjects: {[serverUrl: string]: BehaviorSubject<WebsocketConnectedState>} = {};
|
||||
|
||||
private clients: Record<string, WebSocketClient> = {};
|
||||
private connectionTimerIDs: Record<string, DebouncedFunc<() => void>> = {};
|
||||
|
|
@ -69,7 +69,7 @@ class WebsocketManager {
|
|||
}
|
||||
delete this.clients[serverUrl];
|
||||
|
||||
this.getConnectedSubject(serverUrl).next(false);
|
||||
this.getConnectedSubject(serverUrl).next('not_connected');
|
||||
delete this.connectedSubjects[serverUrl];
|
||||
};
|
||||
|
||||
|
|
@ -96,7 +96,7 @@ class WebsocketManager {
|
|||
const client = this.clients[url];
|
||||
if (client.isConnected()) {
|
||||
client.close(true);
|
||||
this.getConnectedSubject(url).next(false);
|
||||
this.getConnectedSubject(url).next('not_connected');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -107,6 +107,7 @@ class WebsocketManager {
|
|||
if (clientUrl === activeServerUrl) {
|
||||
this.initializeClient(clientUrl);
|
||||
} else {
|
||||
this.getConnectedSubject(clientUrl).next('connecting');
|
||||
const bounce = debounce(this.initializeClient.bind(this, clientUrl), WAIT_UNTIL_NEXT);
|
||||
this.connectionTimerIDs[clientUrl] = bounce;
|
||||
bounce();
|
||||
|
|
@ -118,7 +119,7 @@ class WebsocketManager {
|
|||
return this.clients[serverUrl]?.isConnected();
|
||||
};
|
||||
|
||||
public observeConnected = (serverUrl: string) => {
|
||||
public observeWebsocketState = (serverUrl: string) => {
|
||||
return this.getConnectedSubject(serverUrl).asObservable().pipe(
|
||||
distinctUntilChanged(),
|
||||
);
|
||||
|
|
@ -126,7 +127,7 @@ class WebsocketManager {
|
|||
|
||||
private getConnectedSubject = (serverUrl: string) => {
|
||||
if (!this.connectedSubjects[serverUrl]) {
|
||||
this.connectedSubjects[serverUrl] = new BehaviorSubject(this.isConnected(serverUrl));
|
||||
this.connectedSubjects[serverUrl] = new BehaviorSubject(this.isConnected(serverUrl) ? 'connected' : 'not_connected');
|
||||
}
|
||||
|
||||
return this.connectedSubjects[serverUrl];
|
||||
|
|
@ -153,13 +154,13 @@ class WebsocketManager {
|
|||
private onFirstConnect = (serverUrl: string) => {
|
||||
this.startPeriodicStatusUpdates(serverUrl);
|
||||
handleFirstConnect(serverUrl);
|
||||
this.getConnectedSubject(serverUrl).next(true);
|
||||
this.getConnectedSubject(serverUrl).next('connected');
|
||||
};
|
||||
|
||||
private onReconnect = (serverUrl: string) => {
|
||||
private onReconnect = async (serverUrl: string) => {
|
||||
this.startPeriodicStatusUpdates(serverUrl);
|
||||
handleReconnect(serverUrl);
|
||||
this.getConnectedSubject(serverUrl).next(true);
|
||||
await handleReconnect(serverUrl);
|
||||
this.getConnectedSubject(serverUrl).next('connected');
|
||||
};
|
||||
|
||||
private onWebsocketClose = async (serverUrl: string, connectFailCount: number, lastDisconnect: number) => {
|
||||
|
|
@ -168,7 +169,7 @@ class WebsocketManager {
|
|||
await handleClose(serverUrl, lastDisconnect);
|
||||
|
||||
this.stopPeriodicStatusUpdates(serverUrl);
|
||||
this.getConnectedSubject(serverUrl).next(false);
|
||||
this.getConnectedSubject(serverUrl).next('not_connected');
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import WebsocketManager from '@managers/websocket_manager';
|
|||
import WebSocket from './websocket';
|
||||
|
||||
const enhanced = withObservables(['serverUrl'], ({serverUrl}: {serverUrl: string}) => ({
|
||||
isConnected: WebsocketManager.observeConnected(serverUrl),
|
||||
websocketState: WebsocketManager.observeWebsocketState(serverUrl),
|
||||
}));
|
||||
|
||||
export default enhanced(WebSocket);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import {makeStyleSheetFromTheme} from '@utils/theme';
|
|||
import {typography} from '@utils/typography';
|
||||
|
||||
type Props = {
|
||||
isConnected: boolean;
|
||||
websocketState: WebsocketConnectedState;
|
||||
}
|
||||
|
||||
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
|
||||
|
|
@ -28,10 +28,10 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
|
|||
},
|
||||
}));
|
||||
|
||||
const WebSocket = ({isConnected}: Props) => {
|
||||
const WebSocket = ({websocketState}: Props) => {
|
||||
const theme = useTheme();
|
||||
|
||||
if (isConnected) {
|
||||
if (websocketState === 'connected' || websocketState === 'connecting') {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
|||
4
types/global/websocket.d.ts
vendored
Normal file
4
types/global/websocket.d.ts
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
type WebsocketConnectedState = 'not_connected' | 'connected' | 'connecting';
|
||||
Loading…
Reference in a new issue