UNPKG

surrogate

Version:

Object method hooks made easy

76 lines 2.91 kB
"use strict"; 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