Skip to content
This repository was archived by the owner on Oct 29, 2021. It is now read-only.
/ go-duktape Public archive

[abandoned] Duktape JavaScript engine bindings for Go

License

Notifications You must be signed in to change notification settings

olebedev/go-duktape

Folders and files

NameName
Last commit message
Last commit date

Latest commit

650f7c8 · Mar 26, 2021
Oct 29, 2017
Jan 11, 2017
Oct 30, 2017
Dec 20, 2017
Oct 30, 2017
Oct 30, 2017
Jan 8, 2015
Dec 20, 2017
Jul 9, 2019
Dec 20, 2017
Dec 20, 2017
Nov 20, 2018
Jul 9, 2019
Jun 19, 2020
Nov 8, 2017
Feb 13, 2019
Mar 26, 2021
Mar 26, 2021
Feb 13, 2019
Mar 26, 2021
Feb 13, 2019
Feb 13, 2019
Feb 13, 2019
Feb 13, 2019
Feb 13, 2019
Nov 8, 2017
Feb 13, 2019
Mar 26, 2021
Feb 13, 2019
Nov 8, 2017
Feb 13, 2019
Mar 26, 2021
Jun 19, 2020
Mar 26, 2021
May 27, 2015
Aug 7, 2017
Nov 3, 2015
Nov 3, 2015
Aug 6, 2015
Aug 6, 2015
Feb 23, 2016

Repository files navigation

Duktape bindings for Go(Golang)

wercker status Travis status Appveyor status Gitter

Duktape is a thin, embeddable javascript engine. Most of the api is implemented. The exceptions are listed here.

Usage

The package is fully go-getable, no need to install any external C libraries.
So, just type go get gopkg.in/olebedev/go-duktape.v3 to install.

package main

import "fmt"
import "gopkg.in/olebedev/go-duktape.v3"

func main() {
  ctx := duktape.New()
  ctx.PevalString(`2 + 3`)
  result := ctx.GetNumber(-1)
  ctx.Pop()
  fmt.Println("result is:", result)
  // To prevent memory leaks, don't forget to clean up after
  // yourself when you're done using a context.
  ctx.DestroyHeap()
}

Go specific notes

Bindings between Go and Javascript contexts are not fully functional. However, binding a Go function to the Javascript context is available:

package main

import "fmt"
import "gopkg.in/olebedev/go-duktape.v3"

func main() {
  ctx := duktape.New()
  ctx.PushGlobalGoFunction("log", func(c *duktape.Context) int {
    fmt.Println(c.SafeToString(-1))
    return 0
  })
  ctx.PevalString(`log('Go lang Go!')`)
}

then run it.

$ go run *.go
Go lang Go!
$

Timers

There is a method to inject timers to the global scope:

package main

import "fmt"
import "gopkg.in/olebedev/go-duktape.v3"

func main() {
  ctx := duktape.New()

  // Let's inject `setTimeout`, `setInterval`, `clearTimeout`,
  // `clearInterval` into global scope.
  ctx.PushTimers()

  ch := make(chan string)
  ctx.PushGlobalGoFunction("second", func(_ *Context) int {
    ch <- "second step"
    return 0
  })
  ctx.PevalString(`
    setTimeout(second, 0);
    print('first step');
  `)
  fmt.Println(<-ch)
}

then run it

$ go run *.go
first step
second step
$

Also you can FlushTimers().

Command line tool

Install go get gopkg.in/olebedev/go-duktape.v3/....
Execute file.js: $GOPATH/bin/go-duk file.js.

Benchmarks

prog time
otto 200.13s
anko 231.19s
agora 149.33s
GopherLua 8.39s
go-duktape 9.80s

More details are here.

Status

The package is not fully tested, so be careful.

Contribution

Pull requests are welcome! Also, if you want to discuss something send a pull request with proposal and changes. Convention: fork the repository and make changes on your fork in a feature branch.

About

[abandoned] Duktape JavaScript engine bindings for Go

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages