@effect-native/fetch-hooks 0.0.1-placeholder → 0.1.0

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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/binary-extractor.d.ts +9 -0
  4. package/dist/binary-extractor.d.ts.map +1 -0
  5. package/dist/binary-extractor.js +85 -0
  6. package/dist/binary-extractor.js.map +1 -0
  7. package/dist/cache-manager.d.ts +8 -0
  8. package/dist/cache-manager.d.ts.map +1 -0
  9. package/dist/cache-manager.js +408 -0
  10. package/dist/cache-manager.js.map +1 -0
  11. package/dist/environment.d.ts +5 -0
  12. package/dist/environment.d.ts.map +1 -0
  13. package/dist/environment.js +25 -0
  14. package/dist/environment.js.map +1 -0
  15. package/dist/filesystem-storage.d.ts +42 -0
  16. package/dist/filesystem-storage.d.ts.map +1 -0
  17. package/dist/filesystem-storage.js +192 -0
  18. package/dist/filesystem-storage.js.map +1 -0
  19. package/dist/flat-file-storage.d.ts +33 -0
  20. package/dist/flat-file-storage.d.ts.map +1 -0
  21. package/dist/flat-file-storage.js +153 -0
  22. package/dist/flat-file-storage.js.map +1 -0
  23. package/dist/index.d.ts +9 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +183 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/request-hasher.d.ts +5 -0
  28. package/dist/request-hasher.d.ts.map +1 -0
  29. package/dist/request-hasher.js +74 -0
  30. package/dist/request-hasher.js.map +1 -0
  31. package/dist/sse-handler.d.ts +9 -0
  32. package/dist/sse-handler.d.ts.map +1 -0
  33. package/dist/sse-handler.js +225 -0
  34. package/dist/sse-handler.js.map +1 -0
  35. package/dist/types.d.ts +116 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +2 -0
  38. package/dist/types.js.map +1 -0
  39. package/package.json +52 -3
  40. package/src/binary-extractor.ts +104 -0
  41. package/src/cache-manager.ts +499 -0
  42. package/src/environment.ts +27 -0
  43. package/src/filesystem-storage.ts +213 -0
  44. package/src/flat-file-storage.ts +170 -0
  45. package/src/index.ts +249 -0
  46. package/src/request-hasher.ts +86 -0
  47. package/src/sse-handler.ts +281 -0
  48. package/src/types.ts +140 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 effect-native contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @effect-native/fetch-hooks
2
+
3
+ Fetch caching utilities for deterministic API replay in development and testing.
4
+
5
+ ## Overview
6
+
7
+ This package provides utilities for recording and replaying fetch requests, enabling:
8
+
9
+ - **Deterministic test runs** - Replay cached responses instead of making real API calls
10
+ - **Faster development** - Avoid network latency during development
11
+ - **Offline development** - Work without network connectivity
12
+ - **Replay for testing** - Deterministically test API integrations
13
+
14
+ ## Features
15
+
16
+ - **Request caching** - Record fetch requests and cache responses
17
+ - **Binary response handling** - Support for binary/blob responses
18
+ - **Custom headers** - Handle request-specific headers
19
+ - **Server-sent events** - SSE stream replay support
20
+ - **Filesystem storage** - Persistent cache storage
21
+ - **Environment-aware** - Detects Bun/Node.js runtime
22
+
23
+ ## Usage
24
+
25
+ See test files for usage examples:
26
+
27
+ - `binary-extractor.test.ts` - Binary response handling
28
+ - `cache-manager.test.ts` - Cache management
29
+ - `filesystem-storage.test.ts` - File storage operations
30
+ - `request-hasher.test.ts` - Request hashing
31
+ - `sse-handler.test.ts` - SSE stream handling
32
+
33
+ ## License
34
+
35
+ MIT
@@ -0,0 +1,9 @@
1
+ export declare function extractDataUrls(content: string, assetsDir: string): {
2
+ content: string;
3
+ extractedFiles: Array<string>;
4
+ };
5
+ export declare function restoreDataUrls(content: string, assetsDir: string): string;
6
+ export declare function isBinaryContentType(contentType: string): boolean;
7
+ export declare function writeBinaryFile(filePath: string, data: Uint8Array): void;
8
+ export declare function readBinaryFile(filePath: string): Buffer | null;
9
+ //# sourceMappingURL=binary-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-extractor.d.ts","sourceRoot":"","sources":["../src/binary-extractor.ts"],"names":[],"mappings":"AAyBA,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB;IACD,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;CAC9B,CA4BA;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAWhE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAQxE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9D"}
@@ -0,0 +1,85 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ const DATA_URL_REGEX = /data:([^;]+);base64,([A-Za-z0-9+/=]+)/g;
4
+ const MIME_TO_EXTENSION = {
5
+ "image/png": ".png",
6
+ "image/jpeg": ".jpeg",
7
+ "image/jpg": ".jpg",
8
+ "image/gif": ".gif",
9
+ "image/webp": ".webp",
10
+ "image/svg+xml": ".svg",
11
+ "audio/wav": ".wav",
12
+ "audio/mp3": ".mp3",
13
+ "audio/mpeg": ".mp3",
14
+ "audio/ogg": ".ogg",
15
+ "video/mp4": ".mp4",
16
+ "video/webm": ".webm",
17
+ "application/pdf": ".pdf"
18
+ };
19
+ function getExtensionForMime(mimeType) {
20
+ return MIME_TO_EXTENSION[mimeType] ?? ".bin";
21
+ }
22
+ export function extractDataUrls(content, assetsDir) {
23
+ const extractedFiles = [];
24
+ let fileIndex = 0;
25
+ const modifiedContent = content.replace(DATA_URL_REGEX, (_match, mimeType, base64Data) => {
26
+ fileIndex++;
27
+ const paddedIndex = String(fileIndex).padStart(4, "0");
28
+ const extension = getExtensionForMime(mimeType);
29
+ const filename = `${paddedIndex}${extension}`;
30
+ const filePath = join(assetsDir, filename);
31
+ if (!existsSync(assetsDir)) {
32
+ mkdirSync(assetsDir, {
33
+ recursive: true
34
+ });
35
+ }
36
+ const buffer = Buffer.from(base64Data, "base64");
37
+ writeFileSync(filePath, buffer);
38
+ extractedFiles.push(filename);
39
+ return `data:${mimeType};base64,__sidecar:${filename}__`;
40
+ });
41
+ return {
42
+ content: modifiedContent,
43
+ extractedFiles
44
+ };
45
+ }
46
+ export function restoreDataUrls(content, assetsDir) {
47
+ const sidecarRegex = /data:([^;]+);base64,__sidecar:([\w.]+)__/g;
48
+ return content.replace(sidecarRegex, (match, mimeType, filename) => {
49
+ const filePath = join(assetsDir, filename);
50
+ if (!existsSync(filePath)) {
51
+ return match;
52
+ }
53
+ const buffer = readFileSync(filePath);
54
+ const base64Data = buffer.toString("base64");
55
+ return `data:${mimeType};base64,${base64Data}`;
56
+ });
57
+ }
58
+ export function isBinaryContentType(contentType) {
59
+ const binaryTypes = [
60
+ "application/octet-stream",
61
+ "image/",
62
+ "audio/",
63
+ "video/",
64
+ "application/pdf",
65
+ "application/zip",
66
+ "application/gzip"
67
+ ];
68
+ return binaryTypes.some((type) => contentType.startsWith(type));
69
+ }
70
+ export function writeBinaryFile(filePath, data) {
71
+ const dir = dirname(filePath);
72
+ if (!existsSync(dir)) {
73
+ mkdirSync(dir, {
74
+ recursive: true
75
+ });
76
+ }
77
+ writeFileSync(filePath, data);
78
+ }
79
+ export function readBinaryFile(filePath) {
80
+ if (!existsSync(filePath)) {
81
+ return null;
82
+ }
83
+ return readFileSync(filePath);
84
+ }
85
+ //# sourceMappingURL=binary-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-extractor.js","sourceRoot":"","sources":["../src/binary-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CacheStorage, GeneratorTransformHook, HashableRequest, RawCachedRequest, StorableResponse, TimedChunk, TransformHook } from "./types.js";
2
+ /** @internal Set the fetch function used for dev-fs-logs communication. */
3
+ export declare function setInternalFetchForCache(fetchFn: typeof globalThis.fetch): void;
4
+ export declare function storeRequest(params: RawCachedRequest, providedCacheKey?: string, skipHeaderFiltering?: boolean, storage?: CacheStorage, hashableRequest?: HashableRequest): Promise<string>;
5
+ export declare function storeResponse(cacheKey: string, response: Response, beforeStoreResponse?: TransformHook<StorableResponse>, storage?: CacheStorage, hashableRequest?: HashableRequest): Promise<Response>;
6
+ export declare function getCachedResponse(cacheKey: string, afterLoadResponse?: TransformHook<StorableResponse>, transformSSEChunk?: GeneratorTransformHook<TimedChunk>, storage?: CacheStorage): Promise<Response | null>;
7
+ export declare function getCacheKeyFromUrl(url: string): string | null;
8
+ //# sourceMappingURL=cache-manager.d.ts.map
@@ -0,0 +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;AA2BnB,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,IAAI,CAE/E;AAyFD,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,CA6BjB;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,CA8HnB;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,CAqL1B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7D"}
@@ -0,0 +1,408 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { extractDataUrls, isBinaryContentType, readBinaryFile, restoreDataUrls, writeBinaryFile } from "./binary-extractor.js";
4
+ import { getCacheDir } from "./environment.js";
5
+ import { getStorableHeaders, hashRequest, headersToRecord } from "./request-hasher.js";
6
+ import { isSSEResponse, jsonlToTimedChunks, recordStreamWithTiming, replayStreamFromAsyncIterable, replayStreamWithTiming, timedChunksToJsonl } from "./sse-handler.js";
7
+ const DEV_FS_LOGS_PORT = 1090;
8
+ // Internal fetch function, set via setInternalFetchForCache
9
+ let _internalFetch = globalThis.fetch;
10
+ /** @internal Set the fetch function used for dev-fs-logs communication. */
11
+ export function setInternalFetchForCache(fetchFn) {
12
+ _internalFetch = fetchFn;
13
+ }
14
+ async function tryDevFsLogsWrite(cacheId, data) {
15
+ return _internalFetch(`http://localhost:${DEV_FS_LOGS_PORT}/cache`, {
16
+ method: "POST",
17
+ headers: {
18
+ "Content-Type": "application/json"
19
+ },
20
+ body: JSON.stringify({
21
+ cacheId,
22
+ data
23
+ })
24
+ })
25
+ .then((response) => response.ok)
26
+ .catch(() => false);
27
+ }
28
+ async function tryDevFsLogsRead(cacheId) {
29
+ return _internalFetch(`http://localhost:${DEV_FS_LOGS_PORT}/cache/${cacheId}`)
30
+ .then((response) => {
31
+ if (!response.ok) {
32
+ return null;
33
+ }
34
+ return response.json();
35
+ })
36
+ .catch(() => null);
37
+ }
38
+ function ensureCacheDir(cacheKey) {
39
+ const baseDir = getCacheDir();
40
+ const cacheDir = join(baseDir, cacheKey);
41
+ if (!existsSync(cacheDir)) {
42
+ try {
43
+ mkdirSync(cacheDir, {
44
+ recursive: true
45
+ });
46
+ }
47
+ catch (error) {
48
+ // Handle potential race condition where the directory was created
49
+ // between the existsSync check and mkdirSync call.
50
+ if (!(error instanceof Error && error.code === "EEXIST")) {
51
+ throw error;
52
+ }
53
+ }
54
+ }
55
+ return cacheDir;
56
+ }
57
+ function writeJsonFile(filePath, data) {
58
+ writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
59
+ }
60
+ function readJsonFile(filePath) {
61
+ if (!existsSync(filePath)) {
62
+ return null;
63
+ }
64
+ const content = readFileSync(filePath, "utf-8");
65
+ return JSON.parse(content);
66
+ }
67
+ function writeTextFile(filePath, content) {
68
+ writeFileSync(filePath, content, "utf-8");
69
+ }
70
+ function readTextFile(filePath) {
71
+ if (!existsSync(filePath)) {
72
+ return null;
73
+ }
74
+ return readFileSync(filePath, "utf-8");
75
+ }
76
+ /** Convert an array to an async iterable for generator hooks */
77
+ async function* arrayToAsyncIterable(arr) {
78
+ for (const item of arr) {
79
+ yield item;
80
+ }
81
+ }
82
+ function parseRequestBody(body) {
83
+ if (body === undefined) {
84
+ return undefined;
85
+ }
86
+ try {
87
+ const parsed = JSON.parse(body);
88
+ return { json: parsed };
89
+ }
90
+ catch {
91
+ return { text: body };
92
+ }
93
+ }
94
+ export async function storeRequest(params, providedCacheKey, skipHeaderFiltering, storage, hashableRequest) {
95
+ const { body, headers, method, url } = params;
96
+ const cacheKey = providedCacheKey ?? hashRequest({
97
+ url,
98
+ method,
99
+ headers,
100
+ body
101
+ });
102
+ const request = {
103
+ url,
104
+ method,
105
+ headers: skipHeaderFiltering ? headers : getStorableHeaders(headers),
106
+ body: parseRequestBody(body)
107
+ };
108
+ if (storage) {
109
+ const key = hashableRequest ? [cacheKey, hashableRequest] : [cacheKey];
110
+ await storage.requests.set(key, request);
111
+ }
112
+ else {
113
+ // Legacy filesystem path
114
+ const cacheDir = ensureCacheDir(cacheKey);
115
+ const requestPath = join(cacheDir, "request.json");
116
+ writeJsonFile(requestPath, request);
117
+ }
118
+ await tryDevFsLogsWrite(`${cacheKey}/request`, request);
119
+ return cacheKey;
120
+ }
121
+ export async function storeResponse(cacheKey, response, beforeStoreResponse, storage, hashableRequest) {
122
+ const key = hashableRequest ? [cacheKey, hashableRequest] : [cacheKey];
123
+ const startTime = Date.now();
124
+ const headers = headersToRecord(response.headers);
125
+ const contentType = headers["content-type"] ?? "";
126
+ const isSSE = isSSEResponse(response.headers);
127
+ const isBinary = isBinaryContentType(contentType);
128
+ const meta = {
129
+ status: response.status,
130
+ statusText: response.statusText,
131
+ headers,
132
+ ttfb_ms: Date.now() - startTime,
133
+ total_ms: 0,
134
+ is_sse: isSSE,
135
+ is_binary: isBinary,
136
+ cached_at: new Date().toISOString()
137
+ };
138
+ if (!response.body) {
139
+ meta.total_ms = Date.now() - startTime;
140
+ if (storage) {
141
+ await storage.responseMeta.set(key, meta);
142
+ }
143
+ else {
144
+ const cacheDir = ensureCacheDir(cacheKey);
145
+ const metaPath = join(cacheDir, "response.meta.json");
146
+ writeJsonFile(metaPath, meta);
147
+ }
148
+ await tryDevFsLogsWrite(`${cacheKey}/meta`, meta);
149
+ return new Response(null, {
150
+ status: response.status,
151
+ statusText: response.statusText,
152
+ headers: response.headers
153
+ });
154
+ }
155
+ if (isBinary) {
156
+ const responseArrayBuffer = await response.arrayBuffer();
157
+ const data = new Uint8Array(responseArrayBuffer);
158
+ meta.total_ms = Date.now() - startTime;
159
+ const binaryMeta = {
160
+ ...meta,
161
+ size: data.length,
162
+ content_type: contentType
163
+ };
164
+ if (storage) {
165
+ await storage.responseMeta.set(key, binaryMeta);
166
+ await storage.binaryBody.set(key, data);
167
+ }
168
+ else {
169
+ const cacheDir = ensureCacheDir(cacheKey);
170
+ const binPath = join(cacheDir, "response.bin");
171
+ writeBinaryFile(binPath, data);
172
+ const metaPath = join(cacheDir, "response.meta.json");
173
+ writeJsonFile(metaPath, binaryMeta);
174
+ }
175
+ await tryDevFsLogsWrite(`${cacheKey}/meta`, meta);
176
+ return new Response(responseArrayBuffer, {
177
+ status: response.status,
178
+ statusText: response.statusText,
179
+ headers: response.headers
180
+ });
181
+ }
182
+ if (isSSE) {
183
+ const [recordStream, returnStream] = response.body.tee();
184
+ const chunks = await recordStreamWithTiming(recordStream);
185
+ meta.total_ms = Date.now() - startTime;
186
+ if (storage) {
187
+ await storage.responseMeta.set(key, meta);
188
+ await storage.sseChunks.set(key, chunks);
189
+ }
190
+ else {
191
+ const cacheDir = ensureCacheDir(cacheKey);
192
+ const jsonlPath = join(cacheDir, "response.jsonl");
193
+ const assetsDir = join(cacheDir, "response.jsonl.assets");
194
+ let jsonlContent = timedChunksToJsonl(chunks);
195
+ const { content: extractedContent } = extractDataUrls(jsonlContent, assetsDir);
196
+ jsonlContent = extractedContent;
197
+ writeTextFile(jsonlPath, jsonlContent);
198
+ const metaPath = join(cacheDir, "response.meta.json");
199
+ writeJsonFile(metaPath, meta);
200
+ }
201
+ await tryDevFsLogsWrite(`${cacheKey}/meta`, meta);
202
+ await tryDevFsLogsWrite(`${cacheKey}/sse`, chunks);
203
+ return new Response(returnStream, {
204
+ status: response.status,
205
+ statusText: response.statusText,
206
+ headers: response.headers
207
+ });
208
+ }
209
+ const text = await response.text();
210
+ meta.total_ms = Date.now() - startTime;
211
+ // Apply beforeStoreResponse hook if provided
212
+ const storableResponse = { body: text, meta };
213
+ const transformedResponse = beforeStoreResponse
214
+ ? await beforeStoreResponse(storableResponse)
215
+ : storableResponse;
216
+ if (storage) {
217
+ await storage.responseMeta.set(key, transformedResponse.meta);
218
+ await storage.responseBody.set(key, transformedResponse.body ?? "");
219
+ }
220
+ else {
221
+ const cacheDir = ensureCacheDir(cacheKey);
222
+ const jsonPath = join(cacheDir, "response.json");
223
+ const assetsDir = join(cacheDir, "response.json.assets");
224
+ const { content: extractedContent } = extractDataUrls(transformedResponse.body ?? "", assetsDir);
225
+ writeJsonFile(jsonPath, {
226
+ body: extractedContent,
227
+ meta: transformedResponse.meta
228
+ });
229
+ }
230
+ await tryDevFsLogsWrite(`${cacheKey}/response`, {
231
+ body: transformedResponse.body,
232
+ meta: transformedResponse.meta
233
+ });
234
+ return new Response(text, {
235
+ status: response.status,
236
+ statusText: response.statusText,
237
+ headers: response.headers
238
+ });
239
+ }
240
+ export async function getCachedResponse(cacheKey, afterLoadResponse, transformSSEChunk, storage) {
241
+ const key = [cacheKey];
242
+ // Try to get response metadata
243
+ let responseMeta = null;
244
+ if (storage) {
245
+ responseMeta = await storage.responseMeta.get(key);
246
+ }
247
+ else {
248
+ const cacheDir = join(getCacheDir(), cacheKey);
249
+ const metaPath = join(cacheDir, "response.meta.json");
250
+ responseMeta = readJsonFile(metaPath);
251
+ // For non-streaming responses, metadata is stored inside response.json
252
+ if (!responseMeta) {
253
+ const jsonPath = join(cacheDir, "response.json");
254
+ const cached = readJsonFile(jsonPath);
255
+ if (cached?.meta) {
256
+ responseMeta = cached.meta;
257
+ }
258
+ }
259
+ }
260
+ if (!responseMeta) {
261
+ const devFsMeta = (await tryDevFsLogsRead(`${cacheKey}/meta`));
262
+ if (!devFsMeta) {
263
+ return null;
264
+ }
265
+ responseMeta = devFsMeta;
266
+ }
267
+ const headers = new Headers(responseMeta.headers);
268
+ // Handle binary responses
269
+ if (responseMeta.is_binary) {
270
+ let data = null;
271
+ if (storage) {
272
+ data = await storage.binaryBody.get(key);
273
+ }
274
+ else {
275
+ const cacheDir = join(getCacheDir(), cacheKey);
276
+ const binPath = join(cacheDir, "response.bin");
277
+ data = readBinaryFile(binPath);
278
+ }
279
+ if (!data) {
280
+ return null;
281
+ }
282
+ const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
283
+ return new Response(arrayBuffer, {
284
+ status: responseMeta.status,
285
+ statusText: responseMeta.statusText,
286
+ headers
287
+ });
288
+ }
289
+ // Handle SSE responses
290
+ if (responseMeta.is_sse) {
291
+ if (storage) {
292
+ const chunks = storage.sseChunks.get(key);
293
+ // Check if there are any chunks by peeking
294
+ const iterator = chunks[Symbol.asyncIterator]();
295
+ const first = await iterator.next();
296
+ if (first.done) {
297
+ // No chunks in storage, try dev-fs-logs fallback
298
+ const devFsChunks = (await tryDevFsLogsRead(`${cacheKey}/sse`));
299
+ if (!devFsChunks) {
300
+ return null;
301
+ }
302
+ const stream = transformSSEChunk
303
+ ? replayStreamFromAsyncIterable(transformSSEChunk(arrayToAsyncIterable(devFsChunks)))
304
+ : replayStreamWithTiming(devFsChunks);
305
+ return new Response(stream, {
306
+ status: responseMeta.status,
307
+ statusText: responseMeta.statusText,
308
+ headers
309
+ });
310
+ }
311
+ // Reconstruct the async iterable with the first chunk prepended
312
+ async function* prependFirst() {
313
+ yield first.value;
314
+ for await (const chunk of { [Symbol.asyncIterator]: () => iterator }) {
315
+ yield chunk;
316
+ }
317
+ }
318
+ const chunksIterable = prependFirst();
319
+ const stream = transformSSEChunk
320
+ ? replayStreamFromAsyncIterable(transformSSEChunk(chunksIterable))
321
+ : replayStreamFromAsyncIterable(chunksIterable);
322
+ return new Response(stream, {
323
+ status: responseMeta.status,
324
+ statusText: responseMeta.statusText,
325
+ headers
326
+ });
327
+ }
328
+ // Legacy filesystem path
329
+ const cacheDir = join(getCacheDir(), cacheKey);
330
+ const jsonlPath = join(cacheDir, "response.jsonl");
331
+ const assetsDir = join(cacheDir, "response.jsonl.assets");
332
+ let jsonlContent = readTextFile(jsonlPath);
333
+ if (!jsonlContent) {
334
+ const devFsChunks = (await tryDevFsLogsRead(`${cacheKey}/sse`));
335
+ if (!devFsChunks) {
336
+ return null;
337
+ }
338
+ const stream = transformSSEChunk
339
+ ? replayStreamFromAsyncIterable(transformSSEChunk(arrayToAsyncIterable(devFsChunks)))
340
+ : replayStreamWithTiming(devFsChunks);
341
+ return new Response(stream, {
342
+ status: responseMeta.status,
343
+ statusText: responseMeta.statusText,
344
+ headers
345
+ });
346
+ }
347
+ jsonlContent = restoreDataUrls(jsonlContent, assetsDir);
348
+ const chunks = jsonlToTimedChunks(jsonlContent);
349
+ const stream = transformSSEChunk
350
+ ? replayStreamFromAsyncIterable(transformSSEChunk(arrayToAsyncIterable(chunks)))
351
+ : replayStreamWithTiming(chunks);
352
+ return new Response(stream, {
353
+ status: responseMeta.status,
354
+ statusText: responseMeta.statusText,
355
+ headers
356
+ });
357
+ }
358
+ // Handle text/JSON responses
359
+ let body = null;
360
+ let cachedMeta = responseMeta;
361
+ if (storage) {
362
+ body = await storage.responseBody.get(key);
363
+ }
364
+ else {
365
+ const cacheDir = join(getCacheDir(), cacheKey);
366
+ const jsonPath = join(cacheDir, "response.json");
367
+ const assetsDir = join(cacheDir, "response.json.assets");
368
+ const cached = readJsonFile(jsonPath);
369
+ if (cached) {
370
+ body = restoreDataUrls(cached.body, assetsDir);
371
+ cachedMeta = cached.meta;
372
+ }
373
+ }
374
+ if (!body) {
375
+ const devFsResponse = (await tryDevFsLogsRead(`${cacheKey}/response`));
376
+ if (!devFsResponse) {
377
+ return null;
378
+ }
379
+ const transformed = afterLoadResponse
380
+ ? await afterLoadResponse({ body: devFsResponse.body, meta: devFsResponse.meta })
381
+ : devFsResponse;
382
+ return new Response(transformed.body, {
383
+ status: transformed.meta.status,
384
+ statusText: transformed.meta.statusText,
385
+ headers: new Headers(transformed.meta.headers)
386
+ });
387
+ }
388
+ // Apply afterLoadResponse hook if provided
389
+ const storableResponse = { body, meta: cachedMeta };
390
+ const transformedResponse = afterLoadResponse
391
+ ? await afterLoadResponse(storableResponse)
392
+ : storableResponse;
393
+ return new Response(transformedResponse.body, {
394
+ status: transformedResponse.meta.status,
395
+ statusText: transformedResponse.meta.statusText,
396
+ headers: new Headers(transformedResponse.meta.headers)
397
+ });
398
+ }
399
+ export function getCacheKeyFromUrl(url) {
400
+ const cacheSchemes = ["cache://", "devcache://"];
401
+ for (const scheme of cacheSchemes) {
402
+ if (url.startsWith(scheme)) {
403
+ return url.slice(scheme.length);
404
+ }
405
+ }
406
+ return null;
407
+ }
408
+ //# sourceMappingURL=cache-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function isProduction(): boolean;
2
+ export declare function isCacheEnabled(): boolean;
3
+ export declare function isReplayOnly(): boolean;
4
+ export declare function getCacheDir(): string;
5
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,IAAI,OAAO,CAKtC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAWxC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,25 @@
1
+ export function isProduction() {
2
+ if (process.env.NEXT_PUBLIC_VERCEL_ENV === "production") {
3
+ return true;
4
+ }
5
+ return process.env.OR_ENV === "production";
6
+ }
7
+ export function isCacheEnabled() {
8
+ if (isProduction()) {
9
+ return false;
10
+ }
11
+ if (process.env.DEV_FETCH_CACHE === "0") {
12
+ return false;
13
+ }
14
+ if (process.argv.includes("--no-fetch-cache")) {
15
+ return false;
16
+ }
17
+ return process.env.DEV_FETCH_CACHE === "1";
18
+ }
19
+ export function isReplayOnly() {
20
+ return process.env.DEV_FETCH_CACHE_RECORD === "0";
21
+ }
22
+ export function getCacheDir() {
23
+ return process.env.DEV_FETCH_CACHE_DIR ?? ".cache/fetch";
24
+ }
25
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,YAAY,EAAE,CAAC;QACxD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,YAAY,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,EAAE,CAAC;QACxC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,cAAc,CAAA;AAC1D,CAAC"}