Opal-Estate-Pro/node_modules/tiny-lr/lib/client.js

95 lines
1.9 KiB
JavaScript
Raw Normal View History

2019-09-13 06:27:52 +02:00
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;
}
}