Skip to content

Commit 3e899ff

Browse files
committed
Handle JWT expirations a little better
1 parent 47697e0 commit 3e899ff

File tree

1 file changed

+39
-14
lines changed

1 file changed

+39
-14
lines changed

resources/scripts/components/server/WebsocketHandler.tsx

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,27 @@ import Spinner from '@/components/elements/Spinner';
88
import tw from 'twin.macro';
99

1010
export default () => {
11-
const server = ServerContext.useStoreState(state => state.server.data);
12-
const [ error, setError ] = useState(false);
11+
let updatingToken = false;
12+
const [ error, setError ] = useState<'connecting' | string>('');
1313
const { connected, instance } = ServerContext.useStoreState(state => state.socket);
14+
const uuid = ServerContext.useStoreState(state => state.server.data?.uuid);
1415
const setServerStatus = ServerContext.useStoreActions(actions => actions.status.setServerStatus);
1516
const { setInstance, setConnectionState } = ServerContext.useStoreActions(actions => actions.socket);
1617

1718
const updateToken = (uuid: string, socket: Websocket) => {
19+
if (updatingToken) return;
20+
21+
updatingToken = true;
1822
getWebsocketToken(uuid)
1923
.then(data => socket.setToken(data.token, true))
20-
.catch(error => console.error(error));
24+
.catch(error => console.error(error))
25+
.then(() => {
26+
updatingToken = false;
27+
});
2128
};
2229

2330
useEffect(() => {
24-
connected && setError(false);
31+
connected && setError('');
2532
}, [ connected ]);
2633

2734
useEffect(() => {
@@ -33,7 +40,7 @@ export default () => {
3340
useEffect(() => {
3441
// If there is already an instance or there is no server, just exit out of this process
3542
// since we don't need to make a new connection.
36-
if (instance || !server) {
43+
if (instance || !uuid) {
3744
return;
3845
}
3946

@@ -42,7 +49,7 @@ export default () => {
4249
socket.on('auth success', () => setConnectionState(true));
4350
socket.on('SOCKET_CLOSE', () => setConnectionState(false));
4451
socket.on('SOCKET_ERROR', () => {
45-
setError(true);
52+
setError('connecting');
4653
setConnectionState(false);
4754
});
4855
socket.on('status', (status) => setServerStatus(status));
@@ -51,10 +58,20 @@ export default () => {
5158
console.warn('Got error message from daemon socket:', message);
5259
});
5360

54-
socket.on('token expiring', () => updateToken(server.uuid, socket));
55-
socket.on('token expired', () => updateToken(server.uuid, socket));
61+
socket.on('token expiring', () => updateToken(uuid, socket));
62+
socket.on('token expired', () => updateToken(uuid, socket));
63+
socket.on('jwt error', (error: string) => {
64+
setConnectionState(false);
65+
console.warn('JWT validation error from wings:', error);
66+
67+
if (error === 'jwt: exp claim is invalid') {
68+
updateToken(uuid, socket);
69+
} else {
70+
setError('There was an error validating the credentials provided for the websocket. Please refresh the page.');
71+
}
72+
});
5673

57-
getWebsocketToken(server.uuid)
74+
getWebsocketToken(uuid)
5875
.then(data => {
5976
// Connect and then set the authentication token.
6077
socket.setToken(data.token).connect(data.socket);
@@ -63,17 +80,25 @@ export default () => {
6380
setInstance(socket);
6481
})
6582
.catch(error => console.error(error));
66-
}, [ server ]);
83+
}, [ uuid ]);
6784

6885
return (
6986
error ?
7087
<CSSTransition timeout={150} in appear classNames={'fade'}>
7188
<div css={tw`bg-red-500 py-2`}>
7289
<ContentContainer css={tw`flex items-center justify-center`}>
73-
<Spinner size={'small'}/>
74-
<p css={tw`ml-2 text-sm text-red-100`}>
75-
We&apos;re having some trouble connecting to your server, please wait...
76-
</p>
90+
{error === 'connecting' ?
91+
<>
92+
<Spinner size={'small'}/>
93+
<p css={tw`ml-2 text-sm text-red-100`}>
94+
We&apos;re having some trouble connecting to your server, please wait...
95+
</p>
96+
</>
97+
:
98+
<p css={tw`ml-2 text-sm text-red-100`}>
99+
{error}
100+
</p>
101+
}
77102
</ContentContainer>
78103
</div>
79104
</CSSTransition>

0 commit comments

Comments
 (0)