-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[feat] expose handler to allow use in custom server
- Loading branch information
Showing
9 changed files
with
176 additions
and
99 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,22 @@ | ||
// TODO hardcoding the relative location makes this brittle | ||
// @ts-ignore | ||
import { init, render } from '../output/server/app.js'; | ||
// @ts-ignore | ||
import { path, host, port } from './env.js'; | ||
import { createServer } from './server'; | ||
|
||
init(); | ||
import { assetsMiddleware, kitMiddleware, prerenderedMiddleware } from './middlewares.js'; | ||
import compression from 'compression'; | ||
import polka from 'polka'; | ||
|
||
const instance = createServer({ render }); | ||
const server = polka().use( | ||
// https://github.com/lukeed/polka/issues/173 | ||
// @ts-ignore - nothing we can do about so just ignore it | ||
compression({ threshold: 0 }), | ||
assetsMiddleware, | ||
kitMiddleware, | ||
prerenderedMiddleware | ||
); | ||
|
||
const listenOpts = { path, host, port }; | ||
instance.listen(listenOpts, () => { | ||
|
||
server.listen(listenOpts, () => { | ||
console.log(`Listening on ${path ? path : host + ':' + port}`); | ||
}); | ||
|
||
export { instance }; | ||
export { server }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { getRawBody } from '@sveltejs/kit/node'; | ||
|
||
/** | ||
* @return {import('polka').Middleware} | ||
*/ | ||
// TODO: type render function from @sveltejs/kit/adapter | ||
// @ts-ignore | ||
export function create_kit_middleware({ render }) { | ||
return async (req, res) => { | ||
const parsed = new URL(req.url || '', 'http://localhost'); | ||
|
||
let body; | ||
|
||
try { | ||
body = await getRawBody(req); | ||
} catch (err) { | ||
res.statusCode = err.status || 400; | ||
return res.end(err.reason || 'Invalid request body'); | ||
} | ||
|
||
const rendered = await render({ | ||
method: req.method, | ||
headers: req.headers, // TODO: what about repeated headers, i.e. string[] | ||
path: parsed.pathname, | ||
query: parsed.searchParams, | ||
rawBody: body | ||
}); | ||
|
||
if (rendered) { | ||
res.writeHead(rendered.status, rendered.headers); | ||
if (rendered.body) { | ||
res.write(rendered.body); | ||
} | ||
res.end(); | ||
} else { | ||
res.statusCode = 404; | ||
res.end('Not found'); | ||
} | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// TODO hardcoding the relative location makes this brittle | ||
// Also, we need most of the logic in another file for testing because | ||
// ../output/server/app.js doesn't exist when we run the tests | ||
// @ts-ignore | ||
import { init, render } from '../output/server/app.js'; | ||
import { create_kit_middleware } from './kit-middleware.js'; | ||
|
||
import fs from 'fs'; | ||
import { dirname, join } from 'path'; | ||
import sirv from 'sirv'; | ||
import { fileURLToPath } from 'url'; | ||
|
||
// App is a dynamic file built from the application layer. | ||
|
||
const __dirname = dirname(fileURLToPath(import.meta.url)); | ||
/** @type {import('polka').Middleware} */ | ||
const noop_handler = (_req, _res, next) => next(); | ||
const paths = { | ||
assets: join(__dirname, '/assets'), | ||
prerendered: join(__dirname, '/prerendered') | ||
}; | ||
|
||
export const prerenderedMiddleware = fs.existsSync(paths.prerendered) | ||
? sirv(paths.prerendered, { | ||
etag: true, | ||
maxAge: 0, | ||
gzip: true, | ||
brotli: true | ||
}) | ||
: noop_handler; | ||
|
||
export const assetsMiddleware = fs.existsSync(paths.assets) | ||
? sirv(paths.assets, { | ||
setHeaders: (res, pathname) => { | ||
// @ts-expect-error - dynamically replaced with define | ||
if (pathname.startsWith(/* eslint-disable-line no-undef */ APP_DIR)) { | ||
res.setHeader('cache-control', 'public, max-age=31536000, immutable'); | ||
} | ||
}, | ||
gzip: true, | ||
brotli: true | ||
}) | ||
: noop_handler; | ||
|
||
export const kitMiddleware = (function () { | ||
init(); | ||
return create_kit_middleware({ render }); | ||
})(); |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters