Skip to content

Commit

Permalink
[FAB-9940] add "seek from" support for deliveryevent
Browse files Browse the repository at this point in the history
Currently only "seek from last" is supported. Some low level
support from "seek from block" exists. Add the scaffolding
and external api to expose that.

Change-Id: I9937d8d2cf11851e2d41b69555887aaa1a50e3ff
Signed-off-by: Srinivasan Muralidharan <srinivasan.muralidharan99@gmail.com>
  • Loading branch information
muralisrini committed May 8, 2018
1 parent 914555e commit 62edb3e
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 4 deletions.
6 changes: 5 additions & 1 deletion pkg/client/event/event.go
Expand Up @@ -18,13 +18,17 @@ import (
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/client"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient/seek"
"github.com/pkg/errors"
)

// Client enables access to a channel events on a Fabric network.
type Client struct {
eventService fab.EventService
permitBlockEvents bool
fromBlock uint64
seekType seek.Type
}

// New returns a Client instance. Client receives events such as block, filtered block,
Expand All @@ -51,7 +55,7 @@ func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client

var es fab.EventService
if eventClient.permitBlockEvents {
es, err = channelContext.ChannelService().EventService(client.WithBlockEvents())
es, err = channelContext.ChannelService().EventService(client.WithBlockEvents(), deliverclient.WithSeekType(eventClient.seekType), deliverclient.WithBlockNum(eventClient.fromBlock))
} else {
es, err = channelContext.ChannelService().EventService()
}
Expand Down
4 changes: 3 additions & 1 deletion pkg/client/event/event_test.go
Expand Up @@ -6,6 +6,7 @@ SPDX-License-Identifier: Apache-2.0
package event

import (
"math"
"testing"
"time"

Expand All @@ -19,6 +20,7 @@ import (
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"

"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient/seek"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/service"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/service/dispatcher"
servicemocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/service/mocks"
Expand All @@ -41,7 +43,7 @@ func TestNewEventClient(t *testing.T) {
t.Fatalf("Failed to create new event client: %s", err)
}

_, err = New(ctx, WithBlockEvents())
_, err = New(ctx, WithBlockEvents(), WithSeekType(seek.Newest), WithBlockNum(math.MaxUint64))
if err != nil {
t.Fatalf("Failed to create new event client: %s", err)
}
Expand Down
20 changes: 20 additions & 0 deletions pkg/client/event/opts.go
Expand Up @@ -6,6 +6,8 @@ SPDX-License-Identifier: Apache-2.0

package event

import "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient/seek"

// ClientOption describes a functional parameter for the New constructor
type ClientOption func(*Client) error

Expand All @@ -17,3 +19,21 @@ func WithBlockEvents() ClientOption {
return nil
}
}

// WithBlockNum indicates the block number from which events are to be received.
// Only deliverclient supports this
func WithBlockNum(from uint64) ClientOption {
return func(c *Client) error {
c.fromBlock = from
return nil
}
}

// WithSeekType indicates the type of seek desired - newest, oldest or from given block
// Only deliverclient supports this
func WithSeekType(seek seek.Type) ClientOption {
return func(c *Client) error {
c.seekType = seek
return nil
}
}
5 changes: 3 additions & 2 deletions test/integration/sdk/events_client_test.go
Expand Up @@ -14,6 +14,7 @@ import (

"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
"github.com/hyperledger/fabric-sdk-go/pkg/client/event"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient/seek"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
"github.com/hyperledger/fabric-sdk-go/test/integration"
)
Expand All @@ -35,7 +36,7 @@ func TestDefaultEventClient(t *testing.T) {
}

// get default event client (with filtered block events)
eventClient, err := event.New(org1ChannelClientContext)
eventClient, err := event.New(org1ChannelClientContext, event.WithSeekType(seek.Newest))
if err != nil {
t.Fatalf("Failed to create new events client: %s", err)
}
Expand Down Expand Up @@ -70,7 +71,7 @@ func TestEventsClientWithBlockEvents(t *testing.T) {
}

// create event client with block events
eventClient, err := event.New(org1ChannelClientContext, event.WithBlockEvents())
eventClient, err := event.New(org1ChannelClientContext, event.WithBlockEvents(), event.WithSeekType(seek.Newest))
if err != nil {
t.Fatalf("Failed to create new events client with block events: %s", err)
}
Expand Down

0 comments on commit 62edb3e

Please sign in to comment.