42 lines
1.6 KiB
JavaScript
42 lines
1.6 KiB
JavaScript
|
// An internal module to expose the "waitUntil" API to Edge SSR and Edge Route Handler functions.
|
||
|
// This is highly experimental and subject to change.
|
||
|
// We still need a global key to bypass Webpack's layering of modules.
|
||
|
const GLOBAL_KEY = Symbol.for("__next_internal_waitUntil__");
|
||
|
const state = // @ts-ignore
|
||
|
globalThis[GLOBAL_KEY] || // @ts-ignore
|
||
|
(globalThis[GLOBAL_KEY] = {
|
||
|
waitUntilCounter: 0,
|
||
|
waitUntilResolve: undefined,
|
||
|
waitUntilPromise: null
|
||
|
});
|
||
|
// No matter how many concurrent requests are being handled, we want to make sure
|
||
|
// that the final promise is only resolved once all of the waitUntil promises have
|
||
|
// settled.
|
||
|
function resolveOnePromise() {
|
||
|
state.waitUntilCounter--;
|
||
|
if (state.waitUntilCounter === 0) {
|
||
|
state.waitUntilResolve();
|
||
|
state.waitUntilPromise = null;
|
||
|
}
|
||
|
}
|
||
|
export function internal_getCurrentFunctionWaitUntil() {
|
||
|
return state.waitUntilPromise;
|
||
|
}
|
||
|
export function internal_runWithWaitUntil(fn) {
|
||
|
const result = fn();
|
||
|
if (result && typeof result === "object" && "then" in result && "finally" in result && typeof result.then === "function" && typeof result.finally === "function") {
|
||
|
if (!state.waitUntilCounter) {
|
||
|
// Create the promise for the next batch of waitUntil calls.
|
||
|
state.waitUntilPromise = new Promise((resolve)=>{
|
||
|
state.waitUntilResolve = resolve;
|
||
|
});
|
||
|
}
|
||
|
state.waitUntilCounter++;
|
||
|
return result.finally(()=>{
|
||
|
resolveOnePromise();
|
||
|
});
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
//# sourceMappingURL=internal-edge-wait-until.js.map
|