@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.
@@ -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
- var __moduleCache = /* @__PURE__ */ new WeakMap;
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
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
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: (newValue) => all[name] = () => newValue
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=E7A6B65128419FB164756E2164756E21
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": "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",
8
- "debugId": "E7A6B65128419FB164756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "274AB1900A4AAC4364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -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: () => mod[key],
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
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
26
- get: () => from[key],
27
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
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: (newValue) => all[name] = () => newValue
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 = null;
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 = null;
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, _dispatchOptions) {
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
- const requestInstanceId = nextInstanceId++;
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=A475F6C880EAF54E64756E2164756E21
2580
+ //# debugId=9791957F393D36A464756E2164756E21