Files
bknd/app/src/adapter/nextjs/nextjs.adapter.ts
dswbx 2d5da63eb2 Merge remote-tracking branch 'origin/release/0.9' into feat/app-api-exp-for-nextjs
# Conflicts:
#	app/src/adapter/nextjs/nextjs.adapter.ts
#	app/src/index.ts
2025-02-27 14:21:00 +01:00

50 lines
1.2 KiB
TypeScript

import type { App } from "bknd";
import { type FrameworkBkndConfig, createFrameworkApp } from "bknd/adapter";
export type NextjsBkndConfig = FrameworkBkndConfig & {
cleanRequest?: { searchParams?: string[] };
};
let app: App;
let building: boolean = false;
export async function getApp(config: NextjsBkndConfig) {
if (building) {
while (building) {
await new Promise((resolve) => setTimeout(resolve, 5));
}
if (app) return app;
}
building = true;
if (!app) {
app = await createFrameworkApp(config);
await app.build();
}
building = false;
return app;
}
function getCleanRequest(req: Request, cleanRequest: NextjsBkndConfig["cleanRequest"]) {
if (!cleanRequest) return req;
const url = new URL(req.url);
cleanRequest?.searchParams?.forEach((k) => url.searchParams.delete(k));
return new Request(url.toString(), {
method: req.method,
headers: req.headers,
body: req.body,
});
}
export function serve({ cleanRequest, ...config }: NextjsBkndConfig = {}) {
return async (req: Request) => {
if (!app) {
app = await getApp(config);
}
const request = getCleanRequest(req, cleanRequest);
return app.fetch(request);
};
}