JSchema-RPC

"The enemy of art is the absence of limitations."

 

Introduction

To complement JSchema, JSchema-RPC is a way to specify a RPC end point using JSON.

RPC URL Convention and File Conventions

Given an end point at:

http://example.com/path/
The JSchema-RPC should be available at:
http://example.com/path/?JSchema-RPC

Locally, JSchema-RPC files should end with the .jsc-rpc file suffix.

Grammar

The grammar for a JSchema-RPC file builds on the grammar for JSchema and JSON:

<rpc> ::= 
    '{'
      '"url"' ':' <string> 
      <optional_description>
      <optional_typedefs>
      '"functions"' ':' '[' <function_specs> ']'
    '}'
  
<optional_description>
    '' |
    ',' '"description"' ':' <string> ',' 

<optional_typedefs>
    '' |
    ',' <typedefs_map>

<function_specs> ::= 
    '' |
    <function_spec> | 
    <function_spec> ',' <function_specs> 

<function_spec> ::= 
    '{' '"name"' ':' <string>
      <optional_description>
      <optional_args_spec>
      <optional_return_type>
    '}'

<optional_args_spec> ::=
    '' |
    ',' '"args"' ':' '[' <arg_specs> ']'

<arg_specs> ::=
    '' |
    <arg_spec> |
    <arg_spec> ',' <arg_specs>
  
<arg_spec> ::=
  '{' <string> ':' <type> <optional_default> <optional_description> '}'

<optional_default> ::=
  ',' '"default"' ':' <object> |
  ''
<optional_return_type> ::=
    ',' '"returns"' ':' <type> |
    ''
    

Implementation Notes

Invocation

Given a JSchema-RPC Document and a function specification, invocation of the function is done as follows:

Exceptions

Exceptions may be raised by a JSchema-RPC end point using a return value of the following form:

<jschema_rpc_exception> ::= 
  '{'
    '"exception@"' ':' <string> <optional_type> <optional_trace>
  '}'

<optional_type> ::=  
  '' | 
  ',' '"exception_type@"' ':' <string>    

<optional_trace> ::=  
  '' | 
  ',' '"trace@"' ':' <string>    
End point creators should strive to provide useful traces, including elements only relevant to the remote procedure, rather than implementation details of the invocation.

The optional 'exception_type@' element is only a hint to the client. Client implementations should make a best effort to produce an equivalent exception on their side, but there are no guarantees regarding the type of exception produced.

Examples

JSchema-RPC File Example usage (Gosu)
{ "url" : "http://myserver:8080/employees", "description" : "Methods for manipulating employees", "typedefs@" : { "Employee" : { "first_name" : "string", "last_name" : "string", "age" : "int", "id" : "int" } }, "functions" : [ { "name" : "getEmployee", "description" : "Returns the employee with the given id", "args" : [ {"id" : "int" } ], "returns" : "Employee" }, { "name" : "updateEmployee", "description" : "Updates the given employee", "args" : [ { "employee" : "Employee" } ], "returns" : "boolean" } ] } // Assuming the above file is in EmployeesApi.jsc-rpc: var myEmp = EmployeesApi.getEmployee(42) myEmp.Age++ if( EmployeesApi.updateEmployee(myEmp) ) { print( "Updated the age of ${myEmp.FirstName}") }