scarlet
Version:
The simple fast javascript interceptor for methods and properties.
365 lines (300 loc) • 9.48 kB
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: /usr/local/src/nodejs/scarlet/lib/scarlet.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: /usr/local/src/nodejs/scarlet/lib/scarlet.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>var g = require("../include");
/**
For creating a new instance of Scarlet
@namespace scarlet.lib
@method ctor
@param {array|string} pluginArr
@return scarlet.lib.Scarlet
@example
var Scarlet = require("scarlet");
var scarlet = new Scarlet();
// A function that does addition
function add(arg1, arg2){
return arg1 + arg2;
}
// Log arguments and result of add
add = scarlet
.intercept(add, scarlet.FUNCTION)
.using(function(info, method, args){
console.log("Adding '" + args[0] + "'' and '" + args[1] + "'");
var result = method.call(this, info, method, args);
console.log("Result is '" + result + "'");
return result;
}).proxy();
add(1,2); // Output -> Adding '1' and '2'\n Result is '3'
add(3,5); // Output -> Adding '3' and '5'\n Result is '8'
*/
function Scarlet(pluginArr) {
"use strict";
var ProxyType = require("./proxies/proxy-type");
var Interceptor = require("./interceptors/interceptor");
var PluginManager = require("./plugins/plugin-manager");
var interceptor = null;
var pluginManager = new PluginManager();
var self = this;
self.plugins = {};
self.type = new ProxyType().asUndefined();
self.__typename__ = "scarlet.lib.Scarlet";
self.UNDEFINED = self.type.asUndefined();
/**
Constant used to coerce proxy for type only
@property INSTANCE
@type scarlet.lib.proxies.ProxyType
@example
var Scarlet = require("scarlet");
var scarlet = new Scarlet();
// Type for that we would like to intercept
function MyClass(){
var self = this;
self.myMethod = function(arg1, arg2){
return arg1 + arg2;
};
}
// First instantiate the type
var instance = new MyClass();
// Scarlet will only intercept the instance
instance = scarlet
.intercept(instance, scarlet.INSTANCE)
.using(function(info, method, args){
return method.call(this, info, method, args);
}).proxy();
// Invoke
var result = instance.myMethod(1,2);
*/
self.INSTANCE = self.type.asInstance();
/**
Constant used to coerce proxy for a normal function
@property FUNCTION
@type scarlet.lib.proxies.ProxyType
@example
var Scarlet = require("scarlet");
var scarlet = new Scarlet();
// Function that we would like to intercept
function any(arg1, arg2) {
return arg1 + arg2;
}
// Create a proxy of the function using scarlet
var anyProxy = scarlet
.intercept(any, scarlet.FUNCTION)
.using(function(info, method, args){
// ...
}).proxy();
anyProxy(1,2) // -> will invoke interceptor
any(1,2) // -> wont invoke interceptor
*/
self.FUNCTION = self.type.asFunction();
/**
Constant used to coerce proxy for prototype functions, includes constructor interception
@property PROTOTYPE
@type scarlet.lib.proxies.ProxyType
@example
var Scarlet = require("scarlet");
var scarlet = new Scarlet();
// Function or prototypical object that we would like to intercept
function MyClass(){
var self = this;
self.anyProperty = 5;
self.anyMethod = function(){
};
}
MyClass.prototype.anyOtherMethod = function(){
};
// Intercept type
MyClass = scarlet
.intercept(MyClass)
.using(function(info, method, args){
return method.call(this, info, method, args);
}).proxy();
var instance = new MyClass(); // -> Calls interceptor for constructor
instance.anyMethod(); // -> Calls interceptor again for method
instance.anyOtherMethod(); -> Calls interceptor again for prototype function
instance.anyProperty = 6; // -> Calls interceptor for the property setter
var result = instance.anyProperty; // -> Calls the interceptor again for property getter
*/
self.PROTOTYPE = self.type.asPrototype();
/**
Method for proxying types, functions and instances
@method intercept
@param {object} typeOrInstance
@param {scarlet.lib.proxies.ProxyType} proxyType
@return {scarlet.lib.Scarlet}
@chainable
@example
var Scarlet = require("scarlet");
var scarlet = new Scarlet();
// Type for that we would like to intercept
function MyClass(){
var self = this;
self.myMethod = function(arg1, arg2){
return arg1 + arg2;
};
}
// First instantiate the type
var instance = new MyClass();
// Scarlet will only intercept the instance
instance = scarlet
.intercept(instance, scarlet.INSTANCE)
.using(function(info, method, args){
return method.call(this, info, method, args);
}).proxy();
// Invoke
var result = instance.myMethod(1,2);
*/
self.intercept = function(typeOrInstance, proxyType) {
g.assert(typeOrInstance, "Please make sure you supply a typeOrInstance parameter. eg. scarlet.intercept(MyFunc, scarlet.type.asInstance());");
g.assert(proxyType, "Please make sure you supply a type. eg. scarlet.intercept(MyFunc, scarlet.type.asInstance());")
g.ext.logger.info(Scarlet, "intercept", "For Type Or Instance", [typeOrInstance]);
interceptor = new Interceptor()
interceptor.observable = typeOrInstance;
interceptor.intercept(typeOrInstance, function(observable) {
interceptor.observable = observable;
}, proxyType);
return self;
};
/**
Method for chaining interceptors onto a proxied type or function
@method using
@param {Function} callback
@return {scarlet.lib.Scarlet}
@chainable
@example
var Scarlet = require("scarlet");
var scarlet = new Scarlet();
// Type for that we would like to intercept
function MyClass(){
var self = this;
self.myMethod = function(arg1, arg2){
return arg1 + arg2;
};
}
// First instantiate the type
var instance = new MyClass();
// Scarlet will only intercept the instance
instance = scarlet
.intercept(instance, scarlet.INSTANCE)
.using(function(info, method, args){ // Interceptor 1
return method.call(this, info, method, args);
})
.using(function(info, method, args){ // Interceptor 2
return method.call(this, info, method, args);
})
.using(function(info, method, args){ // Interceptor 3
return method.call(this, info, method, args);
}).proxy();
// Invoke
var result = instance.myMethod(1,2);
*/
self.using = function(callback) {
g.assert(callback);
g.assert(interceptor);
g.ext.logger.info(Scarlet, "using", "Using Interceptor", [callback]);
interceptor.using(function(info, method, args){
var thisContext = this;
self.emit("before", {
info: info,
args: args,
result: null,
method: method,
self: thisContext
});
var result = null;
try {
result = callback.call(this, info, method, args);
self.emit("after", {
info: info,
args: args,
result: result,
method: method,
self: thisContext
});
} catch(err){
self.emit("error", {
info: info,
args: args,
result: result,
method: method,
self: thisContext,
error: err
});
}
self.emit("done", {
info: info,
args: args,
result: result,
method: method,
self: thisContext
});
return result;
});
return self;
};
/**
Method for retrieving a reference to a proxy type, this is for types that need to be instantiated using 'new'
@method proxy
@return {Object}
*/
self.proxy = function() {
g.assert(interceptor);
g.assert(interceptor.observable);
g.ext.logger.info(Scarlet, "proxy", "As Proxied Type Or Instance", [interceptor.observable]);
return interceptor.observable;
};
/**
Method for loading a plugin into scarlet
@param {String} pluginPath
@method load
@return {scarlet.lib.Scarlet}
*/
self.load = function(pluginPath) {
g.assert(pluginPath);
pluginManager.load(self, pluginPath);
return self;
};
var initializePlugins = function() {
if (typeof(pluginArr) === 'string')
pluginArr = [pluginArr];
if (pluginArr) {
if (pluginArr.length) {
pluginArr.forEach(function(plugin) {
self.loadPlugin(plugin);
});
}
}
};
initializePlugins();
g.events.EventEmitter.call(self);
}
g.util.inherits(Scarlet, g.events.EventEmitter);
module.exports = Scarlet;</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Index</a></h2><h3>Global</h3><ul><li><a href="global.html#ctor">ctor</a></li><li><a href="global.html#intercept">intercept</a></li><li><a href="global.html#load">load</a></li><li><a href="global.html#proxy">proxy</a></li><li><a href="global.html#using">using</a></li></ul>
</nav>
<br clear="both">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.0-alpha3</a> on Sun Dec 29 2013 23:57:02 GMT+0000 (GMT)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>