implement connection handlers
This commit is contained in:
Vendored
+43
-14
@@ -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 }))
|
||||||
);
|
);
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -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
@@ -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>
|
||||||
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user