diff --git a/lib/hooks/qr-auth.js b/lib/hooks/qr-auth.js --- a/lib/hooks/qr-auth.js +++ b/lib/hooks/qr-auth.js @@ -49,8 +49,7 @@ setUnauthorizedDeviceID, addListener, removeListener, - connected: tunnelbrokerConnected, - isAuthorized, + socketState, sendMessage, } = useTunnelbroker(); @@ -61,8 +60,7 @@ if ( !secondaryDeviceID || !aesKey || - !tunnelbrokerConnected || - !isAuthorized || + !socketState.isAuthorized || !primaryDeviceID ) { return; @@ -79,13 +77,12 @@ }); })(); }, [ - tunnelbrokerConnected, - isAuthorized, sendMessage, primaryDeviceID, aesKey, secondaryDeviceID, composeMessage, + socketState, ]); const tunnelbrokerMessageListener = React.useCallback( diff --git a/lib/tunnelbroker/tunnelbroker-context.js b/lib/tunnelbroker/tunnelbroker-context.js --- a/lib/tunnelbroker/tunnelbroker-context.js +++ b/lib/tunnelbroker/tunnelbroker-context.js @@ -45,6 +45,15 @@ }; type Promises = { [clientMessageID: string]: PromiseCallbacks }; +type TunnelbrokerSocketState = + | { + +connected: true, + +isAuthorized: boolean, + } + | { + +connected: false, + }; + type TunnelbrokerContextType = { +sendMessage: ( message: TunnelbrokerClientMessageToDevice, @@ -52,8 +61,7 @@ ) => Promise, +addListener: (listener: TunnelbrokerSocketListener) => void, +removeListener: (listener: TunnelbrokerSocketListener) => void, - +connected: boolean, - +isAuthorized: boolean, + +socketState: TunnelbrokerSocketState, +setUnauthorizedDeviceID: (unauthorizedDeviceID: ?string) => void, }; @@ -121,7 +129,9 @@ const previousInitMessage = React.useRef(null); - const [connected, setConnected] = React.useState(false); + const [socketState, setSocketState] = React.useState( + { connected: false }, + ); const listeners = React.useRef>(new Set()); const socket = React.useRef(null); const socketSessionCounter = React.useRef(0); @@ -143,7 +153,7 @@ stopHeartbeatTimeout(); heartbeatTimeoutID.current = setTimeout(() => { socket.current?.close(); - setConnected(false); + setSocketState({ connected: false }); }, tunnelbrokerHeartbeatTimeout); }, [stopHeartbeatTimeout]); @@ -186,7 +196,7 @@ // when we're already connected (or pending disconnection), // or there's no init message to start with, we don't need // to do anything - if (connected || !initMessage || socket.current) { + if (socketState.connected || !initMessage || socket.current) { return; } @@ -198,7 +208,7 @@ tunnelbrokerSocket.onclose = () => { // this triggers the effect hook again and reconnect - setConnected(false); + setSocketState({ connected: false }); onClose?.(); socket.current = null; console.log('Connection to Tunnelbroker closed'); @@ -236,18 +246,21 @@ message.type === tunnelbrokerMessageTypes.CONNECTION_INITIALIZATION_RESPONSE ) { - if (message.status.type === 'Success' && !connected) { - setConnected(true); + if (message.status.type === 'Success' && !socketState.connected) { + setSocketState({ connected: true, isAuthorized }); console.log( 'session with Tunnelbroker created. isAuthorized:', isAuthorized, ); - } else if (message.status.type === 'Success' && connected) { + } else if ( + message.status.type === 'Success' && + socketState.connected + ) { console.log( 'received ConnectionInitializationResponse with status: Success for already connected socket', ); } else { - setConnected(false); + setSocketState({ connected: false }); console.log( 'creating session with Tunnelbroker error:', message.status.data, @@ -285,7 +298,6 @@ } })(); }, [ - connected, isSocketActive, isAuthorized, resetHeartbeatTimeout, @@ -293,6 +305,7 @@ identityClient, onClose, createInitMessage, + socketState.connected, ]); const sendMessageToDeviceRequest: ( @@ -300,7 +313,7 @@ ) => Promise = React.useCallback( request => { return new Promise((resolve, reject) => { - const socketActive = connected && socket.current; + const socketActive = socketState.connected && socket.current; if (!shouldBeClosed && !socketActive) { throw new Error('Tunnelbroker not connected'); } @@ -315,7 +328,7 @@ } }); }, - [connected, secondaryTunnelbrokerConnection, shouldBeClosed], + [socketState, secondaryTunnelbrokerConnection, shouldBeClosed], ); const sendMessage: ( @@ -406,13 +419,12 @@ const value: TunnelbrokerContextType = React.useMemo( () => ({ sendMessage, - connected, - isAuthorized, + socketState, addListener, removeListener, setUnauthorizedDeviceID, }), - [addListener, connected, removeListener, sendMessage, isAuthorized], + [sendMessage, socketState, addListener, removeListener], ); return ( diff --git a/native/profile/tunnelbroker-menu.react.js b/native/profile/tunnelbroker-menu.react.js --- a/native/profile/tunnelbroker-menu.react.js +++ b/native/profile/tunnelbroker-menu.react.js @@ -42,7 +42,7 @@ ); const identityContext = React.useContext(IdentityClientContext); - const { connected, addListener, sendMessage, removeListener } = + const { socketState, addListener, sendMessage, removeListener } = useTunnelbroker(); const [messages, setMessages] = useState([]); const [recipient, setRecipient] = useState(''); @@ -126,7 +126,7 @@ Connected - {connected.toString()} + {socketState.connected.toString()} diff --git a/web/settings/account-settings.react.js b/web/settings/account-settings.react.js --- a/web/settings/account-settings.react.js +++ b/web/settings/account-settings.react.js @@ -85,7 +85,7 @@ const stringForUser = useStringForUser(currentUserInfo); const staffCanSee = useStaffCanSee(); - const { sendMessage, connected, addListener, removeListener } = + const { sendMessage, socketState, addListener, removeListener } = useTunnelbroker(); const openTunnelbrokerModal = React.useCallback( () => @@ -191,7 +191,7 @@
  • Connected - {connected.toString()} + {socketState.connected.toString()}
  • Send message to device