UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

52 lines (51 loc) 1.96 kB
"use strict"; 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; }