@ravenpay/bankbox-me-sdk
Version:
Raven Bankbox JS Payment SDK
52 lines (51 loc) • 1.72 kB
JavaScript
class EventWorker extends EventTarget {
constructor() {
super();
this.handledEvents = new Set();
this.isIframe = window !== window.parent; // Check if running inside an iframe
this.listenToMessages();
this.setupClearInterval();
}
emit(type, data) {
const event = new CustomEvent(type, { detail: data });
this.dispatchEvent(event);
// Send message to the parent if in an iframe, else send to all iframes
if (this.isIframe) {
window.parent.postMessage({ type, data }, "*");
}
else {
this.broadcastToIframes(type, data);
}
}
subscribe(key, callback) {
const eventHandler = (e) => {
callback(e);
};
this.addEventListener(key, eventHandler);
}
listenToMessages() {
window.addEventListener("message", (event) => {
if (!event.data || !event.data.type)
return;
const { type, data } = event.data;
if (!this.handledEvents.has(type)) {
this.handledEvents.add(type);
this.dispatchEvent(new CustomEvent(type, { detail: data }));
}
});
}
broadcastToIframes(type, data) {
const iframes = document.querySelectorAll("iframe");
iframes.forEach((iframe) => {
var _a;
(_a = iframe.contentWindow) === null || _a === void 0 ? void 0 : _a.postMessage({ type, data }, "*");
});
}
setupClearInterval() {
setInterval(() => {
this.handledEvents.clear();
}, 600); // Clear every 60 seconds
}
}
export const $event = new EventWorker();
export default $event;