UNPKG

9.75 kBSource Map (JSON)View Raw
1{"version":3,"file":"ccp-receiver.js","sourceRoot":"","sources":["ccp-receiver.ts"],"names":[],"mappings":"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","sourcesContent":["import PrefixMap from './prefix-map'\nimport { IncomingRoute } from '../types/routing'\nimport { create as createLogger, ConnectorLogger } from '../common/log'\nimport { Type, deserializeIlpReject } from 'ilp-packet'\nimport {\n CcpRouteControlRequest,\n CcpRouteUpdateRequest,\n Mode,\n serializeCcpRouteControlRequest\n} from 'ilp-protocol-ccp'\nimport { PluginInstance } from '../types/plugin'\n\nexport interface CcpReceiverOpts {\n plugin: PluginInstance\n accountId: string\n}\n\nconst ROUTE_CONTROL_RETRY_INTERVAL = 30000\n\nexport default class CcpReceiver {\n private plugin: PluginInstance\n private log: ConnectorLogger\n private accountId: string\n private routes: PrefixMap<IncomingRoute>\n private expiry: number = 0\n\n /**\n * Current routing table id used by our peer.\n *\n * We'll reset our epoch if this changes.\n */\n private routingTableId: string = '00000000-0000-0000-0000-000000000000'\n /**\n * Epoch index up to which our peer has sent updates\n */\n private epoch: number = 0\n\n constructor ({ plugin, accountId }: CcpReceiverOpts) {\n this.plugin = plugin\n this.log = createLogger(`ccp-receiver[${accountId}]`)\n this.accountId = accountId\n this.routes = new PrefixMap()\n }\n\n bump (holdDownTime: number) {\n this.expiry = Math.max(Date.now() + holdDownTime, this.expiry)\n }\n\n getAccountId () {\n return this.accountId\n }\n\n getExpiry () {\n return this.expiry\n }\n\n getPrefixes () {\n return this.routes.keys()\n }\n\n getRoutingTableId () {\n return this.routingTableId\n }\n\n getEpoch () {\n return this.epoch\n }\n\n getStatus () {\n return {\n routingTableId: this.routingTableId,\n epoch: this.epoch\n }\n }\n\n handleRouteUpdate ({\n speaker,\n routingTableId,\n fromEpochIndex,\n toEpochIndex,\n holdDownTime,\n newRoutes,\n withdrawnRoutes\n }: CcpRouteUpdateRequest): string[] {\n this.bump(holdDownTime)\n\n if (this.routingTableId !== routingTableId) {\n this.log.trace('saw new routing table. oldId=%s newId=%s', this.routingTableId, routingTableId)\n this.routingTableId = routingTableId\n this.epoch = 0\n }\n\n if (fromEpochIndex > this.epoch) {\n // There is a gap, we need to go back to the last epoch we have\n this.log.trace('gap in routing updates. expectedEpoch=%s actualFromEpoch=%s', this.epoch, fromEpochIndex)\n return []\n }\n if (this.epoch > toEpochIndex) {\n // This routing update is older than what we already have\n this.log.trace('old routing update, ignoring. expectedEpoch=%s actualToEpoch=%s', this.epoch, toEpochIndex)\n return []\n }\n\n // just a heartbeat\n if (newRoutes.length === 0 && withdrawnRoutes.length === 0) {\n this.log.trace('pure heartbeat. fromEpoch=%s toEpoch=%s', fromEpochIndex, toEpochIndex)\n this.epoch = toEpochIndex\n return []\n }\n\n const changedPrefixes: string[] = []\n if (withdrawnRoutes.length > 0) {\n this.log.trace('informed of no longer reachable routes. count=%s routes=%s', withdrawnRoutes.length, withdrawnRoutes)\n for (const prefix of withdrawnRoutes) {\n if (this.deleteRoute(prefix)) {\n changedPrefixes.push(prefix)\n }\n }\n }\n\n for (const route of newRoutes) {\n if (this.addRoute({\n peer: this.accountId,\n prefix: route.prefix,\n path: route.path,\n auth: route.auth\n })) {\n changedPrefixes.push(route.prefix)\n }\n }\n\n this.epoch = toEpochIndex\n\n this.log.trace('applied route update. changedPrefixesCount=%s fromEpoch=%s toEpoch=%s', changedPrefixes.length, fromEpochIndex, toEpochIndex)\n\n return changedPrefixes\n }\n\n getPrefix (prefix: string) {\n return this.routes.get(prefix)\n }\n\n sendRouteControl = () => {\n if (!this.plugin.isConnected()) {\n this.log.debug('cannot send route control message, plugin not connected (yet).')\n return\n }\n\n const routeControl: CcpRouteControlRequest = {\n mode: Mode.MODE_SYNC,\n lastKnownRoutingTableId: this.routingTableId,\n lastKnownEpoch: this.epoch,\n features: []\n }\n\n this.plugin.sendData(serializeCcpRouteControlRequest(routeControl))\n .then(data => {\n if (data[0] === Type.TYPE_ILP_FULFILL) {\n this.log.trace('successfully sent route control message.')\n } else if (data[0] === Type.TYPE_ILP_REJECT) {\n this.log.debug('route control message was rejected. rejection=%j', deserializeIlpReject(data))\n throw new Error('route control message rejected.')\n } else {\n this.log.debug('unknown response packet type. type=' + data[0])\n throw new Error('route control message returned unknown response.')\n }\n })\n .catch((err: any) => {\n const errInfo = (err instanceof Object && err.stack) ? err.stack : err\n this.log.debug('failed to set route control information on peer. error=%s', errInfo)\n // TODO: Should have more elegant, thought-through retry logic here\n const retryTimeout = setTimeout(this.sendRouteControl, ROUTE_CONTROL_RETRY_INTERVAL)\n\n retryTimeout.unref()\n })\n }\n\n private addRoute (route: IncomingRoute) {\n this.routes.insert(route.prefix, route)\n\n // TODO Check if actually changed\n return true\n }\n\n private deleteRoute (prefix: string) {\n this.routes.delete(prefix)\n\n // TODO Check if actually changed\n return true\n }\n}\n"]}
\No newline at end of file