44 lines
1.5 KiB
Plaintext
44 lines
1.5 KiB
Plaintext
import { attachCookiesToResponse, responseHasCookies } from "../cookies/index.js";
|
|
import { AstroError, AstroErrorData } from "../errors/index.js";
|
|
async function callMiddleware(onRequest, apiContext, responseFunction) {
|
|
let nextCalled = false;
|
|
let responseFunctionPromise = void 0;
|
|
const next = async () => {
|
|
nextCalled = true;
|
|
responseFunctionPromise = responseFunction();
|
|
return responseFunctionPromise;
|
|
};
|
|
let middlewarePromise = onRequest(apiContext, next);
|
|
return await Promise.resolve(middlewarePromise).then(async (value) => {
|
|
if (nextCalled) {
|
|
if (typeof value !== "undefined") {
|
|
if (value instanceof Response === false) {
|
|
throw new AstroError(AstroErrorData.MiddlewareNotAResponse);
|
|
}
|
|
return ensureCookiesAttached(apiContext, value);
|
|
} else {
|
|
if (responseFunctionPromise) {
|
|
return responseFunctionPromise;
|
|
} else {
|
|
throw new AstroError(AstroErrorData.MiddlewareNotAResponse);
|
|
}
|
|
}
|
|
} else if (typeof value === "undefined") {
|
|
throw new AstroError(AstroErrorData.MiddlewareNoDataOrNextCalled);
|
|
} else if (value instanceof Response === false) {
|
|
throw new AstroError(AstroErrorData.MiddlewareNotAResponse);
|
|
} else {
|
|
return ensureCookiesAttached(apiContext, value);
|
|
}
|
|
});
|
|
}
|
|
function ensureCookiesAttached(apiContext, response) {
|
|
if (apiContext.cookies !== void 0 && !responseHasCookies(response)) {
|
|
attachCookiesToResponse(response, apiContext.cookies);
|
|
}
|
|
return response;
|
|
}
|
|
export {
|
|
callMiddleware
|
|
};
|