UNPKG

14.1 kBSource Map (JSON)View Raw
1{"version":3,"file":"ccp-sender.js","sourceRoot":"","sources":["ccp-sender.ts"],"names":[],"mappings":"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","sourcesContent":["import ForwardingRoutingTable, { RouteUpdate } from '../services/forwarding-routing-table'\nimport { BroadcastRoute } from '../types/routing'\nimport { create as createLogger, ConnectorLogger } from '../common/log'\nimport { Relation } from './relation'\nimport {\n CcpRouteControlRequest,\n CcpRouteUpdateRequest,\n Mode,\n ModeReverseMap,\n serializeCcpRouteUpdateRequest\n} from 'ilp-protocol-ccp'\nimport { PluginInstance } from '../types/plugin'\n\nexport interface CcpSenderOpts {\n accountId: string\n plugin: PluginInstance\n forwardingRoutingTable: ForwardingRoutingTable\n getOwnAddress: () => string\n getAccountRelation: (accountId: string) => Relation\n routeExpiry: number\n routeBroadcastInterval: number\n}\n\nconst MINIMUM_UPDATE_INTERVAL = 150\n\nconst MAX_EPOCHS_PER_UPDATE = 50\n\nexport default class CcpSender {\n private plugin: PluginInstance\n private forwardingRoutingTable: ForwardingRoutingTable\n private log: ConnectorLogger\n private accountId: string\n private mode: Mode = Mode.MODE_IDLE\n private getOwnAddress: () => string\n private getAccountRelation: (accountId: string) => Relation\n private routeExpiry: number\n private routeBroadcastInterval: number\n\n /**\n * Next epoch that the peer requested from us.\n */\n private lastKnownEpoch: number = 0\n\n private lastUpdate: number = 0\n private sendRouteUpdateTimer?: NodeJS.Timer\n\n constructor ({\n accountId,\n plugin,\n forwardingRoutingTable,\n getOwnAddress,\n getAccountRelation,\n routeExpiry,\n routeBroadcastInterval\n }: CcpSenderOpts) {\n this.plugin = plugin\n this.forwardingRoutingTable = forwardingRoutingTable\n this.log = createLogger(`ccp-sender[${accountId}]`)\n this.accountId = accountId\n this.getOwnAddress = getOwnAddress\n this.getAccountRelation = getAccountRelation\n this.routeExpiry = routeExpiry\n this.routeBroadcastInterval = routeBroadcastInterval\n }\n\n stop () {\n if (this.sendRouteUpdateTimer) {\n clearTimeout(this.sendRouteUpdateTimer)\n }\n }\n\n getAccountId () {\n return this.accountId\n }\n\n getLastUpdate () {\n return this.lastUpdate\n }\n\n getLastKnownEpoch () {\n return this.lastKnownEpoch\n }\n\n getMode () {\n return this.mode\n }\n\n getStatus () {\n return {\n epoch: this.lastKnownEpoch,\n mode: ModeReverseMap[this.mode]\n }\n }\n\n handleRouteControl ({\n mode,\n lastKnownRoutingTableId,\n lastKnownEpoch,\n features\n }: CcpRouteControlRequest) {\n if (this.mode !== mode) {\n this.log.trace('peer requested changing routing mode. oldMode=%s newMode=%s', ModeReverseMap[this.mode], ModeReverseMap[mode])\n }\n this.mode = mode\n\n if (lastKnownRoutingTableId !== this.forwardingRoutingTable.routingTableId) {\n this.log.trace('peer has old routing table id, resetting lastKnownEpoch to zero. theirTableId=%s correctTableId=%s', lastKnownRoutingTableId, this.forwardingRoutingTable.routingTableId)\n this.lastKnownEpoch = 0\n } else {\n this.log.trace('peer epoch set. epoch=%s currentEpoch=%s', this.accountId, lastKnownEpoch, this.forwardingRoutingTable.currentEpoch)\n this.lastKnownEpoch = lastKnownEpoch\n }\n\n // We don't support any optional features, so we ignore the `features`\n\n if (this.mode === Mode.MODE_SYNC) {\n // Start broadcasting routes to this peer\n this.scheduleRouteUpdate()\n } else {\n // Stop broadcasting routes to this peer\n if (this.sendRouteUpdateTimer) {\n clearTimeout(this.sendRouteUpdateTimer)\n this.sendRouteUpdateTimer = undefined\n }\n }\n }\n\n scheduleRouteUpdate = () => {\n if (this.sendRouteUpdateTimer) {\n clearTimeout(this.sendRouteUpdateTimer)\n this.sendRouteUpdateTimer = undefined\n }\n\n if (this.mode !== Mode.MODE_SYNC) {\n return\n }\n\n const lastUpdate = this.lastUpdate\n const nextEpoch = this.lastKnownEpoch\n\n let delay: number\n if (nextEpoch < this.forwardingRoutingTable.currentEpoch) {\n delay = 0\n } else {\n delay = this.routeBroadcastInterval - (Date.now() - lastUpdate)\n }\n\n delay = Math.max(MINIMUM_UPDATE_INTERVAL, delay)\n\n this.log.trace('scheduling next route update. accountId=%s delay=%s currentEpoch=%s peerHasEpoch=%s', this.accountId, delay, this.forwardingRoutingTable.currentEpoch, this.lastKnownEpoch)\n this.sendRouteUpdateTimer = setTimeout(() => {\n this.sendSingleRouteUpdate()\n .then(() => this.scheduleRouteUpdate())\n .catch((err: any) => {\n const errInfo = (err instanceof Object && err.stack) ? err.stack : err\n this.log.debug('failed to broadcast route information to peer. peer=%s error=%s', this.accountId, errInfo)\n })\n }, delay)\n this.sendRouteUpdateTimer.unref()\n }\n\n private async sendSingleRouteUpdate () {\n this.lastUpdate = Date.now()\n\n if (!this.plugin.isConnected()) {\n this.log.debug('cannot send routes, plugin not connected (yet).')\n return\n }\n\n const nextRequestedEpoch = this.lastKnownEpoch\n const allUpdates = this.forwardingRoutingTable.log\n .slice(nextRequestedEpoch, nextRequestedEpoch + MAX_EPOCHS_PER_UPDATE)\n\n const toEpoch = nextRequestedEpoch + allUpdates.length\n\n const relation = this.getAccountRelation(this.accountId)\n function isRouteUpdate (update: RouteUpdate | null): update is RouteUpdate {\n return !!update\n }\n\n const updates = allUpdates\n .filter(isRouteUpdate)\n .map((update: RouteUpdate) => {\n if (!update.route) return update\n\n if (\n // Don't send peer their own routes\n update.route.nextHop === this.accountId ||\n\n // Don't advertise peer and provider routes to providers\n (\n relation === 'parent' &&\n ['peer', 'parent'].indexOf(this.getAccountRelation(update.route.nextHop)) !== -1\n )\n ) {\n return {\n ...update,\n route: undefined\n }\n } else {\n return update\n }\n })\n\n const newRoutes: BroadcastRoute[] = []\n const withdrawnRoutes: { prefix: string, epoch: number }[] = []\n\n for (const update of updates) {\n if (update.route) {\n newRoutes.push({\n prefix: update.prefix,\n nextHop: update.route.nextHop,\n path: update.route.path,\n auth: update.route.auth\n })\n } else {\n withdrawnRoutes.push({\n prefix: update.prefix,\n epoch: update.epoch\n })\n }\n }\n\n this.log.trace('broadcasting routes to peer. speaker=%s peer=%s fromEpoch=%s toEpoch=%s routeCount=%s unreachableCount=%s', this.getOwnAddress(), this.accountId, this.lastKnownEpoch, toEpoch, newRoutes.length, withdrawnRoutes.length)\n\n const routeUpdate: CcpRouteUpdateRequest = {\n speaker: this.getOwnAddress(),\n routingTableId: this.forwardingRoutingTable.routingTableId,\n holdDownTime: this.routeExpiry,\n currentEpochIndex: this.forwardingRoutingTable.currentEpoch,\n fromEpochIndex: this.lastKnownEpoch,\n toEpochIndex: toEpoch,\n newRoutes: newRoutes.map(r => ({\n ...r,\n nextHop: undefined,\n auth: r.auth,\n props: []\n })),\n withdrawnRoutes: withdrawnRoutes.map(r => r.prefix)\n }\n\n // We anticipate that they're going to be happy with our route update and\n // request the next one.\n const previousNextRequestedEpoch = this.lastKnownEpoch\n this.lastKnownEpoch = toEpoch\n\n const timeout = this.routeBroadcastInterval\n\n const timerPromise: Promise<Buffer> = new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error('route update timed out.')), timeout)\n // Don't let this timer keep Node running\n timer.unref()\n })\n\n try {\n await Promise.race([\n this.plugin.sendData(serializeCcpRouteUpdateRequest(routeUpdate)),\n timerPromise\n ])\n } catch (err) {\n this.lastKnownEpoch = previousNextRequestedEpoch\n throw err\n }\n }\n}\n"]}
\No newline at end of file