/** * `bun:ffi` shape for the JavaScriptCore C API. Symbols come from one of: * * - `/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore` (macOS) * - `libjavascriptcoregtk-4.1.so.0` / `libjavascriptcoregtk-6.0.so.1` (Linux) * * The {@link openJsc} function resolves the library (via `resolver.ts`), * opens it once per process, and returns a strongly-typed `symbols` bag. * * All `JSValueRef` / `JSObjectRef` / `JSStringRef` / `JSContextRef` / * `JSGlobalContextRef` / `JSContextGroupRef` / `JSClassRef` are opaque * pointers — `FFIType.u64` on the wire, `bigint | null` in TypeScript. * * Lifetime rules (cribbed from JavaScriptCore.framework documentation): * - Refcounted: `*ContextGroup`, `*GlobalContext`, `*String`, `*Class`. * Retain on acquire from C land if you'll outlive the caller; release * when done. We retain nothing on the way in (callbacks already own * their values) and release once on cleanup. * - Garbage-collected: `JSValueRef`, `JSObjectRef`. They need * `JSValueProtect` to survive across calls into the host; unprotect * when done. The {@link IsolateFfi} keeps a small "long-lived" set * and protects only those. */ import { dlopen, FFIType, JSCallback } from "bun:ffi"; import { JscLibraryNotFoundError } from "./resolver"; /** All JSC opaque-pointer types collapse to this in TS-land. */ export type JscPointer = bigint; declare const SYMBOL_SHAPE: { readonly JSContextGroupCreate: { readonly args: readonly []; readonly returns: FFIType.uint64_t; }; readonly JSContextGroupRelease: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSGlobalContextCreateInGroup: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSGlobalContextRelease: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSContextGetGlobalObject: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSGlobalContextSetEvalEnabled: { readonly args: readonly [FFIType.uint64_t, FFIType.bool, FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSContextGroupSetExecutionTimeLimit: { readonly args: readonly [FFIType.uint64_t, FFIType.double, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSContextGroupClearExecutionTimeLimit: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSStringCreateWithUTF8CString: { readonly args: readonly [FFIType.cstring]; readonly returns: FFIType.uint64_t; }; readonly JSStringRelease: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSStringGetMaximumUTF8CStringSize: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSStringGetUTF8CString: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSEvaluateScript: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.int32_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSCheckScriptSyntax: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.int32_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueGetType: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.int32_t; }; readonly JSValueIsUndefined: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueIsNull: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueIsBoolean: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueIsNumber: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueIsString: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueIsObject: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueMakeUndefined: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSValueMakeNull: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSValueMakeBoolean: { readonly args: readonly [FFIType.uint64_t, FFIType.bool]; readonly returns: FFIType.uint64_t; }; readonly JSValueMakeNumber: { readonly args: readonly [FFIType.uint64_t, FFIType.double]; readonly returns: FFIType.uint64_t; }; readonly JSValueMakeString: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSValueToBoolean: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSValueToNumber: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.double; }; readonly JSValueToStringCopy: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSValueMakeFromJSONString: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSValueCreateJSONString: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint32_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSValueProtect: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSValueUnprotect: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSObjectGetProperty: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectSetProperty: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint32_t, FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSObjectMake: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectMakeFunctionWithCallback: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectIsFunction: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSObjectCallAsFunction: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSGarbageCollect: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSGetMemoryUsageStatistics: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectMakeError: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectMakeDeferredPromise: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectGetPrivate: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectSetPrivate: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.bool; }; readonly JSClassRelease: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; readonly JSClassCreate: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectGetPropertyAtIndex: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t, FFIType.uint32_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSObjectCopyPropertyNames: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSPropertyNameArrayGetCount: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSPropertyNameArrayGetNameAtIndex: { readonly args: readonly [FFIType.uint64_t, FFIType.uint64_t]; readonly returns: FFIType.uint64_t; }; readonly JSPropertyNameArrayRelease: { readonly args: readonly [FFIType.uint64_t]; readonly returns: FFIType.void; }; }; export type JscSymbols = ReturnType>["symbols"]; export declare const openJsc: () => { ok: true; symbols: JscSymbols; path: string; flavor: string; } | { ok: false; error: JscLibraryNotFoundError; }; /** Re-export so the backend can construct callbacks for host functions. */ export { JSCallback };