Skip to content

RCloud RPC internals

Simon Urbanek edited this page Mar 2, 2015 · 2 revisions

Bootstrap

oc.init.authenticate (in ocaps.R) is the only exposed OCAP: function(v, mode="IDE") which is attempting RC.authenticate(v) followed by RC.auth.anonymous(v) if unsuccessful. Those are the only functions to expose initial RCloud API to JS.

JS functions

JavaScript functions are represented as structure("<random-string>", class="javascript_function"). rserve.js converts any JS function by generating a random string, registering it in its internal hash (captured_functions in rserve.js) and returning the above structure.

The JS functions are invoked via OOB_MSG with list("<reference-string>", ...).

The OCAP setup_js_installer -> rcloud.setup.js.installer has to be called to register installation JS code with the R side. This happens in setup_*authenticated_ocaps() in rcloud.js and given the R side necessary JS function references to register new JS code.

R functions

R functions are registered via make.oc (creating an OCref object) which guarantees termination when the function is called and will return an R object of class OCAP-eval-error on error. Alternatively, it is possible to use Rserve:::ocap(f, name) directly, but that doesn't guarantee termination and thus use RESP_ERR with error code -1 (encoded as 127). All OCref objects are transformed into JS functions which require a continuation of the form function(err, v).

Note that rserve-js doesn't treat OCAP-eval-error in any special way, so OCAPs created with make.oc only signal err on communication errors, not on R evaluation errors.