chore: add mercury

This commit is contained in:
xuu
2024-01-22 16:00:58 -07:00
parent b1cc2af8d8
commit 87ec157e5a
36 changed files with 4916 additions and 2 deletions

View File

@@ -0,0 +1,97 @@
package main
import (
"context"
"fmt"
"os"
"strings"
_ "github.com/lib/pq"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/mercury/app"
"go.sour.is/pkg/mercury/http"
"go.sour.is/pkg/mercury/mqtt"
"go.sour.is/pkg/mercury/pg"
"go.sour.is/pkg/service"
"go.sour.is/pkg/xdg"
"go.sour.is/pkg/mercury"
)
var baseConfig = `
# mercury.source [handler] [name]
#@mercury.source.http-notify.default
#match :0 *
#endpoint :http://example.com/webhook
@mercury.source.http-notify.default
#@mercury.source.mqtt-notify.default
#match :0 *
#endpoint :mqtt://example.com/topic
@mercury.source.http-notify.default
@mercury.source.mercury-default.default
match :1 mercury
@mercury.source.mercury-environ.default
match :1 mercury.host,mercury.environ,mercury.priority,mercury.source.*
`
var _ = apps.Register(50, func(ctx context.Context, svc *service.Harness) error {
ctx, span := lg.Span(ctx)
defer span.End()
conf, err := readConfig(ctx)
if err != nil {
return err
}
app.Register(conf)
http.Register()
mqtt.Register()
pg.Register()
err = mercury.Registry.Configure(conf)
if err != nil {
return err
}
span.AddEvent("Enable Mercury")
svc.Add(mercury.NewHTTP())
return nil
})
func readConfig(ctx context.Context) (mercury.SpaceMap, error) {
_, span := lg.Span(ctx)
defer span.End()
conf, err := mercury.ParseText(strings.NewReader(baseConfig))
if err != nil {
return nil, err
}
wd, err := os.Getwd()
if err != err {
return nil, err
}
for _, fn := range xdg.Find(wd+":"+xdg.EnvConfigDirs, "config.mercury") {
span.AddEvent(fmt.Sprint("config:", fn))
fd, err := os.Open(fn)
if err != nil {
return nil, err
}
defer fd.Close()
c, err := mercury.ParseText(fd)
if err != nil {
return nil, err
}
conf.MergeMap(c)
}
return conf, nil
}

44
cmd/mercury/main.go Normal file
View File

@@ -0,0 +1,44 @@
package main
import (
"context"
"errors"
"log"
"net/http"
"os"
"os/signal"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/service"
)
var apps service.Apps
var appName, version = service.AppName()
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
go func() {
<-ctx.Done()
defer cancel() // restore interrupt function
}()
if err := run(ctx); err != nil {
log.Fatal(err)
os.Exit(1)
}
}
func run(ctx context.Context) error {
svc := &service.Harness{}
os.Setenv("TRACE_ENDPOINT", "atombox:4318")
os.Setenv("EV_TRACE_SAMPLE", "always")
ctx, stop := lg.Init(ctx, appName+"-mercury")
svc.OnStop(stop)
svc.Add(lg.NewHTTP(ctx))
svc.Setup(ctx, apps.Apps()...)
// Run application
if err := svc.Run(ctx, appName+"-mercury", version); err != nil && !errors.Is(err, http.ErrServerClosed) {
return err
}
return nil
}

47
cmd/mercury/svc.http.go Normal file
View File

@@ -0,0 +1,47 @@
package main
import (
"context"
"log"
"net/http"
"strings"
"github.com/rs/cors"
"go.sour.is/pkg/env"
"go.sour.is/pkg/lg"
"go.sour.is/pkg/mux"
"go.sour.is/pkg/service"
"go.sour.is/pkg/slice"
)
var _ = apps.Register(20, func(ctx context.Context, svc *service.Harness) error {
s := &http.Server{}
svc.Add(s)
mux := mux.New()
s.Handler = cors.AllowAll().Handler(mux)
// s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// log.Println(r.URL.Path)
// mux.ServeHTTP(w, r)
// })
s.Addr = env.Default("EV_HTTP", ":4088")
if strings.HasPrefix(s.Addr, ":") {
s.Addr = "[::]" + s.Addr
}
svc.OnStart(func(ctx context.Context) error {
_, span := lg.Span(ctx)
defer span.End()
log.Print("Listen on ", s.Addr)
span.AddEvent("begin listen and serve on " + s.Addr)
mux.Add(slice.FilterType[interface{ RegisterHTTP(*http.ServeMux) }](svc.Services...)...)
return s.ListenAndServe()
})
svc.OnStop(s.Shutdown)
return nil
})