export type ProxiedEvents = { [Q in keyof EventObject]: EventObject[Q] extends (...args: any) => void ? (...args: Parameters) => void : never } export type FunctionalInterface = { [P in keyof ObjectType]: ObjectType[P] extends (...args: any) => Promise ? (...args: any) => Promise : P extends "events" ? ObjectType[P] extends ProxiedEvents ? ProxiedEvents : never : never }; export type ProxiedClassProperties = { instanceId: string, ownerWindowId: number, events: any }; export type ProxyInterface = FunctionalInterface; export type ProxyClass = { new(props: ProxiedClassProperties): ProxyInterface & ProxiedClass }; export abstract class ProxiedClass }> { public readonly ownerWindowId: number; public readonly instanceId: string; public readonly events: ProxiedEvents; protected constructor(props: ProxiedClassProperties) { this.ownerWindowId = props.ownerWindowId; this.instanceId = props.instanceId; this.events = props.events; } public destroy() {} } export function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }