Skip to content

Commit

Permalink
feat(vercel): skew protection (#10761)
Browse files Browse the repository at this point in the history
* feat(vercel): skew protection

* feat(vercel): skew protection
  • Loading branch information
ematipico committed May 8, 2024
1 parent a020d00 commit f0acd30
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 75 deletions.
5 changes: 5 additions & 0 deletions .changeset/honest-games-bathe.md
@@ -0,0 +1,5 @@
---
"@astrojs/vercel": minor
---

Implements the vercel skew protection
13 changes: 11 additions & 2 deletions packages/integrations/vercel/src/serverless/adapter.ts
Expand Up @@ -72,16 +72,18 @@ function getAdapter({
edgeMiddleware,
functionPerRoute,
middlewareSecret,
skewProtection,
}: {
edgeMiddleware: boolean;
functionPerRoute: boolean;
middlewareSecret: string;
skewProtection: boolean;
}): AstroAdapter {
return {
name: PACKAGE_NAME,
serverEntrypoint: `${PACKAGE_NAME}/entrypoint`,
exports: ['default'],
args: { middlewareSecret },
args: { middlewareSecret, skewProtection },
adapterFeatures: {
edgeMiddleware,
functionPerRoute,
Expand Down Expand Up @@ -139,6 +141,10 @@ export interface VercelServerlessConfig {

/** Whether to cache on-demand rendered pages in the same way as static files. */
isr?: boolean | VercelISRConfig;
/**
* It enables Vercel skew protection: https://vercel.com/docs/deployments/skew-protection
*/
skewProtection?: boolean;
}

interface VercelISRConfig {
Expand Down Expand Up @@ -180,6 +186,7 @@ export default function vercelServerless({
edgeMiddleware = false,
maxDuration,
isr = false,
skewProtection = false,
}: VercelServerlessConfig = {}): AstroIntegration {
if (maxDuration) {
if (typeof maxDuration !== 'number') {
Expand Down Expand Up @@ -277,7 +284,9 @@ export default function vercelServerless({
);
}

setAdapter(getAdapter({ functionPerRoute, edgeMiddleware, middlewareSecret }));
setAdapter(
getAdapter({ functionPerRoute, edgeMiddleware, middlewareSecret, skewProtection })
);

_config = config;
_buildTempFolder = config.build.server;
Expand Down
7 changes: 6 additions & 1 deletion packages/integrations/vercel/src/serverless/entrypoint.ts
Expand Up @@ -12,7 +12,7 @@ applyPolyfills();

export const createExports = (
manifest: SSRManifest,
{ middlewareSecret }: { middlewareSecret: string }
{ middlewareSecret, skewProtection }: { middlewareSecret: string; skewProtection: boolean }
) => {
const app = new NodeApp(manifest);
const handler = async (req: IncomingMessage, res: ServerResponse) => {
Expand All @@ -38,6 +38,11 @@ export const createExports = (
// hide the secret from the rest of user code
delete req.headers[ASTRO_MIDDLEWARE_SECRET_HEADER];

// https://vercel.com/docs/deployments/skew-protection#supported-frameworks
if (skewProtection && process.env.VERCEL_SKEW_PROTECTION_ENABLED === '1') {
req.headers['x-deployment-id'] = process.env.VERCEL_DEPLOYMENT_ID;
}

const webResponse = await app.render(req, { addCookieHeader: true, clientAddress, locals });
await NodeApp.writeResponse(webResponse, res);
};
Expand Down
72 changes: 0 additions & 72 deletions packages/integrations/vercel/test/edge-middleware.test.js.snap

This file was deleted.

0 comments on commit f0acd30

Please sign in to comment.