Skip to content

Commit 18ba05a

Browse files
committed
Add support for skew protection
1 parent 2f6dd81 commit 18ba05a

22 files changed

+598
-78
lines changed

examples/playground14/wrangler.jsonc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "node_modules/wrangler/config-schema.json",
33
"main": "worker.ts",
4-
"name": "api",
4+
"name": "playground14",
55
"compatibility_date": "2024-12-30",
66
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
77
"assets": {

examples/playground15/next.config.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
1+
import { initOpenNextCloudflareForDev, getDeploymentId } from "@opennextjs/cloudflare";
22

33
initOpenNextCloudflareForDev();
44

@@ -10,6 +10,7 @@ const nextConfig = {
1010
// Generate source map to validate the fix for opennextjs/opennextjs-cloudflare#341
1111
serverSourceMaps: true,
1212
},
13+
deploymentId: getDeploymentId(),
1314
};
1415

1516
export default nextConfig;
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import { defineCloudflareConfig } from "@opennextjs/cloudflare";
2-
import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/kv-incremental-cache";
1+
import { defineCloudflareConfig, type OpenNextConfig } from "@opennextjs/cloudflare";
2+
import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
33

4-
export default defineCloudflareConfig({
5-
incrementalCache: kvIncrementalCache,
6-
enableCacheInterception: true,
7-
});
4+
export default {
5+
...defineCloudflareConfig({
6+
incrementalCache: r2IncrementalCache,
7+
}),
8+
cloudflare: {
9+
skewProtectionEnabled: true,
10+
},
11+
} satisfies OpenNextConfig;

examples/playground15/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"cf-typegen": "wrangler types --env-interface CloudflareEnv"
1717
},
1818
"dependencies": {
19-
"next": "^15.1.7",
19+
"next": "^15.3.4",
2020
"react": "^19.0.0",
2121
"react-dom": "^19.0.0"
2222
},

examples/playground15/wrangler.jsonc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
{
22
"$schema": "node_modules/wrangler/config-schema.json",
33
"main": ".open-next/worker.js",
4-
"name": "api",
4+
"name": "playground15",
55
"compatibility_date": "2024-12-30",
66
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
77
"assets": {
88
"directory": ".open-next/assets",
99
"binding": "ASSETS"
1010
},
11-
"kv_namespaces": [
11+
"r2_buckets": [
1212
{
13-
"binding": "NEXT_INC_CACHE_KV",
14-
"id": "<BINDING_ID>"
13+
"binding": "NEXT_INC_CACHE_R2_BUCKET",
14+
"bucket_name": "pg15"
1515
}
1616
],
1717
"vars": {

packages/cloudflare/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"@types/mock-fs": "catalog:",
6666
"@types/node": "catalog:",
6767
"@types/picomatch": "^4.0.0",
68+
"cloudflare": "^4.4.1",
6869
"diff": "^8.0.2",
6970
"esbuild": "catalog:",
7071
"eslint": "catalog:",

packages/cloudflare/src/api/cloudflare-context.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ declare global {
6565
CACHE_PURGE_ZONE_ID?: string;
6666
// The API token to use for the cache purge. It should have the `Cache Purge` permission
6767
CACHE_PURGE_API_TOKEN?: string;
68+
69+
// The following variables must be provided when skew protection is enabled
70+
// The name of the worker (as defined in the wrangler configuration)
71+
CF_WORKER_NAME?: string;
72+
// The subdomain where the previews are deployed, i.e. `<version-name>.<domain>.workers.dev`
73+
CF_PREVIEW_DOMAIN?: string;
74+
// Should have the `Workers Scripts:Read` permission
75+
CF_WORKERS_SCRIPTS_API_TOKEN?: string;
76+
// Cloudflare account id
77+
CF_ACCOUNT_ID?: string;
6878
}
6979
}
7080

packages/cloudflare/src/api/config.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,15 @@ interface OpenNextConfig extends AwsOpenNextConfig {
158158
* @default false
159159
*/
160160
dangerousDisableConfigValidation?: boolean;
161+
162+
/**
163+
* Enable skew protection.
164+
*
165+
* Note: Skew Protection is experimental and might break on minor releases.
166+
*
167+
* @default false
168+
*/
169+
skewProtectionEnabled?: boolean;
161170
};
162171
}
163172

@@ -169,4 +178,11 @@ export function getOpenNextConfig(buildOpts: BuildOptions): OpenNextConfig {
169178
return buildOpts.config;
170179
}
171180

181+
/**
182+
* @returns Unique deployment ID
183+
*/
184+
export function getDeploymentId(): string {
185+
return `dpl-${new Date().getTime().toString(36)}`;
186+
}
187+
172188
export type { OpenNextConfig };

packages/cloudflare/src/api/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export * from "./cloudflare-context.js";
2-
export { defineCloudflareConfig, type OpenNextConfig } from "./config.js";
2+
export { defineCloudflareConfig, getDeploymentId, type OpenNextConfig } from "./config.js";

packages/cloudflare/src/cli/build/build.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { compileCacheAssetsManifestSqlFile } from "./open-next/compile-cache-ass
1313
import { compileEnvFiles } from "./open-next/compile-env-files.js";
1414
import { compileImages } from "./open-next/compile-images.js";
1515
import { compileInit } from "./open-next/compile-init.js";
16+
import { compileSkewProtection } from "./open-next/compile-skew-protection.js";
1617
import { compileDurableObjects } from "./open-next/compileDurableObjects.js";
1718
import { createServerBundle } from "./open-next/createServerBundle.js";
1819
import { createWranglerConfigIfNotExistent } from "./utils/index.js";
@@ -58,17 +59,11 @@ export async function build(
5859
printHeader("Generating bundle");
5960
buildHelper.initOutputDir(options);
6061

61-
// Compile cache.ts
6262
compileCache(options);
63-
64-
// Compile .env files
6563
compileEnvFiles(options);
66-
67-
// Compile workerd init
6864
compileInit(options);
69-
70-
// Compile image helpers
7165
compileImages(options);
66+
compileSkewProtection(options, config);
7267

7368
// Compile middleware
7469
await createMiddleware(options, { forceOnlyBuildOnce: true });

0 commit comments

Comments
 (0)