diff --git a/apps/web/app/entry.server.tsx b/apps/web/app/entry.server.tsx index 09ded70..47d8853 100644 --- a/apps/web/app/entry.server.tsx +++ b/apps/web/app/entry.server.tsx @@ -20,6 +20,7 @@ import type { RenderToPipeableStreamOptions } from "react-dom/server"; import { renderToPipeableStream } from "react-dom/server"; import { DEFAULT_LOCALE, getLocaleFromPathname } from "~/i18n/config"; +import { nonceJsonLdScripts } from "~/lib/csp-stream.server"; import { getServerEnv } from "~/lib/env.server"; export const streamTimeout = 5_000; @@ -113,7 +114,10 @@ export default function handleRequest( callback(); }, }); - const stream = createReadableStreamFromReadable(body); + const responseBody = nonce + ? body.pipe(nonceJsonLdScripts(nonce)) + : body; + const stream = createReadableStreamFromReadable(responseBody); responseHeaders.set("Content-Type", "text/html"); responseHeaders.set("Content-Language", contentLanguage(request)); diff --git a/apps/web/app/lib/csp-stream.server.ts b/apps/web/app/lib/csp-stream.server.ts new file mode 100644 index 0000000..3cd80de --- /dev/null +++ b/apps/web/app/lib/csp-stream.server.ts @@ -0,0 +1,47 @@ +import { Transform } from "node:stream"; +import type { TransformCallback } from "node:stream"; + +const JSON_LD_OPENING_TAG = Buffer.from('