@@ -8,20 +8,27 @@ import Spinner from '@/components/elements/Spinner';
88import tw from 'twin.macro' ;
99
1010export 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'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'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