@ricsam/quickjs-core 0.2.15 → 0.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/class-builder.cjs +7 -1
- package/dist/cjs/class-builder.cjs.map +3 -3
- package/dist/cjs/function-builder.cjs +7 -1
- package/dist/cjs/function-builder.cjs.map +3 -3
- package/dist/cjs/marshal.cjs +13 -1
- package/dist/cjs/marshal.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/streams/readable-stream.cjs +19 -1
- package/dist/cjs/streams/readable-stream.cjs.map +3 -3
- package/dist/cjs/streams/writable-stream.cjs +25 -1
- package/dist/cjs/streams/writable-stream.cjs.map +3 -3
- package/dist/mjs/class-builder.mjs +7 -1
- package/dist/mjs/class-builder.mjs.map +3 -3
- package/dist/mjs/function-builder.mjs +7 -1
- package/dist/mjs/function-builder.mjs.map +3 -3
- package/dist/mjs/marshal.mjs +13 -1
- package/dist/mjs/marshal.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/streams/readable-stream.mjs +19 -1
- package/dist/mjs/streams/readable-stream.mjs.map +3 -3
- package/dist/mjs/streams/writable-stream.mjs +25 -1
- package/dist/mjs/streams/writable-stream.mjs.map +3 -3
- package/package.json +1 -1
|
@@ -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.cjs\";\nimport { defineClass, getInstanceStateById } from \"../class-builder.cjs\";\nimport { marshal } from \"../marshal.cjs\";\nimport { unmarshal } from \"../unmarshal.cjs\";\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.cjs\";\nimport { defineClass, getInstanceStateById } from \"../class-builder.cjs\";\nimport { marshal } from \"../marshal.cjs\";\nimport { unmarshal } from \"../unmarshal.cjs\";\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 // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(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 // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(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 // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(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 // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.resolve(context.undefined);\n context.runtime.executePendingJobs();\n })\n .catch((e) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n deferred.reject(marshal(context, e));\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return context.undefined;\n });\n context.setProp(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
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "84867542B7FDE57C64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -90,11 +90,17 @@ function defineClass(context, stateMap, definition) {
|
|
|
90
90
|
if (result2 instanceof Promise) {
|
|
91
91
|
const deferred = context.newPromise();
|
|
92
92
|
result2.then((resolved) => {
|
|
93
|
+
if (!context.alive) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
93
96
|
const resolvedHandle = marshal(context, resolved);
|
|
94
97
|
deferred.resolve(resolvedHandle);
|
|
95
98
|
resolvedHandle.dispose();
|
|
96
99
|
context.runtime.executePendingJobs();
|
|
97
100
|
}).catch((error) => {
|
|
101
|
+
if (!context.alive) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
98
104
|
const errorHandle = marshal(context, error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) });
|
|
99
105
|
deferred.reject(errorHandle);
|
|
100
106
|
errorHandle.dispose();
|
|
@@ -258,4 +264,4 @@ export {
|
|
|
258
264
|
cleanupInstanceState
|
|
259
265
|
};
|
|
260
266
|
|
|
261
|
-
//# debugId=
|
|
267
|
+
//# debugId=78568D48C6B8092664756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/class-builder.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { ClassDefinition, StateMap } from \"./types.mjs\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\nimport {\n nextInstanceId,\n registerInstance,\n getInstanceStateById as getStateById,\n setInstanceStateById,\n cleanupInstanceState as cleanupState,\n clearAllInstanceState as clearAllState,\n} from \"./instance-state.mjs\";\n\n// ============================================\n// Error Type Preservation\n// ============================================\n\n/**\n * Supported error types for typed error creation.\n */\nconst ERROR_TYPES = [\"TypeError\", \"RangeError\", \"SyntaxError\", \"ReferenceError\", \"URIError\", \"EvalError\"] as const;\n\n/**\n * Create a typed error in the QuickJS context.\n * Gets the error constructor fresh each time to avoid handle lifecycle issues.\n */\nfunction createTypedError(\n context: QuickJSContext,\n error: Error\n): QuickJSHandle {\n if ((ERROR_TYPES as readonly string[]).includes(error.name)) {\n const ctor = context.getProp(context.global, error.name);\n if (context.typeof(ctor) === \"function\") {\n const messageHandle = context.newString(error.message);\n const result = context.callFunction(ctor, context.undefined, messageHandle);\n messageHandle.dispose();\n ctor.dispose();\n\n if (!result.error) {\n return result.value;\n }\n result.error.dispose();\n } else {\n ctor.dispose();\n }\n }\n\n // Fallback to generic Error\n return context.newError(error.message);\n}\n\n/**\n * Create a new StateMap for tracking object internal states\n */\nexport function createStateMap(): StateMap {\n return new WeakMap();\n}\n\n/**\n * Get the internal state associated with a QuickJS object handle\n */\nexport function getState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle\n): T | undefined {\n return stateMap.get(handle) as T | undefined;\n}\n\n/**\n * Set the internal state associated with a QuickJS object handle\n */\nexport function setState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle,\n state: T\n): void {\n stateMap.set(handle, state);\n}\n\n// Instance state is now managed by instance-state.ts\n\n/**\n * Define a class in the QuickJS context\n *\n * Uses evalCode to create a proper JavaScript class that can be called with 'new'.\n * Host-side callbacks are registered and invoked by the JavaScript class.\n *\n * @returns Handle to the class constructor (caller must manage disposal)\n *\n * @example\n * const Point = defineClass(context, stateMap, {\n * name: \"Point\",\n * construct: ([x, y]) => ({ x: Number(x), y: Number(y) }),\n * methods: {\n * distance(this: { x: number; y: number }) {\n * return Math.sqrt(this.x ** 2 + this.y ** 2);\n * }\n * },\n * properties: {\n * x: {\n * get(this: { x: number }) { return this.x; },\n * set(this: { x: number }, v: unknown) { this.x = Number(v); }\n * }\n * }\n * });\n * context.setProp(context.global, \"Point\", Point);\n */\nexport function defineClass<TState extends object>(\n context: QuickJSContext,\n stateMap: StateMap,\n definition: ClassDefinition<TState>\n): QuickJSHandle {\n const className = definition.name;\n\n // Create the __hostCall__ function if it doesn't exist\n const existingHostCall = context.getProp(context.global, \"__hostCall__\");\n const hasHostCall = context.typeof(existingHostCall) === \"function\";\n existingHostCall.dispose();\n\n if (!hasHostCall) {\n const hostCallFn = context.newFunction(\"__hostCall__\", (classNameHandle, actionHandle, instanceIdHandle, ...argHandles) => {\n const classNameStr = context.getString(classNameHandle);\n const action = context.getString(actionHandle);\n const instanceId = context.getNumber(instanceIdHandle);\n const args = argHandles.map((h) => unmarshal(context, h));\n\n const callbacks = classCallbackRegistry.get(classNameStr);\n if (!callbacks) {\n throw context.newError(`No callbacks registered for class ${classNameStr}`);\n }\n\n const state = getStateById<TState>(instanceId);\n\n try {\n let result: unknown;\n\n if (action === \"__construct__\") {\n // Constructor call\n if (callbacks.construct) {\n const newState = callbacks.construct(args);\n // Register instance with className for cross-class access\n registerInstance(instanceId, classNameStr, newState);\n result = undefined;\n }\n } else if (action.startsWith(\"get:\")) {\n // Getter call\n const propName = action.slice(4);\n const getter = callbacks.properties?.[propName]?.get;\n if (getter && state) {\n result = getter.call(state);\n }\n } else if (action.startsWith(\"set:\")) {\n // Setter call\n const propName = action.slice(4);\n const setter = callbacks.properties?.[propName]?.set;\n if (setter && state) {\n setter.call(state, args[0]);\n }\n result = undefined;\n } else if (action.startsWith(\"static:\")) {\n // Static method call\n const methodName = action.slice(7);\n const staticMethod = callbacks.staticMethods?.[methodName];\n if (staticMethod) {\n result = staticMethod(...args);\n }\n } else {\n // Instance method call\n const method = callbacks.methods?.[action];\n if (method && state) {\n result = method.call(state, ...args);\n }\n }\n\n // Handle promises\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshal(context, resolved);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n return marshal(context, result);\n } catch (error) {\n // Preserve error type (TypeError, RangeError, etc.) when re-throwing\n if (error instanceof Error) {\n throw createTypedError(context, error);\n }\n throw context.newError(String(error));\n }\n });\n context.setProp(context.global, \"__hostCall__\", hostCallFn);\n hostCallFn.dispose();\n }\n\n // Create __nextInstanceId__ function if it doesn't exist\n const existingNextId = context.getProp(context.global, \"__nextInstanceId__\");\n const hasNextId = context.typeof(existingNextId) === \"function\";\n existingNextId.dispose();\n\n if (!hasNextId) {\n const nextIdFn = context.newFunction(\"__nextInstanceId__\", () => {\n return context.newNumber(nextInstanceId());\n });\n context.setProp(context.global, \"__nextInstanceId__\", nextIdFn);\n nextIdFn.dispose();\n }\n\n // Register callbacks for this class\n const callbacks: ClassCallbacks<TState> = {\n construct: definition.construct,\n methods: definition.methods,\n properties: definition.properties,\n staticMethods: definition.staticMethods,\n };\n classCallbackRegistry.set(className, callbacks as unknown as ClassCallbacks<object>);\n\n // Build the JavaScript class code\n const hasParent = definition.extends !== undefined;\n\n // If extending a class, temporarily set it as a global so the IIFE can access it\n if (hasParent) {\n context.setProp(context.global, \"__tempParentClass__\", definition.extends!);\n }\n\n let classCode = hasParent\n ? `(function() {\n const __className__ = ${JSON.stringify(className)};\n const __ParentClass__ = __tempParentClass__;\n\n class ${className} extends __ParentClass__ {\n constructor(...args) {\n super();\n // __instanceId__ is already set by parent class, just call our construct\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }`\n : `(function() {\n const __className__ = ${JSON.stringify(className)};\n\n class ${className} {\n constructor(...args) {\n Object.defineProperty(this, '__instanceId__', {\n value: __nextInstanceId__(),\n enumerable: false,\n writable: false,\n configurable: false\n });\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }`;\n\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n\n // Clean up temporary parent class global if we set one\n if (hasParent) {\n context.setProp(context.global, \"__tempParentClass__\", context.undefined);\n }\n\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return getStateById<T>(id);\n}\n\n/**\n * Set internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function setInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle,\n state: T\n): void {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n throw new Error(\"Cannot set state: instance has no __instanceId__\");\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n setInstanceStateById(id, state);\n}\n\n/**\n * Get internal state by instance ID directly\n * Useful when you have the instanceId from an unmarshaled object\n */\nexport function getInstanceStateById<T>(instanceId: number): T | undefined {\n return getStateById<T>(instanceId);\n}\n\n/**\n * Clean up instance state when an instance is no longer needed\n */\nexport function cleanupInstanceState(instanceId: number): void {\n cleanupState(instanceId);\n}\n\n/**\n * Clear all instance state (useful for context disposal or testing cleanup)\n */\nexport function clearAllInstanceState(): void {\n clearAllState();\n}\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { ClassDefinition, StateMap } from \"./types.mjs\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\nimport {\n nextInstanceId,\n registerInstance,\n getInstanceStateById as getStateById,\n setInstanceStateById,\n cleanupInstanceState as cleanupState,\n clearAllInstanceState as clearAllState,\n} from \"./instance-state.mjs\";\n\n// ============================================\n// Error Type Preservation\n// ============================================\n\n/**\n * Supported error types for typed error creation.\n */\nconst ERROR_TYPES = [\"TypeError\", \"RangeError\", \"SyntaxError\", \"ReferenceError\", \"URIError\", \"EvalError\"] as const;\n\n/**\n * Create a typed error in the QuickJS context.\n * Gets the error constructor fresh each time to avoid handle lifecycle issues.\n */\nfunction createTypedError(\n context: QuickJSContext,\n error: Error\n): QuickJSHandle {\n if ((ERROR_TYPES as readonly string[]).includes(error.name)) {\n const ctor = context.getProp(context.global, error.name);\n if (context.typeof(ctor) === \"function\") {\n const messageHandle = context.newString(error.message);\n const result = context.callFunction(ctor, context.undefined, messageHandle);\n messageHandle.dispose();\n ctor.dispose();\n\n if (!result.error) {\n return result.value;\n }\n result.error.dispose();\n } else {\n ctor.dispose();\n }\n }\n\n // Fallback to generic Error\n return context.newError(error.message);\n}\n\n/**\n * Create a new StateMap for tracking object internal states\n */\nexport function createStateMap(): StateMap {\n return new WeakMap();\n}\n\n/**\n * Get the internal state associated with a QuickJS object handle\n */\nexport function getState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle\n): T | undefined {\n return stateMap.get(handle) as T | undefined;\n}\n\n/**\n * Set the internal state associated with a QuickJS object handle\n */\nexport function setState<T extends object>(\n stateMap: StateMap,\n handle: QuickJSHandle,\n state: T\n): void {\n stateMap.set(handle, state);\n}\n\n// Instance state is now managed by instance-state.ts\n\n/**\n * Define a class in the QuickJS context\n *\n * Uses evalCode to create a proper JavaScript class that can be called with 'new'.\n * Host-side callbacks are registered and invoked by the JavaScript class.\n *\n * @returns Handle to the class constructor (caller must manage disposal)\n *\n * @example\n * const Point = defineClass(context, stateMap, {\n * name: \"Point\",\n * construct: ([x, y]) => ({ x: Number(x), y: Number(y) }),\n * methods: {\n * distance(this: { x: number; y: number }) {\n * return Math.sqrt(this.x ** 2 + this.y ** 2);\n * }\n * },\n * properties: {\n * x: {\n * get(this: { x: number }) { return this.x; },\n * set(this: { x: number }, v: unknown) { this.x = Number(v); }\n * }\n * }\n * });\n * context.setProp(context.global, \"Point\", Point);\n */\nexport function defineClass<TState extends object>(\n context: QuickJSContext,\n stateMap: StateMap,\n definition: ClassDefinition<TState>\n): QuickJSHandle {\n const className = definition.name;\n\n // Create the __hostCall__ function if it doesn't exist\n const existingHostCall = context.getProp(context.global, \"__hostCall__\");\n const hasHostCall = context.typeof(existingHostCall) === \"function\";\n existingHostCall.dispose();\n\n if (!hasHostCall) {\n const hostCallFn = context.newFunction(\"__hostCall__\", (classNameHandle, actionHandle, instanceIdHandle, ...argHandles) => {\n const classNameStr = context.getString(classNameHandle);\n const action = context.getString(actionHandle);\n const instanceId = context.getNumber(instanceIdHandle);\n const args = argHandles.map((h) => unmarshal(context, h));\n\n const callbacks = classCallbackRegistry.get(classNameStr);\n if (!callbacks) {\n throw context.newError(`No callbacks registered for class ${classNameStr}`);\n }\n\n const state = getStateById<TState>(instanceId);\n\n try {\n let result: unknown;\n\n if (action === \"__construct__\") {\n // Constructor call\n if (callbacks.construct) {\n const newState = callbacks.construct(args);\n // Register instance with className for cross-class access\n registerInstance(instanceId, classNameStr, newState);\n result = undefined;\n }\n } else if (action.startsWith(\"get:\")) {\n // Getter call\n const propName = action.slice(4);\n const getter = callbacks.properties?.[propName]?.get;\n if (getter && state) {\n result = getter.call(state);\n }\n } else if (action.startsWith(\"set:\")) {\n // Setter call\n const propName = action.slice(4);\n const setter = callbacks.properties?.[propName]?.set;\n if (setter && state) {\n setter.call(state, args[0]);\n }\n result = undefined;\n } else if (action.startsWith(\"static:\")) {\n // Static method call\n const methodName = action.slice(7);\n const staticMethod = callbacks.staticMethods?.[methodName];\n if (staticMethod) {\n result = staticMethod(...args);\n }\n } else {\n // Instance method call\n const method = callbacks.methods?.[action];\n if (method && state) {\n result = method.call(state, ...args);\n }\n }\n\n // Handle promises\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resolvedHandle = marshal(context, resolved);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n return marshal(context, result);\n } catch (error) {\n // Preserve error type (TypeError, RangeError, etc.) when re-throwing\n if (error instanceof Error) {\n throw createTypedError(context, error);\n }\n throw context.newError(String(error));\n }\n });\n context.setProp(context.global, \"__hostCall__\", hostCallFn);\n hostCallFn.dispose();\n }\n\n // Create __nextInstanceId__ function if it doesn't exist\n const existingNextId = context.getProp(context.global, \"__nextInstanceId__\");\n const hasNextId = context.typeof(existingNextId) === \"function\";\n existingNextId.dispose();\n\n if (!hasNextId) {\n const nextIdFn = context.newFunction(\"__nextInstanceId__\", () => {\n return context.newNumber(nextInstanceId());\n });\n context.setProp(context.global, \"__nextInstanceId__\", nextIdFn);\n nextIdFn.dispose();\n }\n\n // Register callbacks for this class\n const callbacks: ClassCallbacks<TState> = {\n construct: definition.construct,\n methods: definition.methods,\n properties: definition.properties,\n staticMethods: definition.staticMethods,\n };\n classCallbackRegistry.set(className, callbacks as unknown as ClassCallbacks<object>);\n\n // Build the JavaScript class code\n const hasParent = definition.extends !== undefined;\n\n // If extending a class, temporarily set it as a global so the IIFE can access it\n if (hasParent) {\n context.setProp(context.global, \"__tempParentClass__\", definition.extends!);\n }\n\n let classCode = hasParent\n ? `(function() {\n const __className__ = ${JSON.stringify(className)};\n const __ParentClass__ = __tempParentClass__;\n\n class ${className} extends __ParentClass__ {\n constructor(...args) {\n super();\n // __instanceId__ is already set by parent class, just call our construct\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }`\n : `(function() {\n const __className__ = ${JSON.stringify(className)};\n\n class ${className} {\n constructor(...args) {\n Object.defineProperty(this, '__instanceId__', {\n value: __nextInstanceId__(),\n enumerable: false,\n writable: false,\n configurable: false\n });\n __hostCall__(__className__, \"__construct__\", this.__instanceId__, ...args);\n }`;\n\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n\n // Clean up temporary parent class global if we set one\n if (hasParent) {\n context.setProp(context.global, \"__tempParentClass__\", context.undefined);\n }\n\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return getStateById<T>(id);\n}\n\n/**\n * Set internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function setInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle,\n state: T\n): void {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n throw new Error(\"Cannot set state: instance has no __instanceId__\");\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n setInstanceStateById(id, state);\n}\n\n/**\n * Get internal state by instance ID directly\n * Useful when you have the instanceId from an unmarshaled object\n */\nexport function getInstanceStateById<T>(instanceId: number): T | undefined {\n return getStateById<T>(instanceId);\n}\n\n/**\n * Clean up instance state when an instance is no longer needed\n */\nexport function cleanupInstanceState(instanceId: number): void {\n cleanupState(instanceId);\n}\n\n/**\n * Clear all instance state (useful for context disposal or testing cleanup)\n */\nexport function clearAllInstanceState(): void {\n clearAllState();\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;AAEA;AACA;AACA;AAAA;AAAA;AAAA,0BAGE;AAAA;AAAA,0BAEA;AAAA,2BACA;AAAA;AAUF,IAAM,cAAc,CAAC,aAAa,cAAc,eAAe,kBAAkB,YAAY,WAAW;AAMxG,SAAS,gBAAgB,CACvB,SACA,OACe;AAAA,EACf,IAAK,YAAkC,SAAS,MAAM,IAAI,GAAG;AAAA,IAC3D,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,IAAI;AAAA,IACvD,IAAI,QAAQ,OAAO,IAAI,MAAM,YAAY;AAAA,MACvC,MAAM,gBAAgB,QAAQ,UAAU,MAAM,OAAO;AAAA,MACrD,MAAM,SAAS,QAAQ,aAAa,MAAM,QAAQ,WAAW,aAAa;AAAA,MAC1E,cAAc,QAAQ;AAAA,MACtB,KAAK,QAAQ;AAAA,MAEb,IAAI,CAAC,OAAO,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,MAChB;AAAA,MACA,OAAO,MAAM,QAAQ;AAAA,IACvB,EAAO;AAAA,MACL,KAAK,QAAQ;AAAA;AAAA,EAEjB;AAAA,EAGA,OAAO,QAAQ,SAAS,MAAM,OAAO;AAAA;AAMhC,SAAS,cAAc,GAAa;AAAA,EACzC,OAAO,IAAI;AAAA;AAMN,SAAS,QAA0B,CACxC,UACA,QACe;AAAA,EACf,OAAO,SAAS,IAAI,MAAM;AAAA;AAMrB,SAAS,QAA0B,CACxC,UACA,QACA,OACM;AAAA,EACN,SAAS,IAAI,QAAQ,KAAK;AAAA;AA+BrB,SAAS,WAAkC,CAChD,SACA,UACA,YACe;AAAA,EACf,MAAM,YAAY,WAAW;AAAA,EAG7B,MAAM,mBAAmB,QAAQ,QAAQ,QAAQ,QAAQ,cAAc;AAAA,EACvE,MAAM,cAAc,QAAQ,OAAO,gBAAgB,MAAM;AAAA,EACzD,iBAAiB,QAAQ;AAAA,EAEzB,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,aAAa,QAAQ,YAAY,gBAAgB,CAAC,iBAAiB,cAAc,qBAAqB,eAAe;AAAA,MACzH,MAAM,eAAe,QAAQ,UAAU,eAAe;AAAA,MACtD,MAAM,SAAS,QAAQ,UAAU,YAAY;AAAA,MAC7C,MAAM,aAAa,QAAQ,UAAU,gBAAgB;AAAA,MACrD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,MAExD,MAAM,aAAY,sBAAsB,IAAI,YAAY;AAAA,MACxD,IAAI,CAAC,YAAW;AAAA,QACd,MAAM,QAAQ,SAAS,qCAAqC,cAAc;AAAA,MAC5E;AAAA,MAEA,MAAM,QAAQ,aAAqB,UAAU;AAAA,MAE7C,IAAI;AAAA,QACF,IAAI;AAAA,QAEJ,IAAI,WAAW,iBAAiB;AAAA,UAE9B,IAAI,WAAU,WAAW;AAAA,YACvB,MAAM,WAAW,WAAU,UAAU,IAAI;AAAA,YAEzC,iBAAiB,YAAY,cAAc,QAAQ;AAAA,YACnD,UAAS;AAAA,UACX;AAAA,QACF,EAAO,SAAI,OAAO,WAAW,MAAM,GAAG;AAAA,UAEpC,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,UAC/B,MAAM,SAAS,WAAU,aAAa,WAAW;AAAA,UACjD,IAAI,UAAU,OAAO;AAAA,YACnB,UAAS,OAAO,KAAK,KAAK;AAAA,UAC5B;AAAA,QACF,EAAO,SAAI,OAAO,WAAW,MAAM,GAAG;AAAA,UAEpC,MAAM,WAAW,OAAO,MAAM,CAAC;AAAA,UAC/B,MAAM,SAAS,WAAU,aAAa,WAAW;AAAA,UACjD,IAAI,UAAU,OAAO;AAAA,YACnB,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA,UAC5B;AAAA,UACA,UAAS;AAAA,QACX,EAAO,SAAI,OAAO,WAAW,SAAS,GAAG;AAAA,UAEvC,MAAM,aAAa,OAAO,MAAM,CAAC;AAAA,UACjC,MAAM,eAAe,WAAU,gBAAgB;AAAA,UAC/C,IAAI,cAAc;AAAA,YAChB,UAAS,aAAa,GAAG,IAAI;AAAA,UAC/B;AAAA,QACF,EAAO;AAAA,UAEL,MAAM,SAAS,WAAU,UAAU;AAAA,UACnC,IAAI,UAAU,OAAO;AAAA,YACnB,UAAS,OAAO,KAAK,OAAO,GAAG,IAAI;AAAA,UACrC;AAAA;AAAA,QAIF,IAAI,mBAAkB,SAAS;AAAA,UAC7B,MAAM,WAAW,QAAQ,WAAW;AAAA,UACpC,QACG,KAAK,CAAC,aAAa;AAAA,YAElB,IAAI,CAAC,QAAQ,OAAO;AAAA,cAClB;AAAA,YACF;AAAA,YACA,MAAM,iBAAiB,QAAQ,SAAS,QAAQ;AAAA,YAChD,SAAS,QAAQ,cAAc;AAAA,YAC/B,eAAe,QAAQ;AAAA,YACvB,QAAQ,QAAQ,mBAAmB;AAAA,WACpC,EACA,MAAM,CAAC,UAAU;AAAA,YAEhB,IAAI,CAAC,QAAQ,OAAO;AAAA,cAClB;AAAA,YACF;AAAA,YACA,MAAM,cAAc,QAClB,SACA,iBAAiB,QACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C,EAAE,SAAS,OAAO,KAAK,EAAE,CAC/B;AAAA,YACA,SAAS,OAAO,WAAW;AAAA,YAC3B,YAAY,QAAQ;AAAA,YACpB,QAAQ,QAAQ,mBAAmB;AAAA,WACpC;AAAA,UACH,OAAO,SAAS;AAAA,QAClB;AAAA,QAEA,OAAO,QAAQ,SAAS,OAAM;AAAA,QAC9B,OAAO,OAAO;AAAA,QAEd,IAAI,iBAAiB,OAAO;AAAA,UAC1B,MAAM,iBAAiB,SAAS,KAAK;AAAA,QACvC;AAAA,QACA,MAAM,QAAQ,SAAS,OAAO,KAAK,CAAC;AAAA;AAAA,KAEvC;AAAA,IACD,QAAQ,QAAQ,QAAQ,QAAQ,gBAAgB,UAAU;AAAA,IAC1D,WAAW,QAAQ;AAAA,EACrB;AAAA,EAGA,MAAM,iBAAiB,QAAQ,QAAQ,QAAQ,QAAQ,oBAAoB;AAAA,EAC3E,MAAM,YAAY,QAAQ,OAAO,cAAc,MAAM;AAAA,EACrD,eAAe,QAAQ;AAAA,EAEvB,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,WAAW,QAAQ,YAAY,sBAAsB,MAAM;AAAA,MAC/D,OAAO,QAAQ,UAAU,eAAe,CAAC;AAAA,KAC1C;AAAA,IACD,QAAQ,QAAQ,QAAQ,QAAQ,sBAAsB,QAAQ;AAAA,IAC9D,SAAS,QAAQ;AAAA,EACnB;AAAA,EAGA,MAAM,YAAoC;AAAA,IACxC,WAAW,WAAW;AAAA,IACtB,SAAS,WAAW;AAAA,IACpB,YAAY,WAAW;AAAA,IACvB,eAAe,WAAW;AAAA,EAC5B;AAAA,EACA,sBAAsB,IAAI,WAAW,SAA8C;AAAA,EAGnF,MAAM,YAAY,WAAW,YAAY;AAAA,EAGzC,IAAI,WAAW;AAAA,IACb,QAAQ,QAAQ,QAAQ,QAAQ,uBAAuB,WAAW,OAAQ;AAAA,EAC5E;AAAA,EAEA,IAAI,YAAY,YACZ;AAAA,0BACoB,KAAK,UAAU,SAAS;AAAA;AAAA;AAAA,UAGxC;AAAA;AAAA;AAAA;AAAA;AAAA,SAMJ;AAAA,0BACoB,KAAK,UAAU,SAAS;AAAA;AAAA,UAExC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,IAAI,WAAW,SAAS;AAAA,IACtB,WAAW,cAAc,OAAO,KAAK,WAAW,OAAO,GAAG;AAAA,MACxD,aAAa;AAAA,MACb;AAAA,2CACqC,KAAK,UAAU,UAAU;AAAA;AAAA;AAAA,IAGhE;AAAA,EACF;AAAA,EAGA,IAAI,WAAW,YAAY;AAAA,IACzB,YAAY,UAAU,eAAe,OAAO,QAAQ,WAAW,UAAU,GAAG;AAAA,MAC1E,IAAI,WAAW,KAAK;AAAA,QAClB,aAAa;AAAA,UACX;AAAA,gDACsC;AAAA;AAAA;AAAA,MAG1C;AAAA,MACA,IAAI,WAAW,KAAK;AAAA,QAClB,aAAa;AAAA,UACX;AAAA,yCAC+B;AAAA;AAAA;AAAA,MAGnC;AAAA,IACF;AAAA,EACF;AAAA,EAGA,aAAa;AAAA;AAAA,EAIb,IAAI,WAAW,eAAe;AAAA,IAC5B,WAAW,cAAc,OAAO,KAAK,WAAW,aAAa,GAAG;AAAA,MAC9D,aAAa;AAAA,IACf,aAAa;AAAA,iDACgC;AAAA;AAAA;AAAA,IAG7C;AAAA,EACF;AAAA,EAGA,IAAI,WAAW,kBAAkB;AAAA,IAC/B,YAAY,UAAU,UAAU,OAAO,QAAQ,WAAW,gBAAgB,GAAG;AAAA,MAC3E,aAAa;AAAA,IACf,aAAa,cAAc,KAAK,UAAU,KAAK;AAAA;AAAA,IAE/C;AAAA,EACF;AAAA,EAEA,aAAa;AAAA,WACJ;AAAA;AAAA,EAIT,MAAM,SAAS,QAAQ,SAAS,SAAS;AAAA,EAGzC,IAAI,WAAW;AAAA,IACb,QAAQ,QAAQ,QAAQ,QAAQ,uBAAuB,QAAQ,SAAS;AAAA,EAC1E;AAAA,EAEA,IAAI,OAAO,OAAO;AAAA,IAChB,MAAM,QAAQ,QAAQ,KAAK,OAAO,KAAK;AAAA,IACvC,OAAO,MAAM,QAAQ;AAAA,IACrB,MAAM,IAAI,MAAM,0BAA0B,cAAc,KAAK,UAAU,KAAK,GAAG;AAAA,EACjF;AAAA,EAIA,MAAM,cAAc,OAAO;AAAA,EAE3B,OAAO;AAAA;AAWT,IAAM,wBAAwB,IAAI;AAK3B,SAAS,gBAAmB,CACjC,SACA,gBACe;AAAA,EACf,MAAM,WAAW,QAAQ,QAAQ,gBAAgB,gBAAgB;AAAA,EACjE,IAAI,QAAQ,OAAO,QAAQ,MAAM,UAAU;AAAA,IACzC,SAAS,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA,EACA,MAAM,KAAK,QAAQ,UAAU,QAAQ;AAAA,EACrC,SAAS,QAAQ;AAAA,EACjB,OAAO,aAAgB,EAAE;AAAA;AAMpB,SAAS,gBAAmB,CACjC,SACA,gBACA,OACM;AAAA,EACN,MAAM,WAAW,QAAQ,QAAQ,gBAAgB,gBAAgB;AAAA,EACjE,IAAI,QAAQ,OAAO,QAAQ,MAAM,UAAU;AAAA,IACzC,SAAS,QAAQ;AAAA,IACjB,MAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EACA,MAAM,KAAK,QAAQ,UAAU,QAAQ;AAAA,EACrC,SAAS,QAAQ;AAAA,EACjB,qBAAqB,IAAI,KAAK;AAAA;AAOzB,SAAS,oBAAuB,CAAC,YAAmC;AAAA,EACzE,OAAO,aAAgB,UAAU;AAAA;AAM5B,SAAS,oBAAoB,CAAC,YAA0B;AAAA,EAC7D,aAAa,UAAU;AAAA;AAMlB,SAAS,qBAAqB,GAAS;AAAA,EAC5C,cAAc;AAAA;",
|
|
8
|
+
"debugId": "78568D48C6B8092664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -18,11 +18,17 @@ function defineAsyncFunction(context, name, fn) {
|
|
|
18
18
|
const args = argHandles.map((h) => unmarshal(context, h));
|
|
19
19
|
const deferred = context.newPromise();
|
|
20
20
|
fn(...args).then((result) => {
|
|
21
|
+
if (!context.alive) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
21
24
|
const resultHandle = marshal(context, result);
|
|
22
25
|
deferred.resolve(resultHandle);
|
|
23
26
|
resultHandle.dispose();
|
|
24
27
|
context.runtime.executePendingJobs();
|
|
25
28
|
}).catch((error) => {
|
|
29
|
+
if (!context.alive) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
26
32
|
const errorHandle = marshal(context, error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) });
|
|
27
33
|
deferred.reject(errorHandle);
|
|
28
34
|
errorHandle.dispose();
|
|
@@ -36,4 +42,4 @@ export {
|
|
|
36
42
|
defineAsyncFunction
|
|
37
43
|
};
|
|
38
44
|
|
|
39
|
-
//# debugId=
|
|
45
|
+
//# debugId=8B474E0BF8843F0764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/function-builder.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n/**\n * Define a global function in the QuickJS context\n *\n * @returns Handle to the function (caller must manage disposal)\n *\n * @example\n * const logFn = defineFunction(context, \"log\", (...args) => {\n * console.log(\"[QuickJS]\", ...args);\n * });\n * context.setProp(context.global, \"log\", logFn);\n */\nexport function defineFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => unknown\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n try {\n // Call host function\n const result = fn(...args);\n\n // Marshal result\n return marshal(context, result);\n } catch (error) {\n // Throw error in QuickJS\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n}\n\n/**\n * Define an async function that returns a promise to QuickJS\n *\n * @example\n * const fetchFn = defineAsyncFunction(context, \"fetch\", async (url) => {\n * const response = await fetch(String(url));\n * return response.text();\n * });\n */\nexport function defineAsyncFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n // Create a promise in QuickJS\n const deferred = context.newPromise();\n\n // Call the async function\n fn(...args)\n .then((result) => {\n const resultHandle = marshal(context, result);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { unmarshal } from \"./unmarshal.mjs\";\nimport { marshal } from \"./marshal.mjs\";\n\n/**\n * Define a global function in the QuickJS context\n *\n * @returns Handle to the function (caller must manage disposal)\n *\n * @example\n * const logFn = defineFunction(context, \"log\", (...args) => {\n * console.log(\"[QuickJS]\", ...args);\n * });\n * context.setProp(context.global, \"log\", logFn);\n */\nexport function defineFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => unknown\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n try {\n // Call host function\n const result = fn(...args);\n\n // Marshal result\n return marshal(context, result);\n } catch (error) {\n // Throw error in QuickJS\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n}\n\n/**\n * Define an async function that returns a promise to QuickJS\n *\n * @example\n * const fetchFn = defineAsyncFunction(context, \"fetch\", async (url) => {\n * const response = await fetch(String(url));\n * return response.text();\n * });\n */\nexport function defineAsyncFunction(\n context: QuickJSContext,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): QuickJSHandle {\n return context.newFunction(name, (...argHandles) => {\n // Unmarshal arguments\n const args = argHandles.map((h) => unmarshal(context, h));\n\n // Create a promise in QuickJS\n const deferred = context.newPromise();\n\n // Call the async function\n fn(...args)\n .then((result) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resultHandle = marshal(context, result);\n deferred.resolve(resultHandle);\n resultHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshal(\n context,\n error instanceof Error\n ? { name: error.name, message: error.message }\n : { message: String(error) }\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n\n return deferred.handle;\n });\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;AACA;AACA;AAaO,SAAS,cAAc,CAC5B,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAExD,IAAI;AAAA,MAEF,MAAM,SAAS,GAAG,GAAG,IAAI;AAAA,MAGzB,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,OAAO,OAAO;AAAA,MAEd,MAAM,QAAQ,SACZ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA;AAAA,GAEH;AAAA;AAYI,SAAS,mBAAmB,CACjC,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAGxD,MAAM,WAAW,QAAQ,WAAW;AAAA,IAGpC,GAAG,GAAG,IAAI,EACP,KAAK,CAAC,WAAW;AAAA,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;AACA;AACA;AAaO,SAAS,cAAc,CAC5B,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAExD,IAAI;AAAA,MAEF,MAAM,SAAS,GAAG,GAAG,IAAI;AAAA,MAGzB,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,OAAO,OAAO;AAAA,MAEd,MAAM,QAAQ,SACZ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA;AAAA,GAEH;AAAA;AAYI,SAAS,mBAAmB,CACjC,SACA,MACA,IACe;AAAA,EACf,OAAO,QAAQ,YAAY,MAAM,IAAI,eAAe;AAAA,IAElD,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,IAGxD,MAAM,WAAW,QAAQ,WAAW;AAAA,IAGpC,GAAG,GAAG,IAAI,EACP,KAAK,CAAC,WAAW;AAAA,MAEhB,IAAI,CAAC,QAAQ,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,eAAe,QAAQ,SAAS,MAAM;AAAA,MAC5C,SAAS,QAAQ,YAAY;AAAA,MAC7B,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC,EACA,MAAM,CAAC,UAAU;AAAA,MAEhB,IAAI,CAAC,QAAQ,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,cAAc,QAClB,SACA,iBAAiB,QACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C,EAAE,SAAS,OAAO,KAAK,EAAE,CAC/B;AAAA,MACA,SAAS,OAAO,WAAW;AAAA,MAC3B,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ,mBAAmB;AAAA,KACpC;AAAA,IAEH,OAAO,SAAS;AAAA,GACjB;AAAA;",
|
|
8
|
+
"debugId": "8B474E0BF8843F0764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/marshal.mjs
CHANGED
|
@@ -89,11 +89,17 @@ function marshal(context, value, options = {}) {
|
|
|
89
89
|
if (val instanceof Promise) {
|
|
90
90
|
const deferred = context.newPromise();
|
|
91
91
|
val.then((resolved) => {
|
|
92
|
+
if (!context.alive) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
92
95
|
const resolvedHandle = marshalValue(resolved, depth + 1);
|
|
93
96
|
deferred.resolve(resolvedHandle);
|
|
94
97
|
resolvedHandle.dispose();
|
|
95
98
|
context.runtime.executePendingJobs();
|
|
96
99
|
}).catch((error) => {
|
|
100
|
+
if (!context.alive) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
97
103
|
const errorHandle = marshalValue(error instanceof Error ? { name: error.name, message: error.message } : error, depth + 1);
|
|
98
104
|
deferred.reject(errorHandle);
|
|
99
105
|
errorHandle.dispose();
|
|
@@ -129,11 +135,17 @@ function marshal(context, value, options = {}) {
|
|
|
129
135
|
if (result instanceof Promise) {
|
|
130
136
|
const deferred = context.newPromise();
|
|
131
137
|
result.then((resolved) => {
|
|
138
|
+
if (!context.alive) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
132
141
|
const resolvedHandle = marshalValue(resolved, depth + 1);
|
|
133
142
|
deferred.resolve(resolvedHandle);
|
|
134
143
|
resolvedHandle.dispose();
|
|
135
144
|
context.runtime.executePendingJobs();
|
|
136
145
|
}).catch((error) => {
|
|
146
|
+
if (!context.alive) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
137
149
|
const errorHandle = marshalValue(error instanceof Error ? { name: error.name, message: error.message } : error, depth + 1);
|
|
138
150
|
deferred.reject(errorHandle);
|
|
139
151
|
errorHandle.dispose();
|
|
@@ -157,4 +169,4 @@ export {
|
|
|
157
169
|
getHandleType
|
|
158
170
|
};
|
|
159
171
|
|
|
160
|
-
//# debugId=
|
|
172
|
+
//# debugId=A7F1AA32FC96B04D64756E2164756E21
|
package/dist/mjs/marshal.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/marshal.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { MarshalOptions } from \"./types.mjs\";\n\n/**\n * Check if a value is a QuickJS handle\n */\nexport function isHandle(value: unknown): value is QuickJSHandle {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"alive\" in value &&\n \"dispose\" in value &&\n typeof (value as QuickJSHandle).dispose === \"function\"\n );\n}\n\n/**\n * Get the type of a QuickJS handle as a string\n */\nexport function getHandleType(\n context: QuickJSContext,\n handle: QuickJSHandle\n): \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\" {\n return context.typeof(handle) as \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\";\n}\n\n/**\n * Marshal a JavaScript value to a QuickJS handle\n *\n * Supports:\n * - Primitives (string, number, boolean, null, undefined, bigint)\n * - Arrays\n * - Plain objects\n * - ArrayBuffer / Uint8Array\n * - Date (converted to Date object in QuickJS)\n * - Functions (wrapped as host functions)\n * - Promises (wrapped with context.newPromise)\n *\n * @example\n * const handle = marshal(context, {\n * name: \"test\",\n * values: [1, 2, 3],\n * callback: (x) => x * 2\n * });\n */\nexport function marshal(\n context: QuickJSContext,\n value: unknown,\n options: MarshalOptions = {}\n): QuickJSHandle {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakSet<object>();\n\n function marshalValue(val: unknown, depth: number): QuickJSHandle {\n if (depth > maxDepth) {\n throw new Error(`Maximum marshalling depth of ${maxDepth} exceeded`);\n }\n\n // Pass through existing QuickJS handles\n if (isHandle(val)) {\n return val;\n }\n\n // Try custom marshaller first\n if (options.custom) {\n const customResult = options.custom(val, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n // Handle primitives\n if (val === undefined) {\n return context.undefined;\n }\n if (val === null) {\n return context.null;\n }\n if (typeof val === \"boolean\") {\n return val ? context.true : context.false;\n }\n if (typeof val === \"number\") {\n return context.newNumber(val);\n }\n if (typeof val === \"string\") {\n return context.newString(val);\n }\n if (typeof val === \"bigint\") {\n return context.newBigInt(val);\n }\n\n // Handle symbols (convert to string representation)\n if (typeof val === \"symbol\") {\n return context.newString(val.toString());\n }\n\n // Handle objects\n if (typeof val === \"object\") {\n // Check for circular references\n if (seen.has(val)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(val);\n\n try {\n // Handle ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return context.newArrayBuffer(val);\n }\n\n // Handle Uint8Array - create proper Uint8Array in QuickJS (has .length property)\n if (val instanceof Uint8Array) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n const bufferHandle = context.newArrayBuffer(buffer);\n context.setProp(context.global, \"__tempMarshalBuffer__\", bufferHandle);\n bufferHandle.dispose();\n const result = context.evalCode(\"new Uint8Array(__tempMarshalBuffer__)\");\n const cleanup = context.evalCode(\"delete globalThis.__tempMarshalBuffer__\");\n if (cleanup.error) cleanup.error.dispose();\n else cleanup.value.dispose();\n if (result.error) {\n result.error.dispose();\n // Fallback to ArrayBuffer if Uint8Array creation fails\n return context.newArrayBuffer(buffer);\n }\n return result.value;\n }\n\n // Handle other TypedArrays (Int8Array, Float32Array, etc.) - convert to ArrayBuffer\n if (ArrayBuffer.isView(val)) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n return context.newArrayBuffer(buffer);\n }\n\n // Handle Date\n if (val instanceof Date) {\n const dateConstructor = context.getProp(context.global, \"Date\");\n const timestamp = context.newNumber(val.getTime());\n const result = context.callFunction(\n dateConstructor,\n context.undefined,\n timestamp\n );\n dateConstructor.dispose();\n timestamp.dispose();\n\n if (result.error) {\n const error = result.error;\n result.error.dispose();\n throw new Error(`Failed to create Date: ${context.dump(error)}`);\n }\n return result.value;\n }\n\n // Handle Promise\n if (val instanceof Promise) {\n const deferred = context.newPromise();\n val\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n // Handle Array\n if (Array.isArray(val)) {\n const arr = context.newArray();\n for (let i = 0; i < val.length; i++) {\n const elementHandle = marshalValue(val[i], depth + 1);\n context.setProp(arr, i, elementHandle);\n elementHandle.dispose();\n }\n return arr;\n }\n\n // Handle plain objects\n const obj = context.newObject();\n for (const [key, propVal] of Object.entries(val)) {\n const propHandle = marshalValue(propVal, depth + 1);\n context.setProp(obj, key, propHandle);\n propHandle.dispose();\n }\n return obj;\n } finally {\n seen.delete(val);\n }\n }\n\n // Handle functions\n if (typeof val === \"function\") {\n return context.newFunction(val.name || \"anonymous\", (...argHandles) => {\n const args = argHandles.map((h) => context.dump(h));\n try {\n const result = val(...args);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return marshalValue(result, depth + 1);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n }\n\n throw new Error(`Cannot marshal value of type ${typeof val}`);\n }\n\n return marshalValue(value, 0);\n}\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { MarshalOptions } from \"./types.mjs\";\n\n/**\n * Check if a value is a QuickJS handle\n */\nexport function isHandle(value: unknown): value is QuickJSHandle {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"alive\" in value &&\n \"dispose\" in value &&\n typeof (value as QuickJSHandle).dispose === \"function\"\n );\n}\n\n/**\n * Get the type of a QuickJS handle as a string\n */\nexport function getHandleType(\n context: QuickJSContext,\n handle: QuickJSHandle\n): \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\" {\n return context.typeof(handle) as \"undefined\" | \"null\" | \"boolean\" | \"number\" | \"string\" | \"symbol\" | \"object\" | \"function\";\n}\n\n/**\n * Marshal a JavaScript value to a QuickJS handle\n *\n * Supports:\n * - Primitives (string, number, boolean, null, undefined, bigint)\n * - Arrays\n * - Plain objects\n * - ArrayBuffer / Uint8Array\n * - Date (converted to Date object in QuickJS)\n * - Functions (wrapped as host functions)\n * - Promises (wrapped with context.newPromise)\n *\n * @example\n * const handle = marshal(context, {\n * name: \"test\",\n * values: [1, 2, 3],\n * callback: (x) => x * 2\n * });\n */\nexport function marshal(\n context: QuickJSContext,\n value: unknown,\n options: MarshalOptions = {}\n): QuickJSHandle {\n const maxDepth = options.maxDepth ?? 10;\n const seen = new WeakSet<object>();\n\n function marshalValue(val: unknown, depth: number): QuickJSHandle {\n if (depth > maxDepth) {\n throw new Error(`Maximum marshalling depth of ${maxDepth} exceeded`);\n }\n\n // Pass through existing QuickJS handles\n if (isHandle(val)) {\n return val;\n }\n\n // Try custom marshaller first\n if (options.custom) {\n const customResult = options.custom(val, context);\n if (customResult !== undefined) {\n return customResult;\n }\n }\n\n // Handle primitives\n if (val === undefined) {\n return context.undefined;\n }\n if (val === null) {\n return context.null;\n }\n if (typeof val === \"boolean\") {\n return val ? context.true : context.false;\n }\n if (typeof val === \"number\") {\n return context.newNumber(val);\n }\n if (typeof val === \"string\") {\n return context.newString(val);\n }\n if (typeof val === \"bigint\") {\n return context.newBigInt(val);\n }\n\n // Handle symbols (convert to string representation)\n if (typeof val === \"symbol\") {\n return context.newString(val.toString());\n }\n\n // Handle objects\n if (typeof val === \"object\") {\n // Check for circular references\n if (seen.has(val)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(val);\n\n try {\n // Handle ArrayBuffer\n if (val instanceof ArrayBuffer) {\n return context.newArrayBuffer(val);\n }\n\n // Handle Uint8Array - create proper Uint8Array in QuickJS (has .length property)\n if (val instanceof Uint8Array) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n const bufferHandle = context.newArrayBuffer(buffer);\n context.setProp(context.global, \"__tempMarshalBuffer__\", bufferHandle);\n bufferHandle.dispose();\n const result = context.evalCode(\"new Uint8Array(__tempMarshalBuffer__)\");\n const cleanup = context.evalCode(\"delete globalThis.__tempMarshalBuffer__\");\n if (cleanup.error) cleanup.error.dispose();\n else cleanup.value.dispose();\n if (result.error) {\n result.error.dispose();\n // Fallback to ArrayBuffer if Uint8Array creation fails\n return context.newArrayBuffer(buffer);\n }\n return result.value;\n }\n\n // Handle other TypedArrays (Int8Array, Float32Array, etc.) - convert to ArrayBuffer\n if (ArrayBuffer.isView(val)) {\n const buffer = val.buffer.slice(\n val.byteOffset,\n val.byteOffset + val.byteLength\n );\n return context.newArrayBuffer(buffer);\n }\n\n // Handle Date\n if (val instanceof Date) {\n const dateConstructor = context.getProp(context.global, \"Date\");\n const timestamp = context.newNumber(val.getTime());\n const result = context.callFunction(\n dateConstructor,\n context.undefined,\n timestamp\n );\n dateConstructor.dispose();\n timestamp.dispose();\n\n if (result.error) {\n const error = result.error;\n result.error.dispose();\n throw new Error(`Failed to create Date: ${context.dump(error)}`);\n }\n return result.value;\n }\n\n // Handle Promise\n if (val instanceof Promise) {\n const deferred = context.newPromise();\n val\n .then((resolved) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n\n // Handle Array\n if (Array.isArray(val)) {\n const arr = context.newArray();\n for (let i = 0; i < val.length; i++) {\n const elementHandle = marshalValue(val[i], depth + 1);\n context.setProp(arr, i, elementHandle);\n elementHandle.dispose();\n }\n return arr;\n }\n\n // Handle plain objects\n const obj = context.newObject();\n for (const [key, propVal] of Object.entries(val)) {\n const propHandle = marshalValue(propVal, depth + 1);\n context.setProp(obj, key, propHandle);\n propHandle.dispose();\n }\n return obj;\n } finally {\n seen.delete(val);\n }\n }\n\n // Handle functions\n if (typeof val === \"function\") {\n return context.newFunction(val.name || \"anonymous\", (...argHandles) => {\n const args = argHandles.map((h) => context.dump(h));\n try {\n const result = val(...args);\n if (result instanceof Promise) {\n const deferred = context.newPromise();\n result\n .then((resolved) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const resolvedHandle = marshalValue(resolved, depth + 1);\n deferred.resolve(resolvedHandle);\n resolvedHandle.dispose();\n context.runtime.executePendingJobs();\n })\n .catch((error) => {\n // Guard: Check if context is still alive\n if (!context.alive) {\n return;\n }\n const errorHandle = marshalValue(\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n depth + 1\n );\n deferred.reject(errorHandle);\n errorHandle.dispose();\n context.runtime.executePendingJobs();\n });\n return deferred.handle;\n }\n return marshalValue(result, depth + 1);\n } catch (error) {\n throw context.newError(\n error instanceof Error ? error.message : String(error)\n );\n }\n });\n }\n\n throw new Error(`Cannot marshal value of type ${typeof val}`);\n }\n\n return marshalValue(value, 0);\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "A7F1AA32FC96B04D64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
|
@@ -409,9 +409,15 @@ function createReadableStream(context, stateMap, source) {
|
|
|
409
409
|
if (result2 instanceof Promise) {
|
|
410
410
|
const deferred = context.newPromise();
|
|
411
411
|
result2.then(() => {
|
|
412
|
+
if (!context.alive) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
412
415
|
deferred.resolve(context.undefined);
|
|
413
416
|
context.runtime.executePendingJobs();
|
|
414
417
|
}).catch((e) => {
|
|
418
|
+
if (!context.alive) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
415
421
|
deferred.reject(marshal(context, e));
|
|
416
422
|
context.runtime.executePendingJobs();
|
|
417
423
|
});
|
|
@@ -449,9 +455,15 @@ function createReadableStream(context, stateMap, source) {
|
|
|
449
455
|
if (result2 instanceof Promise) {
|
|
450
456
|
const deferred = context.newPromise();
|
|
451
457
|
result2.then(() => {
|
|
458
|
+
if (!context.alive) {
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
452
461
|
deferred.resolve(context.undefined);
|
|
453
462
|
context.runtime.executePendingJobs();
|
|
454
463
|
}).catch((e) => {
|
|
464
|
+
if (!context.alive) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
455
467
|
deferred.reject(marshal(context, e));
|
|
456
468
|
context.runtime.executePendingJobs();
|
|
457
469
|
});
|
|
@@ -469,9 +481,15 @@ function createReadableStream(context, stateMap, source) {
|
|
|
469
481
|
if (result2 instanceof Promise) {
|
|
470
482
|
const deferred = context.newPromise();
|
|
471
483
|
result2.then(() => {
|
|
484
|
+
if (!context.alive) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
472
487
|
deferred.resolve(context.undefined);
|
|
473
488
|
context.runtime.executePendingJobs();
|
|
474
489
|
}).catch((e) => {
|
|
490
|
+
if (!context.alive) {
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
475
493
|
deferred.reject(marshal(context, e));
|
|
476
494
|
context.runtime.executePendingJobs();
|
|
477
495
|
});
|
|
@@ -554,4 +572,4 @@ export {
|
|
|
554
572
|
consumeReadableStream
|
|
555
573
|
};
|
|
556
574
|
|
|
557
|
-
//# debugId=
|
|
575
|
+
//# debugId=78C98CEA7918A21764756E2164756E21
|