123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 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;
- }
|