diff options
author | Felix Lange <fjl@users.noreply.github.com> | 2019-02-04 20:47:34 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-04 20:47:34 +0800 |
commit | 245f3146c26698193c4b479e7bc5825b058c444a (patch) | |
tree | c1196f7579e99e89e3e38cd2c7e442ef49a95731 /rpc/errors.go | |
parent | ec3432bccbb058567c0ea3f1e6537460f1f0aa29 (diff) | |
download | go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.tar go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.tar.gz go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.tar.bz2 go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.tar.lz go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.tar.xz go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.tar.zst go-tangerine-245f3146c26698193c4b479e7bc5825b058c444a.zip |
rpc: implement full bi-directional communication (#18471)
New APIs added:
client.RegisterName(namespace, service) // makes service available to server
client.Notify(ctx, method, args...) // sends a notification
ClientFromContext(ctx) // to get a client in handler method
This is essentially a rewrite of the server-side code. JSON-RPC
processing code is now the same on both server and client side. Many
minor issues were fixed in the process and there is a new test suite for
JSON-RPC spec compliance (and non-compliance in some cases).
List of behavior changes:
- Method handlers are now called with a per-request context instead of a
per-connection context. The context is canceled right after the method
returns.
- Subscription error channels are always closed when the connection
ends. There is no need to also wait on the Notifier's Closed channel
to detect whether the subscription has ended.
- Client now omits "params" instead of sending "params": null when there
are no arguments to a call. The previous behavior was not compliant
with the spec. The server still accepts "params": null.
- Floating point numbers are allowed as "id". The spec doesn't allow
them, but we handle request "id" as json.RawMessage and guarantee that
the same number will be sent back.
- Logging is improved significantly. There is now a message at DEBUG
level for each RPC call served.
Diffstat (limited to 'rpc/errors.go')
-rw-r--r-- | rpc/errors.go | 39 |
1 files changed, 19 insertions, 20 deletions
diff --git a/rpc/errors.go b/rpc/errors.go index 9cf9dc60c..c3aa826cc 100644 --- a/rpc/errors.go +++ b/rpc/errors.go @@ -18,18 +18,31 @@ package rpc import "fmt" -// request is for an unknown service -type methodNotFoundError struct { - service string - method string -} +const defaultErrorCode = -32000 + +type methodNotFoundError struct{ method string } func (e *methodNotFoundError) ErrorCode() int { return -32601 } func (e *methodNotFoundError) Error() string { - return fmt.Sprintf("The method %s%s%s does not exist/is not available", e.service, serviceMethodSeparator, e.method) + return fmt.Sprintf("the method %s does not exist/is not available", e.method) +} + +type subscriptionNotFoundError struct{ namespace, subscription string } + +func (e *subscriptionNotFoundError) ErrorCode() int { return -32601 } + +func (e *subscriptionNotFoundError) Error() string { + return fmt.Sprintf("no %q subscription in %s namespace", e.subscription, e.namespace) } +// Invalid JSON was received by the server. +type parseError struct{ message string } + +func (e *parseError) ErrorCode() int { return -32700 } + +func (e *parseError) Error() string { return e.message } + // received message isn't a valid request type invalidRequestError struct{ message string } @@ -50,17 +63,3 @@ type invalidParamsError struct{ message string } func (e *invalidParamsError) ErrorCode() int { return -32602 } func (e *invalidParamsError) Error() string { return e.message } - -// logic error, callback returned an error -type callbackError struct{ message string } - -func (e *callbackError) ErrorCode() int { return -32000 } - -func (e *callbackError) Error() string { return e.message } - -// issued when a request is received after the server is issued to stop. -type shutdownError struct{} - -func (e *shutdownError) ErrorCode() int { return -32000 } - -func (e *shutdownError) Error() string { return "server is shutting down" } |