Created
February 6, 2020 04:09
-
-
Save gbutt/752804c1123bbb5c186529346cfa73d0 to your computer and use it in GitHub Desktop.
An attempt to make postMessage async compatible, completely untested
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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