130 lines
3.9 KiB
JavaScript
130 lines
3.9 KiB
JavaScript
"use strict";
|
|
var _a, _b;
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.DropGenerator = exports.DropPromise = exports.Drop = void 0;
|
|
const dropId = Symbol('id');
|
|
class Drop {
|
|
constructor() {
|
|
this.dropId = Drop.idCtr++;
|
|
this.dropRef = { [dropId]: this.dropId };
|
|
const weak = this.weak();
|
|
Drop.weak[this.dropId] = weak;
|
|
Drop.registry.register(this.dropRef, this.dropId, this.dropRef);
|
|
return new Proxy(this, {
|
|
set(target, prop, value) {
|
|
if (prop === 'dropRef' || prop == 'dropId')
|
|
return false;
|
|
target[prop] = value;
|
|
weak[prop] = value;
|
|
return true;
|
|
},
|
|
});
|
|
}
|
|
register() { }
|
|
weak() {
|
|
const weak = Object.assign(Object.create(Object.getPrototypeOf(this)), this);
|
|
if (this.dropRef)
|
|
weak.ref = new WeakRef(this.dropRef);
|
|
return weak;
|
|
}
|
|
drop() {
|
|
if (!this.dropRef || !this.dropId)
|
|
return;
|
|
this.onDrop();
|
|
this.leak();
|
|
}
|
|
leak() {
|
|
if (!this.dropRef || !this.dropId)
|
|
return this;
|
|
Drop.registry.unregister(this.dropRef);
|
|
delete Drop.weak[this.dropId];
|
|
delete this.dropRef;
|
|
delete this.dropId;
|
|
return this;
|
|
}
|
|
}
|
|
exports.Drop = Drop;
|
|
Drop.weak = {};
|
|
Drop.registry = new FinalizationRegistry((id) => {
|
|
const weak = Drop.weak[id];
|
|
if (weak)
|
|
weak.drop();
|
|
});
|
|
Drop.idCtr = 0;
|
|
class DropPromise {
|
|
constructor(promise, dropFnOrRef) {
|
|
this.promise = promise;
|
|
this[_a] = 'DropPromise';
|
|
if (dropFnOrRef && dropId in dropFnOrRef) {
|
|
this.dropId = dropFnOrRef[dropId];
|
|
this.dropRef = dropFnOrRef;
|
|
return;
|
|
}
|
|
this.dropId = DropPromise.idCtr++;
|
|
this.dropRef = { [dropId]: this.dropId };
|
|
if (dropFnOrRef)
|
|
DropPromise.dropFns[this.dropId] = dropFnOrRef;
|
|
DropPromise.registry.register(this.dropRef, this.dropId, this.dropRef);
|
|
}
|
|
static of(promise, dropFn) {
|
|
return new DropPromise(promise, dropFn);
|
|
}
|
|
static ref(promise, dropRef) {
|
|
return new DropPromise(promise, dropRef);
|
|
}
|
|
then(onfulfilled, onrejected) {
|
|
return DropPromise.ref(this.promise.then(onfulfilled, onrejected), this.dropRef);
|
|
}
|
|
catch(onrejected) {
|
|
return DropPromise.ref(this.promise.catch(onrejected), this.dropRef);
|
|
}
|
|
finally(onfinally) {
|
|
return DropPromise.ref(this.promise.finally(onfinally), this.dropRef);
|
|
}
|
|
}
|
|
exports.DropPromise = DropPromise;
|
|
_a = Symbol.toStringTag;
|
|
DropPromise.dropFns = {};
|
|
DropPromise.registry = new FinalizationRegistry((id) => {
|
|
const drop = DropPromise.dropFns[id];
|
|
if (drop) {
|
|
drop();
|
|
delete DropPromise.dropFns[id];
|
|
}
|
|
});
|
|
DropPromise.idCtr = 0;
|
|
class DropGenerator {
|
|
constructor(generator, dropFn) {
|
|
this.generator = generator;
|
|
this[_b] = () => this;
|
|
this.dropId = DropGenerator.idCtr++;
|
|
this.dropRef = { [dropId]: this.dropId };
|
|
if (dropFn)
|
|
DropGenerator.dropFns[this.dropId] = dropFn;
|
|
DropGenerator.registry.register(this.dropRef, this.dropId, this.dropRef);
|
|
}
|
|
static of(generator, dropFn) {
|
|
return new DropGenerator(generator, dropFn);
|
|
}
|
|
next(...args) {
|
|
return DropPromise.ref(this.generator.next(...args), this.dropRef);
|
|
}
|
|
return(value) {
|
|
return DropPromise.ref(this.generator.return(value), this.dropRef);
|
|
}
|
|
throw(e) {
|
|
return DropPromise.ref(this.generator.throw(e), this.dropRef);
|
|
}
|
|
}
|
|
exports.DropGenerator = DropGenerator;
|
|
_b = Symbol.asyncIterator;
|
|
DropGenerator.dropFns = {};
|
|
DropGenerator.registry = new FinalizationRegistry((id) => {
|
|
const drop = DropGenerator.dropFns[id];
|
|
if (drop) {
|
|
drop();
|
|
delete DropGenerator.dropFns[id];
|
|
}
|
|
});
|
|
DropGenerator.idCtr = 0;
|
|
//# sourceMappingURL=Drop.js.map
|