const { toast } = require('bulma-toast'); const cbor = require('borc'); const assert = require('assert'); // Create WebSocket connection. const ws = new WebSocket('ws://localhost:40000'); ws.binaryType = 'arraybuffer'; // handle user auth within the socket itself // https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html let user = null; function error_toast(err) { console.error(err); return toast({ message: err, type: "is-warning", duration: 5000, }); } function user_login(res) { [struct, user] = res; user = user; console.log(user); return send({ method: 'cryp_spawn', params: { name: 'drake' }}); } function new_cryp(cryp) { console.log('got a new cryp'); } const handlers = { 'cryp_spawn': new_cryp, 'user_login': user_login, 'user_create': user_login, }; function on_message(event) { // decode binary msg from server const blob = new Uint8Array(event.data); const res = cbor.decode(blob); console.log(res); // check for error and split into response type and data if (res.err) return error_toast(res.err); const { method, params } = res; return handlers[method](params); } function send(msg) { msg.token = user && user.token; ws.send(cbor.encode(msg)); } // Connection opened ws.addEventListener('open', function (event) { // send({ method: 'user_create', params: { name: 'ntr', password: 'grepgrepgrep' }}); send({ method: 'user_login', params: { name: 'ntr', password: 'grepgrepgrep' }}); }); // Listen for messages ws.addEventListener('message', on_message); ws.addEventListener('error', function (event) { console.error('WebSocket error', event); user = null; }); ws.addEventListener('close', function (event) { console.error('WebSocket closed', event); user = null; });