vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
52 lines (51 loc) • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.genPromise = genPromise;
// Simple implementation without timeout: https://github.com/vikejs/vike/blob/2e59b922e7e0f227d26018dc2b74877c9b0f581b/vike/utils/genPromise.ts
const assert_js_1 = require("./assert.js");
const timeoutSecondsDefault = 25;
function genPromise({ timeout: timeoutSeconds = timeoutSecondsDefault, } = {}) {
let resolve;
let reject;
let finished = false;
const promise_internal = new Promise((resolve_, reject_) => {
resolve = (...args) => {
finished = true;
timeoutClear();
return resolve_(...args);
};
reject = (...args) => {
finished = true;
timeoutClear();
return reject_(...args);
};
});
const timeoutClear = () => timeouts.forEach((t) => clearTimeout(t));
const timeouts = [];
let promise;
if (!timeoutSeconds) {
promise = promise_internal;
}
else {
promise = new Proxy(promise_internal, {
get(target, prop) {
if (prop === 'then' && !finished) {
const err = new Error(`Promise hasn't resolved after ${timeoutSeconds} seconds`);
timeouts.push(setTimeout(() => {
(0, assert_js_1.assert)(err.stack);
(0, assert_js_1.assertWarning)(false, removeStackErrorPrefix(err.stack), { onlyOnce: false });
}, timeoutSeconds * 1000));
}
const value = Reflect.get(target, prop);
return typeof value === 'function' ? value.bind(target) : value;
},
});
}
return { promise, resolve, reject };
}
function removeStackErrorPrefix(errStack) {
const errorPrefix = 'Error: ';
if (errStack.startsWith(errorPrefix))
errStack = errStack.slice(errorPrefix.length);
return errStack;
}