vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
35 lines (34 loc) • 1.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.catchInfiniteLoop = catchInfiniteLoop;
const assert_js_1 = require("./assert.js");
const trackers = {};
function catchInfiniteLoop(functionName, maxNumberOfCalls = 100, withinSeconds = 5) {
// Init
const now = new Date();
let tracker = (trackers[functionName] ?? (trackers[functionName] = createTracker(now)));
// Reset
const elapsedTime = now.getTime() - tracker.start.getTime();
if (elapsedTime > withinSeconds * 1000)
tracker = trackers[functionName] = createTracker(now);
// Count
tracker.count++;
// Error
const msg = `[Infinite Loop] Rendering ${tracker.count} times within ${withinSeconds} seconds [${functionName}]`;
if (tracker.count > maxNumberOfCalls) {
(0, assert_js_1.assertUsage)(false, msg);
}
// Warning, at 50% threshold
if (!tracker.warned && tracker.count > maxNumberOfCalls * 0.5) {
// Warning is shown upon 10 calls a second, on average during 5 seconds, given the default parameters
(0, assert_js_1.assertWarning)(false, msg, { onlyOnce: false, showStackTrace: true });
tracker.warned = true;
}
}
function createTracker(now) {
const tracker = {
count: 0,
start: now,
};
return tracker;
}