From 94003207f3bd8e4d4e7b0718e2359eb344887325 Mon Sep 17 00:00:00 2001 From: Markus Grigull Date: Sun, 24 Sep 2017 15:48:13 +0200 Subject: [PATCH] Add relative endpoint for nodes --- src/api/websocket-api.js | 12 ++++++++---- src/components/dialog/edit-node.js | 14 +++++++++++--- src/components/dialog/import-node.js | 18 +++++++++++++----- src/components/dialog/new-node.js | 16 ++++++++++++---- src/data-managers/nodes-data-manager.js | 10 +++++++++- .../simulator-data-data-manager.js | 8 ++++---- 6 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/api/websocket-api.js b/src/api/websocket-api.js index ff866e2..00d2f60 100644 --- a/src/api/websocket-api.js +++ b/src/api/websocket-api.js @@ -20,9 +20,9 @@ ******************************************************************************/ class WebsocketAPI { - addSocket(endpoint, callbacks) { + addSocket(node, callbacks) { // create web socket client - var socket = new WebSocket(this.getURL(endpoint), 'live'); + const socket = new WebSocket(this.getURL(node), 'live'); socket.binaryType = 'arraybuffer'; // register callbacks @@ -34,8 +34,12 @@ class WebsocketAPI { return socket; } - getURL(endpoint) { - return 'ws://' + endpoint; + getURL(node) { + if (node.relativeEndpoint) { + return 'ws://' + window.location.host + '/' + node.endpoint; + } else { + return 'ws://' + node.endpoint; + } } } diff --git a/src/components/dialog/edit-node.js b/src/components/dialog/edit-node.js index c782354..19b2f8e 100644 --- a/src/components/dialog/edit-node.js +++ b/src/components/dialog/edit-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; import Dialog from './dialog'; @@ -35,6 +35,7 @@ class NewNodeDialog extends React.Component { endpoint: '', config: {}, simulators: [], + relativeEndpoint: false, _id: '' }; } @@ -50,11 +51,15 @@ class NewNodeDialog extends React.Component { } handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); + if (e.target.type === 'checkbox') { + this.setState({ [e.target.id]: e.target.checked }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id }); + this.setState({ name: this.props.node.name, endpoint: this.props.node.endpoint, config: this.props.node.config, simulators: this.props.node.simulators, _id: this.props.node._id, relativeEndpoint: this.props.node.relativeEndpoint }); } validateForm(target) { @@ -91,6 +96,9 @@ class NewNodeDialog extends React.Component { this.handleChange(e)} /> + + this.handleChange(e)}>Relative Endpoint + ); diff --git a/src/components/dialog/import-node.js b/src/components/dialog/import-node.js index e1128df..1f35129 100644 --- a/src/components/dialog/import-node.js +++ b/src/components/dialog/import-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,7 +34,8 @@ class ImportNodeDialog extends React.Component { this.state = { name: '', endpoint: '', - simulators: [] + simulators: [], + relativeEndpoint: false }; } @@ -47,11 +48,15 @@ class ImportNodeDialog extends React.Component { } handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); + if (e.target.type === 'checkbox') { + this.setState({ [e.target.id]: e.target.checked }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: '', endpoint: '' }); + this.setState({ name: '', endpoint: '', relativeEndpoint: false }); this.imported = false; } @@ -71,7 +76,7 @@ class ImportNodeDialog extends React.Component { // read simulator const node = JSON.parse(event.target.result); self.imported = true; - self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators }); + self.setState({ name: node.name, endpoint: node.endpoint, simulators: node.simulators, relativeEndpoint: node.relativeEndpoint }); }; reader.readAsText(file); @@ -116,6 +121,9 @@ class ImportNodeDialog extends React.Component { this.handleChange(e)} /> + + this.handleChange(e)}>Relative Endpoint + ); diff --git a/src/components/dialog/new-node.js b/src/components/dialog/new-node.js index e7ec1c9..b0b4357 100644 --- a/src/components/dialog/new-node.js +++ b/src/components/dialog/new-node.js @@ -20,7 +20,7 @@ ******************************************************************************/ import React from 'react'; -import { FormGroup, FormControl, ControlLabel } from 'react-bootstrap'; +import { FormGroup, FormControl, ControlLabel, Checkbox } from 'react-bootstrap'; import Dialog from './dialog'; @@ -34,7 +34,8 @@ class NewNodeDialog extends React.Component { name: '', endpoint: '', config: {}, - simulators: [] + simulators: [], + relativeEndpoint: false }; } @@ -49,11 +50,15 @@ class NewNodeDialog extends React.Component { } handleChange(e) { - this.setState({ [e.target.id]: e.target.value }); + if (e.target.type === 'checkbox') { + this.setState({ [e.target.id]: e.target.checked }); + } else { + this.setState({ [e.target.id]: e.target.value }); + } } resetState() { - this.setState({ name: '', endpoint: '', config: {}, simulators: [] }); + this.setState({ name: '', endpoint: '', config: {}, simulators: [], relativeEndpoint: false }); } validateForm(target) { @@ -90,6 +95,9 @@ class NewNodeDialog extends React.Component { this.handleChange(e)} /> + + this.handleChange(e)}>Relative Endpoint + ); diff --git a/src/data-managers/nodes-data-manager.js b/src/data-managers/nodes-data-manager.js index 9b368ac..0a02419 100644 --- a/src/data-managers/nodes-data-manager.js +++ b/src/data-managers/nodes-data-manager.js @@ -28,8 +28,16 @@ class NodesDataManager extends RestDataManager { super('node', '/nodes'); } + getURL(node) { + if (node.relativeEndpoint) { + return 'http://' + window.location.host + '/' + node.endpoint + '/api/v1'; + } else { + return 'http://' + node.endpoint + '/api/v1'; + } + } + getSimulators(node) { - RestAPI.post('http://' + node.endpoint + '/api/v1', { + RestAPI.post(this.getURL(node), { action: 'nodes', id: node._id }).then(response => { diff --git a/src/data-managers/simulator-data-data-manager.js b/src/data-managers/simulator-data-data-manager.js index f74462d..2f88c02 100644 --- a/src/data-managers/simulator-data-data-manager.js +++ b/src/data-managers/simulator-data-data-manager.js @@ -30,18 +30,18 @@ class SimulatorDataDataManager { open(endpoint, node) { // pass signals to onOpen callback if (this._sockets[node._id] != null) { - if (this._sockets[node._id].url !== WebsocketAPI.getURL(endpoint)) { + if (this._sockets[node._id].url !== WebsocketAPI.getURL(node)) { // replace connection, since endpoint changed this._sockets.close(); - this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } else { // set flag if a socket to this simulator was already create before if (this._sockets[node._id] === null) { - this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, false), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } else { - this._sockets[node._id] = WebsocketAPI.addSocket(endpoint, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); + this._sockets[node._id] = WebsocketAPI.addSocket(node, { onOpen: (event) => this.onOpen(event, node, true), onClose: (event) => this.onClose(event, node), onMessage: (event) => this.onMessage(event, node) }); } } }