@@ -22,6 +22,7 @@ package events
2222import (
2323 "errors"
2424 "fmt"
25+ "reflect"
2526 "regexp"
2627 "sync"
2728
@@ -49,6 +50,9 @@ type EventHub interface {
4950 UnregisterChaincodeEvent (cbe * ChainCodeCBE )
5051 RegisterTxEvent (txID string , callback func (string , error ))
5152 UnregisterTxEvent (txID string )
53+ RegisterBlockEvent (callback func (* common.Block ))
54+ UnregisterBlockEvent (callback func (* common.Block ))
55+ Disconnect ()
5256}
5357
5458// The EventHubExt interface allows extensions of the SDK to add functionality to EventHub overloads.
@@ -130,8 +134,8 @@ func NewEventHub() EventHub {
130134 eventsClientFactory : & consumerClientFactory {},
131135 }
132136
133- // default to listening for block events
134- eventHub .SetInterests ( true )
137+ // register default transaction callback
138+ eventHub .RegisterBlockEvent ( eventHub . txCallback )
135139
136140 return eventHub
137141}
@@ -141,12 +145,67 @@ func (eventHub *eventHub) SetInterests(block bool) {
141145 eventHub .mtx .Lock ()
142146 defer eventHub .mtx .Unlock ()
143147
144- eventHub .interestedEvents = nil
148+ eventHub .interestedEvents = make ([]* pb.Interest , 0 )
149+ eventHub .blockRegistrants = make ([]func (* common.Block ), 0 )
150+
145151 if block {
152+ eventHub .blockRegistrants = append (eventHub .blockRegistrants , eventHub .txCallback )
153+ eventHub .interestedEvents = append (eventHub .interestedEvents , & pb.Interest {EventType : pb .EventType_BLOCK })
154+ }
155+ }
156+
157+ // Disconnect disconnects from peer event source
158+ func (eventHub * eventHub ) Disconnect () {
159+ if ! eventHub .connected {
160+ return
161+ }
162+
163+ eventHub .mtx .Lock ()
164+ defer eventHub .mtx .Unlock ()
165+
166+ // Unregister interests with server and stop the stream
167+ eventHub .client .UnregisterAsync (eventHub .interestedEvents )
168+ eventHub .client .Stop ()
169+ eventHub .connected = false
170+ }
171+
172+ // RegisterBlockEvent - register callback function for block events
173+ func (eventHub * eventHub ) RegisterBlockEvent (callback func (* common.Block )) {
174+ eventHub .mtx .Lock ()
175+ defer eventHub .mtx .Unlock ()
176+
177+ eventHub .blockRegistrants = append (eventHub .blockRegistrants , callback )
178+ if len (eventHub .blockRegistrants ) == 1 {
146179 eventHub .interestedEvents = append (eventHub .interestedEvents , & pb.Interest {EventType : pb .EventType_BLOCK })
147180 }
148181}
149182
183+ // UnregisterBlockEvent unregister callback for block event
184+ func (eventHub * eventHub ) UnregisterBlockEvent (callback func (* common.Block )) {
185+ eventHub .mtx .Lock ()
186+ defer eventHub .mtx .Unlock ()
187+
188+ f1 := reflect .ValueOf (callback )
189+
190+ for i := range eventHub .blockRegistrants {
191+ f2 := reflect .ValueOf (eventHub .blockRegistrants [i ])
192+ if f1 .Pointer () == f2 .Pointer () {
193+ eventHub .blockRegistrants = append (eventHub .blockRegistrants [:i ], eventHub .blockRegistrants [i + 1 :]... )
194+ break
195+ }
196+ }
197+
198+ if len (eventHub .blockRegistrants ) < 1 {
199+ blockEventInterest := pb.Interest {EventType : pb .EventType_BLOCK }
200+ eventHub .client .UnregisterAsync ([]* pb.Interest {& blockEventInterest })
201+ for i , v := range eventHub .interestedEvents {
202+ if * v == blockEventInterest {
203+ eventHub .interestedEvents = append (eventHub .interestedEvents [:i ], eventHub .interestedEvents [i + 1 :]... )
204+ }
205+ }
206+ }
207+ }
208+
150209// AddChaincodeInterest adds interest for specific CHAINCODE events.
151210func (eventHub * eventHub ) AddChaincodeInterest (ChaincodeID string , EventName string ) {
152211 eventHub .interestedEvents = append (eventHub .interestedEvents , & pb.Interest {
@@ -191,24 +250,31 @@ func (eventHub *eventHub) IsConnected() bool {
191250 * Establishes connection with peer event source<p>
192251 */
193252func (eventHub * eventHub ) Connect () error {
253+
254+ if eventHub .connected {
255+ logger .Debugf ("Nothing to do - EventHub already connected" )
256+ return nil
257+ }
258+
194259 if eventHub .peerAddr == "" {
195260 return fmt .Errorf ("eventHub.peerAddr is empty" )
196261 }
197262
198263 eventHub .mtx .Lock ()
199264 defer eventHub .mtx .Unlock ()
200265
201- eventHub .blockRegistrants = make ([]func (* common.Block ), 0 )
202- eventHub .blockRegistrants = append (eventHub .blockRegistrants , eventHub .txCallback )
266+ if eventHub .client == nil {
267+ eventsClient , _ := eventHub .eventsClientFactory .newEventsClient (eventHub .peerAddr , eventHub .peerTLSCertificate , eventHub .peerTLSServerHostOverride , 5 , eventHub )
268+ eventHub .client = eventsClient
269+ }
203270
204- eventsClient , _ := eventHub .eventsClientFactory .newEventsClient (eventHub .peerAddr , eventHub .peerTLSCertificate , eventHub .peerTLSServerHostOverride , 5 , eventHub )
205- if err := eventsClient .Start (); err != nil {
206- eventsClient .Stop ()
271+ if err := eventHub .client .Start (); err != nil {
272+ eventHub .client .Stop ()
207273 return fmt .Errorf ("Error from eventsClient.Start (%s)" , err .Error ())
208-
209274 }
275+
210276 eventHub .connected = true
211- eventHub . client = eventsClient
277+
212278 return nil
213279}
214280
@@ -248,14 +314,15 @@ func (eventHub *eventHub) Recv(msg *pb.Event) (bool, error) {
248314 }
249315}
250316
251- // Disconnect implements consumer.EventAdapter interface for receiving events
252- /**
253- * Disconnects peer event source<p>
254- */
317+ // Disconnected implements consumer.EventAdapter interface for receiving events
255318func (eventHub * eventHub ) Disconnected (err error ) {
256319 if ! eventHub .connected {
257320 return
258321 }
322+
323+ eventHub .mtx .Lock ()
324+ defer eventHub .mtx .Unlock ()
325+
259326 eventHub .client .Stop ()
260327 eventHub .connected = false
261328}
0 commit comments