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 {