@ricsam/quickjs-fetch 0.2.16 → 0.2.17

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.
@@ -64,6 +64,19 @@ function createResponseClass(context, stateMap, createStream) {
64
64
  } else if (bodyInit instanceof Uint8Array) {
65
65
  body = bodyInit;
66
66
  bodyType = "binary";
67
+ } else if (import_quickjs_core.isDefineClassInstance(bodyInit) && (bodyInit.__className__ === "Blob" || bodyInit.__className__ === "File")) {
68
+ const blobState = import_quickjs_core.getClassInstanceState(bodyInit);
69
+ if (blobState && blobState.parts) {
70
+ const parts = blobState.parts;
71
+ const totalLength = parts.reduce((sum, p) => sum + p.length, 0);
72
+ body = new Uint8Array(totalLength);
73
+ let offset = 0;
74
+ for (const part of parts) {
75
+ body.set(part, offset);
76
+ offset += part.length;
77
+ }
78
+ bodyType = "binary";
79
+ }
67
80
  } else if (bodyInit && typeof bodyInit === "object" && "parts" in bodyInit) {
68
81
  const parts = bodyInit.parts;
69
82
  const totalLength = parts.reduce((sum, p) => sum + p.length, 0);
@@ -440,4 +453,4 @@ async function createResponseStateFromNative(response) {
440
453
  }
441
454
  })
442
455
 
443
- //# debugId=16A8FB178C927BA664756E2164756E21
456
+ //# debugId=3D4DF32D56708DFA64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/globals/response.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"@ricsam/quickjs-core\";\nimport {\n defineClass,\n isInstanceOf,\n isDefineClassInstance,\n coerceHeaders,\n coerceBody,\n} from \"@ricsam/quickjs-core\";\nimport type { ResponseState, HeadersState, FormDataState } from \"../types.cjs\";\nimport { isResponseState, isHeadersState } from \"../types.cjs\";\nimport { headersStateToNative } from \"./headers.cjs\";\nimport { parseMultipartFormData, parseUrlEncodedFormData } from \"./form-data.cjs\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\n/**\n * Create the Response class for QuickJS\n */\nexport function createResponseClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream?: StreamFactory\n): QuickJSHandle {\n const classHandle = defineClass<ResponseState>(context, stateMap, {\n name: \"Response\",\n construct: (args) => {\n const bodyInit = args[0];\n const init = args[1] as {\n status?: number;\n statusText?: string;\n headers?: object;\n _type?: string; // Internal: for Response.error() to set type\n } | undefined;\n\n let body: Uint8Array | null = null;\n let bodyType: \"string\" | \"binary\" | \"stream\" | null = null;\n let streamInstanceId: number | undefined = undefined;\n const status = init?.status ?? 200;\n const statusText = init?.statusText ?? \"\";\n let headersState: HeadersState = { headers: new Map() };\n\n // Parse body\n if (bodyInit !== null && bodyInit !== undefined) {\n if (typeof bodyInit === \"string\") {\n body = new TextEncoder().encode(bodyInit);\n bodyType = \"string\";\n } else if (bodyInit instanceof ArrayBuffer) {\n body = new Uint8Array(bodyInit);\n bodyType = \"binary\";\n } else if (bodyInit instanceof Uint8Array) {\n body = bodyInit;\n bodyType = \"binary\";\n } else if (\n bodyInit &&\n typeof bodyInit === \"object\" &&\n \"parts\" in bodyInit\n ) {\n // Blob-like\n const parts = (bodyInit as { parts: Uint8Array[] }).parts;\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n body = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n body.set(part, offset);\n offset += part.length;\n }\n bodyType = \"binary\";\n } else if (\n isDefineClassInstance(bodyInit) &&\n bodyInit.__className__ === \"ReadableStream\"\n ) {\n // ReadableStream body - don't buffer, store instance ID for later consumption\n body = null;\n bodyType = \"stream\";\n streamInstanceId = bodyInit.__instanceId__;\n }\n }\n\n // Parse headers using coercion\n if (init?.headers !== undefined) {\n const coerced = coerceHeaders.safeParse(init.headers);\n if (coerced.success) {\n headersState = coerced.value;\n }\n }\n\n return {\n status,\n statusText,\n headersState,\n body,\n bodyUsed: false,\n url: \"\",\n redirected: false,\n type: init?._type ?? \"default\",\n ok: status >= 200 && status < 300,\n bodyType,\n streamInstanceId,\n };\n },\n properties: {\n body: {\n get(this: ResponseState) {\n // Stream body - return null (stream is stored by instanceId)\n // dispatchRequest will handle stream extraction\n if (this.bodyType === \"stream\") {\n return null;\n }\n\n if (!this.body) return null;\n if (!createStream) {\n // Fallback: return raw body if no stream factory\n return this.body;\n }\n // Create a ReadableStream from the body data\n const bodyData = this.body;\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n return createStream({\n pull(controller) {\n if (offset >= bodyData.length) {\n controller.close();\n return;\n }\n const chunk = bodyData.slice(offset, Math.min(offset + chunkSize, bodyData.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n bodyUsed: {\n get(this: ResponseState) {\n return this.bodyUsed;\n },\n },\n // Note: headers getter is added via addResponseHeadersGetter() in setup.ts\n // to return a proper Headers instance instead of a plain object\n ok: {\n get(this: ResponseState) {\n return this.ok;\n },\n },\n redirected: {\n get(this: ResponseState) {\n return this.redirected;\n },\n },\n status: {\n get(this: ResponseState) {\n return this.status;\n },\n },\n statusText: {\n get(this: ResponseState) {\n return this.statusText;\n },\n },\n type: {\n get(this: ResponseState) {\n return this.type;\n },\n },\n url: {\n get(this: ResponseState) {\n return this.url;\n },\n },\n },\n methods: {\n async arrayBuffer(this: ResponseState): Promise<ArrayBuffer> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return new ArrayBuffer(0);\n }\n return this.body.buffer.slice(\n this.body.byteOffset,\n this.body.byteOffset + this.body.byteLength\n ) as ArrayBuffer;\n },\n async blob(this: ResponseState): Promise<object> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n const contentType =\n this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n return {\n parts: this.body ? [this.body] : [],\n type: contentType,\n size: this.body?.length || 0,\n };\n },\n /**\n * Private method that returns the cloned state as a serializable object.\n * Used by the clone() method added via evalCode (see addResponseCloneMethod).\n */\n __getClonedState__(this: ResponseState): {\n status: number;\n statusText: string;\n headers: Array<[string, string]>;\n body: number[] | null;\n url: string;\n redirected: boolean;\n type: string;\n ok: boolean;\n bodyType: \"string\" | \"binary\" | \"stream\" | null;\n } {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n if (this.bodyType === \"stream\") {\n throw new TypeError(\"Cannot clone Response with streaming body\");\n }\n\n // Convert headers to array of pairs for safe marshalling\n const headersArray: Array<[string, string]> = [];\n for (const [key, values] of this.headersState.headers) {\n headersArray.push([key, values.join(\", \")]);\n }\n\n return {\n status: this.status,\n statusText: this.statusText,\n headers: headersArray,\n body: this.body ? Array.from(this.body) : null,\n url: this.url,\n redirected: this.redirected,\n type: this.type,\n ok: this.ok,\n bodyType: this.bodyType ?? null,\n };\n },\n async json(this: ResponseState): Promise<unknown> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return JSON.parse(\"\");\n }\n const text = new TextDecoder().decode(this.body);\n return JSON.parse(text);\n },\n async text(this: ResponseState): Promise<string> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return \"\";\n }\n return new TextDecoder().decode(this.body);\n },\n async formData(this: ResponseState): Promise<FormDataState> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return { entries: [] };\n }\n\n const contentType = this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n return parseMultipartFormData(this.body, contentType);\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n return parseUrlEncodedFormData(this.body);\n }\n\n throw new TypeError(\"Could not parse content as FormData\");\n },\n __isStreamBody__(this: ResponseState): boolean {\n return this.bodyType === \"stream\";\n },\n __getStreamInstanceId__(this: ResponseState): number | undefined {\n return this.streamInstanceId;\n },\n },\n });\n\n return classHandle;\n}\n\n/**\n * Add static methods to Response class after it's been set on global\n * This must be called after Response and Headers are available on global\n */\nexport function addResponseStaticMethods(context: QuickJSContext): void {\n const staticMethodsCode = `\n Response.error = function() {\n return new Response(null, { status: 0, _type: \"error\" });\n };\n\n Response.json = function(data, init = {}) {\n const body = JSON.stringify(data);\n // Create a new Headers instance with content-type as default\n const headers = new Headers({ \"content-type\": \"application/json\" });\n // If init has headers, copy them over (this handles Headers instances properly)\n if (init.headers) {\n // Check if it's a Headers instance by looking for entries method\n if (typeof init.headers.entries === 'function') {\n // Headers instance - iterate over entries\n for (const [key, value] of init.headers.entries()) {\n headers.set(key, value);\n }\n } else if (typeof init.headers === 'object') {\n // Plain object - iterate over keys\n for (const key of Object.keys(init.headers)) {\n headers.set(key, init.headers[key]);\n }\n }\n }\n return new Response(body, {\n status: init.status ?? 200,\n statusText: init.statusText ?? \"\",\n headers: headers\n });\n };\n\n Response.redirect = function(url, status = 302) {\n return new Response(null, {\n status: status,\n headers: { \"location\": String(url) }\n });\n };\n `;\n const result = context.evalCode(staticMethodsCode);\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the clone() method to Response.prototype via evalCode.\n *\n * This must be called AFTER Response and Headers classes are on global.\n * The method creates a proper Response instance with cloned state.\n *\n * @see PATTERNS.md section 2 (Class Methods That Return Instances)\n */\nexport function addResponseCloneMethod(context: QuickJSContext): void {\n const result = context.evalCode(`\n Response.prototype.clone = function() {\n // Get cloned state from private method\n const state = this.__getClonedState__();\n\n // Create headers from the array of pairs\n const headers = new Headers();\n for (const [key, value] of state.headers) {\n headers.set(key, value);\n }\n\n // Convert body from number array back to Uint8Array if present\n let body = null;\n if (state.body) {\n body = new Uint8Array(state.body);\n }\n\n // Create a proper Response instance\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headers,\n });\n };\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the headers getter to Response.prototype via evalCode.\n *\n * This must be called AFTER both Response and Headers classes are on global.\n * Returns a cached Headers instance that shares state with the Response.\n *\n * @see PATTERNS.md section 9 (Instance-Cached Properties)\n */\nexport function addResponseHeadersGetter(context: QuickJSContext): void {\n const result = context.evalCode(`\n (function() {\n const headersCache = new Map();\n\n Object.defineProperty(Response.prototype, 'headers', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!headersCache.has(instanceId)) {\n const headers = new Headers();\n headers.__linkToParent__(instanceId);\n headersCache.set(instanceId, headers);\n }\n return headersCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Convert ResponseState (or unmarshalled Response object) to native Response\n */\nexport function responseStateToNative(state: ResponseState | Record<string, unknown>): Response {\n // Use type guard to safely extract properties\n if (isResponseState(state)) {\n // Direct ResponseState object\n if (state.bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n // Convert body back to string if it was originally a string\n let body: BodyInit | null = null;\n if (state.body) {\n if (state.bodyType === \"string\") {\n body = new TextDecoder().decode(state.body);\n } else {\n body = state.body.buffer.slice(\n state.body.byteOffset,\n state.body.byteOffset + state.body.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headersStateToNative(state.headersState),\n });\n }\n\n // Unmarshalled object - extract properties safely\n const stateObj = state as Record<string, unknown>;\n const bodyType = stateObj.bodyType as string | undefined;\n\n if (bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n const status = typeof stateObj.status === \"number\" ? stateObj.status : 200;\n const statusText = typeof stateObj.statusText === \"string\" ? stateObj.statusText : \"\";\n\n // Handle headers from getter (HeadersLike object)\n let headersState: HeadersState = { headers: new Map() };\n if (stateObj.headers && typeof stateObj.headers === \"object\") {\n const maybeHeadersLike = stateObj.headers;\n if (isHeadersState(maybeHeadersLike)) {\n headersState = { headers: new Map(maybeHeadersLike.headers) };\n }\n }\n\n // Convert body\n let body: BodyInit | null = null;\n const bodyBytes = stateObj.body;\n if (bodyBytes instanceof Uint8Array) {\n if (bodyType === \"string\") {\n body = new TextDecoder().decode(bodyBytes);\n } else {\n body = bodyBytes.buffer.slice(\n bodyBytes.byteOffset,\n bodyBytes.byteOffset + bodyBytes.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status,\n statusText,\n headers: headersStateToNative(headersState),\n });\n}\n\n/**\n * Create a ResponseState from a native Response\n */\nexport async function createResponseStateFromNative(\n response: Response\n): Promise<ResponseState> {\n const body = response.body\n ? new Uint8Array(await response.arrayBuffer())\n : null;\n\n const headersState: HeadersState = { headers: new Map() };\n response.headers.forEach((value, key) => {\n const existing = headersState.headers.get(key.toLowerCase()) || [];\n existing.push(value);\n headersState.headers.set(key.toLowerCase(), existing);\n });\n\n // Detect body type from content-type header\n const contentType = response.headers.get(\"content-type\");\n let bodyType: \"string\" | \"binary\" | null = null;\n if (body) {\n if (contentType && (contentType.startsWith(\"text/\") || contentType.includes(\"json\") || contentType.includes(\"xml\"))) {\n bodyType = \"string\";\n } else {\n bodyType = \"binary\";\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headersState,\n body,\n bodyUsed: false,\n url: response.url,\n redirected: response.redirected,\n type: response.type,\n ok: response.ok,\n bodyType,\n };\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"@ricsam/quickjs-core\";\nimport {\n defineClass,\n isInstanceOf,\n isDefineClassInstance,\n getClassInstanceState,\n coerceHeaders,\n coerceBody,\n} from \"@ricsam/quickjs-core\";\nimport type { ResponseState, HeadersState, FormDataState } from \"../types.cjs\";\nimport { isResponseState, isHeadersState } from \"../types.cjs\";\nimport { headersStateToNative } from \"./headers.cjs\";\nimport { parseMultipartFormData, parseUrlEncodedFormData } from \"./form-data.cjs\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\n/**\n * Create the Response class for QuickJS\n */\nexport function createResponseClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream?: StreamFactory\n): QuickJSHandle {\n const classHandle = defineClass<ResponseState>(context, stateMap, {\n name: \"Response\",\n construct: (args) => {\n const bodyInit = args[0];\n const init = args[1] as {\n status?: number;\n statusText?: string;\n headers?: object;\n _type?: string; // Internal: for Response.error() to set type\n } | undefined;\n\n let body: Uint8Array | null = null;\n let bodyType: \"string\" | \"binary\" | \"stream\" | null = null;\n let streamInstanceId: number | undefined = undefined;\n const status = init?.status ?? 200;\n const statusText = init?.statusText ?? \"\";\n let headersState: HeadersState = { headers: new Map() };\n\n // Parse body\n if (bodyInit !== null && bodyInit !== undefined) {\n if (typeof bodyInit === \"string\") {\n body = new TextEncoder().encode(bodyInit);\n bodyType = \"string\";\n } else if (bodyInit instanceof ArrayBuffer) {\n body = new Uint8Array(bodyInit);\n bodyType = \"binary\";\n } else if (bodyInit instanceof Uint8Array) {\n body = bodyInit;\n bodyType = \"binary\";\n } else if (\n isDefineClassInstance(bodyInit) &&\n (bodyInit.__className__ === \"Blob\" || bodyInit.__className__ === \"File\")\n ) {\n // Blob/File instance created via defineClass\n const blobState = getClassInstanceState<{ parts: Uint8Array[]; type: string }>(bodyInit);\n if (blobState && blobState.parts) {\n const parts = blobState.parts;\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n body = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n body.set(part, offset);\n offset += part.length;\n }\n bodyType = \"binary\";\n }\n } else if (\n bodyInit &&\n typeof bodyInit === \"object\" &&\n \"parts\" in bodyInit\n ) {\n // Blob-like plain object (duck-typed)\n const parts = (bodyInit as { parts: Uint8Array[] }).parts;\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n body = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n body.set(part, offset);\n offset += part.length;\n }\n bodyType = \"binary\";\n } else if (\n isDefineClassInstance(bodyInit) &&\n bodyInit.__className__ === \"ReadableStream\"\n ) {\n // ReadableStream body - don't buffer, store instance ID for later consumption\n body = null;\n bodyType = \"stream\";\n streamInstanceId = bodyInit.__instanceId__;\n }\n }\n\n // Parse headers using coercion\n if (init?.headers !== undefined) {\n const coerced = coerceHeaders.safeParse(init.headers);\n if (coerced.success) {\n headersState = coerced.value;\n }\n }\n\n return {\n status,\n statusText,\n headersState,\n body,\n bodyUsed: false,\n url: \"\",\n redirected: false,\n type: init?._type ?? \"default\",\n ok: status >= 200 && status < 300,\n bodyType,\n streamInstanceId,\n };\n },\n properties: {\n body: {\n get(this: ResponseState) {\n // Stream body - return null (stream is stored by instanceId)\n // dispatchRequest will handle stream extraction\n if (this.bodyType === \"stream\") {\n return null;\n }\n\n if (!this.body) return null;\n if (!createStream) {\n // Fallback: return raw body if no stream factory\n return this.body;\n }\n // Create a ReadableStream from the body data\n const bodyData = this.body;\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n return createStream({\n pull(controller) {\n if (offset >= bodyData.length) {\n controller.close();\n return;\n }\n const chunk = bodyData.slice(offset, Math.min(offset + chunkSize, bodyData.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n bodyUsed: {\n get(this: ResponseState) {\n return this.bodyUsed;\n },\n },\n // Note: headers getter is added via addResponseHeadersGetter() in setup.ts\n // to return a proper Headers instance instead of a plain object\n ok: {\n get(this: ResponseState) {\n return this.ok;\n },\n },\n redirected: {\n get(this: ResponseState) {\n return this.redirected;\n },\n },\n status: {\n get(this: ResponseState) {\n return this.status;\n },\n },\n statusText: {\n get(this: ResponseState) {\n return this.statusText;\n },\n },\n type: {\n get(this: ResponseState) {\n return this.type;\n },\n },\n url: {\n get(this: ResponseState) {\n return this.url;\n },\n },\n },\n methods: {\n async arrayBuffer(this: ResponseState): Promise<ArrayBuffer> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return new ArrayBuffer(0);\n }\n return this.body.buffer.slice(\n this.body.byteOffset,\n this.body.byteOffset + this.body.byteLength\n ) as ArrayBuffer;\n },\n async blob(this: ResponseState): Promise<object> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n const contentType =\n this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n return {\n parts: this.body ? [this.body] : [],\n type: contentType,\n size: this.body?.length || 0,\n };\n },\n /**\n * Private method that returns the cloned state as a serializable object.\n * Used by the clone() method added via evalCode (see addResponseCloneMethod).\n */\n __getClonedState__(this: ResponseState): {\n status: number;\n statusText: string;\n headers: Array<[string, string]>;\n body: number[] | null;\n url: string;\n redirected: boolean;\n type: string;\n ok: boolean;\n bodyType: \"string\" | \"binary\" | \"stream\" | null;\n } {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n if (this.bodyType === \"stream\") {\n throw new TypeError(\"Cannot clone Response with streaming body\");\n }\n\n // Convert headers to array of pairs for safe marshalling\n const headersArray: Array<[string, string]> = [];\n for (const [key, values] of this.headersState.headers) {\n headersArray.push([key, values.join(\", \")]);\n }\n\n return {\n status: this.status,\n statusText: this.statusText,\n headers: headersArray,\n body: this.body ? Array.from(this.body) : null,\n url: this.url,\n redirected: this.redirected,\n type: this.type,\n ok: this.ok,\n bodyType: this.bodyType ?? null,\n };\n },\n async json(this: ResponseState): Promise<unknown> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return JSON.parse(\"\");\n }\n const text = new TextDecoder().decode(this.body);\n return JSON.parse(text);\n },\n async text(this: ResponseState): Promise<string> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return \"\";\n }\n return new TextDecoder().decode(this.body);\n },\n async formData(this: ResponseState): Promise<FormDataState> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return { entries: [] };\n }\n\n const contentType = this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n return parseMultipartFormData(this.body, contentType);\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n return parseUrlEncodedFormData(this.body);\n }\n\n throw new TypeError(\"Could not parse content as FormData\");\n },\n __isStreamBody__(this: ResponseState): boolean {\n return this.bodyType === \"stream\";\n },\n __getStreamInstanceId__(this: ResponseState): number | undefined {\n return this.streamInstanceId;\n },\n },\n });\n\n return classHandle;\n}\n\n/**\n * Add static methods to Response class after it's been set on global\n * This must be called after Response and Headers are available on global\n */\nexport function addResponseStaticMethods(context: QuickJSContext): void {\n const staticMethodsCode = `\n Response.error = function() {\n return new Response(null, { status: 0, _type: \"error\" });\n };\n\n Response.json = function(data, init = {}) {\n const body = JSON.stringify(data);\n // Create a new Headers instance with content-type as default\n const headers = new Headers({ \"content-type\": \"application/json\" });\n // If init has headers, copy them over (this handles Headers instances properly)\n if (init.headers) {\n // Check if it's a Headers instance by looking for entries method\n if (typeof init.headers.entries === 'function') {\n // Headers instance - iterate over entries\n for (const [key, value] of init.headers.entries()) {\n headers.set(key, value);\n }\n } else if (typeof init.headers === 'object') {\n // Plain object - iterate over keys\n for (const key of Object.keys(init.headers)) {\n headers.set(key, init.headers[key]);\n }\n }\n }\n return new Response(body, {\n status: init.status ?? 200,\n statusText: init.statusText ?? \"\",\n headers: headers\n });\n };\n\n Response.redirect = function(url, status = 302) {\n return new Response(null, {\n status: status,\n headers: { \"location\": String(url) }\n });\n };\n `;\n const result = context.evalCode(staticMethodsCode);\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the clone() method to Response.prototype via evalCode.\n *\n * This must be called AFTER Response and Headers classes are on global.\n * The method creates a proper Response instance with cloned state.\n *\n * @see PATTERNS.md section 2 (Class Methods That Return Instances)\n */\nexport function addResponseCloneMethod(context: QuickJSContext): void {\n const result = context.evalCode(`\n Response.prototype.clone = function() {\n // Get cloned state from private method\n const state = this.__getClonedState__();\n\n // Create headers from the array of pairs\n const headers = new Headers();\n for (const [key, value] of state.headers) {\n headers.set(key, value);\n }\n\n // Convert body from number array back to Uint8Array if present\n let body = null;\n if (state.body) {\n body = new Uint8Array(state.body);\n }\n\n // Create a proper Response instance\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headers,\n });\n };\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the headers getter to Response.prototype via evalCode.\n *\n * This must be called AFTER both Response and Headers classes are on global.\n * Returns a cached Headers instance that shares state with the Response.\n *\n * @see PATTERNS.md section 9 (Instance-Cached Properties)\n */\nexport function addResponseHeadersGetter(context: QuickJSContext): void {\n const result = context.evalCode(`\n (function() {\n const headersCache = new Map();\n\n Object.defineProperty(Response.prototype, 'headers', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!headersCache.has(instanceId)) {\n const headers = new Headers();\n headers.__linkToParent__(instanceId);\n headersCache.set(instanceId, headers);\n }\n return headersCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Convert ResponseState (or unmarshalled Response object) to native Response\n */\nexport function responseStateToNative(state: ResponseState | Record<string, unknown>): Response {\n // Use type guard to safely extract properties\n if (isResponseState(state)) {\n // Direct ResponseState object\n if (state.bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n // Convert body back to string if it was originally a string\n let body: BodyInit | null = null;\n if (state.body) {\n if (state.bodyType === \"string\") {\n body = new TextDecoder().decode(state.body);\n } else {\n body = state.body.buffer.slice(\n state.body.byteOffset,\n state.body.byteOffset + state.body.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headersStateToNative(state.headersState),\n });\n }\n\n // Unmarshalled object - extract properties safely\n const stateObj = state as Record<string, unknown>;\n const bodyType = stateObj.bodyType as string | undefined;\n\n if (bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n const status = typeof stateObj.status === \"number\" ? stateObj.status : 200;\n const statusText = typeof stateObj.statusText === \"string\" ? stateObj.statusText : \"\";\n\n // Handle headers from getter (HeadersLike object)\n let headersState: HeadersState = { headers: new Map() };\n if (stateObj.headers && typeof stateObj.headers === \"object\") {\n const maybeHeadersLike = stateObj.headers;\n if (isHeadersState(maybeHeadersLike)) {\n headersState = { headers: new Map(maybeHeadersLike.headers) };\n }\n }\n\n // Convert body\n let body: BodyInit | null = null;\n const bodyBytes = stateObj.body;\n if (bodyBytes instanceof Uint8Array) {\n if (bodyType === \"string\") {\n body = new TextDecoder().decode(bodyBytes);\n } else {\n body = bodyBytes.buffer.slice(\n bodyBytes.byteOffset,\n bodyBytes.byteOffset + bodyBytes.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status,\n statusText,\n headers: headersStateToNative(headersState),\n });\n}\n\n/**\n * Create a ResponseState from a native Response\n */\nexport async function createResponseStateFromNative(\n response: Response\n): Promise<ResponseState> {\n const body = response.body\n ? new Uint8Array(await response.arrayBuffer())\n : null;\n\n const headersState: HeadersState = { headers: new Map() };\n response.headers.forEach((value, key) => {\n const existing = headersState.headers.get(key.toLowerCase()) || [];\n existing.push(value);\n headersState.headers.set(key.toLowerCase(), existing);\n });\n\n // Detect body type from content-type header\n const contentType = response.headers.get(\"content-type\");\n let bodyType: \"string\" | \"binary\" | null = null;\n if (body) {\n if (contentType && (contentType.startsWith(\"text/\") || contentType.includes(\"json\") || contentType.includes(\"xml\"))) {\n bodyType = \"string\";\n } else {\n bodyType = \"binary\";\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headersState,\n body,\n bodyUsed: false,\n url: response.url,\n redirected: response.redirected,\n type: response.type,\n ok: response.ok,\n bodyType,\n };\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "16A8FB178C927BA664756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "3D4DF32D56708DFA64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-fetch",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "type": "commonjs"
5
5
  }
@@ -3,6 +3,7 @@
3
3
  import {
4
4
  defineClass,
5
5
  isDefineClassInstance,
6
+ getClassInstanceState,
6
7
  coerceHeaders
7
8
  } from "@ricsam/quickjs-core";
8
9
  import { isResponseState, isHeadersState } from "../types.mjs";
@@ -30,6 +31,19 @@ function createResponseClass(context, stateMap, createStream) {
30
31
  } else if (bodyInit instanceof Uint8Array) {
31
32
  body = bodyInit;
32
33
  bodyType = "binary";
34
+ } else if (isDefineClassInstance(bodyInit) && (bodyInit.__className__ === "Blob" || bodyInit.__className__ === "File")) {
35
+ const blobState = getClassInstanceState(bodyInit);
36
+ if (blobState && blobState.parts) {
37
+ const parts = blobState.parts;
38
+ const totalLength = parts.reduce((sum, p) => sum + p.length, 0);
39
+ body = new Uint8Array(totalLength);
40
+ let offset = 0;
41
+ for (const part of parts) {
42
+ body.set(part, offset);
43
+ offset += part.length;
44
+ }
45
+ bodyType = "binary";
46
+ }
33
47
  } else if (bodyInit && typeof bodyInit === "object" && "parts" in bodyInit) {
34
48
  const parts = bodyInit.parts;
35
49
  const totalLength = parts.reduce((sum, p) => sum + p.length, 0);
@@ -413,4 +427,4 @@ export {
413
427
  addResponseCloneMethod
414
428
  };
415
429
 
416
- //# debugId=6D1D75024F073FD464756E2164756E21
430
+ //# debugId=2C8015EA6BE1243864756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/globals/response.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"@ricsam/quickjs-core\";\nimport {\n defineClass,\n isInstanceOf,\n isDefineClassInstance,\n coerceHeaders,\n coerceBody,\n} from \"@ricsam/quickjs-core\";\nimport type { ResponseState, HeadersState, FormDataState } from \"../types.mjs\";\nimport { isResponseState, isHeadersState } from \"../types.mjs\";\nimport { headersStateToNative } from \"./headers.mjs\";\nimport { parseMultipartFormData, parseUrlEncodedFormData } from \"./form-data.mjs\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\n/**\n * Create the Response class for QuickJS\n */\nexport function createResponseClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream?: StreamFactory\n): QuickJSHandle {\n const classHandle = defineClass<ResponseState>(context, stateMap, {\n name: \"Response\",\n construct: (args) => {\n const bodyInit = args[0];\n const init = args[1] as {\n status?: number;\n statusText?: string;\n headers?: object;\n _type?: string; // Internal: for Response.error() to set type\n } | undefined;\n\n let body: Uint8Array | null = null;\n let bodyType: \"string\" | \"binary\" | \"stream\" | null = null;\n let streamInstanceId: number | undefined = undefined;\n const status = init?.status ?? 200;\n const statusText = init?.statusText ?? \"\";\n let headersState: HeadersState = { headers: new Map() };\n\n // Parse body\n if (bodyInit !== null && bodyInit !== undefined) {\n if (typeof bodyInit === \"string\") {\n body = new TextEncoder().encode(bodyInit);\n bodyType = \"string\";\n } else if (bodyInit instanceof ArrayBuffer) {\n body = new Uint8Array(bodyInit);\n bodyType = \"binary\";\n } else if (bodyInit instanceof Uint8Array) {\n body = bodyInit;\n bodyType = \"binary\";\n } else if (\n bodyInit &&\n typeof bodyInit === \"object\" &&\n \"parts\" in bodyInit\n ) {\n // Blob-like\n const parts = (bodyInit as { parts: Uint8Array[] }).parts;\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n body = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n body.set(part, offset);\n offset += part.length;\n }\n bodyType = \"binary\";\n } else if (\n isDefineClassInstance(bodyInit) &&\n bodyInit.__className__ === \"ReadableStream\"\n ) {\n // ReadableStream body - don't buffer, store instance ID for later consumption\n body = null;\n bodyType = \"stream\";\n streamInstanceId = bodyInit.__instanceId__;\n }\n }\n\n // Parse headers using coercion\n if (init?.headers !== undefined) {\n const coerced = coerceHeaders.safeParse(init.headers);\n if (coerced.success) {\n headersState = coerced.value;\n }\n }\n\n return {\n status,\n statusText,\n headersState,\n body,\n bodyUsed: false,\n url: \"\",\n redirected: false,\n type: init?._type ?? \"default\",\n ok: status >= 200 && status < 300,\n bodyType,\n streamInstanceId,\n };\n },\n properties: {\n body: {\n get(this: ResponseState) {\n // Stream body - return null (stream is stored by instanceId)\n // dispatchRequest will handle stream extraction\n if (this.bodyType === \"stream\") {\n return null;\n }\n\n if (!this.body) return null;\n if (!createStream) {\n // Fallback: return raw body if no stream factory\n return this.body;\n }\n // Create a ReadableStream from the body data\n const bodyData = this.body;\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n return createStream({\n pull(controller) {\n if (offset >= bodyData.length) {\n controller.close();\n return;\n }\n const chunk = bodyData.slice(offset, Math.min(offset + chunkSize, bodyData.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n bodyUsed: {\n get(this: ResponseState) {\n return this.bodyUsed;\n },\n },\n // Note: headers getter is added via addResponseHeadersGetter() in setup.ts\n // to return a proper Headers instance instead of a plain object\n ok: {\n get(this: ResponseState) {\n return this.ok;\n },\n },\n redirected: {\n get(this: ResponseState) {\n return this.redirected;\n },\n },\n status: {\n get(this: ResponseState) {\n return this.status;\n },\n },\n statusText: {\n get(this: ResponseState) {\n return this.statusText;\n },\n },\n type: {\n get(this: ResponseState) {\n return this.type;\n },\n },\n url: {\n get(this: ResponseState) {\n return this.url;\n },\n },\n },\n methods: {\n async arrayBuffer(this: ResponseState): Promise<ArrayBuffer> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return new ArrayBuffer(0);\n }\n return this.body.buffer.slice(\n this.body.byteOffset,\n this.body.byteOffset + this.body.byteLength\n ) as ArrayBuffer;\n },\n async blob(this: ResponseState): Promise<object> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n const contentType =\n this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n return {\n parts: this.body ? [this.body] : [],\n type: contentType,\n size: this.body?.length || 0,\n };\n },\n /**\n * Private method that returns the cloned state as a serializable object.\n * Used by the clone() method added via evalCode (see addResponseCloneMethod).\n */\n __getClonedState__(this: ResponseState): {\n status: number;\n statusText: string;\n headers: Array<[string, string]>;\n body: number[] | null;\n url: string;\n redirected: boolean;\n type: string;\n ok: boolean;\n bodyType: \"string\" | \"binary\" | \"stream\" | null;\n } {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n if (this.bodyType === \"stream\") {\n throw new TypeError(\"Cannot clone Response with streaming body\");\n }\n\n // Convert headers to array of pairs for safe marshalling\n const headersArray: Array<[string, string]> = [];\n for (const [key, values] of this.headersState.headers) {\n headersArray.push([key, values.join(\", \")]);\n }\n\n return {\n status: this.status,\n statusText: this.statusText,\n headers: headersArray,\n body: this.body ? Array.from(this.body) : null,\n url: this.url,\n redirected: this.redirected,\n type: this.type,\n ok: this.ok,\n bodyType: this.bodyType ?? null,\n };\n },\n async json(this: ResponseState): Promise<unknown> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return JSON.parse(\"\");\n }\n const text = new TextDecoder().decode(this.body);\n return JSON.parse(text);\n },\n async text(this: ResponseState): Promise<string> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return \"\";\n }\n return new TextDecoder().decode(this.body);\n },\n async formData(this: ResponseState): Promise<FormDataState> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return { entries: [] };\n }\n\n const contentType = this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n return parseMultipartFormData(this.body, contentType);\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n return parseUrlEncodedFormData(this.body);\n }\n\n throw new TypeError(\"Could not parse content as FormData\");\n },\n __isStreamBody__(this: ResponseState): boolean {\n return this.bodyType === \"stream\";\n },\n __getStreamInstanceId__(this: ResponseState): number | undefined {\n return this.streamInstanceId;\n },\n },\n });\n\n return classHandle;\n}\n\n/**\n * Add static methods to Response class after it's been set on global\n * This must be called after Response and Headers are available on global\n */\nexport function addResponseStaticMethods(context: QuickJSContext): void {\n const staticMethodsCode = `\n Response.error = function() {\n return new Response(null, { status: 0, _type: \"error\" });\n };\n\n Response.json = function(data, init = {}) {\n const body = JSON.stringify(data);\n // Create a new Headers instance with content-type as default\n const headers = new Headers({ \"content-type\": \"application/json\" });\n // If init has headers, copy them over (this handles Headers instances properly)\n if (init.headers) {\n // Check if it's a Headers instance by looking for entries method\n if (typeof init.headers.entries === 'function') {\n // Headers instance - iterate over entries\n for (const [key, value] of init.headers.entries()) {\n headers.set(key, value);\n }\n } else if (typeof init.headers === 'object') {\n // Plain object - iterate over keys\n for (const key of Object.keys(init.headers)) {\n headers.set(key, init.headers[key]);\n }\n }\n }\n return new Response(body, {\n status: init.status ?? 200,\n statusText: init.statusText ?? \"\",\n headers: headers\n });\n };\n\n Response.redirect = function(url, status = 302) {\n return new Response(null, {\n status: status,\n headers: { \"location\": String(url) }\n });\n };\n `;\n const result = context.evalCode(staticMethodsCode);\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the clone() method to Response.prototype via evalCode.\n *\n * This must be called AFTER Response and Headers classes are on global.\n * The method creates a proper Response instance with cloned state.\n *\n * @see PATTERNS.md section 2 (Class Methods That Return Instances)\n */\nexport function addResponseCloneMethod(context: QuickJSContext): void {\n const result = context.evalCode(`\n Response.prototype.clone = function() {\n // Get cloned state from private method\n const state = this.__getClonedState__();\n\n // Create headers from the array of pairs\n const headers = new Headers();\n for (const [key, value] of state.headers) {\n headers.set(key, value);\n }\n\n // Convert body from number array back to Uint8Array if present\n let body = null;\n if (state.body) {\n body = new Uint8Array(state.body);\n }\n\n // Create a proper Response instance\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headers,\n });\n };\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the headers getter to Response.prototype via evalCode.\n *\n * This must be called AFTER both Response and Headers classes are on global.\n * Returns a cached Headers instance that shares state with the Response.\n *\n * @see PATTERNS.md section 9 (Instance-Cached Properties)\n */\nexport function addResponseHeadersGetter(context: QuickJSContext): void {\n const result = context.evalCode(`\n (function() {\n const headersCache = new Map();\n\n Object.defineProperty(Response.prototype, 'headers', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!headersCache.has(instanceId)) {\n const headers = new Headers();\n headers.__linkToParent__(instanceId);\n headersCache.set(instanceId, headers);\n }\n return headersCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Convert ResponseState (or unmarshalled Response object) to native Response\n */\nexport function responseStateToNative(state: ResponseState | Record<string, unknown>): Response {\n // Use type guard to safely extract properties\n if (isResponseState(state)) {\n // Direct ResponseState object\n if (state.bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n // Convert body back to string if it was originally a string\n let body: BodyInit | null = null;\n if (state.body) {\n if (state.bodyType === \"string\") {\n body = new TextDecoder().decode(state.body);\n } else {\n body = state.body.buffer.slice(\n state.body.byteOffset,\n state.body.byteOffset + state.body.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headersStateToNative(state.headersState),\n });\n }\n\n // Unmarshalled object - extract properties safely\n const stateObj = state as Record<string, unknown>;\n const bodyType = stateObj.bodyType as string | undefined;\n\n if (bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n const status = typeof stateObj.status === \"number\" ? stateObj.status : 200;\n const statusText = typeof stateObj.statusText === \"string\" ? stateObj.statusText : \"\";\n\n // Handle headers from getter (HeadersLike object)\n let headersState: HeadersState = { headers: new Map() };\n if (stateObj.headers && typeof stateObj.headers === \"object\") {\n const maybeHeadersLike = stateObj.headers;\n if (isHeadersState(maybeHeadersLike)) {\n headersState = { headers: new Map(maybeHeadersLike.headers) };\n }\n }\n\n // Convert body\n let body: BodyInit | null = null;\n const bodyBytes = stateObj.body;\n if (bodyBytes instanceof Uint8Array) {\n if (bodyType === \"string\") {\n body = new TextDecoder().decode(bodyBytes);\n } else {\n body = bodyBytes.buffer.slice(\n bodyBytes.byteOffset,\n bodyBytes.byteOffset + bodyBytes.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status,\n statusText,\n headers: headersStateToNative(headersState),\n });\n}\n\n/**\n * Create a ResponseState from a native Response\n */\nexport async function createResponseStateFromNative(\n response: Response\n): Promise<ResponseState> {\n const body = response.body\n ? new Uint8Array(await response.arrayBuffer())\n : null;\n\n const headersState: HeadersState = { headers: new Map() };\n response.headers.forEach((value, key) => {\n const existing = headersState.headers.get(key.toLowerCase()) || [];\n existing.push(value);\n headersState.headers.set(key.toLowerCase(), existing);\n });\n\n // Detect body type from content-type header\n const contentType = response.headers.get(\"content-type\");\n let bodyType: \"string\" | \"binary\" | null = null;\n if (body) {\n if (contentType && (contentType.startsWith(\"text/\") || contentType.includes(\"json\") || contentType.includes(\"xml\"))) {\n bodyType = \"string\";\n } else {\n bodyType = \"binary\";\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headersState,\n body,\n bodyUsed: false,\n url: response.url,\n redirected: response.redirected,\n type: response.type,\n ok: response.ok,\n bodyType,\n };\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"@ricsam/quickjs-core\";\nimport {\n defineClass,\n isInstanceOf,\n isDefineClassInstance,\n getClassInstanceState,\n coerceHeaders,\n coerceBody,\n} from \"@ricsam/quickjs-core\";\nimport type { ResponseState, HeadersState, FormDataState } from \"../types.mjs\";\nimport { isResponseState, isHeadersState } from \"../types.mjs\";\nimport { headersStateToNative } from \"./headers.mjs\";\nimport { parseMultipartFormData, parseUrlEncodedFormData } from \"./form-data.mjs\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\n/**\n * Create the Response class for QuickJS\n */\nexport function createResponseClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream?: StreamFactory\n): QuickJSHandle {\n const classHandle = defineClass<ResponseState>(context, stateMap, {\n name: \"Response\",\n construct: (args) => {\n const bodyInit = args[0];\n const init = args[1] as {\n status?: number;\n statusText?: string;\n headers?: object;\n _type?: string; // Internal: for Response.error() to set type\n } | undefined;\n\n let body: Uint8Array | null = null;\n let bodyType: \"string\" | \"binary\" | \"stream\" | null = null;\n let streamInstanceId: number | undefined = undefined;\n const status = init?.status ?? 200;\n const statusText = init?.statusText ?? \"\";\n let headersState: HeadersState = { headers: new Map() };\n\n // Parse body\n if (bodyInit !== null && bodyInit !== undefined) {\n if (typeof bodyInit === \"string\") {\n body = new TextEncoder().encode(bodyInit);\n bodyType = \"string\";\n } else if (bodyInit instanceof ArrayBuffer) {\n body = new Uint8Array(bodyInit);\n bodyType = \"binary\";\n } else if (bodyInit instanceof Uint8Array) {\n body = bodyInit;\n bodyType = \"binary\";\n } else if (\n isDefineClassInstance(bodyInit) &&\n (bodyInit.__className__ === \"Blob\" || bodyInit.__className__ === \"File\")\n ) {\n // Blob/File instance created via defineClass\n const blobState = getClassInstanceState<{ parts: Uint8Array[]; type: string }>(bodyInit);\n if (blobState && blobState.parts) {\n const parts = blobState.parts;\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n body = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n body.set(part, offset);\n offset += part.length;\n }\n bodyType = \"binary\";\n }\n } else if (\n bodyInit &&\n typeof bodyInit === \"object\" &&\n \"parts\" in bodyInit\n ) {\n // Blob-like plain object (duck-typed)\n const parts = (bodyInit as { parts: Uint8Array[] }).parts;\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0);\n body = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n body.set(part, offset);\n offset += part.length;\n }\n bodyType = \"binary\";\n } else if (\n isDefineClassInstance(bodyInit) &&\n bodyInit.__className__ === \"ReadableStream\"\n ) {\n // ReadableStream body - don't buffer, store instance ID for later consumption\n body = null;\n bodyType = \"stream\";\n streamInstanceId = bodyInit.__instanceId__;\n }\n }\n\n // Parse headers using coercion\n if (init?.headers !== undefined) {\n const coerced = coerceHeaders.safeParse(init.headers);\n if (coerced.success) {\n headersState = coerced.value;\n }\n }\n\n return {\n status,\n statusText,\n headersState,\n body,\n bodyUsed: false,\n url: \"\",\n redirected: false,\n type: init?._type ?? \"default\",\n ok: status >= 200 && status < 300,\n bodyType,\n streamInstanceId,\n };\n },\n properties: {\n body: {\n get(this: ResponseState) {\n // Stream body - return null (stream is stored by instanceId)\n // dispatchRequest will handle stream extraction\n if (this.bodyType === \"stream\") {\n return null;\n }\n\n if (!this.body) return null;\n if (!createStream) {\n // Fallback: return raw body if no stream factory\n return this.body;\n }\n // Create a ReadableStream from the body data\n const bodyData = this.body;\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n return createStream({\n pull(controller) {\n if (offset >= bodyData.length) {\n controller.close();\n return;\n }\n const chunk = bodyData.slice(offset, Math.min(offset + chunkSize, bodyData.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n bodyUsed: {\n get(this: ResponseState) {\n return this.bodyUsed;\n },\n },\n // Note: headers getter is added via addResponseHeadersGetter() in setup.ts\n // to return a proper Headers instance instead of a plain object\n ok: {\n get(this: ResponseState) {\n return this.ok;\n },\n },\n redirected: {\n get(this: ResponseState) {\n return this.redirected;\n },\n },\n status: {\n get(this: ResponseState) {\n return this.status;\n },\n },\n statusText: {\n get(this: ResponseState) {\n return this.statusText;\n },\n },\n type: {\n get(this: ResponseState) {\n return this.type;\n },\n },\n url: {\n get(this: ResponseState) {\n return this.url;\n },\n },\n },\n methods: {\n async arrayBuffer(this: ResponseState): Promise<ArrayBuffer> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return new ArrayBuffer(0);\n }\n return this.body.buffer.slice(\n this.body.byteOffset,\n this.body.byteOffset + this.body.byteLength\n ) as ArrayBuffer;\n },\n async blob(this: ResponseState): Promise<object> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n const contentType =\n this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n return {\n parts: this.body ? [this.body] : [],\n type: contentType,\n size: this.body?.length || 0,\n };\n },\n /**\n * Private method that returns the cloned state as a serializable object.\n * Used by the clone() method added via evalCode (see addResponseCloneMethod).\n */\n __getClonedState__(this: ResponseState): {\n status: number;\n statusText: string;\n headers: Array<[string, string]>;\n body: number[] | null;\n url: string;\n redirected: boolean;\n type: string;\n ok: boolean;\n bodyType: \"string\" | \"binary\" | \"stream\" | null;\n } {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n if (this.bodyType === \"stream\") {\n throw new TypeError(\"Cannot clone Response with streaming body\");\n }\n\n // Convert headers to array of pairs for safe marshalling\n const headersArray: Array<[string, string]> = [];\n for (const [key, values] of this.headersState.headers) {\n headersArray.push([key, values.join(\", \")]);\n }\n\n return {\n status: this.status,\n statusText: this.statusText,\n headers: headersArray,\n body: this.body ? Array.from(this.body) : null,\n url: this.url,\n redirected: this.redirected,\n type: this.type,\n ok: this.ok,\n bodyType: this.bodyType ?? null,\n };\n },\n async json(this: ResponseState): Promise<unknown> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return JSON.parse(\"\");\n }\n const text = new TextDecoder().decode(this.body);\n return JSON.parse(text);\n },\n async text(this: ResponseState): Promise<string> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return \"\";\n }\n return new TextDecoder().decode(this.body);\n },\n async formData(this: ResponseState): Promise<FormDataState> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return { entries: [] };\n }\n\n const contentType = this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n return parseMultipartFormData(this.body, contentType);\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n return parseUrlEncodedFormData(this.body);\n }\n\n throw new TypeError(\"Could not parse content as FormData\");\n },\n __isStreamBody__(this: ResponseState): boolean {\n return this.bodyType === \"stream\";\n },\n __getStreamInstanceId__(this: ResponseState): number | undefined {\n return this.streamInstanceId;\n },\n },\n });\n\n return classHandle;\n}\n\n/**\n * Add static methods to Response class after it's been set on global\n * This must be called after Response and Headers are available on global\n */\nexport function addResponseStaticMethods(context: QuickJSContext): void {\n const staticMethodsCode = `\n Response.error = function() {\n return new Response(null, { status: 0, _type: \"error\" });\n };\n\n Response.json = function(data, init = {}) {\n const body = JSON.stringify(data);\n // Create a new Headers instance with content-type as default\n const headers = new Headers({ \"content-type\": \"application/json\" });\n // If init has headers, copy them over (this handles Headers instances properly)\n if (init.headers) {\n // Check if it's a Headers instance by looking for entries method\n if (typeof init.headers.entries === 'function') {\n // Headers instance - iterate over entries\n for (const [key, value] of init.headers.entries()) {\n headers.set(key, value);\n }\n } else if (typeof init.headers === 'object') {\n // Plain object - iterate over keys\n for (const key of Object.keys(init.headers)) {\n headers.set(key, init.headers[key]);\n }\n }\n }\n return new Response(body, {\n status: init.status ?? 200,\n statusText: init.statusText ?? \"\",\n headers: headers\n });\n };\n\n Response.redirect = function(url, status = 302) {\n return new Response(null, {\n status: status,\n headers: { \"location\": String(url) }\n });\n };\n `;\n const result = context.evalCode(staticMethodsCode);\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the clone() method to Response.prototype via evalCode.\n *\n * This must be called AFTER Response and Headers classes are on global.\n * The method creates a proper Response instance with cloned state.\n *\n * @see PATTERNS.md section 2 (Class Methods That Return Instances)\n */\nexport function addResponseCloneMethod(context: QuickJSContext): void {\n const result = context.evalCode(`\n Response.prototype.clone = function() {\n // Get cloned state from private method\n const state = this.__getClonedState__();\n\n // Create headers from the array of pairs\n const headers = new Headers();\n for (const [key, value] of state.headers) {\n headers.set(key, value);\n }\n\n // Convert body from number array back to Uint8Array if present\n let body = null;\n if (state.body) {\n body = new Uint8Array(state.body);\n }\n\n // Create a proper Response instance\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headers,\n });\n };\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Add the headers getter to Response.prototype via evalCode.\n *\n * This must be called AFTER both Response and Headers classes are on global.\n * Returns a cached Headers instance that shares state with the Response.\n *\n * @see PATTERNS.md section 9 (Instance-Cached Properties)\n */\nexport function addResponseHeadersGetter(context: QuickJSContext): void {\n const result = context.evalCode(`\n (function() {\n const headersCache = new Map();\n\n Object.defineProperty(Response.prototype, 'headers', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!headersCache.has(instanceId)) {\n const headers = new Headers();\n headers.__linkToParent__(instanceId);\n headersCache.set(instanceId, headers);\n }\n return headersCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n result.error.dispose();\n } else {\n result.value.dispose();\n }\n}\n\n/**\n * Convert ResponseState (or unmarshalled Response object) to native Response\n */\nexport function responseStateToNative(state: ResponseState | Record<string, unknown>): Response {\n // Use type guard to safely extract properties\n if (isResponseState(state)) {\n // Direct ResponseState object\n if (state.bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n // Convert body back to string if it was originally a string\n let body: BodyInit | null = null;\n if (state.body) {\n if (state.bodyType === \"string\") {\n body = new TextDecoder().decode(state.body);\n } else {\n body = state.body.buffer.slice(\n state.body.byteOffset,\n state.body.byteOffset + state.body.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status: state.status,\n statusText: state.statusText,\n headers: headersStateToNative(state.headersState),\n });\n }\n\n // Unmarshalled object - extract properties safely\n const stateObj = state as Record<string, unknown>;\n const bodyType = stateObj.bodyType as string | undefined;\n\n if (bodyType === \"stream\") {\n throw new Error(\"Stream bodies must be handled at dispatch level - use dispatchRequest\");\n }\n\n const status = typeof stateObj.status === \"number\" ? stateObj.status : 200;\n const statusText = typeof stateObj.statusText === \"string\" ? stateObj.statusText : \"\";\n\n // Handle headers from getter (HeadersLike object)\n let headersState: HeadersState = { headers: new Map() };\n if (stateObj.headers && typeof stateObj.headers === \"object\") {\n const maybeHeadersLike = stateObj.headers;\n if (isHeadersState(maybeHeadersLike)) {\n headersState = { headers: new Map(maybeHeadersLike.headers) };\n }\n }\n\n // Convert body\n let body: BodyInit | null = null;\n const bodyBytes = stateObj.body;\n if (bodyBytes instanceof Uint8Array) {\n if (bodyType === \"string\") {\n body = new TextDecoder().decode(bodyBytes);\n } else {\n body = bodyBytes.buffer.slice(\n bodyBytes.byteOffset,\n bodyBytes.byteOffset + bodyBytes.byteLength\n ) as ArrayBuffer;\n }\n }\n\n return new Response(body, {\n status,\n statusText,\n headers: headersStateToNative(headersState),\n });\n}\n\n/**\n * Create a ResponseState from a native Response\n */\nexport async function createResponseStateFromNative(\n response: Response\n): Promise<ResponseState> {\n const body = response.body\n ? new Uint8Array(await response.arrayBuffer())\n : null;\n\n const headersState: HeadersState = { headers: new Map() };\n response.headers.forEach((value, key) => {\n const existing = headersState.headers.get(key.toLowerCase()) || [];\n existing.push(value);\n headersState.headers.set(key.toLowerCase(), existing);\n });\n\n // Detect body type from content-type header\n const contentType = response.headers.get(\"content-type\");\n let bodyType: \"string\" | \"binary\" | null = null;\n if (body) {\n if (contentType && (contentType.startsWith(\"text/\") || contentType.includes(\"json\") || contentType.includes(\"xml\"))) {\n bodyType = \"string\";\n } else {\n bodyType = \"binary\";\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headersState,\n body,\n bodyUsed: false,\n url: response.url,\n redirected: response.redirected,\n type: response.type,\n ok: response.ok,\n bodyType,\n };\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "6D1D75024F073FD464756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "2C8015EA6BE1243864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-fetch",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "type": "module"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-fetch",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {