Skip to content

Commit 954a21e

Browse files
Add Redis handlers to @neshca/cache-handler (caching-tools#137)
1 parent 693bc38 commit 954a21e

31 files changed

+584
-585
lines changed

.changeset/olive-zoos-itch.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@neshca/json-replacer-reviver': minor
3+
---
4+
5+
Use `exports` instead of `main` and `module` in `package.json`

.changeset/proud-eagles-film.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@neshca/cache-handler': minor
3+
---
4+
5+
Use `exports` instead of `main` and `module` in `package.json`
6+
7+
New `handlers` API:
8+
9+
- Add `redis-stack` and `redis-strings` handlers;

.changeset/silent-humans-change.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'cache-handler-docs': minor
3+
---
4+
5+
Add docs for new `handlers` API
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
const { IncrementalCache } = require('@neshca/cache-handler');
2+
const { createHandler } = require('@neshca/cache-handler/redis-stack');
23
const { createClient } = require('redis');
34

45
if (!process.env.REDIS_URL) {
56
console.warn('Make sure that REDIS_URL is added to the .env.local file and loaded properly.');
67
}
78

8-
/** @type {import('@neshca/cache-handler').TagsManifest} */
9-
let localTagsManifest = {
10-
version: 1,
11-
items: {},
12-
};
13-
149
const PREFIX = 'JSON:';
15-
const TAGS_MANIFEST_KEY = `${PREFIX}sharedTagsManifest`;
1610
const CONNECT_TIMEOUT_MS = 5 * 50 * 1000;
1711

1812
function createRedisClient(url) {
@@ -31,73 +25,27 @@ function createRedisClient(url) {
3125
return client;
3226
}
3327

34-
async function connectAndSetManifest(client) {
28+
async function connect(client) {
3529
try {
3630
await client.connect();
3731
} catch (error) {
3832
console.error('Redis connection error:', error.message);
3933
}
40-
41-
try {
42-
await client.json.set(TAGS_MANIFEST_KEY, '.', localTagsManifest, { NX: true });
43-
} catch (error) {
44-
console.error('Redis set tagsManifest error:', error.message);
45-
}
4634
}
4735

4836
if (process.env.SERVER_STARTED) {
4937
const client = createRedisClient(process.env.REDIS_URL);
5038

51-
connectAndSetManifest(client).then(() => {
39+
connect(client).then(() => {
5240
console.log('Redis connected');
5341
});
5442

55-
IncrementalCache.onCreation(() => {
56-
return {
57-
cache: {
58-
async get(key) {
59-
try {
60-
const value = (await client.json.get(PREFIX + key)) ?? null;
61-
62-
if (value && value.kind === 'ROUTE' && value.body.type === 'Buffer') {
63-
value.body = Buffer.from(value.body);
64-
}
65-
66-
return value;
67-
} catch (error) {
68-
return null;
69-
}
70-
},
71-
async set(key, value) {
72-
try {
73-
await client.json.set(PREFIX + key, '.', value);
74-
} catch (error) {
75-
// ignore because value will be written to disk
76-
}
77-
},
78-
async getTagsManifest() {
79-
try {
80-
const sharedTagsManifest = (await client.json.get(TAGS_MANIFEST_KEY)) ?? null;
81-
82-
if (sharedTagsManifest) {
83-
localTagsManifest = sharedTagsManifest;
84-
}
85-
86-
return sharedTagsManifest;
87-
} catch (error) {
88-
return localTagsManifest;
89-
}
90-
},
91-
async revalidateTag(tag, revalidatedAt) {
92-
try {
93-
await client.json.set(TAGS_MANIFEST_KEY, `.items.${tag}`, { revalidatedAt });
94-
} catch (error) {
95-
localTagsManifest.items[tag] = { revalidatedAt };
96-
}
97-
},
98-
},
99-
};
100-
});
43+
IncrementalCache.onCreation(
44+
createHandler({
45+
client,
46+
keyPrefix: PREFIX,
47+
}),
48+
);
10149
}
10250

10351
module.exports = IncrementalCache;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
const { IncrementalCache } = require('@neshca/cache-handler');
2+
const { createHandler } = require('@neshca/cache-handler/redis-strings');
3+
const { createClient } = require('redis');
4+
5+
if (!process.env.REDIS_URL) {
6+
console.warn('Make sure that REDIS_URL is added to the .env.local file and loaded properly.');
7+
}
8+
9+
const PREFIX = 'string:';
10+
const CONNECT_TIMEOUT_MS = 5 * 50 * 1000;
11+
12+
function createRedisClient(url) {
13+
const client = createClient({
14+
url,
15+
name: `cache-handler:${PREFIX}${process.env.PORT ?? process.pid}`,
16+
socket: {
17+
connectTimeout: CONNECT_TIMEOUT_MS,
18+
},
19+
});
20+
21+
client.on('error', (error) => {
22+
console.error('Redis error:', error.message);
23+
});
24+
25+
return client;
26+
}
27+
28+
async function connect(client) {
29+
try {
30+
await client.connect();
31+
} catch (error) {
32+
console.error('Redis connection error:', error.message);
33+
}
34+
}
35+
36+
if (process.env.SERVER_STARTED) {
37+
const client = createRedisClient(process.env.REDIS_URL);
38+
39+
connect(client).then(() => {
40+
console.log('Redis connected');
41+
});
42+
43+
IncrementalCache.onCreation(
44+
createHandler({
45+
client,
46+
keyPrefix: PREFIX,
47+
}),
48+
);
49+
}
50+
51+
module.exports = IncrementalCache;

apps/cache-testing/cache-handler-redis.js

-105
This file was deleted.

apps/cache-testing/src/utils/run-app-instances.ts

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ function wait(delay: number): Promise<void> {
1313

1414
const args = process.argv.slice(2).reduce<Record<string, string>>((acc, arg) => {
1515
const [key, value] = arg.split('=');
16+
17+
if (!key || !value) throw new Error(`Invalid argument: ${arg}`);
18+
1619
acc[key] = value;
1720
return acc;
1821
}, {});

docs/cache-handler-docs/next.config.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@ const nextraConfig = {
77

88
const withNextra = require('nextra')(nextraConfig);
99

10+
const basePath = process.env.NODE_ENV === 'development' ? undefined : '/next-shared-cache';
11+
1012
/** @type {import('next').NextConfig} */
1113
const nextConfig = {
1214
output: 'export',
13-
basePath: '/next-shared-cache',
15+
basePath,
1416
images: { unoptimized: true },
17+
env: {
18+
NEXT_PUBLIC_BASE_URL: basePath ?? '',
19+
},
1520
};
1621

1722
module.exports = withNextra(nextConfig);

docs/cache-handler-docs/src/pages/_meta.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
"title": "Examples"
1616
},
1717
"redis-stack": "",
18-
"redis": "",
18+
"redis-strings": "",
19+
"redis-stack-custom": "",
20+
"redis-strings-custom": "",
1921
"-- More": {
2022
"type": "separator",
2123
"title": "More"

0 commit comments

Comments
 (0)