{"_id":"parley","_rev":"385824","name":"parley","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","dist-tags":{"edge":"4.0.0-0","latest":"4.0.0"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"time":{"modified":"2021-08-04T03:17:50.000Z","created":"2012-12-24T05:18:02.930Z","4.0.0":"2021-06-07T16:33:16.721Z","4.0.0-1":"2019-08-28T16:01:13.695Z","4.0.0-0":"2019-08-10T01:46:44.457Z","3.8.3":"2019-04-24T21:14:55.524Z","3.8.2":"2019-04-15T23:04:04.198Z","3.8.1":"2019-04-15T20:49:54.949Z","3.8.0":"2018-05-25T21:54:40.760Z","3.7.0":"2018-05-24T16:53:28.042Z","3.6.1":"2018-05-24T03:46:30.966Z","3.6.0":"2018-05-24T03:20:01.740Z","3.5.2":"2018-05-23T04:46:02.243Z","3.5.1":"2018-05-23T04:25:49.423Z","3.5.0":"2018-05-23T03:57:49.188Z","3.5.0-0":"2018-05-23T03:44:41.051Z","3.4.4":"2018-05-23T00:59:04.624Z","3.4.3":"2018-05-22T21:17:57.559Z","3.4.2":"2018-04-01T18:19:18.254Z","3.4.1":"2018-03-25T19:10:42.530Z","3.4.0":"2018-03-23T00:23:40.806Z","3.3.4":"2017-12-09T03:51:49.336Z","3.3.3":"2017-12-05T04:07:24.398Z","3.3.3-0":"2017-12-05T03:53:52.348Z","3.3.2":"2017-11-15T02:42:26.629Z","3.3.1":"2017-10-24T04:58:57.321Z","3.3.0":"2017-10-24T03:55:58.427Z","3.2.3":"2017-10-20T01:55:03.536Z","3.2.2":"2017-10-20T01:49:39.075Z","3.2.1":"2017-10-20T01:41:11.591Z","3.2.0":"2017-10-19T05:47:40.374Z","3.1.0":"2017-10-17T21:46:33.637Z","3.0.0":"2017-10-05T04:51:22.394Z","3.0.0-0":"2017-09-20T03:19:29.737Z","2.4.0-3":"2017-08-10T07:25:04.924Z","2.4.0-2":"2017-07-09T16:09:54.843Z","2.4.0-1":"2017-05-07T22:58:46.604Z","2.4.0-0":"2017-05-07T16:43:26.477Z","2.3.1":"2017-05-04T02:02:57.782Z","2.3.0":"2017-03-31T20:40:25.606Z","2.2.0":"2017-02-10T04:04:31.200Z","2.1.1":"2017-02-03T04:47:14.616Z","2.1.0":"2017-01-16T04:14:46.301Z","2.0.0":"2016-12-23T22:13:04.251Z","1.0.2":"2016-12-21T04:26:31.471Z","1.0.1":"2016-12-21T00:35:43.757Z","1.0.0":"2016-12-20T18:39:27.665Z","1.0.0-2":"2016-12-20T18:39:05.151Z","1.0.0-1":"2016-12-20T18:04:29.230Z","1.0.0-0":"2016-12-20T17:45:38.848Z","0.0.2":"2012-12-24T05:18:02.930Z"},"users":{"alimaster":true},"author":{"name":"Mike McNeil"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"versions":{"4.0.0":{"name":"parley","version":"4.0.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.19.1","mocha":"6.1.3"},"engines":{"node":">=8"},"gitHead":"8d2807e70b67c4ad93e4563be86eab7babb0314a","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@4.0.0","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"shasum":"c68a7256d073df4132196eccdcdc28c0bbe29122","size":52561,"noattachment":false,"key":"/parley/-/parley-4.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-4.0.0.tgz"},"_npmUser":{"name":"eashaw","email":"eashaw@sailsjs.com"},"directories":{},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_4.0.0_1623083596560_0.6639783983311147"},"_hasShrinkwrap":false,"publish_time":1623083596721,"_cnpm_publish_time":1623083596721},"4.0.0-1":{"name":"parley","version":"4.0.0-1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.19.1","mocha":"6.1.3"},"engines":{"node":">=8"},"gitHead":"1ce54d2c6515c599eb3ce987401ecf4f7c3d26ca","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@4.0.0-1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"shasum":"f075bb514f76fc0e39cf949e2dcf843253fa8188","size":51506,"noattachment":false,"key":"/parley/-/parley-4.0.0-1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-4.0.0-1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmUser":{"name":"rachaelshaw","email":"rachaelshaw@treeline.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_4.0.0-1_1567008073561_0.579351777532298"},"_hasShrinkwrap":false,"publish_time":1567008073695,"_cnpm_publish_time":1567008073695},"4.0.0-0":{"name":"parley","version":"4.0.0-0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.19.1","mocha":"6.1.3"},"engines":{"node":">=8"},"gitHead":"1d92d112d63794a3843ce9165ebbdcb1a38bce6a","readmeFilename":"README.md","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@4.0.0-0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"shasum":"2070d889d27b8360d02f99e9d933b824fbf9e013","size":51506,"noattachment":false,"key":"/parley/-/parley-4.0.0-0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-4.0.0-0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_4.0.0-0_1565401604259_0.9461127326632821"},"_hasShrinkwrap":false,"publish_time":1565401604457,"_cnpm_publish_time":1565401604457},"3.8.3":{"name":"parley","version":"3.8.3","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.19.1","mocha":"6.1.3"},"gitHead":"5268ddc0895864eb487aedab02312b6d0c78de8a","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.8.3","_npmVersion":"6.5.0","_nodeVersion":"8.11.3","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"a7f95ea4b4943d8198101e78629024b878f9b00d","size":51340,"noattachment":false,"key":"/parley/-/parley-3.8.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.8.3.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.8.3_1556140495339_0.29271694634726186"},"_hasShrinkwrap":false,"publish_time":1556140495524,"_cnpm_publish_time":1556140495524},"3.8.2":{"name":"parley","version":"3.8.2","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.19.1","mocha":"6.1.3"},"gitHead":"5a52095c3d922984348df444ff35656addf04d4a","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.8.2","_nodeVersion":"8.9.4","_npmVersion":"6.9.0","dist":{"shasum":"f27188d9919b3d012b3e578af57f13c26bc91948","size":51322,"noattachment":false,"key":"/parley/-/parley-3.8.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.8.2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmUser":{"name":"rachaelshaw","email":"rachaelshaw@treeline.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.8.2_1555369444091_0.5270096809408502"},"_hasShrinkwrap":false,"publish_time":1555369444198,"_cnpm_publish_time":1555369444198},"3.8.1":{"name":"parley","version":"3.8.1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.19.1","mocha":"6.1.3"},"gitHead":"f903d431a7701223bb95c355246f6b6bd1f210bf","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.8.1","_nodeVersion":"8.9.4","_npmVersion":"6.9.0","dist":{"shasum":"1f22672527361893c78db59ca770a4ccc4d115b6","size":51319,"noattachment":false,"key":"/parley/-/parley-3.8.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.8.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmUser":{"name":"rachaelshaw","email":"rachaelshaw@treeline.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.8.1_1555361394833_0.3306286771015261"},"_hasShrinkwrap":false,"publish_time":1555361394949,"_cnpm_publish_time":1555361394949},"3.8.0":{"name":"parley","version":"3.8.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"bf09a3abee35446217e799d057505a2eaf593172","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.8.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"432842d7497ad0a496d34e45d74c5376e7c147e3","size":51017,"noattachment":false,"key":"/parley/-/parley-3.8.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.8.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.8.0_1527285280646_0.7605919849004525"},"_hasShrinkwrap":false,"publish_time":1527285280760,"_cnpm_publish_time":1527285280760},"3.7.0":{"name":"parley","version":"3.7.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"6fa3762df734671f830af9e976f184e36f1793da","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.7.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"4ee09ce6a66ee00336aa08b3d03c7fd8a45a690c","size":50903,"noattachment":false,"key":"/parley/-/parley-3.7.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.7.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.7.0_1527180807691_0.12082541319422768"},"_hasShrinkwrap":false,"publish_time":1527180808042,"_cnpm_publish_time":1527180808042},"3.6.1":{"name":"parley","version":"3.6.1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"2f3fb285ae27c38d5bfd27f05e23eabdcf2b1144","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.6.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"118a7b7fd45f626d40f0495521367f39991fbd92","size":50780,"noattachment":false,"key":"/parley/-/parley-3.6.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.6.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.6.1_1527133590892_0.41916697371377065"},"_hasShrinkwrap":false,"publish_time":1527133590966,"_cnpm_publish_time":1527133590966},"3.6.0":{"name":"parley","version":"3.6.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"b915cfb6f4b02a292b57502576a5c8be9bdfb7df","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.6.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"59811c71389f81e56f4197dd957330d131d2b13d","size":50777,"noattachment":false,"key":"/parley/-/parley-3.6.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.6.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.6.0_1527132001587_0.3139911767841399"},"_hasShrinkwrap":false,"publish_time":1527132001740,"_cnpm_publish_time":1527132001740},"3.5.2":{"name":"parley","version":"3.5.2","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"0f39a78bbd5081fedc6741edd31dd0c894dd423f","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.5.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"56fd86b2cf8f66892ab3159173310a08523d6d5f","size":50524,"noattachment":false,"key":"/parley/-/parley-3.5.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.5.2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.5.2_1527050762187_0.5534915364610824"},"_hasShrinkwrap":false,"publish_time":1527050762243,"_cnpm_publish_time":1527050762243},"3.5.1":{"name":"parley","version":"3.5.1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"9e0fdd1ee0872e02173c89382f36ad32b060d1e7","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.5.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"4780304521eb54190ffc66adbc2f38baa543a496","size":50552,"noattachment":false,"key":"/parley/-/parley-3.5.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.5.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.5.1_1527049549312_0.3718527806182865"},"_hasShrinkwrap":false,"publish_time":1527049549423,"_cnpm_publish_time":1527049549423},"3.5.0":{"name":"parley","version":"3.5.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"925ac6670a4571d4fbfe945e1fdde2e0d3917149","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.5.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"fc224ba52d70e52102b9a15a3b3d2b140036e878","size":50776,"noattachment":false,"key":"/parley/-/parley-3.5.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.5.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.5.0_1527047868990_0.1811917712393969"},"_hasShrinkwrap":false,"publish_time":1527047869188,"_cnpm_publish_time":1527047869188},"3.5.0-0":{"name":"parley","version":"3.5.0-0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"readmeFilename":"README.md","gitHead":"b4fdfc0c50b5f8feeaa77a3097786ab7e4129e9a","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.5.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"3f20abff0d1cc482c265ccd60241015e7082e09b","size":50728,"noattachment":false,"key":"/parley/-/parley-3.5.0-0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.5.0-0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.5.0-0_1527047080964_0.5465114519845782"},"_hasShrinkwrap":false,"publish_time":1527047081051,"_cnpm_publish_time":1527047081051},"3.4.4":{"name":"parley","version":"3.4.4","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"24c3269da4262b29b6ebe30ae7380836ca1ff7d6","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.4.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"89ce6640d92e726428c7eca63a924867ca37acc8","size":51198,"noattachment":false,"key":"/parley/-/parley-3.4.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.4.4.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.4.4_1527037144563_0.8487695693064137"},"_hasShrinkwrap":false,"publish_time":1527037144624,"_cnpm_publish_time":1527037144624},"3.4.3":{"name":"parley","version":"3.4.3","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"6423b3a7677ecd17773cfb522571dc9d4c1184ff","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.4.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"5cb0033df7a50477bd2e4ebfde05404e5412f1b5","size":51074,"noattachment":false,"key":"/parley/-/parley-3.4.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.4.3.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.4.3_1527023877030_0.9590208303806205"},"_hasShrinkwrap":false,"publish_time":1527023877559,"_cnpm_publish_time":1527023877559},"3.4.2":{"name":"parley","version":"3.4.2","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"61fabbaa81257e9c38a782a11a2c41635d4af5df","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.4.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"fcec89f336b311898fa713e811d91bb98f3c18da","size":50510,"noattachment":false,"key":"/parley/-/parley-3.4.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.4.2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.4.2_1522606758127_0.011932098774365851"},"_hasShrinkwrap":false,"publish_time":1522606758254,"_cnpm_publish_time":1522606758254},"3.4.1":{"name":"parley","version":"3.4.1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"mocha test/*.test.js","lint":"eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production mocha test/*.benchmark.js","bench-win":"mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"a2a851e3f4f7022d7289c8f4600e5d0a236a8b35","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.4.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"8c20804f280a66f94fdc6b1e08aabdce95f3f4ef","size":50487,"noattachment":false,"key":"/parley/-/parley-3.4.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.4.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.4.1_1522005042479_0.09536007453145956"},"_hasShrinkwrap":false,"publish_time":1522005042530,"_cnpm_publish_time":1522005042530},"3.4.0":{"name":"parley","version":"3.4.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"NODE_ENV=production node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"fe04ef761650e86118bfdae937f4d7beebc9b66d","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.4.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"954ee7994c296d7ca191c5af2187ba3ab81e6e6d","size":50439,"noattachment":false,"key":"/parley/-/parley-3.4.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.4.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley_3.4.0_1521764620712_0.06923792470700119"},"_hasShrinkwrap":false,"publish_time":1521764620806,"_cnpm_publish_time":1521764620806},"3.3.4":{"name":"parley","version":"3.3.4","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"05ff7d4ea6ed6d81299229a9ec76d634aac94a50","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.3.4","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"1769bbdaa79f2b2cc659b3f8810f0b24ba48591b","size":50152,"noattachment":false,"key":"/parley/-/parley-3.3.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.3.4.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.3.4.tgz_1512791508018_0.9441450217273086"},"directories":{},"publish_time":1512791509336,"_hasShrinkwrap":false,"_cnpm_publish_time":1512791509336},"3.3.3":{"name":"parley","version":"3.3.3","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"cf4a8c590189ccd9373cfdda837a67fbcda5e615","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.3.3","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"770a7b86a6d60757abf158a17c94aa3d35dde14c","size":50102,"noattachment":false,"key":"/parley/-/parley-3.3.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.3.3.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.3.3.tgz_1512446843156_0.17218089220114052"},"directories":{},"publish_time":1512446844398,"_hasShrinkwrap":false,"_cnpm_publish_time":1512446844398},"3.3.3-0":{"name":"parley","version":"3.3.3-0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"4.11.0","mocha":"3.0.2"},"gitHead":"de2b56d4ef0965ae2abdbfff3acff5d0ad6fc41c","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.3.3-0","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"386788568e03c3ad701f52d6c825bff09efa7709","size":49972,"noattachment":false,"key":"/parley/-/parley-3.3.3-0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.3.3-0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.3.3-0.tgz_1512446031099_0.7359883291646838"},"directories":{},"publish_time":1512446032348,"_hasShrinkwrap":false,"_cnpm_publish_time":1512446032348},"3.3.2":{"name":"parley","version":"3.3.2","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"4b41cddb3520211aec0858bef7d5f7e27a9d8aa1","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.3.2","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"34e5330d438b81cde714c170ba57422e7e73d1d2","size":49208,"noattachment":false,"key":"/parley/-/parley-3.3.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.3.2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.3.2.tgz_1510713746509_0.4142411947250366"},"directories":{},"publish_time":1510713746629,"_cnpm_publish_time":1510713746629,"_hasShrinkwrap":false},"3.3.1":{"name":"parley","version":"3.3.1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"49c06ee9ed32d9c55c24e8a0e767666a6b60b7e8","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.3.1","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"9b9c5f30616f1e2d348afca8e27bfca4bc71c609","size":48818,"noattachment":false,"key":"/parley/-/parley-3.3.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.3.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.3.1.tgz_1508821135987_0.7506295847706497"},"directories":{},"publish_time":1508821137321,"_hasShrinkwrap":false,"_cnpm_publish_time":1508821137321},"3.3.0":{"name":"parley","version":"3.3.0","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.5.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"c6ebf9ea61f8a01b91bfd40097b832f157121d75","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.3.0","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"e3f66ca2c38dd2b68eb020a28917b82cbb2938b4","size":47963,"noattachment":false,"key":"/parley/-/parley-3.3.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.3.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.3.0.tgz_1508817357101_0.08844294189475477"},"directories":{},"publish_time":1508817358427,"_hasShrinkwrap":false,"_cnpm_publish_time":1508817358427},"3.2.3":{"name":"parley","version":"3.2.3","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"3914f2b962f93e6a9b4d121091a5ff669c6b7c9d","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.2.3","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"3a834f2c225d48159d0d9542e344ae07aecfd88e","size":46836,"noattachment":false,"key":"/parley/-/parley-3.2.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.2.3.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.2.3.tgz_1508464502253_0.42821171786636114"},"directories":{},"publish_time":1508464503536,"_hasShrinkwrap":false,"_cnpm_publish_time":1508464503536},"3.2.2":{"name":"parley","version":"3.2.2","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"1ea1ec06e3803daccda851541ab6101070b32076","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.2.2","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"0c0caddb188f0ec270a152e8caa79de5fca489d1","size":46925,"noattachment":false,"key":"/parley/-/parley-3.2.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.2.2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.2.2.tgz_1508464177876_0.8004472821485251"},"directories":{},"publish_time":1508464179075,"_hasShrinkwrap":false,"_cnpm_publish_time":1508464179075},"3.2.1":{"name":"parley","version":"3.2.1","description":"Practical, lightweight flow control for Node.js.  Supports `await`, callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","await","async/await","async","promise","callback","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"66b5ef5d238c6cbca700411871f4cb5f07e21ad0","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.2.1","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"0d1319f957b0d256c498955c9bbb7a17b5350ea8","size":46698,"noattachment":false,"key":"/parley/-/parley-3.2.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.2.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.2.1.tgz_1508463670316_0.30027993698604405"},"directories":{},"publish_time":1508463671591,"_hasShrinkwrap":false,"_cnpm_publish_time":1508463671591},"3.2.0":{"name":"parley","version":"3.2.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"57ea687f78d46be434dfce5f771650f74b34b9e0","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.2.0","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"fca4c6fcca67fdcbc1f17a74fe085ae3aeced654","size":46516,"noattachment":false,"key":"/parley/-/parley-3.2.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.2.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.2.0.tgz_1508392059135_0.5991972768679261"},"directories":{},"publish_time":1508392060374,"_hasShrinkwrap":false,"_cnpm_publish_time":1508392060374},"3.1.0":{"name":"parley","version":"3.1.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"17c9e1b8cc2f4e8c835e0e85012590e76b41b2dd","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.1.0","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"88937594b5dfdbbae1879fdff3168b018874cc41","size":42175,"noattachment":false,"key":"/parley/-/parley-3.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.1.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.1.0.tgz_1508276792412_0.5713028400205076"},"directories":{},"publish_time":1508276793637,"_cnpm_publish_time":1508276793637,"_hasShrinkwrap":false},"3.0.0":{"name":"parley","version":"3.0.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"af2c0d8bfa3c094cc11e0a17e5c4edfbaf56b77f","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.0.0","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"5df36a03713bd39a8f23805ef934ae8f3174a9a5","size":42396,"noattachment":false,"key":"/parley/-/parley-3.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.0.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.0.0.tgz_1507179081083_0.4864707535598427"},"directories":{},"publish_time":1507179082394,"_hasShrinkwrap":false,"_cnpm_publish_time":1507179082394},"3.0.0-0":{"name":"parley","version":"3.0.0-0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"02cf88c7f9bbcd255e0cff20ca9e9a7908b2ef9b","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@3.0.0-0","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"5c62e13ac35663aedd0973b06fe59a5d9a3e3530","size":39487,"noattachment":false,"key":"/parley/-/parley-3.0.0-0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-3.0.0-0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-3.0.0-0.tgz_1505877568532_0.9198008766397834"},"directories":{},"publish_time":1505877569737,"_cnpm_publish_time":1505877569737,"_hasShrinkwrap":false},"2.4.0-3":{"name":"parley","version":"2.4.0-3","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/' && echo '✔  Your code looks good.'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"8984af9e426170c7020ade290f99cb19e62e82a6","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.4.0-3","_npmVersion":"5.2.0","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"e652efff789b1c8755920492d58d499631f147e8","size":38250,"noattachment":false,"key":"/parley/-/parley-2.4.0-3.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.4.0-3.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-2.4.0-3.tgz_1502349903806_0.4570097466930747"},"directories":{},"publish_time":1502349904924,"_cnpm_publish_time":1502349904924,"_hasShrinkwrap":false},"2.4.0-2":{"name":"parley","version":"2.4.0-2","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1","flaverr":"^1.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2"},"gitHead":"054e9d0ccc737ff1eb45a45a8caff0942c848ecd","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.4.0-2","_npmVersion":"5.0.3","_nodeVersion":"8.1.2","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"e3b5c55f89781ab87848b94de5329c9ee1a690e0","size":38227,"noattachment":false,"key":"/parley/-/parley-2.4.0-2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.4.0-2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/parley-2.4.0-2.tgz_1499616593631_0.9605889176018536"},"directories":{},"publish_time":1499616594843,"_cnpm_publish_time":1499616594843,"_hasShrinkwrap":false},"2.4.0-1":{"name":"parley","version":"2.4.0-1","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2","flaverr":"^1.0.0"},"gitHead":"c9a33b1bd27b3807ba8197032ff5aed6d380c8f3","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.4.0-1","_shasum":"e148a78d1ca759221d73e4fec6542d25774a3f1b","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"e148a78d1ca759221d73e4fec6542d25774a3f1b","size":32913,"noattachment":false,"key":"/parley/-/parley-2.4.0-1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.4.0-1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-2.4.0-1.tgz_1494197924648_0.2899025147780776"},"directories":{},"publish_time":1494197926604,"_hasShrinkwrap":false,"_cnpm_publish_time":1494197926604},"2.4.0-0":{"name":"parley","version":"2.4.0-0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"custom-tests":"node ./node_modules/mocha/bin/mocha test/*.test.js","lint":"node ./node_modules/eslint/bin/eslint . --max-warnings=0 --ignore-pattern 'test/'","bench":"node ./node_modules/mocha/bin/mocha test/*.benchmark.js","test":"npm run lint && npm run custom-tests && npm run bench"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","eslint":"3.5.0","mocha":"3.0.2","flaverr":"^1.0.0"},"gitHead":"7d19d45be4501f647458074c80efc5645f7da62c","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.4.0-0","_shasum":"8f97150e853f79a8c126f942852ffe881b53298f","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"8f97150e853f79a8c126f942852ffe881b53298f","size":31149,"noattachment":false,"key":"/parley/-/parley-2.4.0-0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.4.0-0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/parley-2.4.0-0.tgz_1494175404780_0.06112444447353482"},"directories":{},"publish_time":1494175406477,"_cnpm_publish_time":1494175406477,"_hasShrinkwrap":false},"2.3.1":{"name":"parley","version":"2.3.1","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"5efdfb2b34d318b21a7ced64f61caf839ab3da08","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.3.1","_shasum":"ec7e40b5fb511443d0d5f7b244dca7bd0853d18d","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"mikermcneil","email":"npm@sailsjs.com"},"dist":{"shasum":"ec7e40b5fb511443d0d5f7b244dca7bd0853d18d","size":29727,"noattachment":false,"key":"/parley/-/parley-2.3.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.3.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/parley-2.3.1.tgz_1493863376166_0.6050988002680242"},"directories":{},"publish_time":1493863377782,"_hasShrinkwrap":false,"_cnpm_publish_time":1493863377782},"2.3.0":{"name":"parley","version":"2.3.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"7d967fd324136ec35bdb2c0ce7d571e9015255ed","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.3.0","_shasum":"2bfb1a90d43e43b89078318287e3c06a0aba4e0b","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.9.5","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"2bfb1a90d43e43b89078318287e3c06a0aba4e0b","size":28951,"noattachment":false,"key":"/parley/-/parley-2.3.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.3.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-2.3.0.tgz_1490992822958_0.49681614711880684"},"directories":{},"publish_time":1490992825606,"_hasShrinkwrap":false,"_cnpm_publish_time":1490992825606},"2.2.0":{"name":"parley","version":"2.2.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"e10ee0e540e92d820ec8e5b53714347f3e009f50","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.2.0","_shasum":"c9c1b0b94c319f16c05207fe3f9ea5fea71c3aec","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"c9c1b0b94c319f16c05207fe3f9ea5fea71c3aec","size":26983,"noattachment":false,"key":"/parley/-/parley-2.2.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.2.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-2.2.0.tgz_1486699469166_0.275951863033697"},"directories":{},"publish_time":1486699471200,"_cnpm_publish_time":1486699471200,"_hasShrinkwrap":false},"2.1.1":{"name":"parley","version":"2.1.1","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"cb15ec85462432f265f55a5424efac3d149b8cd0","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.1.1","_shasum":"41ed6434220e788b82171ccf74dcbabc67eed4af","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"41ed6434220e788b82171ccf74dcbabc67eed4af","size":26623,"noattachment":false,"key":"/parley/-/parley-2.1.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.1.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-2.1.1.tgz_1486097232614_0.17139980220235884"},"directories":{},"publish_time":1486097234616,"_cnpm_publish_time":1486097234616,"_hasShrinkwrap":false},"2.1.0":{"name":"parley","version":"2.1.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"6a452a7b1f4f62b17711d22e4340321522b711f6","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.1.0","_shasum":"b32560a9ddb43ce9a1f560e089a783de11c0d97e","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"b32560a9ddb43ce9a1f560e089a783de11c0d97e","size":26224,"noattachment":false,"key":"/parley/-/parley-2.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.1.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-2.1.0.tgz_1484540084159_0.9018809634726495"},"directories":{},"publish_time":1484540086301,"_cnpm_publish_time":1484540086301,"_hasShrinkwrap":false},"2.0.0":{"name":"parley","version":"2.0.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"c8168a9be8c410b8fd27cb03984a9f8488418de8","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@2.0.0","_shasum":"54713880abcc4acb91bf860ee942fb776c007cc0","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"54713880abcc4acb91bf860ee942fb776c007cc0","size":22299,"noattachment":false,"key":"/parley/-/parley-2.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-2.0.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-2.0.0.tgz_1482531182189_0.8496010669041425"},"directories":{},"publish_time":1482531184251,"_cnpm_publish_time":1482531184251,"_hasShrinkwrap":false},"1.0.2":{"name":"parley","version":"1.0.2","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"6a71ddd284af792172efcb4f3e759000382d9dda","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@1.0.2","_shasum":"d38f0728514d705fd8208ea4fed869f388f8071c","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"d38f0728514d705fd8208ea4fed869f388f8071c","size":20441,"noattachment":false,"key":"/parley/-/parley-1.0.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-1.0.2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/parley-1.0.2.tgz_1482294390747_0.7015565934125334"},"directories":{},"publish_time":1482294391471,"_cnpm_publish_time":1482294391471,"_hasShrinkwrap":false},"1.0.1":{"name":"parley","version":"1.0.1","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"lib/parley.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"benchmark":"2.1.2","flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"6e1fc7264fca9b9daa1567fb476fc0473f50c6af","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@1.0.1","_shasum":"2057e2c4f51d4ac44fc11d8d4917d0b633a7719d","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"2057e2c4f51d4ac44fc11d8d4917d0b633a7719d","size":15871,"noattachment":false,"key":"/parley/-/parley-1.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-1.0.1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-1.0.1.tgz_1482280541624_0.8109729723073542"},"directories":{},"publish_time":1482280543757,"_cnpm_publish_time":1482280543757,"_hasShrinkwrap":false},"1.0.0":{"name":"parley","version":"1.0.0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"index.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"66f4ddc9375eb53627843a41296b49d5d952c720","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@1.0.0","_shasum":"677ba268d8a3d9548803898285dd138d0874efd3","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"677ba268d8a3d9548803898285dd138d0874efd3","size":13701,"noattachment":false,"key":"/parley/-/parley-1.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-1.0.0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/parley-1.0.0.tgz_1482259165718_0.29131492180749774"},"directories":{},"publish_time":1482259167665,"_cnpm_publish_time":1482259167665,"_hasShrinkwrap":false},"1.0.0-2":{"name":"parley","version":"1.0.0-2","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"index.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"093e5f906310d8763e7ca6f06d682298ea9d7a28","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@1.0.0-2","_shasum":"6075ef63418963585361046e75de665be99c963a","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"6075ef63418963585361046e75de665be99c963a","size":13699,"noattachment":false,"key":"/parley/-/parley-1.0.0-2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-1.0.0-2.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/parley-1.0.0-2.tgz_1482259144418_0.7361227949149907"},"directories":{},"publish_time":1482259145151,"_cnpm_publish_time":1482259145151,"_hasShrinkwrap":false},"1.0.0-1":{"name":"parley","version":"1.0.0-1","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"index.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"d6f735d9e16a685ccaf1418e014d5efa94ebe0a9","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@1.0.0-1","_shasum":"2d000bb5f321f590663aa52382028335db3c8337","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"2d000bb5f321f590663aa52382028335db3c8337","size":13576,"noattachment":false,"key":"/parley/-/parley-1.0.0-1.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-1.0.0-1.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/parley-1.0.0-1.tgz_1482257068500_0.35608980245888233"},"directories":{},"publish_time":1482257069230,"_cnpm_publish_time":1482257069230,"_hasShrinkwrap":false},"1.0.0-0":{"name":"parley","version":"1.0.0-0","description":"Practical, lightweight flow control for Node.js.  Supports callbacks and promises.","main":"index.js","scripts":{"test":"node ./node_modules/mocha/bin/mocha test"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise","deferred"],"author":{"name":"Mike McNeil"},"license":"MIT","dependencies":{"@sailshq/lodash":"^3.10.2","bluebird":"3.2.1"},"devDependencies":{"flaverr":"^1.0.0","mocha":"3.0.2"},"gitHead":"860a901501dc964af3ccfb88238dafaf6b3a0f9d","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"homepage":"https://github.com/mikermcneil/parley#readme","_id":"parley@1.0.0-0","_shasum":"7f3beda7c49e2e51f446c83b00b4dc11648898c0","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},"dist":{"shasum":"7f3beda7c49e2e51f446c83b00b4dc11648898c0","size":13449,"noattachment":false,"key":"/parley/-/parley-1.0.0-0.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-1.0.0-0.tgz"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/parley-1.0.0-0.tgz_1482255938169_0.43496197811327875"},"directories":{},"publish_time":1482255938848,"_cnpm_publish_time":1482255938848,"_hasShrinkwrap":false},"0.0.2":{"name":"parley","version":"0.0.2","description":"Convention-over-configuration flow control","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git://github.com/mikermcneil/parley.git"},"keywords":["flowcontrol","async","promise"],"author":{"name":"Mike McNeil"},"license":"MIT","readmeFilename":"README.md","dependencies":{"underscore":"~1.4.2","async":"~0.1.22"},"_id":"parley@0.0.2","dist":{"shasum":"cbae619e67aff71616a4cb493c91fe3422d214f9","size":6655,"noattachment":false,"key":"/parley/-/parley-0.0.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/parley/download/parley-0.0.2.tgz"},"_npmVersion":"1.1.66","_npmUser":{"name":"balderdashy","email":"mike@balderdashdesign.com"},"maintainers":[{"name":"balderdashy","email":"mike@balderdash.co"},{"name":"mikermcneil","email":"michael.r.mcneil@gmail.com"},{"name":"rachaelshaw","email":"rachael@balderdash.co"}],"directories":{},"publish_time":1356326282930,"_cnpm_publish_time":1356326282930,"_hasShrinkwrap":false}},"readme":"parley\n=========\n\nPractical, lightweight flow control for Node.js, with support for `await`, deferred execution, traditional Node callbacks, and promise chaining.\n\n> Powered by [bluebird](http://bluebirdjs.com/)\n\n## Usage\n\nThese days, there are several different common ways that developers call functions in Node.js and JavaScript.  Parley helps _your code_ support all three of the mainstream flow control paradigms.\n\nParley helps you write functions that can be called like this:\n\n```javascript\nvar result = await doStuff(123);\n```\n\nOr like this:\n\n```javascript\ndoStuff(123)\n.exec((err, result)=>{\n\n});\n```\n\nOr even like this:\n\n```javascript\ndoStuff(123)\n.then((result)=>{\n\n})\n.catch((err)=>{\n\n});\n```\n\n> parley functions return a Deferred.  You can also obtain a promise by calling [`.toPromise()`](#toPromise).\n\nOn top of the basics, parley makes it simple to implement timeouts (userland or implementorland), advanced error negotiation, improved stack traces (through omens), and retries (e.g. exponential backoff).\n\n> For more information on usage, keep reading below.\n\n## About\n\nParley is brought to you by [the team behind Sails.js](https://sailsjs.com/about), and used internally by the [Sails framework](https://sailsjs.com), [Waterline ORM](http://waterlinejs.org), the [node-machine project](http://node-machine.org), and more.  \n\n\n## Compatibility\n\nParley supports Node 8 and up, with backwards-compatibility for Node 6 and Node 4.  (But note that `await` is not supported by Node versions < 7.9.)\n\n\n## Benchmarks\n\nAs of July 3, 2017:\n\n```\n  baseline.benchmark.js\n  •  •      •       •      •    •    \n           •      •              o  \n  •    b e n c h m a r k s      •    \n   •    (instantiation)       °     \n------------------------------------\n    parley(handler)\n • just_build#0 x 28,097,782 ops/sec ±1.42% (90 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    parley(handler).exec(cb)\n • build_AND_exec#0 x 3,185,038 ops/sec ±1.53% (93 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    parley(handler, undefined, {...})  (w/ 9 custom methods)\n • just_build_with_9_custom_methods#0 x 4,274,101 ops/sec ±1.38% (89 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    parley(handler, undefined, {...}).exec(cb)   (w/ 9 custom methods)\n • build_AND_exec_with_9_custom_methods#0 x 1,822,064 ops/sec ±1.24% (88 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    practical benchmark\n • mock \"find().exec()\"#0 x 34.61 ops/sec ±0.99% (78 runs sampled)\n      ✓ should be performant enough when calling fake \"find\" w/ .exec() (using bench())\n • mock \"find(..., explicitCb)\"#0 x 35.04 ops/sec ±1.11% (79 runs sampled)\n      ✓ should be performant enough when calling NAKED fake \"find\" (using bench())\n • mock \"validate().exec()\"#0 x 1,463,995 ops/sec ±1.03% (89 runs sampled)\n      ✓ should be performant enough when calling fake \"validate\" w/ .exec() (using benchSync())\n • mock \"validate().exec()\"#0 x 1,240,289 ops/sec ±2.69% (94 runs sampled)\n      ✓ should be performant enough when calling fake \"validate\" w/ .exec() + uncaught exception handler (using benchSync())\n • mock \"validateButWith9CustomMethods().exec()\"#0 x 1,030,355 ops/sec ±2.26% (96 runs sampled)\n      ✓ should be performant enough calling fake \"validateButWith9CustomMethods\" w/ .exec() (using benchSync())\n • mock \"validate(..., explicitCb)\"#0 x 9,696,815 ops/sec ±2.76% (88 runs sampled)\n      ✓ should be performant enough when calling NAKED \"validate\" (using benchSync())\n------------------------------------\n  •  •      •       •      •    •    \n           •      •              o  \n  • < / b e n c h m a r k s >    •    \n   •                           °     \n                      o°            \n```\n\n\n_Originally, back in January 15, 2017:_\n\n```\n    parley(handler)\n • just_build#0 x 18,162,364 ops/sec ±0.98% (90 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    parley(handler).exec(cb)\n • build_AND_exec#0 x 1,804,891 ops/sec ±1.77% (84 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    parley(handler, undefined, {...})  (w/ 9 custom methods)\n • just_build_with_9_custom_methods#0 x 3,947,502 ops/sec ±1.62% (90 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    parley(handler, undefined, {...}).exec(cb)   (w/ 9 custom methods)\n • build_AND_exec_with_9_custom_methods#0 x 1,259,925 ops/sec ±2.08% (76 runs sampled)\n      ✓ should be performant enough (using benchSync())\n    practical benchmark\n • mock \"find().exec()\"#0 x 33.69 ops/sec ±0.98% (73 runs sampled)\n      ✓ should be performant enough when calling fake \"find\" w/ .exec() (using bench())\n • mock \"find(..., explicitCb)\"#0 x 33.93 ops/sec ±0.90% (73 runs sampled)\n      ✓ should be performant enough when calling NAKED fake \"find\" (using bench())\n • mock \"validate().exec()\"#0 x 789,446 ops/sec ±1.85% (92 runs sampled)\n      ✓ should be performant enough when calling fake \"validate\" w/ .exec() (using benchSync())\n • mock \"validateButWith9CustomMethods().exec()\"#0 x 686,544 ops/sec ±1.21% (90 runs sampled)\n      ✓ should be performant enough calling fake \"validateButWith9CustomMethods\" w/ .exec() (using benchSync())\n • mock \"validate(..., explicitCb)\"#0 x 10,157,027 ops/sec ±1.77% (87 runs sampled)\n      ✓ should be performant enough when calling NAKED \"validate\" (using benchSync())\n```\n\n\n## Help\n\nIf you have questions or are having trouble, click [here](http://sailsjs.com/support).\n\nIf you're in a hurry to use a _parley-enabled API in practice_, it might help to check out a couple of real-world examples:\n• [.find()](https://github.com/balderdashy/sails-docs/blob/f4858b0d3c6bb80bc130060ecdd428e735ec111e/reference/waterline/models/find.md)  _(in Sails.js / Waterline ORM)_\n• [`.build()`](https://github.com/node-machine/machine/tree/c65d6430d72fa93c794f0f80344665028b94cb0c#callables)  _(in `machine`)_\n\nIf you're interested in learning more about this approach to async flow control in general, or considering using parley to support `await`, promises, and traditional Node callbacks _for your own functions_, then keep reading-- there's a whole lot more for you below.\n\n## Bugs &nbsp; [![NPM version](https://badge.fury.io/js/parley.svg)](http://npmjs.com/package/parley)\n\nTo report a bug, [click here](http://sailsjs.com/bugs).\n\n\n\n## Overview\n\nThis section offers a high-level look at how to use parley from both a userland and implementor perspective.  You can also skip ahead to the [API reference below](#api-reference).\n\n\n### Building a deferred object\n\nUse parley to build a **deferred object**.  This provides access to `.exec()`, `.then()`, `.catch()`, and `.toPromise()`, but you can also attach any extra methods you'd like to add.  (There are also a few extra methods like `.log()` provided automatically as syntactic sugar-- more on that below.)\n\n```javascript\nvar parley = require('parley');\n\nvar deferred = parley((done)=>{\n  setTimeout(()=>{\n    if (Math.random() > 0.5) {\n      return done(new Error('whoops, unlucky I guess'));\n    }\n    if (Math.random() > 0.2) {\n      return done(undefined, Math.floor(5*Math.random()));\n    }\n    return done();\n  }, 50);\n});\n```\n\n> For a more complete version of the above example, [click here](https://gist.github.com/mikermcneil/621b55cfc54f133a1db30d7238ca52b1).\n\n\n### Results\n\nTo send back a result value from your handler, specify it as the second argument when invoking `done`.\n\n```javascript\nreturn done(undefined, 'hello world');\n```\n\nDepending on how userland code chooses to work with the deferred object, your result will be passed back to userland as either the return value, the second argument to the `.exec()` callback, or as the value resolved from the promise.\n\n```javascript\n// Recommended approach   (available in Node.js >= v7.9)\nvar result = await yourFn();\n```\n\n```javascript\n// traditional Node-style callback\n.exec((err, result)=>{\n  // => undefined, 'hello world'\n});\n\n// or legacy promise chaining\n.then((result)=>{\n  // => 'hello world'\n});\n```\n\n\n### Errors\n\nTo send back an error from your handler, handle it in the conventional Node.js way.\n\n```javascript\nreturn done(new Error('Oops'));\n```\n\nDepending on how userland code chooses to work with the deferred object, your error will be passed back to userland as either the first argument to the `.exec()` callback, or as the promise's rejection \"reason\".\n\n```javascript\n// Recommended approach   (available in Node.js >= v7.9)\nvar result;\ntry {\n  result = await yourFn();\n} catch (err) {\n  // => [Error: oops]\n}\n```\n\n```javascript\n// traditional Node-style callback\n.exec((err, result)=>{\n  // => [Error: oops], undefined\n});\n\n// or legacy promise-chaining\n.catch((err)=>{\n  // => [Error: oops]\n});\n```\n\n#### Custom exceptions\n\nSometimes, there is one or more \"exceptional\" exit a function might take, which are fundamentally different than other generic errors that might occur-- for example, consider the difference between a \"someone with that username already exists\" exception and a bug resulting from a typo, missing dependency, etc.\n\nTo make it possible for userland code to negotiate different exits from your function, give your error a `code` property.\n\n```javascript\nvar x = Math.random();\n\n// Miscellaneous error (no code)\nif (x > 1) {\n  return done(new Error('Consistency violation: This should never happen.'));\n}\n\nvar flaverr = require('flaverr');\n// Other recognized exceptions\nif (x > 0.6) {\n  return done(flaverr('E_TOO_BIG', new Error('Oops: too big')));\n}\nif (x < 0.4) {\n  return done(flaverr('E_TOO_SMALL', new Error('Too small -- probably already in use!')))\n}\n```\n\n#### Negotiating errors\n\nThe aforementioned approach makes it easy to negotiate errors in userland.  Whether the userland code is using `await`, a Node-style callback, or promise-chaining, the underlying approach is conceptually the same regardless.\n\n```javascript\n// Recommended approach   (available in Node.js >= v7.9)\nvar result;\ntry {\n  result = await yourFn();\n} catch (err) {\n  switch(err.code) {\n    case 'E_TOO_BIG': return res.status(400).json({ reason: 'Ooh, too bad!  '+err.message });\n    case 'E_TOO_SMALL': return res.status(401).json({ reason: 'Please try again later.  '+err.message });\n    default:\n      console.error('Unexpected error:',err.stack);\n      return res.sendStatus(500);\n  }\n}\n\n// …\n```\n\n\n```javascript\n// traditional Node-style callback\n.exec(function(err, result) {\n  if (err) {\n    switch(err.code) {\n      case 'E_TOO_BIG': return res.status(400).json({ reason: 'Ooh, too bad!  '+err.message });\n      case 'E_TOO_SMALL': return res.status(401).json({ reason: 'Please try again later.  '+err.message });\n      default:\n        console.error('Unexpected error:',err.stack);\n        return res.sendStatus(500);\n    }\n  }//-•\n\n  // ...\n});\n```\n\n```Javascript\n// or legacy promise-chaining\n.then(function (result) {\n  // ...\n})\n.catch({ code: 'E_TOO_BIG' }, function(err) {\n  return res.status(400).json({ reason: 'Ooh, too bad!  '+err.message });\n})\n.catch({ code: 'E_TOO_SMALL' }, function(err) {\n  return res.status(401).json({ reason: 'Please try again later.  '+err.message });\n})\n.catch(function(err) {\n  console.error('Unexpected error:',err.stack);\n  return res.sendStatus(500);\n});\n```\n\n\n#### Handling uncaught exceptions\n\nFor a long time, uncaught exceptions were the skeletons in JavaScript's closet.  That's because, out of the box, when using asynchronous callbacks in Node.js, _if the code in your callback throws an uncaught error, the process **will crash!**_\n\nFor example, the following code would crash the process:\n\n```javascript\nsetTimeout(function (){\n\n  // Since this string can't be parsed as JSON, this will throw an error.\n  // And since we aren't using try...catch, it will crash the process.\n  JSON.parse('who0ps\"thisis totally not valid js{}n');\n\n  //…\n\n}, 50);\n```\n\nThis behavior leads to stability issues, wasted dev hours, security vulnerabilities, extreme susceptibility to denial-of-service attacks, weeping, crying, moaning, therapist appointments and much wailing and gnashing of teeth.\n\n**But if you're using Node >= v7.9, you're in luck.  [`await`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await) solves _all_ of these problems.**\n\n> If you're new to Node, congratulations!  You're getting started at _the best possible time_.  It's never been faster, easier, and more secure to build apps with JavaScript.\n>\n> And for those of us that have been using Node.js for years, these are incredibly exciting times to be a Node.js developer.  As a community, we've finally conquered one of Node's biggest challenges and it's often-quoted only remaining hurdle to adoption: \"callback hell\".   The callbacks are dead.  Long live `await`!\n\n#### What if I'm stuck with an old version of Node.js?\n\nWell, then buckle up.  \n\nTo protect against the problems mentioned above, you'll need to always be sure to use try...catch blocks around any logic\nthat might throw in an asynchronous, Node-style callback.\n\nFor example:\n\n```javascript\nsetTimeout(function (){\n\n  try {\n    JSON.parse('who0ps\"thisis totally not valid js{}n');\n  } catch (e) { return res.serverError(e); }\n\n  //…\n\n}, 50);\n```\n\nHere are a few common use cases to watch out for:\n+ basic JavaScript errors; e.g. syntax issues, or trying to use the dot (.) operator on `null`.\n+ trying to JSON.parse() some data that is not a valid, parseable JSON string\n+ trying to JSON.stringify() a circular object\n+ RPS methods in Sails.js; e.g. `.publish()`, `.subscribe()`, `.unsubscribe()`\n+ Waterline's `.validate()` model method\n+ Node core's `assert()`\n+ most synchronous methods from Node core (e.g. `fs.readFileSync()`)\n+ any synchronous machine called with `.execSync()`\n+ other synchronous functions from 3rd party libraries\n\n\n_Note that this is not an issue when using promises, since `.then()` automatically catches uncaught errors\n(although there are other considerations when using promises-- for instance, forgetting to use .catch()\neach time .then() is used is a common source of hard-to-debug issues, technical debt, and memory leaks.)_\n\n\n> **EXPERIMENTAL:** As of parley 2.3.x, there is a new, experimental feature that allows you to\n> easily provide an extra layer of protection: an optional 2nd argument to `.exec()`.  If specified,\n> this function will be used as an uncaught exception handler-- a simple fallback just in case something\n> happens to go wrong in your callback function.\n>\n> This allows you to safely write code like the following without crashing the server:\n>\n> ```javascript\n> User.create({ username: 'foo' }).exec(function (err, result) {\n>   if (err) {\n>     if (err.code === 'E_UNIQUE') { return res.badRequest('Username already in use.'); }\n>     else { return res.serverError(err); }\n>   }\n>\n>   var thisWillNeverWork = JSON.parse('who0ps\"thisis totally not valid js{}n');\n>\n>   return res.json(result);\n>\n> }, res.serverError);\n> ```\n>\n> Of course, it's still best to be explicit about error handling whenever possible.\n> The extra layer of protection is just that-- it's here to help prevent issues\n> stemming from the myriad runtime edge cases it's almost impossible to anticipate\n> when building a production-ready web application.\n>\n> The best choice is to not use `.exec()` at all.  Use `await`.\n\n\n#### Tolerating errors\n\nSometimes, you just don't care.\n\n```javascript\nvar result = await sails.helpers.fs.readJson('./package.json')\n.tolerate('notFound', ()=>{\n  return {\n    name: 'not-a-real-package',\n    description: 'This is not a real package, and I don\\'t care.'\n  };\n});\n\n// Now `result` is either the contents of the real package.json file... or our fake stuff.\n```\n\n\n#### Catching and rethrowing errors\n\nBut sometimes, you care a little _too_ much.\n\n```javascript\nvar result = await sails.helpers.fs.readJson('./package.json')\n.intercept('notFound', (err)=>{\n  return flaverr({\n    message: 'No package.json file could be found in the current working directory.  And I care _very_ much.',\n    code: 'E_WHERE_IS_MY_PACKAGE_JSON'\n  }, err);\n});\n\n// If the package.json file doesn't exist, we will have now thrown a much more useful error.\n```\n\n\n\n### Flow control\n\nIf you're using Node >= v7.9, you're in luck.  With `await`, flow control works just like it does in any other language (with one exception: parallel processing/races.  More on that below.)\n\n\n##### What if I'm stuck with an old version of Node.js?\n\nSorry to hear that...  Once again, `await` solves all of these problems.  It's the biggest boon to JavaScript development since Node.js was released.  You'll wish you could use it.\n\nBut don't worry- this section is for you.  Since Node.js is asynchronous, when using Node < v7.9, seemingly-tricky flow control problems often arise in practical, userland code.  Fortunately, they're solveable when equipped with the proper tools and strategies.\n\n> Most of the examples below use simple Node callbacks, but note that many similar affordances are available for promise-chaining -- for example, check out `.toPromise()` ([below](#toPromise)) and `Promise.all()` (in bluebird, or native in ES6, etc.).  The concepts are more or less the same regardless.\n>\n> _Unless you and the rest of your team are experts with legacy promise-chaining and already have tight, consistently-applied and agreed-upon conventions for how to implement the use cases below, you're probably best off using Node callbacks.  Of course, the **best and safest** strategy is to do neither, and instead to take advantage of `await`._\n\n#### Async loops\n\nUsing Node >= v7.9?  You can just do a `for` loop.\n\n```javascript\nvar results = [];\nfor (let letter of ['a','b','c','d','e','f','g','h','i','j','k','l']) {\n  results.push(await doStuff(letter));\n}\nreturn res.json(results);\n```\n\nBut otherwise...\n\n\n##### What if I'm stuck with an old version of Node.js?\n\nLoop over many asynchronous things, one at a time, using `async.eachSeries()`.\n\n> For this example, make sure you have access to the [`async` library](http://npmjs.com/package/async):\n>\n>```javascript\n>var async = require('async');\n>```\n\n```javascript\nvar results = [];\nasync.eachSeries(['a','b','c','d','e','f','g','h','i','j','k','l'], function (letter, next) {\n  doStuff(letter).exec(function (err, resultForThisLetter){\n    if (err) { return next(err); }\n    results.push(resultForThisLetter)\n    return next();\n  });\n},\n// ~∞%°\nfunction afterwards(err) {\n  if (err) {\n    console.error(err);\n    return res.sendStatus(500);\n  }\n  return res.json(results);\n});\n```\n\n#### Async \"if\"\n\nUsing Node >= v7.9?  You can just do an `if` statement.\n\n```javascript\nvar profileUser = await User.findOne({ id: req.param('id') });\nif (!profileUser) { return res.notFound(); }\n\nvar loggedInUser;\nif (req.session.userId) {\n  loggedInUser = await User.findOne({ id: req.session.userId });\n}\n\nreturn res.view('profile', {\n  profile: _.omit(profileUser, ['password', 'email']),\n  me: loggedInUser ? _.omit(loggedInUser, 'password') : {}\n});\n```\n\nBut otherwise...\n\n##### What if I'm stuck with an old version of Node.js?\n\nEven simple detours and conditionals can sometimes be tricky when things get asynchronous.\n\nFortunately, relatively concise and robust branching logic can be easily implemented using out-of-the-box JavaScript using this weird trick™.\n\n```javascript\nUser.findOne({ id: req.param('id') })\n.exec(function(err, profileUser) {\n  if (err) { return res.serverError(err); }\n  if (!profileUser) { return res.notFound(); }\n\n  // If the request came from a logged in user,\n  // then fetch that user's record from the database.\n  (function(proceed) {\n    if (!req.session.userId) {\n      return proceed();\n    }\n    User.findOne({ id: req.session.userId })\n    .exec(function (err, loggedInUser) {\n      if (err) { return proceed(err); }\n      if (!loggedInUser) { return proceed(new Error('Logged-in user ('+req.session.userId+') is missing from the db!')); }\n      return proceed(undefined, loggedInUser);\n    });\n\n  // ~∞%°\n  })(function afterwards(err, loggedInUser){\n    if (err) { return res.serverError(err); }\n\n    return res.view('profile', {\n      profile: _.omit(profileUser, ['password', 'email']),\n      me: loggedInUser ? _.omit(loggedInUser, 'password') : {}\n    });\n\n  });\n});\n```\n\n> [More background on using the if/then/finally pattern for asynchronous flow control](https://gist.github.com/mikermcneil/32391da94cbf212611933fabe88486e3)\n\n\n#### Async recursion\n\nUsing Node >= v7.9?  Recursion is never exactly \"fun and easy\" (IMO) but with `await`, you can do recursion just like you would with normal, synchronous code (like any other programming language).\n\nIn the example below, we demonstrate that, but also take advantage of `.tolerate()` for error negotiation instead of using a try/catch block:\n\n```javascript\n#!/usr/bin/env node\n\nvar path = require('path');\n\n// Starting from the current working directory, ascend upwards\n// looking for a package.json file.  (Keep looking until we hit an error; if so, throw it.)\n// Otherwise, if there was no error, we found it!\nvar nearestPJ = await (async function _recursively(thisDir){\n  var pathToCheck = path.resolve(thisDir, 'package.json');\n  return await sails.helpers.fs.exists(pathToCheck)\n  .tolerate('doesNotExist', async (unusedErr)=>{\n    return await _recursively(path.dirname(thisDir));\n  }) || pathToCheck;\n})(process.cwd());\n\nconsole.log('Found nearest package.json file at:',nearestPJ);\n```\n\n\n\nBut otherwise...\n\n##### What if I'm stuck with an old version of Node.js?\n\nMuch like \"if/then/finally\" above, the secret to tidy asynchronous recursion is the (notorious) self-calling function.\n\n```javascript\n#!/usr/bin/env node\n\nvar path = require('path');\nvar fs = require('fs');\n\n// Starting from the current working directory, ascend upwards\n// looking for a package.json file.  (Keep looking until we hit an error.)\n(function _recursively(thisDir, done){\n\n  var pathToCheck = path.resolve(thisDir, './package.json');\n  fs.stat(pathToCheck, function(err) {\n    if (err) {\n      switch (err.code) {\n\n        // Not found -- so keep going.\n        case 'ENOENT':\n          var oneLvlUp = path.dirname(thisDir);\n          _recursively(oneLvlUp, function(err, nearestPJ) {\n            if (err) { return done(err); }\n            return done(undefined, nearestPJ);\n          });\n          return;\n\n        // Misc. error\n        default: return done(err);\n      }\n    }//-•\n\n    // Otherwise, found it!\n    return done(undefined, pathToCheck);\n\n  });//</ fs.exists >\n\n// ~∞%°\n})(process.cwd(), function afterwards(err, nearestPJ) {\n  if (err) {\n    console.error(err);\n    return process.exit(1);\n  }\n\n  console.log('Found nearest package.json file at:',nearestPJ);\n\n});\n```\n\n> [More examples and thoughts on asynchronous recursion](https://gist.github.com/mikermcneil/225198a46317050af1f772296f67e6ce)\n\n\n\n#### Parallel processing / \"races\"\n\nSometimes, for performance reasons, it's convenient to do more than one thing at the same time.  In many languages, this can be tricky.  But in JavaScript (and thus, in Node.js), this kind of optimization is supported right out of the box.\n\nHowever, note that this _is_ one area where you can't just use `await`-- you'll need to use either callbacks or promise chaining.\n\n> **When should I optimize my code with parallel processing?**\n> \n> It's never worth optimizing until you've hit an _actual_ bottleneck, usually as far as per-user latency (or more rarely, as far as overall scalability).  It's never worth inheriting the complexity of parallel processing until you're 100% sure your performance issue is related to \"having to wait for one thing to finish before the next thing can start\".  If you're having performance issues for other reasons (e.g. slow SQL queries, slow 3rd party APIs, or a lack of indexes in your Mongo database), this won't help you at all, and like most forms of premature optimization, it'll just make your app more bug-prone, more complicated to understand, and harder to optimize in the future if _real_ performance issues arise.\n>\n> That said, if you actually need the performance boost from parallel processing, you're in luck:  when Node.js puts its mind to it, the engine can be incredibly fast.\n\nTo manage \"races\" between deferred objects while still performing tasks simultaneously, you can use `async.each()` -- for example, here's the `async.eachSeries()` code from above again, but optimized to run on groups of letters simultaneously, while still processing letters within those groups in sequential order:\n\n```javascript\nvar results = [];\nasync.each(['abc','def','ghi','jkl'], function (group, next) {\n\n  var theseLetters = group.split('');\n  var resultsForThisGroup = [];\n  async.eachSeries(theseLetters, function (letter, next) {\n    doStuff(letter).exec(function (err, resultForThisLetter){\n      if (err) { return next(err); }\n      resultsForThisGroup.push(resultForThisLetter)\n      return next();\n    });\n  },// ~∞%°\n  function (err) {\n    if (err) { return next(err); }\n\n    resultsForThisGroup.forEach(function(letter){\n      results.push(letter);\n    });\n\n    return next();\n  });\n\n},// ~∞%°\nfunction afterwards(err) {\n  if (err) {\n    console.error(err);\n    return res.sendStatus(500);\n  }\n  return res.json(results);\n});\n```\n\n> [More background on asynchronous vs. synchronous flow control in general](https://gist.github.com/mikermcneil/755a2ae7cc62d9a59656ab3ba9076cc1)\n\n\n\n\n## API reference\n\n### Implementor interface\n\n#### parley()\n\nBuild and return a deferred object.\n\nAs its first argument, expects a function (often called the handler, or more specifically \"handleExec\") that will run whenever userland code executes the deferred object (e.g. with `await`, `.exec()`, or `.then()`).\n\n```javascript\nvar deferred = parley(function (done) {\n  // • If something goes wrong, call `done(new Error('something went wrong'))`\n  // • If everything worked out, and you want to send a result back, call `done(undefined, result);`\n  // • Otherwise, if everything worked out but no result is necessary, simply call:\n  return done();\n});\n```\n\nThis first argument is mandatory-- it defines what your implementation _actually does_ when the `await` or `.exec()` is triggered.\n\n##### Optional callback\nThere is also an optional second argument you can use: another function that, if provided, will cause your handler (the first arg) to run _immediately_.\n\nThis provides a simple, optimized shortcut for exposing an optional callback to your users.\n\n> Why bother?  Well, for one thing, it's stylistically a good idea to give users a way to call your handler with as little sugar on top as possible.  More rarely, for very performance-sensitive applications, direct callback usage does provide a mild performance benefit.\n\n```javascript\nvar deferred = parley(function (done){\n  // ...\n}, optionalCbFromUserland);\n\n// Note: if an optional cb was provided from userland, then parley **will not return anything**.\n// In other words:\nif (optionalCbFromUserland) {\n  assert(deferred === undefined);\n}\n```\n\n##### Custom methods\nThe safest way to attach custom methods is by using parley's optional 3rd argument.  The usual approach is for these custom methods to be chainable (i.e. return `this`).\n\n```javascript\nvar privateMetadata = {};\n\nvar deferred = parley(function (done){\n  // ...\n}, optionalCbFromUserland, {\n  someCustomMethod: function(a,b,c){\n    privateMetadata = privateMetadata || {};\n    privateMetadata.foo = privateMetadata.foo || 1;\n    privateMetadata.foo++;\n    return deferred;\n  }\n});\n```\n\n> Don't use this approach to define non-functions or overrides with special meaning (e.g. `inspect`, `toString`, or `toJSON`).\n> To do that, just set the property directly-- for example:\n> ```javascript\n> deferred.inspect = function(){ return '[My cool deferred!]'; };\n> ```\n\n\n#### Stack traces\n\nWhen building asynchronous functions, you're likely to encounter issues with unhelpful stack traces.  There's no _easy_ solution to this problem per se, but over the years, our team has developed a decent approach to solving this problem.  It involves using temporary Error instances known colloquially as \"omens\":\n\n```javascript\nconst flaverr = require('flaverr');\n\n// Take a snapshot of the stack trace BEFORE doing anything asynchronous.\nvar omen = flaverr.omen();\n\nvar deferred = parley((done)=>{\n  \n  // Wait for up to 8 seconds.\n  var msToWait = 8 * Math.floor(Math.random()*1000);\n  setTimeout(()=>{\n    if (Math.random() > 0.5) {\n      // Use our \"omen\" (stack trace snapshot) to \"flavor\" our actual error.\n      return done(flaverr({\n        code: 'E_LUCK_RAN_OUT',\n        message: 'Too bad, your luck ran out!'\n      }, omen));\n    }\n    else {\n      return done();\n    }\n  }, msToWait);\n \n}, optionalCbFromUserland, {\n  someCustomMethod: (a,b,c)=>{\n    privateMetadata = privateMetadata || {};\n    privateMetadata.foo = privateMetadata.foo || 1;\n    privateMetadata.foo++;\n    return deferred;\n  }\n}, undefined, omen);\n```\n\nNow, when your function gets called, if there's an error, the developer who wrote the relevant code will get an excellent stack trace.\n\n\n#### Timeouts\n\nSometimes, it's helpful to automatically time out if execution takes too long.  In parley, Sails, Waterline, and the node-machine project, this is supported right out of the box.\n\nFor instance, in the code from the previous example above, the execution of our little function might take anywhere from one or two milliseconds all the way up to 8 entire seconds.  But what if we wanted it to time out after only 2 seconds?  For that, we can use the fourth argument to parley: the timeout.\n\nThis should be a number, expressed in milliseconds:\n\n```javascript\n// … same code as the example above …\n\n// This time, with a timeout of 2 seconds (2000 milliseconds):\nvar deferred = parley((done)=>{\n  // … same code as the example above …\n}, optionalCbFromUserland, {\n  … custom methods here …\n}, 2000);\n```\n\nIf the timeout is exceeded, an error is triggered, and any subsequent calls to `done` from your provided custom implementation are ignored.\n\n#### Improving stack traces of built-in errors\n\nFor important modules that impact many developers (or for authors that really care about the sanity of their users, and who want to make it easier to debug their code), it is sometimes useful to go so far as improving the stack trace of _even parley's built-in errors_ such as timeouts.  For this, simply use the 5th argument: the \"omen\".\n\nTo stick with our running example:\n\n```javascript\n// … same code as the example above …\n\n// Take a snapshot of the stack trace BEFORE doing anything asynchronous.\nvar omen = new Error('omen');\n\nvar deferred = parley((done)=>{\n  // … same code as the example above …\n}, optionalCbFromUserland, {\n  … custom methods here …\n}, 2000, omen);\n```\n\n\n\n\n### Userland interface\n\nThe deferred object returned by `parley()` exposes a few different methods.\n\n#### .exec()\n\n```javascript\nparley(function(done){ return done(undefined, 1+1); })\n.exec(function (err, result) {\n  // => undefined, 2\n});\n```\n\n```javascript\nparley(function(done){ return done(new Error('whoops'), 1+1); })\n.exec(function (err, result) {\n  // => [Error: whoops], undefined\n});\n```\n\n#### .then()\n\n```javascript\nparley(function(done){ return done(undefined, 1+1); })\n.then(function (result) {\n  // => 2\n});\n```\n\n#### .catch()\n\n```javascript\nparley(function(done){ return done(new Error('whoops'), 1+1); })\n.catch(function (err) {\n  // => [Error: whoops]\n});\n```\n\n#### .toPromise()\n\n```javascript\nvar promise1 = parley(function(done){ return done(undefined, 1+1); }).toPromise();\nvar promise2 = parley(function(done){ setTimeout(function(){ return done(); }, 10); }).toPromise();\n\nPromise.all([\n  promise1,\n  promise2\n])\n.then(function(result){\n  // => [2, undefined]\n}).catch(function (err) {\n\n});\n```\n\n\n#### Other methods\n\nImplementors may also choose to attach other methods to the deferred object (e.g. `.where()`).  See \"Custom methods\" above for more information.\n\n\n## Contributing &nbsp; [![Master Branch Build Status](https://travis-ci.org/mikermcneil/parley.svg?branch=master)](https://travis-ci.org/mikermcneil/parley) &nbsp; [![Master Branch Build Status (Windows)](https://ci.appveyor.com/api/projects/status/tdu70ax32iymvyq3?svg=true)](https://ci.appveyor.com/project/mikermcneil/parley)\n\nPlease observe the guidelines and conventions laid out in the [Sails project contribution guide](http://sailsjs.com/documentation/contributing) when opening issues or submitting pull requests.\n\n[![NPM](https://nodei.co/npm/parley.png?downloads=true)](http://npmjs.com/package/parley)\n\n## Pronunciation\n\n[`/ˈpärlē/`](http://www.macmillandictionary.com/us/pronunciation/american/parley)\n\n> _Rather than picking barley and getting snarly, she decided to `npm install parley` and listen to some Bob Marley._\n\n## License\n\nThis package, like the [Sails framework](http://sailsjs.com), is free and open-source under the [MIT License](http://sailsjs.com/license).\n\n\n","_attachments":{},"homepage":"https://github.com/mikermcneil/parley#readme","bugs":{"url":"https://github.com/mikermcneil/parley/issues"},"license":"MIT"}