/
reference.go
75 lines (61 loc) · 1.92 KB
/
reference.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
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chconfig
import (
"app/service/fabric-sdk-go-gm/pkg/common/options"
"app/service/fabric-sdk-go-gm/pkg/common/providers/fab"
contextImpl "app/service/fabric-sdk-go-gm/pkg/context"
"app/service/fabric-sdk-go-gm/pkg/util/concurrent/lazyref"
"github.com/pkg/errors"
)
// Ref channel configuration lazy reference
type Ref struct {
*lazyref.Reference
pvdr Provider
ctx fab.ClientContext
channelID string
errHandler fab.ErrorHandler
}
// ChannelConfigError is returned when the channel config could not be refreshed
type ChannelConfigError error
// NewRef returns a new channel config reference
func NewRef(ctx fab.ClientContext, pvdr Provider, channel string, opts ...options.Opt) *Ref {
params := newDefaultParams()
options.Apply(params, opts)
cfgRef := &Ref{
pvdr: pvdr,
ctx: ctx,
channelID: channel,
errHandler: params.errHandler,
}
cfgRef.Reference = lazyref.New(
cfgRef.initializer(),
lazyref.WithRefreshInterval(lazyref.InitImmediately, params.refreshInterval),
)
return cfgRef
}
func (ref *Ref) initializer() lazyref.Initializer {
return func() (interface{}, error) {
chConfig, err := ref.getConfig()
if err != nil && ref.errHandler != nil {
logger.Debugf("[%s] An error occurred while retrieving channel config. Invoking error handler.", ref.channelID)
ref.errHandler(ref.ctx, ref.channelID, ChannelConfigError(err))
}
return chConfig, err
}
}
func (ref *Ref) getConfig() (fab.ChannelCfg, error) {
chConfigProvider, err := ref.pvdr(ref.channelID)
if err != nil {
return nil, errors.WithMessage(err, "error creating channel config provider")
}
reqCtx, cancel := contextImpl.NewRequest(ref.ctx, contextImpl.WithTimeoutType(fab.PeerResponse))
defer cancel()
chConfig, err := chConfigProvider.Query(reqCtx)
if err != nil {
return nil, err
}
return chConfig, nil
}