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 }