2021-06-22 16:07:31 +02:00
|
|
|
import {Subject} from "rxjs";
|
|
|
|
import {ChatEvent, isChatEvent} from "./Events/ChatEvent";
|
|
|
|
import {HtmlUtils} from "../WebRtc/HtmlUtils";
|
|
|
|
import type {EnterLeaveEvent} from "./Events/EnterLeaveEvent";
|
|
|
|
import {isOpenPopupEvent, OpenPopupEvent} from "./Events/OpenPopupEvent";
|
|
|
|
import {isOpenTabEvent, OpenTabEvent} from "./Events/OpenTabEvent";
|
|
|
|
import type {ButtonClickedEvent} from "./Events/ButtonClickedEvent";
|
|
|
|
import {ClosePopupEvent, isClosePopupEvent} from "./Events/ClosePopupEvent";
|
|
|
|
import {scriptUtils} from "./ScriptUtils";
|
|
|
|
import {GoToPageEvent, isGoToPageEvent} from "./Events/GoToPageEvent";
|
|
|
|
import {isOpenCoWebsite, OpenCoWebSiteEvent} from "./Events/OpenCoWebSiteEvent";
|
|
|
|
import {
|
|
|
|
IframeEvent,
|
|
|
|
IframeEventMap,
|
|
|
|
IframeResponseEvent,
|
|
|
|
IframeResponseEventMap,
|
|
|
|
isIframeEventWrapper,
|
|
|
|
TypedMessageEvent
|
|
|
|
} from "./Events/IframeEvent";
|
|
|
|
import type {UserInputChatEvent} from "./Events/UserInputChatEvent";
|
2021-04-21 16:47:19 +02:00
|
|
|
import {isPlaySoundEvent, PlaySoundEvent} from "./Events/PlaySoundEvent";
|
2021-04-23 15:35:34 +02:00
|
|
|
import {isStopSoundEvent, StopSoundEvent} from "./Events/StopSoundEvent";
|
|
|
|
import {isLoadSoundEvent, LoadSoundEvent} from "./Events/LoadSoundEvent";
|
2021-06-22 16:07:31 +02:00
|
|
|
import {isSetPropertyEvent, SetPropertyEvent} from "./Events/setPropertyEvent";
|
|
|
|
import {isLayerEvent, LayerEvent} from "./Events/LayerEvent";
|
2021-06-23 09:18:20 +02:00
|
|
|
import {isMenuItemRegisterEvent,} from "./Events/ui/MenuItemRegisterEvent";
|
2021-06-22 16:07:31 +02:00
|
|
|
import type {DataLayerEvent} from "./Events/DataLayerEvent";
|
|
|
|
import type {GameStateEvent} from "./Events/GameStateEvent";
|
|
|
|
import type {HasPlayerMovedEvent} from "./Events/HasPlayerMovedEvent";
|
|
|
|
import {isLoadPageEvent} from "./Events/LoadPageEvent";
|
2021-06-23 09:18:20 +02:00
|
|
|
import {handleMenuItemRegistrationEvent, isMenuItemRegisterIframeEvent} from "./Events/ui/MenuItemRegisterEvent";
|
2021-06-28 14:58:49 +02:00
|
|
|
import {SetTilesEvent, isSetTilesEvent} from "./Events/SetTilesEvent";
|
2021-05-21 17:45:26 +02:00
|
|
|
|
2021-03-04 19:00:00 +01:00
|
|
|
/**
|
|
|
|
* Listens to messages from iframes and turn those messages into easy to use observables.
|
2021-03-06 16:00:07 +01:00
|
|
|
* Also allows to send messages to those iframes.
|
2021-03-04 19:00:00 +01:00
|
|
|
*/
|
|
|
|
class IframeListener {
|
2021-05-10 21:27:17 +02:00
|
|
|
|
2021-03-04 19:00:00 +01:00
|
|
|
private readonly _chatStream: Subject<ChatEvent> = new Subject();
|
|
|
|
public readonly chatStream = this._chatStream.asObservable();
|
|
|
|
|
2021-03-09 16:21:14 +01:00
|
|
|
private readonly _openPopupStream: Subject<OpenPopupEvent> = new Subject();
|
|
|
|
public readonly openPopupStream = this._openPopupStream.asObservable();
|
|
|
|
|
2021-05-21 16:24:48 +02:00
|
|
|
private readonly _openTabStream: Subject<OpenTabEvent> = new Subject();
|
|
|
|
public readonly openTabStream = this._openTabStream.asObservable();
|
|
|
|
|
|
|
|
private readonly _goToPageStream: Subject<GoToPageEvent> = new Subject();
|
|
|
|
public readonly goToPageStream = this._goToPageStream.asObservable();
|
|
|
|
|
2021-06-22 16:07:31 +02:00
|
|
|
private readonly _loadPageStream: Subject<string> = new Subject();
|
|
|
|
public readonly loadPageStream = this._loadPageStream.asObservable();
|
|
|
|
|
2021-03-25 17:12:53 +01:00
|
|
|
private readonly _openCoWebSiteStream: Subject<OpenCoWebSiteEvent> = new Subject();
|
|
|
|
public readonly openCoWebSiteStream = this._openCoWebSiteStream.asObservable();
|
|
|
|
|
|
|
|
private readonly _closeCoWebSiteStream: Subject<void> = new Subject();
|
|
|
|
public readonly closeCoWebSiteStream = this._closeCoWebSiteStream.asObservable();
|
|
|
|
|
2021-03-12 16:39:29 +01:00
|
|
|
private readonly _disablePlayerControlStream: Subject<void> = new Subject();
|
|
|
|
public readonly disablePlayerControlStream = this._disablePlayerControlStream.asObservable();
|
|
|
|
|
2021-03-28 16:36:02 +02:00
|
|
|
private readonly _enablePlayerControlStream: Subject<void> = new Subject();
|
|
|
|
public readonly enablePlayerControlStream = this._enablePlayerControlStream.asObservable();
|
2021-03-12 16:39:29 +01:00
|
|
|
|
2021-03-09 18:51:30 +01:00
|
|
|
private readonly _closePopupStream: Subject<ClosePopupEvent> = new Subject();
|
|
|
|
public readonly closePopupStream = this._closePopupStream.asObservable();
|
|
|
|
|
2021-03-22 16:10:21 +01:00
|
|
|
private readonly _displayBubbleStream: Subject<void> = new Subject();
|
|
|
|
public readonly displayBubbleStream = this._displayBubbleStream.asObservable();
|
2021-03-12 16:39:29 +01:00
|
|
|
|
2021-03-22 16:10:21 +01:00
|
|
|
private readonly _removeBubbleStream: Subject<void> = new Subject();
|
|
|
|
public readonly removeBubbleStream = this._removeBubbleStream.asObservable();
|
2021-03-12 16:39:29 +01:00
|
|
|
|
2021-05-10 11:19:18 +02:00
|
|
|
private readonly _showLayerStream: Subject<LayerEvent> = new Subject();
|
|
|
|
public readonly showLayerStream = this._showLayerStream.asObservable();
|
|
|
|
|
|
|
|
private readonly _hideLayerStream: Subject<LayerEvent> = new Subject();
|
|
|
|
public readonly hideLayerStream = this._hideLayerStream.asObservable();
|
|
|
|
|
2021-05-12 14:30:12 +02:00
|
|
|
private readonly _setPropertyStream: Subject<SetPropertyEvent> = new Subject();
|
|
|
|
public readonly setPropertyStream = this._setPropertyStream.asObservable();
|
|
|
|
|
2021-04-21 15:51:01 +02:00
|
|
|
private readonly _gameStateStream: Subject<void> = new Subject();
|
|
|
|
public readonly gameStateStream = this._gameStateStream.asObservable();
|
|
|
|
|
2021-05-18 15:41:16 +02:00
|
|
|
private readonly _dataLayerChangeStream: Subject<void> = new Subject();
|
|
|
|
public readonly dataLayerChangeStream = this._dataLayerChangeStream.asObservable();
|
2021-05-18 11:33:16 +02:00
|
|
|
|
2021-04-27 11:59:22 +02:00
|
|
|
private readonly _registerMenuCommandStream: Subject<string> = new Subject();
|
|
|
|
public readonly registerMenuCommandStream = this._registerMenuCommandStream.asObservable();
|
2021-05-20 10:57:36 +02:00
|
|
|
|
2021-05-28 12:13:10 +02:00
|
|
|
private readonly _unregisterMenuCommandStream: Subject<string> = new Subject();
|
|
|
|
public readonly unregisterMenuCommandStream = this._unregisterMenuCommandStream.asObservable();
|
2021-05-20 17:09:10 +02:00
|
|
|
|
2021-04-21 16:47:19 +02:00
|
|
|
private readonly _playSoundStream: Subject<PlaySoundEvent> = new Subject();
|
|
|
|
public readonly playSoundStream = this._playSoundStream.asObservable();
|
|
|
|
|
2021-04-23 15:35:34 +02:00
|
|
|
private readonly _stopSoundStream: Subject<StopSoundEvent> = new Subject();
|
|
|
|
public readonly stopSoundStream = this._stopSoundStream.asObservable();
|
|
|
|
|
|
|
|
private readonly _loadSoundStream: Subject<LoadSoundEvent> = new Subject();
|
|
|
|
public readonly loadSoundStream = this._loadSoundStream.asObservable();
|
|
|
|
|
2021-06-28 14:58:49 +02:00
|
|
|
private readonly _setTilesStream: Subject<SetTilesEvent> = new Subject();
|
|
|
|
public readonly setTilesStream = this._setTilesStream.asObservable();
|
2021-05-10 00:27:21 +02:00
|
|
|
|
2021-03-06 16:00:07 +01:00
|
|
|
private readonly iframes = new Set<HTMLIFrameElement>();
|
2021-05-28 12:13:10 +02:00
|
|
|
private readonly iframeCloseCallbacks = new Map<HTMLIFrameElement, (() => void)[]>();
|
2021-03-07 21:02:38 +01:00
|
|
|
private readonly scripts = new Map<string, HTMLIFrameElement>();
|
2021-05-18 11:33:16 +02:00
|
|
|
private sendPlayerMove: boolean = false;
|
2021-03-06 16:00:07 +01:00
|
|
|
|
2021-03-04 19:00:00 +01:00
|
|
|
init() {
|
2021-05-09 21:46:40 +02:00
|
|
|
window.addEventListener("message", (message: TypedMessageEvent<IframeEvent<keyof IframeEventMap>>) => {
|
2021-03-04 19:00:00 +01:00
|
|
|
// Do we trust the sender of this message?
|
2021-03-06 16:00:07 +01:00
|
|
|
// Let's only accept messages from the iframe that are allowed.
|
|
|
|
// Note: maybe we could restrict on the domain too for additional security (in case the iframe goes to another domain).
|
2021-06-07 16:48:52 +02:00
|
|
|
let foundSrc: string | undefined;
|
|
|
|
|
2021-06-23 09:18:20 +02:00
|
|
|
let iframe: HTMLIFrameElement;
|
2021-05-28 12:13:10 +02:00
|
|
|
for (iframe of this.iframes) {
|
2021-03-06 16:00:07 +01:00
|
|
|
if (iframe.contentWindow === message.source) {
|
2021-05-05 19:11:48 +02:00
|
|
|
foundSrc = iframe.src;
|
2021-03-06 16:00:07 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-06-07 16:48:52 +02:00
|
|
|
|
2021-06-28 15:20:27 +02:00
|
|
|
const payload = message.data;
|
|
|
|
|
2021-06-23 09:18:20 +02:00
|
|
|
if (foundSrc === undefined) {
|
2021-06-28 15:20:27 +02:00
|
|
|
if (isIframeEventWrapper(payload)) {
|
|
|
|
console.warn('It seems an iFrame is trying to communicate with WorkAdventure but was not explicitly granted the permission to do so. ' +
|
|
|
|
'If you are looking to use the WorkAdventure Scripting API inside an iFrame, you should allow the ' +
|
|
|
|
'iFrame to communicate with WorkAdventure by using the "openWebsiteAllowApi" property in your map (or passing "true" as a second' +
|
|
|
|
'parameter to WA.nav.openCoWebSite())');
|
|
|
|
}
|
2021-03-06 16:00:07 +01:00
|
|
|
return;
|
|
|
|
}
|
2021-03-04 19:00:00 +01:00
|
|
|
|
2021-03-05 16:50:54 +01:00
|
|
|
if (isIframeEventWrapper(payload)) {
|
2021-05-10 11:46:16 +02:00
|
|
|
if (payload.type === 'showLayer' && isLayerEvent(payload.data)) {
|
2021-05-10 11:19:18 +02:00
|
|
|
this._showLayerStream.next(payload.data);
|
|
|
|
} else if (payload.type === 'hideLayer' && isLayerEvent(payload.data)) {
|
|
|
|
this._hideLayerStream.next(payload.data);
|
2021-05-12 14:30:12 +02:00
|
|
|
} else if (payload.type === 'setProperty' && isSetPropertyEvent(payload.data)) {
|
|
|
|
this._setPropertyStream.next(payload.data);
|
2021-05-10 11:19:18 +02:00
|
|
|
} else if (payload.type === 'chat' && isChatEvent(payload.data)) {
|
2021-03-05 16:50:54 +01:00
|
|
|
this._chatStream.next(payload.data);
|
2021-03-09 16:21:14 +01:00
|
|
|
} else if (payload.type === 'openPopup' && isOpenPopupEvent(payload.data)) {
|
|
|
|
this._openPopupStream.next(payload.data);
|
2021-03-09 18:51:30 +01:00
|
|
|
} else if (payload.type === 'closePopup' && isClosePopupEvent(payload.data)) {
|
|
|
|
this._closePopupStream.next(payload.data);
|
2021-03-05 16:50:54 +01:00
|
|
|
}
|
2021-05-09 21:38:11 +02:00
|
|
|
else if (payload.type === 'openTab' && isOpenTabEvent(payload.data)) {
|
2021-03-25 17:12:53 +01:00
|
|
|
scriptUtils.openTab(payload.data.url);
|
|
|
|
}
|
2021-05-09 21:38:11 +02:00
|
|
|
else if (payload.type === 'goToPage' && isGoToPageEvent(payload.data)) {
|
2021-03-25 17:12:53 +01:00
|
|
|
scriptUtils.goToPage(payload.data.url);
|
|
|
|
}
|
2021-06-22 16:07:31 +02:00
|
|
|
else if (payload.type === 'loadPage' && isLoadPageEvent(payload.data)) {
|
|
|
|
this._loadPageStream.next(payload.data.url);
|
|
|
|
}
|
2021-05-21 17:45:26 +02:00
|
|
|
else if (payload.type === 'playSound' && isPlaySoundEvent(payload.data)) {
|
2021-04-21 16:47:19 +02:00
|
|
|
this._playSoundStream.next(payload.data);
|
|
|
|
}
|
2021-05-21 17:45:26 +02:00
|
|
|
else if (payload.type === 'stopSound' && isStopSoundEvent(payload.data)) {
|
2021-04-23 15:35:34 +02:00
|
|
|
this._stopSoundStream.next(payload.data);
|
|
|
|
}
|
2021-05-21 17:45:26 +02:00
|
|
|
else if (payload.type === 'loadSound' && isLoadSoundEvent(payload.data)) {
|
2021-04-23 15:35:34 +02:00
|
|
|
this._loadSoundStream.next(payload.data);
|
|
|
|
}
|
2021-05-01 17:43:31 +02:00
|
|
|
else if (payload.type === 'openCoWebSite' && isOpenCoWebsite(payload.data)) {
|
2021-06-07 16:48:52 +02:00
|
|
|
scriptUtils.openCoWebsite(payload.data.url, foundSrc);
|
2021-03-25 17:12:53 +01:00
|
|
|
}
|
2021-05-21 17:45:26 +02:00
|
|
|
|
2021-05-09 21:38:11 +02:00
|
|
|
else if (payload.type === 'closeCoWebSite') {
|
2021-03-25 17:12:53 +01:00
|
|
|
scriptUtils.closeCoWebSite();
|
|
|
|
}
|
2021-05-21 17:45:26 +02:00
|
|
|
|
2021-05-10 12:14:31 +02:00
|
|
|
else if (payload.type === 'disablePlayerControls') {
|
2021-03-12 16:39:29 +01:00
|
|
|
this._disablePlayerControlStream.next();
|
|
|
|
}
|
2021-05-10 12:14:31 +02:00
|
|
|
else if (payload.type === 'restorePlayerControls') {
|
2021-03-28 16:36:02 +02:00
|
|
|
this._enablePlayerControlStream.next();
|
2021-05-10 21:27:17 +02:00
|
|
|
} else if (payload.type === 'displayBubble') {
|
2021-03-22 16:10:21 +01:00
|
|
|
this._displayBubbleStream.next();
|
2021-05-10 21:27:17 +02:00
|
|
|
} else if (payload.type === 'removeBubble') {
|
2021-03-22 16:10:21 +01:00
|
|
|
this._removeBubbleStream.next();
|
2021-05-10 21:27:17 +02:00
|
|
|
} else if (payload.type == "getState") {
|
2021-04-21 15:51:01 +02:00
|
|
|
this._gameStateStream.next();
|
2021-05-18 11:33:16 +02:00
|
|
|
} else if (payload.type == "onPlayerMove") {
|
|
|
|
this.sendPlayerMove = true
|
2021-05-18 15:41:16 +02:00
|
|
|
} else if (payload.type == "getDataLayer") {
|
|
|
|
this._dataLayerChangeStream.next();
|
2021-06-23 09:18:20 +02:00
|
|
|
} else if (isMenuItemRegisterIframeEvent(payload)) {
|
2021-05-28 12:13:10 +02:00
|
|
|
const data = payload.data.menutItem;
|
|
|
|
// @ts-ignore
|
|
|
|
this.iframeCloseCallbacks.get(iframe).push(() => {
|
|
|
|
this._unregisterMenuCommandStream.next(data);
|
|
|
|
})
|
2021-06-21 18:22:31 +02:00
|
|
|
handleMenuItemRegistrationEvent(payload.data)
|
2021-06-28 14:58:49 +02:00
|
|
|
} else if (payload.type == "setTiles" && isSetTilesEvent(payload.data)) {
|
|
|
|
this._setTilesStream.next(payload.data);
|
2021-03-12 16:39:29 +01:00
|
|
|
}
|
2021-03-04 19:00:00 +01:00
|
|
|
}
|
|
|
|
}, false);
|
2021-03-06 15:26:07 +01:00
|
|
|
|
2021-03-06 16:00:07 +01:00
|
|
|
}
|
|
|
|
|
2021-05-18 15:41:16 +02:00
|
|
|
sendDataLayerEvent(dataLayerEvent: DataLayerEvent) {
|
|
|
|
this.postMessage({
|
|
|
|
'type' : 'dataLayer',
|
|
|
|
'data' : dataLayerEvent
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-05-10 21:27:17 +02:00
|
|
|
|
2021-06-23 11:32:11 +02:00
|
|
|
sendGameStateEvent(gameStateEvent: GameStateEvent) {
|
2021-04-21 15:51:01 +02:00
|
|
|
this.postMessage({
|
|
|
|
'type': 'gameState',
|
2021-05-18 15:41:16 +02:00
|
|
|
'data': gameStateEvent
|
2021-04-21 15:51:01 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-06 16:00:07 +01:00
|
|
|
/**
|
|
|
|
* Allows the passed iFrame to send/receive messages via the API.
|
|
|
|
*/
|
|
|
|
registerIframe(iframe: HTMLIFrameElement): void {
|
|
|
|
this.iframes.add(iframe);
|
2021-05-28 12:13:10 +02:00
|
|
|
this.iframeCloseCallbacks.set(iframe, []);
|
2021-03-06 16:00:07 +01:00
|
|
|
}
|
2021-03-06 15:26:07 +01:00
|
|
|
|
2021-03-06 16:00:07 +01:00
|
|
|
unregisterIframe(iframe: HTMLIFrameElement): void {
|
2021-05-28 12:13:10 +02:00
|
|
|
this.iframeCloseCallbacks.get(iframe)?.forEach(callback => {
|
|
|
|
callback();
|
|
|
|
});
|
2021-03-06 16:00:07 +01:00
|
|
|
this.iframes.delete(iframe);
|
2021-03-06 15:26:07 +01:00
|
|
|
}
|
|
|
|
|
2021-03-07 21:02:38 +01:00
|
|
|
registerScript(scriptUrl: string): void {
|
|
|
|
console.log('Loading map related script at ', scriptUrl)
|
|
|
|
|
|
|
|
if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {
|
|
|
|
// Using external iframe mode (
|
|
|
|
const iframe = document.createElement('iframe');
|
2021-06-22 16:07:31 +02:00
|
|
|
iframe.id = IframeListener.getIFrameId(scriptUrl);
|
2021-03-07 21:02:38 +01:00
|
|
|
iframe.style.display = 'none';
|
2021-05-09 21:38:11 +02:00
|
|
|
iframe.src = '/iframe.html?script=' + encodeURIComponent(scriptUrl);
|
2021-03-07 21:02:38 +01:00
|
|
|
|
|
|
|
// We are putting a sandbox on this script because it will run in the same domain as the main website.
|
|
|
|
iframe.sandbox.add('allow-scripts');
|
|
|
|
iframe.sandbox.add('allow-top-navigation-by-user-activation');
|
|
|
|
|
|
|
|
document.body.prepend(iframe);
|
|
|
|
|
|
|
|
this.scripts.set(scriptUrl, iframe);
|
|
|
|
this.registerIframe(iframe);
|
|
|
|
} else {
|
|
|
|
// production code
|
|
|
|
const iframe = document.createElement('iframe');
|
2021-06-22 16:07:31 +02:00
|
|
|
iframe.id = IframeListener.getIFrameId(scriptUrl);
|
2021-03-28 17:21:10 +02:00
|
|
|
iframe.style.display = 'none';
|
2021-03-07 21:02:38 +01:00
|
|
|
|
|
|
|
// We are putting a sandbox on this script because it will run in the same domain as the main website.
|
|
|
|
iframe.sandbox.add('allow-scripts');
|
|
|
|
iframe.sandbox.add('allow-top-navigation-by-user-activation');
|
|
|
|
|
2021-06-22 16:07:31 +02:00
|
|
|
//iframe.src = "data:text/html;charset=utf-8," + escape(html);
|
|
|
|
iframe.srcdoc = '<!doctype html>\n' +
|
2021-03-07 21:02:38 +01:00
|
|
|
'\n' +
|
|
|
|
'<html lang="en">\n' +
|
|
|
|
'<head>\n' +
|
2021-05-09 21:38:11 +02:00
|
|
|
'<script src="' + window.location.protocol + '//' + window.location.host + '/iframe_api.js" ></script>\n' +
|
|
|
|
'<script src="' + scriptUrl + '" ></script>\n' +
|
2021-06-22 16:07:31 +02:00
|
|
|
'<title></title>\n' +
|
2021-03-07 21:02:38 +01:00
|
|
|
'</head>\n' +
|
|
|
|
'</html>\n';
|
|
|
|
|
|
|
|
document.body.prepend(iframe);
|
|
|
|
|
|
|
|
this.scripts.set(scriptUrl, iframe);
|
|
|
|
this.registerIframe(iframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-06-22 16:07:31 +02:00
|
|
|
private static getIFrameId(scriptUrl: string): string {
|
2021-05-12 10:35:14 +02:00
|
|
|
return 'script' + btoa(scriptUrl);
|
2021-03-07 21:02:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
unregisterScript(scriptUrl: string): void {
|
2021-06-22 16:07:31 +02:00
|
|
|
const iFrameId = IframeListener.getIFrameId(scriptUrl);
|
2021-03-07 21:02:38 +01:00
|
|
|
const iframe = HtmlUtils.getElementByIdOrFail<HTMLIFrameElement>(iFrameId);
|
|
|
|
if (!iframe) {
|
2021-05-09 21:38:11 +02:00
|
|
|
throw new Error('Unknown iframe for script "' + scriptUrl + '"');
|
2021-03-07 21:02:38 +01:00
|
|
|
}
|
|
|
|
this.unregisterIframe(iframe);
|
|
|
|
iframe.remove();
|
|
|
|
|
|
|
|
this.scripts.delete(scriptUrl);
|
|
|
|
}
|
|
|
|
|
2021-03-06 15:26:07 +01:00
|
|
|
sendUserInputChat(message: string) {
|
|
|
|
this.postMessage({
|
|
|
|
'type': 'userInputChat',
|
|
|
|
'data': {
|
|
|
|
'message': message,
|
|
|
|
} as UserInputChatEvent
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-08 18:57:59 +01:00
|
|
|
sendEnterEvent(name: string) {
|
|
|
|
this.postMessage({
|
|
|
|
'type': 'enterEvent',
|
|
|
|
'data': {
|
|
|
|
"name": name
|
|
|
|
} as EnterLeaveEvent
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
sendLeaveEvent(name: string) {
|
|
|
|
this.postMessage({
|
|
|
|
'type': 'leaveEvent',
|
|
|
|
'data': {
|
|
|
|
"name": name
|
|
|
|
} as EnterLeaveEvent
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-05-18 11:33:16 +02:00
|
|
|
hasPlayerMoved(event: HasPlayerMovedEvent) {
|
|
|
|
if (this.sendPlayerMove) {
|
|
|
|
this.postMessage({
|
|
|
|
'type': 'hasPlayerMoved',
|
|
|
|
'data': event
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2021-05-10 21:44:15 +02:00
|
|
|
|
2021-03-09 18:05:07 +01:00
|
|
|
sendButtonClickedEvent(popupId: number, buttonId: number): void {
|
|
|
|
this.postMessage({
|
|
|
|
'type': 'buttonClickedEvent',
|
|
|
|
'data': {
|
|
|
|
popupId,
|
|
|
|
buttonId
|
|
|
|
} as ButtonClickedEvent
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-06 15:26:07 +01:00
|
|
|
/**
|
2021-03-06 16:00:07 +01:00
|
|
|
* Sends the message... to all allowed iframes.
|
2021-03-06 15:26:07 +01:00
|
|
|
*/
|
2021-06-21 18:22:31 +02:00
|
|
|
public postMessage(message: IframeResponseEvent<keyof IframeResponseEventMap>) {
|
2021-03-06 16:00:07 +01:00
|
|
|
for (const iframe of this.iframes) {
|
2021-03-06 15:26:07 +01:00
|
|
|
iframe.contentWindow?.postMessage(message, '*');
|
|
|
|
}
|
2021-03-04 19:00:00 +01:00
|
|
|
}
|
2021-03-09 18:05:07 +01:00
|
|
|
|
2021-03-04 19:00:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export const iframeListener = new IframeListener();
|