webextension-rpc

Remote Procedure Call implementation for WebExtensions, to easily call functions across content scripts and background script.

Usage no npm install needed!

<script type="module">
  import webextensionRpc from 'https://cdn.skypack.dev/webextension-rpc';
</script>

README

webextension-rpc

This module provides a Remote Procedure Call abstraction around the message passing that is available to WebExtension (browser extension) scripts. It makes it easier to call a function in the background script from a tab’s content script, or vice versa.

Example use

In background.js:

function myFunc(arg) {
  return arg * 2
}
makeRemotelyCallable({ myFunc })

In content_script.js:

const myRemoteFunc = remoteFunction('myFunc')
myRemoteFunc(21).then(result => { ... result is 42! ... })

Note that the remote function always returns a Promise, which resolves with the remote function’s actual return value (if the return value is itself a Promise, its result is awaited too).

Install

Using NPM

This module is published on npm.

Run npm install webextension-rpc or equivalent.

Standalone

Try one of the magic npm bundlers, for example:

wget https://wzrd.in/standalone/webextension-rpc -O webextension-rpc.js

API

remoteFunction(functionName, { tabId })

Create a proxy function that invokes the specified remote function.

  • functionName (string, required): name of the function as registered on the remote side.
  • options (object, optional):
    • tabId (number): The id of the tab whose content script is the remote side. Leave undefined to call the background script (from a content script).

makeRemotelyCallable(functions, { insertExtraArg })

Register one or more functions to enable remote scripts to call them. Arguments:

  • functions (object, required): An object with a { functionName: function } mapping. Each function will be remotely callable using the given name.
  • options (object, optional):
    • insertExtraArg (boolean, default is false): If truthy, each executed function also receives, as its first argument before the arguments it was invoked with, a Tab object, which contains the details of the tab that sent the message.