surrogate
Version:
Object method hooks made easy
76 lines • 2.91 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SurrogateProxy = void 0;
const rules_1 = require("../rules");
const next_1 = require("../../next");
const manager_1 = require("../../manager");
const helpers_1 = require("../../helpers");
const context_1 = require("../../context");
class SurrogateProxy {
constructor(target, _a = {}) {
var { useSingleton = true } = _a, globalOptions = __rest(_a, ["useSingleton"]);
this.targets = new WeakMap();
return this.useInstance(useSingleton).setTarget(target, globalOptions);
}
get(target, event, receiver) {
return rules_1.FetchRuleRunner.fetchRule(this, target, event, receiver).returnableValue();
}
getEventManager(target) {
return this.targets.get(target);
}
static wrap(object, options) {
return this.hasTarget(object)
? object
: new Proxy(object, new SurrogateProxy(object, options));
}
static hasTarget(target) {
const methods = [rules_1.InternalMethods.Dispose, rules_1.InternalMethods.EventManager];
return methods.every((key) => (0, helpers_1.isFunction)(target[key]));
}
bindHandler(event, target, receiver) {
const func = Reflect.get(target, event, receiver);
return {
[event]: (...args) => this.surrogateHandler(new context_1.Context(target, receiver, event, func, args)),
}[event];
}
surrogateHandler(context) {
const { target, event } = context;
const typeContainers = this.getEventManager(target).getEventHandlers(event);
return next_1.ExecutionContext.for(context, typeContainers)
.setupPipeline(this, typeContainers)
.start();
}
dispose(target) {
this.getEventManager(target).deregisterHooks();
this.targets.delete(target);
return target;
}
setTarget(target, globalOptions) {
if (!this.targets.has(target)) {
this.targets.set(target, new manager_1.EventManager(globalOptions));
}
return this;
}
useInstance(useSingleton) {
if (useSingleton) {
if (SurrogateProxy.instance) {
return SurrogateProxy.instance;
}
SurrogateProxy.instance = this;
}
return this;
}
}
exports.SurrogateProxy = SurrogateProxy;
//# sourceMappingURL=index.js.map