{"version":3,"sources":["jsdelivr-header.js","/npm/token-bucket-calculator@0.0.3/dist/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,aACA,IAAI,UAAa,MAAQ,KAAK,WAAc,SAAU,EAAS,EAAY,EAAG,GAE1E,OAAO,IAAK,IAAM,EAAI,WAAU,SAAU,EAAS,GAC/C,SAAS,EAAU,GAAS,IAAM,EAAK,EAAU,KAAK,GAAS,CAAE,MAAO,GAAK,EAAO,EAAI,CAAE,CAC1F,SAAS,EAAS,GAAS,IAAM,EAAK,EAAiB,MAAE,GAAS,CAAE,MAAO,GAAK,EAAO,EAAI,CAAE,CAC7F,SAAS,EAAK,GAJlB,IAAe,EAIa,EAAO,KAAO,EAAQ,EAAO,QAJ1C,EAIyD,EAAO,MAJhD,aAAiB,EAAI,EAAQ,IAAI,GAAE,SAAU,GAAW,EAAQ,EAAQ,KAIjB,KAAK,EAAW,EAAW,CAC7G,GAAM,EAAY,EAAU,MAAM,EAAS,GAAc,KAAK,OAClE,GACJ,EACI,gBAAmB,MAAQ,KAAK,iBAAoB,SAAU,GAC9D,OAAQ,GAAO,EAAI,WAAc,EAAM,CAAE,QAAW,EACxD,EACA,OAAO,eAAe,QAAS,aAAc,CAAE,OAAO,IACtD,QAAQ,2BAAwB,EAChC,MAAM,UAAY,gBAAgB,QAAQ,cACpC,OAAS,gBAAgB,QAAQ,WACvC,MAAM,sBACF,WAAA,EAAY,WAAE,EAAU,WAAE,EAAU,iBAAE,EAAmB,MAAK,qBAAE,GAAuB,IACnF,KAAK,iCAA8B,EACnC,KAAK,WAAa,EAClB,KAAK,WAAa,EAClB,KAAK,iBAAmB,KAAK,qBAAqB,GAClD,KAAK,QAAU,EAAuB,KAAK,iBAAmB,EAC9D,KAAK,cAAe,EAAI,UAAU,UACtC,CACA,oBAAA,CAAqB,EAAmB,MACpC,MAAyB,QAArB,EACO,IAEmB,QAArB,EACE,IAEmB,OAArB,EACE,KAEmB,QAArB,EACE,MAGA,CAEf,CACA,gBAAA,CAAiB,EAAY,EAAmB,MAC5C,KAAK,WAAa,EAClB,KAAK,iBAAmB,KAAK,qBAAqB,EACtD,CACA,YAAA,CAAa,GACT,OAAO,UAAU,UAAM,OAAQ,GAAQ,YACnC,YAAyC,IAArC,KAAK,4BACG,KAAK,4BAA8B,KAAK,iBAAiB,GAGzD,KAAK,4BACT,KAAK,4BAA4B,MAAK,IAAM,KAAK,iBAAiB,IAE9E,GACJ,CACA,gBAAA,CAAiB,GACb,OAAO,UAAU,UAAM,OAAQ,GAAQ,YACnC,MAAM,EAAe,KAAK,WACpB,EAAsB,KAAK,iBACjC,KAAK,WAAW,EAAc,GAC9B,MAAM,EAAW,KAAK,0BAA0B,GAKhD,OAJiB,IAAb,UACM,EAAI,OAAO,SAAS,GAC1B,KAAK,WAAW,EAAc,IAE3B,KAAK,WAAW,EAC3B,GACJ,CACA,yBAAA,CAA0B,GACtB,GAAI,KAAK,QAAU,EAAQ,CACvB,MAAM,EAAmB,EAAS,KAAK,QACjC,EAAgB,KAAK,iBAAmB,KAAK,WACnD,OAAO,KAAK,KAAK,EAAmB,EACxC,CAEI,OAAO,CAEf,CACA,UAAA,CAAW,EAAa,KAAK,WAAY,EAAmB,KAAK,kBAC7D,MAAM,GAAU,EAAI,UAAU,WACxB,EAA0B,EAAU,KAAK,aAC/C,KAAK,gBAAgB,GACrB,MAAM,EAAoB,GAA2B,EAAa,GAClE,KAAK,WAAW,EACpB,CACA,eAAA,CAAgB,GACZ,KAAK,aAAe,CACxB,CACA,UAAA,CAAW,GACP,OAAQ,KAAK,QAAU,KAAK,IAAI,KAAK,WAAY,KAAK,QAAU,EACpE,CACA,UAAA,CAAW,GACP,OAAQ,KAAK,QAAU,KAAK,IAAI,EAAG,KAAK,QAAU,EACtD,EAEJ,QAAQ,sBAAwB","file":"/npm/token-bucket-calculator@0.0.3/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/token-bucket-calculator@0.0.3/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n};\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.TokenBucketCalculator = void 0;\r\nconst getMSec_1 = __importDefault(require(\"./getMSec\"));\r\nconst wait_1 = __importDefault(require(\"./wait\"));\r\nclass TokenBucketCalculator {\r\n    constructor({ bucketSize, fillAmount, fillIntervalUnit = 'sec', startBucketFirstFill = false, }) {\r\n        this.isRunningRemovingTokensTask = undefined;\r\n        this.bucketSize = bucketSize;\r\n        this.fillAmount = fillAmount;\r\n        this.fillIntervalMSec = this.calcFillIntervalMSec(fillIntervalUnit);\r\n        this.content = startBucketFirstFill ? this.fillIntervalMSec : 0;\r\n        this.lastFillMSec = (0, getMSec_1.default)();\r\n    }\r\n    calcFillIntervalMSec(fillIntervalUnit = 'ms') {\r\n        if (fillIntervalUnit === 'sec') {\r\n            return 1000;\r\n        }\r\n        else if (fillIntervalUnit === 'min') {\r\n            return 1000 * 60;\r\n        }\r\n        else if (fillIntervalUnit === 'hr') {\r\n            return 1000 * 60 * 60;\r\n        }\r\n        else if (fillIntervalUnit === 'day') {\r\n            return 1000 * 60 * 60 * 24;\r\n        }\r\n        else {\r\n            return 1;\r\n        }\r\n    }\r\n    changeFillAmount(fillAmount, fillIntervalUnit = 'ms') {\r\n        this.fillAmount = fillAmount;\r\n        this.fillIntervalMSec = this.calcFillIntervalMSec(fillIntervalUnit);\r\n    }\r\n    removeTokens(tokens) {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            if (this.isRunningRemovingTokensTask === undefined) {\r\n                return (this.isRunningRemovingTokensTask = this.removeTokensTask(tokens));\r\n            }\r\n            else {\r\n                return (this.isRunningRemovingTokensTask =\r\n                    this.isRunningRemovingTokensTask.then(() => this.removeTokensTask(tokens)));\r\n            }\r\n        });\r\n    }\r\n    removeTokensTask(tokens) {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            const nowFillAmout = this.fillAmount;\r\n            const nowFillIntervalMSec = this.fillIntervalMSec;\r\n            this.fillTokens(nowFillAmout, nowFillIntervalMSec);\r\n            const waitTime = this.calcTimeForRemovingTokens(tokens);\r\n            if (waitTime !== 0) {\r\n                yield (0, wait_1.default)(waitTime);\r\n                this.fillTokens(nowFillAmout, nowFillIntervalMSec);\r\n            }\r\n            return this.subContent(tokens);\r\n        });\r\n    }\r\n    calcTimeForRemovingTokens(tokens) {\r\n        if (this.content < tokens) {\r\n            const willRemoveTokens = tokens - this.content;\r\n            const msecPerAmount = this.fillIntervalMSec / this.fillAmount;\r\n            return Math.ceil(willRemoveTokens * msecPerAmount);\r\n        }\r\n        else {\r\n            return 0;\r\n        }\r\n    }\r\n    fillTokens(fillAmount = this.fillAmount, fillIntervalMSec = this.fillIntervalMSec) {\r\n        const nowMSec = (0, getMSec_1.default)();\r\n        const timeForAfterFillingMSec = nowMSec - this.lastFillMSec;\r\n        this.setLastFillMSec(nowMSec);\r\n        const tokenToFillAmount = timeForAfterFillingMSec * (fillAmount / fillIntervalMSec);\r\n        this.addContent(tokenToFillAmount);\r\n    }\r\n    setLastFillMSec(ms) {\r\n        this.lastFillMSec = ms;\r\n    }\r\n    addContent(tokens) {\r\n        return (this.content = Math.min(this.bucketSize, this.content + tokens));\r\n    }\r\n    subContent(tokens) {\r\n        return (this.content = Math.max(0, this.content - tokens));\r\n    }\r\n}\r\nexports.TokenBucketCalculator = TokenBucketCalculator;\r\n"]}