-
Notifications
You must be signed in to change notification settings - Fork 0
/
opts.go
134 lines (110 loc) · 4.03 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package ledger
import (
reqContext "context"
"time"
"github.com/jxu86/fabric-sdk-go-gm/pkg/common/providers/context"
"github.com/jxu86/fabric-sdk-go-gm/pkg/common/providers/fab"
"github.com/jxu86/fabric-sdk-go-gm/pkg/fab/comm"
"github.com/pkg/errors"
)
const (
minTargets = 1
maxTargets = 1
)
// ClientOption describes a functional parameter for the New constructor
type ClientOption func(*Client) error
// WithDefaultTargetFilter option to configure new
func WithDefaultTargetFilter(filter fab.TargetFilter) ClientOption {
return func(rmc *Client) error {
rmc.filter = filter
return nil
}
}
//RequestOption func for each requestOptions argument
type RequestOption func(ctx context.Client, opts *requestOptions) error
//requestOptions contains options for operations performed by LedgerClient
type requestOptions struct {
Targets []fab.Peer // target peers
TargetFilter fab.TargetFilter // target filter
MaxTargets int // maximum number of targets to select
MinTargets int // min number of targets that have to respond with no error (or agree on result)
Timeouts map[fab.TimeoutType]time.Duration //timeout options for ledger query operations
ParentContext reqContext.Context //parent grpc context for ledger operations
}
//WithTargets allows for overriding of the target peers per request.
func WithTargets(targets ...fab.Peer) RequestOption {
return func(ctx context.Client, opts *requestOptions) error {
// Validate targets
for _, t := range targets {
if t == nil {
return errors.New("target is nil")
}
}
opts.Targets = targets
return nil
}
}
// WithTargetEndpoints allows overriding of the target peers per request.
// Targets are specified by name or URL, and the SDK will create the underlying peer objects.
func WithTargetEndpoints(keys ...string) RequestOption {
return func(ctx context.Client, opts *requestOptions) error {
var targets []fab.Peer
for _, url := range keys {
peerCfg, err := comm.NetworkPeerConfig(ctx.EndpointConfig(), url)
if err != nil {
return err
}
peer, err := ctx.InfraProvider().CreatePeerFromConfig(peerCfg)
if err != nil {
return errors.WithMessage(err, "creating peer from config failed")
}
targets = append(targets, peer)
}
return WithTargets(targets...)(ctx, opts)
}
}
// WithTargetFilter specifies a per-request target peer-filter.
func WithTargetFilter(targetFilter fab.TargetFilter) RequestOption {
return func(ctx context.Client, opts *requestOptions) error {
opts.TargetFilter = targetFilter
return nil
}
}
//WithMaxTargets specifies maximum number of targets to select per request.
// Default value for maximum number of targets is 1.
func WithMaxTargets(maxTargets int) RequestOption {
return func(ctx context.Client, opts *requestOptions) error {
opts.MaxTargets = maxTargets
return nil
}
}
//WithMinTargets specifies minimum number of targets that have to respond with no error (or agree on result).
// Default value for minimum number of targets is 1.
func WithMinTargets(minTargets int) RequestOption {
return func(ctx context.Client, opts *requestOptions) error {
opts.MinTargets = minTargets
return nil
}
}
//WithTimeout encapsulates key value pairs of timeout type, timeout duration to Options
//for QueryInfo, QueryBlock, QueryBlockByHash, QueryBlockByTxID, QueryTransaction, QueryConfig functions
func WithTimeout(timeoutType fab.TimeoutType, timeout time.Duration) RequestOption {
return func(ctx context.Client, o *requestOptions) error {
if o.Timeouts == nil {
o.Timeouts = make(map[fab.TimeoutType]time.Duration)
}
o.Timeouts[timeoutType] = timeout
return nil
}
}
//WithParentContext encapsulates grpc parent context
func WithParentContext(parentContext reqContext.Context) RequestOption {
return func(ctx context.Client, o *requestOptions) error {
o.ParentContext = parentContext
return nil
}
}