diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-06-26 18:44:35 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-26 18:44:35 +0800 |
commit | feb29327066d6076d1802cdc1492d43a39cec276 (patch) | |
tree | 93f3231648b0f225c0c8d44bf81304282f93b605 /rpc | |
parent | f321ed23fbaad8a13cc672f601b15f5272b4b2bb (diff) | |
parent | ea1d1825a8509b3353c535c9444861e15471942a (diff) | |
download | go-tangerine-feb29327066d6076d1802cdc1492d43a39cec276.tar.gz go-tangerine-feb29327066d6076d1802cdc1492d43a39cec276.tar.zst go-tangerine-feb29327066d6076d1802cdc1492d43a39cec276.zip |
Merge pull request #14540 from bas-vk/whisper-api
whisperv5: integrate whisper and implement API
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/client.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/rpc/client.go b/rpc/client.go index 591986987..f02366a39 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -349,6 +349,52 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { return err } +// ShhSubscribe calls the "shh_subscribe" method with the given arguments, +// registering a subscription. Server notifications for the subscription are +// sent to the given channel. The element type of the channel must match the +// expected type of content returned by the subscription. +// +// The context argument cancels the RPC request that sets up the subscription but has no +// effect on the subscription after ShhSubscribe has returned. +// +// Slow subscribers will be dropped eventually. Client buffers up to 8000 notifications +// before considering the subscriber dead. The subscription Err channel will receive +// ErrSubscriptionQueueOverflow. Use a sufficiently large buffer on the channel or ensure +// that the channel usually has at least one reader to prevent this issue. +func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { + // Check type of channel first. + chanVal := reflect.ValueOf(channel) + if chanVal.Kind() != reflect.Chan || chanVal.Type().ChanDir()&reflect.SendDir == 0 { + panic("first argument to ShhSubscribe must be a writable channel") + } + if chanVal.IsNil() { + panic("channel given to ShhSubscribe must not be nil") + } + if c.isHTTP { + return nil, ErrNotificationsUnsupported + } + + msg, err := c.newMessage("shh"+subscribeMethodSuffix, args...) + if err != nil { + return nil, err + } + op := &requestOp{ + ids: []json.RawMessage{msg.ID}, + resp: make(chan *jsonrpcMessage), + sub: newClientSubscription(c, "shh", chanVal), + } + + // Send the subscription request. + // The arrival and validity of the response is signaled on sub.quit. + if err := c.send(ctx, op, msg); err != nil { + return nil, err + } + if _, err := op.wait(ctx); err != nil { + return nil, err + } + return op.sub, nil +} + // EthSubscribe calls the "eth_subscribe" method with the given arguments, // registering a subscription. Server notifications for the subscription are // sent to the given channel. The element type of the channel must match the |