package main import ( "bufio" "flag" "fmt" "log" "net/http" "os" "time" ) func main() { debug := flag.Bool("debug", false, "Debug mode!") flag.Parse() readCh := 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, ) }, ) } } wrks = append(wrks, wrk) go wrk.Listen() defer wrk.Stop() } go func () { reader := bufio.NewReader(os.Stdin) for { text, _ := reader.ReadString('\n') for _, w := range wrks { err := <- w.Eval(text) if err != nil { log.Printf("error: %s\n", err) break } } } }() fmt.Println("luna is running...") log.Fatal(http.ListenAndServe("127.0.0.1:3002", mux)) }