All Projects → FrominXu → postmessagejs

FrominXu / postmessagejs

Licence: MIT license
postmessage-promise is a client-server like, WebSocket like, full Promise syntax (postMessage.then etc.) supported postMessage library. 一个类 client-server 模式、类 WebSocket 模式、全 Promise 语法支持的 postMessage 库

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to postmessagejs

Postmate
📭 A powerful, simple, promise-based postMessage library.
Stars: ✭ 1,638 (+4863.64%)
Mutual labels:  promise, postmessage
iworker
Promise-based wrapper for worker_threads
Stars: ✭ 18 (-45.45%)
Mutual labels:  promise
rallie
a library that helps users implement decentralized front-end micro service architecture
Stars: ✭ 285 (+763.64%)
Mutual labels:  micro-frontend
lightflow
A tiny Promise-inspired control flow library for browser and Node.js.
Stars: ✭ 29 (-12.12%)
Mutual labels:  promise
relaks
Asynchrounous React component
Stars: ✭ 49 (+48.48%)
Mutual labels:  promise
hangman-game
A responsive hangman game built with vanilla javascript, html, and css. Animated with GSAP and canvas animations.
Stars: ✭ 22 (-33.33%)
Mutual labels:  promise
repromised
🤝 Declarative promise resolver as a render props component
Stars: ✭ 20 (-39.39%)
Mutual labels:  promise
emacs-promise
Promises/A+ for Emacs
Stars: ✭ 56 (+69.7%)
Mutual labels:  promise
Promise.allSettled
ES Proposal spec-compliant shim for Promise.allSettled
Stars: ✭ 93 (+181.82%)
Mutual labels:  promise
sequence-as-promise
Executes array of functions as sequence and returns promise
Stars: ✭ 23 (-30.3%)
Mutual labels:  promise
p-cache
Decorator to memoize the results of async functions via lru-cache.
Stars: ✭ 21 (-36.36%)
Mutual labels:  promise
eslint-config-welly
😎 ⚙️ ESLint configuration for React projects that I do. Feel free to use this!
Stars: ✭ 21 (-36.36%)
Mutual labels:  promise
messpostage
PostMessage extension
Stars: ✭ 74 (+124.24%)
Mutual labels:  postmessage
ragu
🔪 A micro-frontend framework with Server Side Rendering.
Stars: ✭ 85 (+157.58%)
Mutual labels:  micro-frontend
conquerant
lightweight async/await for Clojure
Stars: ✭ 31 (-6.06%)
Mutual labels:  promise
cAndroid
cAndroid is tool for control your PC by Android phone
Stars: ✭ 23 (-30.3%)
Mutual labels:  client-server
best-queue
Queue in runtime based promise
Stars: ✭ 26 (-21.21%)
Mutual labels:  promise
transceiver
Channel based event bus with request/reply pattern, using promises. For node & browser.
Stars: ✭ 25 (-24.24%)
Mutual labels:  promise
make-cancellable-promise
Make any Promise cancellable.
Stars: ✭ 17 (-48.48%)
Mutual labels:  promise
parcel-plugin-goodie-bag
provides the Promise and fetch goodies needed for IE(11) support w/ parcel bundle loading
Stars: ✭ 15 (-54.55%)
Mutual labels:  promise

postmessage-promise

postmessage-promise is a client-server like, WebSocket like, full Promise syntax supported postMessage library.

中文文档

Why need this

  • Sometimes, the server page's logic unit is not ready when Document is loaded, so we need a function to start a listening when logic unit is ready.
  • Sometimes, we need waiting for the postMessage's response before post next message.

Features

  • support window: frame.contentWindow / openedWindow / window.parent / window.opener
  • client-server like, and WebSocket like.
  • 3-way hand shake at connecting.
  • client use callServer to connect with server unless timeout. You can use the same serverObject to create more server-caller if necessary. (the server may be a frame.contentWindow、a new opened window、window.parent or window.opener)
  • server use startListening to start a server listening, each server listening can only connect with one client. You can start more than one listening if necessary.
  • ES6 async await syntax supported.

connect

message-channel

How to use it

$ npm i postmessage-promise --save

client (iframe case)

import { callServer, utils } from "postmessage-promise";
const { getOpenedServer, getIframeServer } = utils;
const iframeRoot = document.getElementById("iframe-root");
const serverObject = getIframeServer(iframeRoot, "/targetUrl", "iname", ['iframe-style']);
const options = {}; 
callServer(serverObject, options).then(e => {
  console.log("connected with server");
  const { postMessage, listenMessage, destroy } = e;
  // post message to server and wait for response
  const method = "testPost";
  const payload = "this is client post payload";
  postMessage(method, payload).then(e => {
    console.log("response from server: ", e);
  });
  // listener for server message
  listenMessage((method, payload, response) => {
    console.log("client received: ", method, payload);
    const time = new Date().getTime();
    setTimeout(() => {
      // response to server
      response({
        time,
        msg: "this is a client response"
      });
    }, 200);
  });
});

client (window.open case)

import { callServer, utils } from "postmessage-promise";
const { getOpenedServer, getIframeServer } = utils;
const serverObject = getOpenedServer("/targetUrl");
const options = {}; 
callServer(serverObject, options).then(e => {
  console.log("connected with server");
  const { postMessage, listenMessage, destroy } = e;
  // post message to server and wait for response
  const method = "testPost";
  const payload = "this is client post payload";
  postMessage(method, payload).then(e => {
    console.log("response from server: ", e);
  });
  // listener for server message
  listenMessage((method, payload, response) => {
    console.log("client received: ", method, payload);
    const time = new Date().getTime();
    setTimeout(() => {
      // response to server
      response({
        time,
        msg: "this is a client response"
      });
    }, 200);
  });
});

server

import { startListening } from "postmessage-promise";
const options = {};
startListening(options).then(e => {
  console.log("connected with client");
  const { postMessage, listenMessage, destroy } = e;
  // listener for client message
  listenMessage((method, payload, response) => {
    console.log("server received: ", method, payload);
    const time = new Date().getTime();
    setTimeout(() => {
      // response to client
      response({
        time,
        msg: "this is a server response"
      });
    }, 200);
  });
  // post message to client and wait for response
  const method = "toClient";
  const payload = { msg: 'this is server post payload' };
  postMessage(method, payload).then(e => {
    console.log("response from client: ", e);
  });
});

multiple server and client

// server:
const listener = (handler, name)=>{
  startListening({
    serverInfo: {
      name: "thisIsServer"+name
    }
  }).then(e=>{
    listener(handler, Math.random());
    handler(e);
  });
}
listener((e)=>{}, 'name1');
//
// client:
callServer(serverObject, {
  onDestroy: () => { }, clientInfo: { name: "thisIsClient"+ Math.random() }
}).then(e => {})

serverObject

you can provide other serverObject like:

  {
    server: frame.contentWindow, // openedWindow / window.parent / window.opener
    origin
  };

options

const options = { 
  eventFilter: (event) => true, 
  timeout: 20 * 1000,
  onDestroy: () => { if (frame) { frame.parentNode.removeChild(frame); } }
}
  • eventFilter: is filter for post messages event.
  • timeout: is set for client to connect with server, or for client and server's response of postMessage.then.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].