npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

microserv

v0.13.0

Published

JSON-RPC over websocket with multicast service discovery.

Downloads

28

Readme

Microserv

Travis CI Known Vulnerabilities npm

JSON-RPC over websocket with multicast service discovery with a browser compatible client

Installation

npm install --save microserv

Usage

Service A

const { Server, Service } = require('microserv')

const server = new Server('my-app', { port: 3000 })
const msgService = new Service('message')

msgService.register('getMessage', () => {
	return 'Hello, world!'
})

server.addService(msgService)
server.listen()
server.announce()

Service B

const http = require('http')
const { Server, Service } = require('microserv')

const server = new Server('my-app', { port: 3001 })
const mathService = new Service('math')

mathService.register('add', (a, b) => {
	return a + b
})

server.addService(mathService)

// Wait for the message service to be ready
server.need('message')
	.then(([ message ]) => {
		const app = http.createServer((req, res) => {
			res.statusCode = 200
			res.setHeader('Content-Type', 'text/plain')

			// Call the message service `getMessage` method
			message.getMessage()
				.then(msg => {
					res.end(msg)
					// { type: 'string', data: 'Hello, world!' }
				})
		})

		app.listen(8080, '127.0.0.1')
	})

server.listen()
server.announce()

Client

const { Client } = require('microserv')

const client = new Client()

client.need('message', 'math')
	.then(([ message, math ]) => {
		message
			.getMessage()
			.then(msg => console.log(msg))

		math
			.add(1, 2)
			.then(sum => console.log(sum))
	})

client.connect('ws://localhost:3000')
client.connect('ws://localhost:3001')

Server

const server = new Server('my-app', { port: 3001 })

new Server(namespace[,options]) -> Client

Instantiate a client

Parameters:

  • address {String}: The service namespace. Only services in the same namespace can connect to each other.
  • options {Object}: Websocket options
    • port {Number}: Websocket port
    • interval {Number}: How often to announce the service (in ms). Defaults to 5000.
    • sever {http.Server|https.server}: A server to use as the websocket server. If set, will override port.
    • secure {Boolean}: Use secure websockets. Defaults to false.
    • serviceTransform {Function}: A function to transform the data returned from an rpc call. Defaults to noop.
    • authorization {Any}: Credentials to pass to Server when connecting
    • authorizeClient {Function}: A sync or async function to authorize a Client. Function is passed the Client's authorization credentials
    • dns {Object}: dns-discovery options

server.addService(service) -> Server

Add a service to the server, and announce the service to connected peers

Parameters:

  • service {Service}: A Service instance

server.need(...services) -> Promise

List required services. Resolves with each of the required services of type ClientService

Parameters:

  • services {String}: Service names

server.listen() -> Server

Begin listening for peers

server.announce() -> Server

Announce the service on the network. Will reannounce the service at the interval provided via opts.

Event: 'error'

Emitted when there is an error on the server

Event: 'connection_reset'

Emitted when a connected socket is reset

Service

const service = new Service('my-service')

new Service(name) -> Service

Instantiate a new Service

Parameters:

  • name {String}: The service name that will be announced to peers

service.register(method, cb[, resultType]) -> Service

Register an rpc method with the service

Parameters:

  • method {String}: The name of the method
  • cb {Function}: The function to invoke when the rpc method is called
  • resultType {String}: The type of data returned by the method. Defaults to typeof result

service.emit(name, data)

Emits an event via the websocket

Parameters:

  • name {String}: The event name
  • data {*}: The event data

ClientService

Returned from server.need(). This should not be instantiated direclty.

clientService.subscribe(name, cb)

Subscribe to a service event

Parameters:

  • name {String}: The name of the event
  • cb {Function}: The event callback

clientService.service_method(*) -> Object

Each method registered with the service is exposed a method of the client service. Returns and object with data and type properties.

Event: 'close'

Emitted when the connection to the service is lost

Event: 'reopen'

Emitted when the connection to a lost service is reestablished

Client

const client = new Client()

new Client([opts, rpcOpts]) -> Client

Instantiate a new Client

Parameters:

  • opts {Object}: Options
    • serviceTransform {Function}: A function to transform the data returned from an rpc call. Defaults to noop.
    • authorization {Any}: Credentials to pass to Server when connecting
  • rpcOpts {Object}: Options for rpc-websockets

client.connect(connection) -> Websocket

Connect to a specific websocket server

Parameters:

  • connection {String}: The server connection string (eg. ws://localhost:3001)

client.need(...service) -> Promise

List required services. Resolves with each of the required services of type ClientService

Parameters:

  • services {String}: Service names

Event: 'close'

Emitted when the connection to a service is closed

Event: 'error'

Event: 'unauthorized'

Emitted when the client fails authorization

Tests

npm run test

License

MIT License