From 8f832e7ec46a07bc8d40699856c487c64a26702d Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Fri, 17 Jul 2020 21:42:37 -0400 Subject: Socket made into an ES6 class --- examples/jarvis.js | 1 - socket.js | 160 +++++++++++++++++++++++++++-------------------------- 2 files changed, 82 insertions(+), 79 deletions(-) diff --git a/examples/jarvis.js b/examples/jarvis.js index ac27cea..7551a0d 100644 --- a/examples/jarvis.js +++ b/examples/jarvis.js @@ -30,7 +30,6 @@ class MetaSocket extends Socket{ self.on('init',(send)=>{ self.sender = send; }); - Search.call(this); } } var main = new MetaSocket(); diff --git a/socket.js b/socket.js index 47e558d..3d8e63b 100644 --- a/socket.js +++ b/socket.js @@ -7,99 +7,103 @@ let mod = (div, end) => ( ( (div % end) + end ) % end ) // Makes it such that (- class retryws extends EventEmitter{ // a wrapper on ws that retries on failure constructor(addr) { super(); - let sock; - let sockdown = true; - this.send = (message) => { - if (sockdown){ - throw "Socket is down!"; - } - sock.send(message); + this._sock; + this._sockdown = true; + this._addr = addr; + this.sockinit(); + } + send(message){ + if (this._sockdown){ + throw "Socket is down!"; } + this._sock.send(message); + } + sockinit(){ // addr is not expected to change, so not handed as input; similarly, sock is not passed in a chain because behavior is expected to be serial (either initializing or retrying) let self = this; - function sockinit(){ // addr is not expected to change, so not handed as input; similarly, sock is not passed in a chain because behavior is expected to be serial (either initializing or retrying) - sock = new ws(addr); - sock.on('open', () => { sockdown = false; self.emit('open'); }); - sock.on('close', (err) => { console.log('close', err); setTimeout(sockinit,1000); sockdown = true; self.emit('close'); }); - sock.on('error', (err) => { console.log('error', err); sock.close(); }); - sock.on('message', (message) => { self.emit('message',message);}); - } - sockinit(); + this._sock = new ws(this._addr); + this._sock.on('open', () => { self._sockdown = false; self.emit('open'); }); + this._sock.on('close', (err) => { console.log('close', err); + setTimeout(self.sockinit,1000); self._sockdown = true; self.emit('close'); }); + this._sock.on('error', (err) => { console.log('error', err); self._sock.close(); }); + this._sock.on('message', (message) => { self.emit('message',message);}); } + } class Socket extends retryws { - constructor(world='') { // Takes the name of the world, which can be an empty string. + constructor(world=''){ // Takes the name of the world, which can be an empty string. let loc = (world == '') ? '' : `${world}/`; let addr = `wss://www.yourworldoftext.com/${loc}ws/`; super(addr); - let writect = 0; // A running counter to make the server write confirmations meaningful - this.on('message', (msg)=>{ - msg = JSON.parse(msg); - switch (msg.kind){ - case 'write': - this.emit('write', msg.accepted, msg.rejected); break; // A confirmation message for writes (accepted/rejected updates) - case 'cursor': - this.emit('cursor', msg.positions.map(pos => [pos.tileY*8+pos.charY,pos.tileX*16+pos.charX]), msg.sender); break; // Must be used for self-identification - case 'tileUpdate': - this.emit('tileUpdate', msg.sender, msg.source, msg.tiles); break; // Any change by another user or possibly oneself - case 'fetch': - this.emit('fetch', msg.tiles); break; // The response to a fetch request - } - }); + this._writect = 0; // A running counter to make the server write confirmations meaningful + this.on('message', this._msgparse); + } + _msgparse(msg){ + msg = JSON.parse(msg); + switch (msg.kind){ + case 'write': + this.emit('write', msg.accepted, msg.rejected); break; // A confirmation message for writes (accepted/rejected updates) + case 'cursor': + this.emit('cursor', msg.positions.map(pos => [pos.tileY*8+pos.charY,pos.tileX*16+pos.charX]), msg.sender); break; // Must be used for self-identification + case 'tileUpdate': + this.emit('tileUpdate', msg.sender, msg.source, msg.tiles); break; // Any change by another user or possibly oneself + case 'fetch': + this.emit('fetch', msg.tiles); break; // The response to a fetch request + } + } - this.fetch = function(coords){ //coords is a list of min/max pairs of y/x coordinate pairs which each describe at most 1000 tiles - for (let i=0; i 1000) throw "Fetch has overlarge rectangular request"; - coords[i] = {"minY":c[0][0], "minX":c[0][1], "maxY":c[1][0], "maxX":c[1][1]}; - } - this.send( JSON.stringify({ - "fetchRectangles": coords, - "kind": "fetch", - "v": "3" - })); + fetch(coords){ //coords is a list of min/max pairs of y/x coordinate pairs which each describe at most 1000 tiles + for (let i=0; i 1000) throw "Fetch has overlarge rectangular request"; + coords[i] = {"minY":c[0][0], "minX":c[0][1], "maxY":c[1][0], "maxX":c[1][1]}; } + this.send( JSON.stringify({ + "fetchRectangles": coords, + "kind": "fetch", + "v": "3" + })); + } - this.write = function(chars){ //chars is an list of pairs [ pixel coordinate (y/x < 16), char ] - if (chars.length > 200) throw "Too many characters to write by server decree"; - if (chars.length == 0) throw "Send at least a character."; - let write = []; - for (let cha of chars){ - let coord = cha[0]; - write.push([ - Math.floor(coord[0]/8), - Math.floor(coord[1]/16), - mod(coord[0], 8), - mod(coord[1], 16), - 0, - cha[1], - writect - ]); - writect++; - } - this.send( JSON.stringify({ - "edits": write, - "kind": "write" - })); - return writect-1; // Last label within write for cross-referencing with confirmation + write(chars){ //chars is an list of pairs [ pixel coordinate (y/x < 16), char ] + if (chars.length > 200) throw "Too many characters to write by server decree"; + if (chars.length == 0) throw "Send at least a character."; + let write = []; + for (let cha of chars){ + let coord = cha[0]; + write.push([ + Math.floor(coord[0]/8), + Math.floor(coord[1]/16), + mod(coord[0], 8), + mod(coord[1], 16), + 0, + cha[1], + this._writect + ]); + this._writect++; } + this.send( JSON.stringify({ + "edits": write, + "kind": "write" + })); + return this._writect-1; // Last label within write for cross-referencing with confirmation + } - this.cursor = function(coords){ //coords is just one pair of char coords; I think the api could handle more, but it's unnecessary for now. - this.send( JSON.stringify({ - "kind": "cursor", - "positions": - [ - { - "tileY": Math.floor(coords[0]/8), - "tileX": Math.floor(coords[1]/16), - "charY": coords[0] % 8, - "charX": coords[1] % 16 - } - ] - })); - } - + cursor(coords){ //coords is just one pair of char coords; I think the api could handle more, but it's unnecessary for now. + this.send( JSON.stringify({ + "kind": "cursor", + "positions": + [ + { + "tileY": Math.floor(coords[0]/8), + "tileX": Math.floor(coords[1]/16), + "charY": coords[0] % 8, + "charX": coords[1] % 16 + } + ] + })); } + } module.exports = Socket; -- cgit