Skip to content

Commit a976931

Browse files
author
Nicolas Dorseuil
committed
make overrides compatible with the external middleware
1 parent 971bad2 commit a976931

File tree

7 files changed

+155
-26
lines changed

7 files changed

+155
-26
lines changed
Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
1-
import { defineCloudflareConfig } from '@opennextjs/cloudflare';
2-
import doShardedTagCache from '@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache';
3-
import {
4-
softTagFilter,
5-
withFilter,
6-
} from '@opennextjs/cloudflare/overrides/tag-cache/tag-cache-filter';
1+
import type { OpenNextConfig } from '@opennextjs/cloudflare';
72

8-
export default defineCloudflareConfig({
9-
incrementalCache: () => import('./openNext/incrementalCache').then((m) => m.default),
10-
tagCache: withFilter({
11-
tagCache: doShardedTagCache({
12-
baseShardSize: 12,
13-
regionalCache: true,
14-
shardReplication: {
15-
numberOfSoftReplicas: 2,
16-
numberOfHardReplicas: 1,
17-
},
18-
}),
19-
// We don't use `revalidatePath`, so we filter out soft tags
20-
filterFn: softTagFilter,
21-
}),
22-
queue: () => import('./openNext/queue').then((m) => m.default),
23-
24-
// Performance improvements as we don't use PPR
25-
enableCacheInterception: true,
26-
});
3+
export default {
4+
default: {
5+
override: {
6+
wrapper: 'cloudflare-node',
7+
converter: 'edge',
8+
proxyExternalRequest: 'fetch',
9+
queue: () => import('./openNext/queue/server').then((m) => m.default),
10+
incrementalCache: () => import('./openNext/incrementalCache').then((m) => m.default),
11+
tagCache: () => import('./openNext/tagCache/server').then((m) => m.default),
12+
},
13+
},
14+
middleware: {
15+
external: true,
16+
override: {
17+
wrapper: 'cloudflare-edge',
18+
converter: 'edge',
19+
proxyExternalRequest: 'fetch',
20+
queue: () => import('./openNext/queue/middleware').then((m) => m.default),
21+
incrementalCache: () => import('./openNext/incrementalCache').then((m) => m.default),
22+
tagCache: () => import('./openNext/tagCache/middleware').then((m) => m.default),
23+
},
24+
},
25+
dangerous: {
26+
enableCacheInterception: true,
27+
},
28+
edgeExternals: ['node:crypto'],
29+
} satisfies OpenNextConfig;

packages/gitbook-v2/openNext/customWorkers/default.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ export default {
66
async fetch(request, env, ctx) {
77
return runWithCloudflareRequestContext(request, env, ctx, async () => {
88
// - `Request`s are handled by the Next server
9+
console.log('Request URL:', request);
10+
if (request.url.includes('404')) {
11+
await env.MIDDLEWARE_REFERENCE.send('whatever');
12+
}
913
return handler(request, env, ctx);
1014
});
1115
},

packages/gitbook-v2/openNext/customWorkers/middleware.js

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { WorkerEntrypoint } from 'cloudflare:workers';
22
import { runWithCloudflareRequestContext } from '../../.open-next/cloudflare/init.js';
33

4+
import onConfig from '../../.open-next/middleware/open-next.config.mjs';
5+
46
import { handler as middlewareHandler } from '../../.open-next/middleware/handler.mjs';
57

68
export { DOQueueHandler } from '../../.open-next/.build/durable-objects/queue.js';
@@ -35,5 +37,67 @@ export default class extends WorkerEntrypoint {
3537
});
3638
}
3739

38-
//TODO: Add methods for the DO queue and sharded tag cache so that they can be used in the main function through service bindings
40+
/**
41+
* Forwards the message from the server to the DO queue.
42+
*/
43+
async send(message) {
44+
return runWithCloudflareRequestContext(
45+
new Request('http://local'),
46+
this.env,
47+
this.ctx,
48+
async () => {
49+
const queue = await onConfig.middleware.override.queue();
50+
if (queue) {
51+
return queue.send(message);
52+
}
53+
}
54+
);
55+
}
56+
57+
/**
58+
* All the functions below are used to interact with the tag cache.
59+
* They are needed for the server who wouldn't be able to access the tag cache directly.
60+
*/
61+
62+
async getLastRevalidated() {
63+
return runWithCloudflareRequestContext(
64+
new Request('http://local'),
65+
this.env,
66+
this.ctx,
67+
async () => {
68+
const tagCache = await onConfig.middleware.override.tagCache();
69+
if (tagCache) {
70+
return tagCache.getLastRevalidated();
71+
}
72+
}
73+
);
74+
}
75+
76+
async hasBeenRevalidated() {
77+
return runWithCloudflareRequestContext(
78+
new Request('http://local'),
79+
this.env,
80+
this.ctx,
81+
async () => {
82+
const tagCache = await onConfig.middleware.override.tagCache();
83+
if (tagCache) {
84+
return tagCache.hasBeenRevalidated();
85+
}
86+
}
87+
);
88+
}
89+
90+
async writeTags(tags) {
91+
return runWithCloudflareRequestContext(
92+
new Request('http://local'),
93+
this.env,
94+
this.ctx,
95+
async () => {
96+
const tagCache = await onConfig.middleware.override.tagCache();
97+
if (tagCache) {
98+
return tagCache.writeTags(tags);
99+
}
100+
}
101+
);
102+
}
39103
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import type { Queue } from '@opennextjs/aws/types/overrides.js';
2+
import { getCloudflareContext } from '@opennextjs/cloudflare';
3+
4+
interface Env {
5+
MIDDLEWARE_REFERENCE?: Pick<Queue, 'send'>;
6+
}
7+
8+
export default {
9+
name: 'GitbookISRQueue',
10+
send: async (msg) => {
11+
const { env, ctx } = getCloudflareContext();
12+
ctx.waitUntil((env as Env).MIDDLEWARE_REFERENCE?.send(msg) ?? Promise.resolve());
13+
},
14+
} satisfies Queue;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import doShardedTagCache from '@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache';
2+
import {
3+
softTagFilter,
4+
withFilter,
5+
} from '@opennextjs/cloudflare/overrides/tag-cache/tag-cache-filter';
6+
7+
export default withFilter({
8+
tagCache: doShardedTagCache({
9+
baseShardSize: 12,
10+
regionalCache: true,
11+
shardReplication: {
12+
numberOfSoftReplicas: 2,
13+
numberOfHardReplicas: 1,
14+
},
15+
}),
16+
// We don't use `revalidatePath`, so we filter out soft tags
17+
filterFn: softTagFilter,
18+
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type { NextModeTagCache } from '@opennextjs/aws/types/overrides.js';
2+
import { getCloudflareContext } from '@opennextjs/cloudflare';
3+
4+
interface Env {
5+
MIDDLEWARE_REFERENCE?: Pick<
6+
NextModeTagCache,
7+
'getLastRevalidated' | 'hasBeenRevalidated' | 'writeTags' | 'getPathsByTags'
8+
>;
9+
}
10+
11+
export default {
12+
name: 'GitbookTagCache',
13+
mode: 'nextMode',
14+
getLastRevalidated: async (tags: string[]) => {
15+
const { env } = getCloudflareContext();
16+
return (env as Env).MIDDLEWARE_REFERENCE?.getLastRevalidated(tags) ?? 0;
17+
},
18+
hasBeenRevalidated: async (tags: string[]) => {
19+
const { env } = getCloudflareContext();
20+
return (env as Env).MIDDLEWARE_REFERENCE?.hasBeenRevalidated(tags) ?? false;
21+
},
22+
writeTags: async (tags: string[]) => {
23+
const { env } = getCloudflareContext();
24+
(env as Env).MIDDLEWARE_REFERENCE?.writeTags(tags);
25+
},
26+
} satisfies NextModeTagCache;

0 commit comments

Comments
 (0)