@effect-native/fetch-hooks 0.0.2 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -2
- package/dist/cache-manager.d.ts.map +1 -1
- package/dist/cache-manager.js +97 -29
- package/dist/cache-manager.js.map +1 -1
- package/dist/filesystem-storage.d.ts +33 -1
- package/dist/filesystem-storage.d.ts.map +1 -1
- package/dist/filesystem-storage.js +82 -2
- package/dist/filesystem-storage.js.map +1 -1
- package/package.json +2 -2
- package/src/cache-manager.ts +106 -29
- package/src/filesystem-storage.ts +90 -2
package/LICENSE
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
4
|
-
Copyright (c) 2025 effect-native contributors (modifications and packages-native/)
|
|
3
|
+
Copyright (c) 2025 effect-native contributors
|
|
5
4
|
|
|
6
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,YAAY,EACZ,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACd,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,YAAY,EACZ,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACd,MAAM,YAAY,CAAA;AA8BnB,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,IAAI,CAE/E;AAkID,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,gBAAgB,CAAC,EAAE,MAAM,EACzB,mBAAmB,CAAC,EAAE,OAAO,EAC7B,OAAO,CAAC,EAAE,YAAY,EACtB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,mBAAmB,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACrD,OAAO,CAAC,EAAE,YAAY,EACtB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,QAAQ,CAAC,CAqInB;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACnD,iBAAiB,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,EACtD,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA8M1B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7D"}
|
package/dist/cache-manager.js
CHANGED
|
@@ -7,10 +7,44 @@ import { isSSEResponse, jsonlToTimedChunks, recordStreamWithTiming, replayStream
|
|
|
7
7
|
const DEV_FS_LOGS_PORT = 1090;
|
|
8
8
|
// Internal fetch function, set via setInternalFetchForCache
|
|
9
9
|
let _internalFetch = globalThis.fetch;
|
|
10
|
+
const pendingSSEWrites = new Map();
|
|
11
|
+
const storageIds = new WeakMap();
|
|
12
|
+
let nextStorageId = 1;
|
|
10
13
|
/** @internal Set the fetch function used for dev-fs-logs communication. */
|
|
11
14
|
export function setInternalFetchForCache(fetchFn) {
|
|
12
15
|
_internalFetch = fetchFn;
|
|
13
16
|
}
|
|
17
|
+
function getStorageId(storage) {
|
|
18
|
+
const existingId = storageIds.get(storage);
|
|
19
|
+
if (existingId !== undefined) {
|
|
20
|
+
return existingId;
|
|
21
|
+
}
|
|
22
|
+
const id = nextStorageId++;
|
|
23
|
+
storageIds.set(storage, id);
|
|
24
|
+
return id;
|
|
25
|
+
}
|
|
26
|
+
function getPendingSSEWriteKey(cacheKey, storage, baseDir) {
|
|
27
|
+
if (storage) {
|
|
28
|
+
return `storage:${getStorageId(storage)}:${cacheKey}`;
|
|
29
|
+
}
|
|
30
|
+
return `fs:${baseDir ?? getCacheDir()}:${cacheKey}`;
|
|
31
|
+
}
|
|
32
|
+
function trackPendingSSEWrite(pendingKey, writePromise) {
|
|
33
|
+
pendingSSEWrites.set(pendingKey, writePromise);
|
|
34
|
+
void writePromise.finally(() => {
|
|
35
|
+
const active = pendingSSEWrites.get(pendingKey);
|
|
36
|
+
if (active === writePromise) {
|
|
37
|
+
pendingSSEWrites.delete(pendingKey);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function waitForPendingSSEWrite(pendingKey) {
|
|
42
|
+
const pending = pendingSSEWrites.get(pendingKey);
|
|
43
|
+
if (!pending) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
await pending.catch(() => undefined);
|
|
47
|
+
}
|
|
14
48
|
async function tryDevFsLogsWrite(cacheId, data) {
|
|
15
49
|
return _internalFetch(`http://localhost:${DEV_FS_LOGS_PORT}/cache`, {
|
|
16
50
|
method: "POST",
|
|
@@ -35,8 +69,7 @@ async function tryDevFsLogsRead(cacheId) {
|
|
|
35
69
|
})
|
|
36
70
|
.catch(() => null);
|
|
37
71
|
}
|
|
38
|
-
function ensureCacheDir(cacheKey) {
|
|
39
|
-
const baseDir = getCacheDir();
|
|
72
|
+
function ensureCacheDir(baseDir, cacheKey) {
|
|
40
73
|
const cacheDir = join(baseDir, cacheKey);
|
|
41
74
|
if (!existsSync(cacheDir)) {
|
|
42
75
|
try {
|
|
@@ -54,6 +87,12 @@ function ensureCacheDir(cacheKey) {
|
|
|
54
87
|
}
|
|
55
88
|
return cacheDir;
|
|
56
89
|
}
|
|
90
|
+
function requireFilesystemBaseDir(baseDir) {
|
|
91
|
+
if (baseDir === undefined) {
|
|
92
|
+
throw new Error("Filesystem cache directory is required when no custom storage is provided");
|
|
93
|
+
}
|
|
94
|
+
return baseDir;
|
|
95
|
+
}
|
|
57
96
|
function writeJsonFile(filePath, data) {
|
|
58
97
|
writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
59
98
|
}
|
|
@@ -111,7 +150,8 @@ export async function storeRequest(params, providedCacheKey, skipHeaderFiltering
|
|
|
111
150
|
}
|
|
112
151
|
else {
|
|
113
152
|
// Legacy filesystem path
|
|
114
|
-
const
|
|
153
|
+
const baseDir = getCacheDir();
|
|
154
|
+
const cacheDir = ensureCacheDir(baseDir, cacheKey);
|
|
115
155
|
const requestPath = join(cacheDir, "request.json");
|
|
116
156
|
writeJsonFile(requestPath, request);
|
|
117
157
|
}
|
|
@@ -120,6 +160,7 @@ export async function storeRequest(params, providedCacheKey, skipHeaderFiltering
|
|
|
120
160
|
}
|
|
121
161
|
export async function storeResponse(cacheKey, response, beforeStoreResponse, storage, hashableRequest) {
|
|
122
162
|
const key = hashableRequest ? [cacheKey, hashableRequest] : [cacheKey];
|
|
163
|
+
const filesystemBaseDir = storage ? undefined : getCacheDir();
|
|
123
164
|
const startTime = Date.now();
|
|
124
165
|
const headers = headersToRecord(response.headers);
|
|
125
166
|
const contentType = headers["content-type"] ?? "";
|
|
@@ -141,7 +182,7 @@ export async function storeResponse(cacheKey, response, beforeStoreResponse, sto
|
|
|
141
182
|
await storage.responseMeta.set(key, meta);
|
|
142
183
|
}
|
|
143
184
|
else {
|
|
144
|
-
const cacheDir = ensureCacheDir(cacheKey);
|
|
185
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
145
186
|
const metaPath = join(cacheDir, "response.meta.json");
|
|
146
187
|
writeJsonFile(metaPath, meta);
|
|
147
188
|
}
|
|
@@ -166,7 +207,7 @@ export async function storeResponse(cacheKey, response, beforeStoreResponse, sto
|
|
|
166
207
|
await storage.binaryBody.set(key, data);
|
|
167
208
|
}
|
|
168
209
|
else {
|
|
169
|
-
const cacheDir = ensureCacheDir(cacheKey);
|
|
210
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
170
211
|
const binPath = join(cacheDir, "response.bin");
|
|
171
212
|
writeBinaryFile(binPath, data);
|
|
172
213
|
const metaPath = join(cacheDir, "response.meta.json");
|
|
@@ -181,25 +222,31 @@ export async function storeResponse(cacheKey, response, beforeStoreResponse, sto
|
|
|
181
222
|
}
|
|
182
223
|
if (isSSE) {
|
|
183
224
|
const [recordStream, returnStream] = response.body.tee();
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
225
|
+
const persistPromise = (async () => {
|
|
226
|
+
const chunks = await recordStreamWithTiming(recordStream);
|
|
227
|
+
const sseMeta = {
|
|
228
|
+
...meta,
|
|
229
|
+
total_ms: Date.now() - startTime
|
|
230
|
+
};
|
|
231
|
+
if (storage) {
|
|
232
|
+
await storage.sseChunks.set(key, chunks);
|
|
233
|
+
await storage.responseMeta.set(key, sseMeta);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
237
|
+
const jsonlPath = join(cacheDir, "response.jsonl");
|
|
238
|
+
const assetsDir = join(cacheDir, "response.jsonl.assets");
|
|
239
|
+
let jsonlContent = timedChunksToJsonl(chunks);
|
|
240
|
+
const { content: extractedContent } = extractDataUrls(jsonlContent, assetsDir);
|
|
241
|
+
jsonlContent = extractedContent;
|
|
242
|
+
writeTextFile(jsonlPath, jsonlContent);
|
|
243
|
+
const metaPath = join(cacheDir, "response.meta.json");
|
|
244
|
+
writeJsonFile(metaPath, sseMeta);
|
|
245
|
+
}
|
|
246
|
+
void tryDevFsLogsWrite(`${cacheKey}/meta`, sseMeta);
|
|
247
|
+
void tryDevFsLogsWrite(`${cacheKey}/sse`, chunks);
|
|
248
|
+
})();
|
|
249
|
+
trackPendingSSEWrite(getPendingSSEWriteKey(cacheKey, storage, filesystemBaseDir), persistPromise);
|
|
203
250
|
return new Response(returnStream, {
|
|
204
251
|
status: response.status,
|
|
205
252
|
statusText: response.statusText,
|
|
@@ -218,7 +265,7 @@ export async function storeResponse(cacheKey, response, beforeStoreResponse, sto
|
|
|
218
265
|
await storage.responseBody.set(key, transformedResponse.body ?? "");
|
|
219
266
|
}
|
|
220
267
|
else {
|
|
221
|
-
const cacheDir = ensureCacheDir(cacheKey);
|
|
268
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
222
269
|
const jsonPath = join(cacheDir, "response.json");
|
|
223
270
|
const assetsDir = join(cacheDir, "response.json.assets");
|
|
224
271
|
const { content: extractedContent } = extractDataUrls(transformedResponse.body ?? "", assetsDir);
|
|
@@ -239,13 +286,15 @@ export async function storeResponse(cacheKey, response, beforeStoreResponse, sto
|
|
|
239
286
|
}
|
|
240
287
|
export async function getCachedResponse(cacheKey, afterLoadResponse, transformSSEChunk, storage) {
|
|
241
288
|
const key = [cacheKey];
|
|
289
|
+
const filesystemBaseDir = storage ? undefined : getCacheDir();
|
|
290
|
+
const pendingWriteKey = getPendingSSEWriteKey(cacheKey, storage, filesystemBaseDir);
|
|
242
291
|
// Try to get response metadata
|
|
243
292
|
let responseMeta = null;
|
|
244
293
|
if (storage) {
|
|
245
294
|
responseMeta = await storage.responseMeta.get(key);
|
|
246
295
|
}
|
|
247
296
|
else {
|
|
248
|
-
const cacheDir = join(
|
|
297
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
249
298
|
const metaPath = join(cacheDir, "response.meta.json");
|
|
250
299
|
responseMeta = readJsonFile(metaPath);
|
|
251
300
|
// For non-streaming responses, metadata is stored inside response.json
|
|
@@ -257,6 +306,25 @@ export async function getCachedResponse(cacheKey, afterLoadResponse, transformSS
|
|
|
257
306
|
}
|
|
258
307
|
}
|
|
259
308
|
}
|
|
309
|
+
if (!responseMeta) {
|
|
310
|
+
await waitForPendingSSEWrite(pendingWriteKey);
|
|
311
|
+
if (storage) {
|
|
312
|
+
responseMeta = await storage.responseMeta.get(key);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
316
|
+
const metaPath = join(cacheDir, "response.meta.json");
|
|
317
|
+
responseMeta = readJsonFile(metaPath);
|
|
318
|
+
// For non-streaming responses, metadata is stored inside response.json
|
|
319
|
+
if (!responseMeta) {
|
|
320
|
+
const jsonPath = join(cacheDir, "response.json");
|
|
321
|
+
const cached = readJsonFile(jsonPath);
|
|
322
|
+
if (cached?.meta) {
|
|
323
|
+
responseMeta = cached.meta;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
260
328
|
if (!responseMeta) {
|
|
261
329
|
const devFsMeta = (await tryDevFsLogsRead(`${cacheKey}/meta`));
|
|
262
330
|
if (!devFsMeta) {
|
|
@@ -272,7 +340,7 @@ export async function getCachedResponse(cacheKey, afterLoadResponse, transformSS
|
|
|
272
340
|
data = await storage.binaryBody.get(key);
|
|
273
341
|
}
|
|
274
342
|
else {
|
|
275
|
-
const cacheDir = join(
|
|
343
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
276
344
|
const binPath = join(cacheDir, "response.bin");
|
|
277
345
|
data = readBinaryFile(binPath);
|
|
278
346
|
}
|
|
@@ -326,7 +394,7 @@ export async function getCachedResponse(cacheKey, afterLoadResponse, transformSS
|
|
|
326
394
|
});
|
|
327
395
|
}
|
|
328
396
|
// Legacy filesystem path
|
|
329
|
-
const cacheDir = join(
|
|
397
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
330
398
|
const jsonlPath = join(cacheDir, "response.jsonl");
|
|
331
399
|
const assetsDir = join(cacheDir, "response.jsonl.assets");
|
|
332
400
|
let jsonlContent = readTextFile(jsonlPath);
|
|
@@ -362,7 +430,7 @@ export async function getCachedResponse(cacheKey, afterLoadResponse, transformSS
|
|
|
362
430
|
body = await storage.responseBody.get(key);
|
|
363
431
|
}
|
|
364
432
|
else {
|
|
365
|
-
const cacheDir = join(
|
|
433
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey);
|
|
366
434
|
const jsonPath = join(cacheDir, "response.json");
|
|
367
435
|
const assetsDir = join(cacheDir, "response.json.assets");
|
|
368
436
|
const cached = readJsonFile(jsonPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,38 @@
|
|
|
1
|
-
import type { CacheKey, CacheStorage, KV, KVStream, TimedChunk } from "./types.js";
|
|
1
|
+
import type { CachedRequest, CacheKey, CacheStorage, KV, KVStream, TimedChunk } from "./types.js";
|
|
2
2
|
/** Create a KV store backed by JSON files */
|
|
3
3
|
export declare function createJsonFileKV<T>(baseDir: string, filename: string): KV<CacheKey, T>;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a KV store for HTTP requests that extracts inline base64 data URLs
|
|
6
|
+
* to sidecar files on disk and restores them when reading from the cache.
|
|
7
|
+
*
|
|
8
|
+
* @param baseDir - Base directory where cache entries are stored.
|
|
9
|
+
* @param filename - File name used to persist the cached request JSON.
|
|
10
|
+
* @returns A KV implementation keyed by CacheKey storing CachedRequest values.
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const kv = createRequestFileKV(".cache", "request.json")
|
|
15
|
+
* await kv.set(["some-cache-key"], cachedRequest)
|
|
16
|
+
* const value = await kv.get(["some-cache-key"])
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function createRequestFileKV(baseDir: string, filename: string): KV<CacheKey, CachedRequest>;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a KV store for text files that extracts inline base64 data URLs into
|
|
22
|
+
* sidecar asset files on disk and restores them when reading.
|
|
23
|
+
*
|
|
24
|
+
* @param baseDir - Base directory where cache entries are stored.
|
|
25
|
+
* @param filename - File name used for the cached text content within each cache key directory.
|
|
26
|
+
* @returns A KV store keyed by CacheKey that reads and writes text content from the filesystem.
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const kv = createTextFileKV("/tmp/fetch-hooks-cache", "response.txt")
|
|
31
|
+
* await kv.set(["my-cache-key"], "inline data: data:image/png;base64,...")
|
|
32
|
+
* const value = await kv.get(["my-cache-key"])
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function createTextFileKV(baseDir: string, filename: string): KV<CacheKey, string>;
|
|
4
36
|
/** Create a KV store backed by binary files */
|
|
5
37
|
export declare function createBinaryFileKV(baseDir: string, filename: string): KV<CacheKey, Uint8Array>;
|
|
6
38
|
/** Create a streaming KV store for SSE chunks backed by JSONL files */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-storage.d.ts","sourceRoot":"","sources":["../src/filesystem-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"filesystem-storage.d.ts","sourceRoot":"","sources":["../src/filesystem-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAsB,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAsBrH,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAsBtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CA2BlG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CA0BxF;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAsB9F;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAyCzG;AAED,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAQrE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import { extractDataUrls, restoreDataUrls } from "./binary-extractor.js";
|
|
3
4
|
import { jsonlToTimedChunks, timedChunksToJsonl } from "./sse-handler.js";
|
|
4
5
|
function ensureCacheDir(baseDir, cacheKey) {
|
|
5
6
|
const cacheDir = join(baseDir, cacheKey);
|
|
@@ -38,6 +39,85 @@ export function createJsonFileKV(baseDir, filename) {
|
|
|
38
39
|
}
|
|
39
40
|
};
|
|
40
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates a KV store for HTTP requests that extracts inline base64 data URLs
|
|
44
|
+
* to sidecar files on disk and restores them when reading from the cache.
|
|
45
|
+
*
|
|
46
|
+
* @param baseDir - Base directory where cache entries are stored.
|
|
47
|
+
* @param filename - File name used to persist the cached request JSON.
|
|
48
|
+
* @returns A KV implementation keyed by CacheKey storing CachedRequest values.
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const kv = createRequestFileKV(".cache", "request.json")
|
|
53
|
+
* await kv.set(["some-cache-key"], cachedRequest)
|
|
54
|
+
* const value = await kv.get(["some-cache-key"])
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export function createRequestFileKV(baseDir, filename) {
|
|
58
|
+
const assetsExt = ".assets";
|
|
59
|
+
return {
|
|
60
|
+
async get([key]) {
|
|
61
|
+
const filePath = join(baseDir, key, filename);
|
|
62
|
+
if (!existsSync(filePath)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const assetsDir = join(baseDir, key, filename + assetsExt);
|
|
66
|
+
const content = restoreDataUrls(readFileSync(filePath, "utf-8"), assetsDir);
|
|
67
|
+
return JSON.parse(content);
|
|
68
|
+
},
|
|
69
|
+
async set([key], value) {
|
|
70
|
+
const cacheDir = ensureCacheDir(baseDir, key);
|
|
71
|
+
const filePath = join(cacheDir, filename);
|
|
72
|
+
const assetsDir = join(cacheDir, filename + assetsExt);
|
|
73
|
+
const { content } = extractDataUrls(JSON.stringify(value, null, 2), assetsDir);
|
|
74
|
+
writeFileSync(filePath, content, "utf-8");
|
|
75
|
+
},
|
|
76
|
+
async has([key]) {
|
|
77
|
+
const filePath = join(baseDir, key, filename);
|
|
78
|
+
return existsSync(filePath);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Creates a KV store for text files that extracts inline base64 data URLs into
|
|
84
|
+
* sidecar asset files on disk and restores them when reading.
|
|
85
|
+
*
|
|
86
|
+
* @param baseDir - Base directory where cache entries are stored.
|
|
87
|
+
* @param filename - File name used for the cached text content within each cache key directory.
|
|
88
|
+
* @returns A KV store keyed by CacheKey that reads and writes text content from the filesystem.
|
|
89
|
+
* @since 1.0.0
|
|
90
|
+
* @example
|
|
91
|
+
* ```ts
|
|
92
|
+
* const kv = createTextFileKV("/tmp/fetch-hooks-cache", "response.txt")
|
|
93
|
+
* await kv.set(["my-cache-key"], "inline data: data:image/png;base64,...")
|
|
94
|
+
* const value = await kv.get(["my-cache-key"])
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export function createTextFileKV(baseDir, filename) {
|
|
98
|
+
const assetsExt = ".assets";
|
|
99
|
+
return {
|
|
100
|
+
async get([key]) {
|
|
101
|
+
const filePath = join(baseDir, key, filename);
|
|
102
|
+
if (!existsSync(filePath)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const assetsDir = join(baseDir, key, filename + assetsExt);
|
|
106
|
+
return restoreDataUrls(readFileSync(filePath, "utf-8"), assetsDir);
|
|
107
|
+
},
|
|
108
|
+
async set([key], value) {
|
|
109
|
+
const cacheDir = ensureCacheDir(baseDir, key);
|
|
110
|
+
const filePath = join(cacheDir, filename);
|
|
111
|
+
const assetsDir = join(cacheDir, filename + assetsExt);
|
|
112
|
+
const { content } = extractDataUrls(value, assetsDir);
|
|
113
|
+
writeFileSync(filePath, content, "utf-8");
|
|
114
|
+
},
|
|
115
|
+
async has([key]) {
|
|
116
|
+
const filePath = join(baseDir, key, filename);
|
|
117
|
+
return existsSync(filePath);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
41
121
|
/** Create a KV store backed by binary files */
|
|
42
122
|
export function createBinaryFileKV(baseDir, filename) {
|
|
43
123
|
return {
|
|
@@ -102,9 +182,9 @@ export function createJsonlFileKVStream(baseDir, filename) {
|
|
|
102
182
|
/** Create a complete CacheStorage backed by the filesystem */
|
|
103
183
|
export function createFilesystemStorage(baseDir) {
|
|
104
184
|
return {
|
|
105
|
-
requests:
|
|
185
|
+
requests: createRequestFileKV(baseDir, "request.json"),
|
|
106
186
|
responseMeta: createJsonFileKV(baseDir, "response.meta.json"),
|
|
107
|
-
responseBody:
|
|
187
|
+
responseBody: createTextFileKV(baseDir, "response.json"),
|
|
108
188
|
binaryBody: createBinaryFileKV(baseDir, "response.bin"),
|
|
109
189
|
sseChunks: createJsonlFileKVStream(baseDir, "response.jsonl")
|
|
110
190
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-storage.js","sourceRoot":"","sources":["../src/filesystem-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEzE,SAAS,cAAc,CAAC,OAAe,EAAE,QAAgB;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,4EAA4E;YAC5E,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACpF,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,gBAAgB,CAAI,OAAe,EAAE,QAAgB;IACnE,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAA;YACb,CAAC;YACD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAA;QACjC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW,EAAE,KAAQ;YACjC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACzC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAClE,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;KACF,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,QAAgB;IAClE,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAA;YACb,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;YACrC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW,EAAE,KAAiB;YAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACzC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAChC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;KACF,CAAA;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,QAAgB;IACvE,OAAO;QACL,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,OAAM;YACR,CAAC;YAED,qFAAqF;YACrF,kEAAkE;YAClE,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;YAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW,EAAE,MAAqD;YAC9E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAEzC,uCAAuC;YACvC,IAAI,MAAyB,CAAA;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,GAAG,MAAM,CAAA;YACjB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,EAAE,CAAA;gBACX,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACxC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAW;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;KACF,CAAA;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO;QACL,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"filesystem-storage.js","sourceRoot":"","sources":["../src/filesystem-storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-native/fetch-hooks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Fetch caching utilities for deterministic API replay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"node": ">=18"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@types/node": "^22.
|
|
39
|
+
"@types/node": "^22.19.3"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"bun": ">=1.0.0"
|
package/src/cache-manager.ts
CHANGED
|
@@ -36,12 +36,50 @@ const DEV_FS_LOGS_PORT = 1090
|
|
|
36
36
|
|
|
37
37
|
// Internal fetch function, set via setInternalFetchForCache
|
|
38
38
|
let _internalFetch: typeof globalThis.fetch = globalThis.fetch
|
|
39
|
+
const pendingSSEWrites = new Map<string, Promise<void>>()
|
|
40
|
+
const storageIds = new WeakMap<CacheStorage, number>()
|
|
41
|
+
let nextStorageId = 1
|
|
39
42
|
|
|
40
43
|
/** @internal Set the fetch function used for dev-fs-logs communication. */
|
|
41
44
|
export function setInternalFetchForCache(fetchFn: typeof globalThis.fetch): void {
|
|
42
45
|
_internalFetch = fetchFn
|
|
43
46
|
}
|
|
44
47
|
|
|
48
|
+
function getStorageId(storage: CacheStorage): number {
|
|
49
|
+
const existingId = storageIds.get(storage)
|
|
50
|
+
if (existingId !== undefined) {
|
|
51
|
+
return existingId
|
|
52
|
+
}
|
|
53
|
+
const id = nextStorageId++
|
|
54
|
+
storageIds.set(storage, id)
|
|
55
|
+
return id
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function getPendingSSEWriteKey(cacheKey: string, storage?: CacheStorage, baseDir?: string): string {
|
|
59
|
+
if (storage) {
|
|
60
|
+
return `storage:${getStorageId(storage)}:${cacheKey}`
|
|
61
|
+
}
|
|
62
|
+
return `fs:${baseDir ?? getCacheDir()}:${cacheKey}`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function trackPendingSSEWrite(pendingKey: string, writePromise: Promise<void>): void {
|
|
66
|
+
pendingSSEWrites.set(pendingKey, writePromise)
|
|
67
|
+
void writePromise.finally(() => {
|
|
68
|
+
const active = pendingSSEWrites.get(pendingKey)
|
|
69
|
+
if (active === writePromise) {
|
|
70
|
+
pendingSSEWrites.delete(pendingKey)
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function waitForPendingSSEWrite(pendingKey: string): Promise<void> {
|
|
76
|
+
const pending = pendingSSEWrites.get(pendingKey)
|
|
77
|
+
if (!pending) {
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
await pending.catch(() => undefined)
|
|
81
|
+
}
|
|
82
|
+
|
|
45
83
|
async function tryDevFsLogsWrite(cacheId: string, data: unknown): Promise<boolean> {
|
|
46
84
|
return _internalFetch(`http://localhost:${DEV_FS_LOGS_PORT}/cache`, {
|
|
47
85
|
method: "POST",
|
|
@@ -68,8 +106,7 @@ async function tryDevFsLogsRead(cacheId: string): Promise<unknown | null> {
|
|
|
68
106
|
.catch(() => null)
|
|
69
107
|
}
|
|
70
108
|
|
|
71
|
-
function ensureCacheDir(cacheKey: string): string {
|
|
72
|
-
const baseDir = getCacheDir()
|
|
109
|
+
function ensureCacheDir(baseDir: string, cacheKey: string): string {
|
|
73
110
|
const cacheDir = join(baseDir, cacheKey)
|
|
74
111
|
if (!existsSync(cacheDir)) {
|
|
75
112
|
try {
|
|
@@ -87,6 +124,13 @@ function ensureCacheDir(cacheKey: string): string {
|
|
|
87
124
|
return cacheDir
|
|
88
125
|
}
|
|
89
126
|
|
|
127
|
+
function requireFilesystemBaseDir(baseDir: string | undefined): string {
|
|
128
|
+
if (baseDir === undefined) {
|
|
129
|
+
throw new Error("Filesystem cache directory is required when no custom storage is provided")
|
|
130
|
+
}
|
|
131
|
+
return baseDir
|
|
132
|
+
}
|
|
133
|
+
|
|
90
134
|
function writeJsonFile(filePath: string, data: unknown): void {
|
|
91
135
|
writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8")
|
|
92
136
|
}
|
|
@@ -156,7 +200,8 @@ export async function storeRequest(
|
|
|
156
200
|
await storage.requests.set(key, request)
|
|
157
201
|
} else {
|
|
158
202
|
// Legacy filesystem path
|
|
159
|
-
const
|
|
203
|
+
const baseDir = getCacheDir()
|
|
204
|
+
const cacheDir = ensureCacheDir(baseDir, cacheKey)
|
|
160
205
|
const requestPath = join(cacheDir, "request.json")
|
|
161
206
|
writeJsonFile(requestPath, request)
|
|
162
207
|
}
|
|
@@ -174,6 +219,7 @@ export async function storeResponse(
|
|
|
174
219
|
hashableRequest?: HashableRequest
|
|
175
220
|
): Promise<Response> {
|
|
176
221
|
const key: CacheKey = hashableRequest ? [cacheKey, hashableRequest] : [cacheKey]
|
|
222
|
+
const filesystemBaseDir = storage ? undefined : getCacheDir()
|
|
177
223
|
const startTime = Date.now()
|
|
178
224
|
const headers = headersToRecord(response.headers)
|
|
179
225
|
const contentType = headers["content-type"] ?? ""
|
|
@@ -196,7 +242,7 @@ export async function storeResponse(
|
|
|
196
242
|
if (storage) {
|
|
197
243
|
await storage.responseMeta.set(key, meta)
|
|
198
244
|
} else {
|
|
199
|
-
const cacheDir = ensureCacheDir(cacheKey)
|
|
245
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
200
246
|
const metaPath = join(cacheDir, "response.meta.json")
|
|
201
247
|
writeJsonFile(metaPath, meta)
|
|
202
248
|
}
|
|
@@ -221,7 +267,7 @@ export async function storeResponse(
|
|
|
221
267
|
await storage.responseMeta.set(key, binaryMeta)
|
|
222
268
|
await storage.binaryBody.set(key, data)
|
|
223
269
|
} else {
|
|
224
|
-
const cacheDir = ensureCacheDir(cacheKey)
|
|
270
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
225
271
|
const binPath = join(cacheDir, "response.bin")
|
|
226
272
|
writeBinaryFile(binPath, data)
|
|
227
273
|
const metaPath = join(cacheDir, "response.meta.json")
|
|
@@ -237,26 +283,32 @@ export async function storeResponse(
|
|
|
237
283
|
|
|
238
284
|
if (isSSE) {
|
|
239
285
|
const [recordStream, returnStream] = response.body.tee()
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
} else {
|
|
247
|
-
const cacheDir = ensureCacheDir(cacheKey)
|
|
248
|
-
const jsonlPath = join(cacheDir, "response.jsonl")
|
|
249
|
-
const assetsDir = join(cacheDir, "response.jsonl.assets")
|
|
250
|
-
let jsonlContent = timedChunksToJsonl(chunks)
|
|
251
|
-
const { content: extractedContent } = extractDataUrls(jsonlContent, assetsDir)
|
|
252
|
-
jsonlContent = extractedContent
|
|
253
|
-
writeTextFile(jsonlPath, jsonlContent)
|
|
286
|
+
const persistPromise = (async () => {
|
|
287
|
+
const chunks = await recordStreamWithTiming(recordStream)
|
|
288
|
+
const sseMeta: CachedResponseMeta = {
|
|
289
|
+
...meta,
|
|
290
|
+
total_ms: Date.now() - startTime
|
|
291
|
+
}
|
|
254
292
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
293
|
+
if (storage) {
|
|
294
|
+
await storage.sseChunks.set(key, chunks)
|
|
295
|
+
await storage.responseMeta.set(key, sseMeta)
|
|
296
|
+
} else {
|
|
297
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
298
|
+
const jsonlPath = join(cacheDir, "response.jsonl")
|
|
299
|
+
const assetsDir = join(cacheDir, "response.jsonl.assets")
|
|
300
|
+
let jsonlContent = timedChunksToJsonl(chunks)
|
|
301
|
+
const { content: extractedContent } = extractDataUrls(jsonlContent, assetsDir)
|
|
302
|
+
jsonlContent = extractedContent
|
|
303
|
+
writeTextFile(jsonlPath, jsonlContent)
|
|
304
|
+
|
|
305
|
+
const metaPath = join(cacheDir, "response.meta.json")
|
|
306
|
+
writeJsonFile(metaPath, sseMeta)
|
|
307
|
+
}
|
|
308
|
+
void tryDevFsLogsWrite(`${cacheKey}/meta`, sseMeta)
|
|
309
|
+
void tryDevFsLogsWrite(`${cacheKey}/sse`, chunks)
|
|
310
|
+
})()
|
|
311
|
+
trackPendingSSEWrite(getPendingSSEWriteKey(cacheKey, storage, filesystemBaseDir), persistPromise)
|
|
260
312
|
|
|
261
313
|
return new Response(returnStream, {
|
|
262
314
|
status: response.status,
|
|
@@ -278,7 +330,7 @@ export async function storeResponse(
|
|
|
278
330
|
await storage.responseMeta.set(key, transformedResponse.meta)
|
|
279
331
|
await storage.responseBody.set(key, transformedResponse.body ?? "")
|
|
280
332
|
} else {
|
|
281
|
-
const cacheDir = ensureCacheDir(cacheKey)
|
|
333
|
+
const cacheDir = ensureCacheDir(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
282
334
|
const jsonPath = join(cacheDir, "response.json")
|
|
283
335
|
const assetsDir = join(cacheDir, "response.json.assets")
|
|
284
336
|
const { content: extractedContent } = extractDataUrls(transformedResponse.body ?? "", assetsDir)
|
|
@@ -307,6 +359,8 @@ export async function getCachedResponse(
|
|
|
307
359
|
storage?: CacheStorage
|
|
308
360
|
): Promise<Response | null> {
|
|
309
361
|
const key: CacheKey = [cacheKey]
|
|
362
|
+
const filesystemBaseDir = storage ? undefined : getCacheDir()
|
|
363
|
+
const pendingWriteKey = getPendingSSEWriteKey(cacheKey, storage, filesystemBaseDir)
|
|
310
364
|
|
|
311
365
|
// Try to get response metadata
|
|
312
366
|
let responseMeta: CachedResponseMeta | null = null
|
|
@@ -314,7 +368,7 @@ export async function getCachedResponse(
|
|
|
314
368
|
if (storage) {
|
|
315
369
|
responseMeta = await storage.responseMeta.get(key)
|
|
316
370
|
} else {
|
|
317
|
-
const cacheDir = join(
|
|
371
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
318
372
|
const metaPath = join(cacheDir, "response.meta.json")
|
|
319
373
|
responseMeta = readJsonFile<CachedResponseMeta>(metaPath)
|
|
320
374
|
|
|
@@ -331,6 +385,29 @@ export async function getCachedResponse(
|
|
|
331
385
|
}
|
|
332
386
|
}
|
|
333
387
|
|
|
388
|
+
if (!responseMeta) {
|
|
389
|
+
await waitForPendingSSEWrite(pendingWriteKey)
|
|
390
|
+
if (storage) {
|
|
391
|
+
responseMeta = await storage.responseMeta.get(key)
|
|
392
|
+
} else {
|
|
393
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
394
|
+
const metaPath = join(cacheDir, "response.meta.json")
|
|
395
|
+
responseMeta = readJsonFile<CachedResponseMeta>(metaPath)
|
|
396
|
+
|
|
397
|
+
// For non-streaming responses, metadata is stored inside response.json
|
|
398
|
+
if (!responseMeta) {
|
|
399
|
+
const jsonPath = join(cacheDir, "response.json")
|
|
400
|
+
const cached = readJsonFile<{
|
|
401
|
+
body: string
|
|
402
|
+
meta: CachedResponseMeta
|
|
403
|
+
}>(jsonPath)
|
|
404
|
+
if (cached?.meta) {
|
|
405
|
+
responseMeta = cached.meta
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
334
411
|
if (!responseMeta) {
|
|
335
412
|
const devFsMeta = (await tryDevFsLogsRead(`${cacheKey}/meta`)) as CachedResponseMeta | null
|
|
336
413
|
if (!devFsMeta) {
|
|
@@ -347,7 +424,7 @@ export async function getCachedResponse(
|
|
|
347
424
|
if (storage) {
|
|
348
425
|
data = await storage.binaryBody.get(key)
|
|
349
426
|
} else {
|
|
350
|
-
const cacheDir = join(
|
|
427
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
351
428
|
const binPath = join(cacheDir, "response.bin")
|
|
352
429
|
data = readBinaryFile(binPath)
|
|
353
430
|
}
|
|
@@ -403,7 +480,7 @@ export async function getCachedResponse(
|
|
|
403
480
|
}
|
|
404
481
|
|
|
405
482
|
// Legacy filesystem path
|
|
406
|
-
const cacheDir = join(
|
|
483
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
407
484
|
const jsonlPath = join(cacheDir, "response.jsonl")
|
|
408
485
|
const assetsDir = join(cacheDir, "response.jsonl.assets")
|
|
409
486
|
let jsonlContent = readTextFile(jsonlPath)
|
|
@@ -443,7 +520,7 @@ export async function getCachedResponse(
|
|
|
443
520
|
if (storage) {
|
|
444
521
|
body = await storage.responseBody.get(key)
|
|
445
522
|
} else {
|
|
446
|
-
const cacheDir = join(
|
|
523
|
+
const cacheDir = join(requireFilesystemBaseDir(filesystemBaseDir), cacheKey)
|
|
447
524
|
const jsonPath = join(cacheDir, "response.json")
|
|
448
525
|
const assetsDir = join(cacheDir, "response.json.assets")
|
|
449
526
|
const cached = readJsonFile<{
|
|
@@ -2,6 +2,7 @@ import type { CachedRequest, CachedResponseMeta, CacheKey, CacheStorage, KV, KVS
|
|
|
2
2
|
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
|
|
4
4
|
import { join } from "node:path"
|
|
5
|
+
import { extractDataUrls, restoreDataUrls } from "./binary-extractor.js"
|
|
5
6
|
import { jsonlToTimedChunks, timedChunksToJsonl } from "./sse-handler.js"
|
|
6
7
|
|
|
7
8
|
function ensureCacheDir(baseDir: string, cacheKey: string): string {
|
|
@@ -44,6 +45,93 @@ export function createJsonFileKV<T>(baseDir: string, filename: string): KV<Cache
|
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Creates a KV store for HTTP requests that extracts inline base64 data URLs
|
|
50
|
+
* to sidecar files on disk and restores them when reading from the cache.
|
|
51
|
+
*
|
|
52
|
+
* @param baseDir - Base directory where cache entries are stored.
|
|
53
|
+
* @param filename - File name used to persist the cached request JSON.
|
|
54
|
+
* @returns A KV implementation keyed by CacheKey storing CachedRequest values.
|
|
55
|
+
* @since 1.0.0
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const kv = createRequestFileKV(".cache", "request.json")
|
|
59
|
+
* await kv.set(["some-cache-key"], cachedRequest)
|
|
60
|
+
* const value = await kv.get(["some-cache-key"])
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function createRequestFileKV(baseDir: string, filename: string): KV<CacheKey, CachedRequest> {
|
|
64
|
+
const assetsExt = ".assets"
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
async get([key]: CacheKey): Promise<CachedRequest | null> {
|
|
68
|
+
const filePath = join(baseDir, key, filename)
|
|
69
|
+
if (!existsSync(filePath)) {
|
|
70
|
+
return null
|
|
71
|
+
}
|
|
72
|
+
const assetsDir = join(baseDir, key, filename + assetsExt)
|
|
73
|
+
const content = restoreDataUrls(readFileSync(filePath, "utf-8"), assetsDir)
|
|
74
|
+
return JSON.parse(content) as CachedRequest
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
async set([key]: CacheKey, value: CachedRequest): Promise<void> {
|
|
78
|
+
const cacheDir = ensureCacheDir(baseDir, key)
|
|
79
|
+
const filePath = join(cacheDir, filename)
|
|
80
|
+
const assetsDir = join(cacheDir, filename + assetsExt)
|
|
81
|
+
const { content } = extractDataUrls(JSON.stringify(value, null, 2), assetsDir)
|
|
82
|
+
writeFileSync(filePath, content, "utf-8")
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
async has([key]: CacheKey): Promise<boolean> {
|
|
86
|
+
const filePath = join(baseDir, key, filename)
|
|
87
|
+
return existsSync(filePath)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Creates a KV store for text files that extracts inline base64 data URLs into
|
|
94
|
+
* sidecar asset files on disk and restores them when reading.
|
|
95
|
+
*
|
|
96
|
+
* @param baseDir - Base directory where cache entries are stored.
|
|
97
|
+
* @param filename - File name used for the cached text content within each cache key directory.
|
|
98
|
+
* @returns A KV store keyed by CacheKey that reads and writes text content from the filesystem.
|
|
99
|
+
* @since 1.0.0
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* const kv = createTextFileKV("/tmp/fetch-hooks-cache", "response.txt")
|
|
103
|
+
* await kv.set(["my-cache-key"], "inline data: data:image/png;base64,...")
|
|
104
|
+
* const value = await kv.get(["my-cache-key"])
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export function createTextFileKV(baseDir: string, filename: string): KV<CacheKey, string> {
|
|
108
|
+
const assetsExt = ".assets"
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
async get([key]: CacheKey): Promise<string | null> {
|
|
112
|
+
const filePath = join(baseDir, key, filename)
|
|
113
|
+
if (!existsSync(filePath)) {
|
|
114
|
+
return null
|
|
115
|
+
}
|
|
116
|
+
const assetsDir = join(baseDir, key, filename + assetsExt)
|
|
117
|
+
return restoreDataUrls(readFileSync(filePath, "utf-8"), assetsDir)
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
async set([key]: CacheKey, value: string): Promise<void> {
|
|
121
|
+
const cacheDir = ensureCacheDir(baseDir, key)
|
|
122
|
+
const filePath = join(cacheDir, filename)
|
|
123
|
+
const assetsDir = join(cacheDir, filename + assetsExt)
|
|
124
|
+
const { content } = extractDataUrls(value, assetsDir)
|
|
125
|
+
writeFileSync(filePath, content, "utf-8")
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
async has([key]: CacheKey): Promise<boolean> {
|
|
129
|
+
const filePath = join(baseDir, key, filename)
|
|
130
|
+
return existsSync(filePath)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
47
135
|
/** Create a KV store backed by binary files */
|
|
48
136
|
export function createBinaryFileKV(baseDir: string, filename: string): KV<CacheKey, Uint8Array> {
|
|
49
137
|
return {
|
|
@@ -116,9 +204,9 @@ export function createJsonlFileKVStream(baseDir: string, filename: string): KVSt
|
|
|
116
204
|
/** Create a complete CacheStorage backed by the filesystem */
|
|
117
205
|
export function createFilesystemStorage(baseDir: string): CacheStorage {
|
|
118
206
|
return {
|
|
119
|
-
requests:
|
|
207
|
+
requests: createRequestFileKV(baseDir, "request.json"),
|
|
120
208
|
responseMeta: createJsonFileKV<CachedResponseMeta>(baseDir, "response.meta.json"),
|
|
121
|
-
responseBody:
|
|
209
|
+
responseBody: createTextFileKV(baseDir, "response.json"),
|
|
122
210
|
binaryBody: createBinaryFileKV(baseDir, "response.bin"),
|
|
123
211
|
sseChunks: createJsonlFileKVStream(baseDir, "response.jsonl")
|
|
124
212
|
}
|