@ricsam/quickjs-core 0.2.5 → 0.2.7

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.
@@ -141,6 +141,123 @@ function setupCore(context, options) {
141
141
  context.setProp(context.global, "URL", URLClass);
142
142
  URLClass.dispose();
143
143
  import_url.addURLSearchParamsGetter(context);
144
+ const textEncodingCode = `
145
+ (function() {
146
+ class TextEncoder {
147
+ constructor(encoding = "utf-8") {
148
+ if (encoding !== "utf-8" && encoding !== "utf8") {
149
+ throw new RangeError("The encoding label provided is invalid.");
150
+ }
151
+ this.encoding = "utf-8";
152
+ }
153
+
154
+ encode(input = "") {
155
+ const str = String(input);
156
+ const bytes = [];
157
+
158
+ for (let i = 0; i < str.length; i++) {
159
+ let charCode = str.charCodeAt(i);
160
+
161
+ if (charCode < 0x80) {
162
+ bytes.push(charCode);
163
+ } else if (charCode < 0x800) {
164
+ bytes.push(0xC0 | (charCode >> 6));
165
+ bytes.push(0x80 | (charCode & 0x3F));
166
+ } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {
167
+ const nextCharCode = str.charCodeAt(++i);
168
+ if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {
169
+ const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);
170
+ bytes.push(0xF0 | (codePoint >> 18));
171
+ bytes.push(0x80 | ((codePoint >> 12) & 0x3F));
172
+ bytes.push(0x80 | ((codePoint >> 6) & 0x3F));
173
+ bytes.push(0x80 | (codePoint & 0x3F));
174
+ }
175
+ } else if (charCode < 0x10000) {
176
+ bytes.push(0xE0 | (charCode >> 12));
177
+ bytes.push(0x80 | ((charCode >> 6) & 0x3F));
178
+ bytes.push(0x80 | (charCode & 0x3F));
179
+ }
180
+ }
181
+
182
+ return new Uint8Array(bytes);
183
+ }
184
+
185
+ encodeInto(source, destination) {
186
+ const encoded = this.encode(source);
187
+ const len = Math.min(encoded.length, destination.length);
188
+ destination.set(encoded.subarray(0, len));
189
+ return { read: source.length, written: len };
190
+ }
191
+ }
192
+
193
+ class TextDecoder {
194
+ constructor(encoding = "utf-8", options = {}) {
195
+ if (encoding !== "utf-8" && encoding !== "utf8") {
196
+ throw new RangeError("The encoding label provided is invalid.");
197
+ }
198
+ this.encoding = "utf-8";
199
+ this.fatal = Boolean(options.fatal);
200
+ this.ignoreBOM = Boolean(options.ignoreBOM);
201
+ }
202
+
203
+ decode(input, options = {}) {
204
+ if (!input) return "";
205
+
206
+ let bytes;
207
+ if (input instanceof ArrayBuffer) {
208
+ bytes = new Uint8Array(input);
209
+ } else if (ArrayBuffer.isView(input)) {
210
+ bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
211
+ } else if (input instanceof Uint8Array) {
212
+ bytes = input;
213
+ } else {
214
+ throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");
215
+ }
216
+
217
+ let offset = 0;
218
+ if (!this.ignoreBOM && bytes.length >= 3 &&
219
+ bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {
220
+ offset = 3;
221
+ }
222
+
223
+ let result = "";
224
+ for (let i = offset; i < bytes.length;) {
225
+ const byte1 = bytes[i++];
226
+
227
+ if (byte1 < 0x80) {
228
+ result += String.fromCharCode(byte1);
229
+ } else if ((byte1 & 0xE0) === 0xC0) {
230
+ const byte2 = bytes[i++] & 0x3F;
231
+ result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);
232
+ } else if ((byte1 & 0xF0) === 0xE0) {
233
+ const byte2 = bytes[i++] & 0x3F;
234
+ const byte3 = bytes[i++] & 0x3F;
235
+ result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);
236
+ } else if ((byte1 & 0xF8) === 0xF0) {
237
+ const byte2 = bytes[i++] & 0x3F;
238
+ const byte3 = bytes[i++] & 0x3F;
239
+ const byte4 = bytes[i++] & 0x3F;
240
+ const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;
241
+ const adjusted = codePoint - 0x10000;
242
+ result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));
243
+ }
244
+ }
245
+
246
+ return result;
247
+ }
248
+ }
249
+
250
+ globalThis.TextEncoder = TextEncoder;
251
+ globalThis.TextDecoder = TextDecoder;
252
+ })();
253
+ `;
254
+ const textEncodingResult = context.evalCode(textEncodingCode);
255
+ if (textEncodingResult.error) {
256
+ console.error("Failed to setup TextEncoder/TextDecoder");
257
+ textEncodingResult.error.dispose();
258
+ } else {
259
+ textEncodingResult.value.dispose();
260
+ }
144
261
  return {
145
262
  stateMap,
146
263
  dispose() {
@@ -150,4 +267,4 @@ function setupCore(context, options) {
150
267
  }
151
268
  })
152
269
 
153
- //# debugId=7FA53CB39928EA5A64756E2164756E21
270
+ //# debugId=6F666645328DADC864756E2164756E21
@@ -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 *\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 /**\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 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"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "7FA53CB39928EA5A64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "6F666645328DADC864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "type": "commonjs"
5
5
  }
@@ -103,6 +103,123 @@ function setupCore(context, options) {
103
103
  context.setProp(context.global, "URL", URLClass);
104
104
  URLClass.dispose();
105
105
  addURLSearchParamsGetter(context);
106
+ const textEncodingCode = `
107
+ (function() {
108
+ class TextEncoder {
109
+ constructor(encoding = "utf-8") {
110
+ if (encoding !== "utf-8" && encoding !== "utf8") {
111
+ throw new RangeError("The encoding label provided is invalid.");
112
+ }
113
+ this.encoding = "utf-8";
114
+ }
115
+
116
+ encode(input = "") {
117
+ const str = String(input);
118
+ const bytes = [];
119
+
120
+ for (let i = 0; i < str.length; i++) {
121
+ let charCode = str.charCodeAt(i);
122
+
123
+ if (charCode < 0x80) {
124
+ bytes.push(charCode);
125
+ } else if (charCode < 0x800) {
126
+ bytes.push(0xC0 | (charCode >> 6));
127
+ bytes.push(0x80 | (charCode & 0x3F));
128
+ } else if (charCode >= 0xD800 && charCode <= 0xDBFF) {
129
+ const nextCharCode = str.charCodeAt(++i);
130
+ if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) {
131
+ const codePoint = 0x10000 + ((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00);
132
+ bytes.push(0xF0 | (codePoint >> 18));
133
+ bytes.push(0x80 | ((codePoint >> 12) & 0x3F));
134
+ bytes.push(0x80 | ((codePoint >> 6) & 0x3F));
135
+ bytes.push(0x80 | (codePoint & 0x3F));
136
+ }
137
+ } else if (charCode < 0x10000) {
138
+ bytes.push(0xE0 | (charCode >> 12));
139
+ bytes.push(0x80 | ((charCode >> 6) & 0x3F));
140
+ bytes.push(0x80 | (charCode & 0x3F));
141
+ }
142
+ }
143
+
144
+ return new Uint8Array(bytes);
145
+ }
146
+
147
+ encodeInto(source, destination) {
148
+ const encoded = this.encode(source);
149
+ const len = Math.min(encoded.length, destination.length);
150
+ destination.set(encoded.subarray(0, len));
151
+ return { read: source.length, written: len };
152
+ }
153
+ }
154
+
155
+ class TextDecoder {
156
+ constructor(encoding = "utf-8", options = {}) {
157
+ if (encoding !== "utf-8" && encoding !== "utf8") {
158
+ throw new RangeError("The encoding label provided is invalid.");
159
+ }
160
+ this.encoding = "utf-8";
161
+ this.fatal = Boolean(options.fatal);
162
+ this.ignoreBOM = Boolean(options.ignoreBOM);
163
+ }
164
+
165
+ decode(input, options = {}) {
166
+ if (!input) return "";
167
+
168
+ let bytes;
169
+ if (input instanceof ArrayBuffer) {
170
+ bytes = new Uint8Array(input);
171
+ } else if (ArrayBuffer.isView(input)) {
172
+ bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
173
+ } else if (input instanceof Uint8Array) {
174
+ bytes = input;
175
+ } else {
176
+ throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");
177
+ }
178
+
179
+ let offset = 0;
180
+ if (!this.ignoreBOM && bytes.length >= 3 &&
181
+ bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {
182
+ offset = 3;
183
+ }
184
+
185
+ let result = "";
186
+ for (let i = offset; i < bytes.length;) {
187
+ const byte1 = bytes[i++];
188
+
189
+ if (byte1 < 0x80) {
190
+ result += String.fromCharCode(byte1);
191
+ } else if ((byte1 & 0xE0) === 0xC0) {
192
+ const byte2 = bytes[i++] & 0x3F;
193
+ result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2);
194
+ } else if ((byte1 & 0xF0) === 0xE0) {
195
+ const byte2 = bytes[i++] & 0x3F;
196
+ const byte3 = bytes[i++] & 0x3F;
197
+ result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3);
198
+ } else if ((byte1 & 0xF8) === 0xF0) {
199
+ const byte2 = bytes[i++] & 0x3F;
200
+ const byte3 = bytes[i++] & 0x3F;
201
+ const byte4 = bytes[i++] & 0x3F;
202
+ const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4;
203
+ const adjusted = codePoint - 0x10000;
204
+ result += String.fromCharCode(0xD800 + (adjusted >> 10), 0xDC00 + (adjusted & 0x3FF));
205
+ }
206
+ }
207
+
208
+ return result;
209
+ }
210
+ }
211
+
212
+ globalThis.TextEncoder = TextEncoder;
213
+ globalThis.TextDecoder = TextDecoder;
214
+ })();
215
+ `;
216
+ const textEncodingResult = context.evalCode(textEncodingCode);
217
+ if (textEncodingResult.error) {
218
+ console.error("Failed to setup TextEncoder/TextDecoder");
219
+ textEncodingResult.error.dispose();
220
+ } else {
221
+ textEncodingResult.value.dispose();
222
+ }
106
223
  return {
107
224
  stateMap,
108
225
  dispose() {
@@ -149,4 +266,4 @@ export {
149
266
  INTERNAL_STATE
150
267
  };
151
268
 
152
- //# debugId=53BFBF531ADB270764756E2164756E21
269
+ //# debugId=0C9A30DCF100FBA764756E2164756E21
@@ -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 *\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 /**\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 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"
6
6
  ],
7
- "mappings": ";;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AAuKA;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;AAQA;AAAA,0BACE;AAAA;AAAA;AAGF;AAGA;AACA;AAGA,uCAAS;AAET,2BAAS,6CAAgB;AA7LlB,SAAS,SAAS,CACvB,SACA,SACY;AAAA,EACZ,MAAM,WAAW,SAAS,YAAY,eAAe;AAAA,EACrD,MAAM,UAAqD,CAAC;AAAA,EAG5D,MAAM,8BAA8B,uCAClC,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,0BACrB,SACA,UACA,cACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,cAAc;AAAA,EAChE,eAAe,QAAQ;AAAA,EAGvB,MAAM,8BAA8B,uCAClC,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,0BACrB,SACA,UACA,cACF;AAAA,EACA,eAAe,QAAQ;AAAA,EACvB,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,cAAc;AAAA,EAChE,eAAe,QAAQ;AAAA,EAGvB,MAAM,kBAAkB,2BAA2B,SAAS,QAAQ;AAAA,EACpE,QAAQ,QAAQ,QAAQ,QAAQ,mBAAmB,eAAe;AAAA,EAClE,gBAAgB,QAAQ;AAAA,EAGxB,MAAM,YAAY,gBAAgB,SAAS,UAAU,CAAC,WACpD,qBAAqB,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,gBAAgB,SAAS,UAAU,YAAY;AAAA,EACjE,aAAa,QAAQ;AAAA,EACrB,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EACjD,UAAU,QAAQ;AAAA,EAGlB,MAAM,oBAAoB,wBAAwB,SAAS,QAAQ;AAAA,EACnE,QAAQ,QAAQ,QAAQ,QAAQ,gBAAgB,iBAAiB;AAAA,EACjE,kBAAkB,QAAQ;AAAA,EAG1B,MAAM,uBAAuB,2BAA2B,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,eAAe,SAAS,QAAQ;AAAA,EACjD,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QAAQ;AAAA,EAC/C,SAAS,QAAQ;AAAA,EAGjB,yBAAyB,OAAO;AAAA,EAahC,OAAO;AAAA,IACL;AAAA,IACA,OAAO,GAAG;AAAA,MAIR,QAAQ,SAAS;AAAA;AAAA,EAErB;AAAA;",
8
- "debugId": "53BFBF531ADB270764756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "0C9A30DCF100FBA764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "type": "module"
5
5
  }
@@ -10,6 +10,7 @@ import type { SetupCoreOptions, CoreHandle } from "./types.ts";
10
10
  * - File
11
11
  * - DOMException
12
12
  * - URL, URLSearchParams
13
+ * - TextEncoder, TextDecoder
13
14
  *
14
15
  * @example
15
16
  * const handle = setupCore(context);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {