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
=>uuUllUll
UlllUll
=>ullUll
XlllUll
=>llUll
XUllUll
=>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.ts
data - GoModule: a module for expose golang into js (use by import module)
go/compiler
built-in compiler for both typescript and javascriptgo/esbuild
expose 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 withpgx
mysql
andsqlite
driver
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