UNPKG

5.54 kBSource Map (JSON)View Raw
1{"version":3,"file":"throughput.js","sourceRoot":"","sources":["throughput.ts"],"names":[],"mappings":"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","sourcesContent":["import { create as createLogger } from '../common/log'\nconst log = createLogger('throughput-middleware')\nimport { Middleware, MiddlewareCallback, MiddlewareServices, Pipelines } from '../types/middleware'\nimport { AccountInfo } from '../types/accounts'\nimport TokenBucket from '../lib/token-bucket'\nimport * as IlpPacket from 'ilp-packet'\nconst { InsufficientLiquidityError } = IlpPacket.Errors\n\nconst DEFAULT_REFILL_PERIOD = 1000 // 1 second\n\nexport default class ThroughputMiddleware implements Middleware {\n private getInfo: (accountId: string) => AccountInfo\n\n constructor (opts: {}, { getInfo }: MiddlewareServices) {\n this.getInfo = getInfo\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 if (accountInfo.throughput) {\n const {\n refillPeriod = DEFAULT_REFILL_PERIOD,\n incomingAmount = false,\n outgoingAmount = false\n } = accountInfo.throughput || {}\n\n if (incomingAmount) {\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 incomingBucket = new TokenBucket({ refillPeriod, refillCount: Number(incomingAmount) })\n log.trace('created incoming amount limit token bucket for account. accountId=%s refillPeriod=%s incomingAmount=%s', accountId, refillPeriod, incomingAmount)\n\n pipelines.incomingData.insertLast({\n name: 'throughput',\n method: async (data: Buffer, next: MiddlewareCallback<Buffer, Buffer>) => {\n if (data[0] === IlpPacket.Type.TYPE_ILP_PREPARE) {\n const parsedPacket = IlpPacket.deserializeIlpPrepare(data)\n\n // TODO: Do we need a BigNumber-based token bucket?\n if (!incomingBucket.take(Number(parsedPacket.amount))) {\n throw new InsufficientLiquidityError('exceeded money bandwidth, throttling.')\n }\n\n return next(data)\n } else {\n return next(data)\n }\n }\n })\n }\n\n if (outgoingAmount) {\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 incomingBucket = new TokenBucket({ refillPeriod, refillCount: Number(outgoingAmount) })\n log.trace('created outgoing amount limit token bucket for account. accountId=%s refillPeriod=%s outgoingAmount=%s', accountId, refillPeriod, outgoingAmount)\n\n pipelines.outgoingData.insertLast({\n name: 'throughput',\n method: async (data: Buffer, next: MiddlewareCallback<Buffer, Buffer>) => {\n if (data[0] === IlpPacket.Type.TYPE_ILP_PREPARE) {\n const parsedPacket = IlpPacket.deserializeIlpPrepare(data)\n\n // TODO: Do we need a BigNumber-based token bucket?\n if (!incomingBucket.take(Number(parsedPacket.amount))) {\n throw new InsufficientLiquidityError('exceeded money bandwidth, throttling.')\n }\n\n return next(data)\n } else {\n return next(data)\n }\n }\n })\n }\n }\n }\n}\n"]}
\No newline at end of file