@ricsam/quickjs-core 0.2.1 → 0.2.2

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.
Files changed (55) hide show
  1. package/dist/cjs/blob.cjs +2 -2
  2. package/dist/cjs/blob.cjs.map +2 -2
  3. package/dist/cjs/class-builder.cjs +3 -3
  4. package/dist/cjs/class-builder.cjs.map +2 -2
  5. package/dist/cjs/dom-exception.cjs +2 -2
  6. package/dist/cjs/dom-exception.cjs.map +2 -2
  7. package/dist/cjs/file.cjs +2 -2
  8. package/dist/cjs/file.cjs.map +2 -2
  9. package/dist/cjs/function-builder.cjs +3 -3
  10. package/dist/cjs/function-builder.cjs.map +2 -2
  11. package/dist/cjs/index.cjs +22 -22
  12. package/dist/cjs/index.cjs.map +2 -2
  13. package/dist/cjs/marshal.cjs.map +1 -1
  14. package/dist/cjs/package.json +1 -1
  15. package/dist/cjs/readable-stream.cjs +4 -4
  16. package/dist/cjs/readable-stream.cjs.map +2 -2
  17. package/dist/cjs/scope.cjs.map +1 -1
  18. package/dist/cjs/transform-stream.cjs +2 -2
  19. package/dist/cjs/transform-stream.cjs.map +2 -2
  20. package/dist/cjs/unmarshal.cjs +2 -2
  21. package/dist/cjs/unmarshal.cjs.map +2 -2
  22. package/dist/cjs/url-search-params.cjs +2 -2
  23. package/dist/cjs/url-search-params.cjs.map +2 -2
  24. package/dist/cjs/url.cjs +2 -2
  25. package/dist/cjs/url.cjs.map +2 -2
  26. package/dist/cjs/writable-stream.cjs +4 -4
  27. package/dist/cjs/writable-stream.cjs.map +2 -2
  28. package/dist/mjs/blob.mjs +2 -2
  29. package/dist/mjs/blob.mjs.map +2 -2
  30. package/dist/mjs/class-builder.mjs +3 -3
  31. package/dist/mjs/class-builder.mjs.map +2 -2
  32. package/dist/mjs/dom-exception.mjs +2 -2
  33. package/dist/mjs/dom-exception.mjs.map +2 -2
  34. package/dist/mjs/file.mjs +2 -2
  35. package/dist/mjs/file.mjs.map +2 -2
  36. package/dist/mjs/function-builder.mjs +3 -3
  37. package/dist/mjs/function-builder.mjs.map +2 -2
  38. package/dist/mjs/index.mjs +22 -22
  39. package/dist/mjs/index.mjs.map +2 -2
  40. package/dist/mjs/marshal.mjs.map +1 -1
  41. package/dist/mjs/package.json +1 -1
  42. package/dist/mjs/readable-stream.mjs +4 -4
  43. package/dist/mjs/readable-stream.mjs.map +2 -2
  44. package/dist/mjs/scope.mjs.map +1 -1
  45. package/dist/mjs/transform-stream.mjs +2 -2
  46. package/dist/mjs/transform-stream.mjs.map +2 -2
  47. package/dist/mjs/unmarshal.mjs +2 -2
  48. package/dist/mjs/unmarshal.mjs.map +2 -2
  49. package/dist/mjs/url-search-params.mjs +2 -2
  50. package/dist/mjs/url-search-params.mjs.map +2 -2
  51. package/dist/mjs/url.mjs +2 -2
  52. package/dist/mjs/url.mjs.map +2 -2
  53. package/dist/mjs/writable-stream.mjs +4 -4
  54. package/dist/mjs/writable-stream.mjs.map +2 -2
  55. package/package.json +1 -1
package/dist/mjs/blob.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/blob.ts
3
- import { defineClass } from "./class-builder.ts";
3
+ import { defineClass } from "./class-builder.mjs";
4
4
  function normalizeParts(parts) {
5
5
  const result = [];
6
6
  for (const part of parts) {
@@ -163,4 +163,4 @@ export {
163
163
  createBlob
164
164
  };
165
165
 
166
- //# debugId=2454A2A3CF30D18664756E2164756E21
166
+ //# debugId=30DA1F2190D8ADFE64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/blob.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.ts\";\nimport { defineClass } from \"./class-builder.ts\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\ninterface BlobInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n}\n\n/**\n * Normalize blob parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as BlobInternalState).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the Blob class for QuickJS\n *\n * @param context - QuickJS context\n * @param stateMap - State map for internal state tracking\n * @param createStream - Factory function to create ReadableStream handles\n */\nexport function createBlobClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream: StreamFactory\n): QuickJSHandle {\n return defineClass<BlobInternalState>(context, stateMap, {\n name: \"Blob\",\n construct: (args) => {\n const blobParts = args[0] as unknown[] | undefined;\n const options = args[1] as { type?: string } | undefined;\n\n const parts = blobParts ? normalizeParts(blobParts) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n\n return { parts, type, size };\n },\n properties: {\n size: {\n get(this: BlobInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: BlobInternalState) {\n return this.type;\n },\n },\n },\n methods: {\n async text(this: BlobInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: BlobInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: BlobInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: BlobInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): BlobInternalState {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: BlobInternalState): QuickJSHandle {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n // Create an actual ReadableStream using the factory\n return createStream({\n pull(controller) {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n });\n}\n\n/**\n * Create a Blob in QuickJS from host data\n */\nexport function createBlob(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n options?: BlobPropertyBag\n): QuickJSHandle {\n // Get the Blob constructor from global\n const BlobConstructor = context.getProp(context.global, \"Blob\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n // For Blob, we need to get its array buffer\n // This is async in reality, so we simplify here\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n\n BlobConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempBlobParts__\", partsHandle);\n context.setProp(context.global, \"__tempBlobOptions__\", optionsHandle);\n partsHandle.dispose();\n optionsHandle.dispose();\n\n // Create Blob using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new Blob(__tempBlobParts__, __tempBlobOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempBlobParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempBlobOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create Blob: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\ninterface BlobInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n}\n\n/**\n * Normalize blob parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as BlobInternalState).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the Blob class for QuickJS\n *\n * @param context - QuickJS context\n * @param stateMap - State map for internal state tracking\n * @param createStream - Factory function to create ReadableStream handles\n */\nexport function createBlobClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream: StreamFactory\n): QuickJSHandle {\n return defineClass<BlobInternalState>(context, stateMap, {\n name: \"Blob\",\n construct: (args) => {\n const blobParts = args[0] as unknown[] | undefined;\n const options = args[1] as { type?: string } | undefined;\n\n const parts = blobParts ? normalizeParts(blobParts) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n\n return { parts, type, size };\n },\n properties: {\n size: {\n get(this: BlobInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: BlobInternalState) {\n return this.type;\n },\n },\n },\n methods: {\n async text(this: BlobInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: BlobInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: BlobInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: BlobInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): BlobInternalState {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: BlobInternalState): QuickJSHandle {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n // Create an actual ReadableStream using the factory\n return createStream({\n pull(controller) {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n });\n}\n\n/**\n * Create a Blob in QuickJS from host data\n */\nexport function createBlob(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n options?: BlobPropertyBag\n): QuickJSHandle {\n // Get the Blob constructor from global\n const BlobConstructor = context.getProp(context.global, \"Blob\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n // For Blob, we need to get its array buffer\n // This is async in reality, so we simplify here\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n\n BlobConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempBlobParts__\", partsHandle);\n context.setProp(context.global, \"__tempBlobOptions__\", optionsHandle);\n partsHandle.dispose();\n optionsHandle.dispose();\n\n // Create Blob using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new Blob(__tempBlobParts__, __tempBlobOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempBlobParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempBlobOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create Blob: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "2454A2A3CF30D18664756E2164756E21",
8
+ "debugId": "30DA1F2190D8ADFE64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  // packages/core/src/class-builder.ts
3
- import { unmarshal } from "./unmarshal.ts";
4
- import { marshal } from "./marshal.ts";
3
+ import { unmarshal } from "./unmarshal.mjs";
4
+ import { marshal } from "./marshal.mjs";
5
5
  function createStateMap() {
6
6
  return new WeakMap;
7
7
  }
@@ -210,4 +210,4 @@ export {
210
210
  cleanupInstanceState
211
211
  };
212
212
 
213
- //# debugId=385646AC0EFC115064756E2164756E21
213
+ //# debugId=EE73FFCFEEE4D48664756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/class-builder.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { ClassDefinition, StateMap } from \"./types.ts\";\nimport { unmarshal } from \"./unmarshal.ts\";\nimport { marshal } from \"./marshal.ts\";\n\n/**\n * Create a new StateMap for tracking object internal states\n */\nexport function createStateMap(): StateMap {\n return new WeakMap();\n}\n\n/**\n * Get the internal state associated with a QuickJS object handle\n */\nexport function getState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle\n): T | undefined {\n return stateMap.get(handle) as T | undefined;\n}\n\n/**\n * Set the internal state associated with a QuickJS object handle\n */\nexport function setState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle,\n state: T\n): void {\n stateMap.set(handle, state);\n}\n\n// Internal state tracking using instance IDs\nlet instanceIdCounter = 0;\nconst instanceStateMap = new Map<number, unknown>();\n\n/**\n * Define a class in the QuickJS context\n *\n * Uses evalCode to create a proper JavaScript class that can be called with 'new'.\n * Host-side callbacks are registered and invoked by the JavaScript class.\n *\n * @returns Handle to the class constructor (caller must manage disposal)\n *\n * @example\n * const Point = defineClass(context, stateMap, {\n * name: \"Point\",\n * construct: ([x, y]) => ({ x: Number(x), y: Number(y) }),\n * methods: {\n * distance(this: { x: number; y: number }) {\n * return Math.sqrt(this.x ** 2 + this.y ** 2);\n * }\n * },\n * properties: {\n * x: {\n * get(this: { x: number }) { return this.x; },\n * set(this: { x: number }, v: unknown) { this.x = Number(v); }\n * }\n * }\n * });\n * context.setProp(context.global, \"Point\", Point);\n */\nexport function defineClass<TState extends object>(\n context: QuickJSContext,\n stateMap: StateMap,\n definition: ClassDefinition<TState>\n): QuickJSHandle {\n const className = definition.name;\n\n // Create the __hostCall__ function if it doesn't exist\n const existingHostCall = context.getProp(context.global, \"__hostCall__\");\n const hasHostCall = context.typeof(existingHostCall) === \"function\";\n existingHostCall.dispose();\n\n if (!hasHostCall) {\n const hostCallFn = context.newFunction(\"__hostCall__\", (classNameHandle, actionHandle, instanceIdHandle, ...argHandles) => {\n const classNameStr = context.getString(classNameHandle);\n const action = context.getString(actionHandle);\n const instanceId = context.getNumber(instanceIdHandle);\n const args = argHandles.map((h) => unmarshal(context, h));\n\n const callbacks = classCallbackRegistry.get(classNameStr);\n if (!callbacks) {\n throw context.newError(`No callbacks registered for class ${classNameStr}`);\n }\n\n const state = instanceStateMap.get(instanceId) as TState | undefined;\n\n try {\n let result: unknown;\n\n if (action === \"__construct__\") {\n // Constructor call\n if (callbacks.construct) {\n const newState = callbacks.construct(args);\n instanceStateMap.set(instanceId, newState);\n result = undefined;\n }\n } else if (action.startsWith(\"get:\")) {\n // Getter call\n const propName = action.slice(4);\n const getter = callbacks.properties?.[propName]?.get;\n if (getter && state) {\n result = getter.call(state);\n }\n } else if (action.startsWith(\"set:\")) {\n // Setter call\n const propName = action.slice(4);\n const setter = callbacks.properties?.[propName]?.set;\n if (setter && state) {\n setter.call(state, args[0]);\n }\n result = undefined;\n } else if (action.startsWith(\"static:\")) {\n // Static method call\n const methodName = action.slice(7);\n const staticMethod = callbacks.staticMethods?.[methodName];\n if (staticMethod) {\n result = staticMethod(...args);\n }\n } else {\n // Instance method call\n const method = callbacks.methods?.[action];\n if (method && state) {\n result = method.call(state, ...args);\n }\n }\n\n // Handle promises\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshal(context, resolved);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n return marshal(context, result);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n context.setProp(context.global, \"__hostCall__\", hostCallFn);\n hostCallFn.dispose();\n }\n\n // Create __nextInstanceId__ function if it doesn't exist\n const existingNextId = context.getProp(context.global, \"__nextInstanceId__\");\n const hasNextId = context.typeof(existingNextId) === \"function\";\n existingNextId.dispose();\n\n if (!hasNextId) {\n const nextIdFn = context.newFunction(\"__nextInstanceId__\", () => {\n return context.newNumber(++instanceIdCounter);\n });\n context.setProp(context.global, \"__nextInstanceId__\", nextIdFn);\n nextIdFn.dispose();\n }\n\n // Register callbacks for this class\n const callbacks: ClassCallbacks<TState> = {\n construct: definition.construct,\n methods: definition.methods,\n properties: definition.properties,\n staticMethods: definition.staticMethods,\n };\n classCallbackRegistry.set(className, callbacks as unknown as ClassCallbacks<object>);\n\n // Build the JavaScript class code\n let classCode = `(function() {\n const __className__ = ${JSON.stringify(className)};\n\n class ${className} {\n constructor(...args) {\n this.__instanceId__ = __nextInstanceId__();\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }\n`;\n\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return instanceStateMap.get(id) as T | undefined;\n}\n\n/**\n * Set internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function setInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle,\n state: T\n): void {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n throw new Error(\"Cannot set state: instance has no __instanceId__\");\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n instanceStateMap.set(id, state);\n}\n\n/**\n * Get internal state by instance ID directly\n * Useful when you have the instanceId from an unmarshaled object\n */\nexport function getInstanceStateById<T>(instanceId: number): T | undefined {\n return instanceStateMap.get(instanceId) as T | undefined;\n}\n\n/**\n * Clean up instance state when an instance is no longer needed\n */\nexport function cleanupInstanceState(instanceId: number): void {\n instanceStateMap.delete(instanceId);\n}\n\n/**\n * Clear all instance state (useful for context disposal or testing cleanup)\n */\nexport function clearAllInstanceState(): void {\n instanceStateMap.clear();\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { ClassDefinition, StateMap } from \"./types.mjs\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n/**\n * Create a new StateMap for tracking object internal states\n */\nexport function createStateMap(): StateMap {\n return new WeakMap();\n}\n\n/**\n * Get the internal state associated with a QuickJS object handle\n */\nexport function getState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle\n): T | undefined {\n return stateMap.get(handle) as T | undefined;\n}\n\n/**\n * Set the internal state associated with a QuickJS object handle\n */\nexport function setState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle,\n state: T\n): void {\n stateMap.set(handle, state);\n}\n\n// Internal state tracking using instance IDs\nlet instanceIdCounter = 0;\nconst instanceStateMap = new Map<number, unknown>();\n\n/**\n * Define a class in the QuickJS context\n *\n * Uses evalCode to create a proper JavaScript class that can be called with 'new'.\n * Host-side callbacks are registered and invoked by the JavaScript class.\n *\n * @returns Handle to the class constructor (caller must manage disposal)\n *\n * @example\n * const Point = defineClass(context, stateMap, {\n * name: \"Point\",\n * construct: ([x, y]) => ({ x: Number(x), y: Number(y) }),\n * methods: {\n * distance(this: { x: number; y: number }) {\n * return Math.sqrt(this.x ** 2 + this.y ** 2);\n * }\n * },\n * properties: {\n * x: {\n * get(this: { x: number }) { return this.x; },\n * set(this: { x: number }, v: unknown) { this.x = Number(v); }\n * }\n * }\n * });\n * context.setProp(context.global, \"Point\", Point);\n */\nexport function defineClass<TState extends object>(\n context: QuickJSContext,\n stateMap: StateMap,\n definition: ClassDefinition<TState>\n): QuickJSHandle {\n const className = definition.name;\n\n // Create the __hostCall__ function if it doesn't exist\n const existingHostCall = context.getProp(context.global, \"__hostCall__\");\n const hasHostCall = context.typeof(existingHostCall) === \"function\";\n existingHostCall.dispose();\n\n if (!hasHostCall) {\n const hostCallFn = context.newFunction(\"__hostCall__\", (classNameHandle, actionHandle, instanceIdHandle, ...argHandles) => {\n const classNameStr = context.getString(classNameHandle);\n const action = context.getString(actionHandle);\n const instanceId = context.getNumber(instanceIdHandle);\n const args = argHandles.map((h) => unmarshal(context, h));\n\n const callbacks = classCallbackRegistry.get(classNameStr);\n if (!callbacks) {\n throw context.newError(`No callbacks registered for class ${classNameStr}`);\n }\n\n const state = instanceStateMap.get(instanceId) as TState | undefined;\n\n try {\n let result: unknown;\n\n if (action === \"__construct__\") {\n // Constructor call\n if (callbacks.construct) {\n const newState = callbacks.construct(args);\n instanceStateMap.set(instanceId, newState);\n result = undefined;\n }\n } else if (action.startsWith(\"get:\")) {\n // Getter call\n const propName = action.slice(4);\n const getter = callbacks.properties?.[propName]?.get;\n if (getter && state) {\n result = getter.call(state);\n }\n } else if (action.startsWith(\"set:\")) {\n // Setter call\n const propName = action.slice(4);\n const setter = callbacks.properties?.[propName]?.set;\n if (setter && state) {\n setter.call(state, args[0]);\n }\n result = undefined;\n } else if (action.startsWith(\"static:\")) {\n // Static method call\n const methodName = action.slice(7);\n const staticMethod = callbacks.staticMethods?.[methodName];\n if (staticMethod) {\n result = staticMethod(...args);\n }\n } else {\n // Instance method call\n const method = callbacks.methods?.[action];\n if (method && state) {\n result = method.call(state, ...args);\n }\n }\n\n // Handle promises\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshal(context, resolved);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n return marshal(context, result);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n context.setProp(context.global, \"__hostCall__\", hostCallFn);\n hostCallFn.dispose();\n }\n\n // Create __nextInstanceId__ function if it doesn't exist\n const existingNextId = context.getProp(context.global, \"__nextInstanceId__\");\n const hasNextId = context.typeof(existingNextId) === \"function\";\n existingNextId.dispose();\n\n if (!hasNextId) {\n const nextIdFn = context.newFunction(\"__nextInstanceId__\", () => {\n return context.newNumber(++instanceIdCounter);\n });\n context.setProp(context.global, \"__nextInstanceId__\", nextIdFn);\n nextIdFn.dispose();\n }\n\n // Register callbacks for this class\n const callbacks: ClassCallbacks<TState> = {\n construct: definition.construct,\n methods: definition.methods,\n properties: definition.properties,\n staticMethods: definition.staticMethods,\n };\n classCallbackRegistry.set(className, callbacks as unknown as ClassCallbacks<object>);\n\n // Build the JavaScript class code\n let classCode = `(function() {\n const __className__ = ${JSON.stringify(className)};\n\n class ${className} {\n constructor(...args) {\n this.__instanceId__ = __nextInstanceId__();\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }\n`;\n\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return instanceStateMap.get(id) as T | undefined;\n}\n\n/**\n * Set internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function setInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle,\n state: T\n): void {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n throw new Error(\"Cannot set state: instance has no __instanceId__\");\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n instanceStateMap.set(id, state);\n}\n\n/**\n * Get internal state by instance ID directly\n * Useful when you have the instanceId from an unmarshaled object\n */\nexport function getInstanceStateById<T>(instanceId: number): T | undefined {\n return instanceStateMap.get(instanceId) as T | undefined;\n}\n\n/**\n * Clean up instance state when an instance is no longer needed\n */\nexport function cleanupInstanceState(instanceId: number): void {\n instanceStateMap.delete(instanceId);\n}\n\n/**\n * Clear all instance state (useful for context disposal or testing cleanup)\n */\nexport function clearAllInstanceState(): void {\n instanceStateMap.clear();\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "385646AC0EFC115064756E2164756E21",
8
+ "debugId": "EE73FFCFEEE4D48664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/dom-exception.ts
3
- import { defineClass } from "./class-builder.ts";
3
+ import { defineClass } from "./class-builder.mjs";
4
4
  var ERROR_CODES = {
5
5
  IndexSizeError: 1,
6
6
  HierarchyRequestError: 3,
@@ -61,4 +61,4 @@ export {
61
61
  createDOMExceptionClass
62
62
  };
63
63
 
64
- //# debugId=FD9D1100B551F7CE64756E2164756E21
64
+ //# debugId=2EBC06E4B7556AE964756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/dom-exception.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.ts\";\nimport { defineClass } from \"./class-builder.ts\";\n\nexport interface DOMExceptionState {\n message: string;\n name: string;\n code: number;\n}\n\n// Standard DOMException error codes\nconst ERROR_CODES: Record<string, number> = {\n IndexSizeError: 1,\n HierarchyRequestError: 3,\n WrongDocumentError: 4,\n InvalidCharacterError: 5,\n NoModificationAllowedError: 7,\n NotFoundError: 8,\n NotSupportedError: 9,\n InvalidStateError: 11,\n SyntaxError: 12,\n InvalidModificationError: 13,\n NamespaceError: 14,\n InvalidAccessError: 15,\n TypeMismatchError: 17,\n SecurityError: 18,\n NetworkError: 19,\n AbortError: 20,\n URLMismatchError: 21,\n QuotaExceededError: 22,\n TimeoutError: 23,\n InvalidNodeTypeError: 24,\n DataCloneError: 25,\n};\n\nexport function createDOMExceptionClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<DOMExceptionState>(context, stateMap, {\n name: \"DOMException\",\n construct: (args) => {\n const message = args[0] !== undefined ? String(args[0]) : \"\";\n const name = args[1] !== undefined ? String(args[1]) : \"Error\";\n const code = ERROR_CODES[name] ?? 0;\n return { message, name, code };\n },\n properties: {\n message: {\n get(this: DOMExceptionState) {\n return this.message;\n },\n },\n name: {\n get(this: DOMExceptionState) {\n return this.name;\n },\n },\n code: {\n get(this: DOMExceptionState) {\n return this.code;\n },\n },\n },\n methods: {\n toString(this: DOMExceptionState) {\n return `${this.name}: ${this.message}`;\n },\n },\n });\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\nexport interface DOMExceptionState {\n message: string;\n name: string;\n code: number;\n}\n\n// Standard DOMException error codes\nconst ERROR_CODES: Record<string, number> = {\n IndexSizeError: 1,\n HierarchyRequestError: 3,\n WrongDocumentError: 4,\n InvalidCharacterError: 5,\n NoModificationAllowedError: 7,\n NotFoundError: 8,\n NotSupportedError: 9,\n InvalidStateError: 11,\n SyntaxError: 12,\n InvalidModificationError: 13,\n NamespaceError: 14,\n InvalidAccessError: 15,\n TypeMismatchError: 17,\n SecurityError: 18,\n NetworkError: 19,\n AbortError: 20,\n URLMismatchError: 21,\n QuotaExceededError: 22,\n TimeoutError: 23,\n InvalidNodeTypeError: 24,\n DataCloneError: 25,\n};\n\nexport function createDOMExceptionClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<DOMExceptionState>(context, stateMap, {\n name: \"DOMException\",\n construct: (args) => {\n const message = args[0] !== undefined ? String(args[0]) : \"\";\n const name = args[1] !== undefined ? String(args[1]) : \"Error\";\n const code = ERROR_CODES[name] ?? 0;\n return { message, name, code };\n },\n properties: {\n message: {\n get(this: DOMExceptionState) {\n return this.message;\n },\n },\n name: {\n get(this: DOMExceptionState) {\n return this.name;\n },\n },\n code: {\n get(this: DOMExceptionState) {\n return this.code;\n },\n },\n },\n methods: {\n toString(this: DOMExceptionState) {\n return `${this.name}: ${this.message}`;\n },\n },\n });\n}\n"
6
6
  ],
7
7
  "mappings": ";;AAEA;AASA,IAAM,cAAsC;AAAA,EAC1C,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,gBAAgB;AAClB;AAEO,SAAS,uBAAuB,CACrC,SACA,UACe;AAAA,EACf,OAAO,YAA+B,SAAS,UAAU;AAAA,IACvD,MAAM;AAAA,IACN,WAAW,CAAC,SAAS;AAAA,MACnB,MAAM,UAAU,KAAK,OAAO,YAAY,OAAO,KAAK,EAAE,IAAI;AAAA,MAC1D,MAAM,OAAO,KAAK,OAAO,YAAY,OAAO,KAAK,EAAE,IAAI;AAAA,MACvD,MAAM,OAAO,YAAY,SAAS;AAAA,MAClC,OAAO,EAAE,SAAS,MAAM,KAAK;AAAA;AAAA,IAE/B,YAAY;AAAA,MACV,SAAS;AAAA,QACP,GAAG,GAA0B;AAAA,UAC3B,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,MAAM;AAAA,QACJ,GAAG,GAA0B;AAAA,UAC3B,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,MAAM;AAAA,QACJ,GAAG,GAA0B;AAAA,UAC3B,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,GAA0B;AAAA,QAChC,OAAO,GAAG,KAAK,SAAS,KAAK;AAAA;AAAA,IAEjC;AAAA,EACF,CAAC;AAAA;",
8
- "debugId": "FD9D1100B551F7CE64756E2164756E21",
8
+ "debugId": "2EBC06E4B7556AE964756E2164756E21",
9
9
  "names": []
10
10
  }
package/dist/mjs/file.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/file.ts
3
- import { defineClass } from "./class-builder.ts";
3
+ import { defineClass } from "./class-builder.mjs";
4
4
  function normalizeParts(parts) {
5
5
  const result = [];
6
6
  for (const part of parts) {
@@ -200,4 +200,4 @@ export {
200
200
  createFile
201
201
  };
202
202
 
203
- //# debugId=387C3080E0064C9B64756E2164756E21
203
+ //# debugId=6BE6474BD2F62AE964756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/file.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.ts\";\nimport { defineClass } from \"./class-builder.ts\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "387C3080E0064C9B64756E2164756E21",
8
+ "debugId": "6BE6474BD2F62AE964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  // packages/core/src/function-builder.ts
3
- import { unmarshal } from "./unmarshal.ts";
4
- import { marshal } from "./marshal.ts";
3
+ import { unmarshal } from "./unmarshal.mjs";
4
+ import { marshal } from "./marshal.mjs";
5
5
  function defineFunction(context, name, fn) {
6
6
  return context.newFunction(name, (...argHandles) => {
7
7
  const args = argHandles.map((h) => unmarshal(context, h));
@@ -36,4 +36,4 @@ export {
36
36
  defineAsyncFunction
37
37
  };
38
38
 
39
- //# debugId=420324452008D1FF64756E2164756E21
39
+ //# debugId=6738D97AC374993764756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/function-builder.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { unmarshal } from \"./unmarshal.ts\";\nimport { marshal } from \"./marshal.ts\";\n\n/**\n * Define a global function in the QuickJS context\n *\n * @returns Handle to the function (caller must manage disposal)\n *\n * @example\n * const logFn = defineFunction(context, \"log\", (...args) => {\n * console.log(\"[QuickJS]\", ...args);\n * });\n * context.setProp(context.global, \"log\", logFn);\n */\nexport function defineFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => unknown\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n try {\n // Call host function\n const result = fn(...args);\n\n // Marshal result\n return marshal(context, result);\n } catch (error) {\n // Throw error in QuickJS\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n}\n\n/**\n * Define an async function that returns a promise to QuickJS\n *\n * @example\n * const fetchFn = defineAsyncFunction(context, \"fetch\", async (url) => {\n * const response = await fetch(String(url));\n * return response.text();\n * });\n */\nexport function defineAsyncFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n // Create a promise in QuickJS\n const deferred = context.newPromise();\n\n // Call the async function\n fn(...args)\n .then((result) => {\n const resultHandle = marshal(context, result);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n/**\n * Define a global function in the QuickJS context\n *\n * @returns Handle to the function (caller must manage disposal)\n *\n * @example\n * const logFn = defineFunction(context, \"log\", (...args) => {\n * console.log(\"[QuickJS]\", ...args);\n * });\n * context.setProp(context.global, \"log\", logFn);\n */\nexport function defineFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => unknown\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n try {\n // Call host function\n const result = fn(...args);\n\n // Marshal result\n return marshal(context, result);\n } catch (error) {\n // Throw error in QuickJS\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n}\n\n/**\n * Define an async function that returns a promise to QuickJS\n *\n * @example\n * const fetchFn = defineAsyncFunction(context, \"fetch\", async (url) => {\n * const response = await fetch(String(url));\n * return response.text();\n * });\n */\nexport function defineAsyncFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n // Create a promise in QuickJS\n const deferred = context.newPromise();\n\n // Call the async function\n fn(...args)\n .then((result) => {\n const resultHandle = marshal(context, result);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n"
6
6
  ],
7
7
  "mappings": ";;AACA;AACA;AAaO,SAAS,cAAc,CAC5B,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAExD,IAAI;AAAA,MAEF,MAAM,SAAS,GAAG,GAAG,IAAI;AAAA,MAGzB,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,OAAO,OAAO;AAAA,MAEd,MAAM,QAAQ,SACZ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA;AAAA,GAEH;AAAA;AAYI,SAAS,mBAAmB,CACjC,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAGxD,MAAM,WAAW,QAAQ,WAAW;AAAA,IAGpC,GAAG,GAAG,IAAI,EACP,KAAK,CAAC,WAAW;AAAA,MAChB,MAAM,eAAe,QAAQ,SAAS,MAAM;AAAA,MAC5C,SAAS,QAAQ,YAAY;AAAA,MAC7B,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC,EACA,MAAM,CAAC,UAAU;AAAA,MAChB,MAAM,cAAc,QAClB,SACA,iBAAiB,QACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C,EAAE,SAAS,OAAO,KAAK,EAAE,CAC/B;AAAA,MACA,SAAS,OAAO,WAAW;AAAA,MAC3B,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC;AAAA,IAEH,OAAO,SAAS;AAAA,GACjB;AAAA;",
8
- "debugId": "420324452008D1FF64756E2164756E21",
8
+ "debugId": "6738D97AC374993764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,26 +1,26 @@
1
1
  // @bun
2
2
  // packages/core/src/index.ts
3
- import { createStateMap } from "./class-builder.ts";
3
+ import { createStateMap } from "./class-builder.mjs";
4
4
  import {
5
5
  createReadableStreamClass,
6
6
  createReadableStreamDefaultReaderClass,
7
7
  createReadableStream
8
- } from "./streams/readable-stream.ts";
8
+ } from "./streams/readable-stream.mjs";
9
9
  import {
10
10
  createWritableStreamClass,
11
11
  createWritableStreamDefaultWriterClass
12
- } from "./streams/writable-stream.ts";
13
- import { createTransformStreamClass } from "./streams/transform-stream.ts";
14
- import { createBlobClass } from "./blob.ts";
15
- import { createFileClass } from "./file.ts";
16
- import { createDOMExceptionClass } from "./dom-exception.ts";
17
- import { createURLSearchParamsClass } from "./url-search-params.ts";
18
- import { createURLClass, addURLSearchParamsGetter } from "./url.ts";
19
- import { INTERNAL_STATE } from "./types.ts";
20
- import { withScope, withScopeAsync } from "./scope.ts";
21
- import { marshal, isHandle, getHandleType } from "./marshal.ts";
22
- import { unmarshal, cleanupUnmarshaledHandles } from "./unmarshal.ts";
23
- import { defineFunction, defineAsyncFunction } from "./function-builder.ts";
12
+ } from "./streams/writable-stream.mjs";
13
+ import { createTransformStreamClass } from "./streams/transform-stream.mjs";
14
+ import { createBlobClass } from "./blob.mjs";
15
+ import { createFileClass } from "./file.mjs";
16
+ import { createDOMExceptionClass } from "./dom-exception.mjs";
17
+ import { createURLSearchParamsClass } from "./url-search-params.mjs";
18
+ import { createURLClass, addURLSearchParamsGetter } from "./url.mjs";
19
+ import { INTERNAL_STATE } from "./types.mjs";
20
+ import { withScope, withScopeAsync } from "./scope.mjs";
21
+ import { marshal, isHandle, getHandleType } from "./marshal.mjs";
22
+ import { unmarshal, cleanupUnmarshaledHandles } from "./unmarshal.mjs";
23
+ import { defineFunction, defineAsyncFunction } from "./function-builder.mjs";
24
24
  import {
25
25
  defineClass,
26
26
  createStateMap as createStateMap2,
@@ -31,16 +31,16 @@ import {
31
31
  getInstanceStateById,
32
32
  cleanupInstanceState,
33
33
  clearAllInstanceState
34
- } from "./class-builder.ts";
34
+ } from "./class-builder.mjs";
35
35
  import {
36
36
  createReadableStream as createReadableStream2,
37
37
  consumeReadableStream
38
- } from "./streams/readable-stream.ts";
39
- import { createWritableStream } from "./streams/writable-stream.ts";
40
- import { createBlob } from "./blob.ts";
41
- import { createFile } from "./file.ts";
42
- import { createURLSearchParamsClass as createURLSearchParamsClass2 } from "./url-search-params.ts";
43
- import { createURLClass as createURLClass2, addURLSearchParamsGetter as addURLSearchParamsGetter2 } from "./url.ts";
38
+ } from "./streams/readable-stream.mjs";
39
+ import { createWritableStream } from "./streams/writable-stream.mjs";
40
+ import { createBlob } from "./blob.mjs";
41
+ import { createFile } from "./file.mjs";
42
+ import { createURLSearchParamsClass as createURLSearchParamsClass2 } from "./url-search-params.mjs";
43
+ import { createURLClass as createURLClass2, addURLSearchParamsGetter as addURLSearchParamsGetter2 } from "./url.mjs";
44
44
  function setupCore(context, options) {
45
45
  const stateMap = options?.stateMap ?? createStateMap();
46
46
  const handles = [];
@@ -129,4 +129,4 @@ export {
129
129
  INTERNAL_STATE
130
130
  };
131
131
 
132
- //# debugId=E3F9214AFACC87A464756E2164756E21
132
+ //# debugId=437936896609DE9364756E2164756E21
@@ -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.ts\";\nimport { createStateMap } from \"./class-builder.ts\";\nimport {\n createReadableStreamClass,\n createReadableStreamDefaultReaderClass,\n createReadableStream,\n} from \"./streams/readable-stream.ts\";\nimport {\n createWritableStreamClass,\n createWritableStreamDefaultWriterClass,\n} from \"./streams/writable-stream.ts\";\nimport { createTransformStreamClass } from \"./streams/transform-stream.ts\";\nimport { createBlobClass } from \"./blob.ts\";\nimport { createFileClass } from \"./file.ts\";\nimport { createDOMExceptionClass } from \"./dom-exception.ts\";\nimport { createURLSearchParamsClass } from \"./url-search-params.ts\";\nimport { createURLClass, addURLSearchParamsGetter } from \"./url.ts\";\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.ts\";\nexport { INTERNAL_STATE } from \"./types.ts\";\n\n// Re-export utilities\nexport { withScope, withScopeAsync } from \"./scope.ts\";\nexport { marshal, isHandle, getHandleType } from \"./marshal.ts\";\nexport { unmarshal, cleanupUnmarshaledHandles } from \"./unmarshal.ts\";\nexport { defineFunction, defineAsyncFunction } from \"./function-builder.ts\";\nexport {\n defineClass,\n createStateMap,\n getState,\n setState,\n getInstanceState,\n setInstanceState,\n getInstanceStateById,\n cleanupInstanceState,\n clearAllInstanceState,\n} from \"./class-builder.ts\";\n\n// Re-export stream utilities\nexport {\n createReadableStream,\n consumeReadableStream,\n} from \"./streams/readable-stream.ts\";\nexport { createWritableStream } from \"./streams/writable-stream.ts\";\n\n// Re-export Blob/File utilities\nexport { createBlob } from \"./blob.ts\";\nexport { createFile } from \"./file.ts\";\n\n// Re-export URL utilities\nexport { createURLSearchParamsClass } from \"./url-search-params.ts\";\nexport type { URLSearchParamsState } from \"./url-search-params.ts\";\nexport { createURLClass, addURLSearchParamsGetter } from \"./url.ts\";\nexport type { URLState } from \"./url.ts\";\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 *\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 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
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,0BACE;AAAA;AAAA;AAGF;AAGA;AACA;AAGA,uCAAS;AAET,2BAAS,6CAAgB;AA3KlB,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": "E3F9214AFACC87A464756E2164756E21",
8
+ "debugId": "437936896609DE9364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/marshal.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { MarshalOptions } from \"./types.ts\";\n\n/**\n * Check if a value is a QuickJS handle\n */\nexport function isHandle(value: unknown): value is QuickJSHandle {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"alive\" in value &&\n \"dispose\" in value &&\n typeof (value as QuickJSHandle).dispose === \"function\"\n );\n}\n\n/**\n * Get the type of a QuickJS handle as a string\n */\nexport function getHandleType(\n context: QuickJSContext,\n handle: QuickJSHandle\n): \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\" {\n return context.typeof(handle) as \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\";\n}\n\n/**\n * Marshal a JavaScript value to a QuickJS handle\n *\n * Supports:\n * - Primitives (string, number, boolean, null, undefined, bigint)\n * - Arrays\n * - Plain objects\n * - ArrayBuffer / Uint8Array\n * - Date (converted to Date object in QuickJS)\n * - Functions (wrapped as host functions)\n * - Promises (wrapped with context.newPromise)\n *\n * @example\n * const handle = marshal(context, {\n * name: \"test\",\n * values: [1, 2, 3],\n * callback: (x) => x * 2\n * });\n */\nexport function marshal(\n context: QuickJSContext,\n value: unknown,\n options: MarshalOptions = {}\n): QuickJSHandle {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakSet<object>();\n\n function marshalValue(val: unknown, depth: number): QuickJSHandle {\n if (depth > maxDepth) {\n throw new Error(`Maximum marshalling depth of ${maxDepth} exceeded`);\n }\n\n // Pass through existing QuickJS handles\n if (isHandle(val)) {\n return val;\n }\n\n // Try custom marshaller first\n if (options.custom) {\n const customResult = options.custom(val, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n // Handle primitives\n if (val === undefined) {\n return context.undefined;\n }\n if (val === null) {\n return context.null;\n }\n if (typeof val === \"boolean\") {\n return val ? context.true : context.false;\n }\n if (typeof val === \"number\") {\n return context.newNumber(val);\n }\n if (typeof val === \"string\") {\n return context.newString(val);\n }\n if (typeof val === \"bigint\") {\n return context.newBigInt(val);\n }\n\n // Handle symbols (convert to string representation)\n if (typeof val === \"symbol\") {\n return context.newString(val.toString());\n }\n\n // Handle objects\n if (typeof val === \"object\") {\n // Check for circular references\n if (seen.has(val)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(val);\n\n try {\n // Handle ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return context.newArrayBuffer(val);\n }\n\n // Handle Uint8Array - create proper Uint8Array in QuickJS (has .length property)\n if (val instanceof Uint8Array) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n const bufferHandle = context.newArrayBuffer(buffer);\n context.setProp(context.global, \"__tempMarshalBuffer__\", bufferHandle);\n bufferHandle.dispose();\n const result = context.evalCode(\"new Uint8Array(__tempMarshalBuffer__)\");\n const cleanup = context.evalCode(\"delete globalThis.__tempMarshalBuffer__\");\n if (cleanup.error) cleanup.error.dispose();\n else cleanup.value.dispose();\n if (result.error) {\n result.error.dispose();\n // Fallback to ArrayBuffer if Uint8Array creation fails\n return context.newArrayBuffer(buffer);\n }\n return result.value;\n }\n\n // Handle other TypedArrays (Int8Array, Float32Array, etc.) - convert to ArrayBuffer\n if (ArrayBuffer.isView(val)) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n return context.newArrayBuffer(buffer);\n }\n\n // Handle Date\n if (val instanceof Date) {\n const dateConstructor = context.getProp(context.global, \"Date\");\n const timestamp = context.newNumber(val.getTime());\n const result = context.callFunction(\n dateConstructor,\n context.undefined,\n timestamp\n );\n dateConstructor.dispose();\n timestamp.dispose();\n\n if (result.error) {\n const error = result.error;\n result.error.dispose();\n throw new Error(`Failed to create Date: ${context.dump(error)}`);\n }\n return result.value;\n }\n\n // Handle Promise\n if (val instanceof Promise) {\n const deferred = context.newPromise();\n val\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n // Handle Array\n if (Array.isArray(val)) {\n const arr = context.newArray();\n for (let i = 0; i < val.length; i++) {\n const elementHandle = marshalValue(val[i], depth + 1);\n context.setProp(arr, i, elementHandle);\n elementHandle.dispose();\n }\n return arr;\n }\n\n // Handle plain objects\n const obj = context.newObject();\n for (const [key, propVal] of Object.entries(val)) {\n const propHandle = marshalValue(propVal, depth + 1);\n context.setProp(obj, key, propHandle);\n propHandle.dispose();\n }\n return obj;\n } finally {\n seen.delete(val);\n }\n }\n\n // Handle functions\n if (typeof val === \"function\") {\n return context.newFunction(val.name || \"anonymous\", (...argHandles) => {\n const args = argHandles.map((h) => context.dump(h));\n try {\n const result = val(...args);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return marshalValue(result, depth + 1);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n }\n\n throw new Error(`Cannot marshal value of type ${typeof val}`);\n }\n\n return marshalValue(value, 0);\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { MarshalOptions } from \"./types.mjs\";\n\n/**\n * Check if a value is a QuickJS handle\n */\nexport function isHandle(value: unknown): value is QuickJSHandle {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"alive\" in value &&\n \"dispose\" in value &&\n typeof (value as QuickJSHandle).dispose === \"function\"\n );\n}\n\n/**\n * Get the type of a QuickJS handle as a string\n */\nexport function getHandleType(\n context: QuickJSContext,\n handle: QuickJSHandle\n): \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\" {\n return context.typeof(handle) as \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\";\n}\n\n/**\n * Marshal a JavaScript value to a QuickJS handle\n *\n * Supports:\n * - Primitives (string, number, boolean, null, undefined, bigint)\n * - Arrays\n * - Plain objects\n * - ArrayBuffer / Uint8Array\n * - Date (converted to Date object in QuickJS)\n * - Functions (wrapped as host functions)\n * - Promises (wrapped with context.newPromise)\n *\n * @example\n * const handle = marshal(context, {\n * name: \"test\",\n * values: [1, 2, 3],\n * callback: (x) => x * 2\n * });\n */\nexport function marshal(\n context: QuickJSContext,\n value: unknown,\n options: MarshalOptions = {}\n): QuickJSHandle {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakSet<object>();\n\n function marshalValue(val: unknown, depth: number): QuickJSHandle {\n if (depth > maxDepth) {\n throw new Error(`Maximum marshalling depth of ${maxDepth} exceeded`);\n }\n\n // Pass through existing QuickJS handles\n if (isHandle(val)) {\n return val;\n }\n\n // Try custom marshaller first\n if (options.custom) {\n const customResult = options.custom(val, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n // Handle primitives\n if (val === undefined) {\n return context.undefined;\n }\n if (val === null) {\n return context.null;\n }\n if (typeof val === \"boolean\") {\n return val ? context.true : context.false;\n }\n if (typeof val === \"number\") {\n return context.newNumber(val);\n }\n if (typeof val === \"string\") {\n return context.newString(val);\n }\n if (typeof val === \"bigint\") {\n return context.newBigInt(val);\n }\n\n // Handle symbols (convert to string representation)\n if (typeof val === \"symbol\") {\n return context.newString(val.toString());\n }\n\n // Handle objects\n if (typeof val === \"object\") {\n // Check for circular references\n if (seen.has(val)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(val);\n\n try {\n // Handle ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return context.newArrayBuffer(val);\n }\n\n // Handle Uint8Array - create proper Uint8Array in QuickJS (has .length property)\n if (val instanceof Uint8Array) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n const bufferHandle = context.newArrayBuffer(buffer);\n context.setProp(context.global, \"__tempMarshalBuffer__\", bufferHandle);\n bufferHandle.dispose();\n const result = context.evalCode(\"new Uint8Array(__tempMarshalBuffer__)\");\n const cleanup = context.evalCode(\"delete globalThis.__tempMarshalBuffer__\");\n if (cleanup.error) cleanup.error.dispose();\n else cleanup.value.dispose();\n if (result.error) {\n result.error.dispose();\n // Fallback to ArrayBuffer if Uint8Array creation fails\n return context.newArrayBuffer(buffer);\n }\n return result.value;\n }\n\n // Handle other TypedArrays (Int8Array, Float32Array, etc.) - convert to ArrayBuffer\n if (ArrayBuffer.isView(val)) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n return context.newArrayBuffer(buffer);\n }\n\n // Handle Date\n if (val instanceof Date) {\n const dateConstructor = context.getProp(context.global, \"Date\");\n const timestamp = context.newNumber(val.getTime());\n const result = context.callFunction(\n dateConstructor,\n context.undefined,\n timestamp\n );\n dateConstructor.dispose();\n timestamp.dispose();\n\n if (result.error) {\n const error = result.error;\n result.error.dispose();\n throw new Error(`Failed to create Date: ${context.dump(error)}`);\n }\n return result.value;\n }\n\n // Handle Promise\n if (val instanceof Promise) {\n const deferred = context.newPromise();\n val\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n // Handle Array\n if (Array.isArray(val)) {\n const arr = context.newArray();\n for (let i = 0; i < val.length; i++) {\n const elementHandle = marshalValue(val[i], depth + 1);\n context.setProp(arr, i, elementHandle);\n elementHandle.dispose();\n }\n return arr;\n }\n\n // Handle plain objects\n const obj = context.newObject();\n for (const [key, propVal] of Object.entries(val)) {\n const propHandle = marshalValue(propVal, depth + 1);\n context.setProp(obj, key, propHandle);\n propHandle.dispose();\n }\n return obj;\n } finally {\n seen.delete(val);\n }\n }\n\n // Handle functions\n if (typeof val === \"function\") {\n return context.newFunction(val.name || \"anonymous\", (...argHandles) => {\n const args = argHandles.map((h) => context.dump(h));\n try {\n const result = val(...args);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return marshalValue(result, depth + 1);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n }\n\n throw new Error(`Cannot marshal value of type ${typeof val}`);\n }\n\n return marshalValue(value, 0);\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
8
  "debugId": "D3A382CD5B7A763864756E2164756E21",
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "type": "module"
5
5
  }
@@ -1,8 +1,8 @@
1
1
  // @bun
2
2
  // packages/core/src/streams/readable-stream.ts
3
- import { defineClass, getInstanceStateById } from "../class-builder.ts";
4
- import { marshal } from "../marshal.ts";
5
- import { unmarshal } from "../unmarshal.ts";
3
+ import { defineClass, getInstanceStateById } from "../class-builder.mjs";
4
+ import { marshal } from "../marshal.mjs";
5
+ import { unmarshal } from "../unmarshal.mjs";
6
6
  function createReadableStreamDefaultReaderClass(context, stateMap) {
7
7
  return defineClass(context, stateMap, {
8
8
  name: "ReadableStreamDefaultReader",
@@ -554,4 +554,4 @@ export {
554
554
  consumeReadableStream
555
555
  };
556
556
 
557
- //# debugId=3394935AF48488F664756E2164756E21
557
+ //# debugId=5EEB8B186C260DD864756E2164756E21