| 
									
										
										
										
											2012-06-06 13:19:44 -06:00
										 |  |  | /*jshint strict:true node:true es5:true onevar:true laxcomma:true laxbreak:true*/ | 
					
						
							| 
									
										
										
										
											2011-02-03 23:31:25 -07:00
										 |  |  | (function () { | 
					
						
							|  |  |  |   "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // "FIFO" isn't easy to convert to camelCase and back reliably
 | 
					
						
							|  |  |  |   var isFnodeTypes = [ | 
					
						
							|  |  |  |       "isFile", "isDirectory",  "isSymbolicLink", "isBlockDevice",  "isCharacterDevice", "isFIFO", "isSocket" | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |     fnodeTypes = [ | 
					
						
							|  |  |  |       "file",   "directory",    "symbolicLink",   "blockDevice",    "characterDevice",    "FIFO",   "socket" | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |     fnodeTypesPlural = [ | 
					
						
							|  |  |  |       "files",  "directories",  "symbolicLinks",  "blockDevices",   "characterDevices",   "FIFOs",  "sockets" | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // 
 | 
					
						
							|  |  |  |   function createNodeGroups() { | 
					
						
							|  |  |  |     var nodeGroups = {}; | 
					
						
							|  |  |  |     fnodeTypesPlural.concat("nodes", "errors").forEach(function (fnodeTypePlural) { | 
					
						
							|  |  |  |       nodeGroups[fnodeTypePlural] = []; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     return nodeGroups; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Determine each file node's type
 | 
					
						
							|  |  |  |   // 
 | 
					
						
							|  |  |  |   function sortFnodesByType(stat, fnodes) { | 
					
						
							|  |  |  |     var i, isType; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < isFnodeTypes.length; i += 1) { | 
					
						
							|  |  |  |       isType = isFnodeTypes[i]; | 
					
						
							|  |  |  |       if (stat[isType]()) { | 
					
						
							|  |  |  |         stat.type = fnodeTypes[i]; | 
					
						
							|  |  |  |         fnodes[fnodeTypesPlural[i]].push(stat); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Get the current number of listeners (which may change)
 | 
					
						
							|  |  |  |   // Emit events to each listener
 | 
					
						
							|  |  |  |   // Wait for all listeners to `next()` before continueing
 | 
					
						
							|  |  |  |   // (in theory this may avoid disk thrashing)
 | 
					
						
							| 
									
										
										
										
											2012-06-06 13:19:44 -06:00
										 |  |  |   function emitSingleEvents(emitter, path, stats, next, self) { | 
					
						
							| 
									
										
										
										
											2011-02-03 23:31:25 -07:00
										 |  |  |     var num = 1 + emitter.listeners(stats.type).length + emitter.listeners("node").length; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function nextWhenReady() { | 
					
						
							|  |  |  |       num -= 1; | 
					
						
							| 
									
										
										
										
											2012-06-06 13:19:44 -06:00
										 |  |  |       if (0 === num) { next.call(self); } | 
					
						
							| 
									
										
										
										
											2011-02-03 23:31:25 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     emitter.emit(stats.type, path, stats, nextWhenReady); | 
					
						
							|  |  |  |     emitter.emit("node", path, stats, nextWhenReady); | 
					
						
							|  |  |  |     nextWhenReady(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Since the risk for disk thrashing among anything
 | 
					
						
							|  |  |  |   // other than files is relatively low, all types are
 | 
					
						
							|  |  |  |   // emitted at once, but all must complete before advancing
 | 
					
						
							| 
									
										
										
										
											2012-06-06 13:19:44 -06:00
										 |  |  |   function emitPluralEvents(emitter, path, nodes, next, self) { | 
					
						
							| 
									
										
										
										
											2011-02-03 23:31:25 -07:00
										 |  |  |     var num = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function nextWhenReady() { | 
					
						
							|  |  |  |       num -= 1; | 
					
						
							| 
									
										
										
										
											2012-06-06 13:19:44 -06:00
										 |  |  |       if (0 === num) { next.call(self); } | 
					
						
							| 
									
										
										
										
											2011-02-03 23:31:25 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fnodeTypesPlural.concat(["nodes", "errors"]).forEach(function (fnodeType) { | 
					
						
							|  |  |  |       if (0 === nodes[fnodeType].length) { return; } | 
					
						
							|  |  |  |       num += emitter.listeners(fnodeType).length; | 
					
						
							|  |  |  |       emitter.emit(fnodeType, path, nodes[fnodeType], nextWhenReady); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     nextWhenReady(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   module.exports = { | 
					
						
							|  |  |  |     emitNodeType: emitSingleEvents, | 
					
						
							|  |  |  |     emitNodeTypeGroups: emitPluralEvents, | 
					
						
							|  |  |  |     isFnodeTypes: isFnodeTypes, | 
					
						
							|  |  |  |     fnodeTypes: fnodeTypes, | 
					
						
							|  |  |  |     fnodeTypesPlural: fnodeTypesPlural, | 
					
						
							|  |  |  |     sortFnodesByType: sortFnodesByType, | 
					
						
							|  |  |  |     createNodeGroups: createNodeGroups | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }()); |