Hex Artifact Content
Not logged in

Artifact 84b8ff29a446fd604aa5a4c868f65bdc11a424e0:


0000: 69 6d 70 6f 72 74 20 7b 20 63 72 65 61 74 65 20  import { create 
0010: 61 73 20 63 72 65 61 74 65 4c 6f 67 67 65 72 20  as createLogger 
0020: 7d 20 66 72 6f 6d 20 27 2e 2e 2f 63 6f 6d 6d 6f  } from '../commo
0030: 6e 2f 6c 6f 67 27 0a 63 6f 6e 73 74 20 6c 6f 67  n/log'.const log
0040: 20 3d 20 63 72 65 61 74 65 4c 6f 67 67 65 72 28   = createLogger(
0050: 27 63 63 70 27 29 0a 69 6d 70 6f 72 74 20 52 6f  'ccp').import Ro
0060: 75 74 65 42 72 6f 61 64 63 61 73 74 65 72 20 66  uteBroadcaster f
0070: 72 6f 6d 20 27 2e 2e 2f 73 65 72 76 69 63 65 73  rom '../services
0080: 2f 72 6f 75 74 65 2d 62 72 6f 61 64 63 61 73 74  /route-broadcast
0090: 65 72 27 0a 69 6d 70 6f 72 74 20 72 65 64 75 63  er'.import reduc
00a0: 74 20 3d 20 72 65 71 75 69 72 65 28 27 72 65 64  t = require('red
00b0: 75 63 74 27 29 0a 69 6d 70 6f 72 74 20 7b 20 49  uct').import { I
00c0: 6c 70 50 72 65 70 61 72 65 20 7d 20 66 72 6f 6d  lpPrepare } from
00d0: 20 27 69 6c 70 2d 70 61 63 6b 65 74 27 0a 69 6d   'ilp-packet'.im
00e0: 70 6f 72 74 20 7b 0a 20 20 43 43 50 5f 43 4f 4e  port {.  CCP_CON
00f0: 54 52 4f 4c 5f 44 45 53 54 49 4e 41 54 49 4f 4e  TROL_DESTINATION
0100: 2c 0a 20 20 43 43 50 5f 55 50 44 41 54 45 5f 44  ,.  CCP_UPDATE_D
0110: 45 53 54 49 4e 41 54 49 4f 4e 2c 0a 20 20 64 65  ESTINATION,.  de
0120: 73 65 72 69 61 6c 69 7a 65 43 63 70 52 6f 75 74  serializeCcpRout
0130: 65 55 70 64 61 74 65 52 65 71 75 65 73 74 2c 0a  eUpdateRequest,.
0140: 20 20 64 65 73 65 72 69 61 6c 69 7a 65 43 63 70    deserializeCcp
0150: 52 6f 75 74 65 43 6f 6e 74 72 6f 6c 52 65 71 75  RouteControlRequ
0160: 65 73 74 2c 0a 20 20 73 65 72 69 61 6c 69 7a 65  est,.  serialize
0170: 43 63 70 52 65 73 70 6f 6e 73 65 0a 7d 20 66 72  CcpResponse.} fr
0180: 6f 6d 20 27 69 6c 70 2d 70 72 6f 74 6f 63 6f 6c  om 'ilp-protocol
0190: 2d 63 63 70 27 0a 0a 65 78 70 6f 72 74 20 64 65  -ccp'..export de
01a0: 66 61 75 6c 74 20 63 6c 61 73 73 20 43 63 70 43  fault class CcpC
01b0: 6f 6e 74 72 6f 6c 6c 65 72 20 7b 0a 20 20 70 72  ontroller {.  pr
01c0: 6f 74 65 63 74 65 64 20 72 6f 75 74 65 42 72 6f  otected routeBro
01d0: 61 64 63 61 73 74 65 72 3a 20 52 6f 75 74 65 42  adcaster: RouteB
01e0: 72 6f 61 64 63 61 73 74 65 72 0a 0a 20 20 63 6f  roadcaster..  co
01f0: 6e 73 74 72 75 63 74 6f 72 20 28 64 65 70 73 3a  nstructor (deps:
0200: 20 72 65 64 75 63 74 2e 49 6e 6a 65 63 74 6f 72   reduct.Injector
0210: 29 20 7b 0a 20 20 20 20 74 68 69 73 2e 72 6f 75  ) {.    this.rou
0220: 74 65 42 72 6f 61 64 63 61 73 74 65 72 20 3d 20  teBroadcaster = 
0230: 64 65 70 73 28 52 6f 75 74 65 42 72 6f 61 64 63  deps(RouteBroadc
0240: 61 73 74 65 72 29 0a 20 20 7d 0a 0a 20 20 61 73  aster).  }..  as
0250: 79 6e 63 20 68 61 6e 64 6c 65 20 28 0a 20 20 20  ync handle (.   
0260: 20 64 61 74 61 3a 20 42 75 66 66 65 72 2c 0a 20   data: Buffer,. 
0270: 20 20 20 73 6f 75 72 63 65 41 63 63 6f 75 6e 74     sourceAccount
0280: 3a 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 7b 20  : string,.    { 
0290: 70 61 72 73 65 64 50 61 63 6b 65 74 20 7d 3a 20  parsedPacket }: 
02a0: 7b 20 70 61 72 73 65 64 50 61 63 6b 65 74 3a 20  { parsedPacket: 
02b0: 49 6c 70 50 72 65 70 61 72 65 20 7d 0a 20 20 29  IlpPrepare }.  )
02c0: 20 7b 0a 20 20 20 20 73 77 69 74 63 68 20 28 70   {.    switch (p
02d0: 61 72 73 65 64 50 61 63 6b 65 74 2e 64 65 73 74  arsedPacket.dest
02e0: 69 6e 61 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20  ination) {.     
02f0: 20 63 61 73 65 20 43 43 50 5f 43 4f 4e 54 52 4f   case CCP_CONTRO
0300: 4c 5f 44 45 53 54 49 4e 41 54 49 4f 4e 3a 0a 20  L_DESTINATION:. 
0310: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
0320: 69 73 2e 68 61 6e 64 6c 65 52 6f 75 74 65 43 6f  is.handleRouteCo
0330: 6e 74 72 6f 6c 28 64 61 74 61 2c 20 73 6f 75 72  ntrol(data, sour
0340: 63 65 41 63 63 6f 75 6e 74 29 0a 20 20 20 20 20  ceAccount).     
0350: 20 63 61 73 65 20 43 43 50 5f 55 50 44 41 54 45   case CCP_UPDATE
0360: 5f 44 45 53 54 49 4e 41 54 49 4f 4e 3a 0a 20 20  _DESTINATION:.  
0370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
0380: 73 2e 68 61 6e 64 6c 65 52 6f 75 74 65 55 70 64  s.handleRouteUpd
0390: 61 74 65 28 64 61 74 61 2c 20 73 6f 75 72 63 65  ate(data, source
03a0: 41 63 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 64  Account).      d
03b0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
03c0: 74 68 72 6f 77 20 6e 65 77 20 45 72 72 6f 72 28  throw new Error(
03d0: 27 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 63 63  'unrecognized cc
03e0: 70 20 6d 65 73 73 61 67 65 2e 20 64 65 73 74 69  p message. desti
03f0: 6e 61 74 69 6f 6e 3d 27 20 2b 20 70 61 72 73 65  nation=' + parse
0400: 64 50 61 63 6b 65 74 2e 64 65 73 74 69 6e 61 74  dPacket.destinat
0410: 69 6f 6e 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ion).    }.  }..
0420: 20 20 61 73 79 6e 63 20 68 61 6e 64 6c 65 52 6f    async handleRo
0430: 75 74 65 43 6f 6e 74 72 6f 6c 20 28 64 61 74 61  uteControl (data
0440: 3a 20 42 75 66 66 65 72 2c 20 73 6f 75 72 63 65  : Buffer, source
0450: 41 63 63 6f 75 6e 74 3a 20 73 74 72 69 6e 67 29  Account: string)
0460: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 72 6f 75   {.    const rou
0470: 74 65 43 6f 6e 74 72 6f 6c 20 3d 20 64 65 73 65  teControl = dese
0480: 72 69 61 6c 69 7a 65 43 63 70 52 6f 75 74 65 43  rializeCcpRouteC
0490: 6f 6e 74 72 6f 6c 52 65 71 75 65 73 74 28 64 61  ontrolRequest(da
04a0: 74 61 29 0a 20 20 20 20 6c 6f 67 2e 64 65 62 75  ta).    log.debu
04b0: 67 28 27 72 65 63 65 69 76 65 64 20 72 6f 75 74  g('received rout
04c0: 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 73 73 61 67  e control messag
04d0: 65 2e 20 73 65 6e 64 65 72 3d 25 73 2c 20 74 61  e. sender=%s, ta
04e0: 62 6c 65 49 64 3d 25 73 20 65 70 6f 63 68 3d 25  bleId=%s epoch=%
04f0: 73 20 66 65 61 74 75 72 65 73 3d 25 73 27 2c 20  s features=%s', 
0500: 73 6f 75 72 63 65 41 63 63 6f 75 6e 74 2c 20 72  sourceAccount, r
0510: 6f 75 74 65 43 6f 6e 74 72 6f 6c 2e 6c 61 73 74  outeControl.last
0520: 4b 6e 6f 77 6e 52 6f 75 74 69 6e 67 54 61 62 6c  KnownRoutingTabl
0530: 65 49 64 2c 20 72 6f 75 74 65 43 6f 6e 74 72 6f  eId, routeContro
0540: 6c 2e 6c 61 73 74 4b 6e 6f 77 6e 45 70 6f 63 68  l.lastKnownEpoch
0550: 2c 20 72 6f 75 74 65 43 6f 6e 74 72 6f 6c 2e 66  , routeControl.f
0560: 65 61 74 75 72 65 73 2e 6a 6f 69 6e 28 27 2c 27  eatures.join(','
0570: 29 29 0a 0a 20 20 20 20 74 68 69 73 2e 72 6f 75  ))..    this.rou
0580: 74 65 42 72 6f 61 64 63 61 73 74 65 72 2e 68 61  teBroadcaster.ha
0590: 6e 64 6c 65 52 6f 75 74 65 43 6f 6e 74 72 6f 6c  ndleRouteControl
05a0: 28 73 6f 75 72 63 65 41 63 63 6f 75 6e 74 2c 20  (sourceAccount, 
05b0: 72 6f 75 74 65 43 6f 6e 74 72 6f 6c 29 0a 0a 20  routeControl).. 
05c0: 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c     return serial
05d0: 69 7a 65 43 63 70 52 65 73 70 6f 6e 73 65 28 29  izeCcpResponse()
05e0: 0a 20 20 7d 0a 0a 20 20 61 73 79 6e 63 20 68 61  .  }..  async ha
05f0: 6e 64 6c 65 52 6f 75 74 65 55 70 64 61 74 65 20  ndleRouteUpdate 
0600: 28 64 61 74 61 3a 20 42 75 66 66 65 72 2c 20 73  (data: Buffer, s
0610: 6f 75 72 63 65 41 63 63 6f 75 6e 74 3a 20 73 74  ourceAccount: st
0620: 72 69 6e 67 29 20 7b 0a 20 20 20 20 63 6f 6e 73  ring) {.    cons
0630: 74 20 72 6f 75 74 65 55 70 64 61 74 65 20 3d 20  t routeUpdate = 
0640: 64 65 73 65 72 69 61 6c 69 7a 65 43 63 70 52 6f  deserializeCcpRo
0650: 75 74 65 55 70 64 61 74 65 52 65 71 75 65 73 74  uteUpdateRequest
0660: 28 64 61 74 61 29 0a 20 20 20 20 6c 6f 67 2e 64  (data).    log.d
0670: 65 62 75 67 28 27 72 65 63 65 69 76 65 64 20 72  ebug('received r
0680: 6f 75 74 65 73 2e 20 73 65 6e 64 65 72 3d 25 73  outes. sender=%s
0690: 20 73 70 65 61 6b 65 72 3d 25 73 20 63 75 72 72   speaker=%s curr
06a0: 65 6e 74 45 70 6f 63 68 3d 25 73 20 66 72 6f 6d  entEpoch=%s from
06b0: 45 70 6f 63 68 3d 25 73 20 74 6f 45 70 6f 63 68  Epoch=%s toEpoch
06c0: 3d 25 73 20 6e 65 77 52 6f 75 74 65 73 3d 25 73  =%s newRoutes=%s
06d0: 20 77 69 74 68 64 72 61 77 6e 52 6f 75 74 65 73   withdrawnRoutes
06e0: 3d 25 73 27 2c 20 73 6f 75 72 63 65 41 63 63 6f  =%s', sourceAcco
06f0: 75 6e 74 2c 20 72 6f 75 74 65 55 70 64 61 74 65  unt, routeUpdate
0700: 2e 73 70 65 61 6b 65 72 2c 20 72 6f 75 74 65 55  .speaker, routeU
0710: 70 64 61 74 65 2e 63 75 72 72 65 6e 74 45 70 6f  pdate.currentEpo
0720: 63 68 49 6e 64 65 78 2c 20 72 6f 75 74 65 55 70  chIndex, routeUp
0730: 64 61 74 65 2e 66 72 6f 6d 45 70 6f 63 68 49 6e  date.fromEpochIn
0740: 64 65 78 2c 20 72 6f 75 74 65 55 70 64 61 74 65  dex, routeUpdate
0750: 2e 74 6f 45 70 6f 63 68 49 6e 64 65 78 2c 20 72  .toEpochIndex, r
0760: 6f 75 74 65 55 70 64 61 74 65 2e 6e 65 77 52 6f  outeUpdate.newRo
0770: 75 74 65 73 2e 6c 65 6e 67 74 68 2c 20 72 6f 75  utes.length, rou
0780: 74 65 55 70 64 61 74 65 2e 77 69 74 68 64 72 61  teUpdate.withdra
0790: 77 6e 52 6f 75 74 65 73 2e 6c 65 6e 67 74 68 29  wnRoutes.length)
07a0: 0a 0a 20 20 20 20 74 68 69 73 2e 72 6f 75 74 65  ..    this.route
07b0: 42 72 6f 61 64 63 61 73 74 65 72 2e 68 61 6e 64  Broadcaster.hand
07c0: 6c 65 52 6f 75 74 65 55 70 64 61 74 65 28 73 6f  leRouteUpdate(so
07d0: 75 72 63 65 41 63 63 6f 75 6e 74 2c 20 72 6f 75  urceAccount, rou
07e0: 74 65 55 70 64 61 74 65 29 0a 0a 20 20 20 20 72  teUpdate)..    r
07f0: 65 74 75 72 6e 20 73 65 72 69 61 6c 69 7a 65 43  eturn serializeC
0800: 63 70 52 65 73 70 6f 6e 73 65 28 29 0a 20 20 7d  cpResponse().  }
0810: 0a 7d 0a                                         .}.