Adding strong checks on messages exchanged using generic-type-guard
This commit is contained in:
parent
83fa23a82d
commit
5178dff108
@ -79,8 +79,6 @@
|
|||||||
"JITSI_URL": env.JITSI_URL,
|
"JITSI_URL": env.JITSI_URL,
|
||||||
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
|
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
|
||||||
"TURN_SERVER": "turn:coturn.workadventu.re:443,turns:coturn.workadventu.re:443",
|
"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",
|
"JITSI_PRIVATE_MODE": if env.SECRET_JITSI_KEY != '' then "true" else "false",
|
||||||
"START_ROOM_URL": "/_/global/maps."+url+"/Floor0/floor0.json"
|
"START_ROOM_URL": "/_/global/maps."+url+"/Floor0/floor0.json"
|
||||||
//"GA_TRACKING_ID": "UA-10196481-11"
|
//"GA_TRACKING_ID": "UA-10196481-11"
|
||||||
|
8
front/src/Api/Events/ChatEvent.ts
Normal file
8
front/src/Api/Events/ChatEvent.ts
Normal 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>;
|
7
front/src/Api/Events/IframeEvent.ts
Normal file
7
front/src/Api/Events/IframeEvent.ts
Normal 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';
|
@ -1,9 +1,8 @@
|
|||||||
import {Subject} from "rxjs";
|
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.
|
* 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.source is window.opener
|
||||||
// event.data is the data sent by the iframe
|
// 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.
|
const payload = event.data;
|
||||||
|
if (isIframeEventWrapper(payload)) {
|
||||||
if (event.data.type === 'chat') {
|
if (payload.type === 'chat' && isChatEvent(payload.data)) {
|
||||||
this._chatStream.next(event.data.data);
|
this._chatStream.next(payload.data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}, false);
|
}, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
|
import {ChatEvent} from "./Api/Events/ChatEvent";
|
||||||
|
|
||||||
interface WorkAdventureApi {
|
interface WorkAdventureApi {
|
||||||
sendChatMessage(message: string, author: string): void;
|
sendChatMessage(message: string, author: string): void;
|
||||||
|
onChatMessage(callback: (message: string) => void): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line no-var
|
declare global {
|
||||||
declare var WA: WorkAdventureApi;
|
// eslint-disable-next-line no-var
|
||||||
|
var WA: WorkAdventureApi
|
||||||
|
}
|
||||||
|
|
||||||
window.WA = {
|
window.WA = {
|
||||||
/**
|
/**
|
||||||
* Sends a message in the chat.
|
* Send a message in the chat.
|
||||||
* Only the local user will receive this message.
|
* Only the local user will receive this message.
|
||||||
*/
|
*/
|
||||||
sendChatMessage(message: string, author: string) {
|
sendChatMessage(message: string, author: string) {
|
||||||
@ -16,7 +21,13 @@ window.WA = {
|
|||||||
'data': {
|
'data': {
|
||||||
'message': message,
|
'message': message,
|
||||||
'author': author
|
'author': author
|
||||||
}
|
} as ChatEvent
|
||||||
}, '*');
|
}, '*');
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Listen to messages sent by the local user, in the chat.
|
||||||
|
*/
|
||||||
|
onChatMessage(callback: (message: string) => void): void {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user