From 0ea603d96eeefa12095a713900ef645ed3ca2560 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Tue, 29 May 2018 04:28:32 -0400 Subject: [PATCH] Support using deno as a library --- Makefile | 6 ++++-- README.md | 3 +++ cmd/main.go | 13 +++++++++++++ deno_dir.go | 2 +- deno_dir_test.go | 2 +- dispatch.go | 12 +----------- echo.go | 2 +- fetch.go | 2 +- integration_test.go | 2 +- main.go | 41 ++++++++++++++++++++++++++--------------- main.ts | 3 +-- msg.proto | 1 + os.go | 2 +- os_test.go | 2 +- timers.go | 2 +- util.go | 2 +- 16 files changed, 58 insertions(+), 39 deletions(-) create mode 100644 cmd/main.go diff --git a/Makefile b/Makefile index e7103039ed..437e8882f5 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ TS_FILES = \ v8worker2.d.ts GO_FILES = \ + cmd/main.go \ assets.go \ deno_dir.go \ deno_dir_test.go \ @@ -31,13 +32,14 @@ GO_FILES = \ timers.go \ util.go + deno: msg.pb.go $(GO_FILES) - go build -o deno + go build -o deno ./cmd assets.go: dist/main.js cp node_modules/typescript/lib/lib.*d.ts dist/ cp deno.d.ts dist/ - go-bindata -pkg main -o assets.go dist/ + go-bindata -pkg deno -o assets.go dist/ msg.pb.go: msg.proto protoc --go_out=. msg.proto diff --git a/README.md b/README.md index 8a5d03dfcb..fa34da225b 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,9 @@ A JavaScript runtime using V8 6.8 and Go. * Aims to be browser compatible. +* Can be used as a library to easily build your own JavaScript runtime. + https://github.com/ry/deno/blob/master/cmd/main.go + ## Status diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000000..585cd12595 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,13 @@ +// Copyright 2018 Ryan Dahl +// All rights reserved. MIT License. +package main + +import ( + "github.com/ry/deno" +) + +func main() { + deno.Init() + deno.Eval("deno_main.js", "denoMain()") + deno.Loop() +} diff --git a/deno_dir.go b/deno_dir.go index 7f9dac4452..166fcb8270 100644 --- a/deno_dir.go +++ b/deno_dir.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "crypto/md5" diff --git a/deno_dir_test.go b/deno_dir_test.go index 404d589cb9..51a6fb0168 100644 --- a/deno_dir_test.go +++ b/deno_dir_test.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "io/ioutil" diff --git a/dispatch.go b/dispatch.go index a6308709e8..a5728ad81f 100644 --- a/dispatch.go +++ b/dispatch.go @@ -1,10 +1,9 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "github.com/golang/protobuf/proto" - "github.com/ry/v8worker2" "sync" ) @@ -20,19 +19,10 @@ var stats struct { v8workerBytesRecv int } -// There is a single global worker for this process. -// This file should be the only part of deno that directly access it, so that -// all interaction with V8 can go through a single point. -var worker *v8worker2.Worker - var channels = make(map[string][]Subscriber) type Subscriber func(payload []byte) []byte -func createWorker() { - worker = v8worker2.New(recv) -} - func recv(buf []byte) (response []byte) { stats.v8workerRecv++ stats.v8workerBytesRecv += len(buf) diff --git a/echo.go b/echo.go index f1036478ae..29ec11138d 100644 --- a/echo.go +++ b/echo.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno // For testing func InitEcho() { diff --git a/fetch.go b/fetch.go index 6f6f07c44f..ecd3ec9eac 100644 --- a/fetch.go +++ b/fetch.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "github.com/golang/protobuf/proto" diff --git a/integration_test.go b/integration_test.go index 28411e6da5..5b96c0abc1 100644 --- a/integration_test.go +++ b/integration_test.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "bytes" diff --git a/main.go b/main.go index 9e5b6349ca..3069c03803 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "flag" @@ -34,8 +34,16 @@ func FlagsParse() []string { return args } -func main() { - args := FlagsParse() +// There is a single global worker for this process. +// This file should be the only part of deno that directly access it, so that +// all interaction with V8 can go through a single point. +var worker *v8worker2.Worker +var workerArgs []string +var main_js string +var main_map string + +func Init() { + workerArgs = FlagsParse() // Maybe start Golang CPU profiler. // Use --prof for profiling JS. @@ -49,33 +57,36 @@ func main() { } createDirs() - createWorker() - InitOS() InitEcho() InitTimers() InitFetch() - main_js := stringAsset("main.js") + worker = v8worker2.New(recv) + + main_js = stringAsset("main.js") err := worker.Load("/main.js", main_js) exitOnError(err) - main_map := stringAsset("main.map") + main_map = stringAsset("main.map") +} +// It's up to library users to call +// deno.Eval("deno_main.js", "denoMain()") +func Eval(filename string, code string) { + err := worker.Load(filename, code) + exitOnError(err) +} + +func Loop() { cwd, err := os.Getwd() check(err) - - err = worker.Load("deno_main.js", "denoMain()") - exitOnError(err) - - var command = Msg_START // TODO use proto3 PubMsg("start", &Msg{ - Command: command, + Command: Msg_START, StartCwd: cwd, - StartArgv: args, + StartArgv: workerArgs, StartDebugFlag: *flagDebug, StartMainJs: main_js, StartMainMap: main_map, }) - DispatchLoop() } diff --git a/main.ts b/main.ts index ddcbebb13c..0a7b79bd3c 100644 --- a/main.ts +++ b/main.ts @@ -47,5 +47,4 @@ let startCalled = false; const mod = runtime.resolveModule(inputFn, `${cwd}/`); mod.compileAndRun(); }); -} - +}; diff --git a/msg.proto b/msg.proto index 0a802749b8..755d22e535 100644 --- a/msg.proto +++ b/msg.proto @@ -2,6 +2,7 @@ // All rights reserved. MIT License. syntax = "proto3"; package main; +option go_package = "deno"; message BaseMsg { string channel = 1; diff --git a/os.go b/os.go index d28cf5e9cc..7eebe41bd7 100644 --- a/os.go +++ b/os.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "github.com/golang/protobuf/proto" diff --git a/os_test.go b/os_test.go index 1f9ae69e75..e04f8c820c 100644 --- a/os_test.go +++ b/os_test.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "path" diff --git a/timers.go b/timers.go index ba751712dc..f1525b97c0 100644 --- a/timers.go +++ b/timers.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "github.com/golang/protobuf/proto" diff --git a/util.go b/util.go index 873bf28b02..2662a256bc 100644 --- a/util.go +++ b/util.go @@ -1,6 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. -package main +package deno import ( "fmt"