Skip to content

RPC Protocol

The RPC protocol enables remote procedure calls over HTTP using JSON, supporting native data types. It is used by RPCHandler.

Routing

The procedure to call is determined by the pathname.

bash
curl https://example.com/rpc/planet/create

This example calls the planet.create procedure, with /rpc as the prefix.

ts
const router = {
  planet: {
    create: os.handler(() => {}) 
  }
}

Input

Any HTTP method can be used. Input can be provided via URL query parameters or the request body.

Input in URL Query

ts
const url = new URL('https://example.com/rpc/planet/create')

url.searchParams.append('data', JSON.stringify({
  json: {
    name: 'Earth',
    detached_at: '2022-01-01T00:00:00.000Z'
  },
  meta: [[1, 'detached_at']]
}))

const response = await fetch(url)

Input in Request Body

bash
curl -X POST https://example.com/rpc/planet/create \
  -H 'Content-Type: application/json' \
  -d '{
    "json": {
      "name": "Earth",
      "detached_at": "2022-01-01T00:00:00.000Z"
    },
    "meta": [[1, "detached_at"]]
  }'

Input with File

ts
const form = new FormData()

form.set('data', JSON.stringify({
  json: {
    name: 'Earth',
    thumbnail: {},
    images: [{}, {}]
  },
  meta: [[1, 'detached_at']],
  maps: [['images', 0], ['images', 1]]
}))

form.set('0', new Blob([''], { type: 'image/png' }))
form.set('1', new Blob([''], { type: 'image/png' }))

const response = await fetch('https://example.com/rpc/planet/create', {
  method: 'POST',
  body: form
})

Success Response

http
HTTP/1.1 200 OK
Content-Type: application/json

{
  "json": {
    "id": "1",
    "name": "Earth",
    "detached_at": "2022-01-01T00:00:00.000Z"
  },
  "meta": [[0, "id"], [1, "detached_at"]]
}

A success response has an HTTP status code between 200-299 and returns the procedure's output.

Error Response

http
HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
  "json": {
    "defined": false,
    "code": "INTERNAL_SERVER_ERROR",
    "status": 500,
    "message": "Internal server error",
    "data": {}
  },
  "meta": []
}

An error response has an HTTP status code between 400-599 and returns an ORPCError object.

Meta

The meta field describes native data in the format [type: number, ...path: (string | number)[]].

Supported Types

TypeDescription
0bigint
1date
2nan
3undefined
4url
5regexp
6set
7map

Maps

The maps field is used with FormData to map a file or blob to a specific path in json.

Released under the MIT License.