iframe manager

This commit is contained in:
Tamius Han 2023-03-02 01:08:25 +01:00
parent 3e542871c6
commit e7dd85420c

View File

@ -0,0 +1,105 @@
import EventBus from '../EventBus';
export type IframeData = {
// internal data for comms
tabId: string;
frameId: string;
// data for UI
tag?: string;
host?: string;
// other data
hasVideo?: boolean;
hasDrm?: boolean;
isPlaying?: boolean;
isBigEnough?: boolean; // 🎶🎶 🎵 🎵 🎶 🎶 AAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHH AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHH AAAAAAAAIIIAAAAAIIAAAAAAIAAAAAAAAA
}
export type IframeManagerConfiguration = {
isIframe: boolean
eventBus: EventBus,
}
/**
* Manages list of iframes for the current tab.
*/
export default class IframeManager {
isIframe: boolean;
private iframeList: IframeData[] = [];
private
eventBus: EventBus;
constructor(config: IframeManagerConfiguration) {
this.eventBus = config.eventBus;
this.isIframe = config.isIframe;
if (this.isIframe) {
window.addEventListener('beforeunload', this.destroy);
this.eventBus.subscribe(
'uw-frame-ping', {function: (cmd, context) => this.handleIframePing(context)}
);
this.eventBus.send(
'uw-frame-register', {host: window.location.hostname}, {comms: {forwardTo: 'all-frames'}}
);
} else {
this.eventBus.subscribe(
'uw-frame-register', {function: (data, context) => this.handleIframeRegister(data, context)}
);
this.eventBus.subscribe(
'uw-frame-destroyed', {function: (cmd, context) => this.handleFrameDestroyed(context)}
);
// register all frames to re-register themselves
this.eventBus.send(
'uw-frame-ping', {}, {comms: {forwardTo: 'all-frames'}}
);
}
}
private destroy() {
this.eventBus.send(
'uw-frame-destroyed',
{},
{
comms: {
forwardTo: 'all-frames'
}
},
)
}
private handleIframePing(context) {
}
/**
* Handles registration of iframes. If iframe with a given frameId exists, we update the existing frame.
* @param data
* @param context
*/
private handleIframeRegister(data, context) {
const existingIndex = this.iframeList.findIndex(x => x.frameId === context.comms.sourceFrame.frameId);
if (existingIndex !== -1) {
this.iframeList[existingIndex] = {
...this.iframeList[existingIndex],
...data
}
} else {
this.iframeList.push({
...data,
...context.comms.sourceFrame
});
}
}
private handleFrameDestroyed(context) {
// tab IDs should be the same for all items, making frameId sufficiently unique to filter stuff
this.iframeList = this.iframeList.filter(x => x.frameId !== context.comms.sourceFrame.frameId);
}
}