mirror of
				https://github.com/Instadapp/Swap-Aggregator-Subgraph.git
				synced 2024-07-29 21:57:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| const Readable = require("stream").Readable;
 | |
| const pathUtil = require("path");
 | |
| const inspect = require("../inspect");
 | |
| const list = require("../list");
 | |
| 
 | |
| // ---------------------------------------------------------
 | |
| // SYNC
 | |
| // ---------------------------------------------------------
 | |
| 
 | |
| const walkSync = (path, options, callback, currentLevel) => {
 | |
|   const item = inspect.sync(path, options.inspectOptions);
 | |
| 
 | |
|   if (options.maxLevelsDeep === undefined) {
 | |
|     options.maxLevelsDeep = Infinity;
 | |
|   }
 | |
| 
 | |
|   callback(path, item);
 | |
|   if (item && item.type === "dir" && currentLevel < options.maxLevelsDeep) {
 | |
|     list.sync(path).forEach(child => {
 | |
|       walkSync(
 | |
|         path + pathUtil.sep + child,
 | |
|         options,
 | |
|         callback,
 | |
|         currentLevel + 1
 | |
|       );
 | |
|     });
 | |
|   }
 | |
| };
 | |
| 
 | |
| const initialWalkSync = (path, options, callback) => {
 | |
|   walkSync(path, options, callback, 0);
 | |
| };
 | |
| 
 | |
| // ---------------------------------------------------------
 | |
| // STREAM
 | |
| // ---------------------------------------------------------
 | |
| 
 | |
| const walkStream = (path, options) => {
 | |
|   const rs = new Readable({ objectMode: true });
 | |
|   let nextTreeNode = {
 | |
|     path,
 | |
|     parent: undefined,
 | |
|     level: 0
 | |
|   };
 | |
|   let running = false;
 | |
|   let readSome;
 | |
| 
 | |
|   const error = function(err) {
 | |
|     rs.emit("error", err);
 | |
|   };
 | |
| 
 | |
|   const findNextUnprocessedNode = node => {
 | |
|     if (node.nextSibling) {
 | |
|       return node.nextSibling;
 | |
|     } else if (node.parent) {
 | |
|       return findNextUnprocessedNode(node.parent);
 | |
|     }
 | |
|     return undefined;
 | |
|   };
 | |
| 
 | |
|   const pushAndContinueMaybe = data => {
 | |
|     const theyWantMore = rs.push(data);
 | |
|     running = false;
 | |
|     if (!nextTreeNode) {
 | |
|       // Previous was the last node. The job is done.
 | |
|       rs.push(null);
 | |
|     } else if (theyWantMore) {
 | |
|       readSome();
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   if (options.maxLevelsDeep === undefined) {
 | |
|     options.maxLevelsDeep = Infinity;
 | |
|   }
 | |
| 
 | |
|   readSome = () => {
 | |
|     const theNode = nextTreeNode;
 | |
| 
 | |
|     running = true;
 | |
| 
 | |
|     inspect
 | |
|       .async(theNode.path, options.inspectOptions)
 | |
|       .then(inspected => {
 | |
|         theNode.inspected = inspected;
 | |
|         if (
 | |
|           inspected &&
 | |
|           inspected.type === "dir" &&
 | |
|           theNode.level < options.maxLevelsDeep
 | |
|         ) {
 | |
|           list
 | |
|             .async(theNode.path)
 | |
|             .then(childrenNames => {
 | |
|               const children = childrenNames.map(name => {
 | |
|                 return {
 | |
|                   name,
 | |
|                   path: theNode.path + pathUtil.sep + name,
 | |
|                   parent: theNode,
 | |
|                   level: theNode.level + 1
 | |
|                 };
 | |
|               });
 | |
|               children.forEach((child, index) => {
 | |
|                 child.nextSibling = children[index + 1];
 | |
|               });
 | |
| 
 | |
|               nextTreeNode = children[0] || findNextUnprocessedNode(theNode);
 | |
|               pushAndContinueMaybe({ path: theNode.path, item: inspected });
 | |
|             })
 | |
|             .catch(error);
 | |
|         } else {
 | |
|           nextTreeNode = findNextUnprocessedNode(theNode);
 | |
|           pushAndContinueMaybe({ path: theNode.path, item: inspected });
 | |
|         }
 | |
|       })
 | |
|       .catch(error);
 | |
|   };
 | |
| 
 | |
|   rs._read = function() {
 | |
|     if (!running) {
 | |
|       readSome();
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return rs;
 | |
| };
 | |
| 
 | |
| // ---------------------------------------------------------
 | |
| // API
 | |
| // ---------------------------------------------------------
 | |
| 
 | |
| exports.sync = initialWalkSync;
 | |
| exports.stream = walkStream;
 | 
