CoolFace
Apppublic

legends810/testingnew

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
entry.server.tsx81 linesDownload Raw Back to app
1import type { AppLoadContext } from '@remix-run/cloudflare';2import { RemixServer } from '@remix-run/react';3import { isbot } from 'isbot';4import { renderToReadableStream } from 'react-dom/server';5import { renderHeadToString } from 'remix-island';6import { Head } from './root';7import { themeStore } from '~/lib/stores/theme';8 9export default async function handleRequest(10  request: Request,11  responseStatusCode: number,12  responseHeaders: Headers,13  remixContext: any,14  _loadContext: AppLoadContext,15) {16  // await initializeModelList({});17 18  const readable = await renderToReadableStream(<RemixServer context={remixContext} url={request.url} />, {19    signal: request.signal,20    onError(error: unknown) {21      console.error(error);22      responseStatusCode = 500;23    },24  });25 26  const body = new ReadableStream({27    start(controller) {28      const head = renderHeadToString({ request, remixContext, Head });29 30      controller.enqueue(31        new Uint8Array(32          new TextEncoder().encode(33            `<!DOCTYPE html><html lang="en" data-theme="${themeStore.value}"><head>${head}</head><body><div id="root" class="w-full h-full">`,34          ),35        ),36      );37 38      const reader = readable.getReader();39 40      function read() {41        reader42          .read()43          .then(({ done, value }) => {44            if (done) {45              controller.enqueue(new Uint8Array(new TextEncoder().encode('</div></body></html>')));46              controller.close();47 48              return;49            }50 51            controller.enqueue(value);52            read();53          })54          .catch((error) => {55            controller.error(error);56            readable.cancel();57          });58      }59      read();60    },61 62    cancel() {63      readable.cancel();64    },65  });66 67  if (isbot(request.headers.get('user-agent') || '')) {68    await readable.allReady;69  }70 71  responseHeaders.set('Content-Type', 'text/html');72 73  responseHeaders.set('Cross-Origin-Embedder-Policy', 'require-corp');74  responseHeaders.set('Cross-Origin-Opener-Policy', 'same-origin');75 76  return new Response(body, {77    headers: responseHeaders,78    status: responseStatusCode,79  });80}81