@ricsam/quickjs-core 0.2.13 → 0.2.14

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.
@@ -15,7 +15,7 @@ import { createBlobClass } from "./blob.mjs";
15
15
  import { createFileClass } from "./file.mjs";
16
16
  import { createDOMExceptionClass } from "./dom-exception.mjs";
17
17
  import { createURLSearchParamsClass } from "./url-search-params.mjs";
18
- import { createURLClass, addURLSearchParamsGetter } from "./url.mjs";
18
+ import { createURLClass, addURLSearchParamsLinkage } from "./url.mjs";
19
19
  import { INTERNAL_STATE } from "./types.mjs";
20
20
  import { withScope, withScopeAsync } from "./scope.mjs";
21
21
  import { marshal, isHandle, getHandleType } from "./marshal.mjs";
@@ -37,7 +37,12 @@ import {
37
37
  isInstanceOf,
38
38
  getClassInstanceState,
39
39
  getInstanceId,
40
- getClassName
40
+ getClassName,
41
+ createClassTypeGuard,
42
+ isUnmarshalledRequest,
43
+ isUnmarshalledResponse,
44
+ isUnmarshalledHeaders,
45
+ isUnmarshalledFormData
41
46
  } from "./class-helpers.mjs";
42
47
  import {
43
48
  nextInstanceId,
@@ -54,7 +59,18 @@ import { createWritableStream } from "./streams/writable-stream.mjs";
54
59
  import { createBlob } from "./blob.mjs";
55
60
  import { createFile } from "./file.mjs";
56
61
  import { createURLSearchParamsClass as createURLSearchParamsClass2 } from "./url-search-params.mjs";
57
- import { createURLClass as createURLClass2, addURLSearchParamsGetter as addURLSearchParamsGetter2 } from "./url.mjs";
62
+ import { createURLClass as createURLClass2, addURLSearchParamsLinkage as addURLSearchParamsLinkage2, addURLSearchParamsGetter as addURLSearchParamsGetter2 } from "./url.mjs";
63
+ import {
64
+ createCoercer,
65
+ classCoercer,
66
+ instanceOrShape,
67
+ coerceURL,
68
+ coerceToURLString,
69
+ coerceHeaders,
70
+ coerceBody,
71
+ coerceRequestInit,
72
+ coerceResponseInit
73
+ } from "./coerce.mjs";
58
74
  function setupCore(context, options) {
59
75
  const stateMap = options?.stateMap ?? createStateMap();
60
76
  const handles = [];
@@ -104,7 +120,7 @@ function setupCore(context, options) {
104
120
  const URLClass = createURLClass(context, stateMap);
105
121
  context.setProp(context.global, "URL", URLClass);
106
122
  URLClass.dispose();
107
- addURLSearchParamsGetter(context);
123
+ addURLSearchParamsLinkage(context);
108
124
  const textEncodingCode = `
109
125
  (function() {
110
126
  class TextEncoder {
@@ -239,9 +255,14 @@ export {
239
255
  registerInstance,
240
256
  nextInstanceId,
241
257
  marshal,
258
+ isUnmarshalledResponse,
259
+ isUnmarshalledRequest,
260
+ isUnmarshalledHeaders,
261
+ isUnmarshalledFormData,
242
262
  isInstanceOf,
243
263
  isHandle,
244
264
  isDefineClassInstance,
265
+ instanceOrShape,
245
266
  getState,
246
267
  getInstanceStateById,
247
268
  getInstanceState,
@@ -260,14 +281,24 @@ export {
260
281
  createStateMap2 as createStateMap,
261
282
  createReadableStream2 as createReadableStream,
262
283
  createFile,
284
+ createCoercer,
285
+ createClassTypeGuard,
263
286
  createBlob,
264
287
  consumeReadableStream,
288
+ coerceURL,
289
+ coerceToURLString,
290
+ coerceResponseInit,
291
+ coerceRequestInit,
292
+ coerceHeaders,
293
+ coerceBody,
265
294
  clearAllInstanceState,
266
295
  cleanupUnmarshaledHandles,
267
296
  cleanupInstanceState2 as cleanupInstanceStateById,
268
297
  cleanupInstanceState,
298
+ classCoercer,
299
+ addURLSearchParamsLinkage2 as addURLSearchParamsLinkage,
269
300
  addURLSearchParamsGetter2 as addURLSearchParamsGetter,
270
301
  INTERNAL_STATE
271
302
  };
272
303
 
273
- //# debugId=3D07570CBCE54A4064756E2164756E21
304
+ //# debugId=F1D8DE89A0C3E63864756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { SetupCoreOptions, CoreHandle, StateMap } from \"./types.mjs\";\nimport { createStateMap } from \"./class-builder.mjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.mjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.mjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.mjs\";\nimport { createBlobClass } from \"./blob.mjs\";\nimport { createFileClass } from \"./file.mjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.mjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nimport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\n\n/**\n * Setup core APIs in a QuickJS context\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n *\n * @example\n * const handle = setupCore(context);\n *\n * context.evalCode(`\n * const blob = new Blob([\"hello\", \" \", \"world\"], { type: \"text/plain\" });\n * const text = await blob.text(); // \"hello world\"\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"chunk1\");\n * controller.enqueue(\"chunk2\");\n * controller.close();\n * }\n * });\n * `);\n */\nexport function setupCore(\n context: QuickJSContext,\n options?: SetupCoreOptions\n): CoreHandle {\n const stateMap = options?.stateMap ?? createStateMap();\n const handles: { name: string; handle: QuickJSHandle }[] = [];\n\n // Create ReadableStreamDefaultReader class first\n const ReadableStreamDefaultReader = createReadableStreamDefaultReaderClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"ReadableStreamDefaultReader\",\n ReadableStreamDefaultReader\n );\n ReadableStreamDefaultReader.dispose();\n\n // Create ReadableStream class\n const readerClassRef = context.getProp(context.global, \"ReadableStreamDefaultReader\");\n const ReadableStream = createReadableStreamClass(\n context,\n stateMap,\n readerClassRef\n );\n readerClassRef.dispose();\n context.setProp(context.global, \"ReadableStream\", ReadableStream);\n ReadableStream.dispose();\n\n // Create WritableStreamDefaultWriter class first\n const WritableStreamDefaultWriter = createWritableStreamDefaultWriterClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"WritableStreamDefaultWriter\",\n WritableStreamDefaultWriter\n );\n WritableStreamDefaultWriter.dispose();\n\n // Create WritableStream class\n const writerClassRef = context.getProp(context.global, \"WritableStreamDefaultWriter\");\n const WritableStream = createWritableStreamClass(\n context,\n stateMap,\n writerClassRef\n );\n writerClassRef.dispose();\n context.setProp(context.global, \"WritableStream\", WritableStream);\n WritableStream.dispose();\n\n // Create TransformStream class\n const TransformStream = createTransformStreamClass(context, stateMap);\n context.setProp(context.global, \"TransformStream\", TransformStream);\n TransformStream.dispose();\n\n // Create Blob class with stream factory\n const BlobClass = createBlobClass(context, stateMap, (source) =>\n createReadableStream(context, stateMap, source)\n );\n context.setProp(context.global, \"Blob\", BlobClass);\n BlobClass.dispose();\n\n // Create File class (extends Blob)\n const blobClassRef = context.getProp(context.global, \"Blob\");\n const FileClass = createFileClass(context, stateMap, blobClassRef);\n blobClassRef.dispose();\n context.setProp(context.global, \"File\", FileClass);\n FileClass.dispose();\n\n // Create DOMException class\n const DOMExceptionClass = createDOMExceptionClass(context, stateMap);\n context.setProp(context.global, \"DOMException\", DOMExceptionClass);\n DOMExceptionClass.dispose();\n\n // Create URLSearchParams class\n const URLSearchParamsClass = createURLSearchParamsClass(context, stateMap);\n context.setProp(context.global, \"URLSearchParams\", URLSearchParamsClass);\n URLSearchParamsClass.dispose();\n\n // Add Symbol.iterator support for URLSearchParams\n const urlSearchParamsIteratorResult = context.evalCode(`\n URLSearchParams.prototype[Symbol.iterator] = function() {\n return this.entries()[Symbol.iterator]();\n };\n `);\n if (urlSearchParamsIteratorResult.error) {\n urlSearchParamsIteratorResult.error.dispose();\n } else {\n urlSearchParamsIteratorResult.value.dispose();\n }\n\n // Create URL class (depends on URLSearchParams)\n const URLClass = createURLClass(context, stateMap);\n context.setProp(context.global, \"URL\", URLClass);\n URLClass.dispose();\n\n // Add searchParams getter to URL that returns URLSearchParams instance\n addURLSearchParamsGetter(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.mjs\";\nexport { INTERNAL_STATE } from \"./types.mjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.mjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.mjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.mjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.mjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.mjs\";\n\n// Re-export class instance helpers for cross-class access\nexport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n getInstanceId,\n getClassName,\n} from \"./class-helpers.mjs\";\nexport type { DefineClassInstance } from \"./class-helpers.mjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.mjs\";\nexport type { InstanceMetadata } from \"./instance-state.mjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.mjs\";\nexport { createWritableStream } from \"./streams/writable-stream.mjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.mjs\";\nexport { createFile } from \"./file.mjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.mjs\";\nexport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\nexport type { URLState } from \"./url.mjs\";\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { SetupCoreOptions, CoreHandle, StateMap } from \"./types.mjs\";\nimport { createStateMap } from \"./class-builder.mjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.mjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.mjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.mjs\";\nimport { createBlobClass } from \"./blob.mjs\";\nimport { createFileClass } from \"./file.mjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.mjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nimport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.mjs\";\n\n/**\n * Setup core APIs in a QuickJS context\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n *\n * @example\n * const handle = setupCore(context);\n *\n * context.evalCode(`\n * const blob = new Blob([\"hello\", \" \", \"world\"], { type: \"text/plain\" });\n * const text = await blob.text(); // \"hello world\"\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"chunk1\");\n * controller.enqueue(\"chunk2\");\n * controller.close();\n * }\n * });\n * `);\n */\nexport function setupCore(\n context: QuickJSContext,\n options?: SetupCoreOptions\n): CoreHandle {\n const stateMap = options?.stateMap ?? createStateMap();\n const handles: { name: string; handle: QuickJSHandle }[] = [];\n\n // Create ReadableStreamDefaultReader class first\n const ReadableStreamDefaultReader = createReadableStreamDefaultReaderClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"ReadableStreamDefaultReader\",\n ReadableStreamDefaultReader\n );\n ReadableStreamDefaultReader.dispose();\n\n // Create ReadableStream class\n const readerClassRef = context.getProp(context.global, \"ReadableStreamDefaultReader\");\n const ReadableStream = createReadableStreamClass(\n context,\n stateMap,\n readerClassRef\n );\n readerClassRef.dispose();\n context.setProp(context.global, \"ReadableStream\", ReadableStream);\n ReadableStream.dispose();\n\n // Create WritableStreamDefaultWriter class first\n const WritableStreamDefaultWriter = createWritableStreamDefaultWriterClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"WritableStreamDefaultWriter\",\n WritableStreamDefaultWriter\n );\n WritableStreamDefaultWriter.dispose();\n\n // Create WritableStream class\n const writerClassRef = context.getProp(context.global, \"WritableStreamDefaultWriter\");\n const WritableStream = createWritableStreamClass(\n context,\n stateMap,\n writerClassRef\n );\n writerClassRef.dispose();\n context.setProp(context.global, \"WritableStream\", WritableStream);\n WritableStream.dispose();\n\n // Create TransformStream class\n const TransformStream = createTransformStreamClass(context, stateMap);\n context.setProp(context.global, \"TransformStream\", TransformStream);\n TransformStream.dispose();\n\n // Create Blob class with stream factory\n const BlobClass = createBlobClass(context, stateMap, (source) =>\n createReadableStream(context, stateMap, source)\n );\n context.setProp(context.global, \"Blob\", BlobClass);\n BlobClass.dispose();\n\n // Create File class (extends Blob)\n const blobClassRef = context.getProp(context.global, \"Blob\");\n const FileClass = createFileClass(context, stateMap, blobClassRef);\n blobClassRef.dispose();\n context.setProp(context.global, \"File\", FileClass);\n FileClass.dispose();\n\n // Create DOMException class\n const DOMExceptionClass = createDOMExceptionClass(context, stateMap);\n context.setProp(context.global, \"DOMException\", DOMExceptionClass);\n DOMExceptionClass.dispose();\n\n // Create URLSearchParams class\n const URLSearchParamsClass = createURLSearchParamsClass(context, stateMap);\n context.setProp(context.global, \"URLSearchParams\", URLSearchParamsClass);\n URLSearchParamsClass.dispose();\n\n // Add Symbol.iterator support for URLSearchParams\n const urlSearchParamsIteratorResult = context.evalCode(`\n URLSearchParams.prototype[Symbol.iterator] = function() {\n return this.entries()[Symbol.iterator]();\n };\n `);\n if (urlSearchParamsIteratorResult.error) {\n urlSearchParamsIteratorResult.error.dispose();\n } else {\n urlSearchParamsIteratorResult.value.dispose();\n }\n\n // Create URL class (depends on URLSearchParams)\n const URLClass = createURLClass(context, stateMap);\n context.setProp(context.global, \"URL\", URLClass);\n URLClass.dispose();\n\n // Add searchParams getter to URL that returns URLSearchParams instance\n // Uses JavaScript closures to sync URLSearchParams mutations back to URL\n addURLSearchParamsLinkage(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.mjs\";\nexport { INTERNAL_STATE } from \"./types.mjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.mjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.mjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.mjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.mjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.mjs\";\n\n// Re-export class instance helpers for cross-class access\nexport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n getInstanceId,\n getClassName,\n createClassTypeGuard,\n isUnmarshalledRequest,\n isUnmarshalledResponse,\n isUnmarshalledHeaders,\n isUnmarshalledFormData,\n} from \"./class-helpers.mjs\";\nexport type { DefineClassInstance, TypedClassInstance } from \"./class-helpers.mjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.mjs\";\nexport type { InstanceMetadata } from \"./instance-state.mjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.mjs\";\nexport { createWritableStream } from \"./streams/writable-stream.mjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.mjs\";\nexport { createFile } from \"./file.mjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.mjs\";\nexport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.mjs\";\nexport type { URLState } from \"./url.mjs\";\n\n// Re-export coercion utilities\nexport {\n createCoercer,\n classCoercer,\n instanceOrShape,\n coerceURL,\n coerceToURLString,\n coerceHeaders,\n coerceBody,\n coerceRequestInit,\n coerceResponseInit,\n} from \"./coerce.mjs\";\nexport type {\n Coercer,\n CoercionResult,\n URLCoerced,\n HeadersCoerced,\n RequestInitCoerced,\n ResponseInitCoerced,\n} from \"./coerce.mjs\";\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "3D07570CBCE54A4064756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "F1D8DE89A0C3E63864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "type": "module"
5
5
  }
@@ -220,11 +220,110 @@ function unmarshal(context, handle, options = {}) {
220
220
  instanceIdHandle.dispose();
221
221
  const metadata = getInstanceMetadata(instanceId);
222
222
  if (metadata) {
223
- return {
224
- __instanceId__: instanceId,
225
- __className__: metadata.className,
226
- __isDefineClassInstance__: true
227
- };
223
+ const state = metadata.state;
224
+ const debugProps = {};
225
+ if (state) {
226
+ switch (metadata.className) {
227
+ case "Response":
228
+ debugProps.status = state.status;
229
+ debugProps.ok = state.ok;
230
+ debugProps.url = state.url;
231
+ debugProps.type = state.type;
232
+ debugProps.statusText = state.statusText;
233
+ debugProps.redirected = state.redirected;
234
+ break;
235
+ case "Request":
236
+ debugProps.method = state.method;
237
+ debugProps.url = state.url;
238
+ debugProps.mode = state.mode;
239
+ debugProps.credentials = state.credentials;
240
+ debugProps.cache = state.cache;
241
+ debugProps.redirect = state.redirect;
242
+ break;
243
+ case "Headers": {
244
+ const headers = state.headers;
245
+ if (headers instanceof Map) {
246
+ debugProps.size = headers.size;
247
+ const entries = {};
248
+ for (const [key, values] of headers) {
249
+ entries[key] = values.join(", ");
250
+ }
251
+ debugProps.entries = entries;
252
+ }
253
+ break;
254
+ }
255
+ case "URL":
256
+ debugProps.href = state.href;
257
+ debugProps.protocol = state.protocol;
258
+ debugProps.host = state.host;
259
+ debugProps.pathname = state.pathname;
260
+ debugProps.search = state.search;
261
+ break;
262
+ case "URLSearchParams": {
263
+ const params = state.params;
264
+ if (Array.isArray(params)) {
265
+ debugProps.size = params.length;
266
+ const entries = {};
267
+ for (const [key, value] of params) {
268
+ if (!entries[key])
269
+ entries[key] = [];
270
+ entries[key].push(value);
271
+ }
272
+ debugProps.entries = entries;
273
+ }
274
+ break;
275
+ }
276
+ case "Blob":
277
+ case "File":
278
+ debugProps.size = state.size;
279
+ debugProps.type = state.type;
280
+ if (state.name !== undefined)
281
+ debugProps.name = state.name;
282
+ break;
283
+ case "ReadableStream":
284
+ debugProps.locked = state.locked;
285
+ debugProps.closed = state.closed;
286
+ break;
287
+ case "FormData": {
288
+ const entries = state.entries;
289
+ if (Array.isArray(entries)) {
290
+ debugProps.size = entries.length;
291
+ }
292
+ break;
293
+ }
294
+ case "AbortController":
295
+ case "AbortSignal":
296
+ debugProps.aborted = state.aborted;
297
+ break;
298
+ default:
299
+ for (const key of ["name", "message", "size", "length", "type", "value"]) {
300
+ if (key in state && state[key] !== undefined) {
301
+ debugProps[key] = state[key];
302
+ }
303
+ }
304
+ }
305
+ }
306
+ const result = {};
307
+ Object.defineProperty(result, "__instanceId__", {
308
+ value: instanceId,
309
+ enumerable: false,
310
+ writable: false,
311
+ configurable: false
312
+ });
313
+ Object.defineProperty(result, "__className__", {
314
+ value: metadata.className,
315
+ enumerable: false,
316
+ writable: false,
317
+ configurable: false
318
+ });
319
+ Object.defineProperty(result, "__isDefineClassInstance__", {
320
+ value: true,
321
+ enumerable: false,
322
+ writable: false,
323
+ configurable: false
324
+ });
325
+ Object.assign(result, debugProps);
326
+ return result;
228
327
  }
229
328
  } else {
230
329
  instanceIdHandle.dispose();
@@ -291,4 +390,4 @@ export {
291
390
  cleanupUnmarshaledHandles
292
391
  };
293
392
 
294
- //# debugId=88FB175CB151CB5164756E2164756E21
393
+ //# debugId=59E1AD4F0B55CF7C64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/unmarshal.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { UnmarshalOptions } from \"./types.mjs\";\nimport { marshal } from \"./marshal.mjs\";\nimport { getInstanceMetadata } from \"./instance-state.mjs\";\n\n// Track duped handles per context so they can be cleaned up\nconst contextDupedHandles = new WeakMap<QuickJSContext, Set<QuickJSHandle>>();\n\n/**\n * Get or create the set of duped handles for a context\n */\nfunction getDupedHandles(context: QuickJSContext): Set<QuickJSHandle> {\n let handles = contextDupedHandles.get(context);\n if (!handles) {\n handles = new Set();\n contextDupedHandles.set(context, handles);\n }\n return handles;\n}\n\n/**\n * Clean up all duped handles for a context\n * Should be called before disposing the context\n */\nexport function cleanupUnmarshaledHandles(context: QuickJSContext): void {\n const handles = contextDupedHandles.get(context);\n if (handles) {\n for (const handle of handles) {\n try {\n handle.dispose();\n } catch {\n // Handle may already be disposed\n }\n }\n handles.clear();\n contextDupedHandles.delete(context);\n }\n}\n\n/**\n * Unmarshal a QuickJS handle to a JavaScript value\n *\n * @example\n * const value = unmarshal(context, handle);\n */\nexport function unmarshal(\n context: QuickJSContext,\n handle: QuickJSHandle,\n options: UnmarshalOptions = {}\n): unknown {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakMap<QuickJSHandle, object>();\n\n function unmarshalValue(h: QuickJSHandle, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Maximum unmarshalling depth of ${maxDepth} exceeded`);\n }\n\n // Try custom unmarshaller first\n if (options.custom) {\n const customResult = options.custom(h, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n const type = context.typeof(h);\n\n // Handle primitives\n if (type === \"undefined\") {\n return undefined;\n }\n\n // Check for null (typeof returns \"object\" for null)\n const dumpedValue = context.dump(h);\n if (dumpedValue === null) {\n return null;\n }\n\n if (type === \"boolean\") {\n return dumpedValue as boolean;\n }\n if (type === \"number\") {\n return dumpedValue as number;\n }\n if (type === \"string\") {\n return dumpedValue as string;\n }\n\n // Handle bigint\n if (typeof dumpedValue === \"bigint\") {\n return dumpedValue;\n }\n\n // Handle functions - return a wrapper that calls back into QuickJS\n if (type === \"function\") {\n // Dup the handle so it stays alive after unmarshalling\n // This is necessary because the caller may dispose the original handle\n const fnHandle = h.dup();\n // Track the duped handle for cleanup\n getDupedHandles(context).add(fnHandle);\n const wrapper = (...args: unknown[]) => {\n const argHandles = args.map((arg) => marshal(context, arg));\n try {\n const result = context.callFunction(fnHandle, context.undefined, ...argHandles);\n if (result.error) {\n const errorValue = context.dump(result.error);\n result.error.dispose();\n throw new Error(\n typeof errorValue === \"object\" && errorValue !== null\n ? (errorValue as { message?: string }).message || String(errorValue)\n : String(errorValue)\n );\n }\n const value = unmarshalValue(result.value, depth + 1);\n result.value.dispose();\n return value;\n } finally {\n for (const argHandle of argHandles) {\n argHandle.dispose();\n }\n }\n };\n // Attach a dispose method to clean up the handle when the function is no longer needed\n (wrapper as unknown as { __dispose__: () => void }).__dispose__ = () => {\n fnHandle.dispose();\n };\n return wrapper;\n }\n\n // Handle objects\n if (type === \"object\") {\n // Check for circular reference\n if (seen.has(h)) {\n return seen.get(h);\n }\n\n // Check if it's an array\n const lengthHandle = context.getProp(h, \"length\");\n const lengthType = context.typeof(lengthHandle);\n lengthHandle.dispose();\n\n if (lengthType === \"number\") {\n // Check for Array by looking for Array.isArray\n const arrayIsArray = context.getProp(context.global, \"Array\");\n const isArrayFn = context.getProp(arrayIsArray, \"isArray\");\n const isArrayResult = context.callFunction(isArrayFn, context.undefined, h);\n arrayIsArray.dispose();\n isArrayFn.dispose();\n\n let isArray = false;\n if (!isArrayResult.error) {\n isArray = context.dump(isArrayResult.value) === true;\n isArrayResult.value.dispose();\n } else {\n isArrayResult.error.dispose();\n }\n\n if (isArray) {\n const arr: unknown[] = [];\n seen.set(h, arr);\n\n const len = context.getNumber(context.getProp(h, \"length\"));\n const lenHandle = context.getProp(h, \"length\");\n const length = context.getNumber(lenHandle);\n lenHandle.dispose();\n\n for (let i = 0; i < length; i++) {\n const elementHandle = context.getProp(h, i);\n arr[i] = unmarshalValue(elementHandle, depth + 1);\n elementHandle.dispose();\n }\n return arr;\n }\n }\n\n // Check if it's a Date\n const dateConstructor = context.getProp(context.global, \"Date\");\n const isDateResult = context.evalCode(`(function(obj, Date) { return obj instanceof Date; })`);\n if (!isDateResult.error) {\n const checkResult = context.callFunction(\n isDateResult.value,\n context.undefined,\n h,\n dateConstructor\n );\n isDateResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n dateConstructor.dispose();\n\n const getTimeHandle = context.getProp(h, \"getTime\");\n const timeResult = context.callFunction(getTimeHandle, h);\n getTimeHandle.dispose();\n\n if (!timeResult.error) {\n const timestamp = context.getNumber(timeResult.value);\n timeResult.value.dispose();\n return new Date(timestamp);\n }\n if (timeResult.error) timeResult.error.dispose();\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isDateResult.error.dispose();\n }\n dateConstructor.dispose();\n\n // Check if it's a Uint8Array\n const uint8ArrayConstructor = context.getProp(context.global, \"Uint8Array\");\n const isUint8ArrayResult = context.evalCode(`(function(obj, U8) { return obj instanceof U8; })`);\n if (!isUint8ArrayResult.error) {\n const checkResult = context.callFunction(\n isUint8ArrayResult.value,\n context.undefined,\n h,\n uint8ArrayConstructor\n );\n isUint8ArrayResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n\n // Get the Uint8Array bytes\n // First try: get the underlying buffer property and extract bytes\n try {\n const bufferHandle = context.getProp(h, \"buffer\");\n const byteOffsetHandle = context.getProp(h, \"byteOffset\");\n const byteLengthHandle = context.getProp(h, \"byteLength\");\n\n if (\n context.typeof(bufferHandle) === \"object\" &&\n context.typeof(byteOffsetHandle) === \"number\" &&\n context.typeof(byteLengthHandle) === \"number\"\n ) {\n const byteOffset = context.getNumber(byteOffsetHandle);\n const byteLength = context.getNumber(byteLengthHandle);\n\n // Try to get array buffer from the buffer property\n const arrayBuffer = context.getArrayBuffer(bufferHandle);\n bufferHandle.dispose();\n byteOffsetHandle.dispose();\n byteLengthHandle.dispose();\n\n if (arrayBuffer) {\n // arrayBuffer.value is a Uint8Array representing the full ArrayBuffer\n // Use slice to get the portion we need (with proper copy)\n return arrayBuffer.value.slice(byteOffset, byteOffset + byteLength);\n }\n } else {\n bufferHandle.dispose();\n byteOffsetHandle.dispose();\n byteLengthHandle.dispose();\n }\n } catch {\n // Fall through to alternative methods\n }\n\n // Second try: getArrayBuffer directly on the Uint8Array handle\n // (works on some QuickJS builds)\n try {\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return new Uint8Array(arrayBuffer.value);\n }\n } catch {\n // Fall through to plain object handling if getArrayBuffer fails\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n }\n } else {\n isUint8ArrayResult.error.dispose();\n uint8ArrayConstructor.dispose();\n }\n\n // Check if it's an ArrayBuffer\n const arrayBufferConstructor = context.getProp(context.global, \"ArrayBuffer\");\n const isArrayBufferResult = context.evalCode(`(function(obj, AB) { return obj instanceof AB; })`);\n if (!isArrayBufferResult.error) {\n const checkResult = context.callFunction(\n isArrayBufferResult.value,\n context.undefined,\n h,\n arrayBufferConstructor\n );\n isArrayBufferResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n\n // Get the ArrayBuffer bytes directly\n // Wrap in try-catch as getArrayBuffer may throw on some QuickJS builds\n try {\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return arrayBuffer.value.slice(0);\n }\n } catch {\n // Fall through to plain object handling if getArrayBuffer fails\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n }\n } else {\n isArrayBufferResult.error.dispose();\n arrayBufferConstructor.dispose();\n }\n\n // Check for defineClass instance by looking for __instanceId__\n const instanceIdHandle = context.getProp(h, \"__instanceId__\");\n if (context.typeof(instanceIdHandle) === \"number\") {\n const instanceId = context.getNumber(instanceIdHandle);\n instanceIdHandle.dispose();\n\n const metadata = getInstanceMetadata(instanceId);\n if (metadata) {\n // Return a special object that preserves class identity\n return {\n __instanceId__: instanceId,\n __className__: metadata.className,\n __isDefineClassInstance__: true as const,\n };\n }\n } else {\n instanceIdHandle.dispose();\n }\n\n // Check if it's an Error\n const errorConstructor = context.getProp(context.global, \"Error\");\n const isErrorResult = context.evalCode(`(function(obj, Error) { return obj instanceof Error; })`);\n if (!isErrorResult.error) {\n const checkResult = context.callFunction(\n isErrorResult.value,\n context.undefined,\n h,\n errorConstructor\n );\n isErrorResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n errorConstructor.dispose();\n\n // Extract error properties using getProp (works on prototype properties)\n const messageHandle = context.getProp(h, \"message\");\n const stackHandle = context.getProp(h, \"stack\");\n const nameHandle = context.getProp(h, \"name\");\n\n const message = context.typeof(messageHandle) === \"string\"\n ? context.getString(messageHandle)\n : \"\";\n const stack = context.typeof(stackHandle) === \"string\"\n ? context.getString(stackHandle)\n : undefined;\n const name = context.typeof(nameHandle) === \"string\"\n ? context.getString(nameHandle)\n : \"Error\";\n\n messageHandle.dispose();\n stackHandle.dispose();\n nameHandle.dispose();\n\n const err = new Error(message);\n err.name = name;\n if (stack) err.stack = stack;\n return err;\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isErrorResult.error.dispose();\n }\n errorConstructor.dispose();\n\n // Plain object\n const obj: Record<string, unknown> = {};\n seen.set(h, obj);\n\n // Get own enumerable properties\n const keysResult = context.evalCode(`(function(obj) { return Object.keys(obj); })`);\n if (!keysResult.error) {\n const keysArrayHandle = context.callFunction(keysResult.value, context.undefined, h);\n keysResult.value.dispose();\n\n if (!keysArrayHandle.error) {\n const keysArray = unmarshalValue(keysArrayHandle.value, depth + 1) as string[];\n keysArrayHandle.value.dispose();\n\n for (const key of keysArray) {\n const propHandle = context.getProp(h, key);\n obj[key] = unmarshalValue(propHandle, depth + 1);\n propHandle.dispose();\n }\n } else {\n keysArrayHandle.error.dispose();\n }\n } else {\n keysResult.error.dispose();\n }\n\n return obj;\n }\n\n // Fallback to dump for unknown types\n return dumpedValue;\n }\n\n return unmarshalValue(handle, 0);\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { UnmarshalOptions } from \"./types.mjs\";\nimport { marshal } from \"./marshal.mjs\";\nimport { getInstanceMetadata } from \"./instance-state.mjs\";\n\n// Track duped handles per context so they can be cleaned up\nconst contextDupedHandles = new WeakMap<QuickJSContext, Set<QuickJSHandle>>();\n\n/**\n * Get or create the set of duped handles for a context\n */\nfunction getDupedHandles(context: QuickJSContext): Set<QuickJSHandle> {\n let handles = contextDupedHandles.get(context);\n if (!handles) {\n handles = new Set();\n contextDupedHandles.set(context, handles);\n }\n return handles;\n}\n\n/**\n * Clean up all duped handles for a context\n * Should be called before disposing the context\n */\nexport function cleanupUnmarshaledHandles(context: QuickJSContext): void {\n const handles = contextDupedHandles.get(context);\n if (handles) {\n for (const handle of handles) {\n try {\n handle.dispose();\n } catch {\n // Handle may already be disposed\n }\n }\n handles.clear();\n contextDupedHandles.delete(context);\n }\n}\n\n/**\n * Unmarshal a QuickJS handle to a JavaScript value\n *\n * @example\n * const value = unmarshal(context, handle);\n */\nexport function unmarshal(\n context: QuickJSContext,\n handle: QuickJSHandle,\n options: UnmarshalOptions = {}\n): unknown {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakMap<QuickJSHandle, object>();\n\n function unmarshalValue(h: QuickJSHandle, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Maximum unmarshalling depth of ${maxDepth} exceeded`);\n }\n\n // Try custom unmarshaller first\n if (options.custom) {\n const customResult = options.custom(h, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n const type = context.typeof(h);\n\n // Handle primitives\n if (type === \"undefined\") {\n return undefined;\n }\n\n // Check for null (typeof returns \"object\" for null)\n const dumpedValue = context.dump(h);\n if (dumpedValue === null) {\n return null;\n }\n\n if (type === \"boolean\") {\n return dumpedValue as boolean;\n }\n if (type === \"number\") {\n return dumpedValue as number;\n }\n if (type === \"string\") {\n return dumpedValue as string;\n }\n\n // Handle bigint\n if (typeof dumpedValue === \"bigint\") {\n return dumpedValue;\n }\n\n // Handle functions - return a wrapper that calls back into QuickJS\n if (type === \"function\") {\n // Dup the handle so it stays alive after unmarshalling\n // This is necessary because the caller may dispose the original handle\n const fnHandle = h.dup();\n // Track the duped handle for cleanup\n getDupedHandles(context).add(fnHandle);\n const wrapper = (...args: unknown[]) => {\n const argHandles = args.map((arg) => marshal(context, arg));\n try {\n const result = context.callFunction(fnHandle, context.undefined, ...argHandles);\n if (result.error) {\n const errorValue = context.dump(result.error);\n result.error.dispose();\n throw new Error(\n typeof errorValue === \"object\" && errorValue !== null\n ? (errorValue as { message?: string }).message || String(errorValue)\n : String(errorValue)\n );\n }\n const value = unmarshalValue(result.value, depth + 1);\n result.value.dispose();\n return value;\n } finally {\n for (const argHandle of argHandles) {\n argHandle.dispose();\n }\n }\n };\n // Attach a dispose method to clean up the handle when the function is no longer needed\n (wrapper as unknown as { __dispose__: () => void }).__dispose__ = () => {\n fnHandle.dispose();\n };\n return wrapper;\n }\n\n // Handle objects\n if (type === \"object\") {\n // Check for circular reference\n if (seen.has(h)) {\n return seen.get(h);\n }\n\n // Check if it's an array\n const lengthHandle = context.getProp(h, \"length\");\n const lengthType = context.typeof(lengthHandle);\n lengthHandle.dispose();\n\n if (lengthType === \"number\") {\n // Check for Array by looking for Array.isArray\n const arrayIsArray = context.getProp(context.global, \"Array\");\n const isArrayFn = context.getProp(arrayIsArray, \"isArray\");\n const isArrayResult = context.callFunction(isArrayFn, context.undefined, h);\n arrayIsArray.dispose();\n isArrayFn.dispose();\n\n let isArray = false;\n if (!isArrayResult.error) {\n isArray = context.dump(isArrayResult.value) === true;\n isArrayResult.value.dispose();\n } else {\n isArrayResult.error.dispose();\n }\n\n if (isArray) {\n const arr: unknown[] = [];\n seen.set(h, arr);\n\n const len = context.getNumber(context.getProp(h, \"length\"));\n const lenHandle = context.getProp(h, \"length\");\n const length = context.getNumber(lenHandle);\n lenHandle.dispose();\n\n for (let i = 0; i < length; i++) {\n const elementHandle = context.getProp(h, i);\n arr[i] = unmarshalValue(elementHandle, depth + 1);\n elementHandle.dispose();\n }\n return arr;\n }\n }\n\n // Check if it's a Date\n const dateConstructor = context.getProp(context.global, \"Date\");\n const isDateResult = context.evalCode(`(function(obj, Date) { return obj instanceof Date; })`);\n if (!isDateResult.error) {\n const checkResult = context.callFunction(\n isDateResult.value,\n context.undefined,\n h,\n dateConstructor\n );\n isDateResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n dateConstructor.dispose();\n\n const getTimeHandle = context.getProp(h, \"getTime\");\n const timeResult = context.callFunction(getTimeHandle, h);\n getTimeHandle.dispose();\n\n if (!timeResult.error) {\n const timestamp = context.getNumber(timeResult.value);\n timeResult.value.dispose();\n return new Date(timestamp);\n }\n if (timeResult.error) timeResult.error.dispose();\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isDateResult.error.dispose();\n }\n dateConstructor.dispose();\n\n // Check if it's a Uint8Array\n const uint8ArrayConstructor = context.getProp(context.global, \"Uint8Array\");\n const isUint8ArrayResult = context.evalCode(`(function(obj, U8) { return obj instanceof U8; })`);\n if (!isUint8ArrayResult.error) {\n const checkResult = context.callFunction(\n isUint8ArrayResult.value,\n context.undefined,\n h,\n uint8ArrayConstructor\n );\n isUint8ArrayResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n\n // Get the Uint8Array bytes\n // First try: get the underlying buffer property and extract bytes\n try {\n const bufferHandle = context.getProp(h, \"buffer\");\n const byteOffsetHandle = context.getProp(h, \"byteOffset\");\n const byteLengthHandle = context.getProp(h, \"byteLength\");\n\n if (\n context.typeof(bufferHandle) === \"object\" &&\n context.typeof(byteOffsetHandle) === \"number\" &&\n context.typeof(byteLengthHandle) === \"number\"\n ) {\n const byteOffset = context.getNumber(byteOffsetHandle);\n const byteLength = context.getNumber(byteLengthHandle);\n\n // Try to get array buffer from the buffer property\n const arrayBuffer = context.getArrayBuffer(bufferHandle);\n bufferHandle.dispose();\n byteOffsetHandle.dispose();\n byteLengthHandle.dispose();\n\n if (arrayBuffer) {\n // arrayBuffer.value is a Uint8Array representing the full ArrayBuffer\n // Use slice to get the portion we need (with proper copy)\n return arrayBuffer.value.slice(byteOffset, byteOffset + byteLength);\n }\n } else {\n bufferHandle.dispose();\n byteOffsetHandle.dispose();\n byteLengthHandle.dispose();\n }\n } catch {\n // Fall through to alternative methods\n }\n\n // Second try: getArrayBuffer directly on the Uint8Array handle\n // (works on some QuickJS builds)\n try {\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return new Uint8Array(arrayBuffer.value);\n }\n } catch {\n // Fall through to plain object handling if getArrayBuffer fails\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n }\n } else {\n isUint8ArrayResult.error.dispose();\n uint8ArrayConstructor.dispose();\n }\n\n // Check if it's an ArrayBuffer\n const arrayBufferConstructor = context.getProp(context.global, \"ArrayBuffer\");\n const isArrayBufferResult = context.evalCode(`(function(obj, AB) { return obj instanceof AB; })`);\n if (!isArrayBufferResult.error) {\n const checkResult = context.callFunction(\n isArrayBufferResult.value,\n context.undefined,\n h,\n arrayBufferConstructor\n );\n isArrayBufferResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n\n // Get the ArrayBuffer bytes directly\n // Wrap in try-catch as getArrayBuffer may throw on some QuickJS builds\n try {\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return arrayBuffer.value.slice(0);\n }\n } catch {\n // Fall through to plain object handling if getArrayBuffer fails\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n }\n } else {\n isArrayBufferResult.error.dispose();\n arrayBufferConstructor.dispose();\n }\n\n // Check for defineClass instance by looking for __instanceId__\n const instanceIdHandle = context.getProp(h, \"__instanceId__\");\n if (context.typeof(instanceIdHandle) === \"number\") {\n const instanceId = context.getNumber(instanceIdHandle);\n instanceIdHandle.dispose();\n\n const metadata = getInstanceMetadata(instanceId);\n if (metadata) {\n // Extract useful debug properties based on class type\n const state = metadata.state as Record<string, unknown>;\n const debugProps: Record<string, unknown> = {};\n\n if (state) {\n switch (metadata.className) {\n case \"Response\":\n debugProps.status = state.status;\n debugProps.ok = state.ok;\n debugProps.url = state.url;\n debugProps.type = state.type;\n debugProps.statusText = state.statusText;\n debugProps.redirected = state.redirected;\n break;\n case \"Request\":\n debugProps.method = state.method;\n debugProps.url = state.url;\n debugProps.mode = state.mode;\n debugProps.credentials = state.credentials;\n debugProps.cache = state.cache;\n debugProps.redirect = state.redirect;\n break;\n case \"Headers\": {\n const headers = state.headers as Map<string, string[]> | undefined;\n if (headers instanceof Map) {\n debugProps.size = headers.size;\n // Convert to plain object for debugging\n const entries: Record<string, string> = {};\n for (const [key, values] of headers) {\n entries[key] = values.join(\", \");\n }\n debugProps.entries = entries;\n }\n break;\n }\n case \"URL\":\n debugProps.href = state.href;\n debugProps.protocol = state.protocol;\n debugProps.host = state.host;\n debugProps.pathname = state.pathname;\n debugProps.search = state.search;\n break;\n case \"URLSearchParams\": {\n const params = state.params as Array<[string, string]> | undefined;\n if (Array.isArray(params)) {\n debugProps.size = params.length;\n // Convert to plain object for debugging\n const entries: Record<string, string[]> = {};\n for (const [key, value] of params) {\n if (!entries[key]) entries[key] = [];\n entries[key].push(value);\n }\n debugProps.entries = entries;\n }\n break;\n }\n case \"Blob\":\n case \"File\":\n debugProps.size = state.size;\n debugProps.type = state.type;\n if (state.name !== undefined) debugProps.name = state.name;\n break;\n case \"ReadableStream\":\n debugProps.locked = state.locked;\n debugProps.closed = state.closed;\n break;\n case \"FormData\": {\n const entries = state.entries as Array<{ name: string; value: unknown }> | undefined;\n if (Array.isArray(entries)) {\n debugProps.size = entries.length;\n }\n break;\n }\n case \"AbortController\":\n case \"AbortSignal\":\n debugProps.aborted = state.aborted;\n break;\n default:\n // For unknown classes, try to include common properties\n for (const key of [\"name\", \"message\", \"size\", \"length\", \"type\", \"value\"]) {\n if (key in state && state[key] !== undefined) {\n debugProps[key] = state[key];\n }\n }\n }\n }\n\n // Return object with non-enumerable class identity markers AND enumerable debug properties\n const result: Record<string, unknown> = {};\n\n // Make internal properties non-enumerable so they don't show up in Object.keys()\n Object.defineProperty(result, '__instanceId__', {\n value: instanceId,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n Object.defineProperty(result, '__className__', {\n value: metadata.className,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n Object.defineProperty(result, '__isDefineClassInstance__', {\n value: true as const,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n\n // Add debug properties as enumerable (visible in Object.keys)\n Object.assign(result, debugProps);\n\n return result;\n }\n } else {\n instanceIdHandle.dispose();\n }\n\n // Check if it's an Error\n const errorConstructor = context.getProp(context.global, \"Error\");\n const isErrorResult = context.evalCode(`(function(obj, Error) { return obj instanceof Error; })`);\n if (!isErrorResult.error) {\n const checkResult = context.callFunction(\n isErrorResult.value,\n context.undefined,\n h,\n errorConstructor\n );\n isErrorResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n errorConstructor.dispose();\n\n // Extract error properties using getProp (works on prototype properties)\n const messageHandle = context.getProp(h, \"message\");\n const stackHandle = context.getProp(h, \"stack\");\n const nameHandle = context.getProp(h, \"name\");\n\n const message = context.typeof(messageHandle) === \"string\"\n ? context.getString(messageHandle)\n : \"\";\n const stack = context.typeof(stackHandle) === \"string\"\n ? context.getString(stackHandle)\n : undefined;\n const name = context.typeof(nameHandle) === \"string\"\n ? context.getString(nameHandle)\n : \"Error\";\n\n messageHandle.dispose();\n stackHandle.dispose();\n nameHandle.dispose();\n\n const err = new Error(message);\n err.name = name;\n if (stack) err.stack = stack;\n return err;\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isErrorResult.error.dispose();\n }\n errorConstructor.dispose();\n\n // Plain object\n const obj: Record<string, unknown> = {};\n seen.set(h, obj);\n\n // Get own enumerable properties\n const keysResult = context.evalCode(`(function(obj) { return Object.keys(obj); })`);\n if (!keysResult.error) {\n const keysArrayHandle = context.callFunction(keysResult.value, context.undefined, h);\n keysResult.value.dispose();\n\n if (!keysArrayHandle.error) {\n const keysArray = unmarshalValue(keysArrayHandle.value, depth + 1) as string[];\n keysArrayHandle.value.dispose();\n\n for (const key of keysArray) {\n const propHandle = context.getProp(h, key);\n obj[key] = unmarshalValue(propHandle, depth + 1);\n propHandle.dispose();\n }\n } else {\n keysArrayHandle.error.dispose();\n }\n } else {\n keysResult.error.dispose();\n }\n\n return obj;\n }\n\n // Fallback to dump for unknown types\n return dumpedValue;\n }\n\n return unmarshalValue(handle, 0);\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "88FB175CB151CB5164756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "59E1AD4F0B55CF7C64756E2164756E21",
9
9
  "names": []
10
10
  }