| import events from 'events'; |
| import WebSocket from 'faye-websocket'; |
| import objectAssign from 'object-assign'; |
| |
| const debug = require('debug')('tinylr:client'); |
| |
| let idCounter = 0; |
| |
| export default class Client extends events.EventEmitter { |
| |
| constructor (req, socket, head, options = {}) { |
| super(); |
| this.options = options; |
| this.ws = new WebSocket(req, socket, head); |
| this.ws.onmessage = this.message.bind(this); |
| this.ws.onclose = this.close.bind(this); |
| this.id = this.uniqueId('ws'); |
| } |
| |
| message (event) { |
| let data = this.data(event); |
| if (this[data.command]) return this[data.command](data); |
| } |
| |
| close (event) { |
| if (this.ws) { |
| this.ws.close(); |
| this.ws = null; |
| } |
| |
| this.emit('end', event); |
| } |
| |
| // Commands |
| hello () { |
| this.send({ |
| command: 'hello', |
| protocols: [ |
| 'http://livereload.com/protocols/official-7' |
| ], |
| serverName: 'tiny-lr' |
| }); |
| } |
| |
| info (data) { |
| if (data) { |
| debug('Info', data); |
| this.emit('info', objectAssign({}, data, { id: this.id })); |
| this.plugins = data.plugins; |
| this.url = data.url; |
| } |
| |
| return objectAssign({}, data || {}, { id: this.id, url: this.url }); |
| } |
| |
| // Server commands |
| reload (files) { |
| files.forEach(function (file) { |
| this.send({ |
| command: 'reload', |
| path: file, |
| liveCSS: this.options.liveCSS !== false, |
| reloadMissingCSS: this.options.reloadMissingCSS !== false, |
| liveImg: this.options.liveImg !== false |
| }); |
| }, this); |
| } |
| |
| alert (message) { |
| this.send({ |
| command: 'alert', |
| message: message |
| }); |
| } |
| |
| // Utilities |
| data (event) { |
| let data = {}; |
| try { |
| data = JSON.parse(event.data); |
| } catch (e) {} |
| return data; |
| } |
| |
| send (data) { |
| if (!this.ws) return; |
| this.ws.send(JSON.stringify(data)); |
| } |
| |
| uniqueId (prefix) { |
| let id = idCounter++; |
| return prefix ? prefix + id : id; |
| } |
| } |