@ricsam/quickjs-core 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -4
- package/dist/cjs/class-builder.cjs +7 -1
- package/dist/cjs/class-builder.cjs.map +3 -3
- package/dist/cjs/function-builder.cjs +190 -2
- package/dist/cjs/function-builder.cjs.map +3 -3
- package/dist/cjs/index.cjs +3 -1
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/marshal.cjs +13 -1
- package/dist/cjs/marshal.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/streams/readable-stream.cjs +19 -1
- package/dist/cjs/streams/readable-stream.cjs.map +3 -3
- package/dist/cjs/streams/writable-stream.cjs +25 -1
- package/dist/cjs/streams/writable-stream.cjs.map +3 -3
- package/dist/mjs/class-builder.mjs +7 -1
- package/dist/mjs/class-builder.mjs.map +3 -3
- package/dist/mjs/function-builder.mjs +190 -2
- package/dist/mjs/function-builder.mjs.map +3 -3
- package/dist/mjs/index.mjs +9 -2
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/marshal.mjs +13 -1
- package/dist/mjs/marshal.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/streams/readable-stream.mjs +19 -1
- package/dist/mjs/streams/readable-stream.mjs.map +3 -3
- package/dist/mjs/streams/writable-stream.mjs +25 -1
- package/dist/mjs/streams/writable-stream.mjs.map +3 -3
- package/dist/types/function-builder.d.ts +22 -0
- package/dist/types/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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.cjs\";\nimport { createStateMap } from \"./class-builder.cjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.cjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.cjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.cjs\";\nimport { createBlobClass } from \"./blob.cjs\";\nimport { createFileClass } from \"./file.cjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.cjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.cjs\";\nimport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.cjs\";\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.cjs\";\nexport { INTERNAL_STATE } from \"./types.cjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.cjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.cjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.cjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.cjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.cjs\";\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.cjs\";\nexport type { DefineClassInstance, TypedClassInstance } from \"./class-helpers.cjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.cjs\";\nexport type { InstanceMetadata } from \"./instance-state.cjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.cjs\";\nexport { createWritableStream } from \"./streams/writable-stream.cjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.cjs\";\nexport { createFile } from \"./file.cjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.cjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.cjs\";\nexport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.cjs\";\nexport type { URLState } from \"./url.cjs\";\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.cjs\";\nexport type {\n Coercer,\n CoercionResult,\n URLCoerced,\n HeadersCoerced,\n RequestInitCoerced,\n ResponseInitCoerced,\n} from \"./coerce.cjs\";\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { SetupCoreOptions, CoreHandle, StateMap } from \"./types.cjs\";\nimport { createStateMap } from \"./class-builder.cjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.cjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.cjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.cjs\";\nimport { createBlobClass } from \"./blob.cjs\";\nimport { createFileClass } from \"./file.cjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.cjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.cjs\";\nimport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.cjs\";\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.cjs\";\nexport { INTERNAL_STATE } from \"./types.cjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.cjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.cjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.cjs\";\nexport {\n defineFunction,\n defineAsyncFunction,\n defineAsyncIteratorFunction,\n cleanupAsyncIterators,\n} from \"./function-builder.cjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.cjs\";\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.cjs\";\nexport type { DefineClassInstance, TypedClassInstance } from \"./class-helpers.cjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.cjs\";\nexport type { InstanceMetadata } from \"./instance-state.cjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.cjs\";\nexport { createWritableStream } from \"./streams/writable-stream.cjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.cjs\";\nexport { createFile } from \"./file.cjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.cjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.cjs\";\nexport { createURLClass, addURLSearchParamsLinkage, addURLSearchParamsGetter } from \"./url.cjs\";\nexport type { URLState } from \"./url.cjs\";\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.cjs\";\nexport type {\n Coercer,\n CoercionResult,\n URLCoerced,\n HeadersCoerced,\n RequestInitCoerced,\n ResponseInitCoerced,\n} from \"./coerce.cjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE+B,IAA/B;AAKO,IAJP;AAQO,IAHP;AAI2C,IAA3C;AACgC,IAAhC;AACgC,IAAhC;AACwC,IAAxC;AAC2C,IAA3C;AACoF,IAApF;AAiS+B,IAA/B;AAG0C,IAA1C;AACiD,IAAjD;AACqD,IAArD;AAMO,IALP;AAgBO,IAVP;AAwBO,IAXP;AAqBO,IANP;AAaO,IAHP;AAIqC,IAArC;AAG2B,IAA3B;AAC2B,IAA3B;AAG2C,IAA3C;AAEoF,IAApF;AAcO,IAVP;AAtUO,SAAS,SAAS,CACvB,SACA,SACY;AAAA,EACZ,MAAM,WAAW,SAAS,YAAY,oCAAe;AAAA,EACrD,MAAM,UAAqD,CAAC;AAAA,EAG5D,MAAM,8BAA8B,8DAClC,SACA,QACF;AAAA,EACA,QAAQ,QACN,QAAQ,QACR,+BACA,2BACF;AAAA,EACA,4BAA4B,QAAQ;AAAA,EAGpC,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,QAAQ,6BAA6B;AAAA,EACpF,MAAM,iBAAiB,iDACrB,SACA,UACA,cACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,cAAc;AAAA,EAChE,eAAe,QAAQ;AAAA,EAGvB,MAAM,8BAA8B,8DAClC,SACA,QACF;AAAA,EACA,QAAQ,QACN,QAAQ,QACR,+BACA,2BACF;AAAA,EACA,4BAA4B,QAAQ;AAAA,EAGpC,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,QAAQ,6BAA6B;AAAA,EACpF,MAAM,iBAAiB,iDACrB,SACA,UACA,cACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,cAAc;AAAA,EAChE,eAAe,QAAQ;AAAA,EAGvB,MAAM,kBAAkB,mDAA2B,SAAS,QAAQ;AAAA,EACpE,QAAQ,QAAQ,QAAQ,QAAQ,mBAAmB,eAAe;AAAA,EAClE,gBAAgB,QAAQ;AAAA,EAGxB,MAAM,YAAY,4BAAgB,SAAS,UAAU,CAAC,WACpD,4CAAqB,SAAS,UAAU,MAAM,CAChD;AAAA,EACA,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EACjD,UAAU,QAAQ;AAAA,EAGlB,MAAM,eAAe,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAAA,EAC3D,MAAM,YAAY,4BAAgB,SAAS,UAAU,YAAY;AAAA,EACjE,aAAa,QAAQ;AAAA,EACrB,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EACjD,UAAU,QAAQ;AAAA,EAGlB,MAAM,oBAAoB,6CAAwB,SAAS,QAAQ;AAAA,EACnE,QAAQ,QAAQ,QAAQ,QAAQ,gBAAgB,iBAAiB;AAAA,EACjE,kBAAkB,QAAQ;AAAA,EAG1B,MAAM,uBAAuB,oDAA2B,SAAS,QAAQ;AAAA,EACzE,QAAQ,QAAQ,QAAQ,QAAQ,mBAAmB,oBAAoB;AAAA,EACvE,qBAAqB,QAAQ;AAAA,EAG7B,MAAM,gCAAgC,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,GAItD;AAAA,EACD,IAAI,8BAA8B,OAAO;AAAA,IACvC,8BAA8B,MAAM,QAAQ;AAAA,EAC9C,EAAO;AAAA,IACL,8BAA8B,MAAM,QAAQ;AAAA;AAAA,EAI9C,MAAM,WAAW,0BAAe,SAAS,QAAQ;AAAA,EACjD,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AAAA,EAC/C,SAAS,QAAQ;AAAA,EAIjB,qCAA0B,OAAO;AAAA,EAGjC,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+GzB,MAAM,qBAAqB,QAAQ,SAAS,gBAAgB;AAAA,EAC5D,IAAI,mBAAmB,OAAO;AAAA,IAC5B,QAAQ,MAAM,yCAAyC;AAAA,IACvD,mBAAmB,MAAM,QAAQ;AAAA,EACnC,EAAO;AAAA,IACL,mBAAmB,MAAM,QAAQ;AAAA;AAAA,EAcnC,OAAO;AAAA,IACL;AAAA,IACA,OAAO,GAAG;AAAA,MAIR,QAAQ,SAAS;AAAA;AAAA,EAErB;AAAA;",
|
|
8
|
+
"debugId": "2704213322BFE26C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/marshal.cjs
CHANGED
|
@@ -124,11 +124,17 @@ function marshal(context, value, options = {}) {
|
|
|
124
124
|
if (val instanceof Promise) {
|
|
125
125
|
const deferred = context.newPromise();
|
|
126
126
|
val.then((resolved) => {
|
|
127
|
+
if (!context.alive) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
127
130
|
const resolvedHandle = marshalValue(resolved, depth + 1);
|
|
128
131
|
deferred.resolve(resolvedHandle);
|
|
129
132
|
resolvedHandle.dispose();
|
|
130
133
|
context.runtime.executePendingJobs();
|
|
131
134
|
}).catch((error) => {
|
|
135
|
+
if (!context.alive) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
132
138
|
const errorHandle = marshalValue(error instanceof Error ? { name: error.name, message: error.message } : error, depth + 1);
|
|
133
139
|
deferred.reject(errorHandle);
|
|
134
140
|
errorHandle.dispose();
|
|
@@ -164,11 +170,17 @@ function marshal(context, value, options = {}) {
|
|
|
164
170
|
if (result instanceof Promise) {
|
|
165
171
|
const deferred = context.newPromise();
|
|
166
172
|
result.then((resolved) => {
|
|
173
|
+
if (!context.alive) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
167
176
|
const resolvedHandle = marshalValue(resolved, depth + 1);
|
|
168
177
|
deferred.resolve(resolvedHandle);
|
|
169
178
|
resolvedHandle.dispose();
|
|
170
179
|
context.runtime.executePendingJobs();
|
|
171
180
|
}).catch((error) => {
|
|
181
|
+
if (!context.alive) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
172
184
|
const errorHandle = marshalValue(error instanceof Error ? { name: error.name, message: error.message } : error, depth + 1);
|
|
173
185
|
deferred.reject(errorHandle);
|
|
174
186
|
errorHandle.dispose();
|
|
@@ -188,4 +200,4 @@ function marshal(context, value, options = {}) {
|
|
|
188
200
|
}
|
|
189
201
|
})
|
|
190
202
|
|
|
191
|
-
//# debugId=
|
|
203
|
+
//# debugId=9E0D14C14C57F52264756E2164756E21
|
package/dist/cjs/marshal.cjs.map
CHANGED
|
@@ -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.cjs\";\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.cjs\";\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": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "9E0D14C14C57F52264756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -445,9 +445,15 @@ function createReadableStream(context, stateMap, source) {
|
|
|
445
445
|
if (result2 instanceof Promise) {
|
|
446
446
|
const deferred = context.newPromise();
|
|
447
447
|
result2.then(() => {
|
|
448
|
+
if (!context.alive) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
448
451
|
deferred.resolve(context.undefined);
|
|
449
452
|
context.runtime.executePendingJobs();
|
|
450
453
|
}).catch((e) => {
|
|
454
|
+
if (!context.alive) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
451
457
|
deferred.reject(import_marshal.marshal(context, e));
|
|
452
458
|
context.runtime.executePendingJobs();
|
|
453
459
|
});
|
|
@@ -485,9 +491,15 @@ function createReadableStream(context, stateMap, source) {
|
|
|
485
491
|
if (result2 instanceof Promise) {
|
|
486
492
|
const deferred = context.newPromise();
|
|
487
493
|
result2.then(() => {
|
|
494
|
+
if (!context.alive) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
488
497
|
deferred.resolve(context.undefined);
|
|
489
498
|
context.runtime.executePendingJobs();
|
|
490
499
|
}).catch((e) => {
|
|
500
|
+
if (!context.alive) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
491
503
|
deferred.reject(import_marshal.marshal(context, e));
|
|
492
504
|
context.runtime.executePendingJobs();
|
|
493
505
|
});
|
|
@@ -505,9 +517,15 @@ function createReadableStream(context, stateMap, source) {
|
|
|
505
517
|
if (result2 instanceof Promise) {
|
|
506
518
|
const deferred = context.newPromise();
|
|
507
519
|
result2.then(() => {
|
|
520
|
+
if (!context.alive) {
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
508
523
|
deferred.resolve(context.undefined);
|
|
509
524
|
context.runtime.executePendingJobs();
|
|
510
525
|
}).catch((e) => {
|
|
526
|
+
if (!context.alive) {
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
511
529
|
deferred.reject(import_marshal.marshal(context, e));
|
|
512
530
|
context.runtime.executePendingJobs();
|
|
513
531
|
});
|
|
@@ -585,4 +603,4 @@ async function* consumeReadableStream(context, stateMap, streamHandle) {
|
|
|
585
603
|
}
|
|
586
604
|
})
|
|
587
605
|
|
|
588
|
-
//# debugId=
|
|
606
|
+
//# debugId=DFF6E9EAFF30783364756E2164756E21
|
|
@@ -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.cjs\";\nimport { defineClass, getState, getInstanceStateById } from \"../class-builder.cjs\";\nimport { marshal } from \"../marshal.cjs\";\nimport { unmarshal } from \"../unmarshal.cjs\";\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.cjs\";\nimport { defineClass, getState, getInstanceStateById } from \"../class-builder.cjs\";\nimport { marshal } from \"../marshal.cjs\";\nimport { unmarshal } from \"../unmarshal.cjs\";\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": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "DFF6E9EAFF30783364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -415,9 +415,15 @@ function createWritableStream(context, stateMap, sink) {
|
|
|
415
415
|
if (result2 instanceof Promise) {
|
|
416
416
|
const deferred = context.newPromise();
|
|
417
417
|
result2.then(() => {
|
|
418
|
+
if (!context.alive) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
418
421
|
deferred.resolve(context.undefined);
|
|
419
422
|
context.runtime.executePendingJobs();
|
|
420
423
|
}).catch((e) => {
|
|
424
|
+
if (!context.alive) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
421
427
|
deferred.reject(import_marshal.marshal(context, e));
|
|
422
428
|
context.runtime.executePendingJobs();
|
|
423
429
|
});
|
|
@@ -445,9 +451,15 @@ function createWritableStream(context, stateMap, sink) {
|
|
|
445
451
|
if (result2 instanceof Promise) {
|
|
446
452
|
const deferred = context.newPromise();
|
|
447
453
|
result2.then(() => {
|
|
454
|
+
if (!context.alive) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
448
457
|
deferred.resolve(context.undefined);
|
|
449
458
|
context.runtime.executePendingJobs();
|
|
450
459
|
}).catch((e) => {
|
|
460
|
+
if (!context.alive) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
451
463
|
deferred.reject(import_marshal.marshal(context, e));
|
|
452
464
|
context.runtime.executePendingJobs();
|
|
453
465
|
});
|
|
@@ -464,9 +476,15 @@ function createWritableStream(context, stateMap, sink) {
|
|
|
464
476
|
if (result2 instanceof Promise) {
|
|
465
477
|
const deferred = context.newPromise();
|
|
466
478
|
result2.then(() => {
|
|
479
|
+
if (!context.alive) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
467
482
|
deferred.resolve(context.undefined);
|
|
468
483
|
context.runtime.executePendingJobs();
|
|
469
484
|
}).catch((e) => {
|
|
485
|
+
if (!context.alive) {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
470
488
|
deferred.reject(import_marshal.marshal(context, e));
|
|
471
489
|
context.runtime.executePendingJobs();
|
|
472
490
|
});
|
|
@@ -484,9 +502,15 @@ function createWritableStream(context, stateMap, sink) {
|
|
|
484
502
|
if (result2 instanceof Promise) {
|
|
485
503
|
const deferred = context.newPromise();
|
|
486
504
|
result2.then(() => {
|
|
505
|
+
if (!context.alive) {
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
487
508
|
deferred.resolve(context.undefined);
|
|
488
509
|
context.runtime.executePendingJobs();
|
|
489
510
|
}).catch((e) => {
|
|
511
|
+
if (!context.alive) {
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
490
514
|
deferred.reject(import_marshal.marshal(context, e));
|
|
491
515
|
context.runtime.executePendingJobs();
|
|
492
516
|
});
|
|
@@ -510,4 +534,4 @@ function createWritableStream(context, stateMap, sink) {
|
|
|
510
534
|
}
|
|
511
535
|
})
|
|
512
536
|
|
|
513
|
-
//# debugId=
|
|
537
|
+
//# debugId=84867542B7FDE57C64756E2164756E21
|