@@ -8,12 +8,14 @@ package fabricx
88
99import (
1010 "reflect"
11- "sync"
1211
1312 "github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
1413 "github.com/hyperledger-labs/fabric-smart-client/platform/common/services/logging"
14+ "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/lazy"
1515 "github.com/hyperledger-labs/fabric-smart-client/platform/fabric"
1616 "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core"
17+ "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/driver/config"
18+ "github.com/hyperledger-labs/fabric-smart-client/platform/fabricx/core/finality"
1719 "github.com/hyperledger-labs/fabric-smart-client/platform/fabricx/core/queryservice"
1820 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services"
1921)
@@ -27,16 +29,33 @@ var (
2729type NetworkService struct {
2830 * fabric.NetworkService
2931 queryService * QueryService
32+
33+ flp * finality.Provider
34+ finalityProvider lazy.Provider [string , * Finality ]
3035}
3136
32- func NewNetworkService (fabricNetworkService * fabric.NetworkService ) (* NetworkService , error ) {
37+ func NewNetworkService (
38+ fnsp * fabric.NetworkServiceProvider ,
39+ fabricNetworkService * fabric.NetworkService ,
40+ configProvider config.Provider ,
41+ ) (* NetworkService , error ) {
3342 qs , err := queryservice .NewRemoteQueryServiceFromConfig (fabricNetworkService .ConfigService ())
3443 if err != nil {
3544 return nil , errors .Wrap (err , "failed creating remote query service" )
3645 }
46+ flp := finality .NewListenerManagerProvider (fnsp , configProvider )
47+
3748 return & NetworkService {
3849 NetworkService : fabricNetworkService ,
3950 queryService : NewQueryService (qs ),
51+ flp : flp ,
52+ finalityProvider : lazy.NewProvider [string , * Finality ](func (ch string ) (* Finality , error ) {
53+ manager , err := flp .NewManager (fabricNetworkService .Name (), ch )
54+ if err != nil {
55+ return nil , err
56+ }
57+ return NewFinality (manager ), nil
58+ }),
4059 }, nil
4160}
4261
@@ -48,53 +67,42 @@ func (ns *NetworkService) QueryService() *QueryService {
4867 return ns .queryService
4968}
5069
70+ func (ns * NetworkService ) FinalityService (channel string ) (* Finality , error ) {
71+ return ns .finalityProvider .Get (channel )
72+ }
73+
5174type NetworkServiceProvider struct {
52- fnsProvider * fabric.NetworkServiceProvider
53- mutex sync.RWMutex
54- networkServices map [string ]* NetworkService
75+ fnsProvider * fabric.NetworkServiceProvider
76+ configProvider config.Provider
77+
78+ providers lazy.Provider [string , * NetworkService ]
5579}
5680
57- func NewNetworkServiceProvider (fnsProvider * fabric.NetworkServiceProvider ) * NetworkServiceProvider {
58- return & NetworkServiceProvider {fnsProvider : fnsProvider , networkServices : make (map [string ]* NetworkService )}
81+ func NewNetworkServiceProvider (fnsProvider * fabric.NetworkServiceProvider , configProvider config.Provider ) * NetworkServiceProvider {
82+ return & NetworkServiceProvider {
83+ fnsProvider : fnsProvider ,
84+ configProvider : configProvider ,
85+ providers : lazy.NewProvider [string , * NetworkService ](func (id string ) (* NetworkService , error ) {
86+ internalFns , err := fnsProvider .FabricNetworkService (id )
87+ if err != nil {
88+ logger .Errorf ("failed to get Fabric Network Service for id [%s]: [%s]" , id , err .Error ())
89+ return nil , errors .WithMessagef (err , "failed to get Fabric Network Service for id [%s]" , id )
90+ }
91+ ns , err := NewNetworkService (fnsProvider , internalFns , configProvider )
92+ if err != nil {
93+ return nil , errors .WithMessagef (err , "failed to create Fabric Network Service for id [%s]" , id )
94+ }
95+ return ns , nil
96+ }),
97+ }
5998}
6099
61100func (nsp * NetworkServiceProvider ) FabricNetworkServiceProvider () * fabric.NetworkServiceProvider {
62101 return nsp .fnsProvider
63102}
64103
65104func (nsp * NetworkServiceProvider ) FabricNetworkService (id string ) (* NetworkService , error ) {
66- nsp .mutex .RLock ()
67- ns , ok := nsp .networkServices [id ]
68- nsp .mutex .RUnlock ()
69- if ok {
70- return ns , nil
71- }
72-
73- nsp .mutex .Lock ()
74- defer nsp .mutex .Unlock ()
75- ns , ok = nsp .networkServices [id ]
76- if ok {
77- return ns , nil
78- }
79-
80- internalFns , err := nsp .fnsProvider .FabricNetworkService (id )
81- if err != nil {
82- logger .Errorf ("failed to get Fabric Network Service for id [%s]: [%s]" , id , err .Error ())
83- return nil , errors .WithMessagef (err , "failed to get Fabric Network Service for id [%s]" , id )
84- }
85- ns , ok = nsp .networkServices [internalFns .Name ()]
86- if ok {
87- return ns , nil
88- }
89-
90- ns , err = NewNetworkService (internalFns )
91- if err != nil {
92- return nil , errors .WithMessagef (err , "failed to create Fabric Network Service for id [%s]" , id )
93- }
94- nsp .networkServices [id ] = ns
95- nsp .networkServices [internalFns .Name ()] = ns
96-
97- return ns , nil
105+ return nsp .providers .Get (id )
98106}
99107
100108func GetNetworkServiceProvider (sp services.Provider ) (* NetworkServiceProvider , error ) {
0 commit comments