lifecycle-utils
Version:
A set of general utilities for the lifecycle of a JS/TS project/library
73 lines • 2.73 kB
TypeScript
export declare class FinalizerRegistrationHandle {
private constructor();
/** Returns `true` if the target object has been finalized or the handle has been disposed */
get finalized(): boolean;
[Symbol.dispose](): void;
dispose(): void;
}
/**
* Register a finalizer for a given target, so that the finalizer is called after the target is garbage-collected.
*
* A finalizer can be a function to call, an object with a `dispose` method, an object with a `Symbol.dispose` method,
* an object with a `Symbol.asyncDispose` method, or a Promise that resolves to one of the previous types.
*
* When registering a finalizer, the result is a handle that can be used to dispose the registration
* (so that the finalizer won't trigger when the object is garbage-collected).
*
* You can register multiple finalizers for the same target, and each registration is completely separate.
*
* > **Note:** make sure to never reference the target in the finalizer,
* > since otherwise it might cause the target to never get garbage-collected.
* @example
* ```typescript
* import {DisposeAggregator, registerFinalizer} from "lifecycle-utils";
*
* const disposeAggregator = new DisposeAggregator();
* disposeAggregator.add(() => console.log("disposed"));
*
* let obj: {} | null = {};
* registerFinalizer(obj, disposeAggregator);
*
* obj = null; // get rid of a reference to the object
* await new Promise((accept) => setTimeout(accept, 1000 * 10)); // wait for the garbage collector
*
* // disposed
* ```
* @example
* ```typescript
* import {registerFinalizer} from "lifecycle-utils";
*
* let disposed1 = false;
* let disposed2 = false;
*
* let obj: {} | null = {};
* const handle1 = registerFinalizer(obj, () => {
* disposed1 = true;
* });
* const handle2 = registerFinalizer(obj, () => {
* disposed2 = true;
* });
*
* console.log(disposed2.finalized); // false
*
* handle1.dispose(); // remove the finalizer
* obj = null; // get rid of a reference to the object
*
* await new Promise((accept) => setTimeout(accept, 1000 * 10)); // wait for the garbage collector
*
* console.log(disposed1); // false, because we removed the finalizer
* console.log(disposed2); // true
*
* console.log(disposed2.finalized); // true
* ```
*/
export declare function registerFinalizer(target: object, finalizer: RegisterFinalizer): FinalizerRegistrationHandle;
export type RegisterFinalizer = WrappedFinalizer | Promise<WrappedFinalizer>;
export type WrappedFinalizer = (() => void | Promise<void>) | {
[Symbol.asyncDispose](): void | Promise<void>;
} | {
[Symbol.dispose](): void;
} | {
dispose(): void | Promise<void>;
};
//# sourceMappingURL=registerFinalizer.d.ts.map