status-go/geth/jail
Ivan Daniluk fffd60d675 Add docs for Jail package (#285) 2017-09-02 01:18:09 +07:00
..
console Merging bug/whisper-on-geth1.6.1 (#236) which acts like develop 2017-08-04 23:14:17 +07:00
README.md Add docs for Jail package (#285) 2017-09-02 01:18:09 +07:00
doc.go Add docs for Jail package (#285) 2017-09-02 01:18:09 +07:00
execution_policy.go JSON RPC Proxy configuration (#193) 2017-08-15 17:27:12 +07:00
handlers.go JSON RPC Proxy configuration (#193) 2017-08-15 17:27:12 +07:00
jail.go jail.go: removed import to go-ethereum log package 2017-08-15 14:52:09 +01:00
jail_cell.go Merging bug/whisper-on-geth1.6.1 (#236) which acts like develop 2017-08-04 23:14:17 +07:00
jail_cell_test.go JSON RPC Proxy configuration (#193) 2017-08-15 17:27:12 +07:00
jail_rpc_test.go JSON RPC Proxy configuration (#193) 2017-08-15 17:27:12 +07:00
jail_test.go JSON RPC Proxy configuration (#193) 2017-08-15 17:27:12 +07:00
requests.go JSON RPC Proxy configuration (#193) 2017-08-15 17:27:12 +07:00

README.md

Package jail

--

import "github.com/status-im/status-go/geth/jail"

GoDoc

Package jail implements "jailed" enviroment for executing arbitrary JavaScript code using Otto JS interpreter (https://github.com/robertkrimen/otto).

Jail create multiple JailCells, one cell per status client chat. Each cell runs own Otto virtual machine and lives forever, but that may change in the future.

+----------------------------------------------+
|                     Jail                     |
+----------------------------------------------+
+---------+ +---------+ +---------+  +---------+
|  Cell   | |  Cell   | |  Cell   |  |  Cell   |
|ChatID 1 | |ChatID 2 | |ChatID 3 |  |ChatID N |
|+-------+| |+-------+| |+-------+|  |+-------+|
||Otto VM|| ||Otto VM|| ||Otto VM||  ||Otto VM||
|+-------+| |+-------+| |+-------+|  |+-------+|
|| Loop  || || Loop  || || Loop  ||  || Loop  ||
++-------++ ++-------++ ++-------++  ++-------++

Get and Set

(*JailCell).Get/Set functions provide transparent and concurrently safe wrappers for Otto VM Get and Set functions respectively. See Otto documentation for usage examples: https://godoc.org/github.com/robertkrimen/otto

Call and Run

(*JailCell).Call/Run functions allows executing arbitrary JS in the cell. They're also wrappers arount Otto VM functions of the same name. Run accepts raw JS strings for execution, Call takes a JS function name (defined in VM) and parameters.

Timeouts and intervals support

Default Otto VM interpreter doesn't support setTimeout()/setInterval() JS functions, because they're not part of ECMA-262 spec, but properties of the window object in browser. We add support for them using http://github.com/deoxxa/ottoext/timers and http://github.com/deoxxa/ottoext/loop packages.

Each cell starts a new loop in a separate goroutine, registers functions for setTimeout/setInterval calls and associate them with this loop. All JS code executed as callback to setTimeout/setInterval will be handled by this loop.

For example, following code:

cell.Run(`setTimeout(function(){ value = "42" }, 2000);`)

will execute setTimeout and return immidiately, but callback function will be executed after 2 seconds in the loop that was started upon current cell.

In order to capture response one may use following approach:

err = cell.Set("__captureResponse", func(val string) otto.Value {
	fmt.Println("Captured response from callback:", val)
	return otto.UndefinedValue()
})
cell.Run(`setTimeout(function(){ __captureResponse("OK") }, 2000);`)

Fetch support

TBD