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 @@ -4,7 +4,12 @@ import * as React from 'react'; import { tunnnelbrokerURL } from '../facts/tunnelbroker.js'; -import { type TunnelbrokerMessage } from '../types/tunnelbroker/messages.js'; +import type { MessageReceiveConfirmation } from '../types/tunnelbroker/message-receive-confirmation-types.js'; +import { + type TunnelbrokerMessage, + tunnelbrokerMessageTypes, + tunnelbrokerMessageValidator, +} from '../types/tunnelbroker/messages.js'; import type { ConnectionInitializationMessage } from '../types/tunnelbroker/session-types.js'; export type ClientMessageToDevice = { @@ -50,13 +55,59 @@ tunnelbrokerSocket.onclose = () => { setConnected(false); - console.error('Connection to Tunnelbroker closed'); + console.log('Connection to Tunnelbroker closed'); }; tunnelbrokerSocket.onerror = e => { - console.error('Tunnelbroker socket error:', e.message); + console.log('Tunnelbroker socket error:', e.message); }; tunnelbrokerSocket.onmessage = (event: MessageEvent) => { - console.log('Received message:', event.data); + if (typeof event.data !== 'string') { + console.log('socket received a non-string message'); + return; + } + let rawMessage; + try { + rawMessage = JSON.parse(event.data); + } catch (e) { + console.log('error while parsing Tunnelbroker message:', e.message); + return; + } + + if (!tunnelbrokerMessageValidator.is(rawMessage)) { + console.log('invalid TunnelbrokerMessage'); + return; + } + const message: TunnelbrokerMessage = rawMessage; + + for (const listener of listeners.current) { + listener(message); + } + + if ( + message.type === + tunnelbrokerMessageTypes.CONNECTION_INITIALIZATION_RESPONSE + ) { + if (message.status.type === 'Success' && !connected) { + setConnected(true); + console.log('session with Tunnelbroker created'); + } else if (message.status.type === 'Success' && connected) { + console.log( + 'received ConnectionInitializationResponse with status: Success for already connected socket', + ); + } else { + setConnected(false); + console.log( + 'creating session with Tunnelbroker error:', + message.status.data, + ); + } + } else if (message.type === tunnelbrokerMessageTypes.MESSAGE_TO_DEVICE) { + const confirmation: MessageReceiveConfirmation = { + type: tunnelbrokerMessageTypes.MESSAGE_RECEIVE_CONFIRMATION, + messageIDs: [message.messageID], + }; + socket.current?.send(JSON.stringify(confirmation)); + } }; socket.current = tunnelbrokerSocket;