62 lines
2.0 KiB
JavaScript
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;
|
|
})();
|