JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 24
  • Score
    100M100P100Q93197F
  • License MIT

A fully typed RPC framework for TypeScript

Package Exports

  • awesomerpc
  • awesomerpc/lib/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (awesomerpc) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

AwesomeRPC

AwesomeRPC is an easy-to-use RPC framework written in TypeScript. It features advanced reflection capabilities, allowing you to define type-safe APIs in nothing more than a bit of TypeScript. No copy-pasting or code generators needed!

Quick Start

First, you need to define a contract for your API. A contract is kind of like a TypeScript interface: it defines what methods (and events) are allowed.

import t from "reflect-types";
import { contract } from "awesomerpc";

// A client API that connects to the server in the browser via web sockets
const petStoreClientContract = contract({
    // These methods the server can call on the client at any time
    methods: {
        refresh: t.callable([] as const, t.void()),
    },
    // These events may be received by the client, coming from the server
    events: {
        logout: t.undefined(),
    },
});

Next, you need to implement this contract, like so:

import { implement } from "awesomerpc";

const petStoreClientImpl = implement(petStoreClientContract, petStoreServerContract)
    .method('refresh', (_ctx) => {
        window.location.reload();
    })
    .finish();

Finally, you can connect to the server using, for example, the browser's web socket:

import { WebSocketTransport, RPC } from "awesomerpc";

const transport = new WebSocketTransport(`http://localhost:8080/ws`);
transport.open(); // will open the socket in the background

const rpc = new RPC(
    transport,
    petStoreClientImpl, // local API
    petStoreServerContract, // remote API
    {} // local state
);

console.log(`Available products: ${await rpc.callMethod('getProducts', [])}`);

For more information, read the full example in the example/ directory.

API

Transports

new WebSocketTransport(url)

Create a new transport that uses WebSocket to send and receive messages.

Transport.open()

Connect to whatever was specified as the destination address during the construction of the transport.

This method returns a promise object that may be awaited in order to ensure the connection is ready for use.

Top-level Functions

connect(impl, state, logger?)

import pino from "pino";

import { connect } from "awesomerpc";

connect(petStoreClientImpl, {});

FAQ

How do I enable logging?

To enable logging, you need to create and object that satisfies the Logger interface. [Pino][pino] is one such logger that is compatible with this interface. You can install it using:

$ npm install pino

Next, you need to define the logger object. In this example, the log level is read from the environment variable MYAPP_LOG_LEVEL and defaults to info.

src/logging.ts

import pino from "pino";

export const logger = pino({
  level: process.env.MYAPP_LOG_LEVEL || 'info',
});

Pass this object in while creating a connection, like so:

import { connect } from "awesomerpc";

import { logger } from "./logging";

connect(petStoreClientImpl, {}, logger);

If no logger is specified, AwesomeRPC will simply not log anything.

License

This project is licensed under the MIT license. See LICENSE.txt for more information.