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

@jurca/post-message-rpc

v1.0.1

Published

An RPC-like library for contexts connected via the postMessage API with TypeScript support.

Downloads

7

Readme

post-message-rpc

Build Status npm License npm type definitions

An RPC-like library for contexts connected via the postMessage API with TypeScript support.

Installation

post-message-rpc is available as npm package, you can use npm to install it:

npm install --save @jurca/post-message-rpc

Usage

There is separate API for the "server" (the RPC methods provider) and the client.

RPC Server

Use the createServer function to create an RPC server expecting procedure calls from other contexts:

import {createServer} from '@jurca/post-message-rpc'

createServer('channel ID', ['whitelist', 'of', 'origins'], {
  foo(x, y) {
    return x + y
  },
  bar(x) { // procedures may be asynchronous
    return new Promise((resolve) => setTimeout(resolve, x)).then(() => x)
  },
  baz() {
    // Errors thrown (synchronously or asynchronously) by procedures will be
    // propagated to the client.
    return Promise.reject(new Error('This is an error'))
  },
})

Using an empty array will allow calls from any origin, but is is strongly recommended for security reasons to always use an origin whitelist.

RPC Client

Use the createClient function to create an RPC client. Use the same channel ID as the one used to create the RPC server you want to communicate with (Each context may contain multiple servers and/or clients).

import {createClient} from '@jurca/post-message-rpc'

(async () => {
  const client = await createClient(
    iframeWindow,
    {
      // Connection options, consumed by the @jurca/post-message-p2p package.

      // A string, number, symbol, boolean, null or undefined identifying the
      // communication channel with the peer.
      channel: 'channel ID',
      // An optional timeout for receiving a confirmation that the peer has
      // received the message, defaults to 10 seconds. Specified in
      // milliseconds, must be a positive integer.
      timeout: 100,
      // The optional origin that is allowed to receive messages sent through
      // this connection. Defaults to '*', but is recommended to be set for
      // security reasons.
      origin: 'https://some.origin.org',
      // The optional number of retries when trying to perform a handshake
      // with the provided peer. The connection will not be established if the
      // peer will not be responding to the handshake messages. Defaults to 2.
      handshakeRetries: 2,
      // An optional delay between handshake attempts in milliseconds.
      // Defaults to 500.
      handshakeRetryDelay: 3000,
    },
    {
      // This is a template listing the methods exposed by the server that the
      // client intends to use. While it would be possible to create an
      // implementation that uses the Proxy API rendering this argument not
      // needed, it would break compatibility with Internet Explorer.
      foo: null,
      bar: null,
    },
  )

  const firstResult = await client.foo(10, 12) // firstResult = 22
  const otherResult = await client.bar(500) // otherResult = 500

  try {
    await client.baz()
  } catch (error) {
    // The error will have the name, message and stack correctly set. The
    // stack will be the correct stack of the error thrown by the procedure at
    // the server.
  }
})()