55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { WebComponentOutboundEventMessage } from '../typings/ce/message.type';
|
|
|
|
export class EventsManager {
|
|
private element: HTMLElement;
|
|
private targetIframeOrigin: string;
|
|
|
|
constructor(element: HTMLElement, initialTargetOrigin: string) {
|
|
this.element = element;
|
|
this.targetIframeOrigin = initialTargetOrigin;
|
|
}
|
|
|
|
/**
|
|
* Updates the target origin used when sending messages to the iframe.
|
|
* This should be called once the iframe URL is known to improve security.
|
|
*
|
|
* @param newOrigin - The origin of the content loaded in the iframe
|
|
* (e.g. 'https://meet.example.com')
|
|
*/
|
|
public setTargetOrigin(newOrigin: string): void {
|
|
this.targetIframeOrigin = newOrigin;
|
|
}
|
|
|
|
public listen() {
|
|
window.addEventListener('message', this.handleMessage.bind(this));
|
|
}
|
|
|
|
public cleanup() {
|
|
window.removeEventListener('message', this.handleMessage);
|
|
}
|
|
|
|
private handleMessage(event: MessageEvent) {
|
|
const message: WebComponentOutboundEventMessage = event.data;
|
|
// Validate message origin (security measure)
|
|
if (event.origin !== this.targetIframeOrigin) {
|
|
console.warn('Message from unknown origin:', event.origin);
|
|
return;
|
|
}
|
|
|
|
if (!message || !message.event) {
|
|
return;
|
|
}
|
|
|
|
this.dispatchEvent(message);
|
|
}
|
|
|
|
private dispatchEvent(message: WebComponentOutboundEventMessage) {
|
|
const event = new CustomEvent(message.event, {
|
|
detail: message.payload,
|
|
bubbles: true,
|
|
composed: true
|
|
});
|
|
this.element.dispatchEvent(event);
|
|
}
|
|
}
|