const Flume = require('flumedb') const Reduce = require('flumeview-reduce') const FlumeLog = require('flumelog-offset') const { pull, drain } = require('pull-stream') const codec = require('flumecodec') const db = Flume(FlumeLog('.test.db', { codec: codec.json })) .use('entries', Reduce(1, entriesReducer, null, null, [])) .use('accounts', Reduce(1, accountReducer, null, null, {})) const onDone = () => console.log('DONE') module.exports = ledgerStore function ledgerStore (state, emitter) { state.accounts = {} state.entries = [] pull( db.accounts.stream(), drain(acctState => { state.accounts = acctState emitter.emit(state.events.RENDER) }, onDone)) pull( db.entries.stream(), drain(entryState => { state.entries = entryState emitter.emit.RENDER }, onDone)) function onLoad () { emitter.on('accounts', onEvent) emitter.on('entries', onEvent) } function onEvent (data) { db.append(data, (err, seq) => { if (err) throw err emitter.emit(state.events.RENDER) }) } emitter.on('DOMContentLoaded', onLoad) } function entriesReducer (acc, item) { if (item.type !== 'entries') return acc acc.push(item) return acc } function accountReducer (acc, item) { // TODO account for account creation of existing account if (item.type === 'entries') { const { msg } = item acc[msg.debit].debit += msg.amount acc[msg.credit].credit += msg.amount return acc } if (item.type !== 'accounts') return acc const { msg } = item if (!acc[msg.name]) { acc[msg.name] = msg return acc } Object.assign(acc[msg.name], msg) return acc }