diff --git a/lib/.eslintrc.yaml b/lib/.eslintrc.yaml index 2cc2660157191f..a7555a802ad95c 100644 --- a/lib/.eslintrc.yaml +++ b/lib/.eslintrc.yaml @@ -48,6 +48,8 @@ rules: - prepareStackTrace - stackTraceLimit - name: EvalError + - name: FinalizationRegistry + into: Safe - name: Float32Array - name: Float64Array - name: Function @@ -86,6 +88,8 @@ rules: - name: URIError - name: WeakMap into: Safe + - name: WeakRef + into: Safe - name: WeakSet into: Safe globals: diff --git a/lib/internal/event_target.js b/lib/internal/event_target.js index 02166bcc783fe2..026746825b7767 100644 --- a/lib/internal/event_target.js +++ b/lib/internal/event_target.js @@ -14,8 +14,10 @@ const { ObjectGetOwnPropertyDescriptors, ReflectApply, SafeArrayIterator, + SafeFinalizationRegistry, SafeMap, SafeWeakMap, + SafeWeakRef, SafeWeakSet, String, Symbol, @@ -201,7 +203,7 @@ let weakListenersState = null; // get garbage collected now that it's weak. let objectToWeakListenerMap = null; function weakListeners() { - weakListenersState ??= new globalThis.FinalizationRegistry( + weakListenersState ??= new SafeFinalizationRegistry( (listener) => listener.remove() ); objectToWeakListenerMap ??= new SafeWeakMap(); @@ -232,7 +234,7 @@ class Listener { this.weak = Boolean(weak); // Don't retain the object if (this.weak) { - this.callback = new globalThis.WeakRef(listener); + this.callback = new SafeWeakRef(listener); weakListeners().registry.register(listener, this, this); // Make the retainer retain the listener in a WeakMap weakListeners().map.set(weak, listener); diff --git a/lib/internal/per_context/primordials.js b/lib/internal/per_context/primordials.js index f6f960eabdf316..2c5ce73007bb9d 100644 --- a/lib/internal/per_context/primordials.js +++ b/lib/internal/per_context/primordials.js @@ -163,6 +163,7 @@ function copyPrototype(src, dest, prefix) { 'Date', 'Error', 'EvalError', + 'FinalizationRegistry', 'Float32Array', 'Float64Array', 'Function', @@ -186,6 +187,7 @@ function copyPrototype(src, dest, prefix) { 'Uint8Array', 'Uint8ClampedArray', 'WeakMap', + 'WeakRef', 'WeakSet', ].forEach((name) => { const original = global[name]; @@ -229,6 +231,7 @@ function copyPrototype(src, dest, prefix) { const { ArrayPrototypeForEach, + FinalizationRegistry, FunctionPrototypeCall, Map, ObjectFreeze, @@ -236,6 +239,7 @@ const { Set, SymbolIterator, WeakMap, + WeakRef, WeakSet, } = primordials; @@ -334,6 +338,7 @@ primordials.SafeWeakMap = makeSafe( constructor(i) { super(i); } // eslint-disable-line no-useless-constructor } ); + primordials.SafeSet = makeSafe( Set, class SafeSet extends Set { @@ -347,5 +352,20 @@ primordials.SafeWeakSet = makeSafe( } ); +primordials.SafeFinalizationRegistry = makeSafe( + FinalizationRegistry, + class SafeFinalizationRegistry extends FinalizationRegistry { + // eslint-disable-next-line no-useless-constructor + constructor(cleanupCallback) { super(cleanupCallback); } + } +); +primordials.SafeWeakRef = makeSafe( + WeakRef, + class SafeWeakRef extends WeakRef { + // eslint-disable-next-line no-useless-constructor + constructor(target) { super(target); } + } +); + ObjectSetPrototypeOf(primordials, null); ObjectFreeze(primordials); diff --git a/lib/internal/util/iterable_weak_map.js b/lib/internal/util/iterable_weak_map.js index c9715a7e313b20..0842622d2451b3 100644 --- a/lib/internal/util/iterable_weak_map.js +++ b/lib/internal/util/iterable_weak_map.js @@ -1,25 +1,14 @@ 'use strict'; const { - makeSafe, ObjectFreeze, + SafeFinalizationRegistry, SafeSet, SafeWeakMap, + SafeWeakRef, SymbolIterator, } = primordials; -// TODO(aduh95): Add FinalizationRegistry to primordials -const SafeFinalizationRegistry = makeSafe( - globalThis.FinalizationRegistry, - class SafeFinalizationRegistry extends globalThis.FinalizationRegistry {} -); - -// TODO(aduh95): Add WeakRef to primordials -const SafeWeakRef = makeSafe( - globalThis.WeakRef, - class SafeWeakRef extends globalThis.WeakRef {} -); - // This class is modified from the example code in the WeakRefs specification: // https://github.com/tc39/proposal-weakrefs // Licensed under ECMA's MIT-style license, see: