@ricsam/quickjs-core 0.2.14 → 0.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/file.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n extends: _blobClass,\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "6BE6474BD2F62AE964756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "4DA4A4C486D4406A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -18,11 +18,17 @@ function defineAsyncFunction(context, name, fn) {
18
18
  const args = argHandles.map((h) => unmarshal(context, h));
19
19
  const deferred = context.newPromise();
20
20
  fn(...args).then((result) => {
21
+ if (!context.alive) {
22
+ return;
23
+ }
21
24
  const resultHandle = marshal(context, result);
22
25
  deferred.resolve(resultHandle);
23
26
  resultHandle.dispose();
24
27
  context.runtime.executePendingJobs();
25
28
  }).catch((error) => {
29
+ if (!context.alive) {
30
+ return;
31
+ }
26
32
  const errorHandle = marshal(context, error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) });
27
33
  deferred.reject(errorHandle);
28
34
  errorHandle.dispose();
@@ -36,4 +42,4 @@ export {
36
42
  defineAsyncFunction
37
43
  };
38
44
 
39
- //# debugId=6738D97AC374993764756E2164756E21
45
+ //# debugId=8B474E0BF8843F0764756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/function-builder.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n/**\n * Define a global function in the QuickJS context\n *\n * @returns Handle to the function (caller must manage disposal)\n *\n * @example\n * const logFn = defineFunction(context, \"log\", (...args) => {\n * console.log(\"[QuickJS]\", ...args);\n * });\n * context.setProp(context.global, \"log\", logFn);\n */\nexport function defineFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => unknown\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n try {\n // Call host function\n const result = fn(...args);\n\n // Marshal result\n return marshal(context, result);\n } catch (error) {\n // Throw error in QuickJS\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n}\n\n/**\n * Define an async function that returns a promise to QuickJS\n *\n * @example\n * const fetchFn = defineAsyncFunction(context, \"fetch\", async (url) => {\n * const response = await fetch(String(url));\n * return response.text();\n * });\n */\nexport function defineAsyncFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n // Create a promise in QuickJS\n const deferred = context.newPromise();\n\n // Call the async function\n fn(...args)\n .then((result) => {\n const resultHandle = marshal(context, result);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n/**\n * Define a global function in the QuickJS context\n *\n * @returns Handle to the function (caller must manage disposal)\n *\n * @example\n * const logFn = defineFunction(context, \"log\", (...args) => {\n * console.log(\"[QuickJS]\", ...args);\n * });\n * context.setProp(context.global, \"log\", logFn);\n */\nexport function defineFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => unknown\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n try {\n // Call host function\n const result = fn(...args);\n\n // Marshal result\n return marshal(context, result);\n } catch (error) {\n // Throw error in QuickJS\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n}\n\n/**\n * Define an async function that returns a promise to QuickJS\n *\n * @example\n * const fetchFn = defineAsyncFunction(context, \"fetch\", async (url) => {\n * const response = await fetch(String(url));\n * return response.text();\n * });\n */\nexport function defineAsyncFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n // Create a promise in QuickJS\n const deferred = context.newPromise();\n\n // Call the async function\n fn(...args)\n .then((result) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resultHandle = marshal(context, result);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n"
6
6
  ],
7
- "mappings": ";;AACA;AACA;AAaO,SAAS,cAAc,CAC5B,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAExD,IAAI;AAAA,MAEF,MAAM,SAAS,GAAG,GAAG,IAAI;AAAA,MAGzB,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,OAAO,OAAO;AAAA,MAEd,MAAM,QAAQ,SACZ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA;AAAA,GAEH;AAAA;AAYI,SAAS,mBAAmB,CACjC,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAGxD,MAAM,WAAW,QAAQ,WAAW;AAAA,IAGpC,GAAG,GAAG,IAAI,EACP,KAAK,CAAC,WAAW;AAAA,MAChB,MAAM,eAAe,QAAQ,SAAS,MAAM;AAAA,MAC5C,SAAS,QAAQ,YAAY;AAAA,MAC7B,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC,EACA,MAAM,CAAC,UAAU;AAAA,MAChB,MAAM,cAAc,QAClB,SACA,iBAAiB,QACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C,EAAE,SAAS,OAAO,KAAK,EAAE,CAC/B;AAAA,MACA,SAAS,OAAO,WAAW;AAAA,MAC3B,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC;AAAA,IAEH,OAAO,SAAS;AAAA,GACjB;AAAA;",
8
- "debugId": "6738D97AC374993764756E2164756E21",
7
+ "mappings": ";;AACA;AACA;AAaO,SAAS,cAAc,CAC5B,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAExD,IAAI;AAAA,MAEF,MAAM,SAAS,GAAG,GAAG,IAAI;AAAA,MAGzB,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,OAAO,OAAO;AAAA,MAEd,MAAM,QAAQ,SACZ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA;AAAA,GAEH;AAAA;AAYI,SAAS,mBAAmB,CACjC,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAGxD,MAAM,WAAW,QAAQ,WAAW;AAAA,IAGpC,GAAG,GAAG,IAAI,EACP,KAAK,CAAC,WAAW;AAAA,MAEhB,IAAI,CAAC,QAAQ,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,eAAe,QAAQ,SAAS,MAAM;AAAA,MAC5C,SAAS,QAAQ,YAAY;AAAA,MAC7B,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC,EACA,MAAM,CAAC,UAAU;AAAA,MAEhB,IAAI,CAAC,QAAQ,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,cAAc,QAClB,SACA,iBAAiB,QACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C,EAAE,SAAS,OAAO,KAAK,EAAE,CAC/B;AAAA,MACA,SAAS,OAAO,WAAW;AAAA,MAC3B,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC;AAAA,IAEH,OAAO,SAAS;AAAA,GACjB;AAAA;",
8
+ "debugId": "8B474E0BF8843F0764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -89,11 +89,17 @@ function marshal(context, value, options = {}) {
89
89
  if (val instanceof Promise) {
90
90
  const deferred = context.newPromise();
91
91
  val.then((resolved) => {
92
+ if (!context.alive) {
93
+ return;
94
+ }
92
95
  const resolvedHandle = marshalValue(resolved, depth + 1);
93
96
  deferred.resolve(resolvedHandle);
94
97
  resolvedHandle.dispose();
95
98
  context.runtime.executePendingJobs();
96
99
  }).catch((error) => {
100
+ if (!context.alive) {
101
+ return;
102
+ }
97
103
  const errorHandle = marshalValue(error instanceof Error ? { name: error.name, message: error.message } : error, depth + 1);
98
104
  deferred.reject(errorHandle);
99
105
  errorHandle.dispose();
@@ -129,11 +135,17 @@ function marshal(context, value, options = {}) {
129
135
  if (result instanceof Promise) {
130
136
  const deferred = context.newPromise();
131
137
  result.then((resolved) => {
138
+ if (!context.alive) {
139
+ return;
140
+ }
132
141
  const resolvedHandle = marshalValue(resolved, depth + 1);
133
142
  deferred.resolve(resolvedHandle);
134
143
  resolvedHandle.dispose();
135
144
  context.runtime.executePendingJobs();
136
145
  }).catch((error) => {
146
+ if (!context.alive) {
147
+ return;
148
+ }
137
149
  const errorHandle = marshalValue(error instanceof Error ? { name: error.name, message: error.message } : error, depth + 1);
138
150
  deferred.reject(errorHandle);
139
151
  errorHandle.dispose();
@@ -157,4 +169,4 @@ export {
157
169
  getHandleType
158
170
  };
159
171
 
160
- //# debugId=D3A382CD5B7A763864756E2164756E21
172
+ //# debugId=A7F1AA32FC96B04D64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/marshal.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { MarshalOptions } from \"./types.mjs\";\n\n/**\n * Check if a value is a QuickJS handle\n */\nexport function isHandle(value: unknown): value is QuickJSHandle {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"alive\" in value &&\n \"dispose\" in value &&\n typeof (value as QuickJSHandle).dispose === \"function\"\n );\n}\n\n/**\n * Get the type of a QuickJS handle as a string\n */\nexport function getHandleType(\n context: QuickJSContext,\n handle: QuickJSHandle\n): \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\" {\n return context.typeof(handle) as \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\";\n}\n\n/**\n * Marshal a JavaScript value to a QuickJS handle\n *\n * Supports:\n * - Primitives (string, number, boolean, null, undefined, bigint)\n * - Arrays\n * - Plain objects\n * - ArrayBuffer / Uint8Array\n * - Date (converted to Date object in QuickJS)\n * - Functions (wrapped as host functions)\n * - Promises (wrapped with context.newPromise)\n *\n * @example\n * const handle = marshal(context, {\n * name: \"test\",\n * values: [1, 2, 3],\n * callback: (x) => x * 2\n * });\n */\nexport function marshal(\n context: QuickJSContext,\n value: unknown,\n options: MarshalOptions = {}\n): QuickJSHandle {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakSet<object>();\n\n function marshalValue(val: unknown, depth: number): QuickJSHandle {\n if (depth > maxDepth) {\n throw new Error(`Maximum marshalling depth of ${maxDepth} exceeded`);\n }\n\n // Pass through existing QuickJS handles\n if (isHandle(val)) {\n return val;\n }\n\n // Try custom marshaller first\n if (options.custom) {\n const customResult = options.custom(val, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n // Handle primitives\n if (val === undefined) {\n return context.undefined;\n }\n if (val === null) {\n return context.null;\n }\n if (typeof val === \"boolean\") {\n return val ? context.true : context.false;\n }\n if (typeof val === \"number\") {\n return context.newNumber(val);\n }\n if (typeof val === \"string\") {\n return context.newString(val);\n }\n if (typeof val === \"bigint\") {\n return context.newBigInt(val);\n }\n\n // Handle symbols (convert to string representation)\n if (typeof val === \"symbol\") {\n return context.newString(val.toString());\n }\n\n // Handle objects\n if (typeof val === \"object\") {\n // Check for circular references\n if (seen.has(val)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(val);\n\n try {\n // Handle ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return context.newArrayBuffer(val);\n }\n\n // Handle Uint8Array - create proper Uint8Array in QuickJS (has .length property)\n if (val instanceof Uint8Array) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n const bufferHandle = context.newArrayBuffer(buffer);\n context.setProp(context.global, \"__tempMarshalBuffer__\", bufferHandle);\n bufferHandle.dispose();\n const result = context.evalCode(\"new Uint8Array(__tempMarshalBuffer__)\");\n const cleanup = context.evalCode(\"delete globalThis.__tempMarshalBuffer__\");\n if (cleanup.error) cleanup.error.dispose();\n else cleanup.value.dispose();\n if (result.error) {\n result.error.dispose();\n // Fallback to ArrayBuffer if Uint8Array creation fails\n return context.newArrayBuffer(buffer);\n }\n return result.value;\n }\n\n // Handle other TypedArrays (Int8Array, Float32Array, etc.) - convert to ArrayBuffer\n if (ArrayBuffer.isView(val)) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n return context.newArrayBuffer(buffer);\n }\n\n // Handle Date\n if (val instanceof Date) {\n const dateConstructor = context.getProp(context.global, \"Date\");\n const timestamp = context.newNumber(val.getTime());\n const result = context.callFunction(\n dateConstructor,\n context.undefined,\n timestamp\n );\n dateConstructor.dispose();\n timestamp.dispose();\n\n if (result.error) {\n const error = result.error;\n result.error.dispose();\n throw new Error(`Failed to create Date: ${context.dump(error)}`);\n }\n return result.value;\n }\n\n // Handle Promise\n if (val instanceof Promise) {\n const deferred = context.newPromise();\n val\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n // Handle Array\n if (Array.isArray(val)) {\n const arr = context.newArray();\n for (let i = 0; i < val.length; i++) {\n const elementHandle = marshalValue(val[i], depth + 1);\n context.setProp(arr, i, elementHandle);\n elementHandle.dispose();\n }\n return arr;\n }\n\n // Handle plain objects\n const obj = context.newObject();\n for (const [key, propVal] of Object.entries(val)) {\n const propHandle = marshalValue(propVal, depth + 1);\n context.setProp(obj, key, propHandle);\n propHandle.dispose();\n }\n return obj;\n } finally {\n seen.delete(val);\n }\n }\n\n // Handle functions\n if (typeof val === \"function\") {\n return context.newFunction(val.name || \"anonymous\", (...argHandles) => {\n const args = argHandles.map((h) => context.dump(h));\n try {\n const result = val(...args);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return marshalValue(result, depth + 1);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n }\n\n throw new Error(`Cannot marshal value of type ${typeof val}`);\n }\n\n return marshalValue(value, 0);\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { MarshalOptions } from \"./types.mjs\";\n\n/**\n * Check if a value is a QuickJS handle\n */\nexport function isHandle(value: unknown): value is QuickJSHandle {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"alive\" in value &&\n \"dispose\" in value &&\n typeof (value as QuickJSHandle).dispose === \"function\"\n );\n}\n\n/**\n * Get the type of a QuickJS handle as a string\n */\nexport function getHandleType(\n context: QuickJSContext,\n handle: QuickJSHandle\n): \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\" {\n return context.typeof(handle) as \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\";\n}\n\n/**\n * Marshal a JavaScript value to a QuickJS handle\n *\n * Supports:\n * - Primitives (string, number, boolean, null, undefined, bigint)\n * - Arrays\n * - Plain objects\n * - ArrayBuffer / Uint8Array\n * - Date (converted to Date object in QuickJS)\n * - Functions (wrapped as host functions)\n * - Promises (wrapped with context.newPromise)\n *\n * @example\n * const handle = marshal(context, {\n * name: \"test\",\n * values: [1, 2, 3],\n * callback: (x) => x * 2\n * });\n */\nexport function marshal(\n context: QuickJSContext,\n value: unknown,\n options: MarshalOptions = {}\n): QuickJSHandle {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakSet<object>();\n\n function marshalValue(val: unknown, depth: number): QuickJSHandle {\n if (depth > maxDepth) {\n throw new Error(`Maximum marshalling depth of ${maxDepth} exceeded`);\n }\n\n // Pass through existing QuickJS handles\n if (isHandle(val)) {\n return val;\n }\n\n // Try custom marshaller first\n if (options.custom) {\n const customResult = options.custom(val, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n // Handle primitives\n if (val === undefined) {\n return context.undefined;\n }\n if (val === null) {\n return context.null;\n }\n if (typeof val === \"boolean\") {\n return val ? context.true : context.false;\n }\n if (typeof val === \"number\") {\n return context.newNumber(val);\n }\n if (typeof val === \"string\") {\n return context.newString(val);\n }\n if (typeof val === \"bigint\") {\n return context.newBigInt(val);\n }\n\n // Handle symbols (convert to string representation)\n if (typeof val === \"symbol\") {\n return context.newString(val.toString());\n }\n\n // Handle objects\n if (typeof val === \"object\") {\n // Check for circular references\n if (seen.has(val)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(val);\n\n try {\n // Handle ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return context.newArrayBuffer(val);\n }\n\n // Handle Uint8Array - create proper Uint8Array in QuickJS (has .length property)\n if (val instanceof Uint8Array) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n const bufferHandle = context.newArrayBuffer(buffer);\n context.setProp(context.global, \"__tempMarshalBuffer__\", bufferHandle);\n bufferHandle.dispose();\n const result = context.evalCode(\"new Uint8Array(__tempMarshalBuffer__)\");\n const cleanup = context.evalCode(\"delete globalThis.__tempMarshalBuffer__\");\n if (cleanup.error) cleanup.error.dispose();\n else cleanup.value.dispose();\n if (result.error) {\n result.error.dispose();\n // Fallback to ArrayBuffer if Uint8Array creation fails\n return context.newArrayBuffer(buffer);\n }\n return result.value;\n }\n\n // Handle other TypedArrays (Int8Array, Float32Array, etc.) - convert to ArrayBuffer\n if (ArrayBuffer.isView(val)) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n return context.newArrayBuffer(buffer);\n }\n\n // Handle Date\n if (val instanceof Date) {\n const dateConstructor = context.getProp(context.global, \"Date\");\n const timestamp = context.newNumber(val.getTime());\n const result = context.callFunction(\n dateConstructor,\n context.undefined,\n timestamp\n );\n dateConstructor.dispose();\n timestamp.dispose();\n\n if (result.error) {\n const error = result.error;\n result.error.dispose();\n throw new Error(`Failed to create Date: ${context.dump(error)}`);\n }\n return result.value;\n }\n\n // Handle Promise\n if (val instanceof Promise) {\n const deferred = context.newPromise();\n val\n .then((resolved) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n // Handle Array\n if (Array.isArray(val)) {\n const arr = context.newArray();\n for (let i = 0; i < val.length; i++) {\n const elementHandle = marshalValue(val[i], depth + 1);\n context.setProp(arr, i, elementHandle);\n elementHandle.dispose();\n }\n return arr;\n }\n\n // Handle plain objects\n const obj = context.newObject();\n for (const [key, propVal] of Object.entries(val)) {\n const propHandle = marshalValue(propVal, depth + 1);\n context.setProp(obj, key, propHandle);\n propHandle.dispose();\n }\n return obj;\n } finally {\n seen.delete(val);\n }\n }\n\n // Handle functions\n if (typeof val === \"function\") {\n return context.newFunction(val.name || \"anonymous\", (...argHandles) => {\n const args = argHandles.map((h) => context.dump(h));\n try {\n const result = val(...args);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return marshalValue(result, depth + 1);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n }\n\n throw new Error(`Cannot marshal value of type ${typeof val}`);\n }\n\n return marshalValue(value, 0);\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "D3A382CD5B7A763864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "A7F1AA32FC96B04D64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.14",
3
+ "version": "0.2.16",
4
4
  "type": "module"
5
5
  }
@@ -409,9 +409,15 @@ function createReadableStream(context, stateMap, source) {
409
409
  if (result2 instanceof Promise) {
410
410
  const deferred = context.newPromise();
411
411
  result2.then(() => {
412
+ if (!context.alive) {
413
+ return;
414
+ }
412
415
  deferred.resolve(context.undefined);
413
416
  context.runtime.executePendingJobs();
414
417
  }).catch((e) => {
418
+ if (!context.alive) {
419
+ return;
420
+ }
415
421
  deferred.reject(marshal(context, e));
416
422
  context.runtime.executePendingJobs();
417
423
  });
@@ -449,9 +455,15 @@ function createReadableStream(context, stateMap, source) {
449
455
  if (result2 instanceof Promise) {
450
456
  const deferred = context.newPromise();
451
457
  result2.then(() => {
458
+ if (!context.alive) {
459
+ return;
460
+ }
452
461
  deferred.resolve(context.undefined);
453
462
  context.runtime.executePendingJobs();
454
463
  }).catch((e) => {
464
+ if (!context.alive) {
465
+ return;
466
+ }
455
467
  deferred.reject(marshal(context, e));
456
468
  context.runtime.executePendingJobs();
457
469
  });
@@ -469,9 +481,15 @@ function createReadableStream(context, stateMap, source) {
469
481
  if (result2 instanceof Promise) {
470
482
  const deferred = context.newPromise();
471
483
  result2.then(() => {
484
+ if (!context.alive) {
485
+ return;
486
+ }
472
487
  deferred.resolve(context.undefined);
473
488
  context.runtime.executePendingJobs();
474
489
  }).catch((e) => {
490
+ if (!context.alive) {
491
+ return;
492
+ }
475
493
  deferred.reject(marshal(context, e));
476
494
  context.runtime.executePendingJobs();
477
495
  });
@@ -554,4 +572,4 @@ export {
554
572
  consumeReadableStream
555
573
  };
556
574
 
557
- //# debugId=5EEB8B186C260DD864756E2164756E21
575
+ //# debugId=78C98CEA7918A21764756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/streams/readable-stream.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.mjs\";\nimport { defineClass, getState, getInstanceStateById } from \"../class-builder.mjs\";\nimport { marshal } from \"../marshal.mjs\";\nimport { unmarshal } from \"../unmarshal.mjs\";\n\ninterface ReadableStreamController {\n enqueue(chunk: unknown): void;\n close(): void;\n error(e: unknown): void;\n desiredSize: number | null;\n}\n\ninterface ReadableStreamInternalState {\n locked: boolean;\n controller: ReadableStreamController;\n reader: ReadableStreamReaderState | null;\n queue: unknown[];\n closeRequested: boolean;\n closed: boolean;\n errored: boolean;\n errorValue: unknown;\n pullPromise: { resolve: () => void; reject: (e: unknown) => void } | null;\n started: boolean;\n source?: {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n };\n}\n\ninterface ReadableStreamReaderState {\n stream: ReadableStreamInternalState;\n closed: boolean;\n closedPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n _closedPromise?: Promise<void>; // Lazy-created to avoid marshalling issues\n readRequests: Array<{\n resolve: (result: { value: unknown; done: boolean }) => void;\n reject: (e: unknown) => void;\n }>;\n}\n\n/**\n * Create the ReadableStreamDefaultReader class\n */\nexport function createReadableStreamDefaultReaderClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<ReadableStreamReaderState>(context, stateMap, {\n name: \"ReadableStreamDefaultReader\",\n construct: () => {\n // Note: Actual construction happens when getReader() is called\n // Promise is created lazily to avoid marshalling issues with handle cleanup\n let resolveClosedPromise: (() => void) | undefined;\n let rejectClosedPromise: ((e: unknown) => void) | undefined;\n\n const state: ReadableStreamReaderState = {\n stream: null as unknown as ReadableStreamInternalState,\n closed: false,\n closedPromiseResolvers: {\n resolve: () => resolveClosedPromise?.(),\n reject: (e) => rejectClosedPromise?.(e),\n },\n readRequests: [],\n };\n\n // Define _closedPromise as a lazy getter (won't be marshalled until accessed)\n Object.defineProperty(state, \"_closedPromise\", {\n value: undefined,\n writable: true,\n enumerable: false, // Don't include in marshalling\n });\n\n // Create promise accessor\n Object.defineProperty(state, \"getClosedPromise\", {\n value: function (this: ReadableStreamReaderState): Promise<void> {\n if (!this._closedPromise) {\n this._closedPromise = new Promise<void>((resolve, reject) => {\n resolveClosedPromise = resolve;\n rejectClosedPromise = reject;\n });\n }\n return this._closedPromise;\n },\n enumerable: false,\n });\n\n return state;\n },\n properties: {\n closed: {\n get(this: ReadableStreamReaderState) {\n // Use the lazy promise accessor\n return (this as unknown as { getClosedPromise: () => Promise<void> }).getClosedPromise();\n },\n },\n },\n methods: {\n read(this: ReadableStreamReaderState): Promise<{ value: unknown; done: boolean }> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n if (this.stream.locked === false) {\n return Promise.reject(new TypeError(\"Stream is not locked\"));\n }\n\n return new Promise((resolve, reject) => {\n // If there's something in the queue, return it\n if (this.stream.queue.length > 0) {\n const chunk = this.stream.queue.shift();\n resolve({ value: chunk, done: false });\n return;\n }\n\n // If stream is closed, return done\n if (this.stream.closed || this.stream.closeRequested) {\n resolve({ value: undefined, done: true });\n this.closedPromiseResolvers.resolve();\n return;\n }\n\n // If stream errored, reject\n if (this.stream.errored) {\n reject(this.stream.errorValue);\n return;\n }\n\n // Otherwise, queue the read request\n this.readRequests.push({ resolve, reject });\n\n // Try to pull more data\n if (this.stream.source?.pull && this.stream.started) {\n try {\n const pullResult = this.stream.source.pull(this.stream.controller);\n if (pullResult instanceof Promise) {\n pullResult.catch((e) => {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.readRequests.forEach((req) => req.reject(e));\n this.readRequests = [];\n });\n }\n } catch (e) {\n this.stream.errored = true;\n this.stream.errorValue = e;\n reject(e);\n }\n }\n });\n },\n cancel(this: ReadableStreamReaderState, reason?: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.stream.source?.cancel) {\n const result = this.stream.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n releaseLock(this: ReadableStreamReaderState): void {\n if (!this.stream) {\n return;\n }\n this.stream.locked = false;\n this.stream.reader = null;\n },\n },\n });\n}\n\n/**\n * Create the ReadableStream class\n */\nexport function createReadableStreamClass(\n context: QuickJSContext,\n stateMap: StateMap,\n readerClass: QuickJSHandle\n): QuickJSHandle {\n const classHandle = defineClass<ReadableStreamInternalState>(context, stateMap, {\n name: \"ReadableStream\",\n construct: (args) => {\n const underlyingSource = args[0] as {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n } | undefined;\n\n const state: ReadableStreamInternalState = {\n locked: false,\n controller: null as unknown as ReadableStreamController,\n reader: null,\n queue: [],\n closeRequested: false,\n closed: false,\n errored: false,\n errorValue: undefined,\n pullPromise: null,\n started: false,\n source: underlyingSource,\n };\n\n // Create controller\n state.controller = {\n enqueue(chunk: unknown) {\n if (state.closeRequested || state.closed) {\n throw new TypeError(\"Stream is closed\");\n }\n state.queue.push(chunk);\n\n // If there are pending read requests, fulfill them\n if (state.reader && state.reader.readRequests.length > 0) {\n const request = state.reader.readRequests.shift()!;\n const value = state.queue.shift();\n request.resolve({ value, done: false });\n }\n },\n close() {\n if (state.closeRequested || state.closed) {\n return;\n }\n state.closeRequested = true;\n\n if (state.queue.length === 0) {\n state.closed = true;\n if (state.reader) {\n state.reader.closedPromiseResolvers.resolve();\n // Resolve any pending reads with done: true\n state.reader.readRequests.forEach((req) => {\n req.resolve({ value: undefined, done: true });\n });\n state.reader.readRequests = [];\n }\n }\n },\n error(e: unknown) {\n if (state.errored || state.closed) {\n return;\n }\n state.errored = true;\n state.errorValue = e;\n\n if (state.reader) {\n state.reader.closedPromiseResolvers.reject(e);\n state.reader.readRequests.forEach((req) => req.reject(e));\n state.reader.readRequests = [];\n }\n },\n get desiredSize() {\n if (state.errored) return null;\n if (state.closeRequested) return 0;\n return 1 - state.queue.length;\n },\n };\n\n // Call start if provided\n if (underlyingSource?.start) {\n try {\n const startResult = underlyingSource.start(state.controller);\n if (startResult instanceof Promise) {\n startResult\n .then(() => {\n state.started = true;\n })\n .catch((e) => {\n state.errored = true;\n state.errorValue = e;\n });\n } else {\n state.started = true;\n }\n } catch (e) {\n state.errored = true;\n state.errorValue = e;\n }\n } else {\n state.started = true;\n }\n\n return state;\n },\n properties: {\n locked: {\n get(this: ReadableStreamInternalState) {\n return this.locked;\n },\n },\n },\n methods: {\n // __linkReader__ is called from JavaScript getReader() to link stream and reader states\n __linkReader__(this: ReadableStreamInternalState, readerObj: unknown): void {\n if (this.locked) {\n throw new TypeError(\"ReadableStream is locked\");\n }\n this.locked = true;\n\n // Get the reader's internal state from instanceStateMap\n const readerId = (readerObj as { __instanceId__: number }).__instanceId__;\n const readerState = getInstanceStateById<ReadableStreamReaderState>(readerId);\n if (!readerState) {\n throw new Error(\"Reader instance state not found\");\n }\n\n // Link bidirectionally\n readerState.stream = this;\n this.reader = readerState;\n },\n cancel(this: ReadableStreamInternalState, reason?: unknown): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot cancel a locked stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.source?.cancel) {\n const result = this.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.closed = true;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n // Note: pipeTo, pipeThrough, and tee are implemented as JavaScript code below\n },\n });\n\n // Add methods to the prototype that need to be JavaScript code\n // (because they need to create instances of other classes or call methods on them)\n const prototypeHandle = context.getProp(classHandle, \"prototype\");\n\n // Define getReader - must be JavaScript to return a ReadableStreamDefaultReader instance\n const getReaderCode = `(function() {\n // Create a reader instance\n const reader = new ReadableStreamDefaultReader();\n // Link it to this stream's internal state\n this.__linkReader__(reader);\n return reader;\n })`;\n const getReaderResult = context.evalCode(getReaderCode);\n if (!getReaderResult.error) {\n context.setProp(prototypeHandle, \"getReader\", getReaderResult.value);\n getReaderResult.value.dispose();\n } else {\n getReaderResult.error.dispose();\n }\n\n // Define pipeTo\n const pipeToCode = `(async function(destination, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (destination.locked) throw new TypeError(\"WritableStream is locked\");\n\n const reader = this.getReader();\n const writer = destination.getWriter();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n await writer.write(value);\n }\n if (!options.preventClose) await writer.close();\n } catch (error) {\n if (!options.preventAbort) await writer.abort(error);\n if (!options.preventCancel) await reader.cancel(error);\n throw error;\n } finally {\n reader.releaseLock();\n writer.releaseLock();\n }\n })`;\n const pipeToResult = context.evalCode(pipeToCode);\n if (!pipeToResult.error) {\n context.setProp(prototypeHandle, \"pipeTo\", pipeToResult.value);\n pipeToResult.value.dispose();\n } else {\n pipeToResult.error.dispose();\n }\n\n // Define pipeThrough\n const pipeThroughCode = `(function(transform, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (transform.writable.locked) throw new TypeError(\"WritableStream is locked\");\n\n // Start piping in background\n this.pipeTo(transform.writable, {\n preventClose: options.preventClose,\n preventAbort: options.preventAbort,\n preventCancel: options.preventCancel,\n signal: options.signal\n }).catch(() => {}); // Errors handled internally\n\n return transform.readable;\n })`;\n const pipeThroughResult = context.evalCode(pipeThroughCode);\n if (!pipeThroughResult.error) {\n context.setProp(prototypeHandle, \"pipeThrough\", pipeThroughResult.value);\n pipeThroughResult.value.dispose();\n } else {\n pipeThroughResult.error.dispose();\n }\n\n // Define tee - uses a closure that references ReadableStream, so we need to set it after global registration\n // For now, we'll set it on the prototype but the inner ReadableStream references will need to be resolved at runtime\n const teeCode = `(function() {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n\n const reader = this.getReader();\n let reading = false;\n let readAgain = false;\n let canceled1 = false, canceled2 = false;\n let reason1, reason2;\n let branch1Controller, branch2Controller;\n\n function pullAlgorithm() {\n if (reading) {\n readAgain = true;\n return Promise.resolve();\n }\n reading = true;\n\n return reader.read().then(({ value, done }) => {\n reading = false;\n if (done) {\n if (!canceled1 && branch1Controller) branch1Controller.close();\n if (!canceled2 && branch2Controller) branch2Controller.close();\n return;\n }\n if (!canceled1 && branch1Controller) branch1Controller.enqueue(value);\n if (!canceled2 && branch2Controller) branch2Controller.enqueue(value);\n if (readAgain) {\n readAgain = false;\n return pullAlgorithm();\n }\n });\n }\n\n const branch1 = new ReadableStream({\n start(controller) { branch1Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled1 = true;\n reason1 = reason;\n if (canceled2) reader.cancel(reason1);\n }\n });\n\n const branch2 = new ReadableStream({\n start(controller) { branch2Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled2 = true;\n reason2 = reason;\n if (canceled1) reader.cancel(reason2);\n }\n });\n\n return [branch1, branch2];\n })`;\n const teeResult = context.evalCode(teeCode);\n if (!teeResult.error) {\n context.setProp(prototypeHandle, \"tee\", teeResult.value);\n teeResult.value.dispose();\n } else {\n teeResult.error.dispose();\n }\n\n prototypeHandle.dispose();\n\n return classHandle;\n}\n\n/**\n * Create a ReadableStream in QuickJS from a host-side source\n */\nexport function createReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n source: UnderlyingSource\n): QuickJSHandle {\n // Create the source object with callbacks that will work in QuickJS\n const sourceObj = context.newObject();\n\n if (source.start) {\n const startFn = context.newFunction(\"start\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.start!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"start\", startFn);\n startFn.dispose();\n }\n\n if (source.pull) {\n const pullFn = context.newFunction(\"pull\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.pull!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"pull\", pullFn);\n pullFn.dispose();\n }\n\n if (source.cancel) {\n const cancelFn = context.newFunction(\"cancel\", (reasonHandle) => {\n const reason = unmarshal(context, reasonHandle);\n const result = source.cancel!(reason);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"cancel\", cancelFn);\n cancelFn.dispose();\n }\n\n // Create ReadableStream instance using evalCode to ensure 'new' is used\n // Store source on global temporarily\n context.setProp(context.global, \"__tempReadableStreamSource__\", sourceObj);\n sourceObj.dispose();\n\n // Create the stream and store source reference on it to prevent GC\n // The source object needs to stay alive because the host-side unmarshaled\n // functions hold references to QuickJS handles that would be GCed otherwise\n const result = context.evalCode(`\n (function() {\n const stream = new ReadableStream(__tempReadableStreamSource__);\n stream.__source__ = __tempReadableStreamSource__;\n return stream;\n })()\n `);\n\n // Clean up temp property\n const cleanupResult = context.evalCode(\"delete __tempReadableStreamSource__\");\n if (cleanupResult.error) cleanupResult.error.dispose();\n else cleanupResult.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create ReadableStream: ${errorMsg}`);\n }\n\n return result.value;\n}\n\n/**\n * Consume a ReadableStream from QuickJS in the host\n */\nexport async function* consumeReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n streamHandle: QuickJSHandle\n): AsyncIterable<unknown> {\n // Get reader\n const getReaderFn = context.getProp(streamHandle, \"getReader\");\n const readerResult = context.callFunction(getReaderFn, streamHandle);\n getReaderFn.dispose();\n\n if (readerResult.error) {\n const error = context.dump(readerResult.error);\n readerResult.error.dispose();\n throw new Error(`Failed to get reader: ${error}`);\n }\n\n const reader = readerResult.value;\n\n try {\n while (true) {\n const readFn = context.getProp(reader, \"read\");\n const readResult = context.callFunction(readFn, reader);\n readFn.dispose();\n\n if (readResult.error) {\n const error = context.dump(readResult.error);\n readResult.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n // Handle promise\n const resolved = await context.resolvePromise(readResult.value);\n readResult.value.dispose();\n context.runtime.executePendingJobs();\n\n if (resolved.error) {\n const error = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n const result = unmarshal(context, resolved.value) as { value: unknown; done: boolean };\n resolved.value.dispose();\n\n if (result.done) {\n break;\n }\n\n yield result.value;\n }\n } finally {\n const releaseLockFn = context.getProp(reader, \"releaseLock\");\n context.callFunction(releaseLockFn, reader);\n releaseLockFn.dispose();\n reader.dispose();\n }\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.mjs\";\nimport { defineClass, getState, getInstanceStateById } from \"../class-builder.mjs\";\nimport { marshal } from \"../marshal.mjs\";\nimport { unmarshal } from \"../unmarshal.mjs\";\n\ninterface ReadableStreamController {\n enqueue(chunk: unknown): void;\n close(): void;\n error(e: unknown): void;\n desiredSize: number | null;\n}\n\ninterface ReadableStreamInternalState {\n locked: boolean;\n controller: ReadableStreamController;\n reader: ReadableStreamReaderState | null;\n queue: unknown[];\n closeRequested: boolean;\n closed: boolean;\n errored: boolean;\n errorValue: unknown;\n pullPromise: { resolve: () => void; reject: (e: unknown) => void } | null;\n started: boolean;\n source?: {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n };\n}\n\ninterface ReadableStreamReaderState {\n stream: ReadableStreamInternalState;\n closed: boolean;\n closedPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n _closedPromise?: Promise<void>; // Lazy-created to avoid marshalling issues\n readRequests: Array<{\n resolve: (result: { value: unknown; done: boolean }) => void;\n reject: (e: unknown) => void;\n }>;\n}\n\n/**\n * Create the ReadableStreamDefaultReader class\n */\nexport function createReadableStreamDefaultReaderClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<ReadableStreamReaderState>(context, stateMap, {\n name: \"ReadableStreamDefaultReader\",\n construct: () => {\n // Note: Actual construction happens when getReader() is called\n // Promise is created lazily to avoid marshalling issues with handle cleanup\n let resolveClosedPromise: (() => void) | undefined;\n let rejectClosedPromise: ((e: unknown) => void) | undefined;\n\n const state: ReadableStreamReaderState = {\n stream: null as unknown as ReadableStreamInternalState,\n closed: false,\n closedPromiseResolvers: {\n resolve: () => resolveClosedPromise?.(),\n reject: (e) => rejectClosedPromise?.(e),\n },\n readRequests: [],\n };\n\n // Define _closedPromise as a lazy getter (won't be marshalled until accessed)\n Object.defineProperty(state, \"_closedPromise\", {\n value: undefined,\n writable: true,\n enumerable: false, // Don't include in marshalling\n });\n\n // Create promise accessor\n Object.defineProperty(state, \"getClosedPromise\", {\n value: function (this: ReadableStreamReaderState): Promise<void> {\n if (!this._closedPromise) {\n this._closedPromise = new Promise<void>((resolve, reject) => {\n resolveClosedPromise = resolve;\n rejectClosedPromise = reject;\n });\n }\n return this._closedPromise;\n },\n enumerable: false,\n });\n\n return state;\n },\n properties: {\n closed: {\n get(this: ReadableStreamReaderState) {\n // Use the lazy promise accessor\n return (this as unknown as { getClosedPromise: () => Promise<void> }).getClosedPromise();\n },\n },\n },\n methods: {\n read(this: ReadableStreamReaderState): Promise<{ value: unknown; done: boolean }> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n if (this.stream.locked === false) {\n return Promise.reject(new TypeError(\"Stream is not locked\"));\n }\n\n return new Promise((resolve, reject) => {\n // If there's something in the queue, return it\n if (this.stream.queue.length > 0) {\n const chunk = this.stream.queue.shift();\n resolve({ value: chunk, done: false });\n return;\n }\n\n // If stream is closed, return done\n if (this.stream.closed || this.stream.closeRequested) {\n resolve({ value: undefined, done: true });\n this.closedPromiseResolvers.resolve();\n return;\n }\n\n // If stream errored, reject\n if (this.stream.errored) {\n reject(this.stream.errorValue);\n return;\n }\n\n // Otherwise, queue the read request\n this.readRequests.push({ resolve, reject });\n\n // Try to pull more data\n if (this.stream.source?.pull && this.stream.started) {\n try {\n const pullResult = this.stream.source.pull(this.stream.controller);\n if (pullResult instanceof Promise) {\n pullResult.catch((e) => {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.readRequests.forEach((req) => req.reject(e));\n this.readRequests = [];\n });\n }\n } catch (e) {\n this.stream.errored = true;\n this.stream.errorValue = e;\n reject(e);\n }\n }\n });\n },\n cancel(this: ReadableStreamReaderState, reason?: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.stream.source?.cancel) {\n const result = this.stream.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n releaseLock(this: ReadableStreamReaderState): void {\n if (!this.stream) {\n return;\n }\n this.stream.locked = false;\n this.stream.reader = null;\n },\n },\n });\n}\n\n/**\n * Create the ReadableStream class\n */\nexport function createReadableStreamClass(\n context: QuickJSContext,\n stateMap: StateMap,\n readerClass: QuickJSHandle\n): QuickJSHandle {\n const classHandle = defineClass<ReadableStreamInternalState>(context, stateMap, {\n name: \"ReadableStream\",\n construct: (args) => {\n const underlyingSource = args[0] as {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n } | undefined;\n\n const state: ReadableStreamInternalState = {\n locked: false,\n controller: null as unknown as ReadableStreamController,\n reader: null,\n queue: [],\n closeRequested: false,\n closed: false,\n errored: false,\n errorValue: undefined,\n pullPromise: null,\n started: false,\n source: underlyingSource,\n };\n\n // Create controller\n state.controller = {\n enqueue(chunk: unknown) {\n if (state.closeRequested || state.closed) {\n throw new TypeError(\"Stream is closed\");\n }\n state.queue.push(chunk);\n\n // If there are pending read requests, fulfill them\n if (state.reader && state.reader.readRequests.length > 0) {\n const request = state.reader.readRequests.shift()!;\n const value = state.queue.shift();\n request.resolve({ value, done: false });\n }\n },\n close() {\n if (state.closeRequested || state.closed) {\n return;\n }\n state.closeRequested = true;\n\n if (state.queue.length === 0) {\n state.closed = true;\n if (state.reader) {\n state.reader.closedPromiseResolvers.resolve();\n // Resolve any pending reads with done: true\n state.reader.readRequests.forEach((req) => {\n req.resolve({ value: undefined, done: true });\n });\n state.reader.readRequests = [];\n }\n }\n },\n error(e: unknown) {\n if (state.errored || state.closed) {\n return;\n }\n state.errored = true;\n state.errorValue = e;\n\n if (state.reader) {\n state.reader.closedPromiseResolvers.reject(e);\n state.reader.readRequests.forEach((req) => req.reject(e));\n state.reader.readRequests = [];\n }\n },\n get desiredSize() {\n if (state.errored) return null;\n if (state.closeRequested) return 0;\n return 1 - state.queue.length;\n },\n };\n\n // Call start if provided\n if (underlyingSource?.start) {\n try {\n const startResult = underlyingSource.start(state.controller);\n if (startResult instanceof Promise) {\n startResult\n .then(() => {\n state.started = true;\n })\n .catch((e) => {\n state.errored = true;\n state.errorValue = e;\n });\n } else {\n state.started = true;\n }\n } catch (e) {\n state.errored = true;\n state.errorValue = e;\n }\n } else {\n state.started = true;\n }\n\n return state;\n },\n properties: {\n locked: {\n get(this: ReadableStreamInternalState) {\n return this.locked;\n },\n },\n },\n methods: {\n // __linkReader__ is called from JavaScript getReader() to link stream and reader states\n __linkReader__(this: ReadableStreamInternalState, readerObj: unknown): void {\n if (this.locked) {\n throw new TypeError(\"ReadableStream is locked\");\n }\n this.locked = true;\n\n // Get the reader's internal state from instanceStateMap\n const readerId = (readerObj as { __instanceId__: number }).__instanceId__;\n const readerState = getInstanceStateById<ReadableStreamReaderState>(readerId);\n if (!readerState) {\n throw new Error(\"Reader instance state not found\");\n }\n\n // Link bidirectionally\n readerState.stream = this;\n this.reader = readerState;\n },\n cancel(this: ReadableStreamInternalState, reason?: unknown): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot cancel a locked stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.source?.cancel) {\n const result = this.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.closed = true;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n // Note: pipeTo, pipeThrough, and tee are implemented as JavaScript code below\n },\n });\n\n // Add methods to the prototype that need to be JavaScript code\n // (because they need to create instances of other classes or call methods on them)\n const prototypeHandle = context.getProp(classHandle, \"prototype\");\n\n // Define getReader - must be JavaScript to return a ReadableStreamDefaultReader instance\n const getReaderCode = `(function() {\n // Create a reader instance\n const reader = new ReadableStreamDefaultReader();\n // Link it to this stream's internal state\n this.__linkReader__(reader);\n return reader;\n })`;\n const getReaderResult = context.evalCode(getReaderCode);\n if (!getReaderResult.error) {\n context.setProp(prototypeHandle, \"getReader\", getReaderResult.value);\n getReaderResult.value.dispose();\n } else {\n getReaderResult.error.dispose();\n }\n\n // Define pipeTo\n const pipeToCode = `(async function(destination, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (destination.locked) throw new TypeError(\"WritableStream is locked\");\n\n const reader = this.getReader();\n const writer = destination.getWriter();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n await writer.write(value);\n }\n if (!options.preventClose) await writer.close();\n } catch (error) {\n if (!options.preventAbort) await writer.abort(error);\n if (!options.preventCancel) await reader.cancel(error);\n throw error;\n } finally {\n reader.releaseLock();\n writer.releaseLock();\n }\n })`;\n const pipeToResult = context.evalCode(pipeToCode);\n if (!pipeToResult.error) {\n context.setProp(prototypeHandle, \"pipeTo\", pipeToResult.value);\n pipeToResult.value.dispose();\n } else {\n pipeToResult.error.dispose();\n }\n\n // Define pipeThrough\n const pipeThroughCode = `(function(transform, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (transform.writable.locked) throw new TypeError(\"WritableStream is locked\");\n\n // Start piping in background\n this.pipeTo(transform.writable, {\n preventClose: options.preventClose,\n preventAbort: options.preventAbort,\n preventCancel: options.preventCancel,\n signal: options.signal\n }).catch(() => {}); // Errors handled internally\n\n return transform.readable;\n })`;\n const pipeThroughResult = context.evalCode(pipeThroughCode);\n if (!pipeThroughResult.error) {\n context.setProp(prototypeHandle, \"pipeThrough\", pipeThroughResult.value);\n pipeThroughResult.value.dispose();\n } else {\n pipeThroughResult.error.dispose();\n }\n\n // Define tee - uses a closure that references ReadableStream, so we need to set it after global registration\n // For now, we'll set it on the prototype but the inner ReadableStream references will need to be resolved at runtime\n const teeCode = `(function() {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n\n const reader = this.getReader();\n let reading = false;\n let readAgain = false;\n let canceled1 = false, canceled2 = false;\n let reason1, reason2;\n let branch1Controller, branch2Controller;\n\n function pullAlgorithm() {\n if (reading) {\n readAgain = true;\n return Promise.resolve();\n }\n reading = true;\n\n return reader.read().then(({ value, done }) => {\n reading = false;\n if (done) {\n if (!canceled1 && branch1Controller) branch1Controller.close();\n if (!canceled2 && branch2Controller) branch2Controller.close();\n return;\n }\n if (!canceled1 && branch1Controller) branch1Controller.enqueue(value);\n if (!canceled2 && branch2Controller) branch2Controller.enqueue(value);\n if (readAgain) {\n readAgain = false;\n return pullAlgorithm();\n }\n });\n }\n\n const branch1 = new ReadableStream({\n start(controller) { branch1Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled1 = true;\n reason1 = reason;\n if (canceled2) reader.cancel(reason1);\n }\n });\n\n const branch2 = new ReadableStream({\n start(controller) { branch2Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled2 = true;\n reason2 = reason;\n if (canceled1) reader.cancel(reason2);\n }\n });\n\n return [branch1, branch2];\n })`;\n const teeResult = context.evalCode(teeCode);\n if (!teeResult.error) {\n context.setProp(prototypeHandle, \"tee\", teeResult.value);\n teeResult.value.dispose();\n } else {\n teeResult.error.dispose();\n }\n\n prototypeHandle.dispose();\n\n return classHandle;\n}\n\n/**\n * Create a ReadableStream in QuickJS from a host-side source\n */\nexport function createReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n source: UnderlyingSource\n): QuickJSHandle {\n // Create the source object with callbacks that will work in QuickJS\n const sourceObj = context.newObject();\n\n if (source.start) {\n const startFn = context.newFunction(\"start\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.start!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"start\", startFn);\n startFn.dispose();\n }\n\n if (source.pull) {\n const pullFn = context.newFunction(\"pull\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.pull!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"pull\", pullFn);\n pullFn.dispose();\n }\n\n if (source.cancel) {\n const cancelFn = context.newFunction(\"cancel\", (reasonHandle) => {\n const reason = unmarshal(context, reasonHandle);\n const result = source.cancel!(reason);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"cancel\", cancelFn);\n cancelFn.dispose();\n }\n\n // Create ReadableStream instance using evalCode to ensure 'new' is used\n // Store source on global temporarily\n context.setProp(context.global, \"__tempReadableStreamSource__\", sourceObj);\n sourceObj.dispose();\n\n // Create the stream and store source reference on it to prevent GC\n // The source object needs to stay alive because the host-side unmarshaled\n // functions hold references to QuickJS handles that would be GCed otherwise\n const result = context.evalCode(`\n (function() {\n const stream = new ReadableStream(__tempReadableStreamSource__);\n stream.__source__ = __tempReadableStreamSource__;\n return stream;\n })()\n `);\n\n // Clean up temp property\n const cleanupResult = context.evalCode(\"delete __tempReadableStreamSource__\");\n if (cleanupResult.error) cleanupResult.error.dispose();\n else cleanupResult.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create ReadableStream: ${errorMsg}`);\n }\n\n return result.value;\n}\n\n/**\n * Consume a ReadableStream from QuickJS in the host\n */\nexport async function* consumeReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n streamHandle: QuickJSHandle\n): AsyncIterable<unknown> {\n // Get reader\n const getReaderFn = context.getProp(streamHandle, \"getReader\");\n const readerResult = context.callFunction(getReaderFn, streamHandle);\n getReaderFn.dispose();\n\n if (readerResult.error) {\n const error = context.dump(readerResult.error);\n readerResult.error.dispose();\n throw new Error(`Failed to get reader: ${error}`);\n }\n\n const reader = readerResult.value;\n\n try {\n while (true) {\n const readFn = context.getProp(reader, \"read\");\n const readResult = context.callFunction(readFn, reader);\n readFn.dispose();\n\n if (readResult.error) {\n const error = context.dump(readResult.error);\n readResult.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n // Handle promise\n const resolved = await context.resolvePromise(readResult.value);\n readResult.value.dispose();\n context.runtime.executePendingJobs();\n\n if (resolved.error) {\n const error = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n const result = unmarshal(context, resolved.value) as { value: unknown; done: boolean };\n resolved.value.dispose();\n\n if (result.done) {\n break;\n }\n\n yield result.value;\n }\n } finally {\n const releaseLockFn = context.getProp(reader, \"releaseLock\");\n context.callFunction(releaseLockFn, reader);\n releaseLockFn.dispose();\n reader.dispose();\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "5EEB8B186C260DD864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "78C98CEA7918A21764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -380,9 +380,15 @@ function createWritableStream(context, stateMap, sink) {
380
380
  if (result2 instanceof Promise) {
381
381
  const deferred = context.newPromise();
382
382
  result2.then(() => {
383
+ if (!context.alive) {
384
+ return;
385
+ }
383
386
  deferred.resolve(context.undefined);
384
387
  context.runtime.executePendingJobs();
385
388
  }).catch((e) => {
389
+ if (!context.alive) {
390
+ return;
391
+ }
386
392
  deferred.reject(marshal(context, e));
387
393
  context.runtime.executePendingJobs();
388
394
  });
@@ -410,9 +416,15 @@ function createWritableStream(context, stateMap, sink) {
410
416
  if (result2 instanceof Promise) {
411
417
  const deferred = context.newPromise();
412
418
  result2.then(() => {
419
+ if (!context.alive) {
420
+ return;
421
+ }
413
422
  deferred.resolve(context.undefined);
414
423
  context.runtime.executePendingJobs();
415
424
  }).catch((e) => {
425
+ if (!context.alive) {
426
+ return;
427
+ }
416
428
  deferred.reject(marshal(context, e));
417
429
  context.runtime.executePendingJobs();
418
430
  });
@@ -429,9 +441,15 @@ function createWritableStream(context, stateMap, sink) {
429
441
  if (result2 instanceof Promise) {
430
442
  const deferred = context.newPromise();
431
443
  result2.then(() => {
444
+ if (!context.alive) {
445
+ return;
446
+ }
432
447
  deferred.resolve(context.undefined);
433
448
  context.runtime.executePendingJobs();
434
449
  }).catch((e) => {
450
+ if (!context.alive) {
451
+ return;
452
+ }
435
453
  deferred.reject(marshal(context, e));
436
454
  context.runtime.executePendingJobs();
437
455
  });
@@ -449,9 +467,15 @@ function createWritableStream(context, stateMap, sink) {
449
467
  if (result2 instanceof Promise) {
450
468
  const deferred = context.newPromise();
451
469
  result2.then(() => {
470
+ if (!context.alive) {
471
+ return;
472
+ }
452
473
  deferred.resolve(context.undefined);
453
474
  context.runtime.executePendingJobs();
454
475
  }).catch((e) => {
476
+ if (!context.alive) {
477
+ return;
478
+ }
455
479
  deferred.reject(marshal(context, e));
456
480
  context.runtime.executePendingJobs();
457
481
  });
@@ -479,4 +503,4 @@ export {
479
503
  createWritableStream
480
504
  };
481
505
 
482
- //# debugId=4988BE2712D0F31C64756E2164756E21
506
+ //# debugId=F0DE57112DA1517F64756E2164756E21