Hex Artifact Content
Not logged in

Artifact 35d115d57be8287714ed6bc3b5c68d9d514f6708:


0000: 69 6d 70 6f 72 74 20 72 65 64 75 63 74 20 3d 20  import reduct = 
0010: 72 65 71 75 69 72 65 28 27 72 65 64 75 63 74 27  require('reduct'
0020: 29 0a 69 6d 70 6f 72 74 20 63 6f 6d 70 61 74 20  ).import compat 
0030: 66 72 6f 6d 20 27 69 6c 70 2d 63 6f 6d 70 61 74  from 'ilp-compat
0040: 2d 70 6c 75 67 69 6e 27 0a 69 6d 70 6f 72 74 20  -plugin'.import 
0050: 53 74 6f 72 65 20 66 72 6f 6d 20 27 2e 2e 2f 73  Store from '../s
0060: 65 72 76 69 63 65 73 2f 73 74 6f 72 65 27 0a 69  ervices/store'.i
0070: 6d 70 6f 72 74 20 43 6f 6e 66 69 67 20 66 72 6f  mport Config fro
0080: 6d 20 27 2e 2f 63 6f 6e 66 69 67 27 0a 69 6d 70  m './config'.imp
0090: 6f 72 74 20 7b 20 45 76 65 6e 74 45 6d 69 74 74  ort { EventEmitt
00a0: 65 72 20 7d 20 66 72 6f 6d 20 27 65 76 65 6e 74  er } from 'event
00b0: 73 27 0a 69 6d 70 6f 72 74 20 7b 20 41 63 63 6f  s'.import { Acco
00c0: 75 6e 74 49 6e 66 6f 20 7d 20 66 72 6f 6d 20 27  untInfo } from '
00d0: 2e 2e 2f 74 79 70 65 73 2f 61 63 63 6f 75 6e 74  ../types/account
00e0: 73 27 0a 69 6d 70 6f 72 74 20 7b 0a 20 20 43 6f  s'.import {.  Co
00f0: 6e 6e 65 63 74 4f 70 74 69 6f 6e 73 2c 0a 20 20  nnectOptions,.  
0100: 50 6c 75 67 69 6e 49 6e 73 74 61 6e 63 65 0a 7d  PluginInstance.}
0110: 20 66 72 6f 6d 20 27 2e 2e 2f 74 79 70 65 73 2f   from '../types/
0120: 70 6c 75 67 69 6e 27 0a 69 6d 70 6f 72 74 20 49  plugin'.import I
0130: 4c 44 43 50 20 3d 20 72 65 71 75 69 72 65 28 27  LDCP = require('
0140: 69 6c 70 2d 70 72 6f 74 6f 63 6f 6c 2d 69 6c 64  ilp-protocol-ild
0150: 63 70 27 29 0a 0a 69 6d 70 6f 72 74 20 7b 20 63  cp')..import { c
0160: 72 65 61 74 65 20 61 73 20 63 72 65 61 74 65 4c  reate as createL
0170: 6f 67 67 65 72 20 7d 20 66 72 6f 6d 20 27 2e 2e  ogger } from '..
0180: 2f 63 6f 6d 6d 6f 6e 2f 6c 6f 67 27 0a 63 6f 6e  /common/log'.con
0190: 73 74 20 6c 6f 67 20 3d 20 63 72 65 61 74 65 4c  st log = createL
01a0: 6f 67 67 65 72 28 27 61 63 63 6f 75 6e 74 73 27  ogger('accounts'
01b0: 29 0a 0a 65 78 70 6f 72 74 20 69 6e 74 65 72 66  )..export interf
01c0: 61 63 65 20 41 63 63 6f 75 6e 74 45 6e 74 72 79  ace AccountEntry
01d0: 20 7b 0a 20 20 70 6c 75 67 69 6e 3a 20 50 6c 75   {.  plugin: Plu
01e0: 67 69 6e 49 6e 73 74 61 6e 63 65 2c 0a 20 20 69  ginInstance,.  i
01f0: 6e 66 6f 3a 20 41 63 63 6f 75 6e 74 49 6e 66 6f  nfo: AccountInfo
0200: 0a 7d 0a 0a 65 78 70 6f 72 74 20 64 65 66 61 75  .}..export defau
0210: 6c 74 20 63 6c 61 73 73 20 41 63 63 6f 75 6e 74  lt class Account
0220: 73 20 65 78 74 65 6e 64 73 20 45 76 65 6e 74 45  s extends EventE
0230: 6d 69 74 74 65 72 20 7b 0a 20 20 70 72 6f 74 65  mitter {.  prote
0240: 63 74 65 64 20 63 6f 6e 66 69 67 3a 20 43 6f 6e  cted config: Con
0250: 66 69 67 0a 20 20 70 72 6f 74 65 63 74 65 64 20  fig.  protected 
0260: 73 74 6f 72 65 3a 20 53 74 6f 72 65 0a 0a 20 20  store: Store..  
0270: 70 72 6f 74 65 63 74 65 64 20 61 64 64 72 65 73  protected addres
0280: 73 3a 20 73 74 72 69 6e 67 0a 20 20 70 72 6f 74  s: string.  prot
0290: 65 63 74 65 64 20 61 63 63 6f 75 6e 74 73 3a 20  ected accounts: 
02a0: 4d 61 70 3c 73 74 72 69 6e 67 2c 20 41 63 63 6f  Map<string, Acco
02b0: 75 6e 74 45 6e 74 72 79 3e 0a 0a 20 20 63 6f 6e  untEntry>..  con
02c0: 73 74 72 75 63 74 6f 72 20 28 64 65 70 73 3a 20  structor (deps: 
02d0: 72 65 64 75 63 74 2e 49 6e 6a 65 63 74 6f 72 29  reduct.Injector)
02e0: 20 7b 0a 20 20 20 20 73 75 70 65 72 28 29 0a 0a   {.    super()..
02f0: 20 20 20 20 74 68 69 73 2e 63 6f 6e 66 69 67 20      this.config 
0300: 3d 20 64 65 70 73 28 43 6f 6e 66 69 67 29 0a 20  = deps(Config). 
0310: 20 20 20 74 68 69 73 2e 73 74 6f 72 65 20 3d 20     this.store = 
0320: 64 65 70 73 28 53 74 6f 72 65 29 0a 0a 20 20 20  deps(Store)..   
0330: 20 74 68 69 73 2e 61 64 64 72 65 73 73 20 3d 20   this.address = 
0340: 74 68 69 73 2e 63 6f 6e 66 69 67 2e 69 6c 70 41  this.config.ilpA
0350: 64 64 72 65 73 73 20 7c 7c 20 27 75 6e 6b 6e 6f  ddress || 'unkno
0360: 77 6e 27 0a 20 20 20 20 74 68 69 73 2e 61 63 63  wn'.    this.acc
0370: 6f 75 6e 74 73 20 3d 20 6e 65 77 20 4d 61 70 28  ounts = new Map(
0380: 29 0a 20 20 7d 0a 0a 20 20 61 73 79 6e 63 20 6c  ).  }..  async l
0390: 6f 61 64 49 6c 70 41 64 64 72 65 73 73 20 28 29  oadIlpAddress ()
03a0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 68   {.    const inh
03b0: 65 72 69 74 46 72 6f 6d 20 3d 20 74 68 69 73 2e  eritFrom = this.
03c0: 63 6f 6e 66 69 67 2e 69 6c 70 41 64 64 72 65 73  config.ilpAddres
03d0: 73 49 6e 68 65 72 69 74 46 72 6f 6d 20 7c 7c 0a  sInheritFrom ||.
03e0: 20 20 20 20 20 20 2f 2f 20 47 65 74 20 61 63 63        // Get acc
03f0: 6f 75 6e 74 20 69 64 20 6f 66 20 66 69 72 73 74  ount id of first
0400: 20 70 61 72 65 6e 74 0a 20 20 20 20 20 20 5b 2e   parent.      [.
0410: 2e 2e 74 68 69 73 2e 61 63 63 6f 75 6e 74 73 5d  ..this.accounts]
0420: 0a 20 20 20 20 20 20 20 20 2e 66 69 6c 74 65 72  .        .filter
0430: 28 28 5b 6b 65 79 2c 20 76 61 6c 75 65 5d 29 20  (([key, value]) 
0440: 3d 3e 20 76 61 6c 75 65 2e 69 6e 66 6f 2e 72 65  => value.info.re
0450: 6c 61 74 69 6f 6e 20 3d 3d 3d 20 27 70 61 72 65  lation === 'pare
0460: 6e 74 27 29 0a 20 20 20 20 20 20 20 20 2e 6d 61  nt').        .ma
0470: 70 28 28 5b 6b 65 79 5d 29 20 3d 3e 20 6b 65 79  p(([key]) => key
0480: 29 5b 30 5d 0a 0a 20 20 20 20 69 66 20 28 74 68  )[0]..    if (th
0490: 69 73 2e 63 6f 6e 66 69 67 2e 69 6c 70 41 64 64  is.config.ilpAdd
04a0: 72 65 73 73 20 3d 3d 3d 20 27 75 6e 6b 6e 6f 77  ress === 'unknow
04b0: 6e 27 20 26 26 20 21 69 6e 68 65 72 69 74 46 72  n' && !inheritFr
04c0: 6f 6d 29 20 7b 0a 20 20 20 20 20 20 74 68 72 6f  om) {.      thro
04d0: 77 20 6e 65 77 20 45 72 72 6f 72 28 27 57 68 65  w new Error('Whe
04e0: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 61  n there is no pa
04f0: 72 65 6e 74 2c 20 49 4c 50 20 61 64 64 72 65 73  rent, ILP addres
0500: 73 20 6d 75 73 74 20 62 65 20 73 70 65 63 69 66  s must be specif
0510: 69 65 64 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  ied in configura
0520: 74 69 6f 6e 2e 27 29 0a 20 20 20 20 7d 20 65 6c  tion.').    } el
0530: 73 65 20 69 66 20 28 74 68 69 73 2e 63 6f 6e 66  se if (this.conf
0540: 69 67 2e 69 6c 70 41 64 64 72 65 73 73 20 3d 3d  ig.ilpAddress ==
0550: 3d 20 27 75 6e 6b 6e 6f 77 6e 27 20 26 26 20 69  = 'unknown' && i
0560: 6e 68 65 72 69 74 46 72 6f 6d 29 20 7b 0a 20 20  nheritFrom) {.  
0570: 20 20 20 20 63 6f 6e 73 74 20 70 61 72 65 6e 74      const parent
0580: 20 3d 20 74 68 69 73 2e 67 65 74 50 6c 75 67 69   = this.getPlugi
0590: 6e 28 69 6e 68 65 72 69 74 46 72 6f 6d 29 0a 0a  n(inheritFrom)..
05a0: 20 20 20 20 20 20 6c 6f 67 2e 64 65 62 75 67 28        log.debug(
05b0: 27 63 6f 6e 6e 65 63 74 69 6e 67 20 74 6f 20 70  'connecting to p
05c0: 61 72 65 6e 74 2e 20 61 63 63 6f 75 6e 74 49 64  arent. accountId
05d0: 3d 25 73 27 2c 20 69 6e 68 65 72 69 74 46 72 6f  =%s', inheritFro
05e0: 6d 29 0a 20 20 20 20 20 20 61 77 61 69 74 20 70  m).      await p
05f0: 61 72 65 6e 74 2e 63 6f 6e 6e 65 63 74 28 7b 7d  arent.connect({}
0600: 29 0a 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  )..      const i
0610: 6c 64 63 70 49 6e 66 6f 20 3d 20 61 77 61 69 74  ldcpInfo = await
0620: 20 49 4c 44 43 50 2e 66 65 74 63 68 28 70 61 72   ILDCP.fetch(par
0630: 65 6e 74 2e 73 65 6e 64 44 61 74 61 2e 62 69 6e  ent.sendData.bin
0640: 64 28 70 61 72 65 6e 74 29 29 0a 0a 20 20 20 20  d(parent))..    
0650: 20 20 74 68 69 73 2e 73 65 74 4f 77 6e 41 64 64    this.setOwnAdd
0660: 72 65 73 73 28 69 6c 64 63 70 49 6e 66 6f 2e 63  ress(ildcpInfo.c
0670: 6c 69 65 6e 74 41 64 64 72 65 73 73 29 0a 0a 20  lientAddress).. 
0680: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 61 64       if (this.ad
0690: 64 72 65 73 73 20 3d 3d 3d 20 27 75 6e 6b 6e 6f  dress === 'unkno
06a0: 77 6e 27 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  wn') {.        l
06b0: 6f 67 2e 65 72 72 6f 72 28 27 63 6f 75 6c 64 20  og.error('could 
06c0: 6e 6f 74 20 67 65 74 20 69 6c 70 20 61 64 64 72  not get ilp addr
06d0: 65 73 73 20 66 72 6f 6d 20 70 61 72 65 6e 74 2e  ess from parent.
06e0: 27 29 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77  ').        throw
06f0: 20 6e 65 77 20 45 72 72 6f 72 28 27 6e 6f 20 69   new Error('no i
0700: 6c 70 20 61 64 64 72 65 73 73 20 63 6f 6e 66 69  lp address confi
0710: 67 75 72 65 64 2e 27 29 0a 20 20 20 20 20 20 7d  gured.').      }
0720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
0730: 79 6e 63 20 63 6f 6e 6e 65 63 74 20 28 6f 70 74  ync connect (opt
0740: 69 6f 6e 73 3a 20 43 6f 6e 6e 65 63 74 4f 70 74  ions: ConnectOpt
0750: 69 6f 6e 73 29 20 7b 0a 20 20 20 20 63 6f 6e 73  ions) {.    cons
0760: 74 20 75 6e 63 6f 6e 6e 65 63 74 65 64 41 63 63  t unconnectedAcc
0770: 6f 75 6e 74 73 20 3d 20 41 72 72 61 79 2e 66 72  ounts = Array.fr
0780: 6f 6d 28 74 68 69 73 2e 61 63 63 6f 75 6e 74 73  om(this.accounts
0790: 2e 76 61 6c 75 65 73 28 29 29 0a 20 20 20 20 20  .values()).     
07a0: 20 2e 66 69 6c 74 65 72 28 61 63 63 6f 75 6e 74   .filter(account
07b0: 20 3d 3e 20 21 61 63 63 6f 75 6e 74 2e 70 6c 75   => !account.plu
07c0: 67 69 6e 2e 69 73 43 6f 6e 6e 65 63 74 65 64 28  gin.isConnected(
07d0: 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 50 72  )).    return Pr
07e0: 6f 6d 69 73 65 2e 61 6c 6c 28 75 6e 63 6f 6e 6e  omise.all(unconn
07f0: 65 63 74 65 64 41 63 63 6f 75 6e 74 73 2e 6d 61  ectedAccounts.ma
0800: 70 28 61 63 63 6f 75 6e 74 20 3d 3e 20 61 63 63  p(account => acc
0810: 6f 75 6e 74 2e 70 6c 75 67 69 6e 2e 63 6f 6e 6e  ount.plugin.conn
0820: 65 63 74 28 6f 70 74 69 6f 6e 73 29 29 29 0a 20  ect(options))). 
0830: 20 7d 0a 0a 20 20 61 73 79 6e 63 20 64 69 73 63   }..  async disc
0840: 6f 6e 6e 65 63 74 20 28 29 20 7b 0a 20 20 20 20  onnect () {.    
0850: 63 6f 6e 73 74 20 63 6f 6e 6e 65 63 74 65 64 41  const connectedA
0860: 63 63 6f 75 6e 74 73 20 3d 20 41 72 72 61 79 2e  ccounts = Array.
0870: 66 72 6f 6d 28 74 68 69 73 2e 61 63 63 6f 75 6e  from(this.accoun
0880: 74 73 2e 76 61 6c 75 65 73 28 29 29 0a 20 20 20  ts.values()).   
0890: 20 20 20 2e 66 69 6c 74 65 72 28 61 63 63 6f 75     .filter(accou
08a0: 6e 74 20 3d 3e 20 61 63 63 6f 75 6e 74 2e 70 6c  nt => account.pl
08b0: 75 67 69 6e 2e 69 73 43 6f 6e 6e 65 63 74 65 64  ugin.isConnected
08c0: 28 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 50  ()).    return P
08d0: 72 6f 6d 69 73 65 2e 61 6c 6c 28 63 6f 6e 6e 65  romise.all(conne
08e0: 63 74 65 64 41 63 63 6f 75 6e 74 73 2e 6d 61 70  ctedAccounts.map
08f0: 28 61 63 63 6f 75 6e 74 20 3d 3e 20 61 63 63 6f  (account => acco
0900: 75 6e 74 2e 70 6c 75 67 69 6e 2e 64 69 73 63 6f  unt.plugin.disco
0910: 6e 6e 65 63 74 28 29 29 29 0a 20 20 7d 0a 0a 20  nnect())).  }.. 
0920: 20 67 65 74 4f 77 6e 41 64 64 72 65 73 73 20 28   getOwnAddress (
0930: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 74  ) {.    return t
0940: 68 69 73 2e 61 64 64 72 65 73 73 0a 20 20 7d 0a  his.address.  }.
0950: 0a 20 20 73 65 74 4f 77 6e 41 64 64 72 65 73 73  .  setOwnAddress
0960: 20 28 6e 65 77 41 64 64 72 65 73 73 29 20 7b 0a   (newAddress) {.
0970: 20 20 20 20 6c 6f 67 2e 69 6e 66 6f 28 27 73 65      log.info('se
0980: 74 74 69 6e 67 20 69 6c 70 20 61 64 64 72 65 73  tting ilp addres
0990: 73 2e 20 6f 6c 64 41 64 64 72 65 73 73 3d 25 73  s. oldAddress=%s
09a0: 20 6e 65 77 41 64 64 72 65 73 73 3d 25 73 27 2c   newAddress=%s',
09b0: 20 74 68 69 73 2e 61 64 64 72 65 73 73 2c 20 6e   this.address, n
09c0: 65 77 41 64 64 72 65 73 73 29 0a 20 20 20 20 74  ewAddress).    t
09d0: 68 69 73 2e 61 64 64 72 65 73 73 20 3d 20 6e 65  his.address = ne
09e0: 77 41 64 64 72 65 73 73 0a 20 20 7d 0a 0a 20 20  wAddress.  }..  
09f0: 67 65 74 50 6c 75 67 69 6e 20 28 61 63 63 6f 75  getPlugin (accou
0a00: 6e 74 49 64 3a 20 73 74 72 69 6e 67 29 20 7b 0a  ntId: string) {.
0a10: 20 20 20 20 63 6f 6e 73 74 20 61 63 63 6f 75 6e      const accoun
0a20: 74 20 3d 20 74 68 69 73 2e 61 63 63 6f 75 6e 74  t = this.account
0a30: 73 2e 67 65 74 28 61 63 63 6f 75 6e 74 49 64 29  s.get(accountId)
0a40: 0a 0a 20 20 20 20 69 66 20 28 21 61 63 63 6f 75  ..    if (!accou
0a50: 6e 74 29 20 7b 0a 20 20 20 20 20 20 6c 6f 67 2e  nt) {.      log.
0a60: 77 61 72 6e 28 27 63 6f 75 6c 64 20 6e 6f 74 20  warn('could not 
0a70: 66 69 6e 64 20 70 6c 75 67 69 6e 20 66 6f 72 20  find plugin for 
0a80: 61 63 63 6f 75 6e 74 20 69 64 2e 20 61 63 63 6f  account id. acco
0a90: 75 6e 74 49 64 3d 25 73 27 2c 20 61 63 63 6f 75  untId=%s', accou
0aa0: 6e 74 49 64 29 0a 20 20 20 20 20 20 74 68 72 6f  ntId).      thro
0ab0: 77 20 6e 65 77 20 45 72 72 6f 72 28 27 75 6e 6b  w new Error('unk
0ac0: 6e 6f 77 6e 20 61 63 63 6f 75 6e 74 20 69 64 2e  nown account id.
0ad0: 20 61 63 63 6f 75 6e 74 49 64 3d 27 20 2b 20 61   accountId=' + a
0ae0: 63 63 6f 75 6e 74 49 64 29 0a 20 20 20 20 7d 0a  ccountId).    }.
0af0: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 6f  .    return acco
0b00: 75 6e 74 2e 70 6c 75 67 69 6e 0a 20 20 7d 0a 0a  unt.plugin.  }..
0b10: 20 20 65 78 69 73 74 73 20 28 61 63 63 6f 75 6e    exists (accoun
0b20: 74 49 64 3a 20 73 74 72 69 6e 67 29 20 7b 0a 20  tId: string) {. 
0b30: 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e 61     return this.a
0b40: 63 63 6f 75 6e 74 73 2e 68 61 73 28 61 63 63 6f  ccounts.has(acco
0b50: 75 6e 74 49 64 29 0a 20 20 7d 0a 0a 20 20 67 65  untId).  }..  ge
0b60: 74 41 63 63 6f 75 6e 74 49 64 73 20 28 29 20 7b  tAccountIds () {
0b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 41 72 72 61  .    return Arra
0b80: 79 2e 66 72 6f 6d 28 74 68 69 73 2e 61 63 63 6f  y.from(this.acco
0b90: 75 6e 74 73 2e 6b 65 79 73 28 29 29 0a 20 20 7d  unts.keys()).  }
0ba0: 0a 0a 20 20 67 65 74 41 73 73 65 74 43 6f 64 65  ..  getAssetCode
0bb0: 20 28 61 63 63 6f 75 6e 74 49 64 3a 20 73 74 72   (accountId: str
0bc0: 69 6e 67 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ing) {.    const
0bd0: 20 61 63 63 6f 75 6e 74 20 3d 20 74 68 69 73 2e   account = this.
0be0: 61 63 63 6f 75 6e 74 73 2e 67 65 74 28 61 63 63  accounts.get(acc
0bf0: 6f 75 6e 74 49 64 29 0a 0a 20 20 20 20 69 66 20  ountId)..    if 
0c00: 28 21 61 63 63 6f 75 6e 74 29 20 7b 0a 20 20 20  (!account) {.   
0c10: 20 20 20 6c 6f 67 2e 64 65 62 75 67 28 27 6e 6f     log.debug('no
0c20: 20 63 75 72 72 65 6e 63 79 20 66 6f 75 6e 64 2e   currency found.
0c30: 20 61 63 63 6f 75 6e 74 3d 25 73 27 2c 20 61 63   account=%s', ac
0c40: 63 6f 75 6e 74 49 64 29 0a 20 20 20 20 20 20 72  countId).      r
0c50: 65 74 75 72 6e 20 75 6e 64 65 66 69 6e 65 64 0a  eturn undefined.
0c60: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
0c70: 6e 20 61 63 63 6f 75 6e 74 2e 69 6e 66 6f 2e 61  n account.info.a
0c80: 73 73 65 74 43 6f 64 65 0a 20 20 7d 0a 0a 20 20  ssetCode.  }..  
0c90: 61 64 64 20 28 61 63 63 6f 75 6e 74 49 64 3a 20  add (accountId: 
0ca0: 73 74 72 69 6e 67 2c 20 63 72 65 64 73 3a 20 61  string, creds: a
0cb0: 6e 79 29 20 7b 0a 20 20 20 20 6c 6f 67 2e 69 6e  ny) {.    log.in
0cc0: 66 6f 28 27 61 64 64 20 61 63 63 6f 75 6e 74 2e  fo('add account.
0cd0: 20 61 63 63 6f 75 6e 74 49 64 3d 25 73 27 2c 20   accountId=%s', 
0ce0: 61 63 63 6f 75 6e 74 49 64 29 0a 0a 20 20 20 20  accountId)..    
0cf0: 2f 2f 20 41 6c 74 68 6f 75 67 68 20 63 6c 6f 6e  // Although clon
0d00: 69 6e 67 20 74 68 65 20 6f 70 74 69 6f 6e 73 20  ing the options 
0d10: 6f 62 6a 65 63 74 20 74 68 61 74 20 63 6f 6d 65  object that come
0d20: 73 20 69 6e 20 66 72 6f 6d 0a 20 20 20 20 2f 2f  s in from.    //
0d30: 20 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75   code that inclu
0d40: 64 65 73 20 69 6c 70 2d 63 6f 6e 6e 65 63 74 6f  des ilp-connecto
0d50: 72 20 69 73 20 67 6f 6f 64 20 70 72 61 63 74 69  r is good practi
0d60: 63 65 2c 0a 20 20 20 20 2f 2f 20 74 68 69 73 20  ce,.    // this 
0d70: 62 72 65 61 6b 73 20 66 6f 72 20 69 6e 73 74 61  breaks for insta
0d80: 6e 63 65 20 77 68 65 6e 20 74 68 65 20 70 6c 75  nce when the plu
0d90: 67 69 6e 20 6f 70 74 69 6f 6e 73 0a 20 20 20 20  gin options.    
0da0: 2f 2f 20 63 6f 6e 74 61 69 6e 20 66 6f 72 20 69  // contain for i
0db0: 6e 73 74 61 6e 63 65 20 61 20 68 74 74 70 73 20  nstance a https 
0dc0: 73 65 72 76 65 72 20 6c 69 6b 65 20 69 6e 20 60  server like in `
0dd0: 77 73 4f 70 74 73 60 20 69 6e 0a 20 20 20 20 2f  wsOpts` in.    /
0de0: 2f 20 68 74 74 70 73 3a 2f 2f 67 69 74 68 75 62  / https://github
0df0: 2e 63 6f 6d 2f 69 6e 74 65 72 6c 65 64 67 65 72  .com/interledger
0e00: 6a 73 2f 69 6c 70 2d 70 6c 75 67 69 6e 2d 6d 69  js/ilp-plugin-mi
0e10: 6e 69 2d 61 63 63 6f 75 6e 74 73 2f 62 6c 6f 62  ni-accounts/blob
0e20: 2f 61 37 37 66 31 61 36 62 39 38 34 62 36 38 31  /a77f1a6b984b681
0e30: 36 38 35 36 61 30 39 34 38 64 66 61 35 37 66 65  6856a0948dfa57fe
0e40: 39 35 65 37 64 64 64 38 62 2f 52 45 41 44 4d 45  95e7ddd8b/README
0e50: 2e 6d 64 23 65 78 61 6d 70 6c 65 0a 20 20 20 20  .md#example.    
0e60: 2f 2f 0a 20 20 20 20 2f 2f 20 63 72 65 64 73 20  //.    // creds 
0e70: 3d 20 63 6c 6f 6e 65 44 65 65 70 28 63 72 65 64  = cloneDeep(cred
0e80: 73 29 0a 0a 20 20 20 20 74 72 79 20 7b 0a 20 20  s)..    try {.  
0e90: 20 20 20 20 74 68 69 73 2e 63 6f 6e 66 69 67 2e      this.config.
0ea0: 76 61 6c 69 64 61 74 65 41 63 63 6f 75 6e 74 28  validateAccount(
0eb0: 61 63 63 6f 75 6e 74 49 64 2c 20 63 72 65 64 73  accountId, creds
0ec0: 29 0a 20 20 20 20 7d 20 63 61 74 63 68 20 28 65  ).    } catch (e
0ed0: 72 72 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  rr) {.      if (
0ee0: 65 72 72 2e 6e 61 6d 65 20 3d 3d 3d 20 27 49 6e  err.name === 'In
0ef0: 76 61 6c 69 64 4a 73 6f 6e 42 6f 64 79 45 72 72  validJsonBodyErr
0f00: 6f 72 27 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  or') {.        l
0f10: 6f 67 2e 77 61 72 6e 28 27 76 61 6c 69 64 61 74  og.warn('validat
0f20: 69 6f 6e 20 65 72 72 6f 72 20 69 6e 20 61 63 63  ion error in acc
0f30: 6f 75 6e 74 20 63 6f 6e 66 69 67 2e 20 69 64 3d  ount config. id=
0f40: 25 73 27 2c 20 61 63 63 6f 75 6e 74 49 64 29 0a  %s', accountId).
0f50: 20 20 20 20 20 20 20 20 65 72 72 2e 64 65 62 75          err.debu
0f60: 67 50 72 69 6e 74 28 6c 6f 67 2e 77 61 72 6e 29  gPrint(log.warn)
0f70: 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e  .        throw n
0f80: 65 77 20 45 72 72 6f 72 28 27 65 72 72 6f 72 20  ew Error('error 
0f90: 77 68 69 6c 65 20 61 64 64 69 6e 67 20 61 63 63  while adding acc
0fa0: 6f 75 6e 74 2c 20 73 65 65 20 65 72 72 6f 72 20  ount, see error 
0fb0: 6c 6f 67 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  log for details.
0fc0: 27 29 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  ').      }..    
0fd0: 20 20 74 68 72 6f 77 20 65 72 72 0a 20 20 20 20    throw err.    
0fe0: 7d 0a 0a 20 20 20 20 63 6f 6e 73 74 20 50 6c 75  }..    const Plu
0ff0: 67 69 6e 20 3d 20 72 65 71 75 69 72 65 28 63 72  gin = require(cr
1000: 65 64 73 2e 70 6c 75 67 69 6e 29 0a 0a 20 20 20  eds.plugin)..   
1010: 20 63 6f 6e 73 74 20 61 70 69 3a 20 61 6e 79 20   const api: any 
1020: 3d 20 7b 7d 0a 20 20 20 20 2f 2f 20 4c 61 7a 69  = {}.    // Lazi
1030: 6c 79 20 63 72 65 61 74 65 20 70 6c 75 67 69 6e  ly create plugin
1040: 20 75 74 69 6c 69 74 69 65 73 0a 20 20 20 20 4f   utilities.    O
1050: 62 6a 65 63 74 2e 64 65 66 69 6e 65 50 72 6f 70  bject.defineProp
1060: 65 72 74 79 28 61 70 69 2c 20 27 73 74 6f 72 65  erty(api, 'store
1070: 27 2c 20 7b 0a 20 20 20 20 20 20 67 65 74 3a 20  ', {.      get: 
1080: 28 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  () => {.        
1090: 72 65 74 75 72 6e 20 74 68 69 73 2e 73 74 6f 72  return this.stor
10a0: 65 2e 67 65 74 50 6c 75 67 69 6e 53 74 6f 72 65  e.getPluginStore
10b0: 28 61 63 63 6f 75 6e 74 49 64 29 0a 20 20 20 20  (accountId).    
10c0: 20 20 7d 0a 20 20 20 20 7d 29 0a 20 20 20 20 4f    }.    }).    O
10d0: 62 6a 65 63 74 2e 64 65 66 69 6e 65 50 72 6f 70  bject.defineProp
10e0: 65 72 74 79 28 61 70 69 2c 20 27 6c 6f 67 27 2c  erty(api, 'log',
10f0: 20 7b 0a 20 20 20 20 20 20 67 65 74 3a 20 28 29   {.      get: ()
1100: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 72 65   => {.        re
1110: 74 75 72 6e 20 63 72 65 61 74 65 4c 6f 67 67 65  turn createLogge
1120: 72 28 60 24 7b 63 72 65 64 73 2e 70 6c 75 67 69  r(`${creds.plugi
1130: 6e 7d 5b 24 7b 61 63 63 6f 75 6e 74 49 64 7d 5d  n}[${accountId}]
1140: 60 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  `).      }.    }
1150: 29 0a 0a 20 20 20 20 63 6f 6e 73 74 20 6f 70 74  )..    const opt
1160: 73 20 3d 20 4f 62 6a 65 63 74 2e 61 73 73 69 67  s = Object.assig
1170: 6e 28 7b 7d 2c 20 63 72 65 64 73 2e 6f 70 74 69  n({}, creds.opti
1180: 6f 6e 73 29 0a 20 20 20 20 2f 2f 20 50 72 6f 76  ons).    // Prov
1190: 69 64 65 20 6f 6c 64 20 64 65 70 72 65 63 61 74  ide old deprecat
11a0: 65 64 20 5f 73 74 6f 72 65 20 61 6e 64 20 5f 6c  ed _store and _l
11b0: 6f 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  og properties.  
11c0: 20 20 4f 62 6a 65 63 74 2e 64 65 66 69 6e 65 50    Object.defineP
11d0: 72 6f 70 65 72 74 79 28 6f 70 74 73 2c 20 27 5f  roperty(opts, '_
11e0: 73 74 6f 72 65 27 2c 20 7b 0a 20 20 20 20 20 20  store', {.      
11f0: 67 65 74 3a 20 28 29 20 3d 3e 20 7b 0a 20 20 20  get: () => {.   
1200: 20 20 20 20 20 6c 6f 67 2e 77 61 72 6e 28 27 44       log.warn('D
1210: 45 50 52 45 43 41 54 45 44 3a 20 70 6c 75 67 69  EPRECATED: plugi
1220: 6e 20 61 63 63 65 73 73 65 64 20 64 65 70 72 65  n accessed depre
1230: 63 61 74 65 64 20 5f 73 74 6f 72 65 20 70 72 6f  cated _store pro
1240: 70 65 72 74 79 2e 20 61 63 63 6f 75 6e 74 49 64  perty. accountId
1250: 3d 25 73 27 2c 20 61 63 63 6f 75 6e 74 49 64 29  =%s', accountId)
1260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1270: 61 70 69 2e 73 74 6f 72 65 0a 20 20 20 20 20 20  api.store.      
1280: 7d 0a 20 20 20 20 7d 29 0a 20 20 20 20 4f 62 6a  }.    }).    Obj
1290: 65 63 74 2e 64 65 66 69 6e 65 50 72 6f 70 65 72  ect.defineProper
12a0: 74 79 28 6f 70 74 73 2c 20 27 5f 6c 6f 67 27 2c  ty(opts, '_log',
12b0: 20 7b 0a 20 20 20 20 20 20 67 65 74 3a 20 28 29   {.      get: ()
12c0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f   => {.        lo
12d0: 67 2e 77 61 72 6e 28 27 44 45 50 52 45 43 41 54  g.warn('DEPRECAT
12e0: 45 44 3a 20 70 6c 75 67 69 6e 20 61 63 63 65 73  ED: plugin acces
12f0: 73 65 64 20 64 65 70 72 65 63 61 74 65 64 20 5f  sed deprecated _
1300: 6c 6f 67 20 70 72 6f 70 65 72 74 79 2e 20 61 63  log property. ac
1310: 63 6f 75 6e 74 49 64 3d 25 73 27 2c 20 61 63 63  countId=%s', acc
1320: 6f 75 6e 74 49 64 29 0a 20 20 20 20 20 20 20 20  ountId).        
1330: 72 65 74 75 72 6e 20 61 70 69 2e 6c 6f 67 0a 20  return api.log. 
1340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 29 0a 0a 20       }.    }).. 
1350: 20 20 20 63 6f 6e 73 74 20 70 6c 75 67 69 6e 20     const plugin 
1360: 3d 20 63 6f 6d 70 61 74 28 6e 65 77 20 50 6c 75  = compat(new Plu
1370: 67 69 6e 28 6f 70 74 73 2c 20 61 70 69 29 29 0a  gin(opts, api)).
1380: 0a 20 20 20 20 74 68 69 73 2e 61 63 63 6f 75 6e  .    this.accoun
1390: 74 73 2e 73 65 74 28 61 63 63 6f 75 6e 74 49 64  ts.set(accountId
13a0: 2c 20 7b 0a 20 20 20 20 20 20 69 6e 66 6f 3a 20  , {.      info: 
13b0: 63 72 65 64 73 2c 0a 20 20 20 20 20 20 70 6c 75  creds,.      plu
13c0: 67 69 6e 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20  gin.    })..    
13d0: 74 68 69 73 2e 65 6d 69 74 28 27 61 64 64 27 2c  this.emit('add',
13e0: 20 61 63 63 6f 75 6e 74 49 64 2c 20 70 6c 75 67   accountId, plug
13f0: 69 6e 29 0a 20 20 7d 0a 0a 20 20 72 65 6d 6f 76  in).  }..  remov
1400: 65 20 28 61 63 63 6f 75 6e 74 49 64 3a 20 73 74  e (accountId: st
1410: 72 69 6e 67 29 20 7b 0a 20 20 20 20 63 6f 6e 73  ring) {.    cons
1420: 74 20 70 6c 75 67 69 6e 20 3d 20 74 68 69 73 2e  t plugin = this.
1430: 67 65 74 50 6c 75 67 69 6e 28 61 63 63 6f 75 6e  getPlugin(accoun
1440: 74 49 64 29 0a 20 20 20 20 69 66 20 28 21 70 6c  tId).    if (!pl
1450: 75 67 69 6e 29 20 7b 0a 20 20 20 20 20 20 72 65  ugin) {.      re
1460: 74 75 72 6e 20 75 6e 64 65 66 69 6e 65 64 0a 20  turn undefined. 
1470: 20 20 20 7d 0a 20 20 20 20 6c 6f 67 2e 69 6e 66     }.    log.inf
1480: 6f 28 27 72 65 6d 6f 76 65 20 61 63 63 6f 75 6e  o('remove accoun
1490: 74 2e 20 61 63 63 6f 75 6e 74 49 64 3d 27 20 2b  t. accountId=' +
14a0: 20 61 63 63 6f 75 6e 74 49 64 29 0a 0a 20 20 20   accountId)..   
14b0: 20 74 68 69 73 2e 65 6d 69 74 28 27 72 65 6d 6f   this.emit('remo
14c0: 76 65 27 2c 20 61 63 63 6f 75 6e 74 49 64 2c 20  ve', accountId, 
14d0: 70 6c 75 67 69 6e 29 0a 0a 20 20 20 20 74 68 69  plugin)..    thi
14e0: 73 2e 61 63 63 6f 75 6e 74 73 2e 64 65 6c 65 74  s.accounts.delet
14f0: 65 28 61 63 63 6f 75 6e 74 49 64 29 0a 20 20 20  e(accountId).   
1500: 20 72 65 74 75 72 6e 20 70 6c 75 67 69 6e 0a 20   return plugin. 
1510: 20 7d 0a 0a 20 20 67 65 74 49 6e 66 6f 20 28 61   }..  getInfo (a
1520: 63 63 6f 75 6e 74 49 64 3a 20 73 74 72 69 6e 67  ccountId: string
1530: 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 61 63  ) {.    const ac
1540: 63 6f 75 6e 74 20 3d 20 74 68 69 73 2e 61 63 63  count = this.acc
1550: 6f 75 6e 74 73 2e 67 65 74 28 61 63 63 6f 75 6e  ounts.get(accoun
1560: 74 49 64 29 0a 0a 20 20 20 20 69 66 20 28 21 61  tId)..    if (!a
1570: 63 63 6f 75 6e 74 29 20 7b 0a 20 20 20 20 20 20  ccount) {.      
1580: 74 68 72 6f 77 20 6e 65 77 20 45 72 72 6f 72 28  throw new Error(
1590: 27 75 6e 6b 6e 6f 77 6e 20 61 63 63 6f 75 6e 74  'unknown account
15a0: 20 69 64 2e 20 61 63 63 6f 75 6e 74 49 64 3d 27   id. accountId='
15b0: 20 2b 20 61 63 63 6f 75 6e 74 49 64 29 0a 20 20   + accountId).  
15c0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
15d0: 61 63 63 6f 75 6e 74 2e 69 6e 66 6f 0a 20 20 7d  account.info.  }
15e0: 0a 0a 20 20 67 65 74 43 68 69 6c 64 41 64 64 72  ..  getChildAddr
15f0: 65 73 73 20 28 61 63 63 6f 75 6e 74 49 64 3a 20  ess (accountId: 
1600: 73 74 72 69 6e 67 29 20 7b 0a 20 20 20 20 63 6f  string) {.    co
1610: 6e 73 74 20 69 6e 66 6f 20 3d 20 74 68 69 73 2e  nst info = this.
1620: 67 65 74 49 6e 66 6f 28 61 63 63 6f 75 6e 74 49  getInfo(accountI
1630: 64 29 0a 0a 20 20 20 20 69 66 20 28 69 6e 66 6f  d)..    if (info
1640: 2e 72 65 6c 61 74 69 6f 6e 20 21 3d 3d 20 27 63  .relation !== 'c
1650: 68 69 6c 64 27 29 20 7b 0a 20 20 20 20 20 20 74  hild') {.      t
1660: 68 72 6f 77 20 6e 65 77 20 45 72 72 6f 72 28 27  hrow new Error('
1670: 43 61 6e 5c 27 74 20 67 65 6e 65 72 61 74 65 20  Can\'t generate 
1680: 63 68 69 6c 64 20 61 64 64 72 65 73 73 20 66 6f  child address fo
1690: 72 20 61 63 63 6f 75 6e 74 20 74 68 61 74 20 69  r account that i
16a0: 73 20 69 73 6e 5c 27 74 20 61 20 63 68 69 6c 64  s isn\'t a child
16b0: 27 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f  ').    }..    co
16c0: 6e 73 74 20 69 6c 70 41 64 64 72 65 73 73 53 65  nst ilpAddressSe
16d0: 67 6d 65 6e 74 20 3d 20 69 6e 66 6f 2e 69 6c 70  gment = info.ilp
16e0: 41 64 64 72 65 73 73 53 65 67 6d 65 6e 74 20 7c  AddressSegment |
16f0: 7c 20 61 63 63 6f 75 6e 74 49 64 0a 0a 20 20 20  | accountId..   
1700: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 61 64 64   return this.add
1710: 72 65 73 73 20 2b 20 27 2e 27 20 2b 20 69 6c 70  ress + '.' + ilp
1720: 41 64 64 72 65 73 73 53 65 67 6d 65 6e 74 0a 20  AddressSegment. 
1730: 20 7d 0a 7d 0a                                    }.}.