Tiny RPC over window.postMessage library
npm install postmsg-rpcIn the window you want to call to (the "server"):
import { expose } from 'postmsg-rpc'
const fruitService = {
getFruits: (/* arg0, arg1, ... */) => new Promise(/* ... */)
}
// Expose this function for RPC from other windows
expose('getFruits', fruitService.getFruits)In the other window (the "client"):
import { call } from 'postmsg-rpc'
// Call the exposed function
const fruits = await call('getFruits'/*, arg0, arg1, ... */)Use caller to create a function that uses postMessage to call an exposed function in a different window. It also allows you to pass options (see docs below).
import { caller } from 'postmsg-rpc'
const getFruits = caller('getFruits'/*, options */)
// Wait for the fruits to ripen
const fruits = await getFruits(/*, arg0, arg1, ... */)Expose func as funcName for RPC from other windows. Assumes that func returns a promise.
funcName- the name of the function called on the clientfunc- the function that should be called. Should be synchronous or return a promise. For callbacks, passoptions.isCallbackoptions.targetOrigin- passed to postMessage (see postMessage docs for more info)- default
'*'
- default
options.isCallback- set to true iffunctakes a node style callback instead of returning a promise- default
false
- default
options.postMessage- function that posts a message. It is passed two parameters,dataandoptions.targetOrigin. e.g.document.querySelector('iframe').contentWindow.postMessagefor exposing functions to an iframe orwindow.parent.postMessagefor exposing functions from an iframe to a parent window- default
window.postMessage
- default
The following options are for use with other similar messaging systems, for example when using message passing in browser extensions or for testing:
options.addListener- function that adds a listener. It is passed two parameters, the event name (always "message") and ahandlerfunction- default
window.addEventListener
- default
options.removeListener- function that removes a listener. It is passed two parameters, the event name (always "message") and ahandlerfunction- default
window.removeEventListener
- default
options.getMessageData- a function that extracts data from the arguments passed to amessageevent handler- default
(e) => e.data
- default
Returns an object with a close method to stop the server from listening to messages.
Call an exposed function in a different window.
funcName- the name of the function to call
Returns a Promise, so can be awaited or used in the usual way (then/catch). The Promise returned has an additional property cancel which can be called to cancel an in flight request e.g.
const fruitPromise = call('getFruits')
fruitPromise.cancel()
try {
await fruitPromise
} catch (err) {
if (err.isCanceled) {
console.log('function call canceled')
}
}Create a function that uses postMessage to call an exposed function in a different window.
funcName- the name of the function to calloptions.targetOrigin- passed to postMessage (see postMessage docs for more info)- default
'*'
- default
options.postMessage- function that posts a message. It is passed two parameters,dataandoptions.targetOrigin. e.g.document.querySelector('iframe').contentWindow.postMessagefor calling functions in an iframe orwindow.parent.postMessagefor calling functions in a parent window from an iframe- default
window.postMessage
- default
The following options are for use with other similar messaging systems, for example when using message passing in browser extensions or for testing:
options.addListener- function that adds a listener. It is passed two parameters, the event name (always "message") and ahandlerfunction- default
window.addEventListener
- default
options.removeListener- function that removes a listener. It is passed two parameters, the event name (always "message") and ahandlerfunction- default
window.removeEventListener
- default
options.getMessageData- a function that extracts data from the arguments passed to amessageevent handler- default
(e) => e.data
- default
Feel free to dive in! Open an issue or submit PRs.
MIT © Alan Shaw
A (╯°□°)╯︵TABLEFLIP side project.