diff --git a/lib/facts/tunnelbroker.js b/lib/facts/tunnelbroker.js new file mode 100644 --- /dev/null +++ b/lib/facts/tunnelbroker.js @@ -0,0 +1,9 @@ +// @flow + +import { isDev } from '../utils/dev-utils.js'; + +const tunnnelbrokerURL: string = isDev + ? 'ws://localhost:51001' + : 'https://tunnelbroker.commtechnologies.org'; + +export { tunnnelbrokerURL }; diff --git a/lib/shared/socket-utils.js b/lib/shared/socket-utils.js --- a/lib/shared/socket-utils.js +++ b/lib/shared/socket-utils.js @@ -1,5 +1,7 @@ // @flow +import { tunnnelbrokerURL } from '../facts/tunnelbroker.js'; + function createOpenSocketFunction(baseURL: string): () => WebSocket { const [protocol, address] = baseURL.split('://'); const prefix = protocol === 'https' ? 'wss' : 'ws'; @@ -7,4 +9,8 @@ return () => new WebSocket(endpoint); } -export { createOpenSocketFunction }; +function createTunnelbrokerSocket(): WebSocket { + return new WebSocket(tunnnelbrokerURL); +} + +export { createOpenSocketFunction, createTunnelbrokerSocket }; 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 @@ -32,9 +32,35 @@ }; function TunnelbrokerProvider(props: Props): React.Node { - const { children } = props; - const [connected] = React.useState(false); + const { children, initMessage, openSocket } = props; + const [connected, setConnected] = React.useState(false); const listeners = React.useRef>(new Set()); + const socket = React.useRef(null); + + React.useEffect(() => { + if (connected || !initMessage) { + return; + } + + const tunnelbrokerSocket = openSocket(); + + tunnelbrokerSocket.onopen = () => { + tunnelbrokerSocket.send(JSON.stringify(initMessage)); + }; + + tunnelbrokerSocket.onclose = () => { + setConnected(false); + console.error('Connection to Tunnelbroker closed'); + }; + tunnelbrokerSocket.onerror = e => { + console.error('Tunnelbroker socket error:', e.message); + }; + tunnelbrokerSocket.onmessage = (event: MessageEvent) => { + console.log('Received message:', event.data); + }; + + socket.current = tunnelbrokerSocket; + }, [connected, initMessage, openSocket]); const sendMessage: () => Promise = React.useCallback(() => { return new Promise(() => {});