@ricsam/quickjs-core 0.2.7 → 0.2.9
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/dist/cjs/index.cjs +3 -1
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/index.mjs +6 -2
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -37,6 +37,7 @@ __export(exports_src, {
|
|
|
37
37
|
setState: () => import_class_builder2.setState,
|
|
38
38
|
setInstanceState: () => import_class_builder2.setInstanceState,
|
|
39
39
|
registerInstance: () => import_instance_state.registerInstance,
|
|
40
|
+
nextInstanceId: () => import_instance_state.nextInstanceId,
|
|
40
41
|
marshal: () => import_marshal.marshal,
|
|
41
42
|
isInstanceOf: () => import_class_helpers.isInstanceOf,
|
|
42
43
|
isHandle: () => import_marshal.isHandle,
|
|
@@ -63,6 +64,7 @@ __export(exports_src, {
|
|
|
63
64
|
consumeReadableStream: () => import_readable_stream2.consumeReadableStream,
|
|
64
65
|
clearAllInstanceState: () => import_class_builder2.clearAllInstanceState,
|
|
65
66
|
cleanupUnmarshaledHandles: () => import_unmarshal.cleanupUnmarshaledHandles,
|
|
67
|
+
cleanupInstanceStateById: () => import_instance_state.cleanupInstanceState,
|
|
66
68
|
cleanupInstanceState: () => import_class_builder2.cleanupInstanceState,
|
|
67
69
|
addURLSearchParamsGetter: () => import_url2.addURLSearchParamsGetter,
|
|
68
70
|
INTERNAL_STATE: () => import_types.INTERNAL_STATE
|
|
@@ -267,4 +269,4 @@ function setupCore(context, options) {
|
|
|
267
269
|
}
|
|
268
270
|
})
|
|
269
271
|
|
|
270
|
-
//# debugId=
|
|
272
|
+
//# debugId=009CAAFE3527D16B64756E2164756E21
|
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, 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 addURLSearchParamsGetter(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.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} from \"./class-helpers.cjs\";\nexport type { DefineClassInstance } from \"./class-helpers.cjs\";\n\n// Re-export instance state management\nexport {\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\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, addURLSearchParamsGetter } from \"./url.cjs\";\nexport type { URLState } from \"./url.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, 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 addURLSearchParamsGetter(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.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} from \"./class-helpers.cjs\";\nexport type { DefineClassInstance } 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, addURLSearchParamsGetter } from \"./url.cjs\";\nexport type { URLState } from \"./url.cjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "009CAAFE3527D16B64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
package/dist/mjs/index.mjs
CHANGED
|
@@ -40,9 +40,11 @@ import {
|
|
|
40
40
|
getClassName
|
|
41
41
|
} from "./class-helpers.mjs";
|
|
42
42
|
import {
|
|
43
|
+
nextInstanceId,
|
|
43
44
|
registerInstance,
|
|
44
45
|
getInstanceMetadata,
|
|
45
|
-
getInstanceClassName
|
|
46
|
+
getInstanceClassName,
|
|
47
|
+
cleanupInstanceState as cleanupInstanceState2
|
|
46
48
|
} from "./instance-state.mjs";
|
|
47
49
|
import {
|
|
48
50
|
createReadableStream as createReadableStream2,
|
|
@@ -235,6 +237,7 @@ export {
|
|
|
235
237
|
setState,
|
|
236
238
|
setInstanceState,
|
|
237
239
|
registerInstance,
|
|
240
|
+
nextInstanceId,
|
|
238
241
|
marshal,
|
|
239
242
|
isInstanceOf,
|
|
240
243
|
isHandle,
|
|
@@ -261,9 +264,10 @@ export {
|
|
|
261
264
|
consumeReadableStream,
|
|
262
265
|
clearAllInstanceState,
|
|
263
266
|
cleanupUnmarshaledHandles,
|
|
267
|
+
cleanupInstanceState2 as cleanupInstanceStateById,
|
|
264
268
|
cleanupInstanceState,
|
|
265
269
|
addURLSearchParamsGetter2 as addURLSearchParamsGetter,
|
|
266
270
|
INTERNAL_STATE
|
|
267
271
|
};
|
|
268
272
|
|
|
269
|
-
//# debugId=
|
|
273
|
+
//# debugId=3D07570CBCE54A4064756E2164756E21
|
package/dist/mjs/index.mjs.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.mjs\";\nimport { createStateMap } from \"./class-builder.mjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.mjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.mjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.mjs\";\nimport { createBlobClass } from \"./blob.mjs\";\nimport { createFileClass } from \"./file.mjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.mjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nimport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\n\n/**\n * Setup core APIs in a QuickJS context\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n *\n * @example\n * const handle = setupCore(context);\n *\n * context.evalCode(`\n * const blob = new Blob([\"hello\", \" \", \"world\"], { type: \"text/plain\" });\n * const text = await blob.text(); // \"hello world\"\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"chunk1\");\n * controller.enqueue(\"chunk2\");\n * controller.close();\n * }\n * });\n * `);\n */\nexport function setupCore(\n context: QuickJSContext,\n options?: SetupCoreOptions\n): CoreHandle {\n const stateMap = options?.stateMap ?? createStateMap();\n const handles: { name: string; handle: QuickJSHandle }[] = [];\n\n // Create ReadableStreamDefaultReader class first\n const ReadableStreamDefaultReader = createReadableStreamDefaultReaderClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"ReadableStreamDefaultReader\",\n ReadableStreamDefaultReader\n );\n ReadableStreamDefaultReader.dispose();\n\n // Create ReadableStream class\n const readerClassRef = context.getProp(context.global, \"ReadableStreamDefaultReader\");\n const ReadableStream = createReadableStreamClass(\n context,\n stateMap,\n readerClassRef\n );\n readerClassRef.dispose();\n context.setProp(context.global, \"ReadableStream\", ReadableStream);\n ReadableStream.dispose();\n\n // Create WritableStreamDefaultWriter class first\n const WritableStreamDefaultWriter = createWritableStreamDefaultWriterClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"WritableStreamDefaultWriter\",\n WritableStreamDefaultWriter\n );\n WritableStreamDefaultWriter.dispose();\n\n // Create WritableStream class\n const writerClassRef = context.getProp(context.global, \"WritableStreamDefaultWriter\");\n const WritableStream = createWritableStreamClass(\n context,\n stateMap,\n writerClassRef\n );\n writerClassRef.dispose();\n context.setProp(context.global, \"WritableStream\", WritableStream);\n WritableStream.dispose();\n\n // Create TransformStream class\n const TransformStream = createTransformStreamClass(context, stateMap);\n context.setProp(context.global, \"TransformStream\", TransformStream);\n TransformStream.dispose();\n\n // Create Blob class with stream factory\n const BlobClass = createBlobClass(context, stateMap, (source) =>\n createReadableStream(context, stateMap, source)\n );\n context.setProp(context.global, \"Blob\", BlobClass);\n BlobClass.dispose();\n\n // Create File class (extends Blob)\n const blobClassRef = context.getProp(context.global, \"Blob\");\n const FileClass = createFileClass(context, stateMap, blobClassRef);\n blobClassRef.dispose();\n context.setProp(context.global, \"File\", FileClass);\n FileClass.dispose();\n\n // Create DOMException class\n const DOMExceptionClass = createDOMExceptionClass(context, stateMap);\n context.setProp(context.global, \"DOMException\", DOMExceptionClass);\n DOMExceptionClass.dispose();\n\n // Create URLSearchParams class\n const URLSearchParamsClass = createURLSearchParamsClass(context, stateMap);\n context.setProp(context.global, \"URLSearchParams\", URLSearchParamsClass);\n URLSearchParamsClass.dispose();\n\n // Add Symbol.iterator support for URLSearchParams\n const urlSearchParamsIteratorResult = context.evalCode(`\n URLSearchParams.prototype[Symbol.iterator] = function() {\n return this.entries()[Symbol.iterator]();\n };\n `);\n if (urlSearchParamsIteratorResult.error) {\n urlSearchParamsIteratorResult.error.dispose();\n } else {\n urlSearchParamsIteratorResult.value.dispose();\n }\n\n // Create URL class (depends on URLSearchParams)\n const URLClass = createURLClass(context, stateMap);\n context.setProp(context.global, \"URL\", URLClass);\n URLClass.dispose();\n\n // Add searchParams getter to URL that returns URLSearchParams instance\n addURLSearchParamsGetter(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.mjs\";\nexport { INTERNAL_STATE } from \"./types.mjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.mjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.mjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.mjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.mjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.mjs\";\n\n// Re-export class instance helpers for cross-class access\nexport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n getInstanceId,\n getClassName,\n} from \"./class-helpers.mjs\";\nexport type { DefineClassInstance } from \"./class-helpers.mjs\";\n\n// Re-export instance state management\nexport {\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n} from \"./instance-state.mjs\";\nexport type { InstanceMetadata } from \"./instance-state.mjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.mjs\";\nexport { createWritableStream } from \"./streams/writable-stream.mjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.mjs\";\nexport { createFile } from \"./file.mjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.mjs\";\nexport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\nexport type { URLState } from \"./url.mjs\";\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { SetupCoreOptions, CoreHandle, StateMap } from \"./types.mjs\";\nimport { createStateMap } from \"./class-builder.mjs\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.mjs\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.mjs\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.mjs\";\nimport { createBlobClass } from \"./blob.mjs\";\nimport { createFileClass } from \"./file.mjs\";\nimport { createDOMExceptionClass } from \"./dom-exception.mjs\";\nimport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nimport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\n\n/**\n * Setup core APIs in a QuickJS context\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n *\n * @example\n * const handle = setupCore(context);\n *\n * context.evalCode(`\n * const blob = new Blob([\"hello\", \" \", \"world\"], { type: \"text/plain\" });\n * const text = await blob.text(); // \"hello world\"\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"chunk1\");\n * controller.enqueue(\"chunk2\");\n * controller.close();\n * }\n * });\n * `);\n */\nexport function setupCore(\n context: QuickJSContext,\n options?: SetupCoreOptions\n): CoreHandle {\n const stateMap = options?.stateMap ?? createStateMap();\n const handles: { name: string; handle: QuickJSHandle }[] = [];\n\n // Create ReadableStreamDefaultReader class first\n const ReadableStreamDefaultReader = createReadableStreamDefaultReaderClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"ReadableStreamDefaultReader\",\n ReadableStreamDefaultReader\n );\n ReadableStreamDefaultReader.dispose();\n\n // Create ReadableStream class\n const readerClassRef = context.getProp(context.global, \"ReadableStreamDefaultReader\");\n const ReadableStream = createReadableStreamClass(\n context,\n stateMap,\n readerClassRef\n );\n readerClassRef.dispose();\n context.setProp(context.global, \"ReadableStream\", ReadableStream);\n ReadableStream.dispose();\n\n // Create WritableStreamDefaultWriter class first\n const WritableStreamDefaultWriter = createWritableStreamDefaultWriterClass(\n context,\n stateMap\n );\n context.setProp(\n context.global,\n \"WritableStreamDefaultWriter\",\n WritableStreamDefaultWriter\n );\n WritableStreamDefaultWriter.dispose();\n\n // Create WritableStream class\n const writerClassRef = context.getProp(context.global, \"WritableStreamDefaultWriter\");\n const WritableStream = createWritableStreamClass(\n context,\n stateMap,\n writerClassRef\n );\n writerClassRef.dispose();\n context.setProp(context.global, \"WritableStream\", WritableStream);\n WritableStream.dispose();\n\n // Create TransformStream class\n const TransformStream = createTransformStreamClass(context, stateMap);\n context.setProp(context.global, \"TransformStream\", TransformStream);\n TransformStream.dispose();\n\n // Create Blob class with stream factory\n const BlobClass = createBlobClass(context, stateMap, (source) =>\n createReadableStream(context, stateMap, source)\n );\n context.setProp(context.global, \"Blob\", BlobClass);\n BlobClass.dispose();\n\n // Create File class (extends Blob)\n const blobClassRef = context.getProp(context.global, \"Blob\");\n const FileClass = createFileClass(context, stateMap, blobClassRef);\n blobClassRef.dispose();\n context.setProp(context.global, \"File\", FileClass);\n FileClass.dispose();\n\n // Create DOMException class\n const DOMExceptionClass = createDOMExceptionClass(context, stateMap);\n context.setProp(context.global, \"DOMException\", DOMExceptionClass);\n DOMExceptionClass.dispose();\n\n // Create URLSearchParams class\n const URLSearchParamsClass = createURLSearchParamsClass(context, stateMap);\n context.setProp(context.global, \"URLSearchParams\", URLSearchParamsClass);\n URLSearchParamsClass.dispose();\n\n // Add Symbol.iterator support for URLSearchParams\n const urlSearchParamsIteratorResult = context.evalCode(`\n URLSearchParams.prototype[Symbol.iterator] = function() {\n return this.entries()[Symbol.iterator]();\n };\n `);\n if (urlSearchParamsIteratorResult.error) {\n urlSearchParamsIteratorResult.error.dispose();\n } else {\n urlSearchParamsIteratorResult.value.dispose();\n }\n\n // Create URL class (depends on URLSearchParams)\n const URLClass = createURLClass(context, stateMap);\n context.setProp(context.global, \"URL\", URLClass);\n URLClass.dispose();\n\n // Add searchParams getter to URL that returns URLSearchParams instance\n addURLSearchParamsGetter(context);\n\n // TextEncoder/TextDecoder - pure JS implementation for UTF-8\n const textEncodingCode = `\n(function() {\n class TextEncoder {\n constructor(encoding = \"utf-8\") {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n }\n\n encode(input = \"\") {\n const str = String(input);\n const bytes = [];\n\n for (let i = 0; i < str.length; i++) {\n let charCode = str.charCodeAt(i);\n\n if (charCode < 0x80) {\n bytes.push(charCode);\n } else if (charCode < 0x800) {\n bytes.push(0xC0 | (charCode >> 6));\n bytes.push(0x80 | (charCode & 0x3F));\n } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n const nextCharCode = str.charCodeAt(++i);\n if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {\n const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);\n bytes.push(0xF0 | (codePoint >> 18));\n bytes.push(0x80 | ((codePoint >> 12) & 0x3F));\n bytes.push(0x80 | ((codePoint >> 6) & 0x3F));\n bytes.push(0x80 | (codePoint & 0x3F));\n }\n } else if (charCode < 0x10000) {\n bytes.push(0xE0 | (charCode >> 12));\n bytes.push(0x80 | ((charCode >> 6) & 0x3F));\n bytes.push(0x80 | (charCode & 0x3F));\n }\n }\n\n return new Uint8Array(bytes);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n destination.set(encoded.subarray(0, len));\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n constructor(encoding = \"utf-8\", options = {}) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new RangeError(\"The encoding label provided is invalid.\");\n }\n this.encoding = \"utf-8\";\n this.fatal = Boolean(options.fatal);\n this.ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n decode(input, options = {}) {\n if (!input) return \"\";\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else if (input instanceof Uint8Array) {\n bytes = input;\n } else {\n throw new TypeError(\"The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");\n }\n\n let offset = 0;\n if (!this.ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n offset = 3;\n }\n\n let result = \"\";\n for (let i = offset; i < bytes.length;) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++] & 0x3F;\n const byte3 = bytes[i++] & 0x3F;\n const byte4 = bytes[i++] & 0x3F;\n const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n const textEncodingResult = context.evalCode(textEncodingCode);\n if (textEncodingResult.error) {\n console.error(\"Failed to setup TextEncoder/TextDecoder\");\n textEncodingResult.error.dispose();\n } else {\n textEncodingResult.value.dispose();\n }\n\n /**\n * @returns CoreHandle with shared stateMap and dispose method\n *\n * **dispose() behavior:**\n * - Clears internal handle tracking array\n * - Does NOT dispose globals (ReadableStream, Blob, etc.) - they are owned\n * by context.global and cleaned up by context.dispose()\n * - Call before context.dispose() to release internal references\n *\n * @see PATTERNS.md for implementation patterns\n */\n return {\n stateMap,\n dispose() {\n // Note: handles set on global (ReadableStream, Blob, etc.) are NOT disposed here\n // They are owned by the global object and will be cleaned up by context.dispose()\n // Disposing them before context disposal causes QuickJS GC assertion failures\n handles.length = 0;\n },\n };\n}\n\n// Re-export types\nexport type {\n Scope,\n MarshalOptions,\n UnmarshalOptions,\n PropertyDescriptor,\n ClassDefinition,\n StateMap,\n SetupCoreOptions,\n CoreHandle,\n QuickJSContext,\n QuickJSHandle,\n QuickJSRuntime,\n} from \"./types.mjs\";\nexport { INTERNAL_STATE } from \"./types.mjs\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.mjs\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.mjs\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.mjs\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.mjs\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.mjs\";\n\n// Re-export class instance helpers for cross-class access\nexport {\n isDefineClassInstance,\n isInstanceOf,\n getClassInstanceState,\n getInstanceId,\n getClassName,\n} from \"./class-helpers.mjs\";\nexport type { DefineClassInstance } from \"./class-helpers.mjs\";\n\n// Re-export instance state management\nexport {\n nextInstanceId,\n registerInstance,\n getInstanceMetadata,\n getInstanceClassName,\n cleanupInstanceState as cleanupInstanceStateById,\n} from \"./instance-state.mjs\";\nexport type { InstanceMetadata } from \"./instance-state.mjs\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.mjs\";\nexport { createWritableStream } from \"./streams/writable-stream.mjs\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.mjs\";\nexport { createFile } from \"./file.mjs\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.mjs\";\nexport type { URLSearchParamsState } from \"./url-search-params.mjs\";\nexport { createURLClass, addURLSearchParamsGetter } from \"./url.mjs\";\nexport type { URLState } from \"./url.mjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AAgSA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAAA,oBAEE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAAA;AAAA;AAAA;AAAA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "3D07570CBCE54A4064756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ export { defineFunction, defineAsyncFunction } from "./function-builder.ts";
|
|
|
38
38
|
export { defineClass, createStateMap, getState, setState, getInstanceState, setInstanceState, getInstanceStateById, cleanupInstanceState, clearAllInstanceState, } from "./class-builder.ts";
|
|
39
39
|
export { isDefineClassInstance, isInstanceOf, getClassInstanceState, getInstanceId, getClassName, } from "./class-helpers.ts";
|
|
40
40
|
export type { DefineClassInstance } from "./class-helpers.ts";
|
|
41
|
-
export { registerInstance, getInstanceMetadata, getInstanceClassName, } from "./instance-state.ts";
|
|
41
|
+
export { nextInstanceId, registerInstance, getInstanceMetadata, getInstanceClassName, cleanupInstanceState as cleanupInstanceStateById, } from "./instance-state.ts";
|
|
42
42
|
export type { InstanceMetadata } from "./instance-state.ts";
|
|
43
43
|
export { createReadableStream, consumeReadableStream, } from "./streams/readable-stream.ts";
|
|
44
44
|
export { createWritableStream } from "./streams/writable-stream.ts";
|