5.0.1 • Published 3 years ago

nanomessage-rpc v5.0.1

Weekly downloads
116
License
MIT
Repository
github
Last release
3 years ago

nanomessage-rpc (aka nrpc)

Build Status JavaScript Style Guide standard-readme compliant

Tiny :hatched_chick: RPC on top of nanomessage

Install

$ npm install nanomessage-rpc

Usage

import { NanomessageRPC } from 'nanomessage-rpc'

;(async () => {
  const rpc = new NanomessageRPC({
    send(buf) {
      // implement how to send the message
    },
    subscribe(next) {
      // subscribe for incoming messages
    }
  })

  await rpc
    .action('sum', ({ a, b }) => a + b)
    .action('subtract', ({ a, b }) => a - b)
    .open()

  // from the other rpc socket side
  const result = await rpc.call('sum', { a: 2, b: 2 }) // 4
})()

We provide a socket helper:

import { NanomessageRPC, useSocket } from 'nanomessage-rpc'

;(async () => {
  const rpc = new NanomessageRPC({ ...useSocket(socket) })

  // ...
})()

Also it has an emittery instance to emit events through the socket.

;(async () => {
  const rpc = new NanomessageRPC(socket, opts)

  await rpc.open()

  rpc.on('ping', () => {
    console.log('ping')
  })

  // from the other rpc socket side
  const result = await rpc.emit('ping') // 4
})()

And it has support for nanoerror.

import { NanomessageRPC } from 'nanomessage-rpc'
import nanoerror from 'nanoerror'

const BAD_REQUEST = nanoerror('BAD_REQUEST', 'the request %s is wrong')

;(async () => {
  const rpc = new NanomessageRPC(socket, opts)

  await rpc
    .action('badrequest', () => {
      throw new BAD_REQUEST(1)
    })
    .open()

  // from the other rpc socket side
  try {
    const result = await rpc.call('badrequest', { a: 2, b: 2 }) // 4
  } catch (err) {
    // will throw BAD_REQUEST: the request 1 is wrong
  }
})()

API

const rpc = new NanomessageRPC(options)

Create a new nanomessage-rpc.

Options include:

  • send: (buf: Buffer) => (Promise|undefined): Define a hook to specify how to send the data. Required.
  • subscribe: (next: function) => UnsubscribeFunction: Define a handler to listen for incoming messages.
  • timeout: 10000: Time (ms) to wait for the response of a request.
  • concurrency: { incoming: 256, outgoing: 256 }: Defines how many requests do you want to run in concurrent.
  • valueEncoding: buffer-json: Defines an abstract-encoding to encode/decode messages in nanomessage.

rpc.open() => Promise

Opens nanomessage and start listening for incoming data.

rpc.close() => Promise

Closes nanomessage and unsubscribe from incoming data.

rpc.action(actionName, handler)

Defines a rpc action and handler for incoming requests.

  • actionName: string: Name of the action.
  • handler: function: Handler, could be async.

rpc.actions(actions)

Shortcut to define multiple actions.

  • actions: { actionName: handler, ... }: List of actions.

rpc.call(actionName, data, [opts]) => Promise<Response>

Call an action an wait for the response.

  • actionName: string: Action name.
  • data: (Buffer|Object|String): Request data.
  • opts.timeout: number: Define a custom timeout for the current request.
  • opts.signal: AbortSignal: Set an abort signal object to cancel the request.

Events

rpc.emit(eventName, data, [opts]) => Promise

Emit an event in the remote side.

  • actionName: string: Event name.
  • data: (Buffer|Object|String): Event data.
  • opts.timeout: number: Define a custom timeout for the current request. Use timeout = 0 to not wait for a response.
  • opts.signal: AbortSignal: Set an abort signal object to cancel the request.

rpc.on(eventName, handler) => unsubscribe

Subscribe to a RPC event.

Returns an unsubscribe method.

rpc.once(eventName) => Promise

Subscribe to a RPC event only once. It will be unsubscribed after the first event.

Returns a promise for the event data when eventName is emitted.

rpc.off(eventName)

Remove a RPC event subscription.

rpc.events(eventName)

Get an async iterator which buffers data each time a RPC event is emitted.

Call return() on the iterator to remove the subscription.

for await (const data of rpc.events('ping')) {
  console.log(data)
  if (disconnected) break
}

System events

You can listen for internal events using rpc.ee.

  • on('error', (err) => {}): When the internal RPC gets an error.
  • on('opened', () => {}): When the RPC was opened.
  • on('closed', () => {}): When the RPC was closed.
  • on('request-created', (request, message) => {}): When a request is created.
  • on('message', (message) => {}): When it comes a new message.

Issues

:bug: If you found an issue we encourage you to report it on github. Please specify your OS and the actions to reproduce it.

Contributing

:busts_in_silhouette: Ideas and contributions to the project are welcome. You must follow this guideline.

License

MIT © A GEUT project

5.0.1

3 years ago

5.0.0

3 years ago

4.5.0

3 years ago

4.3.2

3 years ago

4.4.0

3 years ago

4.3.1

3 years ago

4.1.0

3 years ago

4.0.0

3 years ago

4.3.0

3 years ago

4.2.1

3 years ago

4.2.0

3 years ago

4.1.1

3 years ago

3.2.0

3 years ago

3.1.0

3 years ago

3.0.0

4 years ago

2.1.0

4 years ago

2.0.1

4 years ago

2.0.0

4 years ago

1.2.1

4 years ago

1.2.0

4 years ago

1.1.2

4 years ago

1.1.1

4 years ago

1.1.0

4 years ago

1.0.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago