@effect-native/fetch-hooks 0.0.1-placeholder → 0.0.2
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 +22 -0
- package/README.md +35 -0
- package/dist/binary-extractor.d.ts +9 -0
- package/dist/binary-extractor.d.ts.map +1 -0
- package/dist/binary-extractor.js +85 -0
- package/dist/binary-extractor.js.map +1 -0
- package/dist/cache-manager.d.ts +8 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +408 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/environment.d.ts +5 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +25 -0
- package/dist/environment.js.map +1 -0
- package/dist/filesystem-storage.d.ts +10 -0
- package/dist/filesystem-storage.d.ts.map +1 -0
- package/dist/filesystem-storage.js +112 -0
- package/dist/filesystem-storage.js.map +1 -0
- package/dist/flat-file-storage.d.ts +33 -0
- package/dist/flat-file-storage.d.ts.map +1 -0
- package/dist/flat-file-storage.js +153 -0
- package/dist/flat-file-storage.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -0
- package/dist/request-hasher.d.ts +5 -0
- package/dist/request-hasher.d.ts.map +1 -0
- package/dist/request-hasher.js +74 -0
- package/dist/request-hasher.js.map +1 -0
- package/dist/sse-handler.d.ts +9 -0
- package/dist/sse-handler.d.ts.map +1 -0
- package/dist/sse-handler.js +225 -0
- package/dist/sse-handler.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -3
- package/src/binary-extractor.ts +104 -0
- package/src/cache-manager.ts +499 -0
- package/src/environment.ts +27 -0
- package/src/filesystem-storage.ts +125 -0
- package/src/flat-file-storage.ts +170 -0
- package/src/index.ts +249 -0
- package/src/request-hasher.ts +86 -0
- package/src/sse-handler.ts +281 -0
- package/src/types.ts +140 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Effectful Technologies Inc (original work)
|
|
4
|
+
Copyright (c) 2025 effect-native contributors (modifications and packages-native/)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
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 @@
|
|
|
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"}
|