Skip to content

Commit 2d8c63a

Browse files
authored
provide access to request context via event.platform (#9280)
* provide access to request context via `event.platform` - closes #8706 * cheat
1 parent 744dc81 commit 2d8c63a

File tree

6 files changed

+86
-8
lines changed

6 files changed

+86
-8
lines changed

.changeset/polite-files-relate.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/adapter-vercel': minor
3+
---
4+
5+
feat: provide access to request context via `event.platform`

packages/adapter-vercel/ambient.d.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
declare module 'SERVER' {
2-
export { Server } from '@sveltejs/kit';
3-
}
1+
import { RequestContext } from './index.js';
42

5-
declare module 'MANIFEST' {
6-
import { SSRManifest } from '@sveltejs/kit';
7-
export const manifest: SSRManifest;
3+
declare global {
4+
namespace App {
5+
export interface Platform {
6+
/**
7+
* `context` is only available in Edge Functions
8+
*/
9+
context?: RequestContext;
10+
}
11+
}
812
}

packages/adapter-vercel/files/edge.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ const initialized = server.init({
88

99
/**
1010
* @param {Request} request
11+
* @param {import('../index.js').RequestContext} context
1112
*/
12-
export default async (request) => {
13+
export default async (request, context) => {
1314
await initialized;
1415
return server.respond(request, {
1516
getClientAddress() {
1617
return /** @type {string} */ (request.headers.get('x-forwarded-for'));
18+
},
19+
platform: {
20+
context
1721
}
1822
});
1923
};

packages/adapter-vercel/index.d.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Adapter } from '@sveltejs/kit';
2+
import './ambient.js';
23

34
export default function plugin(config?: Config): Adapter;
45

@@ -77,3 +78,59 @@ export interface EdgeConfig {
7778
}
7879

7980
export type Config = EdgeConfig | ServerlessConfig;
81+
82+
// we copy the RequestContext interface from `@vercel/edge` because that package can't co-exist with `@types/node`.
83+
// see https://github.com/sveltejs/kit/pull/9280#issuecomment-1452110035
84+
85+
/**
86+
* An extension to the standard `Request` object that is passed to every Edge Function.
87+
*
88+
* @example
89+
* ```ts
90+
* import type { RequestContext } from '@vercel/edge';
91+
*
92+
* export default async function handler(request: Request, ctx: RequestContext): Promise<Response> {
93+
* // ctx is the RequestContext
94+
* }
95+
* ```
96+
*/
97+
export interface RequestContext {
98+
/**
99+
* A method that can be used to keep the function running after a response has been sent.
100+
* This is useful when you have an async task that you want to keep running even after the
101+
* response has been sent and the request has ended.
102+
*
103+
* @example
104+
*
105+
* <caption>Sending an internal error to an error tracking service</caption>
106+
*
107+
* ```ts
108+
* import type { RequestContext } from '@vercel/edge';
109+
*
110+
* export async function handleRequest(request: Request, ctx: RequestContext): Promise<Response> {
111+
* try {
112+
* return await myFunctionThatReturnsResponse();
113+
* } catch (e) {
114+
* ctx.waitUntil((async () => {
115+
* // report this error to your error tracking service
116+
* await fetch('https://my-error-tracking-service.com', {
117+
* method: 'POST',
118+
* body: JSON.stringify({
119+
* stack: e.stack,
120+
* message: e.message,
121+
* name: e.name,
122+
* url: request.url,
123+
* }),
124+
* });
125+
* })());
126+
* return new Response('Internal Server Error', { status: 500 });
127+
* }
128+
* }
129+
* ```
130+
*/
131+
waitUntil(
132+
/**
133+
* A promise that will be kept alive until it resolves or rejects.
134+
*/ promise: Promise<unknown>
135+
): void;
136+
}

packages/adapter-vercel/internal.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
declare module 'SERVER' {
2+
export { Server } from '@sveltejs/kit';
3+
}
4+
5+
declare module 'MANIFEST' {
6+
import { SSRManifest } from '@sveltejs/kit';
7+
export const manifest: SSRManifest;
8+
}

packages/adapter-vercel/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@
1414
"@sveltejs/kit": ["../kit/types/index"]
1515
}
1616
},
17-
"include": ["**/*.js", "ambient.d.ts"]
17+
"include": ["**/*.js", "index.d.ts", "internal.d.ts"]
1818
}

0 commit comments

Comments
 (0)