ZenLiuCN / engine

golang js engine base on goja
Apache License 2.0
3 stars 1 forks source link

Engine

A javascript Engine base on Goja inspired by k6

Limitations and modifications

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) }

### manual
```go
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)
}

automatic

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)
}

Extensions

Engine

Simple wrapper for goja.Runtime with extended abilities.

Code

Simple wrapper for goja.Program

Naming

  1. use struct tag js:"name" to mapping fields to js property
  2. use struct tag js:"-" to ignore export field
  3. default strategy for both functions methods and fields
    • UUUlllUll => uuUllUll
    • UlllUll => ullUll
    • XlllUll => llUll
    • XUllUll => UllUll

Resolver with require

Simple support for CommonJs, ES script and TypeScript also compiled as CJS script, inspire by k6

Module System

  1. Module: a simple global instance
  2. InitializeModule: a module instanced when register to an Engine
  3. TopModule: a module register some top level function or objects
  4. TypeDefined: a module contains d.ts data
  5. GoModule: a module for expose golang into js (use by import module)

compiler module

components

engine module

console module

buffer module

hash module

crypto module

os module

io module

Modules

pluggable modules

sqlx

components

Excelize

components

fetch

pug

minify

components

pdf

dev

jose

draft

http

draft