Path: blob/master/webroot/rsrc/js/core/ShapedRequest.js
12241 views
/**1* @requires javelin-install2* javelin-util3* javelin-request4* javelin-router5* @provides phabricator-shaped-request6* @javelin7*/89/**10* Send requests with rate limiting and retries, in response to some application11* trigger. This is used to implement comment previews in Differential and12* Maniphest.13*/14JX.install('PhabricatorShapedRequest', {1516construct : function(uri, callback, data_callback) {17this._uri = uri;18this._callback = callback;19this._dataCallback = data_callback;20},2122events : ['error'],2324members : {25_callback : null,26_dataCallback : null,27_request : null,28_min : null,29_defer : null,30_last : null,31start : function() {32this.trigger();33},3435trigger : function() {3637clearTimeout(this._defer);38var data = this._dataCallback();3940// Waiting on a request, rate-limit.41var waiting = (this._request);4243// Just got a request back, rate-limit.44var recent = (this._min && (new Date().getTime() < this._min));4546if (!waiting && !recent && this.shouldSendRequest(this._last, data)) {47this._last = data;48this._request = new JX.Request(this._uri, JX.bind(this, function(r) {49this._callback(r);5051this._min = new Date().getTime() + this.getRateLimit();52clearTimeout(this._defer);53this._defer = setTimeout(54JX.bind(this, this.trigger),55this.getRateLimit()56);57}));58this._request.listen('error', JX.bind(this, function(error) {59this.invoke('error', error, this);60}));61this._request.listen('finally', JX.bind(this, function() {62this._request = null;63}));64this._request.setData(data);65this._request.setTimeout(this.getRequestTimeout());6667var routable = this._request.getRoutable();6869routable70.setType('draft')71.setPriority(750);7273JX.Router.getInstance().queue(routable);74} else {75this._defer = setTimeout(76JX.bind(this, this.trigger),77this.getFrequency()78);79}80},8182shouldSendRequest : function(last, data) {83if (data === null) {84return false;85}8687if (last === null) {88return true;89}9091for (var k in last) {92if (data[k] !== last[k]) {93return true;94}95}96return false;97}9899},100101properties : {102rateLimit : 500,103frequency : 1000,104requestTimeout : 20000105}106});107108109