diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 110 |
1 files changed, 67 insertions, 43 deletions
@@ -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)) } |
