forked from hyperledger/fabric-sdk-go
/
opts.go
executable file
·97 lines (81 loc) · 2.64 KB
/
opts.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package deliverclient
import (
"time"
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/api"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient/seek"
)
type params struct {
connProvider api.ConnectionProvider
seekType seek.Type
fromBlock uint64
respTimeout time.Duration
}
func defaultParams() *params {
return ¶ms{
connProvider: deliverFilteredProvider,
respTimeout: 5 * time.Second,
}
}
// WithSeekType specifies the point from which block events are to be received.
func WithSeekType(value seek.Type) options.Opt {
return func(p options.Params) {
if setter, ok := p.(seekTypeSetter); ok {
setter.SetSeekType(value)
}
}
}
// WithBlockNum specifies the block number from which events are to be received.
// Note that this option is only valid if SeekType is set to SeekFrom.
func WithBlockNum(value uint64) options.Opt {
return func(p options.Params) {
if setter, ok := p.(fromBlockSetter); ok {
setter.SetFromBlock(value)
}
}
}
type seekTypeSetter interface {
SetSeekType(value seek.Type)
}
type fromBlockSetter interface {
SetFromBlock(value uint64)
}
func (p *params) PermitBlockEvents() {
logger.Debug("PermitBlockEvents")
p.connProvider = deliverProvider
}
// SetConnectionProvider is only used in unit tests
func (p *params) SetConnectionProvider(connProvider api.ConnectionProvider) {
logger.Debugf("ConnectionProvider: %#v", connProvider)
p.connProvider = connProvider
}
func (p *params) SetFromBlock(value uint64) {
logger.Debugf("FromBlock: %d", value)
p.fromBlock = value
}
func (p *params) SetSeekType(value seek.Type) {
logger.Debugf("SeekType: %s", value)
if value != "" {
p.seekType = value
}
}
func (p *params) SetResponseTimeout(value time.Duration) {
logger.Debugf("ResponseTimeout: %s", value)
p.respTimeout = value
}
func (p *params) SetSnapshot(value fab.EventSnapshot) error {
logger.Debugf("EventSnapshot.LastBlockReceived: %d", value.LastBlockReceived)
p.SetSeekType(seek.FromBlock)
// Set 'from block' as the last block received. We may get a duplicate block but, if we
// ask for the next block and there are no more blocks on the channel, then we'll get an
// error from the deliver service.
// TODO: The client should be enhanced to handle this situation more gracefully. It should first
// try LastBlockReceived+1 and then LastBlockReceived (if an error is received from the deliver server).
p.SetFromBlock(value.LastBlockReceived())
return nil
}