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

grain-rpc

v0.1.7

Published

Typed RPC interface on top of an arbitrary communication channel

Downloads

776

Readme

Build Status

layer a remote-procedure-call interface on top of simple messaging, using promises

You provide messaging between two endpoints, and in return you get the ability to register interfaces or functions at either endpoint, and call them from the other side.

All you need to do is:

  1. Provide a sendMessage() function to deliver messages to the other side.
  2. Call receiveMessage() whenever a message is received.

What you get is the ability to register entire interfaces (type-checked or unchecked) on either side, and call methods on those interfaces from the other side. This is particularly pleasant with typescript. For example, if you define this interface:

export interface ICalc {
  add(x: number, y: number): number;
}

Then on one side you can do:

import {ICalc} from './ICalc';
import {Rpc} from 'grain-rpc';

class Calc implements ICalc {
  public add(x: number, y: number): number {
    return x + y;
  }
}

const rpc = new Rpc({sendMessage: yourSendMessageFunction});
// ... hook up incoming messages to rpc.receiveMessage() ...
rpc.registerImpl<ICalc>("calc", new Calc());

And on the other side you can do:

import {ICalc} from './ICalc';
import {Rpc} from 'grain-rpc';

const rpc = new Rpc({sendMessage: yourSendMessageFunction});
// ... hook up incoming messages to rpc.receiveMessage() ...
rpc.getStub<ICalc>("calc");
console.log(await stub.add(4, 5));   // should print 9

Rpc library supports ts-interface-checker descriptors for the interfaces, to allow validation.

The string name used to register and use an implementation allows for the same Rpc object to be used to expose multiple interfaces, or different implementations of the same interface.

Rpc also supports a messaging interface, with postMessage() to send arbitrary messages, and an EventEmitter interface for "message" events to receive them, e.g. on("message", ...). So if you need to multiplex non-Rpc messages over the same channel, Rpc class does it for you.

Forwarding

Rpc connections can be linked together transparently using named forwarders. For example:

const frontend = new Rpc(...);
const backend = new Rpc(...);
frontend.registerForwarder("backend", backend);
frontend.getStub<ICalc>("calc@backend");
console.log(await stub.add(4, 5));   // will call calc.add(4, 5) on backend