Security News
New Proposed CISA Mandate Would Require Critical Infrastructure to Report Ransom Payments Within 24 Hours
CISA has proposed a set of new rules that would require critical infrastructure to report cyber incidents and ransom payments.
twostep
Advanced tools
Simple control-flow library for node.js that makes parallel execution, serial execution and error handling painless.
Weekly downloads
Readme
Is a simple control-flow library for node.js that makes serial execution, parallel execution and error handling painless. Inspired by step twostep was based on Tim Caswell (step author) gist, but later it was refactored and almost totally rewritten. Twostep follows and extends the ideas behind the step.
Features
this.pass()
)npm install twostep
All steps (functions) passed to the Step
will be executed in series. Inside
each step this.slot()
for wating of async call, this.pass()
for
passing value to the next step or this.makeGroup()
for creating group (for
having results grouped to array) can be called.
var Step = require('twostep').Step,
fs = require('fs');
Step(
function() {
// pass filename to the next step as second argument (error always first)
this.pass(__filename + '.bak');
// read the file content, it will be passed as third argument (because
// this.pass was called before)
fs.readFile(__filename, 'utf8', this.slot());
},
function(err, bakFile, content) {
// if we have an error, throw it to skip this step
if (err) throw err;
this.pass(bakFile);
fs.readdir(__dirname, this.slot());
fs.writeFile(bakFile, content, this.slot())
// `readdir` and `writeFile` will be exeuted in parallel when both of
// them done next step will be called
},
function(err, bakFile, dirContent) {
if (err) throw err;
console.log('%s successfully written', bakFile);
this.pass(dirContent);
// make the group
var group = this.makeGroup();
// wait for ordered results using group.slot() - all results
// will be passed as an array with same order (as at calls)
dirContent.forEach(function(name) {
fs.stat(name, group.slot());
});
},
function(err, dirContent, stats) {
if (err) throw err;
var fileNames = dirContent.filter(function(name, i) {
return stats[i].isFile();
});
console.log('files in dir: %s', fileNames);
// don't call next step manually, it's the last step if no error
},
function(err) {
// this step will be called only if an error was occured at any step
// above, so here we can handle the error.
console.log('Error occured: ', err.stack || err);
process.exit(1);
}
);
In the example above we did if (err) throw err;
at the start of every step to
pass the error (if it exists) to the next step for handle the error at the last
step. We can avoid writing this annoying line using Steppy
. With Steppy
example described above transforms to
var Steppy = require('twostep').Steppy,
fs = require('fs');
Steppy(
function() {
this.pass(__filename + '.bak');
fs.readFile(__filename, 'utf8', this.slot());
},
function(err, bakFile, content) {
this.pass(bakFile);
fs.readdir(__dirname, this.slot());
fs.writeFile(bakFile, content, this.slot())
},
function(err, bakFile, dirContent) {
console.log('%s successfully written', bakFile);
this.pass(dirContent);
var group = this.makeGroup();
dirContent.forEach(function(name) {
fs.stat(name, group.slot());
});
},
function(err, dirContent, stats) {
var fileNames = dirContent.filter(function(name, i) {
return stats[i].isFile();
});
console.log('files in dir: %s', fileNames);
},
function(err) {
console.log('Error occured: ', err.stack || err);
process.exit(1);
}
);
Steps container accepts functions and executes them in series. If error is
occured inside step it will be passed to the next step as first argument. First
argument of the step is always an error (falsy if no error), subsequent
arguments - values passed to the reserved slots (created via this.pass()
,
this.slot()
or this.makeGroup()
) of previous step in the order the slots
were reserved.
Same steps container as Step
but it also automatically wraps every single step
with error check and calls the last step if error occurs.
Reserves one slot at the current step. Next step will be called when
all reserved slots of current step will be filled with data or the error occurs.
Returns callback function(err, data)
to fill the slot with data.
Passes one or several synchronous values to the next step.
Reserves slot, creates and returns a group, all results of which will be passed
into the reserved slot as a single array. pass
, slot
methods can be called
for created group. If group methods were not called empty array will be passed
into reserved slot.
into cloned repository run
npm install
after installtion run
npm test
for run tests and generate coverage report run
npm run testAndCover
detailed coverage report will be saved at ./coverage/index.html
MIT
FAQs
Simple control-flow library for node.js that makes parallel execution, serial execution and error handling painless.
The npm package twostep receives a total of 9,847 weekly downloads. As such, twostep popularity was classified as popular.
We found that twostep 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
CISA has proposed a set of new rules that would require critical infrastructure to report cyber incidents and ransom payments.
Security News
Redis is no longer OSS, breaking its explicit commitment to remain under the BSD 3-Clause License forever. This has angered contributors who are now working to fork the software.
Product
Socket AI now enables 'AI detected potential malware' alerts by default, ensuring users benefit from AI-powered state-of-the-art malware detection without needing to opt-in.