couchdb-worker
Advanced tools
Comparing version 1.0.1 to 1.1.0
@@ -30,4 +30,2 @@ /* | ||
var db = require('nano')(options.db); | ||
// check if document is processable, that is | ||
@@ -52,2 +50,14 @@ // * it has no worker status at all (no worker touched it ever) | ||
// initialize database connector | ||
var db = require('nano')(options.db); | ||
// initialize feed | ||
var feed = db.follow(options.follow); | ||
// context for processor function evaluation | ||
var ctx = { | ||
db: db, | ||
feed: feed | ||
}; | ||
function onchange(change) { | ||
@@ -60,6 +70,4 @@ var doc = change.doc; | ||
doc.worker_status[id].error = err; | ||
feed.emit('worker:error', err, doc); | ||
} else { | ||
doc.worker_status[id].status = 'complete'; | ||
feed.emit('worker:complete', doc); | ||
} | ||
@@ -72,3 +80,3 @@ | ||
doc._rev = body.rev; | ||
feed.emit('worker:committed', doc); | ||
feed.emit('worker:complete', doc); | ||
} | ||
@@ -79,3 +87,3 @@ | ||
if (typeof next === 'function') { | ||
next(err, doc); | ||
next.apply(ctx, [err, doc]); | ||
} | ||
@@ -98,3 +106,5 @@ }); | ||
if (err) { | ||
feed.emit('worker:error', err, doc); | ||
if (err.error !== 'conflict') { | ||
feed.emit('worker:error', err, doc); | ||
} | ||
return; | ||
@@ -105,11 +115,6 @@ } | ||
feed.emit('worker:triggered', doc); | ||
process.apply({}, [doc, ondone]); | ||
process.apply(ctx, [doc, ondone]); | ||
}); | ||
} | ||
// initialize feed | ||
var feed = db.follow(options.follow); | ||
// TODO: handle paused from outside in the meantime... | ||
@@ -116,0 +121,0 @@ feed.on('change', onchange); |
{ | ||
"name": "couchdb-worker", | ||
"description": "CouchDB worker module that manages state", | ||
"version": "1.0.1", | ||
"version": "1.1.0", | ||
"homepage": "https://github.com/jo/couchdb-worker", | ||
@@ -6,0 +6,0 @@ "author": { |
@@ -10,2 +10,3 @@ # couchdb-worker | ||
var worker = require('couchdb-worker'); | ||
var myWorker = worker.listen({ | ||
@@ -19,20 +20,13 @@ id: 'my-worker', | ||
}); | ||
myWorker.on('error', function(err) { | ||
console.error('Since Follow always retries on errors, this must be serious'); | ||
}); | ||
myWorker.on('worker:triggered', function(doc) { | ||
console.log('worker triggered: ', doc); | ||
}); | ||
myWorker.on('worker:completed', function(doc) { | ||
myWorker.on('worker:complete', function(doc) { | ||
console.log('worker completed: ', doc); | ||
}); | ||
myWorker.on('worker:committed', function(doc) { | ||
console.log('worker committed: ', doc); | ||
}); | ||
myWorker.on('worker:error', function(err, doc) { | ||
console.log('worker error: ', err, doc); | ||
}); | ||
// myWorker.status(); | ||
myWorker.pause(); | ||
myWorker.resume(); | ||
myWorker.stop(); | ||
@@ -62,5 +56,5 @@ ``` | ||
## Status | ||
* couchdb-worker stores its state inside the document in an object called `worker_status`. | ||
* Each worker manages its own state inside this object, eg `worker_status.myworker`. | ||
* The state can be `triggered`, `error` or `complete`. | ||
* couchdb-worker stores its status inside the document in an object called `worker_status`. | ||
* Each worker manages its own status inside this object, eg `worker_status.myworker`. | ||
* The status can be `triggered`, `error` or `complete`. | ||
* Only one worker can run at a time on one document. | ||
@@ -138,2 +132,3 @@ * You can store your own worker status information (a retry count for example) | ||
Copyright (c) 2012-2013 Johannes J. Schmidt, null2 GmbH | ||
Licensed under the MIT license. |
@@ -66,3 +66,3 @@ 'use strict'; | ||
this.url = url.resolve(server, this.dbname); | ||
nano.db.create(this.dbname, function(err) { | ||
@@ -90,2 +90,29 @@ if (err) { | ||
}, | ||
'process callback arguments': function(test) { | ||
test.expect(3); | ||
var w; | ||
function process(doc, next) { | ||
test.equal(typeof doc, 'object', 'doc should be an object'); | ||
test.equal(doc._id, 'mydoc', 'doc _id should be `mydoc`'); | ||
test.equal(typeof next, 'function', 'next should be a function'); | ||
w.stop(); | ||
test.done(); | ||
} | ||
w = worker.listen({ db: this.url, id: 'myworker', process: process }); | ||
this.db.insert({}, 'mydoc'); | ||
}, | ||
'next callback arguments': function(test) { | ||
test.expect(3); | ||
function process(doc, next) { | ||
next(null, function(err, doc) { | ||
test.ok(!err, 'error should be null'); | ||
test.equal(typeof doc, 'object', 'doc should be an object'); | ||
test.equal(doc._id, 'mydoc', 'doc _id should be `mydoc`'); | ||
w.stop(); | ||
test.done(); | ||
}); | ||
} | ||
var w = worker.listen({ db: this.url, id: 'myworker', process: process }); | ||
this.db.insert({}, 'mydoc'); | ||
}, | ||
'pause during process': function(test) { | ||
@@ -105,13 +132,4 @@ test.expect(2); | ||
}, | ||
'event worker:triggered': function(test) { | ||
test.expect(1); | ||
var w = worker.listen({ db: this.url, id: 'myworker', process: function() {} }); | ||
w.on('worker:triggered', function() { | ||
test.ok(true, 'worker:triggered event should have been fired'); | ||
test.done(); | ||
}); | ||
this.db.insert({}); | ||
}, | ||
'event worker:committed': function(test) { | ||
test.expect(1); | ||
'event worker:complete': function(test) { | ||
test.expect(3); | ||
function process(doc, next) { | ||
@@ -123,24 +141,10 @@ next(null, function() { | ||
var w = worker.listen({ db: this.url, id: 'myworker', process: process }); | ||
w.on('worker:committed', function() { | ||
test.ok(true, 'worker:committed event should have been fired'); | ||
w.on('worker:complete', function(doc) { | ||
test.ok(true, 'worker:complete event should have been fired'); | ||
test.equal(typeof doc, 'object', 'doc should be an object'); | ||
test.equal(doc._id, 'mydoc', 'doc _id should be `mydoc`'); | ||
test.done(); | ||
}); | ||
this.db.insert({}); | ||
this.db.insert({}, 'mydoc'); | ||
}, | ||
'event worker:error': function(test) { | ||
test.expect(1); | ||
function process(doc, next) { | ||
// let the status update fail | ||
delete doc._rev; | ||
next(null, function() { | ||
w.stop(); | ||
}); | ||
} | ||
var w = worker.listen({ db: this.url, id: 'myworker', process: process }); | ||
w.on('worker:error', function() { | ||
test.ok(true, 'worker:error event should have been fired'); | ||
test.done(); | ||
}); | ||
this.db.insert({}); | ||
}, | ||
'worker status error info': function(test) { | ||
@@ -161,13 +165,20 @@ test.expect(4); | ||
}, | ||
'process arguments': function(test) { | ||
test.expect(3); | ||
var w; | ||
'event worker:error': function(test) { | ||
test.expect(5); | ||
function process(doc, next) { | ||
// let the status update fail | ||
delete doc._rev; | ||
next(null, function() { | ||
w.stop(); | ||
}); | ||
} | ||
var w = worker.listen({ db: this.url, id: 'myworker', process: process }); | ||
w.on('worker:error', function(err, doc) { | ||
test.ok(true, 'worker:error event should have been fired'); | ||
test.equal(typeof err, 'object', 'err should be an object'); | ||
test.equal(err.error, 'conflict', 'err should be a `conflict`'); | ||
test.equal(typeof doc, 'object', 'doc should be an object'); | ||
test.equal(doc._id, 'mydoc', 'doc should have proper _id'); | ||
test.equal(typeof next, 'function', 'next should be a function'); | ||
w.stop(); | ||
test.equal(doc._id, 'mydoc', 'doc _id should be `mydoc`'); | ||
test.done(); | ||
} | ||
w = worker.listen({ db: this.url, id: 'myworker', process: process }); | ||
}); | ||
this.db.insert({}, 'mydoc'); | ||
@@ -174,0 +185,0 @@ }, |
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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
18886
403
0
131