diff --git a/tests/websocket.html b/tests/websocket.html index 0f06fc8..276bf84 100644 --- a/tests/websocket.html +++ b/tests/websocket.html @@ -101,6 +101,26 @@ function installBlock(title, type) { +
+
+
+
+
+
+
+
+
+ +
+
+
+
 
+
+
+
+
+
+
 
@@ -113,17 +133,23 @@ function installBlock(title, type) { class Client { - constructor(type, pingSerializer, getSerializer, setSerializer) { + constructor(type, pingSerializer, getSerializer, setSerializer, pubSerializer, subSerializer) { this.type = type; this.pingSerializer = pingSerializer; this.getSerializer = getSerializer; this.setSerializer = setSerializer; + this.pubSerializer = pubSerializer; + this.subSerializer = subSerializer; this.ws = null; + this.connected = false; + this.subscribed = false; + this.logCount = 0; $(`${this.type}-btn-connect`).addEventListener('click', event => { event.preventDefault(); console.log('Connecting...'); - this.ws = new WebSocket(`ws://${ host }:${ port }/.${ this.type }`); + this.ws = new WebSocket(`ws://${host}:${port}/.${this.type}`); + window.ws = this.ws; this.ws.onopen = event => { console.log('Connected'); this.setConnectedState(true); @@ -135,50 +161,83 @@ class Client { }; this.ws.onclose = event => { - $(`${this.type}-btn-connect`).disabled = false; + console.log('ON CLOSE') + $(`${this.type}-btn-connect`).innerText = 'Connect'; this.setConnectedState(false); + this.subscribed = false; }; }); $(`${this.type}-btn-ping`).addEventListener('click', event => { event.preventDefault(); const serialized = this.pingSerializer(); - this.log("sent", serialized); - this.ws.send(serialized); + this.send(serialized); }); $(`${this.type}-btn-set`).addEventListener('click', event => { event.preventDefault(); const serialized = this.setSerializer($(`${this.type}-set-key`).value, $(`${this.type}-set-value`).value); - this.log("sent", serialized); - this.ws.send(serialized); + this.send(serialized); }); $(`${this.type}-btn-get`).addEventListener('click', event => { event.preventDefault(); - const serialized = this.getSerializer($(`${this.type}-set-key`).value); - this.log("sent", serialized); - this.ws.send(serialized); + const serialized = this.getSerializer($(`${this.type}-get-key`).value); + this.send(serialized); + }); + + $(`${this.type}-btn-pub`).addEventListener('click', event => { + event.preventDefault(); + const serialized = this.pubSerializer($(`${this.type}-pub-channel`).value, $(`${this.type}-pub-message`).value); + this.send(serialized); + }); + + $(`${this.type}-btn-sub`).addEventListener('click', event => { + event.preventDefault(); + const serialized = this.subSerializer($(`${this.type}-sub-channel`).value); + try { + this.send(serialized); + this.subscribed = true; + this.setConnectedState(true); + } catch (e) { + } }); $(`${this.type}-btn-clear`).addEventListener('click', event => { event.preventDefault(); $(`${this.type}-log`).innerText = ""; + this.logCount = 0; + this.updateLogButton(); }); } + send(serialized) { + this.log("sent", serialized); + this.ws.send(serialized); + } + setConnectedState(connected) { + this.connected = connected; $(`${this.type}-btn-connect`).disabled = connected; - $(`${this.type}-btn-ping`).disabled = !connected; - $(`${this.type}-set-key`).disabled = !connected; - $(`${this.type}-set-value`).disabled = !connected; - $(`${this.type}-btn-set`).disabled = !connected; - $(`${this.type}-get-key`).disabled = !connected; - $(`${this.type}-btn-get`).disabled = !connected; - $(`${this.type}-btn-clear`).disabled = !connected; + $(`${this.type}-btn-ping`).disabled = !connected || this.subscribed; + $(`${this.type}-set-key`).disabled = !connected || this.subscribed; + $(`${this.type}-set-value`).disabled = !connected || this.subscribed; + $(`${this.type}-btn-set`).disabled = !connected || this.subscribed; + $(`${this.type}-get-key`).disabled = !connected || this.subscribed; + $(`${this.type}-btn-get`).disabled = !connected || this.subscribed; + $(`${this.type}-pub-channel`).disabled = !connected || this.subscribed; + $(`${this.type}-pub-message`).disabled = !connected || this.subscribed; + $(`${this.type}-btn-pub`).disabled = !connected || this.subscribed; + $(`${this.type}-sub-channel`).disabled = !connected || this.subscribed; + $(`${this.type}-btn-sub`).disabled = !connected || this.subscribed; + $(`${this.type}-state`).innerText = `State: ${connected ? 'Connected' : 'Disconnected'}`; } + updateLogButton() { + $(`${this.type}-btn-clear`).disabled = this.logCount === 0; + } + log(dir, msg) { const id = `${this.type}-log`; @@ -190,6 +249,8 @@ class Client { contents.setAttribute("class", dir); contents.innerHTML = msg; $(id).appendChild(contents); + this.logCount++; + this.updateLogButton(); } } @@ -200,12 +261,16 @@ addEventListener("DOMContentLoaded", () => { const jsonClient = new Client('json', () => JSON.stringify(['PING']), (key) => JSON.stringify(['GET', key]), - (key, value) => JSON.stringify(['SET', key, value])); + (key, value) => JSON.stringify(['SET', key, value]), + (channel, message) => JSON.stringify(['PUBLISH', channel, message]), + (channel) => JSON.stringify(['SUBSCRIBE', channel])); const rawClient = new Client('raw', () => '*1\r\n$4\r\nPING\r\n', (key) => `*2\r\n$3\r\nGET\r\n$${key.length}\r\n${key}\r\n`, - (key, value) => `*3\r\n$3\r\nSET\r\n$${key.length}\r\n${key}\r\n$${value.length}\r\n${value}\r\n`); + (key, value) => `*3\r\n$3\r\nSET\r\n$${key.length}\r\n${key}\r\n$${value.length}\r\n${value}\r\n`, + (channel, message) => `*3\r\n$7\r\nPUBLISH\r\n$${channel.length}\r\n${channel}\r\n$${message.length}\r\n${message}\r\n`, + (channel) => `*2\r\n$9\r\nSUBSCRIBE\r\n$${channel.length}\r\n${channel}\r\n`); });