59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import * as serverBuild from 'virtual:react-router/server-build';
|
|
import {createRequestHandler, storefrontRedirect} from '@shopify/hydrogen';
|
|
import {createHydrogenRouterContext} from '~/lib/context';
|
|
/**
|
|
* Export a fetch handler in module format.
|
|
*/
|
|
export default {
|
|
async fetch(
|
|
request: Request,
|
|
env: Env,
|
|
executionContext: ExecutionContext,
|
|
): Promise<Response> {
|
|
try {
|
|
const hydrogenContext = await createHydrogenRouterContext(
|
|
request,
|
|
env,
|
|
executionContext,
|
|
);
|
|
|
|
/**
|
|
* Create a Hydrogen request handler that internally
|
|
* delegates to React Router for routing and rendering.
|
|
*/
|
|
const handleRequest = createRequestHandler({
|
|
build: serverBuild,
|
|
mode: process.env.NODE_ENV,
|
|
getLoadContext: () => hydrogenContext,
|
|
});
|
|
|
|
const response = await handleRequest(request);
|
|
|
|
if (hydrogenContext.session.isPending) {
|
|
response.headers.set(
|
|
'Set-Cookie',
|
|
await hydrogenContext.session.commit(),
|
|
);
|
|
}
|
|
|
|
if (response.status === 404) {
|
|
/**
|
|
* Check for redirects only when there's a 404 from the app.
|
|
* If the redirect doesn't exist, then `storefrontRedirect`
|
|
* will pass through the 404 response.
|
|
*/
|
|
return storefrontRedirect({
|
|
request,
|
|
response,
|
|
storefront: hydrogenContext.storefront,
|
|
});
|
|
}
|
|
|
|
return response;
|
|
} catch (error) {
|
|
console.error(error);
|
|
return new Response('An unexpected error occurred', {status: 500});
|
|
}
|
|
},
|
|
};
|