import { MaybeAsyncBlock } from "./asyncify-helpers"; import type { QuickJSHandle } from "./types"; /** * An object that can be disposed. * [[Lifetime]] is the canonical implementation of Disposable. * Use [[Scope]] to manage cleaning up multiple disposables. */ export interface Disposable { /** * Dispose of the underlying resources used by this object. */ dispose(): void; /** * @returns true if the object is alive * @returns false after the object has been [[dispose]]d */ alive: boolean; } /** * A lifetime prevents access to a value after the lifetime has been * [[dispose]]ed. * * Typically, quickjs-emscripten uses Lifetimes to protect C memory pointers. */ export declare class Lifetime<T, TCopy = never, Owner = never> implements Disposable { protected readonly _value: T; protected readonly copier?: ((value: T | TCopy) => TCopy) | undefined; protected readonly disposer?: ((value: T | TCopy) => void) | undefined; protected readonly _owner?: Owner | undefined; protected _alive: boolean; protected _constructorStack: string | undefined; /** * When the Lifetime is disposed, it will call `disposer(_value)`. Use the * disposer function to implement whatever cleanup needs to happen at the end * of `value`'s lifetime. * * `_owner` is not used or controlled by the lifetime. It's just metadata for * the creator. */ constructor(_value: T, copier?: ((value: T | TCopy) => TCopy) | undefined, disposer?: ((value: T | TCopy) => void) | undefined, _owner?: Owner | undefined); get alive(): boolean; /** * The value this Lifetime protects. You must never retain the value - it * may become invalid, leading to memory errors. * * @throws If the lifetime has been [[dispose]]d already. */ get value(): T; get owner(): Owner | undefined; get dupable(): boolean; /** * Create a new handle pointing to the same [[value]]. */ dup(): Lifetime<TCopy, TCopy, Owner>; /** * Call `map` with this lifetime, then dispose the lifetime. * @return the result of `map(this)`. */ consume<O>(map: (lifetime: this) => O): O; consume<O>(map: (lifetime: QuickJSHandle) => O): O; /** * Dispose of [[value]] and perform cleanup. */ dispose(): void; private assertAlive; } /** * A Lifetime that lives forever. Used for constants. */ export declare class StaticLifetime<T, Owner = never> extends Lifetime<T, T, Owner> { constructor(value: T, owner?: Owner); get dupable(): boolean; dup(): this; dispose(): void; } /** * A Lifetime that does not own its `value`. A WeakLifetime never calls its * `disposer` function, but can be `dup`ed to produce regular lifetimes that * do. * * Used for function arguments. */ export declare class WeakLifetime<T, TCopy = never, Owner = never> extends Lifetime<T, TCopy, Owner> { constructor(value: T, copier?: (value: T | TCopy) => TCopy, disposer?: (value: TCopy) => void, owner?: Owner); dispose(): void; } /** * Scope helps reduce the burden of manually tracking and disposing of * Lifetimes. See [[withScope]]. and [[withScopeAsync]]. */ export declare class Scope implements Disposable { /** * Run `block` with a new Scope instance that will be disposed after the block returns. * Inside `block`, call `scope.manage` on each lifetime you create to have the lifetime * automatically disposed after the block returns. * * @warning Do not use with async functions. Instead, use [[withScopeAsync]]. */ static withScope<R>(block: (scope: Scope) => R): R; static withScopeMaybeAsync<Return, This, Yielded>(_this: This, block: MaybeAsyncBlock<Return, This, Yielded, [Scope]>): Return | Promise<Return>; /** * Run `block` with a new Scope instance that will be disposed after the * block's returned promise settles. Inside `block`, call `scope.manage` on each * lifetime you create to have the lifetime automatically disposed after the * block returns. */ static withScopeAsync<R>(block: (scope: Scope) => Promise<R>): Promise<R>; private _disposables; /** * Track `lifetime` so that it is disposed when this scope is disposed. */ manage<T extends Disposable>(lifetime: T): T; get alive(): boolean; dispose(): void; }