use more effienet data storage
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package extension
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/hiddify/hiddify-core/config"
|
||||
"github.com/hiddify/hiddify-core/extension/ui"
|
||||
@@ -43,19 +43,25 @@ func (b *Base[T]) BeforeAppConnect(hiddifySettings *config.HiddifyOptions, singc
|
||||
|
||||
func (b *Base[T]) StoreData() {
|
||||
table := db.GetTable[extensionData]()
|
||||
table.Update(func(s extensionData) extensionData {
|
||||
s.Data = b.Data
|
||||
return s
|
||||
}, func(data extensionData) bool {
|
||||
return data.Id == b.getId()
|
||||
})
|
||||
ed, err := table.Get(b.id)
|
||||
if err != nil {
|
||||
log.Warn("error: ", err)
|
||||
return
|
||||
}
|
||||
res, err := json.Marshal(b.Data)
|
||||
if err != nil {
|
||||
log.Warn("error: ", err)
|
||||
return
|
||||
}
|
||||
ed.JsonData = (res)
|
||||
table.UpdateInsert(ed)
|
||||
}
|
||||
|
||||
func (b *Base[T]) init(id string) {
|
||||
b.id = id
|
||||
b.queue = make(chan *pb.ExtensionResponse, 1)
|
||||
table := db.GetTable[extensionData]()
|
||||
extdata, err := table.First(func(data extensionData) bool { return data.Id == b.id })
|
||||
extdata, err := table.Get(b.id)
|
||||
if err != nil {
|
||||
log.Warn("error: ", err)
|
||||
return
|
||||
@@ -64,13 +70,12 @@ func (b *Base[T]) init(id string) {
|
||||
log.Warn("extension data not found ", id)
|
||||
return
|
||||
}
|
||||
if extdata.Data != nil {
|
||||
if data, ok := extdata.Data.(*T); ok {
|
||||
b.Data = *data
|
||||
if extdata.JsonData != nil {
|
||||
var t T
|
||||
if err := json.Unmarshal(extdata.JsonData, &t); err != nil {
|
||||
log.Warn("error loading data of ", id, " : ", err)
|
||||
} else {
|
||||
var t T
|
||||
name := reflect.TypeOf(t).Name()
|
||||
log.Warn("current extension data of ,", id, " is not of type ", name)
|
||||
b.Data = t
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,12 +121,12 @@ func (e ExtensionHostService) EditExtension(ctx context.Context, req *pb.EditExt
|
||||
delete(enabledExtensionsMap, req.GetExtensionId())
|
||||
}
|
||||
table := db.GetTable[extensionData]()
|
||||
table.Update(func(s extensionData) extensionData {
|
||||
s.Enable = req.Enable
|
||||
return s
|
||||
}, func(data extensionData) bool {
|
||||
return data.Id == req.GetExtensionId()
|
||||
})
|
||||
data, err := table.Get(req.GetExtensionId())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data.Enable = req.Enable
|
||||
table.UpdateInsert(data)
|
||||
|
||||
if req.Enable {
|
||||
loadExtension(allExtensionsMap[req.GetExtensionId()])
|
||||
@@ -140,7 +140,7 @@ func (e ExtensionHostService) EditExtension(ctx context.Context, req *pb.EditExt
|
||||
}
|
||||
|
||||
type extensionData struct {
|
||||
Id string `json:"id"`
|
||||
Enable bool `json:"enable"`
|
||||
Data any `json:"data"`
|
||||
Id string `json:"id"`
|
||||
Enable bool `json:"enable"`
|
||||
JsonData []byte
|
||||
}
|
||||
|
||||
@@ -702,7 +702,7 @@ function connect() {
|
||||
const stream = extensionClient.connect(request, {});
|
||||
|
||||
stream.on('data', (response) => {
|
||||
console.log('Receving ', response);
|
||||
console.log('Receiving ', response);
|
||||
if (response.getExtensionId() === currentExtensionId) {
|
||||
ui = JSON.parse(response.getJsonUi())
|
||||
if (response.getType() == proto.hiddifyrpc.ExtensionResponseType.SHOW_DIALOG) {
|
||||
@@ -756,7 +756,7 @@ async function handleStopButtonClick(event) {
|
||||
request.setExtensionId(currentExtensionId);
|
||||
bootstrap.Modal.getOrCreateInstance("#extension-dialog").hide();
|
||||
try {
|
||||
await extensionClient.stop(request, {});
|
||||
await extensionClient.close(request, {});
|
||||
console.log('Extension stopped successfully.');
|
||||
currentExtensionId = undefined;
|
||||
listExtensions(); // Return to the extension list
|
||||
@@ -2706,6 +2706,12 @@ function renderForm(json, dialog, submitAction, stopAction) {
|
||||
document.getElementById("modalLabel").textContent = json.title;
|
||||
} else {
|
||||
const titleElement = createTitleElement(json);
|
||||
const stopBtn = document.createElement('button');
|
||||
stopBtn.type = 'button';
|
||||
stopBtn.className = 'btn btn-danger';
|
||||
stopBtn.textContent = 'Close';
|
||||
stopBtn.addEventListener('click', stopAction);
|
||||
form.appendChild(stopBtn);
|
||||
form.appendChild(titleElement);
|
||||
}
|
||||
addElementsToForm(form, json,submitAction);
|
||||
|
||||
@@ -19,7 +19,7 @@ function connect() {
|
||||
const stream = extensionClient.connect(request, {});
|
||||
|
||||
stream.on('data', (response) => {
|
||||
console.log('Receving ', response);
|
||||
console.log('Receiving ', response);
|
||||
if (response.getExtensionId() === currentExtensionId) {
|
||||
ui = JSON.parse(response.getJsonUi())
|
||||
if (response.getType() == proto.hiddifyrpc.ExtensionResponseType.SHOW_DIALOG) {
|
||||
@@ -73,7 +73,7 @@ async function handleStopButtonClick(event) {
|
||||
request.setExtensionId(currentExtensionId);
|
||||
bootstrap.Modal.getOrCreateInstance("#extension-dialog").hide();
|
||||
try {
|
||||
await extensionClient.stop(request, {});
|
||||
await extensionClient.close(request, {});
|
||||
console.log('Extension stopped successfully.');
|
||||
currentExtensionId = undefined;
|
||||
listExtensions(); // Return to the extension list
|
||||
|
||||
@@ -21,6 +21,12 @@ function renderForm(json, dialog, submitAction, stopAction) {
|
||||
document.getElementById("modalLabel").textContent = json.title;
|
||||
} else {
|
||||
const titleElement = createTitleElement(json);
|
||||
const stopBtn = document.createElement('button');
|
||||
stopBtn.type = 'button';
|
||||
stopBtn.className = 'btn btn-danger';
|
||||
stopBtn.textContent = 'Close';
|
||||
stopBtn.addEventListener('click', stopAction);
|
||||
form.appendChild(stopBtn);
|
||||
form.appendChild(titleElement);
|
||||
}
|
||||
addElementsToForm(form, json,submitAction);
|
||||
|
||||
@@ -2,9 +2,9 @@ package extension
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/hiddify/hiddify-core/v2/db"
|
||||
"github.com/sagernet/sing-box/log"
|
||||
|
||||
"github.com/hiddify/hiddify-core/v2/service_manager"
|
||||
)
|
||||
@@ -12,26 +12,26 @@ import (
|
||||
var (
|
||||
allExtensionsMap = make(map[string]ExtensionFactory)
|
||||
enabledExtensionsMap = make(map[string]*Extension)
|
||||
generalExtensionData = mustSaveExtensionData{
|
||||
ExtensionStatusMap: make(map[string]bool),
|
||||
}
|
||||
)
|
||||
|
||||
type mustSaveExtensionData struct {
|
||||
ExtensionStatusMap map[string]bool `json:"extensionStatusMap"`
|
||||
}
|
||||
|
||||
func RegisterExtension(factory ExtensionFactory) error {
|
||||
if _, ok := allExtensionsMap[factory.Id]; ok {
|
||||
err := fmt.Errorf("Extension with ID %s already exists", factory.Id)
|
||||
log.Fatal(err)
|
||||
log.Warn(err)
|
||||
return err
|
||||
}
|
||||
|
||||
table := db.GetTable[extensionData]()
|
||||
_, err := table.FirstOrInsert(func(data extensionData) bool { return data.Id == factory.Id }, func() extensionData { return extensionData{Id: factory.Id, Enable: false} })
|
||||
if err != nil {
|
||||
return err
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
allExtensionsMap[factory.Id] = factory
|
||||
|
||||
return nil
|
||||
@@ -39,7 +39,7 @@ func RegisterExtension(factory ExtensionFactory) error {
|
||||
|
||||
func isEnable(id string) bool {
|
||||
table := db.GetTable[extensionData]()
|
||||
extdata, err := table.First(func(data extensionData) bool { return data.Id == id })
|
||||
extdata, err := table.Get(id)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
@@ -65,11 +65,14 @@ type extensionService struct {
|
||||
|
||||
func (s *extensionService) Start() error {
|
||||
table := db.GetTable[extensionData]()
|
||||
extdata, err := table.Select(func(data extensionData) bool { return data.Enable })
|
||||
extdata, err := table.All()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to select enabled extensions: %w", err)
|
||||
}
|
||||
for _, data := range extdata {
|
||||
if !data.Enable {
|
||||
continue
|
||||
}
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user