1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2024-11-22 13:29:22 +00:00

Start WS routes implementation

This commit is contained in:
Pierre HUBERT 2020-03-31 16:20:35 +02:00
parent 348084442b
commit 7f82128c71
3 changed files with 77 additions and 10 deletions

View File

@ -11,6 +11,8 @@ import { randomStr } from '../utils/CryptUtils';
import { EventsHelper } from '../helpers/EventsHelper'; import { EventsHelper } from '../helpers/EventsHelper';
import { NotificationsHelper } from '../helpers/NotificationsHelper'; import { NotificationsHelper } from '../helpers/NotificationsHelper';
import { ConversationsHelper } from '../helpers/ConversationsHelper'; import { ConversationsHelper } from '../helpers/ConversationsHelper';
import { UserWebSocketRoutes } from './UserWebSocketRoutes';
import { UserWebSocketRequestsHandler } from '../entities/WebSocketRequestHandler';
import { WsMessage } from '../entities/WsMessage'; import { WsMessage } from '../entities/WsMessage';
interface PendingRequests { interface PendingRequests {
@ -132,7 +134,7 @@ export class UserWebSocketController {
}) })
// Handles incoming messages // Handles incoming messages
ws.addEventListener("message", (msg) => { ws.addEventListener("message", async (msg) => {
// Only accept text messages // Only accept text messages
if(msg.type != "message") { if(msg.type != "message") {
@ -141,7 +143,44 @@ export class UserWebSocketController {
return; return;
} }
// Check if the data are valid
let wsMsg : WsMessage;
try {
wsMsg = new WsMessage(JSON.parse(msg.data));
if(!wsMsg.isValidRequest)
throw new Error("Requested message is invalid!");
} catch(e) {
console.error(e);
ws.close();
return;
}
// Create request handler
const handler = new UserWebSocketRequestsHandler(client, wsMsg);
try {
// Check if we support this kind of message
const route = UserWebSocketRoutes.find((el) => el.title == wsMsg.title);
if(route == undefined) {
handler.error(404, "Method not found!");
return;
}
else
await route.handler(handler);
} catch(e) {
// Try again to send again a response
try {
handler.sendResponse("error", "Server error.");
} catch(e) {
console.error(e);
}
}
}) })
} }

View File

@ -5,11 +5,13 @@
*/ */
import { BaseRequestsHandler } from "./BaseRequestsHandler"; import { BaseRequestsHandler } from "./BaseRequestsHandler";
import { ActiveClient } from "../controllers/UserWebSocketController"; import { ActiveClient, UserWebSocketController } from "../controllers/UserWebSocketController";
import { WsMessage } from "./WsMessage"; import { WsMessage } from "./WsMessage";
export class UserWebSocketRequestsHandler extends BaseRequestsHandler { export class UserWebSocketRequestsHandler extends BaseRequestsHandler {
private sentResponse = false;
constructor(private wsClient: ActiveClient, private req: WsMessage) { constructor(private wsClient: ActiveClient, private req: WsMessage) {
super(); super();
} }
@ -22,17 +24,35 @@ export class UserWebSocketRequestsHandler extends BaseRequestsHandler {
protected getPostParam(name: string) { protected getPostParam(name: string) {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
public hasPostParameter(name: string): boolean { public hasPostParameter(name: string): boolean {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
public error(code: number, message: string): void { public error(code: number, message: string): void {
throw new Error("Method not implemented."); this.sendResponse("error", code + " - " + message);
} throw new Error("An error occured while processing user WS request!");
public success(message: string): void {
throw new Error("Method not implemented.");
}
public send(data: any): void {
throw new Error("Method not implemented.");
} }
public success(message: string): void {
this.sendResponse("success", message);
}
public send(data: any): void {
this.sendResponse("success", data);
}
public sendResponse(title: string, data: any) {
if(this.sentResponse)
throw new Error("Trying to send a response to a request to which a response has already been sent!")
// Send the response
UserWebSocketController.Send(this.wsClient.userID, this.wsClient.socketID, new WsMessage({
title: title,
data: data,
id: this.req.id
}))
this.sentResponse = true;
}
} }

View File

@ -21,4 +21,12 @@ export class WsMessage implements WsMessageBuilder {
this[key] = info[key]; this[key] = info[key];
} }
} }
get isValidRequest() : boolean {
return typeof this.id === "string"
&& typeof this.title === "string"
&& this.id.length > 0
&& this.title.length > 0
&& typeof this.data === "object";
}
} }