djs

package module
v0.8.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 18, 2025 License: MIT Imports: 13 Imported by: 0

README

dukgo, makes duktape be embedded easily

Duktape is a thin, embeddable javascript engine. Its api is very well documented. For most of developers who are not familiar with C language, it is very tedious to call duk_push_xxx() and duk_pop() to make use of the power of Duktape. Though there are some binding implementations of Duktape for languages other than C, most of them inherit the methods of using API of Duktape.

dukgo is a package wrapping Duktape and making it a pragmatic embeddable language. With some helper functions provided by dukgo, calling Golang functions from Javascript, or calling Javascript functions from Golang are both very simple. So, with the help of dukgo, Duktape can be embedded in Golang application easily.

Install

The package is fully go-getable, So, just type

go get github.com/rosbit/dukgo

to install.

Usage
1. Evaluates expressions
package main

import (
  djs "github.com/rosbit/dukgo"
  "fmt"
)

func main() {
  ctx, err := djs.NewContext()
  if err != nil {
    fmt.Printf("%v\n", err)
    return
  }

  res, _ := ctx.Eval("a + b", map[string]interface{}{
     "a": 10,
     "b": 1,
  })
  fmt.Println("result is:", res)
}
2. Go calls Javascript function

Suppose there's a Javascript file named a.js like this:

function add(a, b) {
    return a+b
}

one can call the Javascript function add() in Go code like the following:

package main

import (
  djs "github.com/rosbit/dukgo"
  "fmt"
)

var add func(int, int)int

func main() {
  ctx, err := djs.NewContext()
  if err != nil {
     fmt.Printf("%v\n", err)
     return
  }

  if _, err := ctx.EvalFile("a.js", nil); err != nil {
     fmt.Printf("%v\n", err)
     return
  }

  // method 1: bind JS function with a golang var
  if err := ctx.BindFunc("add", &add); err != nil {
     fmt.Printf("%v\n", err)
     return
  }
  res := add(1, 2)

  // method 2: call JS function using CallFunc
  res, err := ctx.CallFunc("add", 1, 2)
  if err != nil {
     fmt.Printf("%v\n", err)
     return
  }

  fmt.Println("result is:", res)
}
3. Javascript calls Go function

Javascript calling Go function is also easy. In the Go code, calling EvalFile with a map as env will make Golang functions as Javascript global functions. There's the example:

package main

import "github.com/rosbit/dukgo"

// function to be called by Javascript
func adder(a1 float64, a2 float64) float64 {
    return a1 + a2
}

func main() {
  ctx, err := djs.NewContext()
  if err != nil {
      fmt.Printf("%v\n", err)
      return
  }

  if _, err := ctx.EvalFile("b.js", map[string]interface{}{
      "adder": adder,
  })  // b.js containing code calling "adder"
}

In Javascript code, one can call the registered function directly. There's the example b.js.

r = adder(1, 100)   // the function "adder" is implemented in Go
console.log(r)
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.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InitCache

func InitCache()

func InitPtrStore

func InitPtrStore() (getPtrStore fnGetPtrStore, delPtrStore fnDelPtrStore)

Types

type JsContext

type JsContext struct {
	// contains filtered or unexported fields
}

func LoadFileFromCache

func LoadFileFromCache(path string, vars map[string]interface{}, options ...Option) (ctx *JsContext, existing bool, err error)

func NewContext

func NewContext(options ...Option) (*JsContext, error)

func (*JsContext) BindFunc

func (ctx *JsContext) BindFunc(funcName string, funcVarPtr interface{}) (err error)

bind a var of golang func with a JS function name, so calling JS function is just calling the related golang func. @param funcVarPtr in format `var funcVar func(....) ...; funcVarPtr = &funcVar`

func (*JsContext) BindFuncs

func (ctx *JsContext) BindFuncs(funcName2FuncVarPtr map[string]interface{}) (err error)

func (*JsContext) CallFunc

func (ctx *JsContext) CallFunc(funcName string, args ...interface{}) (res interface{}, err error)

func (*JsContext) Eval

func (ctx *JsContext) Eval(script string, env map[string]interface{}) (res interface{}, err error)

func (*JsContext) EvalFile

func (ctx *JsContext) EvalFile(scriptFile string, env map[string]interface{}) (res interface{}, err error)

func (*JsContext) GetGlobal

func (ctx *JsContext) GetGlobal(name string) (res interface{}, err error)

type Option added in v0.7.0

type Option func(*Options)

func WithGlobalHeap added in v0.7.0

func WithGlobalHeap() Option

func WithModuleHome added in v0.7.0

func WithModuleHome(moduleHome string) Option

func WithoutGlobalHeap added in v0.7.0

func WithoutGlobalHeap() Option

type Options added in v0.7.0

type Options struct {
	// contains filtered or unexported fields
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL