You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
package app |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"net/http" |
|
|
|
"lol.mleku.dev/chk" |
|
"lol.mleku.dev/log" |
|
"next.orly.dev/app/config" |
|
acl "next.orly.dev/pkg/acl" |
|
database "next.orly.dev/pkg/database" |
|
"next.orly.dev/pkg/encoders/bech32encoding" |
|
"next.orly.dev/pkg/protocol/publish" |
|
) |
|
|
|
func Run( |
|
ctx context.Context, cfg *config.C, db *database.D, |
|
) (quit chan struct{}) { |
|
// shutdown handler |
|
go func() { |
|
select { |
|
case <-ctx.Done(): |
|
log.I.F("shutting down") |
|
close(quit) |
|
} |
|
}() |
|
// get the admins |
|
var err error |
|
var adminKeys [][]byte |
|
for _, admin := range cfg.Admins { |
|
if len(admin) == 0 { |
|
continue |
|
} |
|
var pk []byte |
|
if pk, err = bech32encoding.NpubOrHexToPublicKeyBinary(admin); chk.E(err) { |
|
continue |
|
} |
|
adminKeys = append(adminKeys, pk) |
|
} |
|
// start listener |
|
l := &Server{ |
|
Ctx: ctx, |
|
Config: cfg, |
|
D: db, |
|
publishers: publish.New(NewPublisher(ctx)), |
|
Admins: adminKeys, |
|
} |
|
// provide publisher to ACL so background sync can dispatch events |
|
if err := acl.Registry.Configure(cfg, db, ctx, l.publishers); chk.E(err) { |
|
// if configuration fails, proceed but log; ACL might be 'none' |
|
} |
|
addr := fmt.Sprintf("%s:%d", cfg.Listen, cfg.Port) |
|
log.I.F("starting listener on http://%s", addr) |
|
go func() { |
|
chk.E(http.ListenAndServe(addr, l)) |
|
}() |
|
quit = make(chan struct{}) |
|
return |
|
}
|
|
|