grind-assets
Version:
Asset management for Grind
93 lines (75 loc) • 8.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Socket = Socket;
function _isnil(val) { return val === null || typeof val === 'undefined'; }
function Socket(referenceScript) {
if (!window.WebSocket) {
throw new Error('This browser does not support websockets, live reload will not work.');
}
const listeners = {};
let attempts = 0;
let attemptsReset = null;
let pending = false;
let socket = connect();
let firstConnect = true;
function connect() {
const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws';
const socket = new WebSocket(`${protocol}://${window.location.host}/@assets/socket`);
socket.onopen = () => {
if (attemptsReset) {
clearTimeout(attemptsReset);
}
if (firstConnect && !_isnil(referenceScript) && referenceScript.hasAttribute('data-since')) {
socket.send(JSON.stringify({
type: 'init',
since: Number(referenceScript.getAttribute('data-since'))
}));
}
attemptsReset = setTimeout(() => {
attempts = 1;
}, 1000);
firstConnect = false;
};
socket.onclose = _reconnect.bind(null, 'close');
socket.onerror = _reconnect.bind(null, 'error');
socket.onmessage = message => {
message = JSON.parse(message.data);
{
;
(listeners[message.type] || []).forEach(listener => listener(message.asset, message));
}
};
return socket;
}
function _reconnect() {
if (socket.readyState === WebSocket.OPEN) {
return;
}
if (pending) {
return;
} else {
pending = true;
}
const delay = Math.min(30, Math.pow(2, attempts) - 1) * 1000;
if (attemptsReset) {
clearTimeout(attemptsReset);
attemptsReset = null;
}
setTimeout(() => {
attempts++;
pending = false;
socket = connect();
}, delay);
}
return {
on: (event, callback) => {
if (!Array.isArray(listeners[event])) {
listeners[event] = [];
}
listeners[event].push(callback);
}
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9EZXZ0b29scy9Ccm93c2VyL1NvY2tldC5qcyJdLCJuYW1lcyI6WyJTb2NrZXQiLCJyZWZlcmVuY2VTY3JpcHQiLCJ3aW5kb3ciLCJXZWJTb2NrZXQiLCJFcnJvciIsImxpc3RlbmVycyIsImF0dGVtcHRzIiwiYXR0ZW1wdHNSZXNldCIsInBlbmRpbmciLCJzb2NrZXQiLCJjb25uZWN0IiwiZmlyc3RDb25uZWN0IiwicHJvdG9jb2wiLCJsb2NhdGlvbiIsImhvc3QiLCJvbm9wZW4iLCJjbGVhclRpbWVvdXQiLCJoYXNBdHRyaWJ1dGUiLCJzZW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsInR5cGUiLCJzaW5jZSIsIk51bWJlciIsImdldEF0dHJpYnV0ZSIsInNldFRpbWVvdXQiLCJvbmNsb3NlIiwiX3JlY29ubmVjdCIsImJpbmQiLCJvbmVycm9yIiwib25tZXNzYWdlIiwibWVzc2FnZSIsInBhcnNlIiwiZGF0YSIsImZvckVhY2giLCJsaXN0ZW5lciIsImFzc2V0IiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJkZWxheSIsIk1hdGgiLCJtaW4iLCJwb3ciLCJvbiIsImV2ZW50IiwiY2FsbGJhY2siLCJBcnJheSIsImlzQXJyYXkiLCJwdXNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBTyxTQUFTQSxNQUFULENBQWdCQyxlQUFoQixFQUFpQztBQUN2QyxNQUFJLENBQUNDLE1BQU0sQ0FBQ0MsU0FBWixFQUF1QjtBQUN0QixVQUFNLElBQUlDLEtBQUosQ0FBVSxzRUFBVixDQUFOO0FBQ0E7O0FBRUQsUUFBTUMsU0FBUyxHQUFHLEVBQWxCO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLENBQWY7QUFDQSxNQUFJQyxhQUFhLEdBQUcsSUFBcEI7QUFDQSxNQUFJQyxPQUFPLEdBQUcsS0FBZDtBQUNBLE1BQUlDLE1BQU0sR0FBR0MsT0FBTyxFQUFwQjtBQUNBLE1BQUlDLFlBQVksR0FBRyxJQUFuQjs7QUFFQSxXQUFTRCxPQUFULEdBQW1CO0FBQ2xCLFVB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QUFBLFNBQVMsQ0FBQ3VDLEtBQUQsQ0FBVCxHQUFtQixFQUFuQjtBQUNBOztBQUVEdkMsTUFBQUEsU0FBUyxDQUFDdUMsS0FBRCxDQUFULENBQWlCSSxJQUFqQixDQUFzQkgsUUFBdEI7QUFDQTtBQVBLLEdBQVA7QUFTQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBTb2NrZXQocmVmZXJlbmNlU2NyaXB0KSB7XG5cdGlmICghd2luZG93LldlYlNvY2tldCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgd2Vic29ja2V0cywgbGl2ZSByZWxvYWQgd2lsbCBub3Qgd29yay4nKVxuXHR9XG5cblx0Y29uc3QgbGlzdGVuZXJzID0ge31cblx0bGV0IGF0dGVtcHRzID0gMFxuXHRsZXQgYXR0ZW1wdHNSZXNldCA9IG51bGxcblx0bGV0IHBlbmRpbmcgPSBmYWxzZVxuXHRsZXQgc29ja2V0ID0gY29ubmVjdCgpXG5cdGxldCBmaXJzdENvbm5lY3QgPSB0cnVlXG5cblx0ZnVuY3Rpb24gY29ubmVjdCgpIHtcblx0XHRjb25zdCBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cydcblx0XHRjb25zdCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KGAke3Byb3RvY29sfTovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L0Bhc3NldHMvc29ja2V0YClcblxuXHRcdHNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG5cdFx0XHRpZiAoYXR0ZW1wdHNSZXNldCkge1xuXHRcdFx0XHRjbGVhclRpbWVvdXQoYXR0ZW1wdHNSZXNldClcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRmaXJzdENvbm5lY3QgJiZcblx0XHRcdFx0IXJlZmVyZW5jZVNjcmlwdC5pc05pbCAmJlxuXHRcdFx0XHRyZWZlcmVuY2VTY3JpcHQuaGFzQXR0cmlidXRlKCdkYXRhLXNpbmNlJylcblx0XHRcdCkge1xuXHRcdFx0XHRzb2NrZXQuc2VuZChcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0XHR0eXBlOiAnaW5pdCcsXG5cdFx0XHRcdFx0XHRzaW5jZTogTnVtYmVyKHJlZmVyZW5jZVNjcmlwdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2luY2UnKSksXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdClcblx0XHRcdH1cblxuXHRcdFx0YXR0ZW1wdHNSZXNldCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRhdHRlbXB0cyA9IDFcblx0XHRcdH0sIDEwMDApXG5cblx0XHRcdGZpcnN0Q29ubmVjdCA9IGZhbHNlXG5cdFx0fVxuXG5cdFx0c29ja2V0Lm9uY2xvc2UgPSBfcmVjb25uZWN0LmJpbmQobnVsbCwgJ2Nsb3NlJylcblx0XHRzb2NrZXQub25lcnJvciA9IF9yZWNvbm5lY3QuYmluZChudWxsLCAnZXJyb3InKVxuXG5cdFx0c29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4ge1xuXHRcdFx0bWVzc2FnZSA9IEpTT04ucGFyc2UobWVzc2FnZS5kYXRhKVxuXHRcdFx0e1xuXHRcdFx0XHQ7KGxpc3RlbmVyc1ttZXNzYWdlLnR5cGVdIHx8IFtdKS5mb3JFYWNoKGxpc3RlbmVyID0+XG5cdFx0XHRcdFx0bGlzdGVuZXIobWVzc2FnZS5hc3NldCwgbWVzc2FnZSksXG5cdFx0XHRcdClcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc29ja2V0XG5cdH1cblxuXHRmdW5jdGlvbiBfcmVjb25uZWN0KCkge1xuXHRcdGlmIChzb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdGlmIChwZW5kaW5nKSB7XG5cdFx0XHRyZXR1cm5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cGVuZGluZyA9IHRydWVcblx0XHR9XG5cblx0XHRjb25zdCBkZWxheSA9IE1hdGgubWluKDMwLCBNYXRoLnBvdygyLCBhdHRlbXB0cykgLSAxKSAqIDEwMDBcblxuXHRcdGlmIChhdHRlbXB0c1Jlc2V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQoYXR0ZW1wdHNSZXNldClcblx0XHRcdGF0dGVtcHRzUmVzZXQgPSBudWxsXG5cdFx0fVxuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRhdHRlbXB0cysrXG5cdFx0XHRwZW5kaW5nID0gZmFsc2Vcblx0XHRcdHNvY2tldCA9IGNvbm5lY3QoKVxuXHRcdH0sIGRlbGF5KVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRvbjogKGV2ZW50LCBjYWxsYmFjaykgPT4ge1xuXHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGxpc3RlbmVyc1tldmVudF0pKSB7XG5cdFx0XHRcdGxpc3RlbmVyc1tldmVudF0gPSBbXVxuXHRcdFx0fVxuXG5cdFx0XHRsaXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spXG5cdFx0fSxcblx0fVxufVxuIl19