summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go110
1 files changed, 67 insertions, 43 deletions
diff --git a/main.go b/main.go
index 793928d..8fb3608 100644
--- a/main.go
+++ b/main.go
@@ -2,7 +2,6 @@ package main
import (
"bufio"
- "flag"
"fmt"
"log"
"net/http"
@@ -11,64 +10,89 @@ import (
)
func main() {
- debug := flag.Bool("debug", false, "Debug mode!")
- flag.Parse()
-
- readCh := make(chan interface{}, 4096)
+ msgs := make(chan interface{}, 4096)
mux := http.NewServeMux()
wrks := []*Worker{}
- for i := 0; i < 8; i++ {
- log.Printf("worker %d started\n", i)
- wrk := NewWorker(readCh)
- err := wrk.Start("init.lua")
- if err != nil {
- log.Fatal(err)
- }
- if i == 0 {
- for _, route := range wrk.ListRoutes() {
- // we need to copy route otherwise it's going
- // to change with every next iteration
- route := route
- mux.HandleFunc(
- route,
- func (w http.ResponseWriter, r *http.Request) {
- start := time.Now()
- resCh := wrk.Request(route, r, *debug)
- res := <- resCh
- for k, h := range res.Headers {
- w.Header().Set(k, h)
- }
- w.WriteHeader(int(res.Code))
- fmt.Fprint(w, string(res.Body))
- log.Printf(
- "%s %s (%s) -> %d\n",
- r.Method,
- r.URL.Path,
- time.Now().Sub(start),
- res.Code,
- )
- },
- )
+ routes := make(map[string]bool)
+
+ // define luna.router module
+ routeModule := make(map[string]any)
+ routeModule["route"] = func (l *Lua) int {
+ fn := l.PopToRef()
+ route := l.ToString(-1)
+ // find corresponding worker for the lua context
+ var wrk *Worker
+ for _, wrk = range wrks {
+ if wrk.HasSameLua(l) {
+ wrk.SetRoute(route, fn)
+ break
}
}
+ if wrk == nil {
+ return 0
+ }
+ // check if route is already registered. otherwise
+ // mux.HandleFunc will panic
+ _, ok := routes[route]
+ if ok {
+ return 0
+ }
+ routes[route] = true
+ mux.HandleFunc(
+ route,
+ func (w http.ResponseWriter, r *http.Request) {
+ start := time.Now()
+ resCh := HandleHTTPRequest(msgs, route, r)
+ res := <- resCh
+ for k, h := range res.Headers {
+ w.Header().Set(k, h)
+ }
+ w.WriteHeader(int(res.Code))
+ fmt.Fprint(w, string(res.Body))
+ log.Printf(
+ "%s %s (%s) -> %d\n",
+ r.Method,
+ r.URL.Path,
+ time.Now().Sub(start),
+ res.Code,
+ )
+ },
+ )
+ return 0
+ }
+ module := make(map[string]any)
+ module["router"] = routeModule
+
+ // start workers
+ for i := 0; i < 8; i++ {
+ wrk := NewWorker()
wrks = append(wrks, wrk)
- go wrk.Listen()
+ go func () {
+ err := wrk.Start("init.lua", module)
+ if err != nil {
+ log.Fatal(err)
+ }
+ wrks = append(wrks, wrk)
+ wrk.Listen(msgs)
+ }()
defer wrk.Stop()
+ log.Printf("worker %d started\n", i)
}
+ // listen for evals from stdio
go func () {
reader := bufio.NewReader(os.Stdin)
for {
- text, _ := reader.ReadString('\n')
- for _, w := range wrks {
- err := <- w.Eval(text)
- if err != nil {
+ code, _ := reader.ReadString('\n')
+ for _, wrk := range wrks {
+ if err := wrk.Run(code); err != nil {
log.Printf("error: %s\n", err)
break
}
}
}
}()
- fmt.Println("luna is running...")
+
+ fmt.Println("luna is running at 127.0.0.1:3002...")
log.Fatal(http.ListenAndServe("127.0.0.1:3002", mux))
}