tc39-weakrefs-shim
Version:
Shim for TC39 Weakrefs proposal
52 lines • 1.85 kB
JavaScript
import globalAvailable from "./global/available.js";
import nodeAvailable from "./node/available.js";
import spidermonkeyAvailable from "./spidermonkey/available.js";
function testKnownImplementationIssues(WeakRef, FinalizationGroup) {
try {
const finalizationGroup = new FinalizationGroup(() => { });
if (finalizationGroup.unregister({}) !== false)
return false;
try {
finalizationGroup.cleanupSome({});
return false;
}
catch (err) { }
}
catch (err) {
return false;
}
return true;
}
export const available = globalAvailable || spidermonkeyAvailable || nodeAvailable;
export async function shim(wrapBrokenImplementation = true) {
let implementation;
if (globalAvailable) {
implementation = await import("./global/index.js");
if (wrapBrokenImplementation &&
!testKnownImplementationIssues(implementation.WeakRef, implementation.FinalizationGroup)) {
implementation = (await import("./wrapper.js")).wrap(implementation.WeakRef, implementation.FinalizationGroup, implementation.gc);
}
}
else if (spidermonkeyAvailable) {
implementation = await import("./spidermonkey/index.js");
}
else if (nodeAvailable) {
implementation = await import("./node/index.js");
}
else {
implementation = { WeakRef: undefined, FinalizationGroup: undefined };
}
return implementation;
}
let asyncImportPromise;
// Easy use of the shim with dynamic import
export function then(onfulfilled, onrejected) {
if (!asyncImportPromise)
asyncImportPromise = shim().then(exports => ({
shim,
available,
...exports,
}));
return asyncImportPromise.then(onfulfilled, onrejected);
}
//# sourceMappingURL=index.js.map