12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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;
- }
- }
|