@ricsam/isolate-fetch 0.1.16 → 0.1.18
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/dist/cjs/consistency/origins.cjs +19 -9
- package/dist/cjs/consistency/origins.cjs.map +2 -2
- package/dist/cjs/index.cjs +93 -15
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/stream-state.cjs +19 -9
- package/dist/cjs/stream-state.cjs.map +2 -2
- package/dist/mjs/index.mjs +63 -6
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/index.d.ts +2 -0
- package/package.json +2 -3
|
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
6
8
|
var __toCommonJS = (from) => {
|
|
7
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
8
10
|
if (entry)
|
|
9
11
|
return entry;
|
|
10
12
|
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
16
21
|
__moduleCache.set(from, entry);
|
|
17
22
|
return entry;
|
|
18
23
|
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
19
29
|
var __export = (target, all) => {
|
|
20
30
|
for (var name in all)
|
|
21
31
|
__defProp(target, name, {
|
|
22
32
|
get: all[name],
|
|
23
33
|
enumerable: true,
|
|
24
34
|
configurable: true,
|
|
25
|
-
set: (
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
26
36
|
});
|
|
27
37
|
};
|
|
28
38
|
|
|
@@ -515,4 +525,4 @@ async function getAbortSignalFromOrigin(ctx, _origin) {
|
|
|
515
525
|
`);
|
|
516
526
|
}
|
|
517
527
|
|
|
518
|
-
//# debugId=
|
|
528
|
+
//# debugId=274AB1900A4AAC4364756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Helper functions for creating web objects from different origins.\n * Used to test that objects behave identically regardless of how they were created.\n *\n * Note: The `customFunction` origin is tested where supported. For Response and Request,\n * this requires constructing the object in the isolate using parameters passed from\n * a host custom function, since native objects cannot be serialized across the boundary.\n */\n\nimport { createRuntime, type RuntimeHandle } from \"@ricsam/isolate-runtime\";\nimport { clearAllInstanceState } from \"@ricsam/isolate-core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ResponseOrigin =\n | \"direct\"\n | \"customFunction\"\n | \"fetchCallback\";\n\nexport type RequestOrigin =\n | \"direct\"\n | \"customFunction\"\n | \"serveRequest\";\n\nexport type HeadersOrigin = \"direct\" | \"fromResponse\" | \"fromRequest\";\n\n// Blob and File don't have special marshalling support for custom functions\nexport type BlobOrigin = \"direct\";\n\nexport type FileOrigin = \"direct\";\n\n// URL has special marshalling via URLRef (only href stored)\nexport type URLOrigin = \"direct\" | \"customFunction\";\n\n// URLSearchParams can come from direct construction or from URL.searchParams\nexport type URLSearchParamsOrigin = \"direct\" | \"fromURL\" | \"fromCustomFunctionURL\";\n\n// FormData doesn't have special marshalling support for custom functions\nexport type FormDataOrigin = \"direct\" | \"fromResponse\";\n\n// Stream origins\nexport type ReadableStreamOrigin =\n | \"direct\" // new ReadableStream() in isolate\n | \"responseBody\" // response.body from fetch callback\n | \"blobStream\" // blob.stream()\n | \"transformReadable\"; // transformStream.readable\n\nexport type WritableStreamOrigin =\n | \"direct\" // new WritableStream() in isolate\n | \"transformWritable\"; // transformStream.writable\n\nexport type TransformStreamOrigin = \"direct\";\nexport type TextEncoderStreamOrigin = \"direct\";\nexport type TextDecoderStreamOrigin = \"direct\";\nexport type QueuingStrategyOrigin = \"direct\";\n\nexport const RESPONSE_ORIGINS: ResponseOrigin[] = [\n \"direct\",\n \"customFunction\",\n \"fetchCallback\",\n];\n\nexport const REQUEST_ORIGINS: RequestOrigin[] = [\n \"direct\",\n \"customFunction\",\n \"serveRequest\",\n];\n\nexport const HEADERS_ORIGINS: HeadersOrigin[] = [\n \"direct\",\n \"fromResponse\",\n \"fromRequest\",\n];\n\nexport const BLOB_ORIGINS: BlobOrigin[] = [\"direct\"];\n\nexport const FILE_ORIGINS: FileOrigin[] = [\"direct\"];\n\nexport const URL_ORIGINS: URLOrigin[] = [\"direct\", \"customFunction\"];\n\nexport const URLSEARCHPARAMS_ORIGINS: URLSearchParamsOrigin[] = [\n \"direct\",\n \"fromURL\",\n \"fromCustomFunctionURL\",\n];\n\nexport const FORMDATA_ORIGINS: FormDataOrigin[] = [\n \"direct\",\n \"fromResponse\",\n];\n\nexport const READABLE_STREAM_ORIGINS: ReadableStreamOrigin[] = [\n \"direct\",\n \"responseBody\",\n \"blobStream\",\n \"transformReadable\",\n];\n\nexport const WRITABLE_STREAM_ORIGINS: WritableStreamOrigin[] = [\n \"direct\",\n \"transformWritable\",\n];\n\nexport const TRANSFORM_STREAM_ORIGINS: TransformStreamOrigin[] = [\"direct\"];\nexport const TEXT_ENCODER_STREAM_ORIGINS: TextEncoderStreamOrigin[] = [\"direct\"];\nexport const TEXT_DECODER_STREAM_ORIGINS: TextDecoderStreamOrigin[] = [\"direct\"];\nexport const QUEUING_STRATEGY_ORIGINS: QueuingStrategyOrigin[] = [\"direct\"];\n\n// AbortController/AbortSignal have NO marshalling support (no AbortRef type in codec)\n// They cannot be passed through custom functions - only direct instantiation in isolate\nexport type AbortControllerOrigin = \"direct\";\nexport type AbortSignalOrigin = \"direct\";\n\nexport const ABORT_CONTROLLER_ORIGINS: AbortControllerOrigin[] = [\"direct\"];\nexport const ABORT_SIGNAL_ORIGINS: AbortSignalOrigin[] = [\"direct\"];\n\n// ============================================================================\n// Test Context\n// ============================================================================\n\nexport interface ConsistencyTestContext {\n /** The runtime handle */\n runtime: RuntimeHandle;\n /** Execute code in the runtime */\n eval(code: string): Promise<void>;\n /** Dispatch an HTTP request to the serve() handler */\n dispatchRequest(request: Request): Promise<Response>;\n /** Set the mock response for the next fetch call */\n setMockResponse(response: MockResponse): void;\n /** Get a result from the isolate via setResult() */\n getResult<T = unknown>(): T | undefined;\n /** Clear the stored result */\n clearResult(): void;\n /** Dispose all resources */\n dispose(): Promise<void>;\n}\n\nexport interface MockResponse {\n status?: number;\n statusText?: string;\n body?: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Create a test context for consistency tests.\n * Provides helpers for creating objects from different origins.\n */\nexport async function createConsistencyTestContext(): Promise<ConsistencyTestContext> {\n // Clear any previous instance state\n clearAllInstanceState();\n\n let mockResponse: MockResponse = { status: 200, body: \"\" };\n let storedResult: unknown = undefined;\n\n // Pending parameters for custom function origins\n // These are stored on the host and retrieved by the isolate to construct objects\n let pendingResponseParams: { body: string; init: ResponseInit } | null = null;\n let pendingRequestParams: { url: string; init: RequestInit } | null = null;\n let pendingURL: URL | null = null;\n\n const runtime = await createRuntime({\n fetch: async () => {\n // Return mock response\n return new Response(mockResponse.body ?? \"\", {\n status: mockResponse.status ?? 200,\n statusText: mockResponse.statusText ?? \"\",\n headers: mockResponse.headers,\n });\n },\n customFunctions: {\n setResult: {\n fn: (value: unknown) => {\n storedResult = value;\n },\n type: \"sync\",\n },\n // For Response customFunction origin: store params, return them for isolate to construct\n __setResponseParams: {\n fn: (body: string, init: ResponseInit) => {\n pendingResponseParams = { body, init };\n },\n type: \"sync\",\n },\n __getResponseParams: {\n fn: () => {\n const params = pendingResponseParams;\n pendingResponseParams = null;\n return params;\n },\n type: \"sync\",\n },\n // For Request customFunction origin: store params, return them for isolate to construct\n __setRequestParams: {\n fn: (url: string, init: RequestInit) => {\n pendingRequestParams = { url, init };\n },\n type: \"sync\",\n },\n __getRequestParams: {\n fn: () => {\n const params = pendingRequestParams;\n pendingRequestParams = null;\n return params;\n },\n type: \"sync\",\n },\n // For URL customFunction origin: URL goes through marshal/unmarshal (URLRef)\n __setURL: {\n fn: (url: URL) => {\n pendingURL = url;\n },\n type: \"sync\",\n },\n __getURL: {\n fn: () => {\n const url = pendingURL;\n pendingURL = null;\n return url;\n },\n type: \"sync\",\n },\n },\n });\n\n return {\n runtime,\n eval: runtime.eval.bind(runtime),\n dispatchRequest: runtime.fetch.dispatchRequest.bind(runtime.fetch),\n setMockResponse(response: MockResponse) {\n mockResponse = response;\n },\n getResult<T = unknown>(): T | undefined {\n return storedResult as T | undefined;\n },\n clearResult() {\n storedResult = undefined;\n },\n async dispose() {\n await runtime.dispose();\n },\n };\n}\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\nexport interface ResponseOptions {\n status?: number;\n statusText?: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Create a Response in the isolate from the specified origin.\n * The Response is stored at globalThis.__testResponse.\n */\nexport async function getResponseFromOrigin(\n ctx: ConsistencyTestContext,\n origin: ResponseOrigin,\n body: string,\n options?: ResponseOptions\n): Promise<void> {\n const init = {\n status: options?.status ?? 200,\n statusText: options?.statusText ?? \"\",\n headers: options?.headers ?? {},\n };\n const initJson = JSON.stringify(init);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testResponse = new Response(${JSON.stringify(body)}, ${initJson});\n `);\n break;\n\n case \"customFunction\":\n // Store params on host, then retrieve and construct in isolate\n // This simulates getting data from a custom function and constructing a Response\n await ctx.eval(`\n __setResponseParams(${JSON.stringify(body)}, ${initJson});\n const params = __getResponseParams();\n globalThis.__testResponse = new Response(params.body, params.init);\n `);\n break;\n\n case \"fetchCallback\":\n ctx.setMockResponse({\n status: init.status,\n statusText: init.statusText,\n body,\n headers: init.headers,\n });\n await ctx.eval(`\n globalThis.__testResponse = await fetch(\"https://example.com/test\");\n `);\n break;\n }\n}\n\n// ============================================================================\n// Request Helpers\n// ============================================================================\n\nexport interface RequestOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n}\n\n/**\n * Create a Request in the isolate from the specified origin.\n * The Request is stored at globalThis.__testRequest.\n */\nexport async function getRequestFromOrigin(\n ctx: ConsistencyTestContext,\n origin: RequestOrigin,\n url: string,\n options?: RequestOptions\n): Promise<void> {\n const init: RequestInit = {\n method: options?.method ?? \"GET\",\n headers: options?.headers ?? {},\n };\n\n // Only add body for non-GET/HEAD requests\n if (options?.body && init.method !== \"GET\" && init.method !== \"HEAD\") {\n init.body = options.body;\n }\n\n const initJson = JSON.stringify(init);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testRequest = new Request(${JSON.stringify(url)}, ${initJson});\n `);\n break;\n\n case \"customFunction\":\n // Store params on host, then retrieve and construct in isolate\n // This simulates getting data from a custom function and constructing a Request\n await ctx.eval(`\n __setRequestParams(${JSON.stringify(url)}, ${initJson});\n const params = __getRequestParams();\n globalThis.__testRequest = new Request(params.url, params.init);\n `);\n break;\n\n case \"serveRequest\":\n // Setup serve handler that captures the request\n await ctx.eval(`\n serve({\n fetch(request) {\n globalThis.__testRequest = request;\n return new Response(\"ok\");\n }\n });\n `);\n\n // Dispatch a request from the host\n const request = new Request(url, init as RequestInit);\n await ctx.dispatchRequest(request);\n break;\n }\n}\n\n// ============================================================================\n// Headers Helpers\n// ============================================================================\n\n/**\n * Create Headers in the isolate from the specified origin.\n * The Headers is stored at globalThis.__testHeaders.\n */\nexport async function getHeadersFromOrigin(\n ctx: ConsistencyTestContext,\n origin: HeadersOrigin,\n init: Record<string, string>\n): Promise<void> {\n const initJson = JSON.stringify(init);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testHeaders = new Headers(${initJson});\n `);\n break;\n\n case \"fromResponse\":\n await ctx.eval(`\n const response = new Response(null, { headers: ${initJson} });\n globalThis.__testHeaders = response.headers;\n `);\n break;\n\n case \"fromRequest\":\n await ctx.eval(`\n const request = new Request(\"https://example.com\", { headers: ${initJson} });\n globalThis.__testHeaders = request.headers;\n `);\n break;\n }\n}\n\n// ============================================================================\n// Blob Helpers\n// ============================================================================\n\nexport interface BlobOptions {\n type?: string;\n}\n\n/**\n * Create a Blob in the isolate from the specified origin.\n * The Blob is stored at globalThis.__testBlob.\n */\nexport async function getBlobFromOrigin(\n ctx: ConsistencyTestContext,\n origin: BlobOrigin,\n content: string,\n options?: BlobOptions\n): Promise<void> {\n const blobOptions = { type: options?.type ?? \"\" };\n const optionsJson = JSON.stringify(blobOptions);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testBlob = new Blob([${JSON.stringify(content)}], ${optionsJson});\n `);\n break;\n }\n}\n\n// ============================================================================\n// File Helpers\n// ============================================================================\n\nexport interface FileOptions {\n type?: string;\n lastModified?: number;\n}\n\n/**\n * Create a File in the isolate from the specified origin.\n * The File is stored at globalThis.__testFile.\n */\nexport async function getFileFromOrigin(\n ctx: ConsistencyTestContext,\n origin: FileOrigin,\n content: string,\n filename: string,\n options?: FileOptions\n): Promise<void> {\n const fileOptions = {\n type: options?.type ?? \"\",\n lastModified: options?.lastModified ?? Date.now(),\n };\n const optionsJson = JSON.stringify(fileOptions);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testFile = new File([${JSON.stringify(content)}], ${JSON.stringify(filename)}, ${optionsJson});\n `);\n break;\n }\n}\n\n// ============================================================================\n// FormData Helpers\n// ============================================================================\n\n/**\n * Create FormData in the isolate from the specified origin.\n * The FormData is stored at globalThis.__testFormData.\n */\nexport async function getFormDataFromOrigin(\n ctx: ConsistencyTestContext,\n origin: FormDataOrigin,\n entries: Array<[string, string]>\n): Promise<void> {\n const entriesJson = JSON.stringify(entries);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testFormData = new FormData();\n for (const [key, value] of ${entriesJson}) {\n globalThis.__testFormData.append(key, value);\n }\n `);\n break;\n\n case \"fromResponse\":\n // Create a response with urlencoded body and parse it\n const params = entries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join(\"&\");\n await ctx.eval(`\n const response = new Response(${JSON.stringify(params)}, {\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" }\n });\n globalThis.__testFormData = await response.formData();\n `);\n break;\n }\n}\n\n// ============================================================================\n// Host-side helpers for dispatchResponse origin\n// ============================================================================\n\n/**\n * Setup a serve handler that returns the specified response.\n */\nexport async function setupServeHandler(\n ctx: ConsistencyTestContext,\n body: string,\n options?: ResponseOptions\n): Promise<void> {\n const init = {\n status: options?.status ?? 200,\n statusText: options?.statusText ?? \"\",\n headers: options?.headers ?? {},\n };\n const initJson = JSON.stringify(init);\n\n await ctx.eval(`\n serve({\n fetch(request) {\n return new Response(${JSON.stringify(body)}, ${initJson});\n }\n });\n `);\n}\n\n/**\n * Dispatch a request and get the Response on the host side.\n * This tests the host-side conversion of Response from isolate.\n */\nexport async function getDispatchResponse(\n ctx: ConsistencyTestContext,\n body: string,\n options?: ResponseOptions\n): Promise<Response> {\n await setupServeHandler(ctx, body, options);\n return ctx.dispatchRequest(new Request(\"https://example.com/test\"));\n}\n\n// ============================================================================\n// ReadableStream Helpers\n// ============================================================================\n\n/**\n * Create a ReadableStream in the isolate from the specified origin.\n * The ReadableStream is stored at globalThis.__testReadableStream.\n */\nexport async function getReadableStreamFromOrigin(\n ctx: ConsistencyTestContext,\n origin: ReadableStreamOrigin,\n chunks: string[] = [\"chunk1\", \"chunk2\"]\n): Promise<void> {\n const chunksJson = JSON.stringify(chunks);\n\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n const chunks = ${chunksJson};\n let index = 0;\n globalThis.__testReadableStream = new ReadableStream({\n pull(controller) {\n if (index < chunks.length) {\n controller.enqueue(new TextEncoder().encode(chunks[index++]));\n } else {\n controller.close();\n }\n }\n });\n `);\n break;\n\n case \"responseBody\":\n ctx.setMockResponse({\n status: 200,\n body: chunks.join(\"\"),\n });\n await ctx.eval(`\n const response = await fetch(\"https://example.com/test\");\n globalThis.__testReadableStream = response.body;\n `);\n break;\n\n case \"blobStream\":\n await ctx.eval(`\n const chunks = ${chunksJson};\n const blob = new Blob(chunks);\n globalThis.__testReadableStream = blob.stream();\n `);\n break;\n\n case \"transformReadable\":\n await ctx.eval(`\n const transform = new TransformStream();\n globalThis.__testReadableStream = transform.readable;\n // Write chunks to writable side and close it\n const writer = transform.writable.getWriter();\n const chunks = ${chunksJson};\n (async () => {\n for (const chunk of chunks) {\n await writer.write(new TextEncoder().encode(chunk));\n }\n await writer.close();\n })();\n `);\n break;\n }\n}\n\n// ============================================================================\n// WritableStream Helpers\n// ============================================================================\n\n/**\n * Create a WritableStream in the isolate from the specified origin.\n * The WritableStream is stored at globalThis.__testWritableStream.\n * Also stores written chunks at globalThis.__testWrittenChunks.\n */\nexport async function getWritableStreamFromOrigin(\n ctx: ConsistencyTestContext,\n origin: WritableStreamOrigin\n): Promise<void> {\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testWrittenChunks = [];\n globalThis.__testWritableStream = new WritableStream({\n write(chunk) {\n globalThis.__testWrittenChunks.push(chunk);\n }\n });\n `);\n break;\n\n case \"transformWritable\":\n await ctx.eval(`\n globalThis.__testWrittenChunks = [];\n const transform = new TransformStream({\n transform(chunk, controller) {\n globalThis.__testWrittenChunks.push(chunk);\n controller.enqueue(chunk);\n }\n });\n globalThis.__testWritableStream = transform.writable;\n // Start reading to allow writes to complete\n const reader = transform.readable.getReader();\n (async () => {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n })();\n `);\n break;\n }\n}\n\n// ============================================================================\n// TransformStream Helpers\n// ============================================================================\n\n/**\n * Create a TransformStream in the isolate from the specified origin.\n * The TransformStream is stored at globalThis.__testTransformStream.\n */\nexport async function getTransformStreamFromOrigin(\n ctx: ConsistencyTestContext,\n _origin: TransformStreamOrigin\n): Promise<void> {\n await ctx.eval(`\n globalThis.__testTransformStream = new TransformStream();\n `);\n}\n\n// ============================================================================\n// TextEncoderStream Helpers\n// ============================================================================\n\n/**\n * Create a TextEncoderStream in the isolate from the specified origin.\n * The TextEncoderStream is stored at globalThis.__testTextEncoderStream.\n */\nexport async function getTextEncoderStreamFromOrigin(\n ctx: ConsistencyTestContext,\n _origin: TextEncoderStreamOrigin\n): Promise<void> {\n await ctx.eval(`\n globalThis.__testTextEncoderStream = new TextEncoderStream();\n `);\n}\n\n// ============================================================================\n// TextDecoderStream Helpers\n// ============================================================================\n\nexport interface TextDecoderStreamOptions {\n fatal?: boolean;\n ignoreBOM?: boolean;\n}\n\n/**\n * Create a TextDecoderStream in the isolate from the specified origin.\n * The TextDecoderStream is stored at globalThis.__testTextDecoderStream.\n */\nexport async function getTextDecoderStreamFromOrigin(\n ctx: ConsistencyTestContext,\n _origin: TextDecoderStreamOrigin,\n options?: TextDecoderStreamOptions\n): Promise<void> {\n const optionsJson = JSON.stringify(options ?? {});\n await ctx.eval(`\n globalThis.__testTextDecoderStream = new TextDecoderStream(\"utf-8\", ${optionsJson});\n `);\n}\n\n// ============================================================================\n// QueuingStrategy Helpers\n// ============================================================================\n\n/**\n * Create a ByteLengthQueuingStrategy or CountQueuingStrategy in the isolate.\n * The strategy is stored at globalThis.__testQueuingStrategy.\n */\nexport async function getQueuingStrategyFromOrigin(\n ctx: ConsistencyTestContext,\n strategyType: \"ByteLength\" | \"Count\",\n highWaterMark: number = 1\n): Promise<void> {\n if (strategyType === \"ByteLength\") {\n await ctx.eval(`\n globalThis.__testQueuingStrategy = new ByteLengthQueuingStrategy({ highWaterMark: ${highWaterMark} });\n `);\n } else {\n await ctx.eval(`\n globalThis.__testQueuingStrategy = new CountQueuingStrategy({ highWaterMark: ${highWaterMark} });\n `);\n }\n}\n\n// ============================================================================\n// URL Helpers\n// ============================================================================\n\n/**\n * Create a URL in the isolate from the specified origin.\n * The URL is stored at globalThis.__testURL.\n */\nexport async function getURLFromOrigin(\n ctx: ConsistencyTestContext,\n origin: URLOrigin,\n urlString: string\n): Promise<void> {\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testURL = new URL(${JSON.stringify(urlString)});\n `);\n break;\n\n case \"customFunction\":\n // URL goes through marshal/unmarshal (URLRef)\n await ctx.eval(`\n __setURL(new URL(${JSON.stringify(urlString)}));\n globalThis.__testURL = __getURL();\n `);\n break;\n }\n}\n\n// ============================================================================\n// URLSearchParams Helpers\n// ============================================================================\n\n/**\n * Create URLSearchParams in the isolate from the specified origin.\n * The URLSearchParams is stored at globalThis.__testURLSearchParams.\n */\nexport async function getURLSearchParamsFromOrigin(\n ctx: ConsistencyTestContext,\n origin: URLSearchParamsOrigin,\n init: string = \"\"\n): Promise<void> {\n switch (origin) {\n case \"direct\":\n await ctx.eval(`\n globalThis.__testURLSearchParams = new URLSearchParams(${JSON.stringify(init)});\n `);\n break;\n\n case \"fromURL\":\n await ctx.eval(`\n const url = new URL(\"https://example.com?\" + ${JSON.stringify(init)});\n globalThis.__testURLSearchParams = url.searchParams;\n `);\n break;\n\n case \"fromCustomFunctionURL\":\n // URL comes through boundary, then get searchParams\n await ctx.eval(`\n __setURL(new URL(\"https://example.com?\" + ${JSON.stringify(init)}));\n const url = __getURL();\n globalThis.__testURLSearchParams = url.searchParams;\n `);\n break;\n }\n}\n\n// ============================================================================\n// AbortController Helpers\n// ============================================================================\n\n/**\n * Create an AbortController in the isolate from the specified origin.\n * The AbortController is stored at globalThis.__testAbortController.\n */\nexport async function getAbortControllerFromOrigin(\n ctx: ConsistencyTestContext,\n _origin: AbortControllerOrigin\n): Promise<void> {\n await ctx.eval(`\n globalThis.__testAbortController = new AbortController();\n `);\n}\n\n// ============================================================================\n// AbortSignal Helpers\n// ============================================================================\n\n/**\n * Create an AbortSignal in the isolate from the specified origin.\n * The AbortSignal is stored at globalThis.__testAbortSignal.\n */\nexport async function getAbortSignalFromOrigin(\n ctx: ConsistencyTestContext,\n _origin: AbortSignalOrigin\n): Promise<void> {\n // AbortSignal is obtained from AbortController.signal\n await ctx.eval(`\n const controller = new AbortController();\n globalThis.__testAbortSignal = controller.signal;\n globalThis.__testAbortController = controller;\n `);\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASkD,IAAlD;AACsC,IAAtC;AAgDO,IAAM,mBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,eAA6B,CAAC,QAAQ;AAE5C,IAAM,eAA6B,CAAC,QAAQ;AAE5C,IAAM,cAA2B,CAAC,UAAU,gBAAgB;AAE5D,IAAM,0BAAmD;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mBAAqC;AAAA,EAChD;AAAA,EACA;AACF;AAEO,IAAM,0BAAkD;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,0BAAkD;AAAA,EAC7D;AAAA,EACA;AACF;AAEO,IAAM,2BAAoD,CAAC,QAAQ;AACnE,IAAM,8BAAyD,CAAC,QAAQ;AACxE,IAAM,8BAAyD,CAAC,QAAQ;AACxE,IAAM,2BAAoD,CAAC,QAAQ;AAOnE,IAAM,2BAAoD,CAAC,QAAQ;AACnE,IAAM,uBAA4C,CAAC,QAAQ;AAkClE,eAAsB,4BAA4B,GAAoC;AAAA,EAEpF,0CAAsB;AAAA,EAEtB,IAAI,eAA6B,EAAE,QAAQ,KAAK,MAAM,GAAG;AAAA,EACzD,IAAI,eAAwB;AAAA,EAI5B,IAAI,wBAAqE;AAAA,EACzE,IAAI,uBAAkE;AAAA,EACtE,IAAI,aAAyB;AAAA,EAE7B,MAAM,UAAU,MAAM,qCAAc;AAAA,IAClC,OAAO,YAAY;AAAA,MAEjB,OAAO,IAAI,SAAS,aAAa,QAAQ,IAAI;AAAA,QAC3C,QAAQ,aAAa,UAAU;AAAA,QAC/B,YAAY,aAAa,cAAc;AAAA,QACvC,SAAS,aAAa;AAAA,MACxB,CAAC;AAAA;AAAA,IAEH,iBAAiB;AAAA,MACf,WAAW;AAAA,QACT,IAAI,CAAC,UAAmB;AAAA,UACtB,eAAe;AAAA;AAAA,QAEjB,MAAM;AAAA,MACR;AAAA,MAEA,qBAAqB;AAAA,QACnB,IAAI,CAAC,MAAc,SAAuB;AAAA,UACxC,wBAAwB,EAAE,MAAM,KAAK;AAAA;AAAA,QAEvC,MAAM;AAAA,MACR;AAAA,MACA,qBAAqB;AAAA,QACnB,IAAI,MAAM;AAAA,UACR,MAAM,SAAS;AAAA,UACf,wBAAwB;AAAA,UACxB,OAAO;AAAA;AAAA,QAET,MAAM;AAAA,MACR;AAAA,MAEA,oBAAoB;AAAA,QAClB,IAAI,CAAC,KAAa,SAAsB;AAAA,UACtC,uBAAuB,EAAE,KAAK,KAAK;AAAA;AAAA,QAErC,MAAM;AAAA,MACR;AAAA,MACA,oBAAoB;AAAA,QAClB,IAAI,MAAM;AAAA,UACR,MAAM,SAAS;AAAA,UACf,uBAAuB;AAAA,UACvB,OAAO;AAAA;AAAA,QAET,MAAM;AAAA,MACR;AAAA,MAEA,UAAU;AAAA,QACR,IAAI,CAAC,QAAa;AAAA,UAChB,aAAa;AAAA;AAAA,QAEf,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,IAAI,MAAM;AAAA,UACR,MAAM,MAAM;AAAA,UACZ,aAAa;AAAA,UACb,OAAO;AAAA;AAAA,QAET,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,OAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,KAAK,KAAK,OAAO;AAAA,IAC/B,iBAAiB,QAAQ,MAAM,gBAAgB,KAAK,QAAQ,KAAK;AAAA,IACjE,eAAe,CAAC,UAAwB;AAAA,MACtC,eAAe;AAAA;AAAA,IAEjB,SAAsB,GAAkB;AAAA,MACtC,OAAO;AAAA;AAAA,IAET,WAAW,GAAG;AAAA,MACZ,eAAe;AAAA;AAAA,SAEX,QAAO,GAAG;AAAA,MACd,MAAM,QAAQ,QAAQ;AAAA;AAAA,EAE1B;AAAA;AAiBF,eAAsB,qBAAqB,CACzC,KACA,QACA,MACA,SACe;AAAA,EACf,MAAM,OAAO;AAAA,IACX,QAAQ,SAAS,UAAU;AAAA,IAC3B,YAAY,SAAS,cAAc;AAAA,IACnC,SAAS,SAAS,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,MAAM,WAAW,KAAK,UAAU,IAAI;AAAA,EAEpC,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,mDAC8B,KAAK,UAAU,IAAI,MAAM;AAAA,OACrE;AAAA,MACD;AAAA,SAEG;AAAA,MAGH,MAAM,IAAI,KAAK;AAAA,8BACS,KAAK,UAAU,IAAI,MAAM;AAAA;AAAA;AAAA,OAGhD;AAAA,MACD;AAAA,SAEG;AAAA,MACH,IAAI,gBAAgB;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB;AAAA,QACA,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,MAAM,IAAI,KAAK;AAAA;AAAA,OAEd;AAAA,MACD;AAAA;AAAA;AAkBN,eAAsB,oBAAoB,CACxC,KACA,QACA,KACA,SACe;AAAA,EACf,MAAM,OAAoB;AAAA,IACxB,QAAQ,SAAS,UAAU;AAAA,IAC3B,SAAS,SAAS,WAAW,CAAC;AAAA,EAChC;AAAA,EAGA,IAAI,SAAS,QAAQ,KAAK,WAAW,SAAS,KAAK,WAAW,QAAQ;AAAA,IACpE,KAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,WAAW,KAAK,UAAU,IAAI;AAAA,EAEpC,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,iDAC4B,KAAK,UAAU,GAAG,MAAM;AAAA,OAClE;AAAA,MACD;AAAA,SAEG;AAAA,MAGH,MAAM,IAAI,KAAK;AAAA,6BACQ,KAAK,UAAU,GAAG,MAAM;AAAA;AAAA;AAAA,OAG9C;AAAA,MACD;AAAA,SAEG;AAAA,MAEH,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOd;AAAA,MAGD,MAAM,UAAU,IAAI,QAAQ,KAAK,IAAmB;AAAA,MACpD,MAAM,IAAI,gBAAgB,OAAO;AAAA,MACjC;AAAA;AAAA;AAYN,eAAsB,oBAAoB,CACxC,KACA,QACA,MACe;AAAA,EACf,MAAM,WAAW,KAAK,UAAU,IAAI;AAAA,EAEpC,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,iDAC4B;AAAA,OAC1C;AAAA,MACD;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,yDACoC;AAAA;AAAA,OAElD;AAAA,MACD;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,wEACmD;AAAA;AAAA,OAEjE;AAAA,MACD;AAAA;AAAA;AAgBN,eAAsB,iBAAiB,CACrC,KACA,QACA,SACA,SACe;AAAA,EACf,MAAM,cAAc,EAAE,MAAM,SAAS,QAAQ,GAAG;AAAA,EAChD,MAAM,cAAc,KAAK,UAAU,WAAW;AAAA,EAE9C,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,4CACuB,KAAK,UAAU,OAAO,OAAO;AAAA,OAClE;AAAA,MACD;AAAA;AAAA;AAiBN,eAAsB,iBAAiB,CACrC,KACA,QACA,SACA,UACA,SACe;AAAA,EACf,MAAM,cAAc;AAAA,IAClB,MAAM,SAAS,QAAQ;AAAA,IACvB,cAAc,SAAS,gBAAgB,KAAK,IAAI;AAAA,EAClD;AAAA,EACA,MAAM,cAAc,KAAK,UAAU,WAAW;AAAA,EAE9C,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,4CACuB,KAAK,UAAU,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM;AAAA,OAC/F;AAAA,MACD;AAAA;AAAA;AAYN,eAAsB,qBAAqB,CACzC,KACA,QACA,SACe;AAAA,EACf,MAAM,cAAc,KAAK,UAAU,OAAO;AAAA,EAE1C,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA;AAAA,qCAEgB;AAAA;AAAA;AAAA,OAG9B;AAAA,MACD;AAAA,SAEG;AAAA,MAEH,MAAM,SAAS,QAAQ,IAAI,EAAE,GAAG,OAAO,GAAG,mBAAmB,CAAC,KAAK,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG;AAAA,MACpG,MAAM,IAAI,KAAK;AAAA,wCACmB,KAAK,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA,OAItD;AAAA,MACD;AAAA;AAAA;AAWN,eAAsB,iBAAiB,CACrC,KACA,MACA,SACe;AAAA,EACf,MAAM,OAAO;AAAA,IACX,QAAQ,SAAS,UAAU;AAAA,IAC3B,YAAY,SAAS,cAAc;AAAA,IACnC,SAAS,SAAS,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,MAAM,WAAW,KAAK,UAAU,IAAI;AAAA,EAEpC,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA,8BAGa,KAAK,UAAU,IAAI,MAAM;AAAA;AAAA;AAAA,GAGpD;AAAA;AAOH,eAAsB,mBAAmB,CACvC,KACA,MACA,SACmB;AAAA,EACnB,MAAM,kBAAkB,KAAK,MAAM,OAAO;AAAA,EAC1C,OAAO,IAAI,gBAAgB,IAAI,QAAQ,0BAA0B,CAAC;AAAA;AAWpE,eAAsB,2BAA2B,CAC/C,KACA,QACA,SAAmB,CAAC,UAAU,QAAQ,GACvB;AAAA,EACf,MAAM,aAAa,KAAK,UAAU,MAAM;AAAA,EAExC,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,yBACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWlB;AAAA,MACD;AAAA,SAEG;AAAA,MACH,IAAI,gBAAgB;AAAA,QAClB,QAAQ;AAAA,QACR,MAAM,OAAO,KAAK,EAAE;AAAA,MACtB,CAAC;AAAA,MACD,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA,OAGd;AAAA,MACD;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,yBACI;AAAA;AAAA;AAAA,OAGlB;AAAA,MACD;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOlB;AAAA,MACD;AAAA;AAAA;AAaN,eAAsB,2BAA2B,CAC/C,KACA,QACe;AAAA,EACf,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOd;AAAA,MACD;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAiBd;AAAA,MACD;AAAA;AAAA;AAYN,eAAsB,4BAA4B,CAChD,KACA,SACe;AAAA,EACf,MAAM,IAAI,KAAK;AAAA;AAAA,GAEd;AAAA;AAWH,eAAsB,8BAA8B,CAClD,KACA,SACe;AAAA,EACf,MAAM,IAAI,KAAK;AAAA;AAAA,GAEd;AAAA;AAgBH,eAAsB,8BAA8B,CAClD,KACA,SACA,SACe;AAAA,EACf,MAAM,cAAc,KAAK,UAAU,WAAW,CAAC,CAAC;AAAA,EAChD,MAAM,IAAI,KAAK;AAAA,0EACyD;AAAA,GACvE;AAAA;AAWH,eAAsB,4BAA4B,CAChD,KACA,cACA,gBAAwB,GACT;AAAA,EACf,IAAI,iBAAiB,cAAc;AAAA,IACjC,MAAM,IAAI,KAAK;AAAA,0FACuE;AAAA,KACrF;AAAA,EACH,EAAO;AAAA,IACL,MAAM,IAAI,KAAK;AAAA,qFACkE;AAAA,KAChF;AAAA;AAAA;AAYL,eAAsB,gBAAgB,CACpC,KACA,QACA,WACe;AAAA,EACf,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,yCACoB,KAAK,UAAU,SAAS;AAAA,OAC1D;AAAA,MACD;AAAA,SAEG;AAAA,MAEH,MAAM,IAAI,KAAK;AAAA,2BACM,KAAK,UAAU,SAAS;AAAA;AAAA,OAE5C;AAAA,MACD;AAAA;AAAA;AAYN,eAAsB,4BAA4B,CAChD,KACA,QACA,OAAe,IACA;AAAA,EACf,QAAQ;AAAA,SACD;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,iEAC4C,KAAK,UAAU,IAAI;AAAA,OAC7E;AAAA,MACD;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,KAAK;AAAA,uDACkC,KAAK,UAAU,IAAI;AAAA;AAAA,OAEnE;AAAA,MACD;AAAA,SAEG;AAAA,MAEH,MAAM,IAAI,KAAK;AAAA,oDAC+B,KAAK,UAAU,IAAI;AAAA;AAAA;AAAA,OAGhE;AAAA,MACD;AAAA;AAAA;AAYN,eAAsB,4BAA4B,CAChD,KACA,SACe;AAAA,EACf,MAAM,IAAI,KAAK;AAAA;AAAA,GAEd;AAAA;AAWH,eAAsB,wBAAwB,CAC5C,KACA,SACe;AAAA,EAEf,MAAM,IAAI,KAAK;AAAA;AAAA;AAAA;AAAA,GAId;AAAA;",
|
|
8
|
+
"debugId": "274AB1900A4AAC4364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -4,38 +4,59 @@ var __defProp = Object.defineProperty;
|
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
7
12
|
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
8
20
|
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
21
|
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
22
|
for (let key of __getOwnPropNames(mod))
|
|
11
23
|
if (!__hasOwnProp.call(to, key))
|
|
12
24
|
__defProp(to, key, {
|
|
13
|
-
get: (
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
14
26
|
enumerable: true
|
|
15
27
|
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
16
30
|
return to;
|
|
17
31
|
};
|
|
18
|
-
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
19
32
|
var __toCommonJS = (from) => {
|
|
20
|
-
var entry = __moduleCache.get(from), desc;
|
|
33
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
21
34
|
if (entry)
|
|
22
35
|
return entry;
|
|
23
36
|
entry = __defProp({}, "__esModule", { value: true });
|
|
24
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
38
|
+
for (var key of __getOwnPropNames(from))
|
|
39
|
+
if (!__hasOwnProp.call(entry, key))
|
|
40
|
+
__defProp(entry, key, {
|
|
41
|
+
get: __accessProp.bind(from, key),
|
|
42
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
43
|
+
});
|
|
44
|
+
}
|
|
29
45
|
__moduleCache.set(from, entry);
|
|
30
46
|
return entry;
|
|
31
47
|
};
|
|
48
|
+
var __moduleCache;
|
|
49
|
+
var __returnValue = (v) => v;
|
|
50
|
+
function __exportSetter(name, newValue) {
|
|
51
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
52
|
+
}
|
|
32
53
|
var __export = (target, all) => {
|
|
33
54
|
for (var name in all)
|
|
34
55
|
__defProp(target, name, {
|
|
35
56
|
get: all[name],
|
|
36
57
|
enumerable: true,
|
|
37
58
|
configurable: true,
|
|
38
|
-
set: (
|
|
59
|
+
set: __exportSetter.bind(all, name)
|
|
39
60
|
});
|
|
40
61
|
};
|
|
41
62
|
|
|
@@ -1063,6 +1084,7 @@ function setupRequest(context, stateMap) {
|
|
|
1063
1084
|
body,
|
|
1064
1085
|
bodyUsed: false,
|
|
1065
1086
|
streamId: null,
|
|
1087
|
+
signalAborted: false,
|
|
1066
1088
|
mode,
|
|
1067
1089
|
credentials,
|
|
1068
1090
|
cache,
|
|
@@ -1159,6 +1181,10 @@ function setupRequest(context, stateMap) {
|
|
|
1159
1181
|
const state = stateMap.get(instanceId);
|
|
1160
1182
|
return state?.streamId ?? null;
|
|
1161
1183
|
}));
|
|
1184
|
+
global.setSync("__Request_get_signalAborted", new import_isolated_vm.default.Callback((instanceId) => {
|
|
1185
|
+
const state = stateMap.get(instanceId);
|
|
1186
|
+
return state?.signalAborted ?? false;
|
|
1187
|
+
}));
|
|
1162
1188
|
const requestCode = `
|
|
1163
1189
|
(function() {
|
|
1164
1190
|
function __decodeError(err) {
|
|
@@ -1222,6 +1248,8 @@ function setupRequest(context, stateMap) {
|
|
|
1222
1248
|
return result;
|
|
1223
1249
|
}
|
|
1224
1250
|
|
|
1251
|
+
const __requestSignalControllers = new Map();
|
|
1252
|
+
|
|
1225
1253
|
class Request {
|
|
1226
1254
|
#instanceId;
|
|
1227
1255
|
#headers;
|
|
@@ -1232,9 +1260,15 @@ function setupRequest(context, stateMap) {
|
|
|
1232
1260
|
constructor(input, init = {}) {
|
|
1233
1261
|
// Handle internal construction from instance ID
|
|
1234
1262
|
if (typeof input === 'number' && init === null) {
|
|
1263
|
+
const controller = new AbortController();
|
|
1264
|
+
if (__Request_get_signalAborted(input)) {
|
|
1265
|
+
controller.abort();
|
|
1266
|
+
}
|
|
1267
|
+
__requestSignalControllers.set(input, controller);
|
|
1268
|
+
|
|
1235
1269
|
this.#instanceId = input;
|
|
1236
1270
|
this.#headers = new Headers(__Request_get_headers(input));
|
|
1237
|
-
this.#signal =
|
|
1271
|
+
this.#signal = controller.signal;
|
|
1238
1272
|
this.#streamId = __Request_getStreamId(input);
|
|
1239
1273
|
return;
|
|
1240
1274
|
}
|
|
@@ -1243,7 +1277,7 @@ function setupRequest(context, stateMap) {
|
|
|
1243
1277
|
let method = 'GET';
|
|
1244
1278
|
let headers;
|
|
1245
1279
|
let body = null;
|
|
1246
|
-
let signal =
|
|
1280
|
+
let signal = new AbortController().signal;
|
|
1247
1281
|
let mode = 'cors';
|
|
1248
1282
|
let credentials = 'same-origin';
|
|
1249
1283
|
let cache = 'default';
|
|
@@ -1280,6 +1314,11 @@ function setupRequest(context, stateMap) {
|
|
|
1280
1314
|
if (init.referrer !== undefined) referrer = init.referrer;
|
|
1281
1315
|
if (init.integrity !== undefined) integrity = init.integrity;
|
|
1282
1316
|
|
|
1317
|
+
// Ensure signal is always a valid AbortSignal
|
|
1318
|
+
if (signal == null) {
|
|
1319
|
+
signal = new AbortController().signal;
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1283
1322
|
// Validate: body with GET/HEAD
|
|
1284
1323
|
if (body !== null && (method === 'GET' || method === 'HEAD')) {
|
|
1285
1324
|
throw new TypeError('Request with GET/HEAD method cannot have body');
|
|
@@ -1473,10 +1512,18 @@ function setupRequest(context, stateMap) {
|
|
|
1473
1512
|
}
|
|
1474
1513
|
}
|
|
1475
1514
|
|
|
1515
|
+
globalThis.__Request_abortSignalByInstanceId = function(instanceId) {
|
|
1516
|
+
const controller = __requestSignalControllers.get(instanceId);
|
|
1517
|
+
if (controller && !controller.signal.aborted) {
|
|
1518
|
+
controller.abort();
|
|
1519
|
+
}
|
|
1520
|
+
};
|
|
1521
|
+
|
|
1476
1522
|
globalThis.Request = Request;
|
|
1477
1523
|
})();
|
|
1478
1524
|
`;
|
|
1479
1525
|
context.evalSync(requestCode);
|
|
1526
|
+
return context.evalSync("globalThis.__Request_abortSignalByInstanceId", { reference: true });
|
|
1480
1527
|
}
|
|
1481
1528
|
var FETCH_STREAM_THRESHOLD = 64 * 1024;
|
|
1482
1529
|
function setupFetchFunction(context, stateMap, streamRegistry, options) {
|
|
@@ -2134,7 +2181,7 @@ async function setupFetch(context, options) {
|
|
|
2134
2181
|
setupStreamCallbacks(context, streamRegistry);
|
|
2135
2182
|
context.evalSync(hostBackedStreamCode);
|
|
2136
2183
|
setupResponse(context, stateMap, streamRegistry);
|
|
2137
|
-
setupRequest(context, stateMap);
|
|
2184
|
+
const requestAbortSignalRef = setupRequest(context, stateMap);
|
|
2138
2185
|
setupFetchFunction(context, stateMap, streamRegistry, options);
|
|
2139
2186
|
const serveState = {
|
|
2140
2187
|
pendingUpgrade: null,
|
|
@@ -2187,8 +2234,11 @@ async function setupFetch(context, options) {
|
|
|
2187
2234
|
context.evalSync(`globalThis.__upgradeRegistry__.clear()`);
|
|
2188
2235
|
serveState.activeConnections.clear();
|
|
2189
2236
|
serveState.pendingUpgrade = null;
|
|
2237
|
+
try {
|
|
2238
|
+
requestAbortSignalRef.release();
|
|
2239
|
+
} catch {}
|
|
2190
2240
|
},
|
|
2191
|
-
async dispatchRequest(request,
|
|
2241
|
+
async dispatchRequest(request, dispatchOptions) {
|
|
2192
2242
|
if (serveState.pendingUpgrade) {
|
|
2193
2243
|
const oldConnectionId = serveState.pendingUpgrade.connectionId;
|
|
2194
2244
|
context.evalSync(`globalThis.__upgradeRegistry__.delete("${oldConnectionId}")`);
|
|
@@ -2198,8 +2248,12 @@ async function setupFetch(context, options) {
|
|
|
2198
2248
|
if (!hasHandler) {
|
|
2199
2249
|
throw new Error("No serve() handler registered");
|
|
2200
2250
|
}
|
|
2251
|
+
const forwardedSignal = dispatchOptions?.signal ?? request.signal;
|
|
2252
|
+
const forwardedSignalInitiallyAborted = forwardedSignal?.aborted ?? false;
|
|
2201
2253
|
let requestStreamId = null;
|
|
2254
|
+
let requestInstanceId = null;
|
|
2202
2255
|
let streamCleanup = null;
|
|
2256
|
+
let onForwardedSignalAbort;
|
|
2203
2257
|
const canHaveBody = !["GET", "HEAD"].includes(request.method.toUpperCase());
|
|
2204
2258
|
if (canHaveBody && request.body) {
|
|
2205
2259
|
requestStreamId = streamRegistry.create();
|
|
@@ -2207,7 +2261,7 @@ async function setupFetch(context, options) {
|
|
|
2207
2261
|
}
|
|
2208
2262
|
try {
|
|
2209
2263
|
const headersArray = Array.from(request.headers.entries());
|
|
2210
|
-
|
|
2264
|
+
requestInstanceId = nextInstanceId++;
|
|
2211
2265
|
const requestState = {
|
|
2212
2266
|
url: request.url,
|
|
2213
2267
|
method: request.method,
|
|
@@ -2215,6 +2269,7 @@ async function setupFetch(context, options) {
|
|
|
2215
2269
|
body: null,
|
|
2216
2270
|
bodyUsed: false,
|
|
2217
2271
|
streamId: requestStreamId,
|
|
2272
|
+
signalAborted: forwardedSignalInitiallyAborted,
|
|
2218
2273
|
mode: request.mode,
|
|
2219
2274
|
credentials: request.credentials,
|
|
2220
2275
|
cache: request.cache,
|
|
@@ -2223,6 +2278,26 @@ async function setupFetch(context, options) {
|
|
|
2223
2278
|
integrity: request.integrity
|
|
2224
2279
|
};
|
|
2225
2280
|
stateMap.set(requestInstanceId, requestState);
|
|
2281
|
+
if (forwardedSignal && !forwardedSignalInitiallyAborted) {
|
|
2282
|
+
onForwardedSignalAbort = () => {
|
|
2283
|
+
if (requestInstanceId == null)
|
|
2284
|
+
return;
|
|
2285
|
+
const currentState = stateMap.get(requestInstanceId);
|
|
2286
|
+
if (!currentState || currentState.signalAborted) {
|
|
2287
|
+
return;
|
|
2288
|
+
}
|
|
2289
|
+
currentState.signalAborted = true;
|
|
2290
|
+
try {
|
|
2291
|
+
requestAbortSignalRef.applyIgnored(undefined, [requestInstanceId], {
|
|
2292
|
+
arguments: { copy: true }
|
|
2293
|
+
});
|
|
2294
|
+
} catch {}
|
|
2295
|
+
};
|
|
2296
|
+
forwardedSignal.addEventListener("abort", onForwardedSignalAbort, { once: true });
|
|
2297
|
+
if (forwardedSignal.aborted) {
|
|
2298
|
+
onForwardedSignalAbort();
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2226
2301
|
const responseInstanceId = await context.eval(`
|
|
2227
2302
|
(async function() {
|
|
2228
2303
|
const request = Request._fromInstanceId(${requestInstanceId});
|
|
@@ -2317,6 +2392,9 @@ async function setupFetch(context, options) {
|
|
|
2317
2392
|
response._originalStatus = responseState.status;
|
|
2318
2393
|
return response;
|
|
2319
2394
|
} finally {
|
|
2395
|
+
if (forwardedSignal && onForwardedSignalAbort) {
|
|
2396
|
+
forwardedSignal.removeEventListener("abort", onForwardedSignalAbort);
|
|
2397
|
+
}
|
|
2320
2398
|
if (requestStreamId !== null) {
|
|
2321
2399
|
const startTime = Date.now();
|
|
2322
2400
|
let streamState = streamRegistry.get(requestStreamId);
|
|
@@ -2499,4 +2577,4 @@ async function setupFetch(context, options) {
|
|
|
2499
2577
|
};
|
|
2500
2578
|
}
|
|
2501
2579
|
|
|
2502
|
-
//# debugId=
|
|
2580
|
+
//# debugId=9791957F393D36A464756E2164756E21
|