All Projects → unrelentingtech → hs-duktape

unrelentingtech / hs-duktape

Licence: other
Haskell bindings for a very compact embedded JavaScript engine

Programming Languages

haskell
3896 projects

Labels

Projects that are alternatives of or similar to hs-duktape

duktape.rb
Ruby bindings to the Duktape JavaScript interpreter
Stars: ✭ 68 (+183.33%)
Mutual labels:  duktape
DuktapeJava
Tiny Powerfull JavaScript Engine On Android Platform integrating with java
Stars: ✭ 74 (+208.33%)
Mutual labels:  duktape
pyduktape
Embed the Duktape JS interpreter in Python
Stars: ✭ 77 (+220.83%)
Mutual labels:  duktape
sporks
The source code repository for Sporks, the learning, backchatting, scriptable discord bot!
Stars: ✭ 30 (+25%)
Mutual labels:  duktape
Duktape
Duktape - embeddable Javascript engine with a focus on portability and compact footprint
Stars: ✭ 5,076 (+21050%)
Mutual labels:  duktape
libvmod-cfg
VMOD useful to access to contents of environment variables and local or remote files from VCL, usually for configuration purposes, including execution of Lua and JavaScript programs.
Stars: ✭ 20 (-16.67%)
Mutual labels:  duktape

Hackage Linux Build Status Windows Build Status MIT License

hs-duktape

Haskell bindings for duktape, a very compact embedded ECMAScript (JavaScript) engine.

Usage

Here's a simple REPL example:

module Main where

import Scripting.Duktape
import Control.Monad (forever)
import Data.ByteString.Char8 (pack)
import System.IO (hFlush, stdout)

main :: IO ()
main = do
  dukm <- createDuktapeCtx
  case dukm of
    Nothing -> putStrLn "I can't even (start Duktape)"
    Just duk -> forever $ do
      putStr "duktape> "
      hFlush stdout
      retVal <- evalDuktape duk =<< return . pack =<< getLine
      case retVal of
        Left e -> putStrLn $ "Duktape error: " ++ e
        Right Nothing -> putStrLn "No result"
        Right (Just v) -> print v

Aeson's Value type is used for exchanging values between Haskell and ECMAScript.
lens-aeson is a good library for working with Value, um, values.

You can also call functions that are on the global object (or any object that's on the global object):

dukm <- createDuktapeCtx
bresult <- callDuktape (fromJust dukm) Nothing "boolTest" [Bool True, Bool True, Bool False] -- boolTest(true, true, false)
aresult <- callDuktape (fromJust dukm) (Just "NumFuns") "sum" [Number 1, Number 2] -- NumFuns.sum(1, 2)

And expose Haskell functions (same as with calls: set on global or a property of global):

dukm <- createDuktapeCtx
let dbl (Number x) = return $ Number $ x * 2 :: IO Value
    dbl _ = return $ String "wtf"
reD <- exposeFnDuktape (fromJust ctx) Nothing "double" dbl 

The functions must be of type IO (), IO Value, Value -> IO Value, Value -> Value -> IO Value... and so on. (Or with any ToJSON/FromJSON values instead of Value)

Advanced: Script execution timeout

Instead of createDuktapeCtx, you can use createGovernedHeap to enforce termination via a timeout:

allowQuarterSecond :: IO (IO Bool)
allowQuarterSecond = do
  initializedAt <- getCurrentTime
  return $ do
    now <- getCurrentTime
    let diff = diffUTCTime now initializedAt
    return $ diff > 0.25


guvnor <- allowQuarterSecond
ctx <- createGovernedHeap nullFunPtr nullFunPtr nullFunPtr guvnor nullFunPtr
result <- evalDuktape (fromJust ctx) "while (true) {}"
-- Left "RangeError: execution timeout"

Development

Note: The duktape configure script invoked by Cabal/Stack requires python 2 with the PyYAML library installed. pip install PyYAML is one way to achieve this.

Use stack to build.

$ stack build

$ stack test && rm tests.tix

Contributing

Please feel free to submit pull requests!

By participating in this project you agree to follow the Contributor Code of Conduct.

The list of contributors is available on GitHub.

License

Licensed under the MIT license (see to the LICENSE file).
Haskell bindings: Copyright (c) 2015-2018 Greg V [email protected]
Duktape: Copyright (c) 2013-2016 by Duktape authors (see duktape/AUTHORS.rst)

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].