Security News
RubyGems.org Adds New Maintainer Role
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Ginga is a utility module that enables a middleware based (express inspired), modular architecture for creating asynchronous JavaScript methods.
$ npm install ginga
####ginga([object])
Initialise ginga
var ginga = require('ginga');
var obj = ginga(); //as a new object
var app = {};
ginga(app); //as a mixin
function App(){ }
ginga(App.prototype); //as a prototype mixin:
###Method and Hook
define()
and use()
a method with pre
, hook
, invoke
middleware functions.
pre
middleware functions initiate and batch operations where invoke
commits the result.
In addition several hook
can be mounted for additional validations or amendments.
####app.define(name, [pre...], invoke) ####app.use(name, [hook...])
var ginga = require('ginga');
var app = ginga();
//defining method
app.define('test', function(ctx, next){
ctx.logs = ['pre'];
next();
}, function(ctx, done){
ctx.logs.push('invoke');
done(null, ctx.logs);
});
//hook
app.use('test', function(ctx, next){
ctx.logs.push('hook');
next();
});
//call method
app.test(function(err, res){
console.log(res); //['pre', 'hook', 'invoke']
});
###Middleware
Middleware turns asynchronous function into encapsulated, reusable set of building blocks.
Upon calling a method, Ginga goes through a sequence of functions middleware
. A middleware consists of arguments:
ctx
- context object, shared across middleware functionsnext
- callback function, invoke with next()
or next(err, result)
end
- event emitter on callback, invoke with end(function(err, res){ ... })
The context object ctx
maintains state throughout the method call, while encapsulated from this
object.
A middleware can make changes to context object, or access changes made by previous middleware functions.
Current middleware must call next()
to pass control to the next middleware, or next(err, result)
to end the sequence and callback with error and result.
Otherwise the method will be left hanging.
####ginga.params([param...])
Ginga built in ginga.params
middleware for parsing method arguments. Supports optional parameters and type-checking.
param
is a string in form
name[:type][?]
name
- name of the argument mapping intotype
type checking (optional): string
, boolean
, function
, number
, date
, regexp
, object
, array
, case insensitive.?
- optional parameter.var ginga = require('ginga');
var params = ginga.params;
var app = ginga();
//define method with params parsing
app.define('test', params('a:string','b:number?','c:string?'), function(ctx, done){
done(null, ctx.params);
});
//call method
app.test('s',1,function(err, res){
console.log(res); //{"a":"s", "b":1}
});
app.test('s','t',function(err, res){
console.log(res); //{"a":"s", "c":"t"}
});
app.test(function(err, res){
console.log(err); //Error: Too few arguments. Expected at least 1
});
###Plugin
####app.use(plugin)
app.use
also accepts Ginga object as plugin. This will mount hooks into the main app.
var ginga = require('ginga');
//define app
var app = ginga();
app.define('test', function(ctx, next){
ctx.logs = ['pre'];
next();
}, function(ctx, done){
ctx.logs.push('invoke');
done(null, ctx.logs);
});
//define plugin
var plugin = ginga();
plugin.use('test', function(ctx, next){
ctx.logs.push('plugin');
next();
});
//use plugin
app.use(plugin);
//call methods
app.test(function(err, res){
console.log(res); //['pre','plugin', 'invoke']
});
###Inheritance By initialising Ginga with prototype mixin, hooks are also inherited in prototype chain:
var ginga = require('ginga');
function App(){}
var A = ginga(App.prototype); //ginga prototype mixin
A.define('test', function(ctx, next){
ctx.logs = ['pre'];
next();
}, function(ctx, done){
ctx.logs.push('invoke');
done(null, ctx.logs);
});
var a1 = new App();
var a2 = new App();
//prototype hook
A.use('test', function(ctx, next){
ctx.logs.push('A hook');
next();
});
//instance hook
a1.use('test', function(ctx, next){
ctx.logs.push('a1 hook');
next();
});
a2.use('test', function(ctx, next){
ctx.logs.push('a2 hook');
next();
});
//call methods
a1.test(function(err, res){
console.log(res); //['pre','A hook','a1 hook', 'invoke']
});
a2.test(function(err, res){
console.log(res); //['pre','A hook','a2 hook', 'invoke']
});
MIT
FAQs
Middleware framework for async functions using callback, promise or generator
The npm package ginga receives a total of 5 weekly downloads. As such, ginga popularity was classified as not popular.
We found that ginga demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.
Security News
Research
Socket's threat research team has detected five malicious npm packages targeting Roblox developers, deploying malware to steal credentials and personal data.