motion
Version:
motion - moving development forward
662 lines (501 loc) • 25.9 kB
JavaScript
webpackJsonp([0],{
/***/ 0:
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _errors = __webpack_require__(1);
var _errors2 = _interopRequireDefault(_errors);
var _messages = __webpack_require__(2);
var _messages2 = _interopRequireDefault(_messages);
var _eventEmitter = __webpack_require__(67);
var _eventEmitter2 = _interopRequireDefault(_eventEmitter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var emitter = (0, _eventEmitter2.default)({});
window._DT = {
emitter: emitter,
data: null, // should be error
on: function on(name, cb) {
emitter.on(name, cb);
},
timer: {
// received info through script:add so we can time
lastMsgInfo: null,
//maps views to original time
timing: {},
lastTimes: {},
hasLogged: false,
done: function done(view) {
var timing = Motion.timer.timing[view];
var time = +Date.now() - timing.start;
if (!time) return;
if (timing) {
Motion.timer.lastTimes[view] = time;
delete Motion.timer.timing[view];
}
if (!Motion.timer.hasLogged) {
setTimeout(function () {
return Motion.timer.hasLogged = false;
});
Motion.timer.lastTimes[view] = +Date.now() - timing.start;
on.event('hot:finished', { time: time });
}
Motion.timer.hasLogged = true;
},
time: function time(view, info) {
Motion.timer.timing[view] = info;
}
}
};
var opts = {
websocketPort: window._MOTION_WEBSOCKET_PORT
};
(0, _errors2.default)(window._DT, opts);
(0, _messages2.default)(window._DT, opts);
/***/ },
/***/ 1:
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = run;
exports.compileError = compileError;
exports.compileSuccess = compileSuccess;
var browser = undefined;
var browserData = function browserData(data) {
browser.data = data;
};
// this is for using in runview
function motionRuntimeError(message, file, line, col, error) {
browserData({ message: message, file: file, line: line, col: col, stack: error && error.stack });
// console.log('got err', message, file, line, col, error)
browser.emitter.emit('runtime:error');
}
window.motionRuntimeError = motionRuntimeError;
function run(b, opts) {
browser = b;
window.onViewLoaded = function () {
return browserData('success', null);
};
}
function compileError(error) {
if (error.loc) {
var message = error.message;
var fileName = error.fileName;
var loc = error.loc;
var stack = error.stack;
browserData({ message: message, stack: stack, file: fileName, line: loc.line, col: loc.column });
} else if (error.lineNumber) {
var message = error.message;
var stack = error.stack;
var fileName = error.fileName;
var lineNumber = error.lineNumber;
var column = error.column;
browserData({ message: message, stack: stack, file: fileName, line: lineNumber, col: column });
}
}
function compileSuccess() {
browserData(null);
}
/***/ },
/***/ 2:
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _promise = __webpack_require__(3);
var _promise2 = _interopRequireDefault(_promise);
exports.default = run;
var _errors = __webpack_require__(1);
var _favicon = __webpack_require__(58);
var _socket = __webpack_require__(64);
var _socket2 = _interopRequireDefault(_socket);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function run(browser, opts) {
(0, _socket2.default)(browser, opts, {
'editor:location': function editorLocation(msg) {
browser.editorLocation = msg;
},
'view:locations': function viewLocations(msg) {
browser.viewLocations = msg;
},
'script:add': function scriptAdd(msg) {
// Motion.timer.lastMsgInfo = { start: msg.startTime }
replaceScript(msg);
},
'stylesheet:add': function stylesheetAdd(msg) {
addSheet(msg.view);
},
'stylesheet:remove': function stylesheetRemove(msg) {
removeSheet(msg.view);
},
'compile:error': function compileError(msg) {
_favicon.favicon.bad();
(0, _errors.compileError)(msg.error);
},
'compile:success': function compileSuccess(msg) {
_favicon.favicon.good();
(0, _errors.compileSuccess)();
},
'packages:reload': reloadScript('__motionExternals'),
'internals:reload': reloadScript('__motionInternals', { reloadAll: true }),
'file:delete': function fileDelete(_ref) {
var name = _ref.name;
if (!Motion) return; // if attempting before initial load
var views = _Motion.getFile(name);
views.map(removeSheet);
removeScript(name);
Motion.deleteFile(name);
},
'file:outsideChange': function fileOutsideChange(_ref2) {
var name = _ref2.name;
var changed = _ref2.changed;
_Motion.fileChanged[name] = changed;
},
'motion:opts': function motionOpts(opts) {
window.__motionopts = opts;
},
// coming from editor to browser
'editor:state': function editorState(state) {
browser.editor = state;
browser.emitter.emit('editor:state');
}
});
}
// tag loader is a throttler
// it accepts requests to load tags
// and once those tags load, it will continue
function TagLoader() {
var last = {};
var loading = {};
var wait = {};
return function (name, load) {
var oldTag = last[name];
if (wait[name]) {
return;
}
if (loading[name]) {
wait[name] = true;
return;
}
loading[name] = true;
load(oldTag, onDone);
function onDone(newTag) {
last[name] = newTag;
loading[name] = false;
if (wait[name]) {
wait[name] = false;
load(last[name], onDone);
}
}
};
}
/*
This should be a closed async loop for hot loading files.
ws:add => addScript => tagloader => replaceTag =>
replaceTag => (tagLoader|null)
*/
var scriptSelector = function scriptSelector(src) {
return 'script[src^="' + removeTime(removeBase(src)) + '"]';
};
var scriptUrl = function scriptUrl(name) {
return '/_/' + name + '.js';
};
var findScript = function findScript(name) {
return document.querySelector(scriptSelector(scriptUrl(name)));
};
var sheetSelector = function sheetSelector(href) {
return 'link[href^="' + removeTime(removeBase(href)) + '"]';
};
var sheetUrl = function sheetUrl(name) {
return '/__/styles/' + name + '.css';
};
var findSheet = function findSheet(name) {
return document.querySelector(sheetSelector(sheetUrl(name)));
};
var scrLoad = TagLoader();
var cssLoad = TagLoader();
function addScript(src) {
var path = src.replace('/_/', '');
var start = Date.now();
_socket2.default.send('script:load', { path: path });
scrLoad(src, function (lastTag, done) {
var script = lastTag || document.querySelector(scriptSelector(src)) || createScript(src);
replaceTag(script, 'src', function finish() {
// console.log('script load took', Date.now() - start)
_socket2.default.send('script:done', { path: path });
done();
});
});
}
function addSheet(name) {
cssLoad(name, function (lastTag, done) {
replaceTag(lastTag || findSheet(name) || createSheet(sheetUrl(name)), 'href', done);
});
}
function getParent(tag) {
if (tag.parentNode) return tag.parentNode;
if (tag.nodeName == 'SCRIPT') return document.body;else return document.head;
}
function replaceTag(tag, attr) {
var after = arguments.length <= 2 || arguments[2] === undefined ? function () {} : arguments[2];
if (!tag) return;
var parent = getParent(tag);
var clone = cloneNode(tag, attr);
var already = false;
var cielTimeout = undefined;
var afterFinish = function afterFinish() {
if (already) return;
clearTimeout(cielTimeout);
already = true;
removeTag(tag, parent, function () {
return after(clone);
});
};
clone.onerror = afterFinish;
clone.onload = afterFinish;
parent.appendChild(clone);
// ceil for slow loads
cielTimeout = setTimeout(function () {
if (already) return;
removeTag(tag, tag.parentNode, afterFinish, { leftover: 1 });
}, 120);
}
function removeTag(tag, parent, cb) {
var _ref3 = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
var _ref3$leftover = _ref3.leftover;
var leftover = _ref3$leftover === undefined ? 2 : _ref3$leftover;
try {
parent.removeChild(tag);
setTimeout(cb);
} catch (e) {
var isScript = tag.nodeName == 'SCRIPT';
var tags = document.querySelectorAll(isScript ? scriptSelector(tag.src) : sheetSelector(tag.href));
// attempt force removal
for (var i = 0; i < tags.length - leftover; i++) {
var _tag = tags[i];
try {
_tag.parentNode.removeChild(_tag);
} catch (e) {
try {
document.body.removeChild(_tag);
document.head.removeChild(_tag);
} catch (e) {/* oh well */}
}
}
// wait a bit longer after recovery
setTimeout(cb, 30);
}
}
function reloadScript(id) {
var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
return function (data) {
var el = document.getElementById(id);
if (!el) return;
var finish = opts.reloadAll ? function () {
return reloadImportScripts(data);
} : renderMotion;
var tag = replaceTag(el, 'src', finish);
};
}
function replaceScript(_ref4, cb) {
var name = _ref4.name;
var timestamp = _ref4.timestamp;
var src = _ref4.src;
addScript(src || '/_' + name);
}
var getScriptsByPaths = function getScriptsByPaths(paths) {
return paths.map(function (path) {
return document.querySelector('.__motionScript[src*="' + path + '"]');
});
};
function reloadImportScripts() {
var _ref5 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var importers = _ref5.importers;
// only reload stuff thats changed with imports, if possible
var removeByImporter = importers && importers.length;
var scripts = removeByImporter ? getScriptsByPaths(importers) : document.querySelectorAll('.__motionScript');
if (!scripts.length) return;
var total = scripts.length;
if (removeByImporter) importers.forEach(_Motion.resetViewsInFile);else _Motion.resetViewState();
var scriptLoaders = [];[].forEach.call(scripts, function (script) {
return scriptLoaders.push(new _promise2.default(function (resolve) {
return replaceTag(script, 'src', resolve);
}));
});
_promise2.default.all(scriptLoaders).then(function () {
Motion.render();
});
}
var renderAttempts = 0;
function renderMotion() {
if (renderAttempts > 10) {
renderAttempts = 0;
return;
}
if (typeof Motion != 'undefined') {
setTimeout(Motion.render);
renderAttempts = 0;
} else {
renderAttempts++;
setTimeout(renderMotion, 50);
}
}
function removeBase(str) {
return str.replace(/^http\:\/\/[^/]+/, '');
}
function removeTime(str) {
return str.replace(/\?[0-9]+$/, '');
}
function replaceTime(str) {
return removeTime(str) + ('?' + Date.now());
}
function createScript(src) {
var tag = document.createElement('script');
tag.src = src;
return tag;
}
function createSheet(href) {
var tag = document.createElement('link');
tag.href = href;
tag.rel = "stylesheet";
return tag;
}
function cloneNode(node, attr) {
var clone = undefined;
if (node.tagName != 'SCRIPT') {
clone = node.cloneNode(false);
} else {
clone = document.createElement('script');
var attrs = node.attributes;
for (var i = 0; i < attrs.length; i++) {
if (attrs[i].name != 'src') clone.setAttribute(attrs[i].name, attrs[i].value);
}
}
clone.setAttribute(attr, replaceTime(node.getAttribute(attr)));
return clone;
}
function removeSheet(name) {
var tag = findSheet(name);
if (tag && tag.parentNode) tag.parentNode.removeChild(tag);
}
function removeScript(name) {
var tag = findScript(name.replace('.js', ''));
if (tag && tag.parentNode) {
tag.parentNode.removeChild(tag);
Motion.removeFile(name);
}
}
/***/ },
/***/ 58:
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = __webpack_require__(59);
var _keys2 = _interopRequireDefault(_keys);
exports.favicon = favicon;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var icons = {
yellow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHsAAAB7CAYAAABUx/9/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEU2NUFGRkFDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEU2NUFGRjlDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6YzY0OWVmMmQtM2VlNy00OWFlLTk1MDUtNTU4ODkwMDU5NGE4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VYP/cAAAA2lJREFUeNrsnc9vjEEYx2dFT7Q9E1EORMSVZP1M1N/AXiSr9C4IN4c6Iu6IdRDE38CloRHhJqL2QGnac1tOFa/nyTsrlZB0mXnnmXc/n+R7a/Z9Mp99Z+Z9d2baKIrCwWCwgSZANiAbkA3IBmQDsgHZgGxANiAbkI1sQDYgG5ANyAZkA7IB2YBsQDYgG9mAbEA2IBuQDcgGZAOyAdmAbEA2sgHZgGxANiAbbLDReoHfXSOjxiyQnZAtknHJYckeyS7JJsmoZEnyTdKVvJc8lzyTLNa1MRrWTzj8hzt7SHJKMiE51udQ9UMyLbkneSxZrdOdXSfZ+odtyVXJjgCX/iS5JulICmTbka3d833JwQglzPgvUTd32XWYjWuX/TqSaOc/942kxaNXWs5LHklGIl9nWPJQcgHZadCGv+XH6kqGPMlNyUVm49WO2Sf9bDnFQ3jhu/QnTNDiy97tx+jhhGWtSPZLZpmgxe1KO4lF98bwTqKeZWBktyPOuvulKTnDmB2nG9c3Yx9cmBcmoZjzz/irdONhaRkTrYzl9Pydk+wJ6hqMbnyr5IvRL6f+eLJNskg3HobjhmvVusbpxsNxyHh9R5Edjr3G69uH7HDsNF7fdmSHY9R4fSM5NGIus/Ec/jtsg9l4GJaN17dCNx6OJb6MgyP7o/H6PiM7HO+M1/cW2eF4Yby+aWbj4Wbj+m583tlcLKANqO/GF5iNh2HBleu3LTLj66MbD8hto3XdyaUBc1uporsyxgyVx0qVSGiDThmracr1ufmPO3t9d7bzEzSdmTcNlPbSlYsffzUgd3b4ma+u6Ez9elKv33Z5vLPPVraiC/PPJWzowl9/NreGy3Wvl269uZzo2lfcH7b+IDsuNySXKrzDC3+967k2WB0247f8s+7miGV8lUy6cjPhX2FjX3zZzj/rPpAciFDCK8lpV+5GcTnLrss5aF3/OHbWlS86QjDnP6+5HtF049Xd2WsZ8l27ijri+j8tSY/Iuus4LSkL2WvRc9BOuHLdee8cNB3bdYHgsh+Le+eg6cuap+4/zkFDdlrZlYJsYIIGyAZkA7IB2YBsZNMEyAZkA7IB2YBsQDYgG5ANyAZkA7KRDcgGZAOyAdmAbEA2IBuQDcgGZCMbkA3IBmQDsgHZgGxANiAbkA2/81OAAQB8MsT8ziunpwAAAABJRU5ErkJggg==',
red: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHsAAAB7CAYAAABUx/9/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTEzREY1Q0ZDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTEzREY1Q0VDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6YzY0OWVmMmQtM2VlNy00OWFlLTk1MDUtNTU4ODkwMDU5NGE4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+uqJnXAAAA3VJREFUeNrsnc1rE0EYhzeiJ21zVsToISriSU9+4Ff9G2rxILUKvYqKeu4pUIvnalWwUKV/gwoGrSJ6E7HxIFEw59Z6KjT+XvoWPAmV2ezM5nngx0JJZ97M09nNbnanlW63m0F/sIUhQDYgG5ANyAZkA7IB2YBsQDYgG5CNbEA2IBuQDcgGZAOyAdmAbEA2IBvZgGxANiAbkA3IBmQDsgHZgGxANrIB2YBsQDYgG+Jga+pvoD1+p9D+a9MNZEfCTmVIOakcVOrKdqWqLCm/la/KF+W18kLpMLPTYZtyQRlTTv/jUFX17PLXjStrSlN5pDxTVjlmx0lFuay0lFnl7H+8P3v9GeWJtzPm7SI7Iuq+G7YZuTdQm9bOQ2+3juw4sF32B+V4Tu1bux+VEWQX+0n8mjZPlcGcuxpQ5pTryC5GtA38vR4eU62fKeUGsnsrelibuwV1P6kMI7s3ovdrM1Pgp+SK938A2fmKtoF+7MfQIhnwOirIzo/RHD91b5Zjfl6fzoWIVP5HiGa1XRlrBTyPDlKWnYPXphurzOywjEQm2qildP6dkuwx6uqD3bh24fZlxY9I/zjty5Pd2pV3mNlhOBdxrVbXELvxcJyIvL5TyA7HocjrO4zscOyLvL49yA5HNfL6BpHdP4M5gOxwLEde3y9kh2OJP8b+kf0t8vq+IzscnyOv7xOyw/Em8vqayA7HSyXWi/hdrw/ZIahNN35qsxBpeQteH7IDcj/Suh6kMoApybb7w9uR1WT1zCE7/K7cbv2ZiKysiVRuSUptZht2R+fbSGp55/VkyM5ndtsnX7ujs+jLk9b/aMRnCKWY2SZ8UZurBQ501/tfTG3sknz8R8LntblVUPe3lfkUxy3ZB/sk3J71utnDGd71/iZTHbOkH9mVcHuq8qKyknNXK97PVMrjVYaH8W3tkyPK+5zat3aPej8ZsovHVjyyZ6+uZOEuvLS9PWu3VYZBKtMCOnazvq2pYuufXFJe+c8220bTf7/u7a2VZYDKuDSWXdGa9dg6aOez9fvON9ZB25Gt39O27MfijXXQ7GvU5xnroCVL5y/xfU8yj+wCx2xANiAb2YBsQDYgG5ANyAZkA7IB2YBsQDYgG9mAbEA2IBuQDcgGZAOyAdmAbEA2sgHZgGxANiAbkA3IBmQDsgHZgGxkA7KhNPwRYADHXZyNMi8vGAAAAABJRU5ErkJggg==',
green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHsAAAB7CAYAAABUx/9/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTEzREY1Q0JDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTEzREY1Q0FDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6YzY0OWVmMmQtM2VlNy00OWFlLTk1MDUtNTU4ODkwMDU5NGE4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+kpvnRAAAA3RJREFUeNrsnc1rE0EYhzeiJ01zVsSPQ1SCJz35gVbr31CLB4lR8Coqeu+1Fu9+NVio0r9BJQatInqTYuNBomDOrfVU6Pp76RQ8CZXZ7Mzu88CPhZLOvJmns5vd7E4raZomUA62MQTIBmQDsgHZgGxANiAbkA3IBmQDspENyAZkA7IB2YBsQDYgG5ANyAZkIxuQDcgGZAOyAdmAbEA2IBuQDchGNiAbkA3IBmRDGGyP/Q2MLjZz7b/TaCM7EHYrY8pp5YhSV3YqNWVZ+a18Vb4ob5SXyoCZHQ87lItKSzn7j0NVzWWPe911ZV3pKk+U58oax+wwqShXlJ4yq5z7j/dnrx9Vnrp2Wq5dZAdE3e2GbUYe8NSmtfPYtVtHdhjYLvujcjKj9q3dT8oEsvP9JH5Dm2fKSMZdVZU55Say8xFtA39/iMdU62dauYXs4Yoe1+ZeTt1PKePIHo7oQ9o8yvFTcsX1fxjZ2Yq2gZ5xx9A8qbo6KsjOjmaGn7q3ygl3Xh/PhYhY/keIZrVdGet5PI/2Qd/OwTuN9hoz2y8TgYk29sd0/h2T7BZ1lWA3rl24fVnxI9A/TvvyZK925QNmth/OB1yr1TXGbtwfpwKv7wyy/dEIvL6jyPbHwcDr24dsf9QCr28E2eUZzCqy/bESeH2/kO2PZf4YyyP7W+D1fUe2PxYDr+8zsv3xNvD6usj2xysl1Iv4qasP2T7oNNo/tVkItLwFVx+yPfIg0LoexjKAMcm2+8P7gdVk9cwh2/+u3G79mQysrMlYbkmKbWYbdkfnu0Bqee/qSZCdzey2T752R2felyet/2bAZwiFmNkmfEmbazkOdOr6X4pt7KJ8/EfC57W5k1P3d5X5GMct2gf7JNye9bo9xBmeuv6mYh2zqB/ZlXB7qvKSsppxV6uun+mYx6sID+Pb2ifHlA8ZtW/tHnf9JMjOH1vxyJ69upr4u/DSd+1Zu70iDFKRFtCxm/VtTRVb/+Sy8tr9bKttdN3v111760UZoCIujWVXtGZdbB20C8nGfeeb66DtSjbuaVtxx+LNddDsa9QXCeugRcvgL/GlJ5pHdoFjNiAbkI1sQDYgG5ANyAZkA7IB2YBsQDYgG5CNbEA2IBuQDcgGZAOyAdmAbEA2IBvZgGxANiAbkA3IBmQDsgHZgGxANrIB2VAY/ggwACg0nbVqw0xhAAAAAElFTkSuQmCC',
grey: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHsAAAB7CAYAAABUx/9/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEU2NUFGRkVDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEU2NUFGRkRDREUyMTFFNTg1NDZDOTUyNzBCRkU3QTciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpjNjQ5ZWYyZC0zZWU3LTQ5YWUtOTUwNS01NTg4OTAwNTk0YTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6YzY0OWVmMmQtM2VlNy00OWFlLTk1MDUtNTU4ODkwMDU5NGE4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Cq5CmgAAA3NJREFUeNrsnTtrFFEYhmdFK022VsRLsSpipZUXvMWfMMRgITEKtqKifdoY7L2CgShhf4IKLhpFtBMxayGr4NaJsQpkfT/yBayEyJmdc2afB14Gwuacb8+TM7MzO3NS6/V6GQwGmxgCZAOyAdmAbEA2IBuQDcgGZAOyAdnIBmQDsgHZgGxANiAbkA3IBmQDspENyAZkA7IB2YBsQDYgG5ANyAZkIxuQDcgGZAOyIQ42p/4Gms1mqf3neY7sSNiujCgnlANKQ9mq1JVF5bfyVfmivFZeKF1mdjpsUc4rE8qpfxyq6p4d/rqryqrSUh4pz5QVjtlxUlMuKW1lRjnzH+/PXn9aeeLtTHi7yI6Ihu+GbUbuCdSmtfPQ220gOw5sl/1BOVZQ+9buR2UM2eV+Er+mzVNluOCuhpRZ5TqyyxFtA3+3j8dU62dauYHs/ooe1eZOSd1PKaPI7o/ofdo8KPFTcs3734/sYkXbQD/2Y2iZDHkdNWQXx3iBn7o3ylE/r0/nQkQq/yNEs9qujLUDnkeHoGPn4HmerzCzwzIWmWhjd0rn3ynJnqCuAdiNaxduX1b8iPSP07482aldeZeZHYazEddqdY2wGw/H8cjrO4nscByMvL5DyA7H3sjr24XscNQjr28Y2YMzmEPIDsdS5PX9QnY4FvljHBzZ3yKv7zuyw/E58vo+ITscbyKvr4XscLxUYr2I3/P6kB2CPM9/ajMfaXnzXh+yA3Iv0rrupzKAKcm2+8M7kdVk9cwiO/yu3G79mYysrMlUbklKbWYbdkfn20hqeef1ZMguZnbbJ1+7o7Psy5PW/3jEZwiVmNkmfEGbKyUOdM/7X0ht7JJ8/EfC57S5VVL3t5W5FMct2Qf7JNye9brZxxne8/6mUh2zpB/ZlXB7qvKCslxwV8vez3TK41WFh/Ft7ZPDyvuC2rd2j3g/GbLLx1Y8smevLmfhLrx0vD1rt12FQarSAjp2s76tqWLrn1xUXvnPNtpGy3+/4e2tVmWAqrg0ll3RmvHYOmjnsrX7ztfXQduWrd3TtuTH4vV10Oxr1OcZ66AlS/cv8QNPMo/sAsdsQDYgG9mAbEA2IBuQDcgGZAOyAdmAbEA2IBvZgGxANiAbkA3IBmQDsgHZgGxANrIB2YBsQDYgG5ANyAZkA7IB2YBsZAOyoTL8EWAA2cybfeJOR1cAAAAASUVORK5CYII='
};
function favicon(state) {
var icon = document.querySelector('link[rel="icon"]');
if (!icon) return;
icon.href = icons[state];
}
var states = {
good: 'green',
bad: 'red',
off: 'grey',
wait: 'yellow'
};
// helpers favicon.good()
(0, _keys2.default)(states).forEach(function (key) {
favicon[key] = function () {
return favicon(states[key]);
};
});
/***/ },
/***/ 64:
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _stringify = __webpack_require__(65);
var _stringify2 = _interopRequireDefault(_stringify);
exports.default = socket;
var _favicon = __webpack_require__(58);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var opts = undefined;
var browser = undefined;
var actions = undefined;
var isOpening = false;
var isOpen = false;
var ws = null;
function socket(_browser, _opts, _actions) {
opts = _opts;
browser = _browser;
actions = _actions;
open();
browser.messageEditor = function (obj) {
socket.send('editor', obj);
};
}
socket.send = function send(type, obj) {
obj = obj || {};
obj._type = type;
ws.send((0, _stringify2.default)(obj));
};
function open() {
if (isOpening) return;
isOpening = true;
ws = new WebSocket('ws://localhost:' + opts.websocketPort + '/');
ws.onopen = onOpen;
ws.onmessage = onMessage;
ws.onerror = reconnect;
ws.onclose = reconnect;
}
function onOpen() {
isOpen = true;
isOpening = false;
reconnecting = false;
_favicon.favicon.good();
}
function onMessage(message) {
message = JSON.parse(message.data);
if (localStorage.getItem('__motionLog')) console.log('socket', 'onMessage', 'message', message && message._type, message);
if (!message) return;
var action = actions[message._type];
if (action) action(message);
browser.data = message;
browser.emitter.emit(message._type);
}
var tries = undefined;
var reconnecting = false;
function reconnect() {
_favicon.favicon.off();
isOpening = false;
isOpen = false;
if (ws) ws.close();
if (reconnecting) return;
reconnecting = true;
tries = 0;
reconnector();
}
function reconnector() {
if (isOpen || tries > 50) return;
open();
// delay more and more in between
tries++;
var delay = tries * 1000;
setTimeout(reconnector, delay);
}
/***/ }
});
//# sourceMappingURL=devtools.dev.js.map