cumberbatch
Advanced tools
Comparing version 0.2.0 to 0.2.1
@@ -10,2 +10,3 @@ var fs = require('fs'); | ||
.on('data', function(data) { | ||
// console.log('--', filename, data.length); | ||
hasher.update(data); | ||
@@ -12,0 +13,0 @@ }) |
@@ -62,8 +62,14 @@ var oid = require('oid'); | ||
GlobEmitter.prototype.trigger = function(globData) { | ||
var shouldSetTimeout = false; | ||
if (!this._nextEvent) { | ||
this._nextEvent = { | ||
globs: {} | ||
globs: {}, | ||
startTime: Date.now() | ||
}; | ||
} else { | ||
shouldSetTimeout = true; | ||
} else if (Date.now() - this._nextEvent.startTime < this._options.debounceMs){ | ||
clearTimeout(this._nextEvent.timeout); | ||
shouldSetTimeout = true; | ||
} | ||
@@ -75,3 +81,5 @@ | ||
this._nextEvent.timeout = setTimeout(this._bound_emitEvent, this._options.debounceMs); | ||
if (shouldSetTimeout) { | ||
this._nextEvent.timeout = setTimeout(this._bound_emitEvent, this._options.debounceMs); | ||
} | ||
}; | ||
@@ -78,0 +86,0 @@ |
@@ -50,2 +50,3 @@ var cluster = require('cluster'); | ||
this._hasherProcesses = []; | ||
this._hasherProcessesPendingFiles = []; | ||
if (cluster.isMaster && this._options.clusterProcesses > 0) { | ||
@@ -62,11 +63,24 @@ cluster.setupMaster({ | ||
cluster.on('online', function(worker) { | ||
var workerIdx = self._hasherProcesses.length; | ||
self._hasherProcesses.push(worker); | ||
self._hasherProcessesPendingFiles[workerIdx] = 0; | ||
worker.on('message', function(msg) { | ||
var callback = self._workerCallbacks[msg.filename]; | ||
if (typeof callback === 'undefined') return; | ||
delete self._workerCallbacks[msg.filename]; | ||
if (msg.pong === true) { | ||
// make another slot on the worker available | ||
self._markWorkerProcessingFileComplete(workerIdx); | ||
} else { | ||
var callback = self._workerCallbacks[msg.filename]; | ||
if (typeof callback === 'undefined') return; | ||
delete self._workerCallbacks[msg.filename]; | ||
callback(msg.hash); | ||
callback(msg.hash); | ||
} | ||
}); | ||
var sendPing = function() { | ||
worker.send({ping: true}); | ||
}; | ||
setInterval(sendPing, 5000); | ||
sendPing(); | ||
}); | ||
@@ -395,5 +409,29 @@ } | ||
Hasher.prototype._markWorkerProcessingFileComplete = function(idx) { | ||
if (this._hasherProcessesPendingFiles[idx] > 0) { | ||
this._hasherProcessesPendingFiles[idx]--; | ||
} | ||
}; | ||
Hasher.prototype._markWorkerProcessingFile = function(idx) { | ||
this._hasherProcessesPendingFiles[idx]++; | ||
}; | ||
Hasher.prototype._workerIsAvailable = function (idx) { | ||
return this._hasherProcessesPendingFiles[idx] < this._options.parallelHashers; | ||
}; | ||
Hasher.prototype._selectWorker = function () { | ||
var workerIdx = Math.floor(Math.random() * this._hasherProcesses.length); | ||
return this._hasherProcesses[workerIdx]; | ||
if (this._hasherProcesses.length === 0) { | ||
return undefined; | ||
} | ||
for (var i = 0; i < 5; i++) { | ||
var workerIdx = Math.floor(Math.random() * this._hasherProcesses.length); | ||
if (this._workerIsAvailable(workerIdx)) { | ||
return workerIdx; | ||
} | ||
} | ||
return undefined; | ||
}; | ||
@@ -411,4 +449,19 @@ | ||
} | ||
var workerIdx = self._selectWorker(); | ||
var workerTimeout; | ||
var processed = false; | ||
var hasherCallback = function(hash) { | ||
if (processed === true) { | ||
return; | ||
} | ||
processed = true; | ||
if (workerTimeout !== undefined) { | ||
// worker finished before the timeout, mark this complete | ||
self._markWorkerProcessingFileComplete(workerIdx); | ||
clearTimeout(workerTimeout); | ||
workerTimeout = undefined; | ||
} | ||
delete self._enqueuedFiles[filename]; | ||
@@ -419,5 +472,15 @@ defer.resolve(hash); | ||
if (self._hasherProcesses.length) { | ||
var onTimeout = function() { | ||
clearTimeout(workerTimeout); | ||
workerTimeout = undefined; | ||
FileHash.generate(filename, hasherCallback); | ||
}; | ||
if (workerIdx !== undefined) { | ||
self._markWorkerProcessingFile(workerIdx); | ||
var worker = self._hasherProcesses[workerIdx]; | ||
self._workerCallbacks[filename] = hasherCallback; | ||
self._selectWorker().send({filename: filename}); | ||
worker.send({filename: filename}); | ||
workerTimeout = setTimeout(onTimeout, 5000); | ||
} else { | ||
@@ -424,0 +487,0 @@ FileHash.generate(filename, hasherCallback); |
@@ -8,9 +8,15 @@ var cluster = require('cluster'); | ||
process.on('message', function(msg) { | ||
FileHash.generate(msg.filename, function (hash) { | ||
if (msg.ping === true) { | ||
process.send({ | ||
filename: msg.filename, | ||
hash: hash | ||
}) | ||
}); | ||
pong: true | ||
}); | ||
} else { | ||
FileHash.generate(msg.filename, function (hash) { | ||
process.send({ | ||
filename: msg.filename, | ||
hash: hash | ||
}) | ||
}); | ||
} | ||
}) | ||
} |
{ | ||
"name": "cumberbatch", | ||
"description": "crazy watcher stuff", | ||
"version": "0.2.0", | ||
"version": "0.2.1", | ||
"homepage": "https://github.com/azulus/cumberbatch", | ||
@@ -26,3 +26,4 @@ "authors": [ | ||
"devDependencies": { | ||
"grunt": "*" | ||
"grunt": "*", | ||
"mkdirp": "*" | ||
}, | ||
@@ -29,0 +30,0 @@ "scripts": {}, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
53109
12
1529
2
6