/ src / server / state.js
state.js
  1  import dctrlDb from './dctrlDb.js'
  2  import modules from '../modules/index.js'
  3  import M from '../mutations.js'
  4  import { config } from './configParser.js'
  5  import crypto from '../crypto.js'
  6  import chalk from 'chalk'
  7  import fs from 'fs'
  8  import torControl from './torControl.js'
  9  
 10  let ALIAS = process.env.ALIAS || config.alias || 'AO'
 11  
 12  let publicKey
 13  try {
 14      let filekey = fs.readFileSync(config.aodir + '/key', {encoding:'utf8'})
 15  } catch (err){
 16      console.log(chalk.red('key import error from', config.aodir + '/key'), err)
 17  }
 18  
 19  function baseState(){
 20      return {
 21        hashMap: {},
 22        ao: [],
 23        sessions: [],
 24        members: [],
 25        tasks: [],
 26        resources: [],
 27        cash: {
 28          publicKey,
 29          address: '',
 30          alias: ALIAS,
 31          currency: 'CAD',
 32          spot: 0,
 33          rent: 0,
 34          cap: 75,
 35          pay_index: 0,
 36          usedTxIds: [],
 37          outputs: [],
 38          channels: [],
 39          pins: [],
 40          info: {},
 41        },
 42      }
 43  }
 44  
 45  const serverState = baseState()
 46  const pubState = baseState()
 47  
 48  function setCurrent(state, b){
 49      console.log('setting current', b)
 50      modules.cash.mutations.setCurrent(state.cash, b)
 51      modules.tasks.mutations.setCurrent(state.tasks, b)
 52      modules.sessions.mutations.setCurrent(state.sessions, b)
 53      modules.ao.mutations.setCurrent(state.ao, b)
 54      modules.members.mutations.setCurrent(state.members, b)
 55      modules.resources.mutations.setCurrent(state.resources, b)
 56      modules.hashMap.mutations.setCurrent(state.hashMap, b)
 57      console.log('now state is ', state)
 58  }
 59  
 60  function applyBackup(b){
 61      let b1 = Object.assign({}, b)
 62      setCurrent(serverState, b1)
 63      b.resources = b.resources.map(removeSensitive)
 64      b.members = b.members.map(removeSensitive)
 65      b.ao = b.ao.map(removeSensitive)
 66      b.tasks = b.tasks.map(removeSensitive)
 67      setCurrent(pubState, b)
 68  }
 69  
 70  function applyEvent(state, ev) {
 71      M.cashActions(state.cash, ev)
 72      M.membersActions(state.members, ev)
 73      M.resourcesActions(state.resources, ev)
 74      M.sessionsActions(state.sessions, ev)
 75      M.tasksActions(state.tasks, ev)
 76      M.aoActions(state.ao, ev)
 77      M.hashMapActions(state.hashMap, ev)
 78  }
 79  
 80  function initialize(callback) {
 81      let start = Date.now()
 82      torControl( (err, onion) => {
 83        if (onion) onion = onion.trim()
 84        serverState.cash.address = onion
 85        pubState.cash.address = onion
 86        dctrlDb.recover((err, backup) => {
 87              let ts = 0
 88              if (backup.length > 0){
 89                  ts = backup[0].timestamp
 90                  console.log(chalk.green('backup from ', Date(ts)))
 91                  applyBackup(backup[0])
 92              }
 93              dctrlDb.getAll(ts, (err, all) => {
 94                  if (err) return callback(err)
 95                  all.forEach( ev => {
 96                      applyEvent(serverState, Object.assign({}, ev) )
 97                      applyEvent(pubState, removeSensitive( Object.assign({}, ev) ))
 98                  })
 99                  console.log(
100                      chalk.bold.green('ao \n'), 
101                      chalk.bold.green(serverState.tasks.length, 'cards\n'),
102                      chalk.bold.magenta(serverState.members.length, 'accounts\n'),
103                      chalk.bold.red(serverState.resources.length, 'resources\n'),
104                      chalk.bold.cyan(all.length, 'events')
105                  )
106  
107                  pubState.tasks.forEach( (t, i) => {
108                      if (pubState.hashMap[t.taskId] !== i) {
109                        //console.log(i, 'map retro fixed...!!?', t.name.slice(0,7))
110                        pubState.hashMap[t.taskId] = i
111                        serverState.hashMap[t.taskId] = i
112                      }
113                  })
114  
115                  if (onion) {
116                      console.log(chalk.bold.blue('http://' + onion))
117                  } else {
118                      console.log(chalk.bold.red('no onion address'))
119                  }
120                  callback(null)
121              })
122        })
123      })
124  
125  }
126  
127  function backupState(){
128      dctrlDb.insertBackup(serverState)
129  }
130  
131  function removeSensitive(ev){
132        // This was erasing tokens from fresh sessions. I don't
133        // know how to work around it, so I'm allowing tokens through
134  			  
135        //let secretStuff = ['fob', 'secret', 'token', 'email', 'payment_hash', 'inboundSecret', 'outboundSecret']
136        let secretStuff = ['fob', 'secret', 'email', 'payment_hash', 'inboundSecret', 'outboundSecret']
137        if (ev.type === 'member-field-updated'){
138            ['fob', 'secret', 'email'].forEach( str => {
139                if (ev.field === str){
140                    secretStuff.push('newfield')
141                }
142            })
143        }
144        secretStuff.forEach(key => {
145          if (ev.hasOwnProperty(key)) delete ev[key]
146        })
147        return ev
148  }
149  
150  export default {
151      serverState,
152      pubState,
153      initialize,
154      applyEvent,
155      removeSensitive,
156      setCurrent,
157  }