|  | // 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 | 
|  | } |