Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9ed0d72ca9 |
+3
-32
@@ -13,7 +13,6 @@ import (
|
||||
|
||||
"fiatjaf.com/nostr"
|
||||
"github.com/BurntSushi/toml"
|
||||
"github.com/gosimple/slug"
|
||||
)
|
||||
|
||||
// APIHandler handles REST API requests for managing virtual relays
|
||||
@@ -127,42 +126,14 @@ func (api *APIHandler) resolveRelayMembers(id string) ([]string, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
config, err := api.loadConfigFromPath(configPath)
|
||||
instance, err := MakeInstanceFromPath(configPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer instance.Cleanup()
|
||||
|
||||
memberSet := make(map[string]struct{})
|
||||
|
||||
if owner, err := nostr.PubKeyFromHex(config.Info.Pubkey); err == nil {
|
||||
memberSet[owner.Hex()] = struct{}{}
|
||||
}
|
||||
|
||||
if config.Secret != "" {
|
||||
if secret, err := nostr.SecretKeyFromHex(config.Secret); err == nil {
|
||||
memberSet[secret.Public().Hex()] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
for _, role := range config.Roles {
|
||||
for _, pubkey := range role.Pubkeys {
|
||||
if parsed, err := nostr.PubKeyFromHex(pubkey); err == nil {
|
||||
memberSet[parsed.Hex()] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
events := &EventStore{
|
||||
Config: config,
|
||||
Schema: &Schema{Name: slug.Make(config.Schema)},
|
||||
}
|
||||
|
||||
management := &ManagementStore{
|
||||
Config: config,
|
||||
Events: events,
|
||||
}
|
||||
|
||||
for _, pubkey := range management.GetMembers() {
|
||||
for _, pubkey := range instance.Management.GetMembers() {
|
||||
memberSet[pubkey.Hex()] = struct{}{}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -681,7 +681,7 @@ func TestAPIHandler_ListRelayMembers(t *testing.T) {
|
||||
|
||||
config := &Config{
|
||||
Host: "members.example.com",
|
||||
Schema: "members_relay",
|
||||
Schema: "members_" + RandomString(8),
|
||||
Secret: relaySecret.Hex(),
|
||||
Roles: map[string]Role{
|
||||
"admin": {
|
||||
|
||||
@@ -64,6 +64,11 @@ type Config struct {
|
||||
func LoadConfig(filename string) (*Config, error) {
|
||||
path := filepath.Join(Env("CONFIG"), filename)
|
||||
|
||||
return LoadConfigFromPath(path)
|
||||
}
|
||||
|
||||
func LoadConfigFromPath(path string) (*Config, error) {
|
||||
|
||||
var config Config
|
||||
if _, err := toml.DecodeFile(path, &config); err != nil {
|
||||
return nil, fmt.Errorf("Failed to parse config file %s: %w", path, err)
|
||||
|
||||
+14
-1
@@ -28,6 +28,19 @@ func MakeInstance(filename string) (*Instance, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return makeInstance(config, filename)
|
||||
}
|
||||
|
||||
func MakeInstanceFromPath(path string) (*Instance, error) {
|
||||
config, err := LoadConfigFromPath(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return makeInstance(config, path)
|
||||
}
|
||||
|
||||
func makeInstance(config *Config, source string) (*Instance, error) {
|
||||
relay := khatru.NewRelay()
|
||||
|
||||
events := &EventStore{
|
||||
@@ -122,7 +135,7 @@ func MakeInstance(filename string) (*Instance, error) {
|
||||
// Initialize the database
|
||||
|
||||
if err := instance.Events.Init(); err != nil {
|
||||
log.Fatal("Failed to initialize event store for ", filename, ": ", err)
|
||||
log.Fatal("Failed to initialize event store for ", source, ": ", err)
|
||||
}
|
||||
|
||||
// Enable extra functionality
|
||||
|
||||
+11
-2
@@ -28,6 +28,15 @@ func Dispatch(hostname string) (*Instance, bool) {
|
||||
return instance, exists
|
||||
}
|
||||
|
||||
func cleanupIfInactive(instance *Instance) bool {
|
||||
if instance != nil && instance.Config != nil && instance.Config.Inactive {
|
||||
instance.Cleanup()
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func Start() {
|
||||
dataDir := Env("DATA")
|
||||
if err := os.MkdirAll(dataDir, 0755); err != nil {
|
||||
@@ -63,7 +72,7 @@ func Start() {
|
||||
|
||||
if err != nil {
|
||||
log.Printf("Failed to make instance for %s: %v", entry.Name(), err)
|
||||
} else if instance.Config.Inactive {
|
||||
} else if cleanupIfInactive(instance) {
|
||||
log.Printf("Skipped inactive %s", entry.Name())
|
||||
} else {
|
||||
instancesByHost[instance.Config.Host] = instance
|
||||
@@ -110,7 +119,7 @@ func Start() {
|
||||
instance, err := MakeInstance(filename)
|
||||
if err != nil {
|
||||
log.Printf("Failed to reload %s: %v", filename, err)
|
||||
} else if instance.Config.Inactive {
|
||||
} else if cleanupIfInactive(instance) {
|
||||
log.Printf("Skipped inactive %s", filename)
|
||||
} else {
|
||||
instancesByHost[instance.Config.Host] = instance
|
||||
|
||||
Reference in New Issue
Block a user