@tdb/web
Version:
Common condiguration for serving a web-site and testing web-based UI components.
69 lines (56 loc) • 1.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getEventSourceWrapper = getEventSourceWrapper;
function EventSourceWrapper(options) {
var source;
var lastActivity = new Date();
var listeners = [];
if (!options.timeout) {
options.timeout = 20 * 1000;
}
init();
var timer = setInterval(function () {
if (new Date() - lastActivity > options.timeout) {
handleDisconnect();
}
}, options.timeout / 2);
function init() {
source = new window.EventSource(options.path);
source.onopen = handleOnline;
source.onerror = handleDisconnect;
source.onmessage = handleMessage;
}
function handleOnline() {
if (options.log) console.log('[HMR] connected');
lastActivity = new Date();
}
function handleMessage(event) {
lastActivity = new Date();
for (var i = 0; i < listeners.length; i++) {
listeners[i](event);
}
}
function handleDisconnect() {
clearInterval(timer);
source.close();
setTimeout(init, options.timeout);
}
return {
addMessageListener: function addMessageListener(fn) {
listeners.push(fn);
}
};
}
function getEventSourceWrapper(options) {
if (!window.__whmEventSourceWrapper) {
window.__whmEventSourceWrapper = {};
}
if (!window.__whmEventSourceWrapper[options.path]) {
// cache the wrapper for other entries loaded on
// the same page with the same options.path
window.__whmEventSourceWrapper[options.path] = EventSourceWrapper(options);
}
return window.__whmEventSourceWrapper[options.path];
}