diff --git a/lib/routes/db.js b/lib/routes/db.js index 7b5f01b..c84775a 100644 --- a/lib/routes/db.js +++ b/lib/routes/db.js @@ -87,6 +87,7 @@ module.exports = function(app, PouchDB) { if (req.query.feed === 'continuous' || req.query.feed === 'longpoll') { var heartbeatInterval; + var timeout; var heartbeat = (typeof req.query.heartbeat === 'number') ? req.query.heartbeat : 6000; var written = false; @@ -96,6 +97,9 @@ module.exports = function(app, PouchDB) { }, heartbeat); var cleanup = function () { + if (timeout) { + clearTimeout(timeout); + } if (heartbeatInterval) { clearInterval(heartbeatInterval); } @@ -117,6 +121,17 @@ module.exports = function(app, PouchDB) { } else { // longpoll // first check if there are >0. if so, return them immediately req.query.live = req.query.continuous = false; + if (req.query.timeout) { + timeout = setTimeout(function() { + written = true; + res.write(JSON.stringify({ + results: [], + last_seq: req.query.since + }) + '\n'); + res.end(); + cleanup(); + }, req.query.timeout); + } req.db.changes(req.query).on('complete', function (complete) { if (!complete.results) { // canceled, ignore @@ -128,7 +143,11 @@ module.exports = function(app, PouchDB) { cleanup(); } else { // do the longpolling req.query.live = req.query.continuous = true; + var changes = req.db.changes(req.query).on('change', function (change) { + if (written) { + return; + } written = true; res.write(JSON.stringify({ results: [change],