UNPKG

14.8 kBSource Map (JSON)View Raw
1{"version":3,"file":"middleware-manager.js","sourceRoot":"","sources":["middleware-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import reduct = require('reduct')\n\nimport { loadModuleOfType, composeMiddleware } from '../lib/utils'\nimport { create as createLogger } from '../common/log'\nconst log = createLogger('middleware-manager')\n\nimport Config from './config'\nimport Accounts from './accounts'\nimport Core from './core'\nimport Stats from './stats'\nimport {\n Middleware,\n MiddlewareDefinition,\n MiddlewareMethod,\n MiddlewareConstructor,\n Pipeline,\n Pipelines\n} from '../types/middleware'\nimport { PluginInstance, DataHandler, MoneyHandler } from '../types/plugin'\nimport MiddlewarePipeline from '../lib/middleware-pipeline'\nimport { Errors } from 'ilp-packet'\nconst { codes, UnreachableError } = Errors\n\ninterface VoidHandler {\n (dummy: void): Promise<void>\n}\n\nconst BUILTIN_MIDDLEWARES: { [key: string]: MiddlewareDefinition } = {\n errorHandler: {\n type: 'error-handler'\n },\n rateLimit: {\n type: 'rate-limit'\n },\n maxPacketAmount: {\n type: 'max-packet-amount'\n },\n throughput: {\n type: 'throughput'\n },\n balance: {\n type: 'balance'\n },\n deduplicate: {\n type: 'deduplicate'\n },\n expire: {\n type: 'expire'\n },\n validateFulfillment: {\n type: 'validate-fulfillment'\n },\n stats: {\n type: 'stats'\n },\n alert: {\n type: 'alert'\n }\n}\n\nexport default class MiddlewareManager {\n protected config: Config\n protected accounts: Accounts\n protected core: Core\n protected middlewares: { [key: string]: Middleware }\n protected stats: Stats\n private startupHandlers: Map<string, VoidHandler> = new Map()\n private teardownHandlers: Map<string, VoidHandler> = new Map()\n private outgoingDataHandlers: Map<string, DataHandler> = new Map()\n private outgoingMoneyHandlers: Map<string, MoneyHandler> = new Map()\n private started: boolean = false\n\n constructor (deps: reduct.Injector) {\n this.config = deps(Config)\n this.accounts = deps(Accounts)\n this.core = deps(Core)\n this.stats = deps(Stats)\n\n const disabledMiddlewareConfig: string[] = this.config.disableMiddleware || []\n const customMiddlewareConfig: { [key: string]: MiddlewareDefinition } = this.config.middlewares || {}\n\n this.middlewares = {}\n\n for (const name of Object.keys(BUILTIN_MIDDLEWARES)) {\n if (disabledMiddlewareConfig.includes(name)) {\n continue\n }\n\n this.middlewares[name] = this.construct(name, BUILTIN_MIDDLEWARES[name])\n }\n\n for (const name of Object.keys(customMiddlewareConfig)) {\n if (this.middlewares[name]) {\n throw new Error('custom middleware has same name as built-in middleware. name=' + name)\n }\n\n this.middlewares[name] = this.construct(name, customMiddlewareConfig[name])\n }\n }\n\n construct (name: string, definition: MiddlewareDefinition): Middleware {\n // Custom middleware\n const Middleware: MiddlewareConstructor =\n loadModuleOfType('middleware', definition.type)\n\n return new Middleware(definition.options || {}, {\n getInfo: accountId => this.accounts.getInfo(accountId),\n getOwnAddress: () => this.accounts.getOwnAddress(),\n sendData: this.sendData.bind(this),\n sendMoney: this.sendMoney.bind(this),\n stats: this.stats\n })\n }\n\n async setup () {\n for (const accountId of this.accounts.getAccountIds()) {\n const plugin = this.accounts.getPlugin(accountId)\n\n await this.addPlugin(accountId, plugin)\n }\n }\n\n /**\n * Executes middleware hooks for connector startup.\n *\n * This should be called after the plugins are connected\n */\n async startup () {\n this.started = true\n for (const handler of this.startupHandlers.values()) {\n await handler(undefined)\n }\n }\n\n async addPlugin (accountId: string, plugin: PluginInstance) {\n const pipelines: Pipelines = {\n startup: new MiddlewarePipeline<void, void>(),\n teardown: new MiddlewarePipeline<void, void>(),\n incomingData: new MiddlewarePipeline<Buffer, Buffer>(),\n incomingMoney: new MiddlewarePipeline<string, void>(),\n outgoingData: new MiddlewarePipeline<Buffer, Buffer>(),\n outgoingMoney: new MiddlewarePipeline<string, void>()\n }\n for (const middlewareName of Object.keys(this.middlewares)) {\n const middleware = this.middlewares[middlewareName]\n try {\n await middleware.applyToPipelines(pipelines, accountId)\n } catch (err) {\n const errInfo = (err && typeof err === 'object' && err.stack) ? err.stack : String(err)\n\n log.error('failed to apply middleware to account. middlewareName=%s accountId=%s error=%s', middlewareName, accountId, errInfo)\n throw new Error('failed to apply middleware. middlewareName=' + middlewareName)\n }\n }\n\n // Generate outgoing middleware\n const submitData = async (data: Buffer) => {\n try {\n return await plugin.sendData(data)\n } catch (e) {\n let err = e\n if (!err || typeof err !== 'object') {\n err = new Error('non-object thrown. value=' + e)\n }\n\n if (!err.ilpErrorCode) {\n err.ilpErrorCode = codes.F02_UNREACHABLE\n }\n\n err.message = 'failed to send packet: ' + err.message\n\n throw err\n }\n }\n const submitMoney = plugin.sendMoney.bind(plugin)\n const startupHandler = this.createHandler(pipelines.startup, accountId, async () => { return })\n const teardownHandler = this.createHandler(pipelines.teardown, accountId, async () => { return })\n const outgoingDataHandler: DataHandler =\n this.createHandler(pipelines.outgoingData, accountId, submitData)\n const outgoingMoneyHandler: MoneyHandler =\n this.createHandler(pipelines.outgoingMoney, accountId, submitMoney)\n\n this.startupHandlers.set(accountId, startupHandler)\n this.teardownHandlers.set(accountId, teardownHandler)\n this.outgoingDataHandlers.set(accountId, outgoingDataHandler)\n this.outgoingMoneyHandlers.set(accountId, outgoingMoneyHandler)\n\n // Generate incoming middleware\n const handleData: DataHandler = (data: Buffer) => this.core.processData(data, accountId, this.sendData.bind(this))\n const handleMoney: MoneyHandler = async () => void 0\n const incomingDataHandler: DataHandler =\n this.createHandler(pipelines.incomingData, accountId, handleData)\n const incomingMoneyHandler: MoneyHandler =\n this.createHandler(pipelines.incomingMoney, accountId, handleMoney)\n\n plugin.registerDataHandler(incomingDataHandler)\n plugin.registerMoneyHandler(incomingMoneyHandler)\n\n if (this.started) {\n // If the plugin is being added dynamically (after connector init),\n // make sure it's startup pipeline is run.\n await startupHandler(undefined)\n }\n }\n\n async removePlugin (accountId: string, plugin: PluginInstance) {\n plugin.deregisterDataHandler()\n plugin.deregisterMoneyHandler()\n\n this.startupHandlers.delete(accountId)\n const teardownHandler = this.teardownHandlers.get(accountId)\n if (teardownHandler) await teardownHandler(undefined)\n this.teardownHandlers.delete(accountId)\n this.outgoingDataHandlers.delete(accountId)\n this.outgoingMoneyHandlers.delete(accountId)\n }\n\n async sendData (data: Buffer, accountId: string) {\n const handler = this.outgoingDataHandlers.get(accountId)\n\n if (!handler) {\n throw new UnreachableError('tried to send data to non-existent account. accountId=' + accountId)\n }\n\n return handler(data)\n }\n\n async sendMoney (amount: string, accountId: string) {\n const handler = this.outgoingMoneyHandlers.get(accountId)\n\n if (!handler) {\n throw new UnreachableError('tried to send money to non-existent account. accountId=' + accountId)\n }\n\n return handler(amount)\n }\n\n getMiddleware (name: string): Middleware | undefined {\n return this.middlewares[name]\n }\n\n private createHandler<T,U> (pipeline: Pipeline<T,U>, accountId: string, next: (param: T) => Promise<U>): (param: T) => Promise<U> {\n const middleware: MiddlewareMethod<T,U> = composeMiddleware(pipeline.getMethods())\n\n return (param: T) => middleware(param, next)\n }\n}\n"]}
\No newline at end of file