First stab at multiplexer

This commit is contained in:
Ethan Frey 2017-06-29 21:21:57 +02:00
parent 6fdf71f187
commit a0f1e5e66a
1 changed files with 51 additions and 0 deletions

51
stack/multiplexer.go Normal file
View File

@ -0,0 +1,51 @@
package stack
import (
"github.com/tendermint/basecoin"
"github.com/tendermint/basecoin/txs"
"github.com/tendermint/basecoin/types"
)
const (
NameMultiplexer = "mplx"
)
type Multiplexer struct{}
func (_ Multiplexer) Name() string {
return NameMultiplexer
}
var _ Middleware = Multiplexer{}
func (_ Multiplexer) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Checker) (res basecoin.Result, err error) {
if mtx, ok := tx.Unwrap().(*txs.MultiTx); ok {
return runAll(ctx, store, mtx.Txs, next.CheckTx)
}
return next.CheckTx(ctx, store, tx)
}
func (_ Multiplexer) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.Result, err error) {
if mtx, ok := tx.Unwrap().(*txs.MultiTx); ok {
return runAll(ctx, store, mtx.Txs, next.DeliverTx)
}
return next.DeliverTx(ctx, store, tx)
}
func runAll(ctx basecoin.Context, store types.KVStore, txs []basecoin.Tx, next basecoin.CheckerFunc) (res basecoin.Result, err error) {
// store all results, unless anything errors
rs := make([]basecoin.Result, len(txs))
for i, stx := range txs {
rs[i], err = next(ctx, store, stx)
if err != nil {
return
}
}
// now combine the results into one...
return combine(rs), nil
}
func combine(res []basecoin.Result) basecoin.Result {
// TODO: how to combine???
return res[0]
}