mikeal / znode

Bi-directional RPC through any stream.
206 stars 13 forks source link

znode

znode is a remote method execution library for Node.js and the browser.

[1] Underlying implementation uses msgpack5. Performance is optimized for binary type usage (JSON would be faster for cases other than binary types).

Full Usage

const RPC = {
  /* basic method support */
  ping: () => 'pong',
  /* async methods work identicaly to sync methods */
  ping2: async () => 'pong2',
  /* supports binary types */
  pingBuffer: () => Buffer.from('pong'),
  /* you can also add static properties */
  API: 'v1'
}

net.createServer(async socket => {
  let remote = await znode(socket, RPC)

  let concater = await remote.createConcat('pre-')
  console.log(await concater.concat('post')) // priv-pre-post
})
.listen(async () => {

  const dynamicRPC = {
    createConcat: str => {
      let _private = 'priv-'
      return {concat: _str => _private + str + _str}
    }
  }

  let socket = net.connect(port)
  let remote = await znode(socket, dynamicRPC)
  console.log(await remote.ping()) // pong
  console.log(await remote.ping2()) // pong2
  console.log(await remote.pingBuffer()) // <Buffer 70 6f 6e 67>
  console.log(remote.API) // v1
})

RPC methods can return anything that can be serialized by msgpack5. RPC methods can also return objects with additional methods that will be turned into additional remote methods.