From 9beb61c799532a77d213ecaac8b7cc1546d148e7 Mon Sep 17 00:00:00 2001 From: Jaye Heffernan Date: Wed, 26 Sep 2018 16:28:57 +1000 Subject: [PATCH 1/2] Post a timer without overwrite This adds support to the `.post()` method to only post the timer if it doesn't already exist. This is useful for implementing application logic where the timer must fire after `delay` milliseconds, or sooner if the timer was already set (the current behaviour is to always overwrite and extend the timer). --- lib/dtimer.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/dtimer.js b/lib/dtimer.js index 4bd256a..0c257a5 100644 --- a/lib/dtimer.js +++ b/lib/dtimer.js @@ -209,13 +209,20 @@ DTimer.prototype.leave = function (cb) { .nodeify(cb); }; -DTimer.prototype.post = function (ev, delay, cb) { +DTimer.prototype.post = function (ev, delay, overwrite, cb) { var self = this; var evId; if (typeof delay !== 'number') { throw new Error('delay argument must be of type number'); } + if (typeof overwrite === 'function') { + cb = overwrite; + overwrite = undefined; + } + if (overwrite === undefined) { + overwrite = true; + } // Copy event. ev = JSON.parse(JSON.stringify(ev)); @@ -245,9 +252,14 @@ DTimer.prototype.post = function (ev, delay, cb) { return this._redisTime() .then(function (now) { - return self._pub.multi() - .zadd(self._keys.ei, now+delay, evId) - .hset(self._keys.ed, evId, msg) + var zaddArgs = [ self._keys.ei, now+delay, evId ]; + if (!overwrite) { + zaddArgs.unshift('NX'); + } + var multi = self._pub.multi() + return multi + .zadd.apply(multi, zaddArgs) + [overwrite ? 'hset' : 'hsetnx'](self._keys.ed, evId, msg) .evalsha( scripts.update.sha, 5, From 683cee89652194d13e3de34cd088d9c3d4a0c02c Mon Sep 17 00:00:00 2001 From: Jaye Heffernan Date: Tue, 2 Oct 2018 12:15:20 +1000 Subject: [PATCH 2/2] Fix non-overwriting timers I had the 'NX' option in the wrong place, so that was not working at all. I've also broken out the logic for overwriting the delay time and overwriting the actual message into two separate options. --- lib/dtimer.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/dtimer.js b/lib/dtimer.js index 0c257a5..066ac4c 100644 --- a/lib/dtimer.js +++ b/lib/dtimer.js @@ -209,20 +209,24 @@ DTimer.prototype.leave = function (cb) { .nodeify(cb); }; -DTimer.prototype.post = function (ev, delay, overwrite, cb) { +DTimer.prototype.post = function (ev, delay, opts, cb) { var self = this; var evId; if (typeof delay !== 'number') { throw new Error('delay argument must be of type number'); } - if (typeof overwrite === 'function') { - cb = overwrite; - overwrite = undefined; + + // Parse the options + if (typeof opts === 'function') { + cb = opts; + opts = undefined; } - if (overwrite === undefined) { - overwrite = true; + if (opts === undefined) { + opts = {}; } + var updateTime = opts.updateTime == null ? true : opts.updateTime; + var updateMessage = opts.updateMessage == null ? true : opts.updateMessage; // Copy event. ev = JSON.parse(JSON.stringify(ev)); @@ -253,13 +257,14 @@ DTimer.prototype.post = function (ev, delay, overwrite, cb) { return this._redisTime() .then(function (now) { var zaddArgs = [ self._keys.ei, now+delay, evId ]; - if (!overwrite) { - zaddArgs.unshift('NX'); + if (!updateTime) { + zaddArgs.splice(1, 0, 'NX'); } var multi = self._pub.multi() return multi .zadd.apply(multi, zaddArgs) - [overwrite ? 'hset' : 'hsetnx'](self._keys.ed, evId, msg) + [updateMessage ? 'hset' : 'hsetnx'](self._keys.ed, evId, msg) + .hsetnx(self._keys.ed, evId, msg) .evalsha( scripts.update.sha, 5,