UNPKG

motion

Version:

motion - moving development forward

133 lines (101 loc) 3.74 kB
exports.__esModule = true; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _sbEventKit = require('sb-event-kit'); var _ws = require('ws'); var _libWport = require('./lib/wport'); var _libWport2 = _interopRequireDefault(_libWport); var _cache = require('./cache'); var _cache2 = _interopRequireDefault(_cache); var _opts = require('./opts'); var _opts2 = _interopRequireDefault(_opts); var _libLog = require('./lib/log'); var _libLog2 = _interopRequireDefault(_libLog); 'use babel'; var debug = _libLog2['default'].bind(null, { name: 'bridge', icon: '🚃' }); exports['default'] = new ((function () { function Bridge() { _classCallCheck(this, Bridge); this.subscriptions = new _sbEventKit.CompositeDisposable(); this.emitter = new _sbEventKit.Emitter(); this.connections = new Set(); this.server = null; this.queue = {}; this.subscriptions.add(this.emitter); } Bridge.prototype.activate = function activate() { var _this = this; this.server = _ws.createServer({ port: _libWport2['default']() }, function (connection) { _this.connections.add(connection); connection.on('close', function () { _this.connections['delete'](connection); }); connection.on('message', function (data, flags) { if (flags.binary) { // Ignore binary debug('Ignoring message because its binary'); return; } try { var message = JSON.parse(data); debug('IN', message._type); _this.emitter.emit('message:' + message._type, message); } catch (_) { debug('Error parsing bridge message'); } }); _this.welcomeConnection(connection); }); }; Bridge.prototype.welcomeConnection = function welcomeConnection(connection) { connection.send(this.encodeMessage('motion:baseDir', { dir: _cache2['default'].baseDir() })); connection.send(this.encodeMessage('motion:opts', _opts2['default']())); for (var key in this.queue) { connection.send(this.queue[key]); } }; Bridge.prototype.broadcast = function broadcast(type, message) { var cacheKey = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; this.broadcastRaw(this.encodeMessage(type, message), cacheKey); }; Bridge.prototype.encodeMessage = function encodeMessage(type) { var message = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; debug('OUT', type); return JSON.stringify(Object.assign({ _type: type, timestamp: Date.now() }, message)); }; Bridge.prototype.broadcastRaw = function broadcastRaw(message) { var cacheKey = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; if (typeof message !== 'string') { throw new Error('Malformed message given'); } // If we have any active connections if (this.connections.size) { this.connections.forEach(function (connection) { connection.send(message); }); } if (cacheKey !== null) { this.queue[cacheKey] = message; } }; Bridge.prototype.onMessage = function onMessage(type, callback) { return this.emitter.on('message:' + type, callback); }; Bridge.prototype.dispose = function dispose() { if (this.server) { this.server.close(); } this.connections.clear(); this.subscriptions.dispose(); this.queue = null; }; return Bridge; })())(); module.exports = exports['default'];