declare namespace emnapi { export type CleanupHookCallbackFunction = number | ((arg: number) => void); export class ConstHandle extends Handle { constructor(id: number, value: S); dispose(): void; } export class Context { private _isStopping; private _canCallIntoJs; private _suppressDestroy; envStore: Store; scopeStore: ScopeStore; refStore: Store; deferredStore: Store>; handleStore: HandleStore; private readonly refCounter?; private readonly cleanupQueue; feature: { supportReflect: boolean; supportFinalizer: boolean; supportWeakSymbol: boolean; supportBigInt: boolean; supportNewFunction: boolean; canSetFunctionName: boolean; setImmediate: (callback: () => void) => void; Buffer: BufferCtor | undefined; MessageChannel: { new (): MessageChannel; prototype: MessageChannel; } | undefined; }; constructor(); /** * Suppress the destroy on `beforeExit` event in Node.js. * Call this method if you want to keep the context and * all associated {@link Env | Env} alive, * this also means that cleanup hooks will not be called. * After call this method, you should call * {@link Context.destroy | `Context.prototype.destroy`} method manually. */ suppressDestroy(): void; getRuntimeVersions(): { version: string; NODE_API_SUPPORTED_VERSION_MAX: Version; NAPI_VERSION_EXPERIMENTAL: Version; NODE_API_DEFAULT_MODULE_API_VERSION: Version; }; createNotSupportWeakRefError(api: string, message: string): NotSupportWeakRefError; createNotSupportBufferError(api: string, message: string): NotSupportBufferError; createReference(envObject: Env, handle_id: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership): Reference; createReferenceWithData(envObject: Env, handle_id: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership, data: void_p): Reference; createReferenceWithFinalizer(envObject: Env, handle_id: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership, finalize_callback?: napi_finalize, finalize_data?: void_p, finalize_hint?: void_p): Reference; createDeferred(value: IDeferrdValue): Deferred; createEnv(filename: string, moduleApiVersion: number, makeDynCall_vppp: (cb: Ptr) => (a: Ptr, b: Ptr, c: Ptr) => void, makeDynCall_vp: (cb: Ptr) => (a: Ptr) => void, abort: (msg?: string) => never, nodeBinding?: any): Env; createTrackedFinalizer(envObject: Env, finalize_callback: napi_finalize, finalize_data: void_p, finalize_hint: void_p): TrackedFinalizer; getCurrentScope(): HandleScope | null; addToCurrentScope(value: V): Handle; openScope(envObject: Env): HandleScope; closeScope(envObject: Env, _scope?: HandleScope): void; ensureHandle(value: S): Handle; addCleanupHook(envObject: Env, fn: CleanupHookCallbackFunction, arg: number): void; removeCleanupHook(envObject: Env, fn: CleanupHookCallbackFunction, arg: number): void; runCleanup(): void; increaseWaitingRequestCounter(): void; decreaseWaitingRequestCounter(): void; setCanCallIntoJs(value: boolean): void; setStopping(value: boolean): void; canCallIntoJs(): boolean; /** * Destroy the context and call cleanup hooks. * Associated {@link Env | Env} will be destroyed. */ destroy(): void; } export function createContext(): Context; export class Deferred implements IStoreValue { static create(ctx: Context, value: IDeferrdValue): Deferred; id: number; ctx: Context; value: IDeferrdValue; constructor(ctx: Context, value: IDeferrdValue); resolve(value: T): void; reject(reason?: any): void; dispose(): void; } export class EmnapiError extends Error { constructor(message?: string); } export abstract class Env implements IStoreValue { readonly ctx: Context; moduleApiVersion: number; makeDynCall_vppp: (cb: Ptr) => (a: Ptr, b: Ptr, c: Ptr) => void; makeDynCall_vp: (cb: Ptr) => (a: Ptr) => void; abort: (msg?: string) => never; id: number; openHandleScopes: number; instanceData: TrackedFinalizer | null; tryCatch: TryCatch; refs: number; reflist: RefTracker; finalizing_reflist: RefTracker; pendingFinalizers: RefTracker[]; lastError: { errorCode: napi_status; engineErrorCode: number; engineReserved: Ptr; }; inGcFinalizer: boolean; constructor(ctx: Context, moduleApiVersion: number, makeDynCall_vppp: (cb: Ptr) => (a: Ptr, b: Ptr, c: Ptr) => void, makeDynCall_vp: (cb: Ptr) => (a: Ptr) => void, abort: (msg?: string) => never); /** @virtual */ canCallIntoJs(): boolean; terminatedOrTerminating(): boolean; ref(): void; unref(): void; ensureHandle(value: S): Handle; ensureHandleId(value: any): napi_value; clearLastError(): napi_status; setLastError(error_code: napi_status, engine_error_code?: uint32_t, engine_reserved?: void_p): napi_status; getReturnStatus(): napi_status; callIntoModule(fn: (env: Env) => T, handleException?: (envObject: Env, value: any) => void): T; /** @virtual */ abstract callFinalizer(cb: napi_finalize, data: void_p, hint: void_p): void; invokeFinalizerFromGC(finalizer: RefTracker): void; checkGCAccess(): void; /** @virtual */ enqueueFinalizer(finalizer: RefTracker): void; /** @virtual */ dequeueFinalizer(finalizer: RefTracker): void; /** @virtual */ deleteMe(): void; dispose(): void; private readonly _bindingMap; initObjectBinding(value: S): IReferenceBinding; getObjectBinding(value: S): IReferenceBinding; setInstanceData(data: number, finalize_cb: number, finalize_hint: number): void; getInstanceData(): number; } /** @public */ interface External_2 extends Record { } /** @public */ const External_2: { new (value: number | bigint): External_2; prototype: null; }; export { External_2 as External } export class Finalizer { envObject: Env; private _finalizeCallback; private _finalizeData; private _finalizeHint; private _makeDynCall_vppp; constructor(envObject: Env, _finalizeCallback?: napi_finalize, _finalizeData?: void_p, _finalizeHint?: void_p); callback(): napi_finalize; data(): void_p; hint(): void_p; resetEnv(): void; resetFinalizer(): void; callFinalizer(): void; dispose(): void; } export function getDefaultContext(): Context; /** @public */ export function getExternalValue(external: External_2): number | bigint; export class Handle { id: number; value: S; constructor(id: number, value: S); data(): void_p; isNumber(): boolean; isBigInt(): boolean; isString(): boolean; isFunction(): boolean; isExternal(): boolean; isObject(): boolean; isArray(): boolean; isArrayBuffer(): boolean; isTypedArray(): boolean; isBuffer(BufferConstructor?: BufferCtor): boolean; isDataView(): boolean; isDate(): boolean; isPromise(): boolean; isBoolean(): boolean; isUndefined(): boolean; isSymbol(): boolean; isNull(): boolean; dispose(): void; } export class HandleScope { handleStore: HandleStore; id: number; parent: HandleScope | null; child: HandleScope | null; start: number; end: number; private _escapeCalled; callbackInfo: ICallbackInfo; constructor(handleStore: HandleStore, id: number, parentScope: HandleScope | null, start: number, end?: number); add(value: V): Handle; addExternal(data: void_p): Handle; dispose(): void; escape(handle: number): Handle | null; escapeCalled(): boolean; } export class HandleStore { static UNDEFINED: ConstHandle; static NULL: ConstHandle; static FALSE: ConstHandle; static TRUE: ConstHandle; static GLOBAL: ConstHandle; static MIN_ID: 6; private readonly _values; private _next; push(value: S): Handle; erase(start: number, end: number): void; get(id: Ptr): Handle | undefined; swap(a: number, b: number): void; dispose(): void; } export interface ICallbackInfo { thiz: any; data: void_p; args: ArrayLike; fn: Function; } export interface IDeferrdValue { resolve: (value: T) => void; reject: (reason?: any) => void; } export interface IReferenceBinding { wrapped: number; tag: Uint32Array | null; } /** @public */ export function isExternal(object: unknown): object is External_2; export function isReferenceType(v: any): v is object; export interface IStoreValue { id: number; dispose(): void; [x: string]: any; } export const NAPI_VERSION_EXPERIMENTAL = Version.NAPI_VERSION_EXPERIMENTAL; export const NODE_API_DEFAULT_MODULE_API_VERSION = Version.NODE_API_DEFAULT_MODULE_API_VERSION; export const NODE_API_SUPPORTED_VERSION_MAX = Version.NODE_API_SUPPORTED_VERSION_MAX; export const NODE_API_SUPPORTED_VERSION_MIN = Version.NODE_API_SUPPORTED_VERSION_MIN; export class NodeEnv extends Env { filename: string; private readonly nodeBinding?; destructing: boolean; finalizationScheduled: boolean; constructor(ctx: Context, filename: string, moduleApiVersion: number, makeDynCall_vppp: (cb: Ptr) => (a: Ptr, b: Ptr, c: Ptr) => void, makeDynCall_vp: (cb: Ptr) => (a: Ptr) => void, abort: (msg?: string) => never, nodeBinding?: any); deleteMe(): void; canCallIntoJs(): boolean; triggerFatalException(err: any): void; callbackIntoModule(enforceUncaughtExceptionPolicy: boolean, fn: (env: Env) => T): T; callFinalizer(cb: napi_finalize, data: void_p, hint: void_p): void; callFinalizerInternal(forceUncaught: int, cb: napi_finalize, data: void_p, hint: void_p): void; enqueueFinalizer(finalizer: RefTracker): void; drainFinalizerQueue(): void; } export class NotSupportBufferError extends EmnapiError { constructor(api: string, message: string); } export class NotSupportWeakRefError extends EmnapiError { constructor(api: string, message: string); } export class Persistent { private _ref; private _param; private _callback; private static readonly _registry; constructor(value: T); setWeak

(param: P, callback: (param: P) => void): void; clearWeak(): void; reset(): void; isEmpty(): boolean; deref(): T | undefined; } export class Reference extends RefTracker implements IStoreValue { private static weakCallback; id: number; envObject: Env; private readonly canBeWeak; private _refcount; private readonly _ownership; persistent: Persistent; static create(envObject: Env, handle_id: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership, _unused1?: void_p, _unused2?: void_p, _unused3?: void_p): Reference; protected constructor(envObject: Env, handle_id: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership); ref(): number; unref(): number; get(envObject?: Env): napi_value; /** @virtual */ resetFinalizer(): void; /** @virtual */ data(): void_p; refcount(): number; ownership(): ReferenceOwnership; /** @virtual */ protected callUserFinalizer(): void; /** @virtual */ protected invokeFinalizerFromGC(): void; private _setWeak; finalize(): void; dispose(): void; } export enum ReferenceOwnership { kRuntime = 0, kUserland = 1 } export class ReferenceWithData extends Reference { private readonly _data; static create(envObject: Env, value: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership, data: void_p): ReferenceWithData; private constructor(); data(): void_p; } export class ReferenceWithFinalizer extends Reference { private _finalizer; static create(envObject: Env, value: napi_value, initialRefcount: uint32_t, ownership: ReferenceOwnership, finalize_callback: napi_finalize, finalize_data: void_p, finalize_hint: void_p): ReferenceWithFinalizer; private constructor(); resetFinalizer(): void; data(): void_p; protected callUserFinalizer(): void; protected invokeFinalizerFromGC(): void; dispose(): void; } export class RefTracker { /** @virtual */ dispose(): void; /** @virtual */ finalize(): void; private _next; private _prev; link(list: RefTracker): void; unlink(): void; static finalizeAll(list: RefTracker): void; } export class ScopeStore { private readonly _rootScope; currentScope: HandleScope; private readonly _values; constructor(); get(id: number): HandleScope | undefined; openScope(envObject: Env): HandleScope; closeScope(envObject: Env): void; dispose(): void; } export class Store { protected _values: Array; private _freeList; private _size; constructor(); add(value: V): void; get(id: Ptr): V | undefined; has(id: Ptr): boolean; remove(id: Ptr): void; dispose(): void; } export class TrackedFinalizer extends RefTracker { private _finalizer; static create(envObject: Env, finalize_callback: napi_finalize, finalize_data: void_p, finalize_hint: void_p): TrackedFinalizer; private constructor(); data(): void_p; dispose(): void; finalize(): void; } export class TryCatch { private _exception; private _caught; isEmpty(): boolean; hasCaught(): boolean; exception(): any; setError(err: any): void; reset(): void; extractException(): any; } export const version: string; }