| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package jsonrpc2 |
| |
| import ( |
| "encoding/json" |
| ) |
| |
| // This file contains the go forms of the wire specification. |
| // see http://www.jsonrpc.org/specification for details |
| |
| var ( |
| // ErrParse is used when invalid JSON was received by the server. |
| ErrParse = NewError(-32700, "JSON RPC parse error") |
| // ErrInvalidRequest is used when the JSON sent is not a valid Request object. |
| ErrInvalidRequest = NewError(-32600, "JSON RPC invalid request") |
| // ErrMethodNotFound should be returned by the handler when the method does |
| // not exist / is not available. |
| ErrMethodNotFound = NewError(-32601, "JSON RPC method not found") |
| // ErrInvalidParams should be returned by the handler when method |
| // parameter(s) were invalid. |
| ErrInvalidParams = NewError(-32602, "JSON RPC invalid params") |
| // ErrInternal indicates a failure to process a call correctly |
| ErrInternal = NewError(-32603, "JSON RPC internal error") |
| |
| // The following errors are not part of the json specification, but |
| // compliant extensions specific to this implementation. |
| |
| // ErrServerOverloaded is returned when a message was refused due to a |
| // server being temporarily unable to accept any new messages. |
| ErrServerOverloaded = NewError(-32000, "JSON RPC overloaded") |
| // ErrUnknown should be used for all non coded errors. |
| ErrUnknown = NewError(-32001, "JSON RPC unknown error") |
| // ErrServerClosing is returned for calls that arrive while the server is closing. |
| ErrServerClosing = NewError(-32002, "JSON RPC server is closing") |
| // ErrClientClosing is a dummy error returned for calls initiated while the client is closing. |
| ErrClientClosing = NewError(-32003, "JSON RPC client is closing") |
| ) |
| |
| const wireVersion = "2.0" |
| |
| // wireCombined has all the fields of both Request and Response. |
| // We can decode this and then work out which it is. |
| type wireCombined struct { |
| VersionTag string `json:"jsonrpc"` |
| ID interface{} `json:"id,omitempty"` |
| Method string `json:"method,omitempty"` |
| Params json.RawMessage `json:"params,omitempty"` |
| Result json.RawMessage `json:"result,omitempty"` |
| Error *WireError `json:"error,omitempty"` |
| } |
| |
| // WireError represents a structured error in a Response. |
| type WireError struct { |
| // Code is an error code indicating the type of failure. |
| Code int64 `json:"code"` |
| // Message is a short description of the error. |
| Message string `json:"message"` |
| // Data is optional structured data containing additional information about the error. |
| Data json.RawMessage `json:"data,omitempty"` |
| } |
| |
| // NewError returns an error that will encode on the wire correctly. |
| // The standard codes are made available from this package, this function should |
| // only be used to build errors for application specific codes as allowed by the |
| // specification. |
| func NewError(code int64, message string) error { |
| return &WireError{ |
| Code: code, |
| Message: message, |
| } |
| } |
| |
| func (err *WireError) Error() string { |
| return err.Message |
| } |
| |
| func (err *WireError) Is(other error) bool { |
| w, ok := other.(*WireError) |
| if !ok { |
| return false |
| } |
| return err.Code == w.Code |
| } |