package tmspcli import ( types "github.com/tendermint/tmsp/types" "sync" ) type localClient struct { mtx *sync.Mutex types.Application Callback } func NewLocalClient(mtx *sync.Mutex, app types.Application) *localClient { if mtx == nil { mtx = new(sync.Mutex) } return &localClient{ mtx: mtx, Application: app, } } 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) Stop() bool { return true } func (app *localClient) FlushAsync() *ReqRes { // Do nothing return newLocalReqRes(types.RequestFlush(), nil) } func (app *localClient) EchoAsync(msg string) *ReqRes { return app.callback( types.RequestEcho(msg), types.ResponseEcho(msg), ) } func (app *localClient) InfoAsync() *ReqRes { app.mtx.Lock() info := app.Application.Info() app.mtx.Unlock() return app.callback( types.RequestInfo(), types.ResponseInfo(info), ) } func (app *localClient) SetOptionAsync(key string, value string) *ReqRes { app.mtx.Lock() log := app.Application.SetOption(key, value) app.mtx.Unlock() return app.callback( types.RequestSetOption(key, value), types.ResponseSetOption(log), ) } func (app *localClient) AppendTxAsync(tx []byte) *ReqRes { app.mtx.Lock() res := app.Application.AppendTx(tx) app.mtx.Unlock() return app.callback( types.RequestAppendTx(tx), types.ResponseAppendTx(res.Code, res.Data, res.Log), ) } func (app *localClient) CheckTxAsync(tx []byte) *ReqRes { app.mtx.Lock() res := app.Application.CheckTx(tx) app.mtx.Unlock() return app.callback( types.RequestCheckTx(tx), types.ResponseCheckTx(res.Code, res.Data, res.Log), ) } func (app *localClient) QueryAsync(tx []byte) *ReqRes { app.mtx.Lock() res := app.Application.Query(tx) app.mtx.Unlock() return app.callback( types.RequestQuery(tx), types.ResponseQuery(res.Code, res.Data, res.Log), ) } func (app *localClient) CommitAsync() *ReqRes { app.mtx.Lock() res := app.Application.Commit() app.mtx.Unlock() return app.callback( types.RequestCommit(), types.ResponseCommit(res.Code, res.Data, res.Log), ) } //------------------------------------------------------- func (app *localClient) FlushSync() error { return nil } func (app *localClient) EchoSync(msg string) (res types.Result) { return types.OK.SetData([]byte(msg)) } func (app *localClient) InfoSync() (res types.Result) { app.mtx.Lock() info := app.Application.Info() app.mtx.Unlock() return types.OK.SetData([]byte(info)) } 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 } 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 }