import type * as tg from "generic-type-guard"; import type { IframeEvent, IframeEventMap, IframeQuery, IframeQueryMap, IframeResponseEventMap, } from "../Events/IframeEvent"; import type { IframeQueryWrapper } from "../Events/IframeEvent"; export function sendToWorkadventure(content: IframeEvent) { window.parent.postMessage(content, "*"); } let queryNumber = 0; export const answerPromises = new Map< number, { resolve: ( value: | IframeQueryMap[keyof IframeQueryMap]["answer"] | PromiseLike ) => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any reject: (reason?: any) => void; } >(); export function queryWorkadventure( content: IframeQuery ): Promise { return new Promise((resolve, reject) => { window.parent.postMessage( { id: queryNumber, query: content, } as IframeQueryWrapper, "*" ); answerPromises.set(queryNumber, { resolve, reject, }); queryNumber++; }); } type GuardedType> = Guard extends tg.TypeGuard ? T : never; export interface IframeCallback< Key extends keyof IframeResponseEventMap, T = IframeResponseEventMap[Key], Guard = tg.TypeGuard > { typeChecker: Guard; callback: (payloadData: T) => void; } export interface IframeCallbackContribution extends IframeCallback { type: Key; } /** * !! be aware that the implemented attributes (addMethodsAtRoot and subObjectIdentifier) must be readonly * * */ export abstract class IframeApiContribution< T extends { callbacks: Array>; } > { abstract callbacks: T["callbacks"]; }