Applying Prettier on pusher and back
This commit is contained in:
parent
06b7f5ba2f
commit
10c3d6dee2
71 changed files with 1848 additions and 1652 deletions
|
@ -1,19 +1,21 @@
|
|||
import {BaseController} from "./BaseController";
|
||||
import {HttpRequest, HttpResponse, TemplatedApp} from "uWebSockets.js";
|
||||
import {ADMIN_API_TOKEN} from "../Enum/EnvironmentVariable";
|
||||
import {apiClientRepository} from "../Services/ApiClientRepository";
|
||||
import {AdminRoomMessage, WorldFullWarningToRoomMessage, RefreshRoomPromptMessage} from "../Messages/generated/messages_pb";
|
||||
import { BaseController } from "./BaseController";
|
||||
import { HttpRequest, HttpResponse, TemplatedApp } from "uWebSockets.js";
|
||||
import { ADMIN_API_TOKEN } from "../Enum/EnvironmentVariable";
|
||||
import { apiClientRepository } from "../Services/ApiClientRepository";
|
||||
import {
|
||||
AdminRoomMessage,
|
||||
WorldFullWarningToRoomMessage,
|
||||
RefreshRoomPromptMessage,
|
||||
} from "../Messages/generated/messages_pb";
|
||||
|
||||
|
||||
export class AdminController extends BaseController{
|
||||
|
||||
constructor(private App : TemplatedApp) {
|
||||
export class AdminController extends BaseController {
|
||||
constructor(private App: TemplatedApp) {
|
||||
super();
|
||||
this.App = App;
|
||||
this.receiveGlobalMessagePrompt();
|
||||
this.receiveRoomEditionPrompt();
|
||||
}
|
||||
|
||||
|
||||
receiveRoomEditionPrompt() {
|
||||
this.App.options("/room/refresh", (res: HttpResponse, req: HttpRequest) => {
|
||||
this.addCorsHeaders(res);
|
||||
|
@ -23,25 +25,25 @@ export class AdminController extends BaseController{
|
|||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
this.App.post("/room/refresh", async (res: HttpResponse, req: HttpRequest) => {
|
||||
res.onAborted(() => {
|
||||
console.warn('/message request was aborted');
|
||||
})
|
||||
console.warn("/message request was aborted");
|
||||
});
|
||||
|
||||
const token = req.getHeader('admin-token');
|
||||
const token = req.getHeader("admin-token");
|
||||
const body = await res.json();
|
||||
|
||||
if (token !== ADMIN_API_TOKEN) {
|
||||
console.error('Admin access refused for token: '+token)
|
||||
res.writeStatus("401 Unauthorized").end('Incorrect token');
|
||||
console.error("Admin access refused for token: " + token);
|
||||
res.writeStatus("401 Unauthorized").end("Incorrect token");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (typeof body.roomId !== 'string') {
|
||||
throw 'Incorrect roomId parameter'
|
||||
if (typeof body.roomId !== "string") {
|
||||
throw "Incorrect roomId parameter";
|
||||
}
|
||||
const roomId: string = body.roomId;
|
||||
|
||||
await apiClientRepository.getClient(roomId).then((roomClient) =>{
|
||||
await apiClientRepository.getClient(roomId).then((roomClient) => {
|
||||
return new Promise((res, rej) => {
|
||||
const roomMessage = new RefreshRoomPromptMessage();
|
||||
roomMessage.setRoomid(roomId);
|
||||
|
@ -57,12 +59,10 @@ export class AdminController extends BaseController{
|
|||
}
|
||||
|
||||
res.writeStatus("200");
|
||||
res.end('ok');
|
||||
|
||||
|
||||
res.end("ok");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
receiveGlobalMessagePrompt() {
|
||||
this.App.options("/message", (res: HttpResponse, req: HttpRequest) => {
|
||||
this.addCorsHeaders(res);
|
||||
|
@ -71,59 +71,57 @@ export class AdminController extends BaseController{
|
|||
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
this.App.post("/message", async (res: HttpResponse, req: HttpRequest) => {
|
||||
|
||||
res.onAborted(() => {
|
||||
console.warn('/message request was aborted');
|
||||
})
|
||||
console.warn("/message request was aborted");
|
||||
});
|
||||
|
||||
|
||||
const token = req.getHeader('admin-token');
|
||||
const token = req.getHeader("admin-token");
|
||||
const body = await res.json();
|
||||
|
||||
|
||||
if (token !== ADMIN_API_TOKEN) {
|
||||
console.error('Admin access refused for token: '+token)
|
||||
res.writeStatus("401 Unauthorized").end('Incorrect token');
|
||||
console.error("Admin access refused for token: " + token);
|
||||
res.writeStatus("401 Unauthorized").end("Incorrect token");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (typeof body.text !== 'string') {
|
||||
throw 'Incorrect text parameter'
|
||||
if (typeof body.text !== "string") {
|
||||
throw "Incorrect text parameter";
|
||||
}
|
||||
if (body.type !== 'capacity' && body.type !== 'message') {
|
||||
throw 'Incorrect type parameter'
|
||||
if (body.type !== "capacity" && body.type !== "message") {
|
||||
throw "Incorrect type parameter";
|
||||
}
|
||||
if (!body.targets || typeof body.targets !== 'object') {
|
||||
throw 'Incorrect targets parameter'
|
||||
if (!body.targets || typeof body.targets !== "object") {
|
||||
throw "Incorrect targets parameter";
|
||||
}
|
||||
const text: string = body.text;
|
||||
const type: string = body.type;
|
||||
const targets: string[] = body.targets;
|
||||
|
||||
await Promise.all(targets.map((roomId) => {
|
||||
return apiClientRepository.getClient(roomId).then((roomClient) =>{
|
||||
return new Promise((res, rej) => {
|
||||
if (type === 'message') {
|
||||
const roomMessage = new AdminRoomMessage();
|
||||
roomMessage.setMessage(text);
|
||||
roomMessage.setRoomid(roomId);
|
||||
await Promise.all(
|
||||
targets.map((roomId) => {
|
||||
return apiClientRepository.getClient(roomId).then((roomClient) => {
|
||||
return new Promise((res, rej) => {
|
||||
if (type === "message") {
|
||||
const roomMessage = new AdminRoomMessage();
|
||||
roomMessage.setMessage(text);
|
||||
roomMessage.setRoomid(roomId);
|
||||
|
||||
roomClient.sendAdminMessageToRoom(roomMessage, (err) => {
|
||||
err ? rej(err) : res();
|
||||
});
|
||||
} else if (type === 'capacity') {
|
||||
const roomMessage = new WorldFullWarningToRoomMessage();
|
||||
roomMessage.setRoomid(roomId);
|
||||
|
||||
roomClient.sendWorldFullWarningToRoom(roomMessage, (err) => {
|
||||
err ? rej(err) : res();
|
||||
});
|
||||
}
|
||||
roomClient.sendAdminMessageToRoom(roomMessage, (err) => {
|
||||
err ? rej(err) : res();
|
||||
});
|
||||
} else if (type === "capacity") {
|
||||
const roomMessage = new WorldFullWarningToRoomMessage();
|
||||
roomMessage.setRoomid(roomId);
|
||||
|
||||
roomClient.sendWorldFullWarningToRoom(roomMessage, (err) => {
|
||||
err ? rej(err) : res();
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}));
|
||||
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
this.errorToResponse(err, res);
|
||||
return;
|
||||
|
@ -131,7 +129,7 @@ export class AdminController extends BaseController{
|
|||
|
||||
res.writeStatus("200");
|
||||
this.addCorsHeaders(res);
|
||||
res.end('ok');
|
||||
res.end("ok");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
import { v4 } from 'uuid';
|
||||
import {HttpRequest, HttpResponse, TemplatedApp} from "uWebSockets.js";
|
||||
import {BaseController} from "./BaseController";
|
||||
import {adminApi} from "../Services/AdminApi";
|
||||
import {jwtTokenManager} from "../Services/JWTTokenManager";
|
||||
import {parse} from "query-string";
|
||||
import { v4 } from "uuid";
|
||||
import { HttpRequest, HttpResponse, TemplatedApp } from "uWebSockets.js";
|
||||
import { BaseController } from "./BaseController";
|
||||
import { adminApi } from "../Services/AdminApi";
|
||||
import { jwtTokenManager } from "../Services/JWTTokenManager";
|
||||
import { parse } from "query-string";
|
||||
|
||||
export interface TokenInterface {
|
||||
userUuid: string
|
||||
userUuid: string;
|
||||
}
|
||||
|
||||
export class AuthenticateController extends BaseController {
|
||||
|
||||
constructor(private App : TemplatedApp) {
|
||||
constructor(private App: TemplatedApp) {
|
||||
super();
|
||||
this.register();
|
||||
this.verify();
|
||||
|
@ -19,7 +18,7 @@ export class AuthenticateController extends BaseController {
|
|||
}
|
||||
|
||||
//Try to login with an admin token
|
||||
private register(){
|
||||
private register() {
|
||||
this.App.options("/register", (res: HttpResponse, req: HttpRequest) => {
|
||||
this.addCorsHeaders(res);
|
||||
|
||||
|
@ -29,15 +28,15 @@ export class AuthenticateController extends BaseController {
|
|||
this.App.post("/register", (res: HttpResponse, req: HttpRequest) => {
|
||||
(async () => {
|
||||
res.onAborted(() => {
|
||||
console.warn('Login request was aborted');
|
||||
})
|
||||
console.warn("Login request was aborted");
|
||||
});
|
||||
const param = await res.json();
|
||||
|
||||
//todo: what to do if the organizationMemberToken is already used?
|
||||
const organizationMemberToken:string|null = param.organizationMemberToken;
|
||||
const organizationMemberToken: string | null = param.organizationMemberToken;
|
||||
|
||||
try {
|
||||
if (typeof organizationMemberToken != 'string') throw new Error('No organization token');
|
||||
if (typeof organizationMemberToken != "string") throw new Error("No organization token");
|
||||
const data = await adminApi.fetchMemberDataByToken(organizationMemberToken);
|
||||
const userUuid = data.userUuid;
|
||||
const organizationSlug = data.organizationSlug;
|
||||
|
@ -49,28 +48,26 @@ export class AuthenticateController extends BaseController {
|
|||
const authToken = jwtTokenManager.createJWTToken(userUuid);
|
||||
res.writeStatus("200 OK");
|
||||
this.addCorsHeaders(res);
|
||||
res.end(JSON.stringify({
|
||||
authToken,
|
||||
userUuid,
|
||||
organizationSlug,
|
||||
worldSlug,
|
||||
roomSlug,
|
||||
mapUrlStart,
|
||||
organizationMemberToken,
|
||||
textures
|
||||
}));
|
||||
|
||||
res.end(
|
||||
JSON.stringify({
|
||||
authToken,
|
||||
userUuid,
|
||||
organizationSlug,
|
||||
worldSlug,
|
||||
roomSlug,
|
||||
mapUrlStart,
|
||||
organizationMemberToken,
|
||||
textures,
|
||||
})
|
||||
);
|
||||
} catch (e) {
|
||||
this.errorToResponse(e, res);
|
||||
}
|
||||
|
||||
|
||||
})();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private verify(){
|
||||
private verify() {
|
||||
this.App.options("/verify", (res: HttpResponse, req: HttpRequest) => {
|
||||
this.addCorsHeaders(res);
|
||||
|
||||
|
@ -82,50 +79,55 @@ export class AuthenticateController extends BaseController {
|
|||
const query = parse(req.getQuery());
|
||||
|
||||
res.onAborted(() => {
|
||||
console.warn('verify request was aborted');
|
||||
})
|
||||
console.warn("verify request was aborted");
|
||||
});
|
||||
|
||||
try {
|
||||
await jwtTokenManager.getUserUuidFromToken(query.token as string);
|
||||
} catch (e) {
|
||||
res.writeStatus("400 Bad Request");
|
||||
this.addCorsHeaders(res);
|
||||
res.end(JSON.stringify({
|
||||
"success": false,
|
||||
"message": "Invalid JWT token"
|
||||
}));
|
||||
res.end(
|
||||
JSON.stringify({
|
||||
success: false,
|
||||
message: "Invalid JWT token",
|
||||
})
|
||||
);
|
||||
return;
|
||||
}
|
||||
res.writeStatus("200 OK");
|
||||
this.addCorsHeaders(res);
|
||||
res.end(JSON.stringify({
|
||||
"success": true
|
||||
}));
|
||||
res.end(
|
||||
JSON.stringify({
|
||||
success: true,
|
||||
})
|
||||
);
|
||||
})();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
//permit to login on application. Return token to connect on Websocket IO.
|
||||
private anonymLogin(){
|
||||
private anonymLogin() {
|
||||
this.App.options("/anonymLogin", (res: HttpResponse, req: HttpRequest) => {
|
||||
this.addCorsHeaders(res);
|
||||
res.end();
|
||||
});
|
||||
|
||||
this.App.post("/anonymLogin", (res: HttpResponse, req: HttpRequest) => {
|
||||
this.App.post("/anonymLogin", (res: HttpResponse, req: HttpRequest) => {
|
||||
res.onAborted(() => {
|
||||
console.warn('Login request was aborted');
|
||||
})
|
||||
console.warn("Login request was aborted");
|
||||
});
|
||||
|
||||
const userUuid = v4();
|
||||
const authToken = jwtTokenManager.createJWTToken(userUuid);
|
||||
res.writeStatus("200 OK");
|
||||
this.addCorsHeaders(res);
|
||||
res.end(JSON.stringify({
|
||||
authToken,
|
||||
userUuid,
|
||||
}));
|
||||
res.end(
|
||||
JSON.stringify({
|
||||
authToken,
|
||||
userUuid,
|
||||
})
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import {HttpResponse} from "uWebSockets.js";
|
||||
|
||||
import { HttpResponse } from "uWebSockets.js";
|
||||
|
||||
export class BaseController {
|
||||
protected addCorsHeaders(res: HttpResponse): void {
|
||||
res.writeHeader('access-control-allow-headers', 'Origin, X-Requested-With, Content-Type, Accept');
|
||||
res.writeHeader('access-control-allow-methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
|
||||
res.writeHeader('access-control-allow-origin', '*');
|
||||
res.writeHeader("access-control-allow-headers", "Origin, X-Requested-With, Content-Type, Accept");
|
||||
res.writeHeader("access-control-allow-methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
|
||||
res.writeHeader("access-control-allow-origin", "*");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -16,23 +15,23 @@ export class BaseController {
|
|||
if (e && e.message) {
|
||||
let url = e?.config?.url;
|
||||
if (url !== undefined) {
|
||||
url = ' for URL: '+url;
|
||||
url = " for URL: " + url;
|
||||
} else {
|
||||
url = '';
|
||||
url = "";
|
||||
}
|
||||
console.error('ERROR: '+e.message+url);
|
||||
} else if (typeof(e) === 'string') {
|
||||
console.error("ERROR: " + e.message + url);
|
||||
} else if (typeof e === "string") {
|
||||
console.error(e);
|
||||
}
|
||||
if (e.stack) {
|
||||
console.error(e.stack);
|
||||
}
|
||||
if (e.response) {
|
||||
res.writeStatus(e.response.status+" "+e.response.statusText);
|
||||
res.writeStatus(e.response.status + " " + e.response.statusText);
|
||||
this.addCorsHeaders(res);
|
||||
res.end("An error occurred: "+e.response.status+" "+e.response.statusText);
|
||||
res.end("An error occurred: " + e.response.status + " " + e.response.statusText);
|
||||
} else {
|
||||
res.writeStatus("500 Internal Server Error")
|
||||
res.writeStatus("500 Internal Server Error");
|
||||
this.addCorsHeaders(res);
|
||||
res.end("An error occurred");
|
||||
}
|
||||
|
|
|
@ -1,45 +1,46 @@
|
|||
import {ADMIN_API_TOKEN} from "../Enum/EnvironmentVariable";
|
||||
import {IoSocketController} from "_Controller/IoSocketController";
|
||||
import {stringify} from "circular-json";
|
||||
import {HttpRequest, HttpResponse} from "uWebSockets.js";
|
||||
import { parse } from 'query-string';
|
||||
import {App} from "../Server/sifrr.server";
|
||||
import {socketManager} from "../Services/SocketManager";
|
||||
import { ADMIN_API_TOKEN } from "../Enum/EnvironmentVariable";
|
||||
import { IoSocketController } from "_Controller/IoSocketController";
|
||||
import { stringify } from "circular-json";
|
||||
import { HttpRequest, HttpResponse } from "uWebSockets.js";
|
||||
import { parse } from "query-string";
|
||||
import { App } from "../Server/sifrr.server";
|
||||
import { socketManager } from "../Services/SocketManager";
|
||||
|
||||
export class DebugController {
|
||||
constructor(private App : App) {
|
||||
constructor(private App: App) {
|
||||
this.getDump();
|
||||
}
|
||||
|
||||
|
||||
getDump(){
|
||||
getDump() {
|
||||
this.App.get("/dump", (res: HttpResponse, req: HttpRequest) => {
|
||||
const query = parse(req.getQuery());
|
||||
|
||||
if (query.token !== ADMIN_API_TOKEN) {
|
||||
return res.status(401).send('Invalid token sent!');
|
||||
return res.status(401).send("Invalid token sent!");
|
||||
}
|
||||
|
||||
return res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(stringify(
|
||||
socketManager.getWorlds(),
|
||||
(key: unknown, value: unknown) => {
|
||||
if(value instanceof Map) {
|
||||
const obj: any = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
for (const [mapKey, mapValue] of value.entries()) {
|
||||
obj[mapKey] = mapValue;
|
||||
}
|
||||
return obj;
|
||||
} else if(value instanceof Set) {
|
||||
return res
|
||||
.writeStatus("200 OK")
|
||||
.writeHeader("Content-Type", "application/json")
|
||||
.end(
|
||||
stringify(socketManager.getWorlds(), (key: unknown, value: unknown) => {
|
||||
if (value instanceof Map) {
|
||||
const obj: any = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
for (const [mapKey, mapValue] of value.entries()) {
|
||||
obj[mapKey] = mapValue;
|
||||
}
|
||||
return obj;
|
||||
} else if (value instanceof Set) {
|
||||
const obj: Array<unknown> = [];
|
||||
for (const [setKey, setValue] of value.entries()) {
|
||||
obj.push(setValue);
|
||||
}
|
||||
return obj;
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
));
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
})
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import {CharacterLayer, ExSocketInterface} from "../Model/Websocket/ExSocketInterface"; //TODO fix import by "_Model/.."
|
||||
import {GameRoomPolicyTypes} from "../Model/PusherRoom";
|
||||
import {PointInterface} from "../Model/Websocket/PointInterface";
|
||||
import { CharacterLayer, ExSocketInterface } from "../Model/Websocket/ExSocketInterface"; //TODO fix import by "_Model/.."
|
||||
import { GameRoomPolicyTypes } from "../Model/PusherRoom";
|
||||
import { PointInterface } from "../Model/Websocket/PointInterface";
|
||||
import {
|
||||
SetPlayerDetailsMessage,
|
||||
SubMessage,
|
||||
|
@ -18,17 +18,17 @@ import {
|
|||
CompanionMessage,
|
||||
EmotePromptMessage,
|
||||
} from "../Messages/generated/messages_pb";
|
||||
import {UserMovesMessage} from "../Messages/generated/messages_pb";
|
||||
import {TemplatedApp} from "uWebSockets.js"
|
||||
import {parse} from "query-string";
|
||||
import {jwtTokenManager} from "../Services/JWTTokenManager";
|
||||
import {adminApi, CharacterTexture, FetchMemberDataByUuidResponse} from "../Services/AdminApi";
|
||||
import {SocketManager, socketManager} from "../Services/SocketManager";
|
||||
import {emitInBatch} from "../Services/IoSocketHelpers";
|
||||
import {ADMIN_API_TOKEN, ADMIN_API_URL, SOCKET_IDLE_TIMER} from "../Enum/EnvironmentVariable";
|
||||
import {Zone} from "_Model/Zone";
|
||||
import {ExAdminSocketInterface} from "_Model/Websocket/ExAdminSocketInterface";
|
||||
import {v4} from "uuid";
|
||||
import { UserMovesMessage } from "../Messages/generated/messages_pb";
|
||||
import { TemplatedApp } from "uWebSockets.js";
|
||||
import { parse } from "query-string";
|
||||
import { jwtTokenManager } from "../Services/JWTTokenManager";
|
||||
import { adminApi, CharacterTexture, FetchMemberDataByUuidResponse } from "../Services/AdminApi";
|
||||
import { SocketManager, socketManager } from "../Services/SocketManager";
|
||||
import { emitInBatch } from "../Services/IoSocketHelpers";
|
||||
import { ADMIN_API_TOKEN, ADMIN_API_URL, SOCKET_IDLE_TIMER } from "../Enum/EnvironmentVariable";
|
||||
import { Zone } from "_Model/Zone";
|
||||
import { ExAdminSocketInterface } from "_Model/Websocket/ExAdminSocketInterface";
|
||||
import { v4 } from "uuid";
|
||||
|
||||
export class IoSocketController {
|
||||
private nextUserId: number = 1;
|
||||
|
@ -39,32 +39,29 @@ export class IoSocketController {
|
|||
}
|
||||
|
||||
adminRoomSocket() {
|
||||
this.app.ws('/admin/rooms', {
|
||||
this.app.ws("/admin/rooms", {
|
||||
upgrade: (res, req, context) => {
|
||||
const query = parse(req.getQuery());
|
||||
const websocketKey = req.getHeader('sec-websocket-key');
|
||||
const websocketProtocol = req.getHeader('sec-websocket-protocol');
|
||||
const websocketExtensions = req.getHeader('sec-websocket-extensions');
|
||||
const websocketKey = req.getHeader("sec-websocket-key");
|
||||
const websocketProtocol = req.getHeader("sec-websocket-protocol");
|
||||
const websocketExtensions = req.getHeader("sec-websocket-extensions");
|
||||
const token = query.token;
|
||||
if (token !== ADMIN_API_TOKEN) {
|
||||
console.log('Admin access refused for token: '+token)
|
||||
res.writeStatus("401 Unauthorized").end('Incorrect token');
|
||||
console.log("Admin access refused for token: " + token);
|
||||
res.writeStatus("401 Unauthorized").end("Incorrect token");
|
||||
return;
|
||||
}
|
||||
const roomId = query.roomId;
|
||||
if (typeof roomId !== 'string') {
|
||||
console.error('Received')
|
||||
res.writeStatus("400 Bad Request").end('Missing room id');
|
||||
if (typeof roomId !== "string") {
|
||||
console.error("Received");
|
||||
res.writeStatus("400 Bad Request").end("Missing room id");
|
||||
return;
|
||||
}
|
||||
|
||||
res.upgrade(
|
||||
{roomId},
|
||||
websocketKey, websocketProtocol, websocketExtensions, context,
|
||||
);
|
||||
res.upgrade({ roomId }, websocketKey, websocketProtocol, websocketExtensions, context);
|
||||
},
|
||||
open: (ws) => {
|
||||
console.log('Admin socket connect for room: '+ws.roomId);
|
||||
console.log("Admin socket connect for room: " + ws.roomId);
|
||||
ws.disconnecting = false;
|
||||
|
||||
socketManager.handleAdminRoom(ws as ExAdminSocketInterface, ws.roomId as string);
|
||||
|
@ -74,24 +71,34 @@ export class IoSocketController {
|
|||
const roomId = ws.roomId as string;
|
||||
|
||||
//TODO refactor message type and data
|
||||
const message: {event: string, message: {type: string, message: unknown, userUuid: string}} =
|
||||
const message: { event: string; message: { type: string; message: unknown; userUuid: string } } =
|
||||
JSON.parse(new TextDecoder("utf-8").decode(new Uint8Array(arrayBuffer)));
|
||||
|
||||
if(message.event === 'user-message') {
|
||||
const messageToEmit = (message.message as { message: string, type: string, userUuid: string });
|
||||
if(messageToEmit.type === 'banned'){
|
||||
socketManager.emitBan(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type, ws.roomId as string);
|
||||
if (message.event === "user-message") {
|
||||
const messageToEmit = message.message as { message: string; type: string; userUuid: string };
|
||||
if (messageToEmit.type === "banned") {
|
||||
socketManager.emitBan(
|
||||
messageToEmit.userUuid,
|
||||
messageToEmit.message,
|
||||
messageToEmit.type,
|
||||
ws.roomId as string
|
||||
);
|
||||
}
|
||||
if(messageToEmit.type === 'ban') {
|
||||
socketManager.emitSendUserMessage(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type, ws.roomId as string);
|
||||
if (messageToEmit.type === "ban") {
|
||||
socketManager.emitSendUserMessage(
|
||||
messageToEmit.userUuid,
|
||||
messageToEmit.message,
|
||||
messageToEmit.type,
|
||||
ws.roomId as string
|
||||
);
|
||||
}
|
||||
}
|
||||
}catch (err) {
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
},
|
||||
close: (ws, code, message) => {
|
||||
const Client = (ws as ExAdminSocketInterface);
|
||||
const Client = ws as ExAdminSocketInterface;
|
||||
try {
|
||||
Client.disconnecting = true;
|
||||
socketManager.leaveAdminRoom(Client);
|
||||
|
@ -99,12 +106,12 @@ export class IoSocketController {
|
|||
console.error('An error occurred on admin "disconnect"');
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
ioConnection() {
|
||||
this.app.ws('/room', {
|
||||
this.app.ws("/room", {
|
||||
/* Options */
|
||||
//compression: uWS.SHARED_COMPRESSOR,
|
||||
idleTimeout: SOCKET_IDLE_TIMER,
|
||||
|
@ -114,7 +121,7 @@ export class IoSocketController {
|
|||
upgrade: (res, req, context) => {
|
||||
(async () => {
|
||||
/* Keep track of abortions */
|
||||
const upgradeAborted = {aborted: false};
|
||||
const upgradeAborted = { aborted: false };
|
||||
|
||||
res.onAborted(() => {
|
||||
/* We can simply signal that we were aborted */
|
||||
|
@ -123,15 +130,15 @@ export class IoSocketController {
|
|||
|
||||
const url = req.getUrl();
|
||||
const query = parse(req.getQuery());
|
||||
const websocketKey = req.getHeader('sec-websocket-key');
|
||||
const websocketProtocol = req.getHeader('sec-websocket-protocol');
|
||||
const websocketExtensions = req.getHeader('sec-websocket-extensions');
|
||||
const IPAddress = req.getHeader('x-forwarded-for');
|
||||
const websocketKey = req.getHeader("sec-websocket-key");
|
||||
const websocketProtocol = req.getHeader("sec-websocket-protocol");
|
||||
const websocketExtensions = req.getHeader("sec-websocket-extensions");
|
||||
const IPAddress = req.getHeader("x-forwarded-for");
|
||||
|
||||
const roomId = query.roomId;
|
||||
try {
|
||||
if (typeof roomId !== 'string') {
|
||||
throw new Error('Undefined room ID: ');
|
||||
if (typeof roomId !== "string") {
|
||||
throw new Error("Undefined room ID: ");
|
||||
}
|
||||
|
||||
const token = query.token;
|
||||
|
@ -143,62 +150,69 @@ export class IoSocketController {
|
|||
const right = Number(query.right);
|
||||
const name = query.name;
|
||||
|
||||
let companion: CompanionMessage|undefined = undefined;
|
||||
let companion: CompanionMessage | undefined = undefined;
|
||||
|
||||
if (typeof query.companion === 'string') {
|
||||
if (typeof query.companion === "string") {
|
||||
companion = new CompanionMessage();
|
||||
companion.setName(query.companion);
|
||||
}
|
||||
|
||||
if (typeof name !== 'string') {
|
||||
throw new Error('Expecting name');
|
||||
if (typeof name !== "string") {
|
||||
throw new Error("Expecting name");
|
||||
}
|
||||
if (name === '') {
|
||||
throw new Error('No empty name');
|
||||
if (name === "") {
|
||||
throw new Error("No empty name");
|
||||
}
|
||||
let characterLayers = query.characterLayers;
|
||||
if (characterLayers === null) {
|
||||
throw new Error('Expecting skin');
|
||||
throw new Error("Expecting skin");
|
||||
}
|
||||
if (typeof characterLayers === 'string') {
|
||||
characterLayers = [ characterLayers ];
|
||||
if (typeof characterLayers === "string") {
|
||||
characterLayers = [characterLayers];
|
||||
}
|
||||
|
||||
const userUuid = await jwtTokenManager.getUserUuidFromToken(token, IPAddress, roomId);
|
||||
|
||||
let memberTags: string[] = [];
|
||||
let memberVisitCardUrl: string|null = null;
|
||||
let memberVisitCardUrl: string | null = null;
|
||||
let memberMessages: unknown;
|
||||
let memberTextures: CharacterTexture[] = [];
|
||||
const room = await socketManager.getOrCreateRoom(roomId);
|
||||
if (ADMIN_API_URL) {
|
||||
try {
|
||||
let userData : FetchMemberDataByUuidResponse = {
|
||||
let userData: FetchMemberDataByUuidResponse = {
|
||||
uuid: v4(),
|
||||
tags: [],
|
||||
visitCardUrl: null,
|
||||
textures: [],
|
||||
messages: [],
|
||||
anonymous: true
|
||||
anonymous: true,
|
||||
};
|
||||
try {
|
||||
userData = await adminApi.fetchMemberDataByUuid(userUuid, roomId);
|
||||
}catch (err){
|
||||
} catch (err) {
|
||||
if (err?.response?.status == 404) {
|
||||
// If we get an HTTP 404, the token is invalid. Let's perform an anonymous login!
|
||||
console.warn('Cannot find user with uuid "'+userUuid+'". Performing an anonymous login instead.');
|
||||
} else if(err?.response?.status == 403) {
|
||||
console.warn(
|
||||
'Cannot find user with uuid "' +
|
||||
userUuid +
|
||||
'". Performing an anonymous login instead.'
|
||||
);
|
||||
} else if (err?.response?.status == 403) {
|
||||
// If we get an HTTP 403, the world is full. We need to broadcast a special error to the client.
|
||||
// we finish immediately the upgrade then we will close the socket as soon as it starts opening.
|
||||
return res.upgrade({
|
||||
rejected: true,
|
||||
message: err?.response?.data.message,
|
||||
status: err?.response?.status
|
||||
}, websocketKey,
|
||||
websocketProtocol,
|
||||
websocketExtensions,
|
||||
context);
|
||||
}else{
|
||||
return res.upgrade(
|
||||
{
|
||||
rejected: true,
|
||||
message: err?.response?.data.message,
|
||||
status: err?.response?.status,
|
||||
},
|
||||
websocketKey,
|
||||
websocketProtocol,
|
||||
websocketExtensions,
|
||||
context
|
||||
);
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
@ -206,21 +220,30 @@ export class IoSocketController {
|
|||
memberTags = userData.tags;
|
||||
memberVisitCardUrl = userData.visitCardUrl;
|
||||
memberTextures = userData.textures;
|
||||
if (!room.public && room.policyType === GameRoomPolicyTypes.USE_TAGS_POLICY && (userData.anonymous === true || !room.canAccess(memberTags))) {
|
||||
throw new Error('Insufficient privileges to access this room')
|
||||
if (
|
||||
!room.public &&
|
||||
room.policyType === GameRoomPolicyTypes.USE_TAGS_POLICY &&
|
||||
(userData.anonymous === true || !room.canAccess(memberTags))
|
||||
) {
|
||||
throw new Error("Insufficient privileges to access this room");
|
||||
}
|
||||
if (!room.public && room.policyType === GameRoomPolicyTypes.MEMBERS_ONLY_POLICY && userData.anonymous === true) {
|
||||
throw new Error('Use the login URL to connect')
|
||||
if (
|
||||
!room.public &&
|
||||
room.policyType === GameRoomPolicyTypes.MEMBERS_ONLY_POLICY &&
|
||||
userData.anonymous === true
|
||||
) {
|
||||
throw new Error("Use the login URL to connect");
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('access not granted for user '+userUuid+' and room '+roomId);
|
||||
console.log("access not granted for user " + userUuid + " and room " + roomId);
|
||||
console.error(e);
|
||||
throw new Error('User cannot access this world')
|
||||
throw new Error("User cannot access this world");
|
||||
}
|
||||
}
|
||||
|
||||
// Generate characterLayers objects from characterLayers string[]
|
||||
const characterLayerObjs: CharacterLayer[] = SocketManager.mergeCharacterLayersAndCustomTextures(characterLayers, memberTextures);
|
||||
const characterLayerObjs: CharacterLayer[] =
|
||||
SocketManager.mergeCharacterLayersAndCustomTextures(characterLayers, memberTextures);
|
||||
|
||||
if (upgradeAborted.aborted) {
|
||||
console.log("Ouch! Client disconnected before we could upgrade it!");
|
||||
|
@ -229,7 +252,8 @@ export class IoSocketController {
|
|||
}
|
||||
|
||||
/* This immediately calls open handler, you must not use res after this call */
|
||||
res.upgrade({
|
||||
res.upgrade(
|
||||
{
|
||||
// Data passed here is accessible on the "websocket" socket object.
|
||||
url,
|
||||
token,
|
||||
|
@ -246,22 +270,22 @@ export class IoSocketController {
|
|||
position: {
|
||||
x: x,
|
||||
y: y,
|
||||
direction: 'down',
|
||||
moving: false
|
||||
direction: "down",
|
||||
moving: false,
|
||||
} as PointInterface,
|
||||
viewport: {
|
||||
top,
|
||||
right,
|
||||
bottom,
|
||||
left
|
||||
}
|
||||
left,
|
||||
},
|
||||
},
|
||||
/* Spell these correctly */
|
||||
websocketKey,
|
||||
websocketProtocol,
|
||||
websocketExtensions,
|
||||
context);
|
||||
|
||||
context
|
||||
);
|
||||
} catch (e) {
|
||||
/*if (e instanceof Error) {
|
||||
console.log(e.message);
|
||||
|
@ -269,23 +293,26 @@ export class IoSocketController {
|
|||
} else {
|
||||
res.writeStatus("500 Internal Server Error").end('An error occurred');
|
||||
}*/
|
||||
return res.upgrade({
|
||||
rejected: true,
|
||||
message: e.message ? e.message : '500 Internal Server Error'
|
||||
}, websocketKey,
|
||||
websocketProtocol,
|
||||
websocketExtensions,
|
||||
context);
|
||||
return res.upgrade(
|
||||
{
|
||||
rejected: true,
|
||||
message: e.message ? e.message : "500 Internal Server Error",
|
||||
},
|
||||
websocketKey,
|
||||
websocketProtocol,
|
||||
websocketExtensions,
|
||||
context
|
||||
);
|
||||
}
|
||||
})();
|
||||
},
|
||||
/* Handlers */
|
||||
open: (ws) => {
|
||||
if(ws.rejected === true) {
|
||||
if (ws.rejected === true) {
|
||||
//FIX ME to use status code
|
||||
if(ws.message === 'World is full'){
|
||||
if (ws.message === "World is full") {
|
||||
socketManager.emitWorldFullMessage(ws);
|
||||
}else{
|
||||
} else {
|
||||
socketManager.emitConnexionErrorMessage(ws, ws.message as string);
|
||||
}
|
||||
ws.close();
|
||||
|
@ -299,7 +326,7 @@ export class IoSocketController {
|
|||
//get data information and show messages
|
||||
if (client.messages && Array.isArray(client.messages)) {
|
||||
client.messages.forEach((c: unknown) => {
|
||||
const messageToSend = c as { type: string, message: string };
|
||||
const messageToSend = c as { type: string; message: string };
|
||||
|
||||
const sendUserMessage = new SendUserMessage();
|
||||
sendUserMessage.setType(messageToSend.type);
|
||||
|
@ -323,33 +350,48 @@ export class IoSocketController {
|
|||
} else if (message.hasUsermovesmessage()) {
|
||||
socketManager.handleUserMovesMessage(client, message.getUsermovesmessage() as UserMovesMessage);
|
||||
} else if (message.hasSetplayerdetailsmessage()) {
|
||||
socketManager.handleSetPlayerDetails(client, message.getSetplayerdetailsmessage() as SetPlayerDetailsMessage);
|
||||
socketManager.handleSetPlayerDetails(
|
||||
client,
|
||||
message.getSetplayerdetailsmessage() as SetPlayerDetailsMessage
|
||||
);
|
||||
} else if (message.hasSilentmessage()) {
|
||||
socketManager.handleSilentMessage(client, message.getSilentmessage() as SilentMessage);
|
||||
} else if (message.hasItemeventmessage()) {
|
||||
socketManager.handleItemEvent(client, message.getItemeventmessage() as ItemEventMessage);
|
||||
} else if (message.hasWebrtcsignaltoservermessage()) {
|
||||
socketManager.emitVideo(client, message.getWebrtcsignaltoservermessage() as WebRtcSignalToServerMessage);
|
||||
socketManager.emitVideo(
|
||||
client,
|
||||
message.getWebrtcsignaltoservermessage() as WebRtcSignalToServerMessage
|
||||
);
|
||||
} else if (message.hasWebrtcscreensharingsignaltoservermessage()) {
|
||||
socketManager.emitScreenSharing(client, message.getWebrtcscreensharingsignaltoservermessage() as WebRtcSignalToServerMessage);
|
||||
socketManager.emitScreenSharing(
|
||||
client,
|
||||
message.getWebrtcscreensharingsignaltoservermessage() as WebRtcSignalToServerMessage
|
||||
);
|
||||
} else if (message.hasPlayglobalmessage()) {
|
||||
socketManager.emitPlayGlobalMessage(client, message.getPlayglobalmessage() as PlayGlobalMessage);
|
||||
} else if (message.hasReportplayermessage()){
|
||||
} else if (message.hasReportplayermessage()) {
|
||||
socketManager.handleReportMessage(client, message.getReportplayermessage() as ReportPlayerMessage);
|
||||
} else if (message.hasQueryjitsijwtmessage()){
|
||||
socketManager.handleQueryJitsiJwtMessage(client, message.getQueryjitsijwtmessage() as QueryJitsiJwtMessage);
|
||||
} else if (message.hasEmotepromptmessage()){
|
||||
socketManager.handleEmotePromptMessage(client, message.getEmotepromptmessage() as EmotePromptMessage);
|
||||
} else if (message.hasQueryjitsijwtmessage()) {
|
||||
socketManager.handleQueryJitsiJwtMessage(
|
||||
client,
|
||||
message.getQueryjitsijwtmessage() as QueryJitsiJwtMessage
|
||||
);
|
||||
} else if (message.hasEmotepromptmessage()) {
|
||||
socketManager.handleEmotePromptMessage(
|
||||
client,
|
||||
message.getEmotepromptmessage() as EmotePromptMessage
|
||||
);
|
||||
}
|
||||
|
||||
/* Ok is false if backpressure was built up, wait for drain */
|
||||
/* Ok is false if backpressure was built up, wait for drain */
|
||||
//let ok = ws.send(message, isBinary);
|
||||
},
|
||||
drain: (ws) => {
|
||||
console.log('WebSocket backpressure: ' + ws.getBufferedAmount());
|
||||
console.log("WebSocket backpressure: " + ws.getBufferedAmount());
|
||||
},
|
||||
close: (ws, code, message) => {
|
||||
const Client = (ws as ExSocketInterface);
|
||||
const Client = ws as ExSocketInterface;
|
||||
try {
|
||||
Client.disconnecting = true;
|
||||
//leave room
|
||||
|
@ -358,13 +400,13 @@ export class IoSocketController {
|
|||
console.error('An error occurred on "disconnect"');
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
private initClient(ws: any): ExSocketInterface {
|
||||
const client : ExSocketInterface = ws;
|
||||
const client: ExSocketInterface = ws;
|
||||
client.userId = this.nextUserId;
|
||||
this.nextUserId++;
|
||||
client.userUuid = ws.userUuid;
|
||||
|
@ -374,7 +416,7 @@ export class IoSocketController {
|
|||
client.batchTimeout = null;
|
||||
client.emitInBatch = (payload: SubMessage): void => {
|
||||
emitInBatch(client, payload);
|
||||
}
|
||||
};
|
||||
client.disconnecting = false;
|
||||
|
||||
client.messages = ws.messages;
|
||||
|
|
|
@ -1,18 +1,15 @@
|
|||
import {HttpRequest, HttpResponse, TemplatedApp} from "uWebSockets.js";
|
||||
import {BaseController} from "./BaseController";
|
||||
import {parse} from "query-string";
|
||||
import {adminApi} from "../Services/AdminApi";
|
||||
import { HttpRequest, HttpResponse, TemplatedApp } from "uWebSockets.js";
|
||||
import { BaseController } from "./BaseController";
|
||||
import { parse } from "query-string";
|
||||
import { adminApi } from "../Services/AdminApi";
|
||||
|
||||
|
||||
export class MapController extends BaseController{
|
||||
|
||||
constructor(private App : TemplatedApp) {
|
||||
export class MapController extends BaseController {
|
||||
constructor(private App: TemplatedApp) {
|
||||
super();
|
||||
this.App = App;
|
||||
this.getMapUrl();
|
||||
}
|
||||
|
||||
|
||||
// Returns a map mapping map name to file name of the map
|
||||
getMapUrl() {
|
||||
this.App.options("/map", (res: HttpResponse, req: HttpRequest) => {
|
||||
|
@ -22,29 +19,28 @@ export class MapController extends BaseController{
|
|||
});
|
||||
|
||||
this.App.get("/map", (res: HttpResponse, req: HttpRequest) => {
|
||||
|
||||
res.onAborted(() => {
|
||||
console.warn('/map request was aborted');
|
||||
})
|
||||
console.warn("/map request was aborted");
|
||||
});
|
||||
|
||||
const query = parse(req.getQuery());
|
||||
|
||||
if (typeof query.organizationSlug !== 'string') {
|
||||
console.error('Expected organizationSlug parameter');
|
||||
if (typeof query.organizationSlug !== "string") {
|
||||
console.error("Expected organizationSlug parameter");
|
||||
res.writeStatus("400 Bad request");
|
||||
this.addCorsHeaders(res);
|
||||
res.end("Expected organizationSlug parameter");
|
||||
return;
|
||||
}
|
||||
if (typeof query.worldSlug !== 'string') {
|
||||
console.error('Expected worldSlug parameter');
|
||||
if (typeof query.worldSlug !== "string") {
|
||||
console.error("Expected worldSlug parameter");
|
||||
res.writeStatus("400 Bad request");
|
||||
this.addCorsHeaders(res);
|
||||
res.end("Expected worldSlug parameter");
|
||||
return;
|
||||
}
|
||||
if (typeof query.roomSlug !== 'string' && query.roomSlug !== undefined) {
|
||||
console.error('Expected only one roomSlug parameter');
|
||||
if (typeof query.roomSlug !== "string" && query.roomSlug !== undefined) {
|
||||
console.error("Expected only one roomSlug parameter");
|
||||
res.writeStatus("400 Bad request");
|
||||
this.addCorsHeaders(res);
|
||||
res.end("Expected only one roomSlug parameter");
|
||||
|
@ -53,7 +49,11 @@ export class MapController extends BaseController{
|
|||
|
||||
(async () => {
|
||||
try {
|
||||
const mapDetails = await adminApi.fetchMapDetails(query.organizationSlug as string, query.worldSlug as string, query.roomSlug as string|undefined);
|
||||
const mapDetails = await adminApi.fetchMapDetails(
|
||||
query.organizationSlug as string,
|
||||
query.worldSlug as string,
|
||||
query.roomSlug as string | undefined
|
||||
);
|
||||
|
||||
res.writeStatus("200 OK");
|
||||
this.addCorsHeaders(res);
|
||||
|
@ -62,7 +62,6 @@ export class MapController extends BaseController{
|
|||
this.errorToResponse(e, res);
|
||||
}
|
||||
})();
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import {App} from "../Server/sifrr.server";
|
||||
import {HttpRequest, HttpResponse} from "uWebSockets.js";
|
||||
const register = require('prom-client').register;
|
||||
const collectDefaultMetrics = require('prom-client').collectDefaultMetrics;
|
||||
import { App } from "../Server/sifrr.server";
|
||||
import { HttpRequest, HttpResponse } from "uWebSockets.js";
|
||||
const register = require("prom-client").register;
|
||||
const collectDefaultMetrics = require("prom-client").collectDefaultMetrics;
|
||||
|
||||
export class PrometheusController {
|
||||
constructor(private App: App) {
|
||||
|
@ -14,7 +14,7 @@ export class PrometheusController {
|
|||
}
|
||||
|
||||
private metrics(res: HttpResponse, req: HttpRequest): void {
|
||||
res.writeHeader('Content-Type', register.contentType);
|
||||
res.writeHeader("Content-Type", register.contentType);
|
||||
res.end(register.metrics());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue