runtime.ts - first pass at caching compiler

This commit is contained in:
Ryan Dahl 2018-05-17 09:47:09 -04:00
parent 6f9c919f41
commit 05672b7e24
8 changed files with 339 additions and 338 deletions

54
main.go
View file

@ -1,29 +1,48 @@
package main
import (
"crypto/md5"
"encoding/hex"
"github.com/golang/protobuf/proto"
"github.com/ry/v8worker2"
"io/ioutil"
"os"
"path"
"path/filepath"
"runtime"
"strings"
)
func HandleCompileOutput(source string, filename string) []byte {
// println("compile output from golang", filename)
// Remove any ".." elements. This prevents hacking by trying to move up.
filename, err := filepath.Rel("/", filename)
check(err)
if strings.Contains(filename, "..") {
panic("Assertion error.")
func SourceCodeHash(filename string, sourceCodeBuf []byte) string {
h := md5.New()
h.Write([]byte(filename))
h.Write(sourceCodeBuf)
return hex.EncodeToString(h.Sum(nil))
}
func HandleSourceCodeFetch(filename string) []byte {
res := &Msg{Kind: Msg_SOURCE_CODE_FETCH_RES}
sourceCodeBuf, err := Asset("dist/" + filename)
if err != nil {
sourceCodeBuf, err = ioutil.ReadFile(filename)
}
filename = path.Join(CompileDir, filename)
err = os.MkdirAll(path.Dir(filename), 0700)
check(err)
err = ioutil.WriteFile(filename, []byte(source), 0600)
if err != nil {
res.Error = err.Error()
} else {
cacheKey := SourceCodeHash(filename, sourceCodeBuf)
println("cacheKey", filename, cacheKey)
// TODO For now don't do any cache lookups..
res.Payload = &Msg_SourceCodeFetchRes{
SourceCodeFetchRes: &SourceCodeFetchResMsg{
SourceCode: string(sourceCodeBuf),
OutputCode: "",
},
}
}
out, err := proto.Marshal(res)
check(err)
return out
}
func HandleSourceCodeCache(filename string, sourceCode string, outputCode string) []byte {
return nil
}
@ -87,9 +106,12 @@ func recv(buf []byte) []byte {
return ReadFileSync(msg.Path)
case Msg_EXIT:
os.Exit(int(msg.Code))
case Msg_COMPILE_OUTPUT:
payload := msg.GetCompileOutput()
return HandleCompileOutput(payload.Source, payload.Filename)
case Msg_SOURCE_CODE_FETCH:
payload := msg.GetSourceCodeFetch()
return HandleSourceCodeFetch(payload.Filename)
case Msg_SOURCE_CODE_CACHE:
payload := msg.GetSourceCodeCache()
return HandleSourceCodeCache(payload.Filename, payload.SourceCode, payload.OutputCode)
default:
panic("Unexpected message")
}