Flow: Track asynchronous application flow and access flow context variables
![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)
Sneak Peek
This library allows you to create custom asynchronous flow contexts and access its variables in every step of the flow execution.
Let's illustrate Flow functionality on a simple http server:
const Flow = require('liqd-flow');
let requestID = 0;
const server = require('http').createServer( ( req, res ) =>
{
Flow.start( () =>
{
dispatch( req.url ).then( result => res.end( result ));
},
{
start: process.hrtime(),
requestID: ++requestID
});
})
.listen(8080);
async function dispatch( url )
{
Flow.set( 'url', url );
let data = await Model.getData( url );
return
{
data,
elapsed: process.hrtime( Flow.get( 'start' ) ),
requestID: Flow.get( 'requestID' )
};
}
Table of Contents
Installing
npm install --save liqd-flow
Class: Flow
static start( callback[, scope = {}[, freeze = true]] )
Starts a new Flow and sets its scope object.
callback
{Function} Callback executed in a newly created Flowscope
{Object} Scope assigned to the Flow
- defaults to {Object} empty object
{}
freeze
{Boolean} If set to true scope variables are frozen to prevent changes in the Flow
- defaults to {Boolean}
true
Flow.start( () =>
{
let foo = Flow.get('foo');
},
{ foo: 'bar' });
static set( key, value[, freeze = true] )
Sets value for the key in the current Flow if key is not frozen.
key
{Any} Keyvalue
{Any} Valuefreeze
{Boolean} If set to true value for key will be frozen to prevent changes in the Flow
- defaults to {Boolean}
true
Returns {Boolean}
true
value has been set for the key which was not frozenfalse
key was frozen and variable have not been changed
Flow.set('foo', 'bar', false);
Flow.set('foo', 'boo', true);
Flow.set('foo', 'goo');
static get( key[, default_value = undefined] )
Returns value for the key in the current Flow, default_value
if the key is not set.
key
{Any} Keydefault_value
{Any} Value returned if the key is not set
Returns {Any}
let foo = Flow.get('foo');
static getPath( path[, default_value = undefined[, path_delimiter = '.']] )
Returns value for the path in the current Flow, default_value
if the path is not set.
path
{Array of Strings | String} pathdefault_value
{Any} Value returned if the key is not set
path_delimiter
{String} Path delimiter if path is {String}
Returns {Any}
let foo = Flow.getPath('obj.foo');
let bar = Flow.getPath('obj|bar', null, '|');
static scope()
Returns the current scope of the Flow, object containing every key set in the Flow with its value and frozen state.
Returns {Object}
let scope = Flow.scope();
static save()
Returns the current Flow handle for later restoration.
Returns {FlowHandle}
let flow_handle = Flow.save();
static restore( FlowHandle, callback )
Restores the stored Flow and dispatches the callback. Flow can be restored by calling restore method on FlowHandle as well. Each FlowHandle can be restored only once - multiple restorations throws an Exception.
Flow.restore( flow_handle, () =>
{
});
flow_handle.restore( () =>
{
});
static bind( callback )
Binds the current Flow to callback function, callback can be executed outside of current flow yet the original Flow is automaticaly restored.
let callback;
Flow.start( () =>
{
callback = Flow.bind( () =>
{
let foo = Flow.get('foo');
});
},
{ foo: 'bar' });
setTimeout( callback, 1000 );