summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2012-03-01 16:23:15 +0100
committerXavier Morel <xmo@openerp.com>2012-03-01 16:23:15 +0100
commit190eb339faeed6755de7b77b3f0152a5e3c39c8e (patch)
treea1541e644f636175092eec6170c611bb383ecffd /addons/web/static/src
parent8225ef6c995ae302b61020d27c14e7bfbb11109d (diff)
[ADD] replacement for current aborter/abort_last hack: UDP-style handler of mis-ordered requests
* By default, ignores (refuses to resolve) mis-ordered request when they come back * Optionally, fails them bzr revid: xmo@openerp.com-20120301152315-67kbkdwpy7cdh25y
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/data.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index 27d4562aafb..55e200a205f 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -1190,6 +1190,46 @@ openerp.web.CompoundDomain = openerp.web.Class.extend({
return this.__eval_context;
}
});
+
+openerp.web.DropMisordered = openerp.web.Class.extend(/** @lends openerp.web.DropMisordered# */{
+ /**
+ * @constructs openerp.web.DropMisordered
+ * @extends openerp.web.Class
+ *
+ * @param {Boolean} [failMisordered=false] whether mis-ordered responses should be failed or just ignored
+ */
+ init: function (failMisordered) {
+ // local sequence number, for requests sent
+ this.lsn = 0;
+ // remote sequence number, seqnum of last received request
+ this.rsn = -1;
+ this.failMisordered = failMisordered || false;
+ },
+ /**
+ * Adds a deferred (usually an async request) to the sequencer
+ *
+ * @param {$.Deferred} deferred to ensure add
+ * @returns {$.Deferred}
+ */
+ add: function (deferred) {
+ var res = $.Deferred();
+
+ var self = this, seq = this.lsn++;
+ deferred.then(function () {
+ if (seq > self.rsn) {
+ self.rsn = seq;
+ res.resolve.apply(res, arguments);
+ } else if (self.failMisordered) {
+ res.reject();
+ }
+ }, function () {
+ res.reject.apply(res, arguments);
+ });
+
+ return res.promise();
+ }
+});
+
};
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: