84 lines
2.0 KiB
JavaScript
84 lines
2.0 KiB
JavaScript
/* global __resourceQuery */
|
|
|
|
"use strict";
|
|
|
|
if (typeof EventSource !== "function") {
|
|
throw new Error(
|
|
"Environment doesn't support lazy compilation (requires EventSource)"
|
|
);
|
|
}
|
|
|
|
var urlBase = decodeURIComponent(__resourceQuery.slice(1));
|
|
/** @type {EventSource | undefined} */
|
|
var activeEventSource;
|
|
var activeKeys = new Map();
|
|
var errorHandlers = new Set();
|
|
|
|
var updateEventSource = function updateEventSource() {
|
|
if (activeEventSource) activeEventSource.close();
|
|
if (activeKeys.size) {
|
|
activeEventSource = new EventSource(
|
|
urlBase + Array.from(activeKeys.keys()).join("@")
|
|
);
|
|
/**
|
|
* @this {EventSource}
|
|
* @param {Event & { message?: string, filename?: string, lineno?: number, colno?: number, error?: Error }} event event
|
|
*/
|
|
activeEventSource.onerror = function (event) {
|
|
errorHandlers.forEach(function (onError) {
|
|
onError(
|
|
new Error(
|
|
"Problem communicating active modules to the server: " +
|
|
event.message +
|
|
" " +
|
|
event.filename +
|
|
":" +
|
|
event.lineno +
|
|
":" +
|
|
event.colno +
|
|
" " +
|
|
event.error
|
|
)
|
|
);
|
|
});
|
|
};
|
|
} else {
|
|
activeEventSource = undefined;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {{ data: string, onError: (err: Error) => void, active: boolean, module: module }} options options
|
|
* @returns {() => void} function to destroy response
|
|
*/
|
|
exports.keepAlive = function (options) {
|
|
var data = options.data;
|
|
var onError = options.onError;
|
|
var active = options.active;
|
|
var module = options.module;
|
|
errorHandlers.add(onError);
|
|
var value = activeKeys.get(data) || 0;
|
|
activeKeys.set(data, value + 1);
|
|
if (value === 0) {
|
|
updateEventSource();
|
|
}
|
|
if (!active && !module.hot) {
|
|
console.log(
|
|
"Hot Module Replacement is not enabled. Waiting for process restart..."
|
|
);
|
|
}
|
|
|
|
return function () {
|
|
errorHandlers.delete(onError);
|
|
setTimeout(function () {
|
|
var value = activeKeys.get(data);
|
|
if (value === 1) {
|
|
activeKeys.delete(data);
|
|
updateEventSource();
|
|
} else {
|
|
activeKeys.set(data, value - 1);
|
|
}
|
|
}, 1000);
|
|
};
|
|
};
|