Skip to content

Commit ac6a5e1

Browse files
committed
remix adapter working
1 parent eae3872 commit ac6a5e1

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import Context from '../Context/Context';
2+
import { Handler, NextFunction, SingleHandler } from '../HttpRouter/HttpRouter';
3+
4+
export type FallbackHandler = (c: Context) => Response | Promise<Response>;
5+
6+
export type RunShape = {
7+
context: Context;
8+
handlers: Handler;
9+
on404?: FallbackHandler;
10+
on500?: FallbackHandler;
11+
};
12+
13+
export default function runHandlers({
14+
context,
15+
handlers,
16+
on404,
17+
on500,
18+
}: RunShape) {
19+
const toRun = (Array.isArray(handlers) ? handlers : [handlers]).flat(9);
20+
let i = 0;
21+
const next: NextFunction = async () => {
22+
const handler = toRun[i++] as SingleHandler;
23+
if (!handler) {
24+
if (on404) {
25+
return on404(context);
26+
} else {
27+
throw new Error('UNHANDLED');
28+
}
29+
}
30+
try {
31+
let result = await handler(context, next);
32+
if (result instanceof Response) {
33+
return result;
34+
} else {
35+
return next();
36+
}
37+
} catch (e) {
38+
if (e instanceof Response) {
39+
return e;
40+
}
41+
if (on500) {
42+
return on500(context);
43+
} else {
44+
throw e;
45+
}
46+
}
47+
};
48+
return next();
49+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import {
2+
createRequestHandler as createRemixRequestHandler,
3+
type ServerBuild,
4+
} from '@remix-run/server-runtime';
5+
import {
6+
devLogger,
7+
type Handler,
8+
type HttpRouter,
9+
prodLogger,
10+
serveFiles,
11+
} from 'bunshine';
12+
import connectToBunshine from './connectToBunshine';
13+
14+
export type RemixViteConfig = {
15+
app: HttpRouter;
16+
buildPath: string;
17+
mode?: 'development' | 'production';
18+
logger?: Handler | boolean;
19+
};
20+
21+
export async function connectRemixVite({
22+
app,
23+
mode = process.env.NODE_ENV === 'development' ? 'development' : 'production',
24+
buildPath,
25+
logger = true,
26+
}: RemixViteConfig) {
27+
if (mode === 'development') {
28+
const viteDevServer = await import('vite').then(vite =>
29+
vite.createServer({
30+
server: { middlewareMode: true },
31+
})
32+
);
33+
const build = () => {
34+
return viteDevServer.ssrLoadModule(
35+
'virtual:remix/server-build'
36+
) as unknown as ServerBuild;
37+
};
38+
app.use(connectToBunshine(viteDevServer.middlewares));
39+
// app.headGet('/*', serveFiles(`${buildPath}/../public`, { maxAge: '1h' }));
40+
if (logger === true) {
41+
app.use(devLogger());
42+
} else if (logger) {
43+
app.use(logger);
44+
}
45+
const remixHandler = createRemixRequestHandler(build, mode);
46+
app.use(c => remixHandler(c.request, c.locals));
47+
} else {
48+
const fileOptions = {
49+
immutable: true,
50+
maxAge: '1y',
51+
};
52+
const build: ServerBuild = await import(`${buildPath}/server/index.js`);
53+
app.headGet(
54+
'/assets/*',
55+
serveFiles(`${buildPath}/client/assets`, fileOptions)
56+
);
57+
app.headGet('/*', serveFiles(`${buildPath}/client`, { maxAge: '1h' }));
58+
// app.headGet('/build/client/*', serveFiles(buildPath, fileOptions));
59+
if (logger === true) {
60+
app.use(prodLogger());
61+
} else if (logger) {
62+
app.use(logger);
63+
}
64+
const remixHandler = createRemixRequestHandler(build, mode);
65+
app.use(c => remixHandler(c.request, c.locals));
66+
}
67+
}

packages/remix-adapter-bunshine/src/connectToBunshine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default function connectToBunshine(
1212
const error = e as Error;
1313
if (error.message === 'UNHANDLED') {
1414
// handler called next(), but there are no other connect handlers
15+
// so continue to next bunshine handlers
1516
} else {
1617
// send off to our 500 error handler
1718
throw error;

0 commit comments

Comments
 (0)