@ricsam/quickjs-core 0.2.14 → 0.2.15
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 +19 -4
- package/dist/cjs/class-builder.cjs.map +3 -3
- package/dist/cjs/file.cjs +2 -1
- package/dist/cjs/file.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/class-builder.mjs +19 -4
- package/dist/mjs/class-builder.mjs.map +3 -3
- package/dist/mjs/file.mjs +2 -1
- package/dist/mjs/file.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/package.json +1 -1
|
@@ -164,7 +164,20 @@ function defineClass(context, stateMap, definition) {
|
|
|
164
164
|
staticMethods: definition.staticMethods
|
|
165
165
|
};
|
|
166
166
|
classCallbackRegistry.set(className, callbacks);
|
|
167
|
-
|
|
167
|
+
const hasParent = definition.extends !== undefined;
|
|
168
|
+
if (hasParent) {
|
|
169
|
+
context.setProp(context.global, "__tempParentClass__", definition.extends);
|
|
170
|
+
}
|
|
171
|
+
let classCode = hasParent ? `(function() {
|
|
172
|
+
const __className__ = ${JSON.stringify(className)};
|
|
173
|
+
const __ParentClass__ = __tempParentClass__;
|
|
174
|
+
|
|
175
|
+
class ${className} extends __ParentClass__ {
|
|
176
|
+
constructor(...args) {
|
|
177
|
+
super();
|
|
178
|
+
// __instanceId__ is already set by parent class, just call our construct
|
|
179
|
+
__hostCall__(__className__, "__construct__", this.__instanceId__, ...args);
|
|
180
|
+
}` : `(function() {
|
|
168
181
|
const __className__ = ${JSON.stringify(className)};
|
|
169
182
|
|
|
170
183
|
class ${className} {
|
|
@@ -176,8 +189,7 @@ function defineClass(context, stateMap, definition) {
|
|
|
176
189
|
configurable: false
|
|
177
190
|
});
|
|
178
191
|
__hostCall__(__className__, "__construct__", this.__instanceId__, ...args);
|
|
179
|
-
}
|
|
180
|
-
`;
|
|
192
|
+
}`;
|
|
181
193
|
if (definition.methods) {
|
|
182
194
|
for (const methodName of Object.keys(definition.methods)) {
|
|
183
195
|
classCode += `
|
|
@@ -227,6 +239,9 @@ function defineClass(context, stateMap, definition) {
|
|
|
227
239
|
return ${className};
|
|
228
240
|
})()`;
|
|
229
241
|
const result = context.evalCode(classCode);
|
|
242
|
+
if (hasParent) {
|
|
243
|
+
context.setProp(context.global, "__tempParentClass__", context.undefined);
|
|
244
|
+
}
|
|
230
245
|
if (result.error) {
|
|
231
246
|
const error = context.dump(result.error);
|
|
232
247
|
result.error.dispose();
|
|
@@ -267,4 +282,4 @@ function clearAllInstanceState() {
|
|
|
267
282
|
}
|
|
268
283
|
})
|
|
269
284
|
|
|
270
|
-
//# debugId=
|
|
285
|
+
//# debugId=7DABC9B5D523AE4664756E2164756E21
|
|
@@ -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.cjs\";\nimport { unmarshal } from \"./unmarshal.cjs\";\nimport { marshal } from \"./marshal.cjs\";\nimport {\n nextInstanceId,\n registerInstance,\n getInstanceStateById as getStateById,\n setInstanceStateById,\n cleanupInstanceState as cleanupState,\n clearAllInstanceState as clearAllState,\n} from \"./instance-state.cjs\";\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 let classCode = `(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\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return 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.cjs\";\nimport { unmarshal } from \"./unmarshal.cjs\";\nimport { marshal } from \"./marshal.cjs\";\nimport {\n nextInstanceId,\n registerInstance,\n getInstanceStateById as getStateById,\n setInstanceStateById,\n cleanupInstanceState as cleanupState,\n clearAllInstanceState as clearAllState,\n} from \"./instance-state.cjs\";\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"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "7DABC9B5D523AE4664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/file.cjs
CHANGED
|
@@ -79,6 +79,7 @@ function concatenateParts(parts) {
|
|
|
79
79
|
function createFileClass(context, stateMap, _blobClass) {
|
|
80
80
|
return import_class_builder.defineClass(context, stateMap, {
|
|
81
81
|
name: "File",
|
|
82
|
+
extends: _blobClass,
|
|
82
83
|
construct: (args) => {
|
|
83
84
|
const fileBits = args[0];
|
|
84
85
|
const fileName = args[1];
|
|
@@ -231,4 +232,4 @@ function createFile(context, stateMap, parts, name, options) {
|
|
|
231
232
|
}
|
|
232
233
|
})
|
|
233
234
|
|
|
234
|
-
//# debugId=
|
|
235
|
+
//# debugId=27C52084BA03C02B64756E2164756E21
|
package/dist/cjs/file.cjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/file.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.cjs\";\nimport { defineClass } from \"./class-builder.cjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.cjs\";\nimport { defineClass } from \"./class-builder.cjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n extends: _blobClass,\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "27C52084BA03C02B64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -130,7 +130,20 @@ function defineClass(context, stateMap, definition) {
|
|
|
130
130
|
staticMethods: definition.staticMethods
|
|
131
131
|
};
|
|
132
132
|
classCallbackRegistry.set(className, callbacks);
|
|
133
|
-
|
|
133
|
+
const hasParent = definition.extends !== undefined;
|
|
134
|
+
if (hasParent) {
|
|
135
|
+
context.setProp(context.global, "__tempParentClass__", definition.extends);
|
|
136
|
+
}
|
|
137
|
+
let classCode = hasParent ? `(function() {
|
|
138
|
+
const __className__ = ${JSON.stringify(className)};
|
|
139
|
+
const __ParentClass__ = __tempParentClass__;
|
|
140
|
+
|
|
141
|
+
class ${className} extends __ParentClass__ {
|
|
142
|
+
constructor(...args) {
|
|
143
|
+
super();
|
|
144
|
+
// __instanceId__ is already set by parent class, just call our construct
|
|
145
|
+
__hostCall__(__className__, "__construct__", this.__instanceId__, ...args);
|
|
146
|
+
}` : `(function() {
|
|
134
147
|
const __className__ = ${JSON.stringify(className)};
|
|
135
148
|
|
|
136
149
|
class ${className} {
|
|
@@ -142,8 +155,7 @@ function defineClass(context, stateMap, definition) {
|
|
|
142
155
|
configurable: false
|
|
143
156
|
});
|
|
144
157
|
__hostCall__(__className__, "__construct__", this.__instanceId__, ...args);
|
|
145
|
-
}
|
|
146
|
-
`;
|
|
158
|
+
}`;
|
|
147
159
|
if (definition.methods) {
|
|
148
160
|
for (const methodName of Object.keys(definition.methods)) {
|
|
149
161
|
classCode += `
|
|
@@ -193,6 +205,9 @@ function defineClass(context, stateMap, definition) {
|
|
|
193
205
|
return ${className};
|
|
194
206
|
})()`;
|
|
195
207
|
const result = context.evalCode(classCode);
|
|
208
|
+
if (hasParent) {
|
|
209
|
+
context.setProp(context.global, "__tempParentClass__", context.undefined);
|
|
210
|
+
}
|
|
196
211
|
if (result.error) {
|
|
197
212
|
const error = context.dump(result.error);
|
|
198
213
|
result.error.dispose();
|
|
@@ -243,4 +258,4 @@ export {
|
|
|
243
258
|
cleanupInstanceState
|
|
244
259
|
};
|
|
245
260
|
|
|
246
|
-
//# debugId=
|
|
261
|
+
//# debugId=1C141B77B235492264756E2164756E21
|
|
@@ -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 let classCode = `(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\n // Add methods\n if (definition.methods) {\n for (const methodName of Object.keys(definition.methods)) {\n classCode += `\n ${methodName}(...args) {\n return __hostCall__(__className__, ${JSON.stringify(methodName)}, this.__instanceId__, ...args);\n }\n`;\n }\n }\n\n // Add properties (getters/setters)\n if (definition.properties) {\n for (const [propName, descriptor] of Object.entries(definition.properties)) {\n if (descriptor.get) {\n classCode += `\n get ${propName}() {\n return __hostCall__(__className__, \"get:${propName}\", this.__instanceId__);\n }\n`;\n }\n if (descriptor.set) {\n classCode += `\n set ${propName}(value) {\n __hostCall__(__className__, \"set:${propName}\", this.__instanceId__, value);\n }\n`;\n }\n }\n }\n\n // Close the class definition\n classCode += ` }\n`;\n\n // Add static methods\n if (definition.staticMethods) {\n for (const methodName of Object.keys(definition.staticMethods)) {\n classCode += `\n ${className}.${methodName} = function(...args) {\n return __hostCall__(__className__, \"static:${methodName}\", 0, ...args);\n };\n`;\n }\n }\n\n // Add static properties\n if (definition.staticProperties) {\n for (const [propName, value] of Object.entries(definition.staticProperties)) {\n classCode += `\n ${className}.${propName} = ${JSON.stringify(value)};\n`;\n }\n }\n\n classCode += `\n return ${className};\n})()`;\n\n // Evaluate the class definition\n const result = context.evalCode(classCode);\n if (result.error) {\n const error = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to define class ${className}: ${JSON.stringify(error)}`);\n }\n\n // Store reference to instance state in stateMap for backwards compatibility\n // When an instance handle is accessed, we can look up its state via __instanceId__\n const classHandle = result.value;\n\n return classHandle;\n}\n\n// Registry for class callbacks\ninterface ClassCallbacks<TState extends object> {\n construct?: (args: unknown[]) => TState;\n methods?: Record<string, (this: TState, ...args: unknown[]) => unknown>;\n properties?: Record<string, { get?: (this: TState) => unknown; set?: (this: TState, value: unknown) => void }>;\n staticMethods?: Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst classCallbackRegistry = new Map<string, ClassCallbacks<object>>();\n\n/**\n * Get internal state for a QuickJS instance by extracting its __instanceId__\n */\nexport function getInstanceState<T>(\n context: QuickJSContext,\n instanceHandle: QuickJSHandle\n): T | undefined {\n const idHandle = context.getProp(instanceHandle, \"__instanceId__\");\n if (context.typeof(idHandle) !== \"number\") {\n idHandle.dispose();\n return undefined;\n }\n const id = context.getNumber(idHandle);\n idHandle.dispose();\n return 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 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"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "1C141B77B235492264756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/file.mjs
CHANGED
|
@@ -45,6 +45,7 @@ function concatenateParts(parts) {
|
|
|
45
45
|
function createFileClass(context, stateMap, _blobClass) {
|
|
46
46
|
return defineClass(context, stateMap, {
|
|
47
47
|
name: "File",
|
|
48
|
+
extends: _blobClass,
|
|
48
49
|
construct: (args) => {
|
|
49
50
|
const fileBits = args[0];
|
|
50
51
|
const fileName = args[1];
|
|
@@ -200,4 +201,4 @@ export {
|
|
|
200
201
|
createFile
|
|
201
202
|
};
|
|
202
203
|
|
|
203
|
-
//# debugId=
|
|
204
|
+
//# debugId=4DA4A4C486D4406A64756E2164756E21
|
package/dist/mjs/file.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/file.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\ninterface FileInternalState {\n parts: Uint8Array[];\n type: string;\n size: number;\n name: string;\n lastModified: number;\n webkitRelativePath: string;\n}\n\n/**\n * Normalize file parts to Uint8Array\n * Handles various input types including cross-realm ArrayBuffer/Uint8Array\n */\nfunction normalizeParts(parts: unknown[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n\n for (const part of parts) {\n if (typeof part === \"string\") {\n result.push(new TextEncoder().encode(part));\n } else if (part instanceof Uint8Array) {\n result.push(part);\n } else if (part instanceof ArrayBuffer) {\n result.push(new Uint8Array(part));\n } else if (ArrayBuffer.isView(part)) {\n result.push(new Uint8Array(part.buffer, part.byteOffset, part.byteLength));\n } else if (part && typeof part === \"object\") {\n // Handle cross-realm or duck-typed ArrayBuffer-like objects\n if (\"byteLength\" in part && typeof (part as ArrayBuffer).byteLength === \"number\") {\n try {\n // Try as ArrayBuffer\n result.push(new Uint8Array(part as ArrayBuffer));\n } catch {\n // If that fails, try as TypedArray-like with buffer property\n if (\"buffer\" in part && \"byteOffset\" in part) {\n const view = part as ArrayBufferView;\n try {\n result.push(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n } catch {\n // Skip invalid parts\n }\n }\n }\n } else if (\"parts\" in part) {\n // Another Blob-like object\n const blobParts = (part as { parts: Uint8Array[] }).parts;\n result.push(...blobParts);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Concatenate Uint8Arrays into a single Uint8Array\n */\nfunction concatenateParts(parts: Uint8Array[]): Uint8Array {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const part of parts) {\n result.set(part, offset);\n offset += part.length;\n }\n return result;\n}\n\n/**\n * Create the File class for QuickJS (extends Blob)\n */\nexport function createFileClass(\n context: QuickJSContext,\n stateMap: StateMap,\n _blobClass: QuickJSHandle\n): QuickJSHandle {\n return defineClass<FileInternalState>(context, stateMap, {\n name: \"File\",\n extends: _blobClass,\n construct: (args) => {\n const fileBits = args[0] as unknown[] | undefined;\n const fileName = args[1] as string;\n const options = args[2] as { type?: string; lastModified?: number } | undefined;\n\n const parts = fileBits ? normalizeParts(fileBits) : [];\n const size = parts.reduce((sum, part) => sum + part.length, 0);\n const type = options?.type ?? \"\";\n const lastModified = options?.lastModified ?? Date.now();\n\n return {\n parts,\n type,\n size,\n name: String(fileName),\n lastModified,\n webkitRelativePath: \"\",\n };\n },\n properties: {\n size: {\n get(this: FileInternalState) {\n return this.size;\n },\n },\n type: {\n get(this: FileInternalState) {\n return this.type;\n },\n },\n name: {\n get(this: FileInternalState) {\n return this.name;\n },\n },\n lastModified: {\n get(this: FileInternalState) {\n return this.lastModified;\n },\n },\n webkitRelativePath: {\n get(this: FileInternalState) {\n return this.webkitRelativePath;\n },\n },\n },\n methods: {\n async text(this: FileInternalState): Promise<string> {\n const data = concatenateParts(this.parts);\n return new TextDecoder().decode(data);\n },\n async arrayBuffer(this: FileInternalState): Promise<ArrayBuffer> {\n const data = concatenateParts(this.parts);\n return data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer;\n },\n async bytes(this: FileInternalState): Promise<Uint8Array> {\n return concatenateParts(this.parts);\n },\n slice(\n this: FileInternalState,\n start?: unknown,\n end?: unknown,\n contentType?: unknown\n ): object {\n const data = concatenateParts(this.parts);\n const startIndex = typeof start === \"number\" ? start : 0;\n const endIndex = typeof end === \"number\" ? end : data.length;\n const sliced = data.slice(startIndex, endIndex);\n\n // Return a Blob-like state (not a File, as per spec)\n return {\n parts: [sliced],\n type: typeof contentType === \"string\" ? contentType : this.type,\n size: sliced.length,\n };\n },\n stream(this: FileInternalState): object {\n const data = concatenateParts(this.parts);\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n\n return {\n pull: (controller: { enqueue: (chunk: unknown) => void; close: () => void }) => {\n if (offset >= data.length) {\n controller.close();\n return;\n }\n\n const chunk = data.slice(offset, Math.min(offset + chunkSize, data.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n };\n },\n },\n });\n}\n\n/**\n * Create a File in QuickJS from host data\n */\nexport function createFile(\n context: QuickJSContext,\n stateMap: StateMap,\n parts: BlobPart[],\n name: string,\n options?: FilePropertyBag\n): QuickJSHandle {\n // Get the File constructor from global\n const FileConstructor = context.getProp(context.global, \"File\");\n\n // Marshal the parts\n const partsHandle = context.newArray();\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n let partHandle: QuickJSHandle;\n\n if (typeof part === \"string\") {\n partHandle = context.newString(part);\n } else if (part instanceof ArrayBuffer) {\n partHandle = context.newArrayBuffer(part);\n } else if (part instanceof Uint8Array) {\n partHandle = context.newArrayBuffer(\n part.buffer.slice(part.byteOffset, part.byteOffset + part.byteLength)\n );\n } else if (part instanceof Blob) {\n partHandle = context.newString(\"[Blob]\");\n } else {\n partHandle = context.newString(String(part));\n }\n\n context.setProp(partsHandle, i, partHandle);\n partHandle.dispose();\n }\n\n // Marshal name\n const nameHandle = context.newString(name);\n\n // Marshal options\n const optionsHandle = context.newObject();\n if (options?.type) {\n const typeHandle = context.newString(options.type);\n context.setProp(optionsHandle, \"type\", typeHandle);\n typeHandle.dispose();\n }\n if (options?.lastModified !== undefined) {\n const lastModifiedHandle = context.newNumber(options.lastModified);\n context.setProp(optionsHandle, \"lastModified\", lastModifiedHandle);\n lastModifiedHandle.dispose();\n }\n\n FileConstructor.dispose();\n\n // Set temporary globals for evalCode\n context.setProp(context.global, \"__tempFileParts__\", partsHandle);\n context.setProp(context.global, \"__tempFileName__\", nameHandle);\n context.setProp(context.global, \"__tempFileOptions__\", optionsHandle);\n partsHandle.dispose();\n nameHandle.dispose();\n optionsHandle.dispose();\n\n // Create File using evalCode with 'new' (callFunction doesn't work with constructors)\n const result = context.evalCode(\n \"new File(__tempFileParts__, __tempFileName__, __tempFileOptions__)\"\n );\n\n // Clean up temporary globals\n const cleanup1 = context.evalCode(\"delete globalThis.__tempFileParts__\");\n const cleanup2 = context.evalCode(\"delete globalThis.__tempFileName__\");\n const cleanup3 = context.evalCode(\"delete globalThis.__tempFileOptions__\");\n if (cleanup1.error) cleanup1.error.dispose();\n else cleanup1.value.dispose();\n if (cleanup2.error) cleanup2.error.dispose();\n else cleanup2.value.dispose();\n if (cleanup3.error) cleanup3.error.dispose();\n else cleanup3.value.dispose();\n\n if (result.error) {\n const msgHandle = context.getProp(result.error, \"message\");\n const errorMsg = context.dump(msgHandle);\n msgHandle.dispose();\n result.error.dispose();\n throw new Error(`Failed to create File: ${errorMsg}`);\n }\n\n return result.value;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "4DA4A4C486D4406A64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED