Use WeakMap and FinalizationRegistry when available. #132
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Although
WeakRef
andFinalizationRegistry
are not yet supported by all browsers, I was pleasantly surprised to learn that more than 68% of browsers already have support for these new APIs.Using a
FinalizationRegistry
is appealing for this library, because it allows deleting keys from the internal LRU cache when they become unreachable, which makes sense because an unreachable key can never be looked up in the cache again. Without this functionality, a naive LRU cache will keep keys alive that could otherwise be garbage collected.This PR uses a
FinalizationRegistry
when possible, but also allows the behavior to be configured with theuseWeakKeys
option for thewrap
function, since the additional overhead of the registration and cleanup has a noticeable performance cost (the performance stress test run bynpm test
now takes ~1325ms instead of ~950ms, on my machine).