database-jones/Adapter/api/ProxyFactory.js (65 lines of code) (raw):

/* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /** This file is copied from http://wiki.ecmascript.org/doku.php?id=harmony:proxies. * The page is based on Harmony proxies that are considered obsolete. Once proxies * are standardized in ECMAScript 6, this file will need to be rewritten. */ /*global Proxy, assert, path, api_doc_dir, unified_debug */ "use strict"; var udebug = unified_debug.getLogger("ProxyFactory.js"); function handlerMaker (obj) { return { getOwnPropertyDescriptor: function(name) { var desc = Object.getOwnPropertyDescriptor(obj, name); // a trapping proxy's properties must always be configurable if (desc !== undefined) { desc.configurable = true; } udebug.log('ProxyFactory.getOwnPropertyDescriptor for', name, 'is', desc); return desc; }, getPropertyDescriptor: function(name) { var desc = Object.getPropertyDescriptor(obj, name); // not in ES5 // a trapping proxy's properties must always be configurable if (desc !== undefined) { desc.configurable = true; } udebug.log('ProxyFactory.getPropertyDescriptor for', name, 'is', desc); return desc; }, getOwnPropertyNames: function() { return Object.getOwnPropertyNames(obj); }, getPropertyNames: function() { return Object.getPropertyNames(obj); // not in ES5 }, defineProperty: function(name, desc) { Object.defineProperty(obj, name, desc); }, "delete": function(name) { return delete obj[name]; }, fix: function() { if (Object.isFrozen(obj)) { var result = {}; Object.getOwnPropertyNames(obj).forEach(function(name) { result[name] = Object.getOwnPropertyDescriptor(obj, name); }); return result; } // As long as obj is not frozen, the proxy won't allow itself to be fixed return undefined; // will cause a TypeError to be thrown }, /* ignore jslint error; 'in' really is what we want */ has: function(name) { return name in obj; }, hasOwn: function(name) { return ({}).hasOwnProperty.call(obj, name); }, get: function(receiver, name) { if (!obj.hasOwnProperty(name)) { udebug.log('ProxyFactory.handlerMaker.get fail to get ', name, new Error().stack); obj.failGet(name); } return obj[name]; }, set: function(receiver, name, val) { obj[name] = val; return true; }, // bad behavior when set fails in non-strict mode /* ignore jslint error; 'in' really is what we want */ enumerate: function() { var result = [], name; for (name in obj) { result.push(name); } return result; }, keys: function() { return Object.keys(obj); } }; } /* usage: var proxyFactory = require("ProxyFactory.js"); var proxy = proxyFactory.createProxy(obj); */ function createProxy(obj) { var handler; handler = handlerMaker(obj); try { return Proxy.create(handler); } catch (e) { console.log('ProxyFactory.createProxy Proxy.createProxy threw', e.message); throw new Error('Proxy is not defined. Please start node with --harmony option.'); } } module.exports = createProxy;