70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
import type { Middleware } from "@wrnexus/core";
|
|
import type { createStudioHandler } from "@wrnexus/design-studio/server";
|
|
import { APIMART_MODEL, studioAI } from "../lib/studio-ai.ts";
|
|
import { addStudioGuide, studioHelpScript } from "../lib/studio-guide.ts";
|
|
import { studioRequest } from "../lib/studio-origin.ts";
|
|
|
|
let studio: ReturnType<typeof createStudioHandler> | undefined;
|
|
let ai: ReturnType<typeof studioAI> | undefined;
|
|
|
|
const designStudio: Middleware = async (ctx, next) => {
|
|
const url = new URL(ctx.req.url);
|
|
if (url.pathname === "/design-studio")
|
|
return new Response(null, {
|
|
status: 308,
|
|
headers: { location: "/design-studio/" },
|
|
});
|
|
if (!url.pathname.startsWith("/design-studio/")) return next();
|
|
const request = studioRequest(ctx.req);
|
|
if (request instanceof Response) return request;
|
|
ai ??= studioAI(
|
|
process.env.APIMART_API_KEY?.trim(),
|
|
fetch,
|
|
process.env.APIMART_MODEL?.trim() || APIMART_MODEL,
|
|
);
|
|
const generated = await ai(request);
|
|
if (generated) return generated;
|
|
if (
|
|
url.pathname === "/design-studio/site-help.js" &&
|
|
ctx.req.method === "GET"
|
|
)
|
|
return new Response(studioHelpScript, {
|
|
headers: {
|
|
"content-type": "text/javascript",
|
|
"cache-control": "no-store",
|
|
},
|
|
});
|
|
// Load the installed package at runtime so its assets keep their package-relative URLs.
|
|
const studioModule = import.meta.resolve("@wrnexus/design-studio/server");
|
|
studio ??= import(studioModule)
|
|
.then(({ createStudioHandler }) =>
|
|
createStudioHandler({
|
|
hosted: { basePath: "/design-studio" },
|
|
}),
|
|
)
|
|
.catch((error) => {
|
|
studio = undefined;
|
|
throw error;
|
|
});
|
|
const response = await (await studio)(request);
|
|
if (
|
|
url.pathname === "/design-studio/" &&
|
|
response.ok &&
|
|
ctx.req.method === "GET"
|
|
) {
|
|
const headers = new Headers(response.headers);
|
|
headers.delete("content-length");
|
|
return new Response(
|
|
addStudioGuide(
|
|
await response.text(),
|
|
!!process.env.APIMART_API_KEY?.trim(),
|
|
process.env.APIMART_MODEL?.trim() || APIMART_MODEL,
|
|
),
|
|
{ status: response.status, headers },
|
|
);
|
|
}
|
|
return response;
|
|
};
|
|
|
|
export default designStudio;
|