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
69 lines (60 loc) • 2.35 kB
JavaScript
/* global process */
const assert = require('assert').strict;
const generaHandlerForProxy = require('./handler-proxy-generator.js');
const generaHandlerForProxyTrack = require('./handlertrack-proxy-generator.js');
function ProxyExtension(target, ...handlers){
checkProxyExtension(target, handlers);
const handler_tipo_tracker = generaHandlerForProxyTrack(...handlers);
const handle_with_ret_property = copyHandler(handler_tipo_tracker);
handlerWithLastCallbackSeparedInNewParameter(handle_with_ret_property);
const handler = generaHandlerForProxy(handle_with_ret_property, generaHandlerForProxyTrack.CONST, target, modifiesHandler);
return new Proxy(target, handler);
}
function checkProxyExtension(target, handlers){
assert(Array.isArray(handlers), 'callbacks_for_tracker non è un array');
}
function copyHandler(handler){
return Object.assign({}, handler);
}
function modifiesHandler(handler, entity){
const {trapRemover, removerProxyForExtends} = require('./proxy-remover.js');
let handler_with_trap_remover = trapRemover(handler, entity);
handler_with_trap_remover = removerProxyForExtends(handler_with_trap_remover);
return handler_with_trap_remover;
}
function handlerWithLastCallbackSeparedInNewParameter(track_handler){
if(typeof track_handler !== 'object') return track_handler;
else{
for(let trap in track_handler){
let handler = track_handler[trap];
createRetProperty(handler);
let last_callback = extractLastCallback(handler);
insertCallbackInRetProperty(handler, last_callback);
if(isThereSubHandler(handler)){
let sub_handler = returnSubHandler(handler);
handlerWithLastCallbackSeparedInNewParameter(sub_handler);
}
}
}
}
function createRetProperty(handler){
handler.ret = undefined;
}
function extractLastCallback(handler){
assert(Array.isArray(handler.cbs));
let last_cb = handler.cbs.pop();
if(handler.cbs === undefined) handler.cbs = [];
return last_cb;
}
function insertCallbackInRetProperty(handler, callback){
handler.ret = callback;
}
function isThereSubHandler(handler){
return typeof handler.hds === 'object';
}
function returnSubHandler(handler){
return handler.hds;
}
module.exports = ProxyExtension;
if(process.env.NODE_ENV === 'dev')
module.exports.test = {handlerWithLastCallbackSeparedInNewParameter};