-
-
Save sergiodxa/e339cc18f34834871497ac35a1353f43 to your computer and use it in GitHub Desktop.
import { renderToStream } from "@react-pdf/renderer"; | |
import ReactDOMServer from "react-dom/server"; | |
import { EntryContext, Headers, RemixServer, Request, Response } from "remix"; | |
import PDF, { loader } from "./pdfs/my-pdf.server"; | |
async function handlePDFRequest(request: Request, headers: Headers) { | |
// get the data for the PDF | |
let response = await loader({ request, context: {}, params: {} }); | |
// if it's a response return it, this means we redirected | |
if (response instanceof Response) return response; | |
// set the correct content-type | |
headers.set("Content-Type", "application/pdf"); | |
// render the PDF to a stream | |
let stream = await renderToStream(<PDF {...response} />); | |
// wait for the stream to end and transform it to a Buffer | |
let body: Buffer = await new Promise((resolve, reject) => { | |
let buffers: Uint8Array[] = []; | |
stream.on("data", (data) => { | |
buffers.push(data); | |
}); | |
stream.on("end", () => { | |
resolve(Buffer.concat(buffers)); | |
}); | |
stream.on("error", reject); | |
}); | |
// renturn the response | |
return new Response(body, { status: 200, headers }); | |
} | |
export default async function handleRequest( | |
request: Request, | |
status: number, | |
headers: Headers, | |
remixContext: EntryContext | |
) { | |
if (new URL(request.url).pathname === "/my-pdf.pdf") { | |
return await handlePDFRequest(request, headers); | |
} | |
headers.set("Content-Type", "text/html; charset=utf-8"); | |
let markup = ReactDOMServer.renderToString( | |
<RemixServer context={remixContext} url={request.url} /> | |
); | |
return new Response("<!DOCTYPE html>" + markup, { status, headers }); | |
} |
export let loader: LoaderFunction = async ({ request }) => { | |
let user = await authenticator.isAuthenticated(request); | |
if (!user) return redirect("/"); | |
let data = await api(user.token).getDataForThePDF(); | |
return { data } | |
}; | |
export default function PDF({ data }: Props) { | |
return ( | |
<Document title="Title"> | |
<Page | |
size="A4" | |
style={{ | |
paddingTop: 48, | |
paddingLeft: 72, | |
paddingRight: 48, | |
paddingBottom: 72, | |
}} | |
> | |
// here you can use data and React PDF components to generate the PDF | |
</Page> | |
</Document> | |
); | |
} |
Hello. I keep getting this error when I run this, 'Error: Some functionality, such as asynchronous I/O (fetch, Cache API, KV), timeouts (setTimeout, setInterval), and generating random values (crypto.getRandomValues, crypto.subtle.generateKey), can only be performed while handling a request.
at assertInRequest (C:\Users\llllllllllllll\shopify-hydrogen-storefront\node_modules.pnpm@[email protected]\node_modules@miniflare\shared\src\context.ts:51:11)
at C:\Users\llllllllllllll\shopify-hydrogen-storefront\node_modules.pnpm@[email protected]\node_modules@miniflare\core\src\standards\timers.ts:15:28
at FSWatcher2._this._persist (C:\Users\llllllllllllll\shopify-hydrogen-storefront\dist\worker\node-modules-polyfills:fs:14384:24)
at FSWatcher2.start (C:\Users\llllllllllllll\shopify-hydrogen-storefront\dist\worker\node-modules-polyfills:fs:14424:14)
at Volume2.watch (C:\Users\llllllllllllll\shopify-hydrogen-storefront\dist\worker\node-modules-polyfills:fs:14070:15)
at watchStdo (C:\Users\llllllllllllll\shopify-hydrogen-storefront\dist\worker\node-modules-polyfills:fs:14563:7)
at C:\Users\llllllllllllll\shopify-hydrogen-storefront\dist\worker\node-modules-polyfills:fs:14558:1
at SourceTextModule.evaluate (node:internal/vm/module:224:23)
at VMScriptRunner.runAsModule (C:\Users\llllllllllllll\shopify-hydrogen-storefront\node_modules.pnpm@[email protected]\node_modules@miniflare\runner-vm\src\index.ts:40:18)
at VMScriptRunner.run (C:\Users\llllllllllllll\shopify-hydrogen-storefront\node_modules.pnpm@[email protected]\node_modules@miniflare\runner-vm\src\index.ts:86:17)' How did you get around it. Ps this is a hydrogen application
same error
I get build errors when importing the latest version of
@react-pdf/renderer
. How did you get around this?