tc39-weakrefs-shim
Version:
Shim for TC39 Weakrefs proposal
44 lines • 2.05 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// @ts-ignore
const weak_tag_js_1 = __importDefault(require("@mhofman/weak-napi-native/weak-tag.js"));
// @ts-ignore
const object_info_js_1 = __importDefault(require("@mhofman/weak-napi-native/object-info.js"));
const WeakRef_js_1 = require("../internal/WeakRef.js");
const FinalizationGroup_js_1 = require("../internal/FinalizationGroup.js");
const WeakRefJobs_js_1 = require("../internal/WeakRefJobs.js");
const FinalizationGroupJobs_js_1 = require("../internal/FinalizationGroupJobs.js");
const setImmediate_js_1 = require("../utils/tasks/setImmediate.js");
var gc_js_1 = require("./gc.js");
exports.gc = gc_js_1.gc;
const tagCollector = new WeakMap();
const observedInfos = new Set();
function finalizedCallback() {
if (!observedInfos.has(this))
return;
observedInfos.delete(this);
finalizationGroupJobs.setFinalized(this);
}
function getInfo(target) {
let objectDetails = tagCollector.get(target);
if (!objectDetails) {
const info = new object_info_js_1.default(target, finalizedCallback);
objectDetails = { info, tag: new weak_tag_js_1.default(info) };
tagCollector.set(target, objectDetails);
}
return objectDetails.info;
}
const finalizationGroupJobs = FinalizationGroupJobs_js_1.createFinalizationGroupJobsForTaskQueue(setImmediate_js_1.setImmediate, {
registerObjectInfo: info => {
observedInfos.add(info);
},
unregisterObjectInfo: info => {
observedInfos.delete(info);
},
});
exports.WeakRef = WeakRef_js_1.createWeakRefClassShim(WeakRefJobs_js_1.createWeakRefJobsForTaskQueue(setImmediate_js_1.setImmediate), getInfo, info => info.target)[0];
exports.FinalizationGroup = FinalizationGroup_js_1.createFinalizationGroupClassShim(finalizationGroupJobs, getInfo, info => observedInfos.has(info));
//# sourceMappingURL=index.js.map