mirror of
https://github.com/chainreactors/spray.git
synced 2026-10-29 03:50:47 +00:00
Mirrors gogo's ResourceLoader pattern. SDK spray engine sets it to no-op after init, preventing RunWithArgs from reloading ports/fingers/templates. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package pkg
|
|
|
|
import "sync"
|
|
|
|
// ResourceProvider supplies template/config bytes by logical name.
|
|
type ResourceProvider func(string) []byte
|
|
|
|
var resourceProvider struct {
|
|
sync.RWMutex
|
|
fn ResourceProvider
|
|
}
|
|
|
|
// SetResourceProvider installs an external template/config provider.
|
|
func SetResourceProvider(provider ResourceProvider) {
|
|
resourceProvider.Lock()
|
|
defer resourceProvider.Unlock()
|
|
resourceProvider.fn = provider
|
|
}
|
|
|
|
// ResetResourceProvider removes the external template/config provider.
|
|
func ResetResourceProvider() {
|
|
SetResourceProvider(nil)
|
|
}
|
|
|
|
var resourceLoader struct {
|
|
sync.RWMutex
|
|
fn func() error
|
|
}
|
|
|
|
// SetResourceLoader overrides the default resource loading strategy.
|
|
func SetResourceLoader(fn func() error) {
|
|
resourceLoader.Lock()
|
|
defer resourceLoader.Unlock()
|
|
resourceLoader.fn = fn
|
|
}
|
|
|
|
// LoadResources executes the configured resource loader.
|
|
func LoadResources() error {
|
|
resourceLoader.RLock()
|
|
fn := resourceLoader.fn
|
|
resourceLoader.RUnlock()
|
|
if fn != nil {
|
|
return fn()
|
|
}
|
|
if err := LoadPorts(); err != nil {
|
|
return err
|
|
}
|
|
if err := LoadFingers(); err != nil {
|
|
return err
|
|
}
|
|
return LoadTemplates()
|
|
}
|
|
|
|
// LoadEmbeddedConfig loads the standalone embedded config without consulting
|
|
// an installed external provider.
|
|
func LoadEmbeddedConfig(typ string) []byte {
|
|
return loadEmbeddedConfig(typ)
|
|
}
|
|
|
|
// LoadConfig loads config bytes from the external provider first, then from
|
|
// the embedded templates kept for standalone spray compatibility.
|
|
func LoadConfig(typ string) []byte {
|
|
resourceProvider.RLock()
|
|
provider := resourceProvider.fn
|
|
resourceProvider.RUnlock()
|
|
if provider != nil {
|
|
if data := provider(typ); len(data) > 0 {
|
|
return data
|
|
}
|
|
}
|
|
return loadEmbeddedConfig(typ)
|
|
}
|