From 85a3998a08723f13ecdb875e9a6dc271847859b3 Mon Sep 17 00:00:00 2001 From: Chris Kerr Date: Thu, 15 Dec 2022 08:40:35 +1000 Subject: [PATCH] Allow preserving express request keys within adapter node --- .changeset/fast-nails-attack.md | 5 +++++ packages/adapter-node/README.md | 13 ++++++++++++- packages/adapter-node/index.d.ts | 1 + packages/adapter-node/index.js | 5 +++-- packages/adapter-node/src/handler.js | 7 +++++++ 5 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 .changeset/fast-nails-attack.md diff --git a/.changeset/fast-nails-attack.md b/.changeset/fast-nails-attack.md new file mode 100644 index 0000000000000..b98bb56dc5ef2 --- /dev/null +++ b/.changeset/fast-nails-attack.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-node': minor +--- + +Allow preserving specific keys from the original request object for use during SSR diff --git a/packages/adapter-node/README.md b/packages/adapter-node/README.md index b6ec4bc1bf623..fa9349b0e048a 100644 --- a/packages/adapter-node/README.md +++ b/packages/adapter-node/README.md @@ -116,7 +116,8 @@ export default { // default options are shown out: 'build', precompress: false, - envPrefix: '' + envPrefix: '', + preservedRequestKeys: [], }) } }; @@ -145,6 +146,16 @@ MY_CUSTOM_ORIGIN=https://my.site \ node build ``` +### preservedRequestKeys + +Allows preserving specific keys (such as custom keys set by Express middleware) from the original request object which was supplied to SvelteKit. + +This is will allow access to these keys within server hooks and handlers. + +```js +preservedRequestKeys: ['sessionID'], +``` + ## Custom server The adapter creates two files in your build directory — `index.js` and `handler.js`. Running `index.js` — e.g. `node build`, if you use the default build directory — will start a server on the configured port. diff --git a/packages/adapter-node/index.d.ts b/packages/adapter-node/index.d.ts index 2252dfde937cc..fafea4791bb5b 100644 --- a/packages/adapter-node/index.d.ts +++ b/packages/adapter-node/index.d.ts @@ -8,6 +8,7 @@ interface AdapterOptions { out?: string; precompress?: boolean; envPrefix?: string; + preservedRequestKeys?: string[]; } export default function plugin(options?: AdapterOptions): Adapter; diff --git a/packages/adapter-node/index.js b/packages/adapter-node/index.js index 7dc13e34d550a..3109f178edfec 100644 --- a/packages/adapter-node/index.js +++ b/packages/adapter-node/index.js @@ -9,7 +9,7 @@ const files = fileURLToPath(new URL('./files', import.meta.url).href); /** @type {import('.').default} */ export default function (opts = {}) { - const { out = 'build', precompress, envPrefix = '' } = opts; + const { out = 'build', precompress, envPrefix = '', preservedRequestKeys = [] } = opts; return { name: '@sveltejs/adapter-node', @@ -72,7 +72,8 @@ export default function (opts = {}) { HANDLER: './handler.js', MANIFEST: './server/manifest.js', SERVER: `./server/index.js`, - ENV_PREFIX: JSON.stringify(envPrefix) + ENV_PREFIX: JSON.stringify(envPrefix), + PRESERVED_REQUEST_KEYS: JSON.stringify(preservedRequestKeys) } }); } diff --git a/packages/adapter-node/src/handler.js b/packages/adapter-node/src/handler.js index 26ad1324c0da7..d0c5f8e10e4cd 100644 --- a/packages/adapter-node/src/handler.js +++ b/packages/adapter-node/src/handler.js @@ -21,6 +21,8 @@ const body_size_limit = parseInt(env('BODY_SIZE_LIMIT', '524288')); const dir = path.dirname(fileURLToPath(import.meta.url)); +const preservedRequestKeys = JSON.parse('PRESERVED_REQUEST_KEYS'); + /** * @param {string} path * @param {boolean} client @@ -54,6 +56,11 @@ const ssr = async (req, res) => { request: req, bodySizeLimit: body_size_limit }); + + for (const key of preservedRequestKeys) { + // @ts-expect-error + request[key] = req[key]; + } } catch (err) { res.statusCode = err.status || 400; res.end('Invalid request body');