UNPKG

proxy-tracker

Version:

Nato per separare in modo semplice il controllo degli errori e il logging dalla logica dell'applicazione. Facilita l'uso di Proxy con handler complessi scrivendoli in una forma standardizzata. Permette di inserire funzioni "spia" tramite Proxy

64 lines (57 loc) 1.99 kB
/* global Reflect */ const {types} = require('util'); const symb_remover = Symbol('REMOVER'); const symb_origin = Symbol('ORIGIN'); const symb_marking = Symbol('PROXYTRACKER_MARKING'); function trapRemover(handler, origin_entity){ addGetTrapIfAbsent(handler); const handler_with_remover = Object.assign({}, handler); handler_with_remover.get = function(target, prop, receiver){ if(prop === symb_marking) return true; else if(prop === symb_origin) return origin_entity; else return handler.get(target, prop, receiver); }; return handler_with_remover; } function addGetTrapIfAbsent(handler){ if(handler.get === undefined){ handler.get = function(t,p,r){return Reflect.get(t,p,r);}; } } function ProxyRemover(entity_proxy){ checkProxyRemover(entity_proxy); return entity_proxy[symb_origin]; } function checkProxyRemover(entity_proxy){ if(!types.isProxy(entity_proxy)) throw new Error('the argument must to be a proxy'); if(!isProxyTracker(entity_proxy)) throw new Error('the argument must to be a proxy created by ProxyTracker'); } function isProxyTracker(entity_proxy){ return entity_proxy[symb_marking] === true; } function removerProxyForExtends(handler){ addGetTrapIfAbsent(handler); const handler_with_remover = Object.assign({}, handler); handler_with_remover.get = function(target, prop, receiver){ if(isExtendsCalled(prop)){ let origin_entity; if(isProxyTracker(target)) origin_entity = ProxyRemover(target); else origin_entity = target; return Reflect.get(origin_entity, prop, receiver); } else return handler.get(target, prop, receiver); }; return handler_with_remover; } function isExtendsCalled(prop){ return prop === 'prototype'; } module.exports.symbols = {REMOVER: symb_remover, ORIGIN: symb_origin}; module.exports.trapRemover = trapRemover; module.exports.ProxyRemover = ProxyRemover; module.exports.removerProxyForExtends = removerProxyForExtends;