import pym from "pym.js"; import { CleanupCallback, Decorator } from "./decorators"; export interface PymControlConfig { id: string; url: string; title: string; decorators?: ReadonlyArray; } export type PymControlFactory = (config: PymControlConfig) => PymControl; export const defaultPymControlFactory: PymControlFactory = config => new PymControl(config); export default class PymControl { private pym: pym.Parent; private cleanups: CleanupCallback[]; constructor(config: PymControlConfig) { const decorators = config.decorators || []; this.pym = new pym.Parent(config.id, config.url, { title: config.title, id: `${config.id}_iframe`, name: `${config.id}_iframe`, }); this.cleanups = decorators .map(enhance => enhance(this.pym)) .filter(cb => cb) as CleanupCallback[]; } public sendMessage(id: string, raw?: string) { this.pym.sendMessage(id, raw || ""); } public remove() { this.cleanups.forEach(cb => cb()); this.cleanups = []; // Remove the pym parent. this.pym.remove(); } }