implement connection handlers

This commit is contained in:
marlon-erler
2024-07-19 18:17:00 +02:00
parent f1fd6f55f8
commit 9e74d0227a
3 changed files with 93 additions and 34 deletions
+43 -14
View File
@@ -32,6 +32,19 @@
return JSON.stringify(this._value); return JSON.stringify(this._value);
} }
}; };
function persistState(localStorageKey, state) {
state.subscribe(() => {
const stringifiedValue = state.toString();
localStorage.setItem(localStorageKey, stringifiedValue);
});
}
function restoreState(localStorageKey, initialStateValue) {
const storedString = localStorage.getItem(localStorageKey) ?? JSON.stringify(initialStateValue);
const convertedValue = JSON.parse(storedString);
const state = new State(convertedValue);
persistState(localStorageKey, state);
return state;
}
function createElement(tagName, attributes = {}, ...children) { function createElement(tagName, attributes = {}, ...children) {
const element = document.createElement(tagName); const element = document.createElement(tagName);
if (attributes != null) if (attributes != null)
@@ -176,10 +189,10 @@
} }
// PUBLIC METHODS // PUBLIC METHODS
// connection // connection
connect(address2) { connect(address) {
try { try {
this.disconnect(); this.disconnect();
this.ws = new WebSocket(address2); this.ws = new WebSocket(address);
this.ws.addEventListener("open", this.connectionHandler); this.ws.addEventListener("open", this.connectionHandler);
this.ws.addEventListener("close", this.disconnectionHandler); this.ws.addEventListener("close", this.disconnectionHandler);
this.ws.addEventListener("message", (message) => { this.ws.addEventListener("message", (message) => {
@@ -261,8 +274,8 @@
return this.udn.ws?.url; return this.udn.ws?.url;
} }
// connection // connection
connect = (address2) => { connect = (address) => {
this.udn.connect(address2); this.udn.connect(address);
}; };
disconnect = () => { disconnect = () => {
this.udn.disconnect(); this.udn.disconnect();
@@ -275,27 +288,43 @@
const stringifiedBody = stringify(chatMessage); const stringifiedBody = stringify(chatMessage);
return this.udn.sendMessage(chatMessage.channel, stringifiedBody); return this.udn.sendMessage(chatMessage.channel, stringifiedBody);
}; };
handleMessage = (data) => {
};
// setup // setup
constructor() { constructor(configuration) {
this.udn = new UDNFrontend(); this.udn = new UDNFrontend();
this.udn.onmessage = this.handleMessage; this.udn.onmessage = (data) => {
this.udn.onconnect = this.handleConnectionChange; configuration.messageHandler(data);
this.udn.ondisconnect = this.handleConnectionChange; };
this.udn.onconnect = () => {
this.handleConnectionChange();
configuration.connectionChangeHandler();
};
this.udn.ondisconnect = () => {
this.handleConnectionChange();
configuration.connectionChangeHandler();
};
} }
}; };
// src/View/maintenance.tsx // src/View/maintenance.tsx
var connectionModel = new ConnectionModel(); var addressInput = restoreState("maintenance-address", "");
var address = new State(""); var connectedAddress = new State("");
var isConnected = new State(false);
var connectionModel = new ConnectionModel({
connectionChangeHandler() {
isConnected.value = connectionModel.isConnected;
connectedAddress.value = connectionModel.address ?? "---";
},
messageHandler(data) {
console.log(data);
}
});
function connect() { function connect() {
connectionModel.connect(address.value); connectionModel.connect(addressInput.value);
} }
function disconnect() { function disconnect() {
connectionModel.disconnect(); connectionModel.disconnect();
} }
document.querySelector("main").append( document.querySelector("main").append(
/* @__PURE__ */ createElement("div", { class: "flex-column" }, /* @__PURE__ */ createElement("input", { "bind:value": address }), /* @__PURE__ */ createElement("button", { "on:click": connect }, "Connect"), /* @__PURE__ */ createElement("button", { "on:click": disconnect }, "Disconnect")) /* @__PURE__ */ createElement("div", { class: "flex-column" }, /* @__PURE__ */ createElement("input", { "bind:value": addressInput }), /* @__PURE__ */ createElement("button", { "on:click": connect, "toggle:disabled": isConnected }, "Connect"), /* @__PURE__ */ createElement("button", { "on:click": disconnect }, "Disconnect"), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("span", { "subscribe:innerText": connectedAddress }))
); );
})(); })();
+20 -6
View File
@@ -37,13 +37,27 @@ export default class ConnectionModel {
return this.udn.sendMessage(chatMessage.channel, stringifiedBody); return this.udn.sendMessage(chatMessage.channel, stringifiedBody);
}; };
handleMessage = (data: Message) => {};
// setup // setup
constructor() { constructor(configuration: ConnectionModelConfiguration) {
// create frontend
this.udn = new UDNFrontend(); this.udn = new UDNFrontend();
this.udn.onmessage = this.handleMessage;
this.udn.onconnect = this.handleConnectionChange; // setup handlers
this.udn.ondisconnect = this.handleConnectionChange; this.udn.onmessage = (data: Message) => {
configuration.messageHandler(data);
};
this.udn.onconnect = () => {
this.handleConnectionChange();
configuration.connectionChangeHandler();
};
this.udn.ondisconnect = () => {
this.handleConnectionChange();
configuration.connectionChangeHandler();
};
} }
} }
export interface ConnectionModelConfiguration {
connectionChangeHandler: () => void;
messageHandler: (data: Message) => void;
}
+30 -14
View File
@@ -1,27 +1,43 @@
import * as React from 'bloatless-react'; import * as React from "bloatless-react";
import ConnectionModel from '../Model/connectionModel'; import ConnectionModel from "../Model/connectionModel";
// model
const connectionModel = new ConnectionModel();
// state // state
const address = new React.State(""); const addressInput = React.restoreState("maintenance-address", "");
const connectedAddress = new React.State("");
const isConnected = new React.State(false);
// model
const connectionModel = new ConnectionModel({
connectionChangeHandler() {
isConnected.value = connectionModel.isConnected;
connectedAddress.value = connectionModel.address ?? "---";
},
messageHandler(data) {
console.log(data);
},
});
// methods // methods
function connect() { function connect() {
connectionModel.connect(address.value); connectionModel.connect(addressInput.value);
} }
function disconnect() { function disconnect() {
connectionModel.disconnect(); connectionModel.disconnect();
} }
// view // view
document.querySelector("main")!.append( document.querySelector("main")!.append(
<div class="flex-column"> <div class="flex-column">
<input bind:value={address}></input> <input bind:value={addressInput}></input>
<button on:click={connect}>Connect</button> <button on:click={connect} toggle:disabled={isConnected}>
<button on:click={disconnect}>Disconnect</button> Connect
</div> </button>
) <button on:click={disconnect}>Disconnect</button>
<hr></hr>
<span subscribe:innerText={connectedAddress}></span>
</div>
);