tendermint/client/local_client.go

242 lines
5.5 KiB
Go
Raw Normal View History

2016-03-24 10:19:48 -07:00
package tmspcli
import (
"sync"
. "github.com/tendermint/go-common"
types "github.com/tendermint/tmsp/types"
2016-03-24 10:19:48 -07:00
)
type localClient struct {
2016-08-17 20:27:49 -07:00
BaseService
2016-03-24 10:19:48 -07:00
mtx *sync.Mutex
types.Application
Callback
}
func NewLocalClient(mtx *sync.Mutex, app types.Application) *localClient {
if mtx == nil {
mtx = new(sync.Mutex)
}
cli := &localClient{
2016-03-24 10:19:48 -07:00
mtx: mtx,
Application: app,
}
2016-08-17 20:27:49 -07:00
cli.BaseService = *NewBaseService(log, "localClient", cli)
return cli
2016-03-24 10:19:48 -07:00
}
func (app *localClient) SetResponseCallback(cb Callback) {
app.mtx.Lock()
defer app.mtx.Unlock()
app.Callback = cb
}
// TODO: change types.Application to include Error()?
func (app *localClient) Error() error {
return nil
}
func (app *localClient) FlushAsync() *ReqRes {
// Do nothing
2016-05-13 23:22:32 -07:00
return newLocalReqRes(types.ToRequestFlush(), nil)
2016-03-24 10:19:48 -07:00
}
func (app *localClient) EchoAsync(msg string) *ReqRes {
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestEcho(msg),
types.ToResponseEcho(msg),
2016-03-24 10:19:48 -07:00
)
}
func (app *localClient) InfoAsync() *ReqRes {
app.mtx.Lock()
2016-12-26 17:44:36 -08:00
resInfo := app.Application.Info()
2016-03-24 10:19:48 -07:00
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestInfo(),
2016-12-26 17:44:36 -08:00
types.ToResponseInfo(resInfo),
2016-03-24 10:19:48 -07:00
)
}
func (app *localClient) SetOptionAsync(key string, value string) *ReqRes {
app.mtx.Lock()
log := app.Application.SetOption(key, value)
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestSetOption(key, value),
types.ToResponseSetOption(log),
2016-03-24 10:19:48 -07:00
)
}
func (app *localClient) AppendTxAsync(tx []byte) *ReqRes {
app.mtx.Lock()
res := app.Application.AppendTx(tx)
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestAppendTx(tx),
types.ToResponseAppendTx(res.Code, res.Data, res.Log),
2016-03-24 10:19:48 -07:00
)
}
func (app *localClient) CheckTxAsync(tx []byte) *ReqRes {
app.mtx.Lock()
res := app.Application.CheckTx(tx)
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestCheckTx(tx),
types.ToResponseCheckTx(res.Code, res.Data, res.Log),
2016-03-24 10:19:48 -07:00
)
}
func (app *localClient) QueryAsync(tx []byte) *ReqRes {
app.mtx.Lock()
res := app.Application.Query(tx)
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestQuery(tx),
types.ToResponseQuery(res.Code, res.Data, res.Log),
2016-03-24 10:19:48 -07:00
)
}
func (app *localClient) CommitAsync() *ReqRes {
app.mtx.Lock()
res := app.Application.Commit()
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestCommit(),
types.ToResponseCommit(res.Code, res.Data, res.Log),
2016-03-24 10:19:48 -07:00
)
}
2016-03-26 22:35:23 -07:00
func (app *localClient) InitChainAsync(validators []*types.Validator) *ReqRes {
app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
bcApp.InitChain(validators)
}
reqRes := app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestInitChain(validators),
types.ToResponseInitChain(),
2016-03-26 22:35:23 -07:00
)
app.mtx.Unlock()
return reqRes
}
2016-09-09 20:01:53 -07:00
func (app *localClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqRes {
2016-03-26 22:35:23 -07:00
app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
2016-09-09 20:01:53 -07:00
bcApp.BeginBlock(hash, header)
2016-03-26 22:35:23 -07:00
}
app.mtx.Unlock()
return app.callback(
2016-09-09 20:01:53 -07:00
types.ToRequestBeginBlock(hash, header),
2016-05-13 23:22:32 -07:00
types.ToResponseBeginBlock(),
2016-03-26 22:35:23 -07:00
)
}
func (app *localClient) EndBlockAsync(height uint64) *ReqRes {
app.mtx.Lock()
var validators []*types.Validator
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
validators = bcApp.EndBlock(height)
}
app.mtx.Unlock()
return app.callback(
2016-05-13 23:22:32 -07:00
types.ToRequestEndBlock(height),
types.ToResponseEndBlock(validators),
2016-03-26 22:35:23 -07:00
)
}
2016-03-24 10:19:48 -07:00
//-------------------------------------------------------
func (app *localClient) FlushSync() error {
return nil
}
func (app *localClient) EchoSync(msg string) (res types.Result) {
return types.OK.SetData([]byte(msg))
}
2016-12-26 17:44:36 -08:00
func (app *localClient) InfoSync() (resInfo types.ResponseInfo, err error) {
2016-03-24 10:19:48 -07:00
app.mtx.Lock()
defer app.mtx.Unlock()
2016-12-26 17:44:36 -08:00
resInfo = app.Application.Info()
return resInfo, nil
2016-03-24 10:19:48 -07:00
}
func (app *localClient) SetOptionSync(key string, value string) (res types.Result) {
app.mtx.Lock()
log := app.Application.SetOption(key, value)
app.mtx.Unlock()
return types.OK.SetLog(log)
}
func (app *localClient) AppendTxSync(tx []byte) (res types.Result) {
app.mtx.Lock()
res = app.Application.AppendTx(tx)
app.mtx.Unlock()
return res
}
func (app *localClient) CheckTxSync(tx []byte) (res types.Result) {
app.mtx.Lock()
res = app.Application.CheckTx(tx)
app.mtx.Unlock()
return res
}
func (app *localClient) QuerySync(query []byte) (res types.Result) {
app.mtx.Lock()
res = app.Application.Query(query)
app.mtx.Unlock()
return res
}
func (app *localClient) CommitSync() (res types.Result) {
app.mtx.Lock()
res = app.Application.Commit()
app.mtx.Unlock()
return res
}
func (app *localClient) InitChainSync(validators []*types.Validator) (err error) {
app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
bcApp.InitChain(validators)
}
app.mtx.Unlock()
return nil
}
2016-09-09 20:01:53 -07:00
func (app *localClient) BeginBlockSync(hash []byte, header *types.Header) (err error) {
2016-03-26 22:35:23 -07:00
app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
2016-09-09 20:01:53 -07:00
bcApp.BeginBlock(hash, header)
2016-03-26 22:35:23 -07:00
}
app.mtx.Unlock()
return nil
}
2016-03-24 10:19:48 -07:00
func (app *localClient) EndBlockSync(height uint64) (changedValidators []*types.Validator, err error) {
app.mtx.Lock()
if bcApp, ok := app.Application.(types.BlockchainAware); ok {
changedValidators = bcApp.EndBlock(height)
}
app.mtx.Unlock()
return changedValidators, nil
}
//-------------------------------------------------------
func (app *localClient) callback(req *types.Request, res *types.Response) *ReqRes {
app.Callback(req, res)
return newLocalReqRes(req, res)
}
func newLocalReqRes(req *types.Request, res *types.Response) *ReqRes {
reqRes := NewReqRes(req)
reqRes.Response = res
reqRes.SetDone()
return reqRes
}