odoo/addons/bus/static/src/js/bus.js

62 lines
2.0 KiB
JavaScript

(function() {
var bus = openerp.bus = {};
bus.ERROR_DELAY = 10000;
bus.Bus = openerp.Widget.extend({
init: function(){
this._super();
this.options = {};
this.activated = false;
this.channels = [];
this.last = 0;
this.stop = false;
},
start_polling: function(){
if(!this.activated){
this.poll();
this.stop = false;
}
},
stop_polling: function(){
this.activated = false;
this.stop = true;
this.channels = [];
},
poll: function() {
var self = this;
self.activated = true;
var data = {'channels': self.channels, 'last': self.last, 'options' : self.options};
openerp.session.rpc('/longpolling/poll', data, {shadow : true}).then(function(result) {
_.each(result, _.bind(self.on_notification, self));
if(!self.stop){
self.poll();
}
}, function(unused, e) {
// no error popup if request is interrupted or fails for any reason
e.preventDefault();
// random delay to avoid massive longpolling
setTimeout(_.bind(self.poll, self), bus.ERROR_DELAY + (Math.floor((Math.random()*20)+1)*1000));
});
},
on_notification: function(notification) {
if (notification.id > this.last) {
this.last = notification.id;
}
this.trigger("notification", [notification.channel, notification.message]);
},
add_channel: function(channel){
if(!_.contains(this.channels, channel)){
this.channels.push(channel);
}
},
delete_channel: function(channel){
this.channels = _.without(this.channels, channel);
},
});
// singleton
bus.bus = new bus.Bus();
return bus;
})();