Skip to content

Instantly share code, notes, and snippets.

@gbutt
Created February 6, 2020 04:09
Show Gist options
  • Save gbutt/752804c1123bbb5c186529346cfa73d0 to your computer and use it in GitHub Desktop.
Save gbutt/752804c1123bbb5c186529346cfa73d0 to your computer and use it in GitHub Desktop.
An attempt to make postMessage async compatible, completely untested
const registeredCallbacks = {};
const ORIGIN = location.origin;
function listener(event) {
if (event.origin !== ORIGIN) {
return;
}
let data = JSON.parse(event.data);
let ticket = data.ticket;
let payload = data.payload;
if (data.error) {
registeredCallbacks[ticket].reject(payload);
} else {
registeredCallbacks[ticket].resolve(payload);
}
delete registeredCallbacks[ticket];
}
export function registerListener() {
window.addEventListener('message', listener);
}
export function unregisterListener() {
window.removeEventListener('message', listener);
}
export function postMessageAsync(messageName, data) {
return new Promise((resolve, reject) => {
let ticket = new Date().getTime();
let message = {
messageName,
data,
ticket,
};
registeredCallbacks[ticket] = { resolve, reject };
window.postMessage(message, ORIGIN);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment