dd-trace
Version:
Datadog APM tracing client for JavaScript
1 lines • 3.81 kB
JavaScript
(()=>{var t={"./limiter/lib/clock.js"(t){t.exports=function(){if("u">typeof process&&process.hrtime){var t=process.hrtime();return 1e3*t[0]+Math.floor(t[1]/1e6)}return new Date().getTime()}},"./limiter/lib/rateLimiter.js"(t,e,n){var i=n("./limiter/lib/tokenBucket.js"),r=n("./limiter/lib/clock.js"),RateLimiter=function(t,e,n){this.tokenBucket=new i(t,t,e,null),this.tokenBucket.content=t,this.curIntervalStart=r(),this.tokensThisInterval=0,this.fireImmediately=n};RateLimiter.prototype={tokenBucket:null,curIntervalStart:0,tokensThisInterval:0,fireImmediately:!1,removeTokens:function(t,e){if(t>this.tokenBucket.bucketSize)return process.nextTick(e.bind(null,"Requested tokens "+t+" exceeds maximum tokens per interval "+this.tokenBucket.bucketSize,null)),!1;var n=this,i=r();if((i<this.curIntervalStart||i-this.curIntervalStart>=this.tokenBucket.interval)&&(this.curIntervalStart=i,this.tokensThisInterval=0),t>this.tokenBucket.tokensPerInterval-this.tokensThisInterval)return this.fireImmediately?process.nextTick(e.bind(null,null,-1)):setTimeout(function(){n.tokenBucket.removeTokens(t,afterTokensRemoved)},Math.ceil(this.curIntervalStart+this.tokenBucket.interval-i)),!1;return this.tokenBucket.removeTokens(t,afterTokensRemoved);function afterTokensRemoved(i,r){if(i)return e(i,null);n.tokensThisInterval+=t,e(null,r)}},tryRemoveTokens:function(t){if(t>this.tokenBucket.bucketSize)return!1;var e=r();if((e<this.curIntervalStart||e-this.curIntervalStart>=this.tokenBucket.interval)&&(this.curIntervalStart=e,this.tokensThisInterval=0),t>this.tokenBucket.tokensPerInterval-this.tokensThisInterval)return!1;var n=this.tokenBucket.tryRemoveTokens(t);return n&&(this.tokensThisInterval+=t),n},getTokensRemaining:function(){return this.tokenBucket.drip(),this.tokenBucket.content}},t.exports=RateLimiter},"./limiter/lib/tokenBucket.js"(t){var TokenBucket=function(t,e,n,i){if(this.bucketSize=t,this.tokensPerInterval=e,"string"==typeof n)switch(n){case"sec":case"second":this.interval=1e3;break;case"min":case"minute":this.interval=6e4;break;case"hr":case"hour":this.interval=36e5;break;case"day":this.interval=864e5;break;default:throw Error("Invaid interval "+n)}else this.interval=n;this.parentBucket=i,this.content=0,this.lastDrip=+new Date};TokenBucket.prototype={bucketSize:1,tokensPerInterval:1,interval:1e3,parentBucket:null,content:0,lastDrip:0,removeTokens:function(t,e){var n=this;if(!this.bucketSize)return process.nextTick(e.bind(null,null,t,1/0)),!0;if(t>this.bucketSize)return process.nextTick(e.bind(null,"Requested tokens "+t+" exceeds bucket size "+this.bucketSize,null)),!1;if(this.drip(),t>this.content)return comeBackLater();if(this.parentBucket)return this.parentBucket.removeTokens(t,function(i,r){return i?e(i,null):t>n.content?comeBackLater():void(n.content-=t,e(null,Math.min(r,n.content)))});return this.content-=t,process.nextTick(e.bind(null,null,this.content)),!0;function comeBackLater(){return setTimeout(function(){n.removeTokens(t,e)},Math.ceil((t-n.content)*(n.interval/n.tokensPerInterval))),!1}},tryRemoveTokens:function(t){return!this.bucketSize||!(t>this.bucketSize)&&(this.drip(),!(t>this.content)&&(!this.parentBucket||!!this.parentBucket.tryRemoveTokens(t))&&(this.content-=t,!0))},drip:function(){if(!this.tokensPerInterval){this.content=this.bucketSize;return}var t=+new Date,e=Math.max(t-this.lastDrip,0);this.lastDrip=t;var n=e*(this.tokensPerInterval/this.interval);this.content=Math.min(this.content+n,this.bucketSize)}},t.exports=TokenBucket}},e={};function __webpack_require__(n){var i=e[n];if(void 0!==i)return i.exports;var r=e[n]={exports:{}};return t[n](r,r.exports,__webpack_require__),r.exports}var n={};n.RateLimiter=__webpack_require__("./limiter/lib/rateLimiter.js"),n.TokenBucket=__webpack_require__("./limiter/lib/tokenBucket.js"),module.exports=n})();