@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
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/streams/readable-stream.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.ts\";\nimport { defineClass, getState, getInstanceStateById } from \"../class-builder.ts\";\nimport { marshal } from \"../marshal.ts\";\nimport { unmarshal } from \"../unmarshal.ts\";\n\ninterface ReadableStreamController {\n enqueue(chunk: unknown): void;\n close(): void;\n error(e: unknown): void;\n desiredSize: number | null;\n}\n\ninterface ReadableStreamInternalState {\n locked: boolean;\n controller: ReadableStreamController;\n reader: ReadableStreamReaderState | null;\n queue: unknown[];\n closeRequested: boolean;\n closed: boolean;\n errored: boolean;\n errorValue: unknown;\n pullPromise: { resolve: () => void; reject: (e: unknown) => void } | null;\n started: boolean;\n source?: {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n };\n}\n\ninterface ReadableStreamReaderState {\n stream: ReadableStreamInternalState;\n closed: boolean;\n closedPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n _closedPromise?: Promise<void>; // Lazy-created to avoid marshalling issues\n readRequests: Array<{\n resolve: (result: { value: unknown; done: boolean }) => void;\n reject: (e: unknown) => void;\n }>;\n}\n\n/**\n * Create the ReadableStreamDefaultReader class\n */\nexport function createReadableStreamDefaultReaderClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<ReadableStreamReaderState>(context, stateMap, {\n name: \"ReadableStreamDefaultReader\",\n construct: () => {\n // Note: Actual construction happens when getReader() is called\n // Promise is created lazily to avoid marshalling issues with handle cleanup\n let resolveClosedPromise: (() => void) | undefined;\n let rejectClosedPromise: ((e: unknown) => void) | undefined;\n\n const state: ReadableStreamReaderState = {\n stream: null as unknown as ReadableStreamInternalState,\n closed: false,\n closedPromiseResolvers: {\n resolve: () => resolveClosedPromise?.(),\n reject: (e) => rejectClosedPromise?.(e),\n },\n readRequests: [],\n };\n\n // Define _closedPromise as a lazy getter (won't be marshalled until accessed)\n Object.defineProperty(state, \"_closedPromise\", {\n value: undefined,\n writable: true,\n enumerable: false, // Don't include in marshalling\n });\n\n // Create promise accessor\n Object.defineProperty(state, \"getClosedPromise\", {\n value: function (this: ReadableStreamReaderState): Promise<void> {\n if (!this._closedPromise) {\n this._closedPromise = new Promise<void>((resolve, reject) => {\n resolveClosedPromise = resolve;\n rejectClosedPromise = reject;\n });\n }\n return this._closedPromise;\n },\n enumerable: false,\n });\n\n return state;\n },\n properties: {\n closed: {\n get(this: ReadableStreamReaderState) {\n // Use the lazy promise accessor\n return (this as unknown as { getClosedPromise: () => Promise<void> }).getClosedPromise();\n },\n },\n },\n methods: {\n read(this: ReadableStreamReaderState): Promise<{ value: unknown; done: boolean }> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n if (this.stream.locked === false) {\n return Promise.reject(new TypeError(\"Stream is not locked\"));\n }\n\n return new Promise((resolve, reject) => {\n // If there's something in the queue, return it\n if (this.stream.queue.length > 0) {\n const chunk = this.stream.queue.shift();\n resolve({ value: chunk, done: false });\n return;\n }\n\n // If stream is closed, return done\n if (this.stream.closed || this.stream.closeRequested) {\n resolve({ value: undefined, done: true });\n this.closedPromiseResolvers.resolve();\n return;\n }\n\n // If stream errored, reject\n if (this.stream.errored) {\n reject(this.stream.errorValue);\n return;\n }\n\n // Otherwise, queue the read request\n this.readRequests.push({ resolve, reject });\n\n // Try to pull more data\n if (this.stream.source?.pull && this.stream.started) {\n try {\n const pullResult = this.stream.source.pull(this.stream.controller);\n if (pullResult instanceof Promise) {\n pullResult.catch((e) => {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.readRequests.forEach((req) => req.reject(e));\n this.readRequests = [];\n });\n }\n } catch (e) {\n this.stream.errored = true;\n this.stream.errorValue = e;\n reject(e);\n }\n }\n });\n },\n cancel(this: ReadableStreamReaderState, reason?: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.stream.source?.cancel) {\n const result = this.stream.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n releaseLock(this: ReadableStreamReaderState): void {\n if (!this.stream) {\n return;\n }\n this.stream.locked = false;\n this.stream.reader = null;\n },\n },\n });\n}\n\n/**\n * Create the ReadableStream class\n */\nexport function createReadableStreamClass(\n context: QuickJSContext,\n stateMap: StateMap,\n readerClass: QuickJSHandle\n): QuickJSHandle {\n const classHandle = defineClass<ReadableStreamInternalState>(context, stateMap, {\n name: \"ReadableStream\",\n construct: (args) => {\n const underlyingSource = args[0] as {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n } | undefined;\n\n const state: ReadableStreamInternalState = {\n locked: false,\n controller: null as unknown as ReadableStreamController,\n reader: null,\n queue: [],\n closeRequested: false,\n closed: false,\n errored: false,\n errorValue: undefined,\n pullPromise: null,\n started: false,\n source: underlyingSource,\n };\n\n // Create controller\n state.controller = {\n enqueue(chunk: unknown) {\n if (state.closeRequested || state.closed) {\n throw new TypeError(\"Stream is closed\");\n }\n state.queue.push(chunk);\n\n // If there are pending read requests, fulfill them\n if (state.reader && state.reader.readRequests.length > 0) {\n const request = state.reader.readRequests.shift()!;\n const value = state.queue.shift();\n request.resolve({ value, done: false });\n }\n },\n close() {\n if (state.closeRequested || state.closed) {\n return;\n }\n state.closeRequested = true;\n\n if (state.queue.length === 0) {\n state.closed = true;\n if (state.reader) {\n state.reader.closedPromiseResolvers.resolve();\n // Resolve any pending reads with done: true\n state.reader.readRequests.forEach((req) => {\n req.resolve({ value: undefined, done: true });\n });\n state.reader.readRequests = [];\n }\n }\n },\n error(e: unknown) {\n if (state.errored || state.closed) {\n return;\n }\n state.errored = true;\n state.errorValue = e;\n\n if (state.reader) {\n state.reader.closedPromiseResolvers.reject(e);\n state.reader.readRequests.forEach((req) => req.reject(e));\n state.reader.readRequests = [];\n }\n },\n get desiredSize() {\n if (state.errored) return null;\n if (state.closeRequested) return 0;\n return 1 - state.queue.length;\n },\n };\n\n // Call start if provided\n if (underlyingSource?.start) {\n try {\n const startResult = underlyingSource.start(state.controller);\n if (startResult instanceof Promise) {\n startResult\n .then(() => {\n state.started = true;\n })\n .catch((e) => {\n state.errored = true;\n state.errorValue = e;\n });\n } else {\n state.started = true;\n }\n } catch (e) {\n state.errored = true;\n state.errorValue = e;\n }\n } else {\n state.started = true;\n }\n\n return state;\n },\n properties: {\n locked: {\n get(this: ReadableStreamInternalState) {\n return this.locked;\n },\n },\n },\n methods: {\n // __linkReader__ is called from JavaScript getReader() to link stream and reader states\n __linkReader__(this: ReadableStreamInternalState, readerObj: unknown): void {\n if (this.locked) {\n throw new TypeError(\"ReadableStream is locked\");\n }\n this.locked = true;\n\n // Get the reader's internal state from instanceStateMap\n const readerId = (readerObj as { __instanceId__: number }).__instanceId__;\n const readerState = getInstanceStateById<ReadableStreamReaderState>(readerId);\n if (!readerState) {\n throw new Error(\"Reader instance state not found\");\n }\n\n // Link bidirectionally\n readerState.stream = this;\n this.reader = readerState;\n },\n cancel(this: ReadableStreamInternalState, reason?: unknown): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot cancel a locked stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.source?.cancel) {\n const result = this.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.closed = true;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n // Note: pipeTo, pipeThrough, and tee are implemented as JavaScript code below\n },\n });\n\n // Add methods to the prototype that need to be JavaScript code\n // (because they need to create instances of other classes or call methods on them)\n const prototypeHandle = context.getProp(classHandle, \"prototype\");\n\n // Define getReader - must be JavaScript to return a ReadableStreamDefaultReader instance\n const getReaderCode = `(function() {\n // Create a reader instance\n const reader = new ReadableStreamDefaultReader();\n // Link it to this stream's internal state\n this.__linkReader__(reader);\n return reader;\n })`;\n const getReaderResult = context.evalCode(getReaderCode);\n if (!getReaderResult.error) {\n context.setProp(prototypeHandle, \"getReader\", getReaderResult.value);\n getReaderResult.value.dispose();\n } else {\n getReaderResult.error.dispose();\n }\n\n // Define pipeTo\n const pipeToCode = `(async function(destination, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (destination.locked) throw new TypeError(\"WritableStream is locked\");\n\n const reader = this.getReader();\n const writer = destination.getWriter();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n await writer.write(value);\n }\n if (!options.preventClose) await writer.close();\n } catch (error) {\n if (!options.preventAbort) await writer.abort(error);\n if (!options.preventCancel) await reader.cancel(error);\n throw error;\n } finally {\n reader.releaseLock();\n writer.releaseLock();\n }\n })`;\n const pipeToResult = context.evalCode(pipeToCode);\n if (!pipeToResult.error) {\n context.setProp(prototypeHandle, \"pipeTo\", pipeToResult.value);\n pipeToResult.value.dispose();\n } else {\n pipeToResult.error.dispose();\n }\n\n // Define pipeThrough\n const pipeThroughCode = `(function(transform, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (transform.writable.locked) throw new TypeError(\"WritableStream is locked\");\n\n // Start piping in background\n this.pipeTo(transform.writable, {\n preventClose: options.preventClose,\n preventAbort: options.preventAbort,\n preventCancel: options.preventCancel,\n signal: options.signal\n }).catch(() => {}); // Errors handled internally\n\n return transform.readable;\n })`;\n const pipeThroughResult = context.evalCode(pipeThroughCode);\n if (!pipeThroughResult.error) {\n context.setProp(prototypeHandle, \"pipeThrough\", pipeThroughResult.value);\n pipeThroughResult.value.dispose();\n } else {\n pipeThroughResult.error.dispose();\n }\n\n // Define tee - uses a closure that references ReadableStream, so we need to set it after global registration\n // For now, we'll set it on the prototype but the inner ReadableStream references will need to be resolved at runtime\n const teeCode = `(function() {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n\n const reader = this.getReader();\n let reading = false;\n let readAgain = false;\n let canceled1 = false, canceled2 = false;\n let reason1, reason2;\n let branch1Controller, branch2Controller;\n\n function pullAlgorithm() {\n if (reading) {\n readAgain = true;\n return Promise.resolve();\n }\n reading = true;\n\n return reader.read().then(({ value, done }) => {\n reading = false;\n if (done) {\n if (!canceled1 && branch1Controller) branch1Controller.close();\n if (!canceled2 && branch2Controller) branch2Controller.close();\n return;\n }\n if (!canceled1 && branch1Controller) branch1Controller.enqueue(value);\n if (!canceled2 && branch2Controller) branch2Controller.enqueue(value);\n if (readAgain) {\n readAgain = false;\n return pullAlgorithm();\n }\n });\n }\n\n const branch1 = new ReadableStream({\n start(controller) { branch1Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled1 = true;\n reason1 = reason;\n if (canceled2) reader.cancel(reason1);\n }\n });\n\n const branch2 = new ReadableStream({\n start(controller) { branch2Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled2 = true;\n reason2 = reason;\n if (canceled1) reader.cancel(reason2);\n }\n });\n\n return [branch1, branch2];\n })`;\n const teeResult = context.evalCode(teeCode);\n if (!teeResult.error) {\n context.setProp(prototypeHandle, \"tee\", teeResult.value);\n teeResult.value.dispose();\n } else {\n teeResult.error.dispose();\n }\n\n prototypeHandle.dispose();\n\n return classHandle;\n}\n\n/**\n * Create a ReadableStream in QuickJS from a host-side source\n */\nexport function createReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n source: UnderlyingSource\n): QuickJSHandle {\n // Create the source object with callbacks that will work in QuickJS\n const sourceObj = context.newObject();\n\n if (source.start) {\n const startFn = context.newFunction(\"start\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.start!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"start\", startFn);\n startFn.dispose();\n }\n\n if (source.pull) {\n const pullFn = context.newFunction(\"pull\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.pull!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"pull\", pullFn);\n pullFn.dispose();\n }\n\n if (source.cancel) {\n const cancelFn = context.newFunction(\"cancel\", (reasonHandle) => {\n const reason = unmarshal(context, reasonHandle);\n const result = source.cancel!(reason);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"cancel\", cancelFn);\n cancelFn.dispose();\n }\n\n // Create ReadableStream instance using evalCode to ensure 'new' is used\n // Store source on global temporarily\n context.setProp(context.global, \"__tempReadableStreamSource__\", sourceObj);\n sourceObj.dispose();\n\n // Create the stream and store source reference on it to prevent GC\n // The source object needs to stay alive because the host-side unmarshaled\n // functions hold references to QuickJS handles that would be GCed otherwise\n const result = context.evalCode(`\n (function() {\n const stream = new ReadableStream(__tempReadableStreamSource__);\n stream.__source__ = __tempReadableStreamSource__;\n return stream;\n })()\n `);\n\n // Clean up temp property\n const cleanupResult = context.evalCode(\"delete __tempReadableStreamSource__\");\n if (cleanupResult.error) cleanupResult.error.dispose();\n else cleanupResult.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create ReadableStream: ${errorMsg}`);\n }\n\n return result.value;\n}\n\n/**\n * Consume a ReadableStream from QuickJS in the host\n */\nexport async function* consumeReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n streamHandle: QuickJSHandle\n): AsyncIterable<unknown> {\n // Get reader\n const getReaderFn = context.getProp(streamHandle, \"getReader\");\n const readerResult = context.callFunction(getReaderFn, streamHandle);\n getReaderFn.dispose();\n\n if (readerResult.error) {\n const error = context.dump(readerResult.error);\n readerResult.error.dispose();\n throw new Error(`Failed to get reader: ${error}`);\n }\n\n const reader = readerResult.value;\n\n try {\n while (true) {\n const readFn = context.getProp(reader, \"read\");\n const readResult = context.callFunction(readFn, reader);\n readFn.dispose();\n\n if (readResult.error) {\n const error = context.dump(readResult.error);\n readResult.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n // Handle promise\n const resolved = await context.resolvePromise(readResult.value);\n readResult.value.dispose();\n context.runtime.executePendingJobs();\n\n if (resolved.error) {\n const error = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n const result = unmarshal(context, resolved.value) as { value: unknown; done: boolean };\n resolved.value.dispose();\n\n if (result.done) {\n break;\n }\n\n yield result.value;\n }\n } finally {\n const releaseLockFn = context.getProp(reader, \"releaseLock\");\n context.callFunction(releaseLockFn, reader);\n releaseLockFn.dispose();\n reader.dispose();\n }\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.mjs\";\nimport { defineClass, getState, getInstanceStateById } from \"../class-builder.mjs\";\nimport { marshal } from \"../marshal.mjs\";\nimport { unmarshal } from \"../unmarshal.mjs\";\n\ninterface ReadableStreamController {\n enqueue(chunk: unknown): void;\n close(): void;\n error(e: unknown): void;\n desiredSize: number | null;\n}\n\ninterface ReadableStreamInternalState {\n locked: boolean;\n controller: ReadableStreamController;\n reader: ReadableStreamReaderState | null;\n queue: unknown[];\n closeRequested: boolean;\n closed: boolean;\n errored: boolean;\n errorValue: unknown;\n pullPromise: { resolve: () => void; reject: (e: unknown) => void } | null;\n started: boolean;\n source?: {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n };\n}\n\ninterface ReadableStreamReaderState {\n stream: ReadableStreamInternalState;\n closed: boolean;\n closedPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n _closedPromise?: Promise<void>; // Lazy-created to avoid marshalling issues\n readRequests: Array<{\n resolve: (result: { value: unknown; done: boolean }) => void;\n reject: (e: unknown) => void;\n }>;\n}\n\n/**\n * Create the ReadableStreamDefaultReader class\n */\nexport function createReadableStreamDefaultReaderClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<ReadableStreamReaderState>(context, stateMap, {\n name: \"ReadableStreamDefaultReader\",\n construct: () => {\n // Note: Actual construction happens when getReader() is called\n // Promise is created lazily to avoid marshalling issues with handle cleanup\n let resolveClosedPromise: (() => void) | undefined;\n let rejectClosedPromise: ((e: unknown) => void) | undefined;\n\n const state: ReadableStreamReaderState = {\n stream: null as unknown as ReadableStreamInternalState,\n closed: false,\n closedPromiseResolvers: {\n resolve: () => resolveClosedPromise?.(),\n reject: (e) => rejectClosedPromise?.(e),\n },\n readRequests: [],\n };\n\n // Define _closedPromise as a lazy getter (won't be marshalled until accessed)\n Object.defineProperty(state, \"_closedPromise\", {\n value: undefined,\n writable: true,\n enumerable: false, // Don't include in marshalling\n });\n\n // Create promise accessor\n Object.defineProperty(state, \"getClosedPromise\", {\n value: function (this: ReadableStreamReaderState): Promise<void> {\n if (!this._closedPromise) {\n this._closedPromise = new Promise<void>((resolve, reject) => {\n resolveClosedPromise = resolve;\n rejectClosedPromise = reject;\n });\n }\n return this._closedPromise;\n },\n enumerable: false,\n });\n\n return state;\n },\n properties: {\n closed: {\n get(this: ReadableStreamReaderState) {\n // Use the lazy promise accessor\n return (this as unknown as { getClosedPromise: () => Promise<void> }).getClosedPromise();\n },\n },\n },\n methods: {\n read(this: ReadableStreamReaderState): Promise<{ value: unknown; done: boolean }> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n if (this.stream.locked === false) {\n return Promise.reject(new TypeError(\"Stream is not locked\"));\n }\n\n return new Promise((resolve, reject) => {\n // If there's something in the queue, return it\n if (this.stream.queue.length > 0) {\n const chunk = this.stream.queue.shift();\n resolve({ value: chunk, done: false });\n return;\n }\n\n // If stream is closed, return done\n if (this.stream.closed || this.stream.closeRequested) {\n resolve({ value: undefined, done: true });\n this.closedPromiseResolvers.resolve();\n return;\n }\n\n // If stream errored, reject\n if (this.stream.errored) {\n reject(this.stream.errorValue);\n return;\n }\n\n // Otherwise, queue the read request\n this.readRequests.push({ resolve, reject });\n\n // Try to pull more data\n if (this.stream.source?.pull && this.stream.started) {\n try {\n const pullResult = this.stream.source.pull(this.stream.controller);\n if (pullResult instanceof Promise) {\n pullResult.catch((e) => {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.readRequests.forEach((req) => req.reject(e));\n this.readRequests = [];\n });\n }\n } catch (e) {\n this.stream.errored = true;\n this.stream.errorValue = e;\n reject(e);\n }\n }\n });\n },\n cancel(this: ReadableStreamReaderState, reason?: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Reader has no stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.stream.source?.cancel) {\n const result = this.stream.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n releaseLock(this: ReadableStreamReaderState): void {\n if (!this.stream) {\n return;\n }\n this.stream.locked = false;\n this.stream.reader = null;\n },\n },\n });\n}\n\n/**\n * Create the ReadableStream class\n */\nexport function createReadableStreamClass(\n context: QuickJSContext,\n stateMap: StateMap,\n readerClass: QuickJSHandle\n): QuickJSHandle {\n const classHandle = defineClass<ReadableStreamInternalState>(context, stateMap, {\n name: \"ReadableStream\",\n construct: (args) => {\n const underlyingSource = args[0] as {\n start?: (controller: ReadableStreamController) => void | Promise<void>;\n pull?: (controller: ReadableStreamController) => void | Promise<void>;\n cancel?: (reason?: unknown) => void | Promise<void>;\n } | undefined;\n\n const state: ReadableStreamInternalState = {\n locked: false,\n controller: null as unknown as ReadableStreamController,\n reader: null,\n queue: [],\n closeRequested: false,\n closed: false,\n errored: false,\n errorValue: undefined,\n pullPromise: null,\n started: false,\n source: underlyingSource,\n };\n\n // Create controller\n state.controller = {\n enqueue(chunk: unknown) {\n if (state.closeRequested || state.closed) {\n throw new TypeError(\"Stream is closed\");\n }\n state.queue.push(chunk);\n\n // If there are pending read requests, fulfill them\n if (state.reader && state.reader.readRequests.length > 0) {\n const request = state.reader.readRequests.shift()!;\n const value = state.queue.shift();\n request.resolve({ value, done: false });\n }\n },\n close() {\n if (state.closeRequested || state.closed) {\n return;\n }\n state.closeRequested = true;\n\n if (state.queue.length === 0) {\n state.closed = true;\n if (state.reader) {\n state.reader.closedPromiseResolvers.resolve();\n // Resolve any pending reads with done: true\n state.reader.readRequests.forEach((req) => {\n req.resolve({ value: undefined, done: true });\n });\n state.reader.readRequests = [];\n }\n }\n },\n error(e: unknown) {\n if (state.errored || state.closed) {\n return;\n }\n state.errored = true;\n state.errorValue = e;\n\n if (state.reader) {\n state.reader.closedPromiseResolvers.reject(e);\n state.reader.readRequests.forEach((req) => req.reject(e));\n state.reader.readRequests = [];\n }\n },\n get desiredSize() {\n if (state.errored) return null;\n if (state.closeRequested) return 0;\n return 1 - state.queue.length;\n },\n };\n\n // Call start if provided\n if (underlyingSource?.start) {\n try {\n const startResult = underlyingSource.start(state.controller);\n if (startResult instanceof Promise) {\n startResult\n .then(() => {\n state.started = true;\n })\n .catch((e) => {\n state.errored = true;\n state.errorValue = e;\n });\n } else {\n state.started = true;\n }\n } catch (e) {\n state.errored = true;\n state.errorValue = e;\n }\n } else {\n state.started = true;\n }\n\n return state;\n },\n properties: {\n locked: {\n get(this: ReadableStreamInternalState) {\n return this.locked;\n },\n },\n },\n methods: {\n // __linkReader__ is called from JavaScript getReader() to link stream and reader states\n __linkReader__(this: ReadableStreamInternalState, readerObj: unknown): void {\n if (this.locked) {\n throw new TypeError(\"ReadableStream is locked\");\n }\n this.locked = true;\n\n // Get the reader's internal state from instanceStateMap\n const readerId = (readerObj as { __instanceId__: number }).__instanceId__;\n const readerState = getInstanceStateById<ReadableStreamReaderState>(readerId);\n if (!readerState) {\n throw new Error(\"Reader instance state not found\");\n }\n\n // Link bidirectionally\n readerState.stream = this;\n this.reader = readerState;\n },\n cancel(this: ReadableStreamInternalState, reason?: unknown): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot cancel a locked stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n if (this.source?.cancel) {\n const result = this.source.cancel(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.closed = true;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n // Note: pipeTo, pipeThrough, and tee are implemented as JavaScript code below\n },\n });\n\n // Add methods to the prototype that need to be JavaScript code\n // (because they need to create instances of other classes or call methods on them)\n const prototypeHandle = context.getProp(classHandle, \"prototype\");\n\n // Define getReader - must be JavaScript to return a ReadableStreamDefaultReader instance\n const getReaderCode = `(function() {\n // Create a reader instance\n const reader = new ReadableStreamDefaultReader();\n // Link it to this stream's internal state\n this.__linkReader__(reader);\n return reader;\n })`;\n const getReaderResult = context.evalCode(getReaderCode);\n if (!getReaderResult.error) {\n context.setProp(prototypeHandle, \"getReader\", getReaderResult.value);\n getReaderResult.value.dispose();\n } else {\n getReaderResult.error.dispose();\n }\n\n // Define pipeTo\n const pipeToCode = `(async function(destination, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (destination.locked) throw new TypeError(\"WritableStream is locked\");\n\n const reader = this.getReader();\n const writer = destination.getWriter();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n await writer.write(value);\n }\n if (!options.preventClose) await writer.close();\n } catch (error) {\n if (!options.preventAbort) await writer.abort(error);\n if (!options.preventCancel) await reader.cancel(error);\n throw error;\n } finally {\n reader.releaseLock();\n writer.releaseLock();\n }\n })`;\n const pipeToResult = context.evalCode(pipeToCode);\n if (!pipeToResult.error) {\n context.setProp(prototypeHandle, \"pipeTo\", pipeToResult.value);\n pipeToResult.value.dispose();\n } else {\n pipeToResult.error.dispose();\n }\n\n // Define pipeThrough\n const pipeThroughCode = `(function(transform, options = {}) {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n if (transform.writable.locked) throw new TypeError(\"WritableStream is locked\");\n\n // Start piping in background\n this.pipeTo(transform.writable, {\n preventClose: options.preventClose,\n preventAbort: options.preventAbort,\n preventCancel: options.preventCancel,\n signal: options.signal\n }).catch(() => {}); // Errors handled internally\n\n return transform.readable;\n })`;\n const pipeThroughResult = context.evalCode(pipeThroughCode);\n if (!pipeThroughResult.error) {\n context.setProp(prototypeHandle, \"pipeThrough\", pipeThroughResult.value);\n pipeThroughResult.value.dispose();\n } else {\n pipeThroughResult.error.dispose();\n }\n\n // Define tee - uses a closure that references ReadableStream, so we need to set it after global registration\n // For now, we'll set it on the prototype but the inner ReadableStream references will need to be resolved at runtime\n const teeCode = `(function() {\n if (this.locked) throw new TypeError(\"ReadableStream is locked\");\n\n const reader = this.getReader();\n let reading = false;\n let readAgain = false;\n let canceled1 = false, canceled2 = false;\n let reason1, reason2;\n let branch1Controller, branch2Controller;\n\n function pullAlgorithm() {\n if (reading) {\n readAgain = true;\n return Promise.resolve();\n }\n reading = true;\n\n return reader.read().then(({ value, done }) => {\n reading = false;\n if (done) {\n if (!canceled1 && branch1Controller) branch1Controller.close();\n if (!canceled2 && branch2Controller) branch2Controller.close();\n return;\n }\n if (!canceled1 && branch1Controller) branch1Controller.enqueue(value);\n if (!canceled2 && branch2Controller) branch2Controller.enqueue(value);\n if (readAgain) {\n readAgain = false;\n return pullAlgorithm();\n }\n });\n }\n\n const branch1 = new ReadableStream({\n start(controller) { branch1Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled1 = true;\n reason1 = reason;\n if (canceled2) reader.cancel(reason1);\n }\n });\n\n const branch2 = new ReadableStream({\n start(controller) { branch2Controller = controller; },\n pull: pullAlgorithm,\n cancel(reason) {\n canceled2 = true;\n reason2 = reason;\n if (canceled1) reader.cancel(reason2);\n }\n });\n\n return [branch1, branch2];\n })`;\n const teeResult = context.evalCode(teeCode);\n if (!teeResult.error) {\n context.setProp(prototypeHandle, \"tee\", teeResult.value);\n teeResult.value.dispose();\n } else {\n teeResult.error.dispose();\n }\n\n prototypeHandle.dispose();\n\n return classHandle;\n}\n\n/**\n * Create a ReadableStream in QuickJS from a host-side source\n */\nexport function createReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n source: UnderlyingSource\n): QuickJSHandle {\n // Create the source object with callbacks that will work in QuickJS\n const sourceObj = context.newObject();\n\n if (source.start) {\n const startFn = context.newFunction(\"start\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.start!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"start\", startFn);\n startFn.dispose();\n }\n\n if (source.pull) {\n const pullFn = context.newFunction(\"pull\", (controllerHandle) => {\n const controller = {\n enqueue: (chunk: unknown) => {\n const enqueueFn = context.getProp(controllerHandle, \"enqueue\");\n const chunkHandle = marshal(context, chunk);\n context.callFunction(enqueueFn, controllerHandle, chunkHandle);\n chunkHandle.dispose();\n enqueueFn.dispose();\n },\n close: () => {\n const closeFn = context.getProp(controllerHandle, \"close\");\n context.callFunction(closeFn, controllerHandle);\n closeFn.dispose();\n },\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n };\n\n const result = source.pull!(controller as unknown as ReadableStreamController);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"pull\", pullFn);\n pullFn.dispose();\n }\n\n if (source.cancel) {\n const cancelFn = context.newFunction(\"cancel\", (reasonHandle) => {\n const reason = unmarshal(context, reasonHandle);\n const result = source.cancel!(reason);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result.then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n }).catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sourceObj, \"cancel\", cancelFn);\n cancelFn.dispose();\n }\n\n // Create ReadableStream instance using evalCode to ensure 'new' is used\n // Store source on global temporarily\n context.setProp(context.global, \"__tempReadableStreamSource__\", sourceObj);\n sourceObj.dispose();\n\n // Create the stream and store source reference on it to prevent GC\n // The source object needs to stay alive because the host-side unmarshaled\n // functions hold references to QuickJS handles that would be GCed otherwise\n const result = context.evalCode(`\n (function() {\n const stream = new ReadableStream(__tempReadableStreamSource__);\n stream.__source__ = __tempReadableStreamSource__;\n return stream;\n })()\n `);\n\n // Clean up temp property\n const cleanupResult = context.evalCode(\"delete __tempReadableStreamSource__\");\n if (cleanupResult.error) cleanupResult.error.dispose();\n else cleanupResult.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create ReadableStream: ${errorMsg}`);\n }\n\n return result.value;\n}\n\n/**\n * Consume a ReadableStream from QuickJS in the host\n */\nexport async function* consumeReadableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n streamHandle: QuickJSHandle\n): AsyncIterable<unknown> {\n // Get reader\n const getReaderFn = context.getProp(streamHandle, \"getReader\");\n const readerResult = context.callFunction(getReaderFn, streamHandle);\n getReaderFn.dispose();\n\n if (readerResult.error) {\n const error = context.dump(readerResult.error);\n readerResult.error.dispose();\n throw new Error(`Failed to get reader: ${error}`);\n }\n\n const reader = readerResult.value;\n\n try {\n while (true) {\n const readFn = context.getProp(reader, \"read\");\n const readResult = context.callFunction(readFn, reader);\n readFn.dispose();\n\n if (readResult.error) {\n const error = context.dump(readResult.error);\n readResult.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n // Handle promise\n const resolved = await context.resolvePromise(readResult.value);\n readResult.value.dispose();\n context.runtime.executePendingJobs();\n\n if (resolved.error) {\n const error = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Read failed: ${error}`);\n }\n\n const result = unmarshal(context, resolved.value) as { value: unknown; done: boolean };\n resolved.value.dispose();\n\n if (result.done) {\n break;\n }\n\n yield result.value;\n }\n } finally {\n const releaseLockFn = context.getProp(reader, \"releaseLock\");\n context.callFunction(releaseLockFn, reader);\n releaseLockFn.dispose();\n reader.dispose();\n }\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "3394935AF48488F664756E2164756E21",
8
+ "debugId": "5EEB8B186C260DD864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/scope.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { Scope } from \"./types.ts\";\n\n/**\n * Create a new scope for tracking handles\n */\nfunction createScope(): Scope {\n const handles: QuickJSHandle[] = [];\n\n return {\n manage<T extends QuickJSHandle>(handle: T): T {\n handles.push(handle);\n return handle;\n },\n get handles() {\n return handles as readonly QuickJSHandle[];\n },\n };\n}\n\n/**\n * Dispose all handles in a scope (in reverse order)\n */\nfunction disposeScope(scope: Scope): void {\n const handles = scope.handles;\n for (let i = handles.length - 1; i >= 0; i--) {\n const handle = handles[i];\n if (handle && handle.alive) {\n handle.dispose();\n }\n }\n}\n\n/**\n * Execute a function with automatic handle cleanup\n *\n * @example\n * const result = withScope(context, (scope) => {\n * const obj = scope.manage(context.newObject());\n * const str = scope.manage(context.newString(\"hello\"));\n * context.setProp(obj, \"message\", str);\n * return context.dump(obj);\n * });\n */\nexport function withScope<T>(\n _context: QuickJSContext,\n fn: (scope: Scope) => T\n): T {\n const scope = createScope();\n try {\n return fn(scope);\n } finally {\n disposeScope(scope);\n }\n}\n\n/**\n * Async version of withScope for promise-based operations\n */\nexport async function withScopeAsync<T>(\n _context: QuickJSContext,\n fn: (scope: Scope) => Promise<T>\n): Promise<T> {\n const scope = createScope();\n try {\n return await fn(scope);\n } finally {\n disposeScope(scope);\n }\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { Scope } from \"./types.mjs\";\n\n/**\n * Create a new scope for tracking handles\n */\nfunction createScope(): Scope {\n const handles: QuickJSHandle[] = [];\n\n return {\n manage<T extends QuickJSHandle>(handle: T): T {\n handles.push(handle);\n return handle;\n },\n get handles() {\n return handles as readonly QuickJSHandle[];\n },\n };\n}\n\n/**\n * Dispose all handles in a scope (in reverse order)\n */\nfunction disposeScope(scope: Scope): void {\n const handles = scope.handles;\n for (let i = handles.length - 1; i >= 0; i--) {\n const handle = handles[i];\n if (handle && handle.alive) {\n handle.dispose();\n }\n }\n}\n\n/**\n * Execute a function with automatic handle cleanup\n *\n * @example\n * const result = withScope(context, (scope) => {\n * const obj = scope.manage(context.newObject());\n * const str = scope.manage(context.newString(\"hello\"));\n * context.setProp(obj, \"message\", str);\n * return context.dump(obj);\n * });\n */\nexport function withScope<T>(\n _context: QuickJSContext,\n fn: (scope: Scope) => T\n): T {\n const scope = createScope();\n try {\n return fn(scope);\n } finally {\n disposeScope(scope);\n }\n}\n\n/**\n * Async version of withScope for promise-based operations\n */\nexport async function withScopeAsync<T>(\n _context: QuickJSContext,\n fn: (scope: Scope) => Promise<T>\n): Promise<T> {\n const scope = createScope();\n try {\n return await fn(scope);\n } finally {\n disposeScope(scope);\n }\n}\n"
6
6
  ],
7
7
  "mappings": ";;AAMA,SAAS,WAAW,GAAU;AAAA,EAC5B,MAAM,UAA2B,CAAC;AAAA,EAElC,OAAO;AAAA,IACL,MAA+B,CAAC,QAAc;AAAA,MAC5C,QAAQ,KAAK,MAAM;AAAA,MACnB,OAAO;AAAA;AAAA,QAEL,OAAO,GAAG;AAAA,MACZ,OAAO;AAAA;AAAA,EAEX;AAAA;AAMF,SAAS,YAAY,CAAC,OAAoB;AAAA,EACxC,MAAM,UAAU,MAAM;AAAA,EACtB,SAAS,IAAI,QAAQ,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IAC5C,MAAM,SAAS,QAAQ;AAAA,IACvB,IAAI,UAAU,OAAO,OAAO;AAAA,MAC1B,OAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAcK,SAAS,SAAY,CAC1B,UACA,IACG;AAAA,EACH,MAAM,QAAQ,YAAY;AAAA,EAC1B,IAAI;AAAA,IACF,OAAO,GAAG,KAAK;AAAA,YACf;AAAA,IACA,aAAa,KAAK;AAAA;AAAA;AAOtB,eAAsB,cAAiB,CACrC,UACA,IACY;AAAA,EACZ,MAAM,QAAQ,YAAY;AAAA,EAC1B,IAAI;AAAA,IACF,OAAO,MAAM,GAAG,KAAK;AAAA,YACrB;AAAA,IACA,aAAa,KAAK;AAAA;AAAA;",
8
8
  "debugId": "BB6D786BA78D550164756E2164756E21",
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/streams/transform-stream.ts
3
- import { defineClass } from "../class-builder.ts";
3
+ import { defineClass } from "../class-builder.mjs";
4
4
  function createTransformStreamClass(context, stateMap) {
5
5
  return defineClass(context, stateMap, {
6
6
  name: "TransformStream",
@@ -118,4 +118,4 @@ export {
118
118
  createTransformStreamClass
119
119
  };
120
120
 
121
- //# debugId=10A77E805F81A64664756E2164756E21
121
+ //# debugId=D0BB6B9CF266DB4E64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/streams/transform-stream.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.ts\";\nimport { defineClass } from \"../class-builder.ts\";\nimport { marshal } from \"../marshal.ts\";\nimport { unmarshal } from \"../unmarshal.ts\";\n\ninterface TransformStreamController {\n enqueue(chunk: unknown): void;\n error(e: unknown): void;\n terminate(): void;\n desiredSize: number | null;\n}\n\ninterface TransformStreamInternalState {\n readable: object; // ReadableStream internal state\n writable: object; // WritableStream internal state\n transformer?: {\n start?: (controller: TransformStreamController) => void | Promise<void>;\n transform?: (chunk: unknown, controller: TransformStreamController) => void | Promise<void>;\n flush?: (controller: TransformStreamController) => void | Promise<void>;\n };\n controller: TransformStreamController;\n backpressure: boolean;\n backpressureChangePromise: {\n resolve: () => void;\n promise: Promise<void>;\n } | null;\n}\n\n/**\n * Create the TransformStream class\n */\nexport function createTransformStreamClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<TransformStreamInternalState>(context, stateMap, {\n name: \"TransformStream\",\n construct: (args) => {\n const transformer = args[0] as {\n start?: (controller: TransformStreamController) => void | Promise<void>;\n transform?: (chunk: unknown, controller: TransformStreamController) => void | Promise<void>;\n flush?: (controller: TransformStreamController) => void | Promise<void>;\n } | undefined;\n\n // Queue for the readable side\n const readableQueue: unknown[] = [];\n let readableCloseRequested = false;\n let readableClosed = false;\n let readableErrored = false;\n let readableErrorValue: unknown = undefined;\n\n // Create controller\n const controller: TransformStreamController = {\n enqueue(chunk: unknown) {\n if (readableCloseRequested || readableClosed) {\n throw new TypeError(\"Readable side is closed\");\n }\n readableQueue.push(chunk);\n },\n error(e: unknown) {\n readableErrored = true;\n readableErrorValue = e;\n },\n terminate() {\n readableCloseRequested = true;\n },\n get desiredSize() {\n if (readableErrored) return null;\n if (readableCloseRequested) return 0;\n return 1 - readableQueue.length;\n },\n };\n\n // Create readable side state\n const readableState = {\n locked: false,\n reader: null,\n queue: readableQueue,\n closeRequested: readableCloseRequested,\n closed: readableClosed,\n errored: readableErrored,\n errorValue: readableErrorValue,\n started: true,\n controller: {\n enqueue: controller.enqueue,\n close: controller.terminate,\n error: controller.error,\n desiredSize: 1,\n },\n };\n\n // Create writable side state\n const writableState = {\n locked: false,\n writer: null,\n closed: false,\n errored: false,\n errorValue: undefined,\n closeRequested: false,\n writeRequests: [],\n inFlightWriteRequest: null,\n started: true,\n controller: {\n error: controller.error,\n },\n sink: {\n write: async (chunk: unknown) => {\n if (transformer?.transform) {\n await transformer.transform(chunk, controller);\n } else {\n // Default identity transform\n controller.enqueue(chunk);\n }\n },\n close: async () => {\n if (transformer?.flush) {\n await transformer.flush(controller);\n }\n controller.terminate();\n },\n },\n };\n\n const state: TransformStreamInternalState = {\n readable: readableState,\n writable: writableState,\n transformer,\n controller,\n backpressure: false,\n backpressureChangePromise: null,\n };\n\n // Call start if provided\n if (transformer?.start) {\n try {\n const startResult = transformer.start(controller);\n if (startResult instanceof Promise) {\n startResult.catch((e) => {\n controller.error(e);\n });\n }\n } catch (e) {\n controller.error(e);\n }\n }\n\n return state;\n },\n properties: {\n readable: {\n get(this: TransformStreamInternalState) {\n // Return the readable state - will be wrapped by the stream class\n return this.readable;\n },\n },\n writable: {\n get(this: TransformStreamInternalState) {\n // Return the writable state - will be wrapped by the stream class\n return this.writable;\n },\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\";\nimport { marshal } from \"../marshal.mjs\";\nimport { unmarshal } from \"../unmarshal.mjs\";\n\ninterface TransformStreamController {\n enqueue(chunk: unknown): void;\n error(e: unknown): void;\n terminate(): void;\n desiredSize: number | null;\n}\n\ninterface TransformStreamInternalState {\n readable: object; // ReadableStream internal state\n writable: object; // WritableStream internal state\n transformer?: {\n start?: (controller: TransformStreamController) => void | Promise<void>;\n transform?: (chunk: unknown, controller: TransformStreamController) => void | Promise<void>;\n flush?: (controller: TransformStreamController) => void | Promise<void>;\n };\n controller: TransformStreamController;\n backpressure: boolean;\n backpressureChangePromise: {\n resolve: () => void;\n promise: Promise<void>;\n } | null;\n}\n\n/**\n * Create the TransformStream class\n */\nexport function createTransformStreamClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<TransformStreamInternalState>(context, stateMap, {\n name: \"TransformStream\",\n construct: (args) => {\n const transformer = args[0] as {\n start?: (controller: TransformStreamController) => void | Promise<void>;\n transform?: (chunk: unknown, controller: TransformStreamController) => void | Promise<void>;\n flush?: (controller: TransformStreamController) => void | Promise<void>;\n } | undefined;\n\n // Queue for the readable side\n const readableQueue: unknown[] = [];\n let readableCloseRequested = false;\n let readableClosed = false;\n let readableErrored = false;\n let readableErrorValue: unknown = undefined;\n\n // Create controller\n const controller: TransformStreamController = {\n enqueue(chunk: unknown) {\n if (readableCloseRequested || readableClosed) {\n throw new TypeError(\"Readable side is closed\");\n }\n readableQueue.push(chunk);\n },\n error(e: unknown) {\n readableErrored = true;\n readableErrorValue = e;\n },\n terminate() {\n readableCloseRequested = true;\n },\n get desiredSize() {\n if (readableErrored) return null;\n if (readableCloseRequested) return 0;\n return 1 - readableQueue.length;\n },\n };\n\n // Create readable side state\n const readableState = {\n locked: false,\n reader: null,\n queue: readableQueue,\n closeRequested: readableCloseRequested,\n closed: readableClosed,\n errored: readableErrored,\n errorValue: readableErrorValue,\n started: true,\n controller: {\n enqueue: controller.enqueue,\n close: controller.terminate,\n error: controller.error,\n desiredSize: 1,\n },\n };\n\n // Create writable side state\n const writableState = {\n locked: false,\n writer: null,\n closed: false,\n errored: false,\n errorValue: undefined,\n closeRequested: false,\n writeRequests: [],\n inFlightWriteRequest: null,\n started: true,\n controller: {\n error: controller.error,\n },\n sink: {\n write: async (chunk: unknown) => {\n if (transformer?.transform) {\n await transformer.transform(chunk, controller);\n } else {\n // Default identity transform\n controller.enqueue(chunk);\n }\n },\n close: async () => {\n if (transformer?.flush) {\n await transformer.flush(controller);\n }\n controller.terminate();\n },\n },\n };\n\n const state: TransformStreamInternalState = {\n readable: readableState,\n writable: writableState,\n transformer,\n controller,\n backpressure: false,\n backpressureChangePromise: null,\n };\n\n // Call start if provided\n if (transformer?.start) {\n try {\n const startResult = transformer.start(controller);\n if (startResult instanceof Promise) {\n startResult.catch((e) => {\n controller.error(e);\n });\n }\n } catch (e) {\n controller.error(e);\n }\n }\n\n return state;\n },\n properties: {\n readable: {\n get(this: TransformStreamInternalState) {\n // Return the readable state - will be wrapped by the stream class\n return this.readable;\n },\n },\n writable: {\n get(this: TransformStreamInternalState) {\n // Return the writable state - will be wrapped by the stream class\n return this.writable;\n },\n },\n },\n });\n}\n"
6
6
  ],
7
7
  "mappings": ";;AAEA;AA8BO,SAAS,0BAA0B,CACxC,SACA,UACe;AAAA,EACf,OAAO,YAA0C,SAAS,UAAU;AAAA,IAClE,MAAM;AAAA,IACN,WAAW,CAAC,SAAS;AAAA,MACnB,MAAM,cAAc,KAAK;AAAA,MAOzB,MAAM,gBAA2B,CAAC;AAAA,MAClC,IAAI,yBAAyB;AAAA,MAC7B,IAAI,iBAAiB;AAAA,MACrB,IAAI,kBAAkB;AAAA,MACtB,IAAI,qBAA8B;AAAA,MAGlC,MAAM,aAAwC;AAAA,QAC5C,OAAO,CAAC,OAAgB;AAAA,UACtB,IAAI,0BAA0B,gBAAgB;AAAA,YAC5C,MAAM,IAAI,UAAU,yBAAyB;AAAA,UAC/C;AAAA,UACA,cAAc,KAAK,KAAK;AAAA;AAAA,QAE1B,KAAK,CAAC,GAAY;AAAA,UAChB,kBAAkB;AAAA,UAClB,qBAAqB;AAAA;AAAA,QAEvB,SAAS,GAAG;AAAA,UACV,yBAAyB;AAAA;AAAA,YAEvB,WAAW,GAAG;AAAA,UAChB,IAAI;AAAA,YAAiB,OAAO;AAAA,UAC5B,IAAI;AAAA,YAAwB,OAAO;AAAA,UACnC,OAAO,IAAI,cAAc;AAAA;AAAA,MAE7B;AAAA,MAGA,MAAM,gBAAgB;AAAA,QACpB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,UACV,SAAS,WAAW;AAAA,UACpB,OAAO,WAAW;AAAA,UAClB,OAAO,WAAW;AAAA,UAClB,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MAGA,MAAM,gBAAgB;AAAA,QACpB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,eAAe,CAAC;AAAA,QAChB,sBAAsB;AAAA,QACtB,SAAS;AAAA,QACT,YAAY;AAAA,UACV,OAAO,WAAW;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,UACJ,OAAO,OAAO,UAAmB;AAAA,YAC/B,IAAI,aAAa,WAAW;AAAA,cAC1B,MAAM,YAAY,UAAU,OAAO,UAAU;AAAA,YAC/C,EAAO;AAAA,cAEL,WAAW,QAAQ,KAAK;AAAA;AAAA;AAAA,UAG5B,OAAO,YAAY;AAAA,YACjB,IAAI,aAAa,OAAO;AAAA,cACtB,MAAM,YAAY,MAAM,UAAU;AAAA,YACpC;AAAA,YACA,WAAW,UAAU;AAAA;AAAA,QAEzB;AAAA,MACF;AAAA,MAEA,MAAM,QAAsC;AAAA,QAC1C,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,2BAA2B;AAAA,MAC7B;AAAA,MAGA,IAAI,aAAa,OAAO;AAAA,QACtB,IAAI;AAAA,UACF,MAAM,cAAc,YAAY,MAAM,UAAU;AAAA,UAChD,IAAI,uBAAuB,SAAS;AAAA,YAClC,YAAY,MAAM,CAAC,MAAM;AAAA,cACvB,WAAW,MAAM,CAAC;AAAA,aACnB;AAAA,UACH;AAAA,UACA,OAAO,GAAG;AAAA,UACV,WAAW,MAAM,CAAC;AAAA;AAAA,MAEtB;AAAA,MAEA,OAAO;AAAA;AAAA,IAET,YAAY;AAAA,MACV,UAAU;AAAA,QACR,GAAG,GAAqC;AAAA,UAEtC,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,UAAU;AAAA,QACR,GAAG,GAAqC;AAAA,UAEtC,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,IACF;AAAA,EACF,CAAC;AAAA;",
8
- "debugId": "10A77E805F81A64664756E2164756E21",
8
+ "debugId": "D0BB6B9CF266DB4E64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/unmarshal.ts
3
- import { marshal } from "./marshal.ts";
3
+ import { marshal } from "./marshal.mjs";
4
4
  var contextDupedHandles = new WeakMap;
5
5
  function getDupedHandles(context) {
6
6
  let handles = contextDupedHandles.get(context);
@@ -220,4 +220,4 @@ export {
220
220
  cleanupUnmarshaledHandles
221
221
  };
222
222
 
223
- //# debugId=D0CEFCE6F8D5897C64756E2164756E21
223
+ //# debugId=729C5529556F43A764756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/unmarshal.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { UnmarshalOptions } from \"./types.ts\";\nimport { marshal } from \"./marshal.ts\";\n\n// Track duped handles per context so they can be cleaned up\nconst contextDupedHandles = new WeakMap<QuickJSContext, Set<QuickJSHandle>>();\n\n/**\n * Get or create the set of duped handles for a context\n */\nfunction getDupedHandles(context: QuickJSContext): Set<QuickJSHandle> {\n let handles = contextDupedHandles.get(context);\n if (!handles) {\n handles = new Set();\n contextDupedHandles.set(context, handles);\n }\n return handles;\n}\n\n/**\n * Clean up all duped handles for a context\n * Should be called before disposing the context\n */\nexport function cleanupUnmarshaledHandles(context: QuickJSContext): void {\n const handles = contextDupedHandles.get(context);\n if (handles) {\n for (const handle of handles) {\n try {\n handle.dispose();\n } catch {\n // Handle may already be disposed\n }\n }\n handles.clear();\n contextDupedHandles.delete(context);\n }\n}\n\n/**\n * Unmarshal a QuickJS handle to a JavaScript value\n *\n * @example\n * const value = unmarshal(context, handle);\n */\nexport function unmarshal(\n context: QuickJSContext,\n handle: QuickJSHandle,\n options: UnmarshalOptions = {}\n): unknown {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakMap<QuickJSHandle, object>();\n\n function unmarshalValue(h: QuickJSHandle, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Maximum unmarshalling depth of ${maxDepth} exceeded`);\n }\n\n // Try custom unmarshaller first\n if (options.custom) {\n const customResult = options.custom(h, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n const type = context.typeof(h);\n\n // Handle primitives\n if (type === \"undefined\") {\n return undefined;\n }\n\n // Check for null (typeof returns \"object\" for null)\n const dumpedValue = context.dump(h);\n if (dumpedValue === null) {\n return null;\n }\n\n if (type === \"boolean\") {\n return dumpedValue as boolean;\n }\n if (type === \"number\") {\n return dumpedValue as number;\n }\n if (type === \"string\") {\n return dumpedValue as string;\n }\n\n // Handle bigint\n if (typeof dumpedValue === \"bigint\") {\n return dumpedValue;\n }\n\n // Handle functions - return a wrapper that calls back into QuickJS\n if (type === \"function\") {\n // Dup the handle so it stays alive after unmarshalling\n // This is necessary because the caller may dispose the original handle\n const fnHandle = h.dup();\n // Track the duped handle for cleanup\n getDupedHandles(context).add(fnHandle);\n const wrapper = (...args: unknown[]) => {\n const argHandles = args.map((arg) => marshal(context, arg));\n try {\n const result = context.callFunction(fnHandle, context.undefined, ...argHandles);\n if (result.error) {\n const errorValue = context.dump(result.error);\n result.error.dispose();\n throw new Error(\n typeof errorValue === \"object\" && errorValue !== null\n ? (errorValue as { message?: string }).message || String(errorValue)\n : String(errorValue)\n );\n }\n const value = unmarshalValue(result.value, depth + 1);\n result.value.dispose();\n return value;\n } finally {\n for (const argHandle of argHandles) {\n argHandle.dispose();\n }\n }\n };\n // Attach a dispose method to clean up the handle when the function is no longer needed\n (wrapper as unknown as { __dispose__: () => void }).__dispose__ = () => {\n fnHandle.dispose();\n };\n return wrapper;\n }\n\n // Handle objects\n if (type === \"object\") {\n // Check for circular reference\n if (seen.has(h)) {\n return seen.get(h);\n }\n\n // Check if it's an array\n const lengthHandle = context.getProp(h, \"length\");\n const lengthType = context.typeof(lengthHandle);\n lengthHandle.dispose();\n\n if (lengthType === \"number\") {\n // Check for Array by looking for Array.isArray\n const arrayIsArray = context.getProp(context.global, \"Array\");\n const isArrayFn = context.getProp(arrayIsArray, \"isArray\");\n const isArrayResult = context.callFunction(isArrayFn, context.undefined, h);\n arrayIsArray.dispose();\n isArrayFn.dispose();\n\n let isArray = false;\n if (!isArrayResult.error) {\n isArray = context.dump(isArrayResult.value) === true;\n isArrayResult.value.dispose();\n } else {\n isArrayResult.error.dispose();\n }\n\n if (isArray) {\n const arr: unknown[] = [];\n seen.set(h, arr);\n\n const len = context.getNumber(context.getProp(h, \"length\"));\n const lenHandle = context.getProp(h, \"length\");\n const length = context.getNumber(lenHandle);\n lenHandle.dispose();\n\n for (let i = 0; i < length; i++) {\n const elementHandle = context.getProp(h, i);\n arr[i] = unmarshalValue(elementHandle, depth + 1);\n elementHandle.dispose();\n }\n return arr;\n }\n }\n\n // Check if it's a Date\n const dateConstructor = context.getProp(context.global, \"Date\");\n const isDateResult = context.evalCode(`(function(obj, Date) { return obj instanceof Date; })`);\n if (!isDateResult.error) {\n const checkResult = context.callFunction(\n isDateResult.value,\n context.undefined,\n h,\n dateConstructor\n );\n isDateResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n dateConstructor.dispose();\n\n const getTimeHandle = context.getProp(h, \"getTime\");\n const timeResult = context.callFunction(getTimeHandle, h);\n getTimeHandle.dispose();\n\n if (!timeResult.error) {\n const timestamp = context.getNumber(timeResult.value);\n timeResult.value.dispose();\n return new Date(timestamp);\n }\n if (timeResult.error) timeResult.error.dispose();\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isDateResult.error.dispose();\n }\n dateConstructor.dispose();\n\n // Check if it's a Uint8Array\n const uint8ArrayConstructor = context.getProp(context.global, \"Uint8Array\");\n const isUint8ArrayResult = context.evalCode(`(function(obj, U8) { return obj instanceof U8; })`);\n if (!isUint8ArrayResult.error) {\n const checkResult = context.callFunction(\n isUint8ArrayResult.value,\n context.undefined,\n h,\n uint8ArrayConstructor\n );\n isUint8ArrayResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n\n // Get the Uint8Array bytes\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return new Uint8Array(arrayBuffer.value);\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n }\n } else {\n isUint8ArrayResult.error.dispose();\n uint8ArrayConstructor.dispose();\n }\n\n // Check if it's an ArrayBuffer\n const arrayBufferConstructor = context.getProp(context.global, \"ArrayBuffer\");\n const isArrayBufferResult = context.evalCode(`(function(obj, AB) { return obj instanceof AB; })`);\n if (!isArrayBufferResult.error) {\n const checkResult = context.callFunction(\n isArrayBufferResult.value,\n context.undefined,\n h,\n arrayBufferConstructor\n );\n isArrayBufferResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n\n // Get the ArrayBuffer bytes directly\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return arrayBuffer.value.slice(0);\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n }\n } else {\n isArrayBufferResult.error.dispose();\n arrayBufferConstructor.dispose();\n }\n\n // Plain object\n const obj: Record<string, unknown> = {};\n seen.set(h, obj);\n\n // Get own enumerable properties\n const keysResult = context.evalCode(`(function(obj) { return Object.keys(obj); })`);\n if (!keysResult.error) {\n const keysArrayHandle = context.callFunction(keysResult.value, context.undefined, h);\n keysResult.value.dispose();\n\n if (!keysArrayHandle.error) {\n const keysArray = unmarshalValue(keysArrayHandle.value, depth + 1) as string[];\n keysArrayHandle.value.dispose();\n\n for (const key of keysArray) {\n const propHandle = context.getProp(h, key);\n obj[key] = unmarshalValue(propHandle, depth + 1);\n propHandle.dispose();\n }\n } else {\n keysArrayHandle.error.dispose();\n }\n } else {\n keysResult.error.dispose();\n }\n\n return obj;\n }\n\n // Fallback to dump for unknown types\n return dumpedValue;\n }\n\n return unmarshalValue(handle, 0);\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { UnmarshalOptions } from \"./types.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n// Track duped handles per context so they can be cleaned up\nconst contextDupedHandles = new WeakMap<QuickJSContext, Set<QuickJSHandle>>();\n\n/**\n * Get or create the set of duped handles for a context\n */\nfunction getDupedHandles(context: QuickJSContext): Set<QuickJSHandle> {\n let handles = contextDupedHandles.get(context);\n if (!handles) {\n handles = new Set();\n contextDupedHandles.set(context, handles);\n }\n return handles;\n}\n\n/**\n * Clean up all duped handles for a context\n * Should be called before disposing the context\n */\nexport function cleanupUnmarshaledHandles(context: QuickJSContext): void {\n const handles = contextDupedHandles.get(context);\n if (handles) {\n for (const handle of handles) {\n try {\n handle.dispose();\n } catch {\n // Handle may already be disposed\n }\n }\n handles.clear();\n contextDupedHandles.delete(context);\n }\n}\n\n/**\n * Unmarshal a QuickJS handle to a JavaScript value\n *\n * @example\n * const value = unmarshal(context, handle);\n */\nexport function unmarshal(\n context: QuickJSContext,\n handle: QuickJSHandle,\n options: UnmarshalOptions = {}\n): unknown {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakMap<QuickJSHandle, object>();\n\n function unmarshalValue(h: QuickJSHandle, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Maximum unmarshalling depth of ${maxDepth} exceeded`);\n }\n\n // Try custom unmarshaller first\n if (options.custom) {\n const customResult = options.custom(h, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n const type = context.typeof(h);\n\n // Handle primitives\n if (type === \"undefined\") {\n return undefined;\n }\n\n // Check for null (typeof returns \"object\" for null)\n const dumpedValue = context.dump(h);\n if (dumpedValue === null) {\n return null;\n }\n\n if (type === \"boolean\") {\n return dumpedValue as boolean;\n }\n if (type === \"number\") {\n return dumpedValue as number;\n }\n if (type === \"string\") {\n return dumpedValue as string;\n }\n\n // Handle bigint\n if (typeof dumpedValue === \"bigint\") {\n return dumpedValue;\n }\n\n // Handle functions - return a wrapper that calls back into QuickJS\n if (type === \"function\") {\n // Dup the handle so it stays alive after unmarshalling\n // This is necessary because the caller may dispose the original handle\n const fnHandle = h.dup();\n // Track the duped handle for cleanup\n getDupedHandles(context).add(fnHandle);\n const wrapper = (...args: unknown[]) => {\n const argHandles = args.map((arg) => marshal(context, arg));\n try {\n const result = context.callFunction(fnHandle, context.undefined, ...argHandles);\n if (result.error) {\n const errorValue = context.dump(result.error);\n result.error.dispose();\n throw new Error(\n typeof errorValue === \"object\" && errorValue !== null\n ? (errorValue as { message?: string }).message || String(errorValue)\n : String(errorValue)\n );\n }\n const value = unmarshalValue(result.value, depth + 1);\n result.value.dispose();\n return value;\n } finally {\n for (const argHandle of argHandles) {\n argHandle.dispose();\n }\n }\n };\n // Attach a dispose method to clean up the handle when the function is no longer needed\n (wrapper as unknown as { __dispose__: () => void }).__dispose__ = () => {\n fnHandle.dispose();\n };\n return wrapper;\n }\n\n // Handle objects\n if (type === \"object\") {\n // Check for circular reference\n if (seen.has(h)) {\n return seen.get(h);\n }\n\n // Check if it's an array\n const lengthHandle = context.getProp(h, \"length\");\n const lengthType = context.typeof(lengthHandle);\n lengthHandle.dispose();\n\n if (lengthType === \"number\") {\n // Check for Array by looking for Array.isArray\n const arrayIsArray = context.getProp(context.global, \"Array\");\n const isArrayFn = context.getProp(arrayIsArray, \"isArray\");\n const isArrayResult = context.callFunction(isArrayFn, context.undefined, h);\n arrayIsArray.dispose();\n isArrayFn.dispose();\n\n let isArray = false;\n if (!isArrayResult.error) {\n isArray = context.dump(isArrayResult.value) === true;\n isArrayResult.value.dispose();\n } else {\n isArrayResult.error.dispose();\n }\n\n if (isArray) {\n const arr: unknown[] = [];\n seen.set(h, arr);\n\n const len = context.getNumber(context.getProp(h, \"length\"));\n const lenHandle = context.getProp(h, \"length\");\n const length = context.getNumber(lenHandle);\n lenHandle.dispose();\n\n for (let i = 0; i < length; i++) {\n const elementHandle = context.getProp(h, i);\n arr[i] = unmarshalValue(elementHandle, depth + 1);\n elementHandle.dispose();\n }\n return arr;\n }\n }\n\n // Check if it's a Date\n const dateConstructor = context.getProp(context.global, \"Date\");\n const isDateResult = context.evalCode(`(function(obj, Date) { return obj instanceof Date; })`);\n if (!isDateResult.error) {\n const checkResult = context.callFunction(\n isDateResult.value,\n context.undefined,\n h,\n dateConstructor\n );\n isDateResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n dateConstructor.dispose();\n\n const getTimeHandle = context.getProp(h, \"getTime\");\n const timeResult = context.callFunction(getTimeHandle, h);\n getTimeHandle.dispose();\n\n if (!timeResult.error) {\n const timestamp = context.getNumber(timeResult.value);\n timeResult.value.dispose();\n return new Date(timestamp);\n }\n if (timeResult.error) timeResult.error.dispose();\n }\n if (checkResult.error) checkResult.error.dispose();\n else if (checkResult.value) checkResult.value.dispose();\n } else {\n isDateResult.error.dispose();\n }\n dateConstructor.dispose();\n\n // Check if it's a Uint8Array\n const uint8ArrayConstructor = context.getProp(context.global, \"Uint8Array\");\n const isUint8ArrayResult = context.evalCode(`(function(obj, U8) { return obj instanceof U8; })`);\n if (!isUint8ArrayResult.error) {\n const checkResult = context.callFunction(\n isUint8ArrayResult.value,\n context.undefined,\n h,\n uint8ArrayConstructor\n );\n isUint8ArrayResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n\n // Get the Uint8Array bytes\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return new Uint8Array(arrayBuffer.value);\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n uint8ArrayConstructor.dispose();\n }\n } else {\n isUint8ArrayResult.error.dispose();\n uint8ArrayConstructor.dispose();\n }\n\n // Check if it's an ArrayBuffer\n const arrayBufferConstructor = context.getProp(context.global, \"ArrayBuffer\");\n const isArrayBufferResult = context.evalCode(`(function(obj, AB) { return obj instanceof AB; })`);\n if (!isArrayBufferResult.error) {\n const checkResult = context.callFunction(\n isArrayBufferResult.value,\n context.undefined,\n h,\n arrayBufferConstructor\n );\n isArrayBufferResult.value.dispose();\n\n if (!checkResult.error && context.dump(checkResult.value) === true) {\n checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n\n // Get the ArrayBuffer bytes directly\n const arrayBuffer = context.getArrayBuffer(h);\n if (arrayBuffer) {\n return arrayBuffer.value.slice(0);\n }\n // Fall through to plain object handling if getArrayBuffer fails\n } else {\n if (checkResult.error) checkResult.error.dispose();\n else checkResult.value.dispose();\n arrayBufferConstructor.dispose();\n }\n } else {\n isArrayBufferResult.error.dispose();\n arrayBufferConstructor.dispose();\n }\n\n // Plain object\n const obj: Record<string, unknown> = {};\n seen.set(h, obj);\n\n // Get own enumerable properties\n const keysResult = context.evalCode(`(function(obj) { return Object.keys(obj); })`);\n if (!keysResult.error) {\n const keysArrayHandle = context.callFunction(keysResult.value, context.undefined, h);\n keysResult.value.dispose();\n\n if (!keysArrayHandle.error) {\n const keysArray = unmarshalValue(keysArrayHandle.value, depth + 1) as string[];\n keysArrayHandle.value.dispose();\n\n for (const key of keysArray) {\n const propHandle = context.getProp(h, key);\n obj[key] = unmarshalValue(propHandle, depth + 1);\n propHandle.dispose();\n }\n } else {\n keysArrayHandle.error.dispose();\n }\n } else {\n keysResult.error.dispose();\n }\n\n return obj;\n }\n\n // Fallback to dump for unknown types\n return dumpedValue;\n }\n\n return unmarshalValue(handle, 0);\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "D0CEFCE6F8D5897C64756E2164756E21",
8
+ "debugId": "729C5529556F43A764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/url-search-params.ts
3
- import { defineClass } from "./class-builder.ts";
3
+ import { defineClass } from "./class-builder.mjs";
4
4
  function parseQueryString(query) {
5
5
  const cleanQuery = query.startsWith("?") ? query.slice(1) : query;
6
6
  if (!cleanQuery)
@@ -131,4 +131,4 @@ export {
131
131
  createURLSearchParamsClass
132
132
  };
133
133
 
134
- //# debugId=8B585EE3F07934C964756E2164756E21
134
+ //# debugId=CC9AE1426E9F2DFF64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/url-search-params.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 * Internal state for URLSearchParams\n */\nexport interface URLSearchParamsState {\n params: [string, string][];\n}\n\n/**\n * Parse a query string into key-value pairs\n */\nfunction parseQueryString(query: string): [string, string][] {\n // Remove leading ? if present\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return [];\n\n const params: [string, string][] = [];\n for (const pair of cleanQuery.split(\"&\")) {\n if (!pair) continue;\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n // Key with no value\n params.push([decodeURIComponent(pair), \"\"]);\n } else {\n const key = decodeURIComponent(pair.slice(0, eqIndex));\n const value = decodeURIComponent(pair.slice(eqIndex + 1));\n params.push([key, value]);\n }\n }\n return params;\n}\n\n/**\n * Create the URLSearchParams class for QuickJS\n */\nexport function createURLSearchParamsClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLSearchParamsState>(context, stateMap, {\n name: \"URLSearchParams\",\n construct: (args) => {\n const init = args[0];\n let params: [string, string][] = [];\n\n if (init === undefined || init === null) {\n // Empty params\n params = [];\n } else if (typeof init === \"string\") {\n // Parse query string\n params = parseQueryString(init);\n } else if (Array.isArray(init)) {\n // Array of [key, value] pairs\n for (const pair of init) {\n if (Array.isArray(pair) && pair.length >= 2) {\n params.push([String(pair[0]), String(pair[1])]);\n }\n }\n } else if (typeof init === \"object\") {\n // Check if it's another URLSearchParamsState\n if (\"params\" in init && Array.isArray(init.params)) {\n params = [...(init as URLSearchParamsState).params];\n } else {\n // Plain object\n for (const [key, value] of Object.entries(init)) {\n params.push([String(key), String(value)]);\n }\n }\n }\n\n return { params };\n },\n properties: {\n size: {\n get(this: URLSearchParamsState) {\n return this.params.length;\n },\n },\n },\n methods: {\n append(this: URLSearchParamsState, name: unknown, value: unknown) {\n this.params.push([String(name), String(value)]);\n },\n delete(this: URLSearchParamsState, name: unknown, value?: unknown) {\n const nameStr = String(name);\n if (value !== undefined) {\n // Delete only entries with matching name AND value\n const valueStr = String(value);\n this.params = this.params.filter(\n ([k, v]) => !(k === nameStr && v === valueStr)\n );\n } else {\n // Delete all entries with matching name\n this.params = this.params.filter(([k]) => k !== nameStr);\n }\n },\n get(this: URLSearchParamsState, name: unknown): string | null {\n const nameStr = String(name);\n const entry = this.params.find(([k]) => k === nameStr);\n return entry ? entry[1] : null;\n },\n getAll(this: URLSearchParamsState, name: unknown): string[] {\n const nameStr = String(name);\n return this.params.filter(([k]) => k === nameStr).map(([, v]) => v);\n },\n has(this: URLSearchParamsState, name: unknown, value?: unknown): boolean {\n const nameStr = String(name);\n if (value !== undefined) {\n const valueStr = String(value);\n return this.params.some(([k, v]) => k === nameStr && v === valueStr);\n }\n return this.params.some(([k]) => k === nameStr);\n },\n set(this: URLSearchParamsState, name: unknown, value: unknown) {\n const nameStr = String(name);\n const valueStr = String(value);\n // Remove all existing entries with this name\n const firstIndex = this.params.findIndex(([k]) => k === nameStr);\n this.params = this.params.filter(([k]) => k !== nameStr);\n // Insert the new value at the first position (or end if not found)\n if (firstIndex >= 0 && firstIndex <= this.params.length) {\n this.params.splice(firstIndex, 0, [nameStr, valueStr]);\n } else {\n this.params.push([nameStr, valueStr]);\n }\n },\n sort(this: URLSearchParamsState) {\n this.params.sort((a, b) => {\n if (a[0] < b[0]) return -1;\n if (a[0] > b[0]) return 1;\n return 0;\n });\n },\n toString(this: URLSearchParamsState): string {\n return this.params\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n )\n .join(\"&\");\n },\n entries(this: URLSearchParamsState): [string, string][] {\n return [...this.params];\n },\n keys(this: URLSearchParamsState): string[] {\n return this.params.map(([k]) => k);\n },\n values(this: URLSearchParamsState): string[] {\n return this.params.map(([, v]) => v);\n },\n forEach(this: URLSearchParamsState, callback: unknown) {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"callback must be a function\");\n }\n for (const [name, value] of this.params) {\n (callback as (value: string, name: string, parent: URLSearchParamsState) => void)(\n value,\n name,\n this\n );\n }\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\n/**\n * Internal state for URLSearchParams\n */\nexport interface URLSearchParamsState {\n params: [string, string][];\n}\n\n/**\n * Parse a query string into key-value pairs\n */\nfunction parseQueryString(query: string): [string, string][] {\n // Remove leading ? if present\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return [];\n\n const params: [string, string][] = [];\n for (const pair of cleanQuery.split(\"&\")) {\n if (!pair) continue;\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n // Key with no value\n params.push([decodeURIComponent(pair), \"\"]);\n } else {\n const key = decodeURIComponent(pair.slice(0, eqIndex));\n const value = decodeURIComponent(pair.slice(eqIndex + 1));\n params.push([key, value]);\n }\n }\n return params;\n}\n\n/**\n * Create the URLSearchParams class for QuickJS\n */\nexport function createURLSearchParamsClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLSearchParamsState>(context, stateMap, {\n name: \"URLSearchParams\",\n construct: (args) => {\n const init = args[0];\n let params: [string, string][] = [];\n\n if (init === undefined || init === null) {\n // Empty params\n params = [];\n } else if (typeof init === \"string\") {\n // Parse query string\n params = parseQueryString(init);\n } else if (Array.isArray(init)) {\n // Array of [key, value] pairs\n for (const pair of init) {\n if (Array.isArray(pair) && pair.length >= 2) {\n params.push([String(pair[0]), String(pair[1])]);\n }\n }\n } else if (typeof init === \"object\") {\n // Check if it's another URLSearchParamsState\n if (\"params\" in init && Array.isArray(init.params)) {\n params = [...(init as URLSearchParamsState).params];\n } else {\n // Plain object\n for (const [key, value] of Object.entries(init)) {\n params.push([String(key), String(value)]);\n }\n }\n }\n\n return { params };\n },\n properties: {\n size: {\n get(this: URLSearchParamsState) {\n return this.params.length;\n },\n },\n },\n methods: {\n append(this: URLSearchParamsState, name: unknown, value: unknown) {\n this.params.push([String(name), String(value)]);\n },\n delete(this: URLSearchParamsState, name: unknown, value?: unknown) {\n const nameStr = String(name);\n if (value !== undefined) {\n // Delete only entries with matching name AND value\n const valueStr = String(value);\n this.params = this.params.filter(\n ([k, v]) => !(k === nameStr && v === valueStr)\n );\n } else {\n // Delete all entries with matching name\n this.params = this.params.filter(([k]) => k !== nameStr);\n }\n },\n get(this: URLSearchParamsState, name: unknown): string | null {\n const nameStr = String(name);\n const entry = this.params.find(([k]) => k === nameStr);\n return entry ? entry[1] : null;\n },\n getAll(this: URLSearchParamsState, name: unknown): string[] {\n const nameStr = String(name);\n return this.params.filter(([k]) => k === nameStr).map(([, v]) => v);\n },\n has(this: URLSearchParamsState, name: unknown, value?: unknown): boolean {\n const nameStr = String(name);\n if (value !== undefined) {\n const valueStr = String(value);\n return this.params.some(([k, v]) => k === nameStr && v === valueStr);\n }\n return this.params.some(([k]) => k === nameStr);\n },\n set(this: URLSearchParamsState, name: unknown, value: unknown) {\n const nameStr = String(name);\n const valueStr = String(value);\n // Remove all existing entries with this name\n const firstIndex = this.params.findIndex(([k]) => k === nameStr);\n this.params = this.params.filter(([k]) => k !== nameStr);\n // Insert the new value at the first position (or end if not found)\n if (firstIndex >= 0 && firstIndex <= this.params.length) {\n this.params.splice(firstIndex, 0, [nameStr, valueStr]);\n } else {\n this.params.push([nameStr, valueStr]);\n }\n },\n sort(this: URLSearchParamsState) {\n this.params.sort((a, b) => {\n if (a[0] < b[0]) return -1;\n if (a[0] > b[0]) return 1;\n return 0;\n });\n },\n toString(this: URLSearchParamsState): string {\n return this.params\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n )\n .join(\"&\");\n },\n entries(this: URLSearchParamsState): [string, string][] {\n return [...this.params];\n },\n keys(this: URLSearchParamsState): string[] {\n return this.params.map(([k]) => k);\n },\n values(this: URLSearchParamsState): string[] {\n return this.params.map(([, v]) => v);\n },\n forEach(this: URLSearchParamsState, callback: unknown) {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"callback must be a function\");\n }\n for (const [name, value] of this.params) {\n (callback as (value: string, name: string, parent: URLSearchParamsState) => void)(\n value,\n name,\n this\n );\n }\n },\n },\n });\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "8B585EE3F07934C964756E2164756E21",
8
+ "debugId": "CC9AE1426E9F2DFF64756E2164756E21",
9
9
  "names": []
10
10
  }
package/dist/mjs/url.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  // packages/core/src/url.ts
3
- import { defineClass } from "./class-builder.ts";
3
+ import { defineClass } from "./class-builder.mjs";
4
4
  function createURLClass(context, stateMap) {
5
5
  return defineClass(context, stateMap, {
6
6
  name: "URL",
@@ -149,4 +149,4 @@ export {
149
149
  addURLSearchParamsGetter
150
150
  };
151
151
 
152
- //# debugId=E8AA2A6896F27F6164756E2164756E21
152
+ //# debugId=8408820A4441CF3264756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/url.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 * Internal state for URL\n */\nexport interface URLState {\n hash: string;\n host: string;\n hostname: string;\n href: string;\n origin: string;\n password: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n username: string;\n}\n\n/**\n * Create the URL class for QuickJS\n *\n * Note: The searchParams property is added separately via evalCode\n * after this class is registered, as it needs to return a URLSearchParams instance.\n */\nexport function createURLClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLState>(context, stateMap, {\n name: \"URL\",\n construct: (args) => {\n const urlString = args[0];\n const base = args[1];\n\n if (urlString === undefined) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only 0 present.\");\n }\n\n let parsed: globalThis.URL;\n try {\n if (base !== undefined) {\n // Handle base URL\n const baseStr = typeof base === \"object\" && base !== null && \"href\" in base\n ? (base as URLState).href\n : String(base);\n parsed = new globalThis.URL(String(urlString), baseStr);\n } else {\n parsed = new globalThis.URL(String(urlString));\n }\n } catch (e) {\n throw new TypeError(`Failed to construct 'URL': Invalid URL`);\n }\n\n return {\n hash: parsed.hash,\n host: parsed.host,\n hostname: parsed.hostname,\n href: parsed.href,\n origin: parsed.origin,\n password: parsed.password,\n pathname: parsed.pathname,\n port: parsed.port,\n protocol: parsed.protocol,\n search: parsed.search,\n username: parsed.username,\n };\n },\n properties: {\n hash: {\n get(this: URLState) {\n return this.hash;\n },\n },\n host: {\n get(this: URLState) {\n return this.host;\n },\n },\n hostname: {\n get(this: URLState) {\n return this.hostname;\n },\n },\n href: {\n get(this: URLState) {\n return this.href;\n },\n },\n origin: {\n get(this: URLState) {\n return this.origin;\n },\n },\n password: {\n get(this: URLState) {\n return this.password;\n },\n },\n pathname: {\n get(this: URLState) {\n return this.pathname;\n },\n },\n port: {\n get(this: URLState) {\n return this.port;\n },\n },\n protocol: {\n get(this: URLState) {\n return this.protocol;\n },\n },\n search: {\n get(this: URLState) {\n return this.search;\n },\n },\n username: {\n get(this: URLState) {\n return this.username;\n },\n },\n },\n methods: {\n toString(this: URLState): string {\n return this.href;\n },\n toJSON(this: URLState): string {\n return this.href;\n },\n // Private method to get search for URLSearchParams creation\n __getSearch__(this: URLState): string {\n return this.search;\n },\n },\n staticMethods: {\n canParse(url: unknown, base?: unknown): boolean {\n try {\n if (base !== undefined) {\n new globalThis.URL(String(url), String(base));\n } else {\n new globalThis.URL(String(url));\n }\n return true;\n } catch {\n return false;\n }\n },\n },\n });\n}\n\n/**\n * Add searchParams getter to URL prototype using evalCode\n * This must be called after both URL and URLSearchParams are registered as globals\n */\nexport function addURLSearchParamsGetter(context: QuickJSContext): void {\n // Use a WeakMap-like pattern with a Map keyed by instance ID\n // Each URL instance will cache its URLSearchParams\n const result = context.evalCode(`\n (function() {\n const searchParamsCache = new Map();\n\n Object.defineProperty(URL.prototype, 'searchParams', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!searchParamsCache.has(instanceId)) {\n searchParamsCache.set(instanceId, new URLSearchParams(this.__getSearch__()));\n }\n return searchParamsCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to add searchParams getter: ${JSON.stringify(err)}`);\n }\n result.value.dispose();\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 * Internal state for URL\n */\nexport interface URLState {\n hash: string;\n host: string;\n hostname: string;\n href: string;\n origin: string;\n password: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n username: string;\n}\n\n/**\n * Create the URL class for QuickJS\n *\n * Note: The searchParams property is added separately via evalCode\n * after this class is registered, as it needs to return a URLSearchParams instance.\n */\nexport function createURLClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLState>(context, stateMap, {\n name: \"URL\",\n construct: (args) => {\n const urlString = args[0];\n const base = args[1];\n\n if (urlString === undefined) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only 0 present.\");\n }\n\n let parsed: globalThis.URL;\n try {\n if (base !== undefined) {\n // Handle base URL\n const baseStr = typeof base === \"object\" && base !== null && \"href\" in base\n ? (base as URLState).href\n : String(base);\n parsed = new globalThis.URL(String(urlString), baseStr);\n } else {\n parsed = new globalThis.URL(String(urlString));\n }\n } catch (e) {\n throw new TypeError(`Failed to construct 'URL': Invalid URL`);\n }\n\n return {\n hash: parsed.hash,\n host: parsed.host,\n hostname: parsed.hostname,\n href: parsed.href,\n origin: parsed.origin,\n password: parsed.password,\n pathname: parsed.pathname,\n port: parsed.port,\n protocol: parsed.protocol,\n search: parsed.search,\n username: parsed.username,\n };\n },\n properties: {\n hash: {\n get(this: URLState) {\n return this.hash;\n },\n },\n host: {\n get(this: URLState) {\n return this.host;\n },\n },\n hostname: {\n get(this: URLState) {\n return this.hostname;\n },\n },\n href: {\n get(this: URLState) {\n return this.href;\n },\n },\n origin: {\n get(this: URLState) {\n return this.origin;\n },\n },\n password: {\n get(this: URLState) {\n return this.password;\n },\n },\n pathname: {\n get(this: URLState) {\n return this.pathname;\n },\n },\n port: {\n get(this: URLState) {\n return this.port;\n },\n },\n protocol: {\n get(this: URLState) {\n return this.protocol;\n },\n },\n search: {\n get(this: URLState) {\n return this.search;\n },\n },\n username: {\n get(this: URLState) {\n return this.username;\n },\n },\n },\n methods: {\n toString(this: URLState): string {\n return this.href;\n },\n toJSON(this: URLState): string {\n return this.href;\n },\n // Private method to get search for URLSearchParams creation\n __getSearch__(this: URLState): string {\n return this.search;\n },\n },\n staticMethods: {\n canParse(url: unknown, base?: unknown): boolean {\n try {\n if (base !== undefined) {\n new globalThis.URL(String(url), String(base));\n } else {\n new globalThis.URL(String(url));\n }\n return true;\n } catch {\n return false;\n }\n },\n },\n });\n}\n\n/**\n * Add searchParams getter to URL prototype using evalCode\n * This must be called after both URL and URLSearchParams are registered as globals\n */\nexport function addURLSearchParamsGetter(context: QuickJSContext): void {\n // Use a WeakMap-like pattern with a Map keyed by instance ID\n // Each URL instance will cache its URLSearchParams\n const result = context.evalCode(`\n (function() {\n const searchParamsCache = new Map();\n\n Object.defineProperty(URL.prototype, 'searchParams', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!searchParamsCache.has(instanceId)) {\n searchParamsCache.set(instanceId, new URLSearchParams(this.__getSearch__()));\n }\n return searchParamsCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to add searchParams getter: ${JSON.stringify(err)}`);\n }\n result.value.dispose();\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "E8AA2A6896F27F6164756E2164756E21",
8
+ "debugId": "8408820A4441CF3264756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,8 +1,8 @@
1
1
  // @bun
2
2
  // packages/core/src/streams/writable-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 createWritableStreamDefaultWriterClass(context, stateMap) {
7
7
  return defineClass(context, stateMap, {
8
8
  name: "WritableStreamDefaultWriter",
@@ -479,4 +479,4 @@ export {
479
479
  createWritableStream
480
480
  };
481
481
 
482
- //# debugId=A0FD01B9FABF048C64756E2164756E21
482
+ //# debugId=4988BE2712D0F31C64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/streams/writable-stream.ts"],
4
4
  "sourcesContent": [
5
- "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.ts\";\nimport { defineClass, getInstanceStateById } from \"../class-builder.ts\";\nimport { marshal } from \"../marshal.ts\";\nimport { unmarshal } from \"../unmarshal.ts\";\n\ninterface WritableStreamController {\n error(e: unknown): void;\n}\n\ninterface WritableStreamInternalState {\n locked: boolean;\n writer: WritableStreamWriterState | null;\n controller: WritableStreamController;\n closed: boolean;\n errored: boolean;\n errorValue: unknown;\n closeRequested: boolean;\n inFlightWriteRequest: {\n resolve: () => void;\n reject: (e: unknown) => void;\n } | null;\n writeRequests: Array<{\n chunk: unknown;\n resolve: () => void;\n reject: (e: unknown) => void;\n }>;\n sink?: {\n start?: (controller: WritableStreamController) => void | Promise<void>;\n write?: (chunk: unknown, controller: WritableStreamController) => void | Promise<void>;\n close?: () => void | Promise<void>;\n abort?: (reason?: unknown) => void | Promise<void>;\n };\n started: boolean;\n}\n\ninterface WritableStreamWriterState {\n stream: WritableStreamInternalState;\n closedPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n readyPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n _closedPromise?: Promise<void>; // Lazy-created\n _readyPromise?: Promise<void>; // Lazy-created\n}\n\n/**\n * Create the WritableStreamDefaultWriter class\n */\nexport function createWritableStreamDefaultWriterClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<WritableStreamWriterState>(context, stateMap, {\n name: \"WritableStreamDefaultWriter\",\n construct: () => {\n // Use lazy promise creation to avoid marshalling issues with handle cleanup\n let resolveClosedPromise: (() => void) | undefined;\n let rejectClosedPromise: ((e: unknown) => void) | undefined;\n let resolveReadyPromise: (() => void) | undefined;\n let rejectReadyPromise: ((e: unknown) => void) | undefined;\n\n const state: WritableStreamWriterState = {\n stream: null as unknown as WritableStreamInternalState,\n closedPromiseResolvers: {\n resolve: () => resolveClosedPromise?.(),\n reject: (e) => rejectClosedPromise?.(e),\n },\n readyPromiseResolvers: {\n resolve: () => resolveReadyPromise?.(),\n reject: (e) => rejectReadyPromise?.(e),\n },\n };\n\n // Define lazy promise properties (non-enumerable to avoid marshalling)\n Object.defineProperty(state, \"_closedPromise\", {\n value: undefined,\n writable: true,\n enumerable: false,\n });\n Object.defineProperty(state, \"_readyPromise\", {\n value: undefined,\n writable: true,\n enumerable: false,\n });\n\n // Create promise accessors (non-enumerable)\n Object.defineProperty(state, \"getClosedPromise\", {\n value: function (this: WritableStreamWriterState): Promise<void> {\n if (!this._closedPromise) {\n this._closedPromise = new Promise<void>((resolve, reject) => {\n resolveClosedPromise = resolve;\n rejectClosedPromise = reject;\n });\n }\n return this._closedPromise;\n },\n enumerable: false,\n });\n\n Object.defineProperty(state, \"getReadyPromise\", {\n value: function (this: WritableStreamWriterState): Promise<void> {\n if (!this._readyPromise) {\n this._readyPromise = new Promise<void>((resolve, reject) => {\n resolveReadyPromise = resolve;\n rejectReadyPromise = reject;\n });\n }\n return this._readyPromise;\n },\n enumerable: false,\n });\n\n return state;\n },\n properties: {\n closed: {\n get(this: WritableStreamWriterState) {\n return (this as unknown as { getClosedPromise: () => Promise<void> }).getClosedPromise();\n },\n },\n ready: {\n get(this: WritableStreamWriterState) {\n return (this as unknown as { getReadyPromise: () => Promise<void> }).getReadyPromise();\n },\n },\n desiredSize: {\n get(this: WritableStreamWriterState) {\n if (!this.stream) return null;\n if (this.stream.errored) return null;\n if (this.stream.closeRequested) return 0;\n return 1 - this.stream.writeRequests.length;\n },\n },\n },\n methods: {\n write(this: WritableStreamWriterState, chunk: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Writer has no stream\"));\n }\n if (this.stream.errored) {\n return Promise.reject(this.stream.errorValue);\n }\n if (this.stream.closeRequested || this.stream.closed) {\n return Promise.reject(new TypeError(\"Cannot write to a closed stream\"));\n }\n\n const self = this;\n return new Promise((resolve, reject) => {\n self.stream.writeRequests.push({ chunk, resolve, reject });\n processWriteRequests.call(self);\n });\n },\n close(this: WritableStreamWriterState): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Writer has no stream\"));\n }\n if (this.stream.closeRequested || this.stream.closed) {\n return Promise.reject(new TypeError(\"Stream is already closing or closed\"));\n }\n\n this.stream.closeRequested = true;\n\n return new Promise((resolve, reject) => {\n // Wait for all writes to complete\n const checkWritesComplete = () => {\n if (this.stream.writeRequests.length === 0 && !this.stream.inFlightWriteRequest) {\n // Call close on sink\n if (this.stream.sink?.close) {\n try {\n const result = this.stream.sink.close();\n if (result instanceof Promise) {\n result\n .then(() => {\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n })\n .catch((e) => {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.closedPromiseResolvers.reject(e);\n reject(e);\n });\n return;\n }\n } catch (e) {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.closedPromiseResolvers.reject(e);\n reject(e);\n return;\n }\n }\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n } else {\n setTimeout(checkWritesComplete, 0);\n }\n };\n checkWritesComplete();\n });\n },\n abort(this: WritableStreamWriterState, reason?: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Writer has no stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Reject all pending writes\n this.stream.writeRequests.forEach((req) => req.reject(reason));\n this.stream.writeRequests = [];\n\n if (this.stream.sink?.abort) {\n const result = this.stream.sink.abort(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.stream.errored = true;\n this.stream.errorValue = reason;\n this.closedPromiseResolvers.reject(reason);\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n releaseLock(this: WritableStreamWriterState): void {\n if (!this.stream) return;\n this.stream.locked = false;\n this.stream.writer = null;\n },\n },\n });\n}\n\n// Add helper method to WritableStreamWriterState\nfunction processWriteRequests(this: WritableStreamWriterState) {\n if (\n this.stream.inFlightWriteRequest ||\n this.stream.writeRequests.length === 0 ||\n !this.stream.started\n ) {\n return;\n }\n\n const request = this.stream.writeRequests.shift()!;\n this.stream.inFlightWriteRequest = request;\n\n if (this.stream.sink?.write) {\n try {\n const result = this.stream.sink.write(request.chunk, this.stream.controller);\n if (result instanceof Promise) {\n result\n .then(() => {\n this.stream.inFlightWriteRequest = null;\n request.resolve();\n processWriteRequests.call(this);\n })\n .catch((e) => {\n this.stream.inFlightWriteRequest = null;\n this.stream.errored = true;\n this.stream.errorValue = e;\n request.reject(e);\n // Reject remaining writes\n this.stream.writeRequests.forEach((req) => req.reject(e));\n this.stream.writeRequests = [];\n });\n return;\n }\n } catch (e) {\n this.stream.inFlightWriteRequest = null;\n this.stream.errored = true;\n this.stream.errorValue = e;\n request.reject(e);\n return;\n }\n }\n\n this.stream.inFlightWriteRequest = null;\n request.resolve();\n processWriteRequests.call(this);\n}\n\n\n/**\n * Create the WritableStream class\n */\nexport function createWritableStreamClass(\n context: QuickJSContext,\n stateMap: StateMap,\n writerClass: QuickJSHandle\n): QuickJSHandle {\n const classHandle = defineClass<WritableStreamInternalState>(context, stateMap, {\n name: \"WritableStream\",\n construct: (args) => {\n const underlyingSink = args[0] as {\n start?: (controller: WritableStreamController) => void | Promise<void>;\n write?: (chunk: unknown, controller: WritableStreamController) => void | Promise<void>;\n close?: () => void | Promise<void>;\n abort?: (reason?: unknown) => void | Promise<void>;\n } | undefined;\n\n const state: WritableStreamInternalState = {\n locked: false,\n writer: null,\n controller: null as unknown as WritableStreamController,\n closed: false,\n errored: false,\n errorValue: undefined,\n closeRequested: false,\n inFlightWriteRequest: null,\n writeRequests: [],\n sink: underlyingSink,\n started: false,\n };\n\n // Create controller\n state.controller = {\n error(e: unknown) {\n if (state.errored || state.closed) return;\n state.errored = true;\n state.errorValue = e;\n\n // Reject all pending writes\n state.writeRequests.forEach((req) => req.reject(e));\n state.writeRequests = [];\n\n if (state.writer) {\n state.writer.closedPromiseResolvers.reject(e);\n state.writer.readyPromiseResolvers.reject(e);\n }\n },\n };\n\n // Call start if provided\n if (underlyingSink?.start) {\n try {\n const startResult = underlyingSink.start(state.controller);\n if (startResult instanceof Promise) {\n startResult\n .then(() => {\n state.started = true;\n if (state.writer) {\n state.writer.readyPromiseResolvers.resolve();\n }\n })\n .catch((e) => {\n state.errored = true;\n state.errorValue = e;\n });\n } else {\n state.started = true;\n }\n } catch (e) {\n state.errored = true;\n state.errorValue = e;\n }\n } else {\n state.started = true;\n }\n\n return state;\n },\n properties: {\n locked: {\n get(this: WritableStreamInternalState) {\n return this.locked;\n },\n },\n },\n methods: {\n // __linkWriter__ is called from JavaScript getWriter() to link stream and writer states\n __linkWriter__(this: WritableStreamInternalState, writerObj: unknown): void {\n if (this.locked) {\n throw new TypeError(\"WritableStream is locked\");\n }\n this.locked = true;\n\n // Get the writer's internal state from instanceStateMap\n const writerId = (writerObj as { __instanceId__: number }).__instanceId__;\n const writerState = getInstanceStateById<WritableStreamWriterState>(writerId);\n if (!writerState) {\n throw new Error(\"Writer instance state not found\");\n }\n\n // Link bidirectionally\n writerState.stream = this;\n this.writer = writerState;\n\n // Resolve ready promise if stream already started\n if (this.started) {\n writerState.readyPromiseResolvers.resolve();\n }\n },\n abort(this: WritableStreamInternalState, reason?: unknown): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot abort a locked stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Reject all pending writes\n this.writeRequests.forEach((req) => req.reject(reason));\n this.writeRequests = [];\n\n if (this.sink?.abort) {\n const result = this.sink.abort(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.errored = true;\n this.errorValue = reason;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n close(this: WritableStreamInternalState): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot close a locked stream\"));\n }\n if (this.closeRequested || this.closed) {\n return Promise.reject(new TypeError(\"Stream is already closing or closed\"));\n }\n\n this.closeRequested = true;\n\n return new Promise((resolve, reject) => {\n if (this.sink?.close) {\n try {\n const result = this.sink.close();\n if (result instanceof Promise) {\n result\n .then(() => {\n this.closed = true;\n resolve();\n })\n .catch(reject);\n return;\n }\n } catch (e) {\n reject(e);\n return;\n }\n }\n this.closed = true;\n resolve();\n });\n },\n },\n });\n\n // Add getWriter to prototype as JavaScript code\n // This ensures getWriter() returns a proper WritableStreamDefaultWriter instance\n const prototypeHandle = context.getProp(classHandle, \"prototype\");\n\n const getWriterCode = `(function() {\n const writer = new WritableStreamDefaultWriter();\n this.__linkWriter__(writer);\n return writer;\n })`;\n const getWriterResult = context.evalCode(getWriterCode);\n if (!getWriterResult.error) {\n context.setProp(prototypeHandle, \"getWriter\", getWriterResult.value);\n getWriterResult.value.dispose();\n } else {\n getWriterResult.error.dispose();\n }\n\n prototypeHandle.dispose();\n return classHandle;\n}\n\n/**\n * Create a WritableStream in QuickJS from a host-side sink\n */\nexport function createWritableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n sink: UnderlyingSink\n): QuickJSHandle {\n const sinkObj = context.newObject();\n\n if (sink.start) {\n const startFn = context.newFunction(\"start\", (controllerHandle) => {\n const controller = {\n signal: new AbortController().signal,\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n } as WritableStreamDefaultController;\n\n const result = sink.start!(controller);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"start\", startFn);\n startFn.dispose();\n }\n\n if (sink.write) {\n const writeFn = context.newFunction(\"write\", (chunkHandle, controllerHandle) => {\n const chunk = unmarshal(context, chunkHandle);\n const controller = {\n signal: new AbortController().signal,\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n } as WritableStreamDefaultController;\n\n const result = sink.write!(chunk, controller);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"write\", writeFn);\n writeFn.dispose();\n }\n\n if (sink.close) {\n const closeFn = context.newFunction(\"close\", () => {\n const result = sink.close!();\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"close\", closeFn);\n closeFn.dispose();\n }\n\n if (sink.abort) {\n const abortFn = context.newFunction(\"abort\", (reasonHandle) => {\n const reason = unmarshal(context, reasonHandle);\n const result = sink.abort!(reason);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"abort\", abortFn);\n abortFn.dispose();\n }\n\n const WritableStreamConstructor = context.getProp(context.global, \"WritableStream\");\n const result = context.callFunction(WritableStreamConstructor, context.undefined, sinkObj);\n WritableStreamConstructor.dispose();\n sinkObj.dispose();\n\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to create WritableStream: ${error}`);\n }\n\n return result.value;\n}\n"
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"../types.mjs\";\nimport { defineClass, getInstanceStateById } from \"../class-builder.mjs\";\nimport { marshal } from \"../marshal.mjs\";\nimport { unmarshal } from \"../unmarshal.mjs\";\n\ninterface WritableStreamController {\n error(e: unknown): void;\n}\n\ninterface WritableStreamInternalState {\n locked: boolean;\n writer: WritableStreamWriterState | null;\n controller: WritableStreamController;\n closed: boolean;\n errored: boolean;\n errorValue: unknown;\n closeRequested: boolean;\n inFlightWriteRequest: {\n resolve: () => void;\n reject: (e: unknown) => void;\n } | null;\n writeRequests: Array<{\n chunk: unknown;\n resolve: () => void;\n reject: (e: unknown) => void;\n }>;\n sink?: {\n start?: (controller: WritableStreamController) => void | Promise<void>;\n write?: (chunk: unknown, controller: WritableStreamController) => void | Promise<void>;\n close?: () => void | Promise<void>;\n abort?: (reason?: unknown) => void | Promise<void>;\n };\n started: boolean;\n}\n\ninterface WritableStreamWriterState {\n stream: WritableStreamInternalState;\n closedPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n readyPromiseResolvers: {\n resolve: () => void;\n reject: (e: unknown) => void;\n };\n _closedPromise?: Promise<void>; // Lazy-created\n _readyPromise?: Promise<void>; // Lazy-created\n}\n\n/**\n * Create the WritableStreamDefaultWriter class\n */\nexport function createWritableStreamDefaultWriterClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<WritableStreamWriterState>(context, stateMap, {\n name: \"WritableStreamDefaultWriter\",\n construct: () => {\n // Use lazy promise creation to avoid marshalling issues with handle cleanup\n let resolveClosedPromise: (() => void) | undefined;\n let rejectClosedPromise: ((e: unknown) => void) | undefined;\n let resolveReadyPromise: (() => void) | undefined;\n let rejectReadyPromise: ((e: unknown) => void) | undefined;\n\n const state: WritableStreamWriterState = {\n stream: null as unknown as WritableStreamInternalState,\n closedPromiseResolvers: {\n resolve: () => resolveClosedPromise?.(),\n reject: (e) => rejectClosedPromise?.(e),\n },\n readyPromiseResolvers: {\n resolve: () => resolveReadyPromise?.(),\n reject: (e) => rejectReadyPromise?.(e),\n },\n };\n\n // Define lazy promise properties (non-enumerable to avoid marshalling)\n Object.defineProperty(state, \"_closedPromise\", {\n value: undefined,\n writable: true,\n enumerable: false,\n });\n Object.defineProperty(state, \"_readyPromise\", {\n value: undefined,\n writable: true,\n enumerable: false,\n });\n\n // Create promise accessors (non-enumerable)\n Object.defineProperty(state, \"getClosedPromise\", {\n value: function (this: WritableStreamWriterState): Promise<void> {\n if (!this._closedPromise) {\n this._closedPromise = new Promise<void>((resolve, reject) => {\n resolveClosedPromise = resolve;\n rejectClosedPromise = reject;\n });\n }\n return this._closedPromise;\n },\n enumerable: false,\n });\n\n Object.defineProperty(state, \"getReadyPromise\", {\n value: function (this: WritableStreamWriterState): Promise<void> {\n if (!this._readyPromise) {\n this._readyPromise = new Promise<void>((resolve, reject) => {\n resolveReadyPromise = resolve;\n rejectReadyPromise = reject;\n });\n }\n return this._readyPromise;\n },\n enumerable: false,\n });\n\n return state;\n },\n properties: {\n closed: {\n get(this: WritableStreamWriterState) {\n return (this as unknown as { getClosedPromise: () => Promise<void> }).getClosedPromise();\n },\n },\n ready: {\n get(this: WritableStreamWriterState) {\n return (this as unknown as { getReadyPromise: () => Promise<void> }).getReadyPromise();\n },\n },\n desiredSize: {\n get(this: WritableStreamWriterState) {\n if (!this.stream) return null;\n if (this.stream.errored) return null;\n if (this.stream.closeRequested) return 0;\n return 1 - this.stream.writeRequests.length;\n },\n },\n },\n methods: {\n write(this: WritableStreamWriterState, chunk: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Writer has no stream\"));\n }\n if (this.stream.errored) {\n return Promise.reject(this.stream.errorValue);\n }\n if (this.stream.closeRequested || this.stream.closed) {\n return Promise.reject(new TypeError(\"Cannot write to a closed stream\"));\n }\n\n const self = this;\n return new Promise((resolve, reject) => {\n self.stream.writeRequests.push({ chunk, resolve, reject });\n processWriteRequests.call(self);\n });\n },\n close(this: WritableStreamWriterState): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Writer has no stream\"));\n }\n if (this.stream.closeRequested || this.stream.closed) {\n return Promise.reject(new TypeError(\"Stream is already closing or closed\"));\n }\n\n this.stream.closeRequested = true;\n\n return new Promise((resolve, reject) => {\n // Wait for all writes to complete\n const checkWritesComplete = () => {\n if (this.stream.writeRequests.length === 0 && !this.stream.inFlightWriteRequest) {\n // Call close on sink\n if (this.stream.sink?.close) {\n try {\n const result = this.stream.sink.close();\n if (result instanceof Promise) {\n result\n .then(() => {\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n })\n .catch((e) => {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.closedPromiseResolvers.reject(e);\n reject(e);\n });\n return;\n }\n } catch (e) {\n this.stream.errored = true;\n this.stream.errorValue = e;\n this.closedPromiseResolvers.reject(e);\n reject(e);\n return;\n }\n }\n this.stream.closed = true;\n this.closedPromiseResolvers.resolve();\n resolve();\n } else {\n setTimeout(checkWritesComplete, 0);\n }\n };\n checkWritesComplete();\n });\n },\n abort(this: WritableStreamWriterState, reason?: unknown): Promise<void> {\n if (!this.stream) {\n return Promise.reject(new TypeError(\"Writer has no stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Reject all pending writes\n this.stream.writeRequests.forEach((req) => req.reject(reason));\n this.stream.writeRequests = [];\n\n if (this.stream.sink?.abort) {\n const result = this.stream.sink.abort(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.stream.errored = true;\n this.stream.errorValue = reason;\n this.closedPromiseResolvers.reject(reason);\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n releaseLock(this: WritableStreamWriterState): void {\n if (!this.stream) return;\n this.stream.locked = false;\n this.stream.writer = null;\n },\n },\n });\n}\n\n// Add helper method to WritableStreamWriterState\nfunction processWriteRequests(this: WritableStreamWriterState) {\n if (\n this.stream.inFlightWriteRequest ||\n this.stream.writeRequests.length === 0 ||\n !this.stream.started\n ) {\n return;\n }\n\n const request = this.stream.writeRequests.shift()!;\n this.stream.inFlightWriteRequest = request;\n\n if (this.stream.sink?.write) {\n try {\n const result = this.stream.sink.write(request.chunk, this.stream.controller);\n if (result instanceof Promise) {\n result\n .then(() => {\n this.stream.inFlightWriteRequest = null;\n request.resolve();\n processWriteRequests.call(this);\n })\n .catch((e) => {\n this.stream.inFlightWriteRequest = null;\n this.stream.errored = true;\n this.stream.errorValue = e;\n request.reject(e);\n // Reject remaining writes\n this.stream.writeRequests.forEach((req) => req.reject(e));\n this.stream.writeRequests = [];\n });\n return;\n }\n } catch (e) {\n this.stream.inFlightWriteRequest = null;\n this.stream.errored = true;\n this.stream.errorValue = e;\n request.reject(e);\n return;\n }\n }\n\n this.stream.inFlightWriteRequest = null;\n request.resolve();\n processWriteRequests.call(this);\n}\n\n\n/**\n * Create the WritableStream class\n */\nexport function createWritableStreamClass(\n context: QuickJSContext,\n stateMap: StateMap,\n writerClass: QuickJSHandle\n): QuickJSHandle {\n const classHandle = defineClass<WritableStreamInternalState>(context, stateMap, {\n name: \"WritableStream\",\n construct: (args) => {\n const underlyingSink = args[0] as {\n start?: (controller: WritableStreamController) => void | Promise<void>;\n write?: (chunk: unknown, controller: WritableStreamController) => void | Promise<void>;\n close?: () => void | Promise<void>;\n abort?: (reason?: unknown) => void | Promise<void>;\n } | undefined;\n\n const state: WritableStreamInternalState = {\n locked: false,\n writer: null,\n controller: null as unknown as WritableStreamController,\n closed: false,\n errored: false,\n errorValue: undefined,\n closeRequested: false,\n inFlightWriteRequest: null,\n writeRequests: [],\n sink: underlyingSink,\n started: false,\n };\n\n // Create controller\n state.controller = {\n error(e: unknown) {\n if (state.errored || state.closed) return;\n state.errored = true;\n state.errorValue = e;\n\n // Reject all pending writes\n state.writeRequests.forEach((req) => req.reject(e));\n state.writeRequests = [];\n\n if (state.writer) {\n state.writer.closedPromiseResolvers.reject(e);\n state.writer.readyPromiseResolvers.reject(e);\n }\n },\n };\n\n // Call start if provided\n if (underlyingSink?.start) {\n try {\n const startResult = underlyingSink.start(state.controller);\n if (startResult instanceof Promise) {\n startResult\n .then(() => {\n state.started = true;\n if (state.writer) {\n state.writer.readyPromiseResolvers.resolve();\n }\n })\n .catch((e) => {\n state.errored = true;\n state.errorValue = e;\n });\n } else {\n state.started = true;\n }\n } catch (e) {\n state.errored = true;\n state.errorValue = e;\n }\n } else {\n state.started = true;\n }\n\n return state;\n },\n properties: {\n locked: {\n get(this: WritableStreamInternalState) {\n return this.locked;\n },\n },\n },\n methods: {\n // __linkWriter__ is called from JavaScript getWriter() to link stream and writer states\n __linkWriter__(this: WritableStreamInternalState, writerObj: unknown): void {\n if (this.locked) {\n throw new TypeError(\"WritableStream is locked\");\n }\n this.locked = true;\n\n // Get the writer's internal state from instanceStateMap\n const writerId = (writerObj as { __instanceId__: number }).__instanceId__;\n const writerState = getInstanceStateById<WritableStreamWriterState>(writerId);\n if (!writerState) {\n throw new Error(\"Writer instance state not found\");\n }\n\n // Link bidirectionally\n writerState.stream = this;\n this.writer = writerState;\n\n // Resolve ready promise if stream already started\n if (this.started) {\n writerState.readyPromiseResolvers.resolve();\n }\n },\n abort(this: WritableStreamInternalState, reason?: unknown): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot abort a locked stream\"));\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Reject all pending writes\n this.writeRequests.forEach((req) => req.reject(reason));\n this.writeRequests = [];\n\n if (this.sink?.abort) {\n const result = this.sink.abort(reason);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n return;\n }\n }\n this.errored = true;\n this.errorValue = reason;\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n },\n close(this: WritableStreamInternalState): Promise<void> {\n if (this.locked) {\n return Promise.reject(new TypeError(\"Cannot close a locked stream\"));\n }\n if (this.closeRequested || this.closed) {\n return Promise.reject(new TypeError(\"Stream is already closing or closed\"));\n }\n\n this.closeRequested = true;\n\n return new Promise((resolve, reject) => {\n if (this.sink?.close) {\n try {\n const result = this.sink.close();\n if (result instanceof Promise) {\n result\n .then(() => {\n this.closed = true;\n resolve();\n })\n .catch(reject);\n return;\n }\n } catch (e) {\n reject(e);\n return;\n }\n }\n this.closed = true;\n resolve();\n });\n },\n },\n });\n\n // Add getWriter to prototype as JavaScript code\n // This ensures getWriter() returns a proper WritableStreamDefaultWriter instance\n const prototypeHandle = context.getProp(classHandle, \"prototype\");\n\n const getWriterCode = `(function() {\n const writer = new WritableStreamDefaultWriter();\n this.__linkWriter__(writer);\n return writer;\n })`;\n const getWriterResult = context.evalCode(getWriterCode);\n if (!getWriterResult.error) {\n context.setProp(prototypeHandle, \"getWriter\", getWriterResult.value);\n getWriterResult.value.dispose();\n } else {\n getWriterResult.error.dispose();\n }\n\n prototypeHandle.dispose();\n return classHandle;\n}\n\n/**\n * Create a WritableStream in QuickJS from a host-side sink\n */\nexport function createWritableStream(\n context: QuickJSContext,\n stateMap: StateMap,\n sink: UnderlyingSink\n): QuickJSHandle {\n const sinkObj = context.newObject();\n\n if (sink.start) {\n const startFn = context.newFunction(\"start\", (controllerHandle) => {\n const controller = {\n signal: new AbortController().signal,\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n } as WritableStreamDefaultController;\n\n const result = sink.start!(controller);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"start\", startFn);\n startFn.dispose();\n }\n\n if (sink.write) {\n const writeFn = context.newFunction(\"write\", (chunkHandle, controllerHandle) => {\n const chunk = unmarshal(context, chunkHandle);\n const controller = {\n signal: new AbortController().signal,\n error: (e: unknown) => {\n const errorFn = context.getProp(controllerHandle, \"error\");\n const errorHandle = marshal(context, e);\n context.callFunction(errorFn, controllerHandle, errorHandle);\n errorHandle.dispose();\n errorFn.dispose();\n },\n } as WritableStreamDefaultController;\n\n const result = sink.write!(chunk, controller);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"write\", writeFn);\n writeFn.dispose();\n }\n\n if (sink.close) {\n const closeFn = context.newFunction(\"close\", () => {\n const result = sink.close!();\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"close\", closeFn);\n closeFn.dispose();\n }\n\n if (sink.abort) {\n const abortFn = context.newFunction(\"abort\", (reasonHandle) => {\n const reason = unmarshal(context, reasonHandle);\n const result = sink.abort!(reason);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then(() => {\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(sinkObj, \"abort\", abortFn);\n abortFn.dispose();\n }\n\n const WritableStreamConstructor = context.getProp(context.global, \"WritableStream\");\n const result = context.callFunction(WritableStreamConstructor, context.undefined, sinkObj);\n WritableStreamConstructor.dispose();\n sinkObj.dispose();\n\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to create WritableStream: ${error}`);\n }\n\n return result.value;\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "A0FD01B9FABF048C64756E2164756E21",
8
+ "debugId": "4988BE2712D0F31C64756E2164756E21",
9
9
  "names": []
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-core",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {