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, based on the HTTP method.

WARNING

By default, RPCHandler in the HTTP Adapter enabled StrictGetMethodPlugin which blocks GET requests except for procedures explicitly allowed. Please refer to StrictGetMethodPlugin for more details.

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.