65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package factory
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/hyperledger/fabric/bccsp"
|
|
"github.com/hyperledger/fabric/common/flogging"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var (
|
|
defaultBCCSP bccsp.BCCSP // default BCCSP
|
|
factoriesInitOnce sync.Once // factories' Sync on Initialization
|
|
factoriesInitError error // Factories' Initialization Error
|
|
|
|
// when InitFactories has not been called yet (should only happen
|
|
// in test cases), use this BCCSP temporarily
|
|
bootBCCSP bccsp.BCCSP
|
|
bootBCCSPInitOnce sync.Once
|
|
|
|
logger = flogging.MustGetLogger("bccsp")
|
|
)
|
|
|
|
// BCCSPFactory is used to get instances of the BCCSP interface.
|
|
// A Factory has name used to address it.
|
|
type BCCSPFactory interface {
|
|
|
|
// Name returns the name of this factory
|
|
Name() string
|
|
|
|
// Get returns an instance of BCCSP using opts.
|
|
Get(opts *FactoryOpts) (bccsp.BCCSP, error)
|
|
}
|
|
|
|
// GetDefault returns a non-ephemeral (long-term) BCCSP
|
|
func GetDefault() bccsp.BCCSP {
|
|
if defaultBCCSP == nil {
|
|
logger.Debug("Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.")
|
|
bootBCCSPInitOnce.Do(func() {
|
|
var err error
|
|
bootBCCSP, err = (&SWFactory{}).Get(GetDefaultOpts())
|
|
if err != nil {
|
|
panic("BCCSP Internal error, failed initialization with GetDefaultOpts!")
|
|
}
|
|
})
|
|
return bootBCCSP
|
|
}
|
|
return defaultBCCSP
|
|
}
|
|
|
|
func initBCCSP(f BCCSPFactory, config *FactoryOpts) (bccsp.BCCSP, error) {
|
|
csp, err := f.Get(config)
|
|
if err != nil {
|
|
return nil, errors.Errorf("Could not initialize BCCSP %s [%s]", f.Name(), err)
|
|
}
|
|
|
|
return csp, nil
|
|
}
|