aboutsummaryrefslogtreecommitdiff
path: root/node_modules/@mrmlnc/readdir-enhanced/lib/async
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/@mrmlnc/readdir-enhanced/lib/async')
-rw-r--r--node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js29
-rw-r--r--node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js48
2 files changed, 77 insertions, 0 deletions
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js b/node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js
new file mode 100644
index 0000000..1ac9b2f
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js
@@ -0,0 +1,29 @@
+'use strict';
+
+module.exports = asyncForEach;
+
+/**
+ * Simultaneously processes all items in the given array.
+ *
+ * @param {array} array - The array to iterate over
+ * @param {function} iterator - The function to call for each item in the array
+ * @param {function} done - The function to call when all iterators have completed
+ */
+function asyncForEach (array, iterator, done) {
+ if (array.length === 0) {
+ // NOTE: Normally a bad idea to mix sync and async, but it's safe here because
+ // of the way that this method is currently used by DirectoryReader.
+ done();
+ return;
+ }
+
+ // Simultaneously process all items in the array.
+ let pending = array.length;
+ array.forEach(item => {
+ iterator(item, () => {
+ if (--pending === 0) {
+ done();
+ }
+ });
+ });
+}
diff --git a/node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js b/node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js
new file mode 100644
index 0000000..677e0b6
--- /dev/null
+++ b/node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js
@@ -0,0 +1,48 @@
+'use strict';
+
+module.exports = readdirAsync;
+
+const maybe = require('call-me-maybe');
+const DirectoryReader = require('../directory-reader');
+
+let asyncFacade = {
+ fs: require('fs'),
+ forEach: require('./for-each'),
+ async: true
+};
+
+/**
+ * Returns the buffered output from an asynchronous {@link DirectoryReader},
+ * via an error-first callback or a {@link Promise}.
+ *
+ * @param {string} dir
+ * @param {object} [options]
+ * @param {function} [callback]
+ * @param {object} internalOptions
+ */
+function readdirAsync (dir, options, callback, internalOptions) {
+ if (typeof options === 'function') {
+ callback = options;
+ options = undefined;
+ }
+
+ return maybe(callback, new Promise(((resolve, reject) => {
+ let results = [];
+
+ internalOptions.facade = asyncFacade;
+
+ let reader = new DirectoryReader(dir, options, internalOptions);
+ let stream = reader.stream;
+
+ stream.on('error', err => {
+ reject(err);
+ stream.pause();
+ });
+ stream.on('data', result => {
+ results.push(result);
+ });
+ stream.on('end', () => {
+ resolve(results);
+ });
+ })));
+}