Skip to content

Instantly share code, notes, and snippets.

@noseratio
Created December 7, 2020 02:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save noseratio/f5c483ecbf02d7175d8d853e62073ea7 to your computer and use it in GitHub Desktop.
Save noseratio/f5c483ecbf02d7175d8d853e62073ea7 to your computer and use it in GitHub Desktop.
FinalizationRegistry
// by @noseratio
// see https://v8.dev/features/weak-references
class Transient {
static #finalizers = new Set();
static #register(transient, external) {
// https://v8.dev/features/weak-references
const weakRef = new WeakRef(transient);
const listener = () => {
weakRef.deref()?.test();
}
external.addEventListener('testEvent', listener, { once: true });
const finalizer = new FinalizationRegistry(({ external, listener, finalizer }) => {
console.log("finalizing!");
external.removeEventListener('testEvent', listener);
this.#finalizers.delete(finalizer);
});
finalizer.register(transient, { external, listener, finalizer })
this.#finalizers.add(finalizer);
}
constructor(external) {
this.constructor.#register(this, external);
}
test() {
console.log(`${this.test.name} called!`);
}
}
async function main() {
const external = new EventTarget();
void function temp() {
// this really must be GC'ed!
new Transient(external);
}();
const gc = globalThis?.global?.gc;
console.log(gc);
await new Promise(r => setTimeout(() => r(gc?.(true)), 1000));
await new Promise(r => setTimeout(() => r(gc?.(true)), 1000));
await new Promise(r => setTimeout(() => r(gc?.(true)), 1000));
external.dispatchEvent(new Event("testEvent"));
console.log("done.")
}
main().catch(console.error);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment