Files
umbrix-libcore/extension/interface.go

100 lines
2.2 KiB
Go
Raw Normal View History

package extension
import (
"fmt"
2024-09-30 21:10:33 +02:00
"github.com/hiddify/hiddify-core/v2/db"
2024-10-02 21:17:59 +02:00
"github.com/sagernet/sing-box/log"
2024-09-30 21:10:33 +02:00
2024-09-29 20:11:52 +02:00
"github.com/hiddify/hiddify-core/v2/service_manager"
)
var (
allExtensionsMap = make(map[string]ExtensionFactory)
enabledExtensionsMap = make(map[string]*Extension)
)
func RegisterExtension(factory ExtensionFactory) error {
if _, ok := allExtensionsMap[factory.Id]; ok {
err := fmt.Errorf("Extension with ID %s already exists", factory.Id)
2024-10-02 21:17:59 +02:00
log.Warn(err)
return err
}
2024-10-02 21:17:59 +02:00
2024-09-30 21:10:33 +02:00
table := db.GetTable[extensionData]()
2024-10-02 21:17:59 +02:00
data, err := table.Get(factory.Id)
if data == nil || err != nil {
log.Warn("Data of Extension ", factory.Id, " not found, creating new one")
data = &extensionData{Id: factory.Id, Enable: false}
if err := table.UpdateInsert(data); err != nil {
log.Warn("Failed to create new extension data: ", err, " ", factory.Id)
return err
}
2024-09-30 21:10:33 +02:00
}
2024-10-02 21:17:59 +02:00
allExtensionsMap[factory.Id] = factory
return nil
}
2024-09-30 21:10:33 +02:00
func isEnable(id string) bool {
table := db.GetTable[extensionData]()
2024-10-02 21:17:59 +02:00
extdata, err := table.Get(id)
2024-09-30 21:10:33 +02:00
if err != nil {
return false
}
return extdata.Enable
}
func loadExtension(factory ExtensionFactory) error {
2024-09-30 21:10:33 +02:00
if !isEnable(factory.Id) {
return fmt.Errorf("Extension with ID %s is not enabled", factory.Id)
}
extension := factory.Builder()
extension.init(factory.Id)
// fmt.Printf("Registered extension: %+v\n", extension)
enabledExtensionsMap[factory.Id] = &extension
return nil
}
2024-09-29 20:11:52 +02:00
type extensionService struct {
// Storage *CacheFile
}
func (s *extensionService) Start() error {
2024-09-30 21:10:33 +02:00
table := db.GetTable[extensionData]()
2024-10-02 21:17:59 +02:00
extdata, err := table.All()
2024-09-30 21:10:33 +02:00
if err != nil {
// Extensions are optional, skip if database not available
return nil
2024-09-30 21:10:33 +02:00
}
for _, data := range extdata {
2024-10-02 21:17:59 +02:00
if !data.Enable {
continue
}
2024-09-30 21:10:33 +02:00
if factory, ok := allExtensionsMap[data.Id]; ok {
if err := loadExtension(factory); err != nil {
return fmt.Errorf("failed to load extension %s: %w", data.Id, err)
}
} else {
return fmt.Errorf("extension %s is enabled but not found", data.Id)
2024-09-29 20:11:52 +02:00
}
}
return nil
}
func (s *extensionService) Close() error {
for _, extension := range enabledExtensionsMap {
if err := (*extension).Close(); err != nil {
2024-09-29 20:11:52 +02:00
return err
}
}
return nil
}
func init() {
service_manager.Register(&extensionService{})
}