An open API service indexing awesome lists of open source software.

https://github.com/qiqiboy/pmer

Provide some powerful & helpful functions for Two-way communication with postMessage
https://github.com/qiqiboy/pmer

broadcast cross-domain iframe postmessage two-way-communication

Last synced: 7 months ago
JSON representation

Provide some powerful & helpful functions for Two-way communication with postMessage

Awesome Lists containing this project

README

        

# pmer

提供一些便捷的使用 [`postMessage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) 的一些辅助方法

* [安装](#安装)
* [背景](#背景)
* [使用](#使用)
- [`postMessage`](#postmessage)
- [`addListener`](#addlistener)
- [`addListenerOnce`](#addlisteneronce)

## 安装

```bash
$ npm install pmer --save
```

## 背景

`postMessage`的使用本身已经非常简单了,但是实际应用中,由于`postMessage`和`addEventListener('message')`的强解耦,导致消息的`收` `发`变得非常离散。

通过本项目提供的一些方法,可以更加简单的控制消息的监听与发送。

你可以发送消息,并监听是否收到回复;也可以主动监听指定的`type`消息,并且回复该消息。

## 使用

`pmer`目前提供了以下几个方法供使用:

### `postMessage`

向目标窗口发送消息,返回一个 promise 对象。你可以通过该 promise 对象来判断是否成功发送了消息,并且如果目标窗口如果回复了该消息,你还可以通过 promise 回调收到传回来的数据。

```typescript
/**
* 发送消息
* @param {Window} target 目标窗口, window.opener/window.parent/HTMLIFrameElement.contentWindow...
* @param {string} type 消息类型
* @param {any} payload 消息体
* @param {string} 可选,targetOrigin
* @param {Transferable[]} 可选,transfer
*
* @return {Promise} 返回promise,如果有收到回复消息,将会触发promose回调
*/
export declare function postMessage(
target: Window,
type: string,
payload?: any,
targetOrigin?: string,
transfer?: Transferable[]
): Promise;

// 给父级窗口发送 DELETE_USER 消息
postMessage(window.parent, 'DELETE_USER', 123);

// 如果父级窗口有回复该消息,则可以通过promise监听结果
postMessage(window.parent, 'DELETE_USER', 123).then(() => console.log('delete succeed!'));
```

### `addListener`

监听当前窗口接受到的消息(只支持通过[`postMessage`](#postmessage)发送的消息),并且可以回复该消息

```typescript
/**
* 添加消息监听
* @param {string|Array} msgTypes 要监听的消息类型,*表示任何消息
* @param {Function} listener 监听方法
* @param {Function} filter 可选,消息过滤,可以通过该方法过滤不符合要求的消息
*
* @return {function} 返回移除监听的方法
*/
export declare function addListener(
msgTypes: ListenerTypes,
listener: LisenterCall,
filter: (event: PMERMessageEvent) => boolean
): RemoveListener;

// 监听 DELETE_USER 消息
addListener('DELETE_USER', payload => {
console.log('message:', payload);
});

// 通过return一个值,可以回复该消息
addListener('DELETE_USER', payload => {
return 'delete succeed!';
});

// 你也可以返回一个promise对象(这里使用async/await语法):
// postMessage(window, 'DELETE_USER', 123)
// .then(() => console.log('删除成功'), () => console.log('删除失败'))
addListener('DELETE_USER', async userId => {
await fetch('/delete/user/' + userId);
});

// addListener调用后会返回一个清理函数,可以通过该函数随时移除当前的消息监听
const removeListener = addListener('DELETE_USER', () => {});
removeListener();

// 可以通过第三个filter参数过滤一些不符合的消息,例如只接收来自指定域的消息
addListener(
'DELETE_USER',
payload => {
console.log(payload);
},
event => event.origin === 'https://valid.domain.com'
);
```

### `addListenerOnce`

用法完全同`addListener`,唯一区别是当调用过一次后,会自动移除监听

```typescript
/**
* 添加单次消息监听
* @param {string|Array} msgTypes 要监听的消息类型,*表示任何消息
* @param {Function} listener 监听方法
* @param {Function} filter 可选,消息过滤,可以通过该方法过滤不符合要求的消息
*
* @return {function} 返回移除监听的方法
*/
export declare function addListenerOnce(
msgTypes: ListenerTypes,
listener: LisenterCall,
filter: (event: PMERMessageEvent) => boolean
): RemoveListener;
```