package worker import ( "bufio" "bytes" "fmt" "os/exec" ) type RunOps struct { Log Logger Path string FuncConfig *FuncConfig Env []string } func RunFunction(opt *RunOps, input []byte) ([]byte, error) { if opt.FuncConfig.Runtime != "exec" { return nil, fmt.Errorf("unsupported runtime: %s", opt.FuncConfig.Runtime) } cmd := exec.Command(opt.Path) cmd.Env = opt.Env cmd.Stdin = bytes.NewReader(input) var out bytes.Buffer cmd.Stdout = &out stderrPipe, err := cmd.StderrPipe() if err != nil { return nil, err } go func() { scanner := bufio.NewScanner(stderrPipe) for scanner.Scan() { line := scanner.Text() opt.Log.Write(line) } }() if err := cmd.Start(); err != nil { return nil, err } if err := cmd.Wait(); err != nil { return nil, fmt.Errorf("failed: %w\noutput: %s", err, out.String()) } return out.Bytes(), nil }