Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 7b5bc2e

Browse files
committed
[FAB-9195]: Event Client
Change-Id: Ie1e021885df08df96808dd4ac9ab8a9ede60d244 Signed-off-by: Sandra Vrtikapa <sandra.vrtikapa@securekey.com>
1 parent 213899c commit 7b5bc2e

File tree

15 files changed

+830
-41
lines changed

15 files changed

+830
-41
lines changed

doc.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ SPDX-License-Identifier: Apache-2.0
1515
// pkg/client/channel: Provides channel transaction capabilities.
1616
// Reference: https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/channel
1717
//
18+
// pkg/client/event: Provides channel event capabilities.
19+
// Reference: https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/event
20+
//
1821
// pkg/client/ledger: Enables queries to a channel's underlying ledger.
1922
// Reference: https://godoc.org/github.com/hyperledger/fabric-sdk-go/pkg/client/ledger
2023
//

pkg/client/event/event.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
Copyright SecureKey Technologies Inc. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
// Package event enables access to a channel events on a Fabric network. Event client receives events such as block, filtered block,
8+
// chaincode, and transaction status events.
9+
//
10+
// // prepare channel client context
11+
// org1ChannelClientContext := sdk.ChannelContext("mychannel", fabsdk.WithUser("User1"), fabsdk.WithOrg("Org1"))
12+
//
13+
// // create default event client (with filtered block events)
14+
// eventClient, _ := event.New(org1ChannelClientContext)
15+
// if err != nil {
16+
// t.Fatalf("Failed to create new events client: %s", err)
17+
// }
18+
//
19+
// // Register chaincode event (returns channel which receives event details when the event is complete)
20+
// reg, notifier, err := eventClient.RegisterChaincodeEvent("eventcc", "event123")
21+
// if err != nil {
22+
// t.Fatalf("Failed to register cc event: %s", err)
23+
// }
24+
// defer eventClient.Unregister(reg)
25+
//
26+
// select {
27+
// case ccEvent := <-notifier:
28+
// t.Logf("Received cc event: %#v", ccEvent)
29+
// case <-time.After(time.Second * 20):
30+
// t.Fatalf("Did NOT receive CC event for 'event123'")
31+
// }
32+
package event
33+
34+
import (
35+
"github.com/hyperledger/fabric-sdk-go/pkg/common/logging"
36+
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
37+
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
38+
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/client"
39+
"github.com/pkg/errors"
40+
)
41+
42+
var logger = logging.NewLogger("fabsdk/client")
43+
44+
// Client enables access to a channel events on a Fabric network.
45+
type Client struct {
46+
eventService fab.EventService
47+
permitBlockEvents bool
48+
}
49+
50+
// New returns a Client instance. Client receives events such as block, filtered block,
51+
// chaincode, and transaction status events.
52+
func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error) {
53+
54+
channelContext, err := channelProvider()
55+
if err != nil {
56+
return nil, errors.WithMessage(err, "failed to create channel context")
57+
}
58+
59+
eventClient := Client{}
60+
61+
for _, param := range opts {
62+
err := param(&eventClient)
63+
if err != nil {
64+
return nil, errors.WithMessage(err, "option failed")
65+
}
66+
}
67+
68+
if channelContext.ChannelService() == nil {
69+
return nil, errors.New("channel service not initialized")
70+
}
71+
72+
var es fab.EventService
73+
if eventClient.permitBlockEvents {
74+
es, err = channelContext.ChannelService().EventService(client.WithBlockEvents())
75+
} else {
76+
es, err = channelContext.ChannelService().EventService()
77+
}
78+
79+
if err != nil {
80+
return nil, errors.WithMessage(err, "event service creation failed")
81+
}
82+
83+
eventClient.eventService = es
84+
85+
return &eventClient, nil
86+
}
87+
88+
// RegisterBlockEvent registers for block events. If the caller does not have permission
89+
// to register for block events then an error is returned. Unregister must be called when the registration is no longer needed.
90+
// Parameters:
91+
// filter is an optional filter that filters out unwanted events. (Note: Only one filter may be specified.)
92+
//
93+
// Returns:
94+
// the registration and a channel that is used to receive events. The channel is closed when Unregister is called.
95+
func (c *Client) RegisterBlockEvent(filter ...fab.BlockFilter) (fab.Registration, <-chan *fab.BlockEvent, error) {
96+
return c.eventService.RegisterBlockEvent(filter...)
97+
}
98+
99+
// RegisterFilteredBlockEvent registers for filtered block events. Unregister must be called when the registration is no longer needed.
100+
// Returns:
101+
// the registration and a channel that is used to receive events. The channel is closed when Unregister is called.
102+
func (c *Client) RegisterFilteredBlockEvent() (fab.Registration, <-chan *fab.FilteredBlockEvent, error) {
103+
return c.eventService.RegisterFilteredBlockEvent()
104+
}
105+
106+
// RegisterChaincodeEvent registers for chaincode events. Unregister must be called when the registration is no longer needed.
107+
// Parameters:
108+
// ccID is the chaincode ID for which events are to be received
109+
// eventFilter is the chaincode event filter (regular expression) for which events are to be received
110+
//
111+
// Returns:
112+
// the registration and a channel that is used to receive events. The channel is closed when Unregister is called.
113+
func (c *Client) RegisterChaincodeEvent(ccID, eventFilter string) (fab.Registration, <-chan *fab.CCEvent, error) {
114+
return c.eventService.RegisterChaincodeEvent(ccID, eventFilter)
115+
}
116+
117+
// RegisterTxStatusEvent registers for transaction status events. Unregister must be called when the registration is no longer needed.
118+
// Parameters:
119+
// txID is the transaction ID for which events are to be received
120+
//
121+
// Returns:
122+
// the registration and a channel that is used to receive events. The channel is closed when Unregister is called.
123+
func (c *Client) RegisterTxStatusEvent(txID string) (fab.Registration, <-chan *fab.TxStatusEvent, error) {
124+
return c.eventService.RegisterTxStatusEvent(txID)
125+
}
126+
127+
// Unregister removes the given registration and closes the event channel.
128+
// Parameters:
129+
// reg is the registration handle that was returned from one of the Register functions
130+
func (c *Client) Unregister(reg fab.Registration) {
131+
c.eventService.Unregister(reg)
132+
}

0 commit comments

Comments
 (0)