diff options
| author | unwox <me@unwox.com> | 2024-06-13 13:12:17 +0600 |
|---|---|---|
| committer | unwox <me@unwox.com> | 2024-06-13 13:12:17 +0600 |
| commit | 4374d8c5d98fbc9e2589074cd0f05266db6a10e1 (patch) | |
| tree | fd366c586cc6ba5c888c3c87b592f49ed9a34b9d | |
| parent | c1ac633d9fa5da9fb312e4a990ee48d0fa7c0c4e (diff) | |
implement unsafe evaluation of lua code in workers
| -rw-r--r-- | main.go | 35 | ||||
| -rw-r--r-- | worker.go | 6 |
2 files changed, 30 insertions, 11 deletions
@@ -10,29 +10,30 @@ import ( func main() { rch := make(chan *WorkerRequest, 4096) mux := http.NewServeMux() + wrks := []*Worker{} for i := 0; i < 8; i++ { log.Printf("worker %d started\n", i) - w := NewWorker(rch) - err := w.Start("init.lua") + wrk := NewWorker(rch) + err := wrk.Start("init.lua") if err != nil { log.Fatal(err) } if i == 0 { - for _, route := range w.ListRoutes() { + 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 (wr http.ResponseWriter, r *http.Request) { + func (w http.ResponseWriter, r *http.Request) { start := time.Now() - resCh := w.Request(route, r) + resCh := wrk.Request(route, r, *debug) res := <- resCh for k, h := range res.Headers { - wr.Header().Set(k, h) + w.Header().Set(k, h) } - wr.WriteHeader(int(res.Code)) - fmt.Fprint(wr, string(res.Body)) + w.WriteHeader(int(res.Code)) + fmt.Fprint(w, string(res.Body)) log.Printf( "%s %s (%s) -> %d\n", r.Method, @@ -44,9 +45,23 @@ func main() { ) } } - go w.Listen() - defer w.Stop() + 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)) } @@ -130,7 +130,11 @@ func (w *Worker) ListRoutes() []string { return res } -func (w *Worker) Stop () { +func (w *Worker) Eval(code string) error { + return w.lua.LoadString(code) +} + +func (w *Worker) Stop() { w.lua.Close() } |
