From 91717d4b983339c13119273c090152e968b0b98d Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Fri, 24 Mar 2023 15:36:34 +0300 Subject: [PATCH] [#176] morph: Resolve funlen linter Signed-off-by: Dmitrii Stepanov --- pkg/morph/client/notifications.go | 68 +++++++++++++++++-------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/pkg/morph/client/notifications.go b/pkg/morph/client/notifications.go index 1d287527bc..ed03687003 100644 --- a/pkg/morph/client/notifications.go +++ b/pkg/morph/client/notifications.go @@ -240,37 +240,7 @@ func (c *Client) restoreSubscriptions(cli *rpcclient.WSClient, endpoint string, notificationRcv := make(chan *state.ContainedNotificationEvent) notaryReqRcv := make(chan *result.NotaryRequestEvent) - // neo-go WS client says to _always_ read notifications - // from its channel. Subscribing to any notification - // while not reading them in another goroutine may - // lead to a dead-lock, thus that async side notification - // listening while restoring subscriptions - go func() { - var e any - var ok bool - - for { - select { - case <-stopCh: - return - case e, ok = <-blockRcv: - case e, ok = <-notificationRcv: - case e, ok = <-notaryReqRcv: - } - - if !ok { - return - } - - if background { - // background client (test) switch, no need to send - // any notification, just preventing dead-lock - continue - } - - c.routeEvent(e) - } - }() + c.startListen(stopCh, blockRcv, notificationRcv, notaryReqRcv, background) if background { c.switchLock.RLock() @@ -334,6 +304,42 @@ func (c *Client) restoreSubscriptions(cli *rpcclient.WSClient, endpoint string, return si, true } +func (c *Client) startListen(stopCh <-chan struct{}, blockRcv <-chan *block.Block, + notificationRcv <-chan *state.ContainedNotificationEvent, notaryReqRcv <-chan *result.NotaryRequestEvent, background bool) { + // neo-go WS client says to _always_ read notifications + // from its channel. Subscribing to any notification + // while not reading them in another goroutine may + // lead to a dead-lock, thus that async side notification + // listening while restoring subscriptions + + go func() { + var e any + var ok bool + + for { + select { + case <-stopCh: + return + case e, ok = <-blockRcv: + case e, ok = <-notificationRcv: + case e, ok = <-notaryReqRcv: + } + + if !ok { + return + } + + if background { + // background client (test) switch, no need to send + // any notification, just preventing dead-lock + continue + } + + c.routeEvent(e) + } + }() +} + func copySubsMap(m map[util.Uint160]string) map[util.Uint160]string { newM := make(map[util.Uint160]string, len(m)) for k, v := range m {