package main import ( "bufio" "fmt" "log" "net/http" "os" "time" ) func main() { msgs := make(chan interface{}, 4096) mux := http.NewServeMux() wrks := []*Worker{} 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 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 { 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 at 127.0.0.1:3002...") log.Fatal(http.ListenAndServe("127.0.0.1:3002", mux)) }