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

firemuzzy-trpc-browser

v2.0.1

Published

tRPC adapters and links for everywhere in the browser (fork by firemuzy

Downloads

39

Readme

trpc-browser

🌐 tRPC for everything in the browser

  • Typesafe messaging for extensions
    • between window, content & background scripts
    • ready for Manifest V3.
  • Typesafe messaging for windows
    • between window, any other window (eg iframe) or popups

📖 Table of contents

📦 Installation

Install trpc-browser.

# npm
npm install trpc-browser
# yarn
yarn add trpc-browser

🧩 Example usage for extensions

1. Add createChromeHandler in your background script.

// background.ts
import { initTRPC } from '@trpc/server';
import { createChromeHandler } from 'trpc-browser/adapter';

const t = initTRPC.create({
  isServer: false,
  allowOutsideOfServer: true,
});

const appRouter = t.router({
  // ...procedures
});

export type AppRouter = typeof appRouter;

createChromeHandler({
  router: appRouter /* 👈 */,
});

2. Add a chromeLink to the client in your content script.

// content.ts
import { createTRPCClient } from '@trpc/client';
import { chromeLink } from 'trpc-browser/link';

import type { AppRouter } from './background';

const port = chrome.runtime.connect();
export const chromeClient = createTRPCProxyClient<AppRouter>({
  links: [/* 👉 */ chromeLink({ port })],
});

3. (extra) If you have an injected window script, hook it up too!.

// inpage.ts
import { createTRPCProxyClient } from '@trpc/client';
import { windowLink } from 'trpc-browser/link';

import type { AppRouter } from './background';

export const windowClient = createTRPCProxyClient<AppRouter>({
  links: [/* 👉 */ windowLink({ window })],
});
// content.ts
import { relay } from 'trpc-browser/relay';

const port = chrome.runtime.connect();
relay(window, port);

🕸️ Example usage for windows

1. Add createWindowHandler in your main window.

// main.ts
import { initTRPC } from '@trpc/server';
import { createWindowHandler } from 'trpc-browser/adapter';

const t = initTRPC.create({
  isServer: false,
  allowOutsideOfServer: true,
});

const appRouter = t.router({
  // ...procedures
});

export type AppRouter = typeof appRouter;

createWindowHandler({
  router: appRouter /* 👈 */,
  window: window /* 👈 */,
});

2. Add a windowLink or popupLink to the client

import { createTRPCProxyClient } from '@trpc/client';
import { popupLink, windowLink } from 'trpc-browser/link';

import type { AppRouter } from './main';

/** iframe */
const iframeEl = document.querySelector('iframe');
export const iframeClient = createTRPCProxyClient<AppRouter>({
  links: [/* 👉 */ windowLink({ window: iframeEl.contentWindow })],
});

/** popup */
export const popupClient = createTRPCProxyClient<AppRouter>({
  links: [
    /* 👉 */ popupLink({
      listenWindow: window,
      createPopup: () => {
        const w = window.open('/example/popup', 'popup', 'width=680,height=520');
        if (!w) {
          throw new Error('Could not open popup');
        }
        return w;
      },
    }),
  ],
});

📔 Requirements

Peer dependencies:

  • tRPC Server v10 (@trpc/server) must be installed.
  • tRPC Client v10 (@trpc/client) must be installed.

📝 Example

Please see an extension example here. You can also find a window example here.

For advanced use-cases, please find examples in our complete test suite.

🆎 Types

ChromeLinkOptions

Please see full typings here.

| Property | Type | Description | Required | | -------- | --------------------- | ---------------------------------------------------------------- | -------- | | port | chrome.runtime.Port | An open web extension port between content & background scripts. | true |

WindowLinkOptions

Please see full typings here.

| Property | Type | Description | Required | | ------------ | -------- | --------------------------------------------------------- | -------- | | window | Window | A window object which is listened to | true | | postWindow | Window | A window object which is posted to (defaults to window) | false | | postOrigin | string | The targetOrigin passed to opts.postWindow.postMessage | false |

PopupLinkOptions

Please see full typings here.

| Property | Type | Description | Required | | -------------- | ---------- | ---------------------------------------------- | -------- | | listenWindow | Window | A window object which is listened to | true | | createPopup | Function | A function that returns a window object. | true | | postOrigin | string | The targetOrigin passed to popup.postMessage | false |

CreateChromeHandlerOptions

Please see full typings here.

| Property | Type | Description | Required | | --------------- | ---------- | ------------------------------------------------------ | -------- | | router | Router | Your application tRPC router. | true | | createContext | Function | Passes contextual (ctx) data to procedure resolvers. | false | | onError | Function | Called if error occurs inside handler. | false | | chrome | Object | Chrome API object. (default: global.chrome) | false |

CreateWindowHandlerOptions

Please see full typings here.

| Property | Type | Description | Required | | --------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | | router | Router | Your application tRPC router. | true | | createContext | Function | Passes contextual (ctx) data to procedure resolvers. | false | | onError | Function | Called if error occurs inside handler. | false | | window | Window | Window object to subscribe to | true | | postWindow | Window | Window object to post messages to. (default: MessageEvent.source with fallback to opts.window) | false | | postOrigin | string | The targetOrigin passed to opts.postWindow.postMessage. If you want to answer to all messages from all origins you should pass '*', by default it will only work on same origin | false |


Cross-origin support

When posting from a link you can specify the postOrigin option. This will be passed to postMessage as the targetOrigin argument. If you want to answer to all messages from all origins you should pass '*', by default it will only work on same origin.

©️ License

Distributed under the MIT License. See LICENSE for more information.

🛎️ Contact

Janek Rahrt - Follow me on Twitter @0xjanek 💜 James Berry - Follow me on Twitter @jlalmes 💙