message-channel

2.0.0 • Public • Published

message-channel

request and response abstraction for message channel

The best communication method between an iframe and the main frame is through Channel messaging API.

Build Status

TLDR

Use this library for fast and performant communication between frames which uses message channel api underneath the hood.


why do i need it ?

let's say we want to have few iframes which need to communicate with the main frame.

usualy we'll need to:

  • Listen to post messages from the main frame.
  • Create a message channel from the iframe side.
  • Send a post message with one of the ports to the main frame.
  • Get the message from the iframe and register a callback to messages from the channel.
  • Be able to fit the main frame replies to the requests from the iframe.

with message-channel

// on the main frame
import listenerMessageChannel from 'message-channel/listener';
 
// the listener will call the onMessage callback everytime a connection is being established.
 
const handleMessage = (e, reply) => reply(e.data + ' world');
 
listenerMessageChannel('scope-name', handleMessage);
// on the iframe
import connectMessageChannel from 'message-channel/connect';
 
// Establish a connection with the main frame and send messages.
const send = await connectMessageChannel('scope-name');
 
send('hello')
  .then(e => console.log(e.data)); // 'hello world'

Installation

use a scipt tag and import the bundle

<!-- add this on the main frame -->
<script src="node_modules/message-channel/dist/statics/listener.bundle.min.js" />
<script> window.listenerMessageChannel(); // function will be available </script> 
<!-- add this on the iframe -->
<script src="node_modules/message-channel/dist/statics/listener.bundle.min.js" />
<script> window.connectMessageChannel(); // function will be available </script> 

you can also use npm

npm i --save message-channel

or yarn

yarn add message-channel

basic usage

scope - A scope is way to differentiate between two or more message-channels in the same application. (it has to be the same on both listener and connect)

methods

connectMessageChannel(scope: string, options: object): reply: string

listenerMessageChannel(scope: string, messageHandler: function): void

messageHandler((e: `object`, reply: `function`) => {
  reply(e.data); // will return a reply with the argument value (value must be serializable)
});

important note!: The event you'll get on the onMessage callback is a mirror of the messageEvent type. The reason for not sending the "real" event, is that we add an id to every message and we want to strip the id from the data.

stop the listener

If you want to stop the listener, just call the stop function which returns from the call to the listener.

const stop = listenerMessageChannel('scope-name', (e, reply) => reply(e.data + ' world'));
 
stop(); // The listener won't work.

Dependents (1)

Package Sidebar

Install

npm i message-channel

Weekly Downloads

18

Version

2.0.0

License

none

Last publish

Collaborators

  • arielh
  • falconci
  • yurynix
  • itai.benda
  • wix-ci
  • wix-ambassador
  • shahata
  • netanelgilad
  • wix-ci-publisher
  • wix-bi-publisher
  • ranyitzhaki