UNPKG

4.21 kBSource Map (JSON)View Raw
1{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["rate-limit.ts"],"names":[],"mappings":";;AAAA,wCAAuC;AACvC,uCAAsD;AACtD,MAAM,GAAG,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAA;AAQjD,sDAA6C;AAE7C,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC,MAAM,CAAA;AAE7C,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAA;AACvC,MAAM,oBAAoB,GAAG,KAAK,CAAA;AAElC,MAAqB,mBAAmB;IAItC,YAAa,IAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAsB;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAE,SAAoB,EAAE,SAAiB;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC3C,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,SAAS,CAAC,CAAA;SAC3E;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,IAAI,EAAE,CAAA;QAC7C,MAAM,EACJ,YAAY,GAAG,qBAAqB,EACpC,WAAW,GAAG,oBAAoB,EACnC,GAAG,SAAS,CAAA;QAEb,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,WAAW,CAAA;QAElD,GAAG,CAAC,KAAK,CAAC,2FAA2F,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;QAItJ,MAAM,MAAM,GAAG,IAAI,sBAAW,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEvE,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC;YAChC,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,EAAE,IAAY,EAAE,IAAwC,EAAE,EAAE;gBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;oBAClB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;oBACvE,MAAM,IAAI,gBAAgB,CAAC,gCAAgC,CAAC,CAAA;iBAC7D;gBAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;SACF,CAAC,CAAA;QAEF,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;YACjC,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,EAAE,MAAc,EAAE,IAAsC,EAAE,EAAE;gBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;oBAClB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;oBACrE,MAAM,IAAI,gBAAgB,CAAC,gCAAgC,CAAC,CAAA;iBAC7D;gBAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;YACrB,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;CACF;AArDD,sCAqDC","sourcesContent":["import * as IlpPacket from 'ilp-packet'\nimport { create as createLogger } from '../common/log'\nconst log = createLogger('rate-limit-middleware')\nimport {\n Middleware,\n MiddlewareCallback,\n MiddlewareServices,\n Pipelines\n} from '../types/middleware'\nimport { AccountInfo } from '../types/accounts'\nimport TokenBucket from '../lib/token-bucket'\nimport Stats from '../services/stats'\nconst { RateLimitedError } = IlpPacket.Errors\n\nconst DEFAULT_REFILL_PERIOD = 60 * 1000 // 1 minute\nconst DEFAULT_REFILL_COUNT = 10000\n\nexport default class RateLimitMiddleware implements Middleware {\n private getInfo: (accountId: string) => AccountInfo\n private stats: Stats\n\n constructor (opts: {}, { getInfo, stats }: MiddlewareServices) {\n this.getInfo = getInfo\n this.stats = stats\n }\n\n async applyToPipelines (pipelines: Pipelines, accountId: string) {\n const accountInfo = this.getInfo(accountId)\n if (!accountInfo) {\n throw new Error('could not load info for account. accountId=' + accountId)\n }\n\n const rateLimit = accountInfo.rateLimit || {}\n const {\n refillPeriod = DEFAULT_REFILL_PERIOD,\n refillCount = DEFAULT_REFILL_COUNT\n } = rateLimit\n\n const capacity = rateLimit.capacity || refillCount\n\n log.trace('created token bucket for account. accountId=%s refillPeriod=%s refillCount=%s capacity=%s', accountId, refillPeriod, refillCount, capacity)\n\n // TODO: When we add the ability to update middleware, our state will get\n // reset every update, which may not be desired.\n const bucket = new TokenBucket({ refillPeriod, refillCount, capacity })\n\n pipelines.incomingData.insertLast({\n name: 'rateLimit',\n method: async (data: Buffer, next: MiddlewareCallback<Buffer, Buffer>) => {\n if (!bucket.take()) {\n this.stats.rateLimitedPackets.increment({ accountId, accountInfo }, {})\n throw new RateLimitedError('too many requests, throttling.')\n }\n\n return next(data)\n }\n })\n\n pipelines.incomingMoney.insertLast({\n name: 'rateLimit',\n method: async (amount: string, next: MiddlewareCallback<string, void>) => {\n if (!bucket.take()) {\n this.stats.rateLimitedMoney.increment({ accountId, accountInfo }, {})\n throw new RateLimitedError('too many requests, throttling.')\n }\n\n return next(amount)\n }\n })\n }\n}\n"]}
\No newline at end of file