+
+
+
Interfaces
+
-
-
-
-
+
+
+
+
+
+
-
+
When enabled, community interfaces will be shown on the Add Interface page.
-
When enabled, community interfaces will be shown on the Add Interface page.
+
-
-
+
diff --git a/src/frontend/js/Utils.js b/src/frontend/js/Utils.js
index 71c9889..e847904 100644
--- a/src/frontend/js/Utils.js
+++ b/src/frontend/js/Utils.js
@@ -124,6 +124,13 @@ class Utils {
}
+ static decodeBase64ToUtf8String(base64) {
+ // support for decoding base64 as a utf8 string to support emojis and cyrillic characters etc
+ return decodeURIComponent(atob(base64).split('').map(function(c) {
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
+ }).join(''));
+ }
+
}
export default Utils;
diff --git a/src/frontend/js/WebSocketConnection.js b/src/frontend/js/WebSocketConnection.js
new file mode 100644
index 0000000..d4622b8
--- /dev/null
+++ b/src/frontend/js/WebSocketConnection.js
@@ -0,0 +1,52 @@
+import mitt from 'mitt';
+
+class WebSocketConnection {
+
+ constructor() {
+ this.emitter = mitt();
+ this.reconnect();
+ }
+
+ // add event listener
+ on(event, handler) {
+ this.emitter.on(event, handler);
+ }
+
+ // remove event listener
+ off(event, handler) {
+ this.emitter.off(event, handler);
+ }
+
+ // emit event
+ emit(type, event) {
+ this.emitter.emit(type, event);
+ }
+
+ reconnect() {
+
+ // connect to websocket
+ this.ws = new WebSocket(location.origin.replace(/^http/, 'ws') + "/ws");
+
+ // auto reconnect when websocket closes
+ this.ws.addEventListener('close', () => {
+ setTimeout(() => {
+ this.reconnect();
+ }, 1000);
+ });
+
+ // emit data received from websocket
+ this.ws.onmessage = (message) => {
+ this.emit("message", message);
+ };
+
+ }
+
+ send(message) {
+ if(this.ws != null && this.ws.readyState === WebSocket.OPEN){
+ this.ws.send(message);
+ }
+ }
+
+}
+
+export default new WebSocketConnection();
diff --git a/src/frontend/main.js b/src/frontend/main.js
index a2dbfa7..9b22d20 100644
--- a/src/frontend/main.js
+++ b/src/frontend/main.js
@@ -6,12 +6,14 @@ import AboutPage from "./components/about/AboutPage.vue";
import SettingsPage from "./components/settings/SettingsPage.vue";
import NetworkVisualiserPage from "./components/network/NetworkVisualiserPage.vue";
import InterfacesPage from "./components/interfaces/InterfacesPage.vue";
+import NomadNetworkPage from "./components/nomadnetwork/NomadNetworkPage.vue";
const router = createRouter({
history: createWebHashHistory(),
routes: [
{ path: '/' },
{ path: '/about', name: "about", component: AboutPage },
+ { path: '/nomadnetwork', name: "nomadnetwork", component: NomadNetworkPage },
{ path: '/settings', name: "settings", component: SettingsPage },
{ path: '/interfaces', name: "interfaces", component: InterfacesPage },
{ path: '/network-visualiser', name: "network-visualiser", component: NetworkVisualiserPage },