// Copyright 2015 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. package jrpc import ( "context" "strconv" "strings" "github.com/ethereum/go-ethereum/common/hexutil" ) // ServerCodec implements reading, parsing and writing RPC messages for the server side of // a RPC session. Implementations must be go-routine safe since the codec can be called in // multiple go-routines concurrently. type ServerCodec interface { peerInfo() PeerInfo readBatch() (msgs []*jsonrpcMessage, isBatch bool, err error) close() jsonWriter } // jsonWriter can write JSON messages to its underlying connection. // Implementations must be safe for concurrent use. type jsonWriter interface { writeJSON(context.Context, any) error // Closed returns a channel which is closed when the connection is closed. closed() <-chan any // RemoteAddr returns the peer address of the connection. remoteAddr() string } // DecimalOrHex unmarshals a non-negative decimal or hex parameter into a uint64. type DecimalOrHex uint64 // UnmarshalJSON implements json.Unmarshaler. func (dh *DecimalOrHex) UnmarshalJSON(data []byte) error { input := strings.TrimSpace(string(data)) if len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' { input = input[1 : len(input)-1] } value, err := strconv.ParseUint(input, 10, 64) if err != nil { value, err = hexutil.DecodeUint64(input) } if err != nil { return err } *dh = DecimalOrHex(value) return nil }