Adding strong checks on messages exchanged using generic-type-guard

This commit is contained in:
David Négrier 2021-03-05 16:50:54 +01:00
parent 83fa23a82d
commit 5178dff108
5 changed files with 39 additions and 14 deletions

View file

@ -79,8 +79,6 @@
"JITSI_URL": env.JITSI_URL,
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
"TURN_SERVER": "turn:coturn.workadventu.re:443,turns:coturn.workadventu.re:443",
"TURN_USER": "workadventure",
"TURN_PASSWORD": "WorkAdventure123",
"JITSI_PRIVATE_MODE": if env.SECRET_JITSI_KEY != '' then "true" else "false",
"START_ROOM_URL": "/_/global/maps."+url+"/Floor0/floor0.json"
//"GA_TRACKING_ID": "UA-10196481-11"

View file

@ -0,0 +1,8 @@
import * as tg from "generic-type-guard";
export const isChatEvent =
new tg.IsInterface().withProperties({
message: tg.isString,
author: tg.isString,
}).get();
export type ChatEvent = tg.GuardedType<typeof isChatEvent>;

View file

@ -0,0 +1,7 @@
interface IframeEvent {
type: string;
data: unknown;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const isIframeEventWrapper = (event: any): event is IframeEvent => typeof event.type === 'string' && typeof event.data === 'object';

View file

@ -1,9 +1,8 @@
import {Subject} from "rxjs";
import {ChatEvent, isChatEvent} from "./Events/ChatEvent";
import {isIframeEventWrapper} from "./Events/IframeEvent";
interface ChatEvent {
message: string,
author: string
}
/**
* Listens to messages from iframes and turn those messages into easy to use observables.
@ -21,12 +20,14 @@ class IframeListener {
// event.source is window.opener
// event.data is the data sent by the iframe
// FIXME: this is WAAAAAAAY too sloppy as "any" let's us put anything in the message.
if (event.data.type === 'chat') {
this._chatStream.next(event.data.data);
const payload = event.data;
if (isIframeEventWrapper(payload)) {
if (payload.type === 'chat' && isChatEvent(payload.data)) {
this._chatStream.next(payload.data);
}
}
}, false);
}
}

View file

@ -1,13 +1,18 @@
import {ChatEvent} from "./Api/Events/ChatEvent";
interface WorkAdventureApi {
sendChatMessage(message: string, author: string): void;
onChatMessage(callback: (message: string) => void): void;
}
// eslint-disable-next-line no-var
declare var WA: WorkAdventureApi;
declare global {
// eslint-disable-next-line no-var
var WA: WorkAdventureApi
}
window.WA = {
/**
* Sends a message in the chat.
* Send a message in the chat.
* Only the local user will receive this message.
*/
sendChatMessage(message: string, author: string) {
@ -16,7 +21,13 @@ window.WA = {
'data': {
'message': message,
'author': author
}
} as ChatEvent
}, '*');
},
/**
* Listen to messages sent by the local user, in the chat.
*/
onChatMessage(callback: (message: string) => void): void {
}
}