A javascript Engine base on Goja inspired by k6
- Top level async/await not supported by Goja
- ES6+ partially implemented by Goja
- Async operations should wait for ends with
engine.StopEventLoopXXX - Module includes remote/local/GoModule support by translate to CommonJs (EsBuild)
package main import ( "github.com/ZenLiuCN/engine" ) func main() { vm := engine.Get() defer vm.Free() v, err := vm.RunJs( ` console.log("Begin "+"For timeout") new Promise((r, j) => { console.log("job 0") setTimeout(()=>r(1),1000) }).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),1000) })}).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),1000) }) }).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),2000) }) }).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),2000) }) })`) halts := vm.Await() //manual await task done if !halts.IsZero(){ panic("task not done") } if err!=nil{ panic(err) } println(v) }package main import ( "github.com/ZenLiuCN/engine" "time" ) func main() { vm := engine.Get() defer vm.Free() v, err := vm.RunJs( ` console.log("Begin "+"For timeout") new Promise((r, j) => { console.log("job 0") setTimeout(()=>r(1),1000) }).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),1000) })}).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),1000) }) }).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),2000) }) }).then(v => { console.log("job",v) return new Promise((r, j) => { setTimeout(()=>r(v+1),2000) }) })`) halts := vm.AwaitTimeout(time.Second * 5) //manual await task done for limited time if !halts.IsZero(){ panic("task not done within 5 seconds") } if err!=nil{ panic(err) } println(v) }package main import ( "github.com/ZenLiuCN/engine" "time" ) func main() { vm := engine.Get() defer vm.Free() v, err := vm.RunJsTimeout(`import {Second, sleep} from 'go/time' new Promise((r, j) => { sleep(Second) r(1) }).then(v => { console.log(v) return new Promise((r, j) => { sleep(Second) r(v+1) }) }).then(v => { console.log(v) return new Promise((r, j) => { sleep(Second) r(v+1) }) }).then(v => { console.log(v) return new Promise((r, j) => { sleep(Second*2) r(v+1) }) }).then(v => { console.log(v) return new Promise((r, j) => { sleep(Second*2) r(v+1) }) }) `, time.Second*8) if err != nil { panic(err) // if error is ErrTimeout, the value is HaltJobs } println(v) }Simple wrapper for goja.Runtime with extended abilities.
Simple wrapper for goja.Program
- use struct tag
js:"name"to mapping fields to js property - use struct tag
js:"-"to ignore export field - default strategy for both functions methods and fields
UUUlllUll=>uuUllUllUlllUll=>ullUllXlllUll=>llUllXUllUll=>UllUll
Simple support for CommonJs, ES script and TypeScript also compiled as CJS script, inspire by k6
- Module: a simple global instance
- InitializeModule: a module instanced when register to an Engine
- TopModule: a module register some top level function or objects
- TypeDefined: a module contains
d.tsdata - GoModule: a module for expose golang into js (use by import module)
go/compilerbuilt-in compiler for both typescript and javascriptgo/esbuildexpose esbuild to js
components
go/engine: use engine in scripts, maybe not to use too many russian dolls
- global : slog console or byte buffer console
go/buffer: golang byte slice and bytes.Buffer
go/hash:golang hash functionsgo/codec:golang codec functions, include base64 ...
go/crypto: golang crypto
go/os: golang os , not full functions
go/io: golang io module
go/chan: golang chan type only
pluggable modules
go/sqlx: sqlx withpgxmysqlandsqlitedriver
components
go/excel: excel reading or generate
components
go/fetch: base function done, improve for compact with browser fetch.
go/pug: jade(pug) compiler
components
go/minify: file minify
components
dev
draft
draft