@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
1 lines • 4.09 kB
Source Map (JSON)
{"version":3,"file":"renderRouterToStream.cjs","names":["Solid","isbot","createSsrStreamResponse","getSsrStatus","transformReadableStreamWithRouter","waitForRequest","getSolidRenderOptions","JSXElement","AnyRouter","renderRouterToStream","request","router","responseHeaders","children","Request","Headers","signal","aborted","serverSsr","cleanup","reason","docType","ssr","stream","renderToStream","_$memo","readable","writable","TransformStream","Uint8Array","rendererAbort","headers","get","AbortController","undefined","responseStream","rendererSafePoint","onAbort","abort","Promise","resolve","pipeTo","catch","error","console","Response","status"],"sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import * as Solid from 'solid-js/web'\nimport { isbot } from 'isbot'\nimport {\n createSsrStreamResponse,\n getSsrStatus,\n transformReadableStreamWithRouter,\n waitForRequest,\n} from '@tanstack/router-core/ssr/server'\nimport { getSolidRenderOptions } from './renderOptions'\nimport type { JSXElement } from 'solid-js'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n children,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n children: () => JSXElement\n}) => {\n const signal = request.signal\n if (signal.aborted) {\n router.serverSsr?.cleanup()\n throw signal.reason\n }\n\n try {\n const docType = Solid.ssr('<!DOCTYPE html>')\n const stream = Solid.renderToStream(\n () => (\n <>\n {docType}\n {children()}\n </>\n ),\n getSolidRenderOptions(router),\n )\n\n // Cancelling the transform's reader errors this writable, which makes\n // Solid's later writes reject and be ignored. Solid exposes no disposal\n // handle for unresolved renderer work; see router-core's STREAMING.md.\n const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>()\n const rendererAbort = isbot(request.headers.get('User-Agent'))\n ? new AbortController()\n : undefined\n const responseStream = transformReadableStreamWithRouter(router, readable, {\n rendererSafePoint: 'record-end',\n signal,\n onAbort: rendererAbort\n ? (reason) => rendererAbort.abort(reason)\n : undefined,\n })\n\n if (rendererAbort) {\n await waitForRequest(stream as unknown, rendererAbort.signal)\n }\n\n // The server export returns Promise<void>. Solid's client declaration\n // returns void, and this file is also checked under that export condition.\n void Promise.resolve(stream.pipeTo(writable)).catch((error: unknown) => {\n console.error('Error in Solid render stream:', error)\n void writable.abort(error).catch(() => {})\n })\n\n return createSsrStreamResponse(\n router,\n new Response(responseStream, {\n status: getSsrStatus(router),\n headers: responseHeaders,\n }),\n )\n } catch (error) {\n router.serverSsr?.cleanup()\n throw error\n }\n}\n"],"mappings":";;;;;;;AAYA,IAAaS,uBAAuB,OAAO,EACzCC,SACAC,QACAC,iBACAC,eAMI;CACJ,MAAMG,SAASN,QAAQM;CACvB,IAAIA,OAAOC,SAAS;EAClBN,OAAOO,WAAWC,QAAQ;EAC1B,MAAMH,OAAOI;CACf;CAEA,IAAI;EACF,MAAMC,UAAUrB,aAAMsB,IAAI,iBAAiB;EAC3C,MAAMC,SAASvB,aAAMwB,qBACnB,CAEKH,UAAAA,GAAAA,aAAAA,MACAR,QAAQ,CAAA,GAGbP,sBAAAA,sBAAsBK,MAAM,CAC9B;EAKA,MAAM,EAAEe,UAAUC,aAAa,IAAIC,gBAAwC;EAC3E,MAAME,iBAAAA,GAAAA,MAAAA,OAAsBpB,QAAQqB,QAAQC,IAAI,YAAY,CAAC,IACzD,IAAIC,gBAAgB,IACpBC,KAAAA;EACJ,MAAMC,kBAAAA,GAAAA,iCAAAA,mCAAmDxB,QAAQe,UAAU;GACzEU,mBAAmB;GACnBpB;GACAqB,SAASP,iBACJV,WAAWU,cAAcQ,MAAMlB,MAAM,IACtCc,KAAAA;EACN,CAAC;EAED,IAAIJ,eACF,OAAA,GAAA,iCAAA,gBAAqBP,QAAmBO,cAAcd,MAAM;EAK9D,QAAawB,QAAQjB,OAAOkB,OAAOd,QAAQ,CAAC,EAAEe,OAAOC,UAAmB;GACtEC,QAAQD,MAAM,iCAAiCA,KAAK;GACpD,SAAcL,MAAMK,KAAK,EAAED,YAAY,CAAC,CAAC;EAC3C,CAAC;EAED,QAAA,GAAA,iCAAA,yBACE/B,QACA,IAAIkC,SAASV,gBAAgB;GAC3BW,SAAAA,GAAAA,iCAAAA,cAAqBnC,MAAM;GAC3BoB,SAASnB;EACX,CAAC,CACH;CACF,SAAS+B,OAAO;EACdhC,OAAOO,WAAWC,QAAQ;EAC1B,MAAMwB;CACR;AACF"}