Refactoring Error Screen
This commit is contained in:
@@ -318,6 +318,8 @@ export class AuthenticateController extends BaseHttpController {
|
||||
(async () => {
|
||||
const param = await req.json();
|
||||
|
||||
adminApi.setLocale(req.header('accept-language'));
|
||||
|
||||
//todo: what to do if the organizationMemberToken is already used?
|
||||
const organizationMemberToken: string | null = param.organizationMemberToken;
|
||||
const playUri: string | null = param.playUri;
|
||||
|
||||
@@ -31,12 +31,14 @@ export class BaseHttpController {
|
||||
|
||||
if (axios.isAxiosError(e) && e.response) {
|
||||
res.status(e.response.status);
|
||||
res.send(
|
||||
"An error occurred: " +
|
||||
e.response.status +
|
||||
" " +
|
||||
(e.response.data && e.response.data.message ? e.response.data.message : e.response.statusText)
|
||||
);
|
||||
if(!e.response.data?.code) {
|
||||
res.send(
|
||||
"An error occurred: " +
|
||||
e.response.status +
|
||||
" " +
|
||||
(e.response.data && e.response.data.message ? e.response.data.message : e.response.statusText)
|
||||
);
|
||||
} else res.json(e.response.data);
|
||||
return;
|
||||
} else {
|
||||
res.status(500);
|
||||
|
||||
@@ -69,7 +69,7 @@ interface UpgradeData {
|
||||
|
||||
interface UpgradeFailedData {
|
||||
rejected: true;
|
||||
reason: "tokenInvalid" | "textureInvalid" | null;
|
||||
reason: "tokenInvalid" | "textureInvalid" | "error" | null;
|
||||
message: string;
|
||||
roomId: string;
|
||||
}
|
||||
@@ -236,6 +236,8 @@ export class IoSocketController {
|
||||
const websocketExtensions = req.getHeader("sec-websocket-extensions");
|
||||
const IPAddress = req.getHeader("x-forwarded-for");
|
||||
|
||||
adminApi.setLocale(req.getHeader('accept-language'));
|
||||
|
||||
const roomId = query.roomId;
|
||||
try {
|
||||
if (typeof roomId !== "string") {
|
||||
@@ -311,7 +313,7 @@ export class IoSocketController {
|
||||
);
|
||||
} catch (err) {
|
||||
if (Axios.isAxiosError(err)) {
|
||||
if (err?.response?.status == 404) {
|
||||
if (err?.response?.status == 404 || !err?.response?.data.code) {
|
||||
// If we get an HTTP 404, the token is invalid. Let's perform an anonymous login!
|
||||
|
||||
console.warn(
|
||||
@@ -319,16 +321,18 @@ export class IoSocketController {
|
||||
(userIdentifier || "anonymous") +
|
||||
'". 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.
|
||||
} else if (err?.response?.data.code) {
|
||||
//OLD // If we get an HTTP 403, the world is full. We need to broadcast a special error to the client.
|
||||
//OLD // 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,
|
||||
reason: "error",
|
||||
message: err?.response?.data.code,
|
||||
status: err?.response?.status,
|
||||
error: err?.response?.data,
|
||||
roomId,
|
||||
},
|
||||
} as UpgradeFailedData,
|
||||
websocketKey,
|
||||
websocketProtocol,
|
||||
websocketExtensions,
|
||||
@@ -481,8 +485,8 @@ export class IoSocketController {
|
||||
socketManager.emitTokenExpiredMessage(ws);
|
||||
} else if (ws.reason === "textureInvalid") {
|
||||
socketManager.emitInvalidTextureMessage(ws);
|
||||
} else if (ws.message === "World is full") {
|
||||
socketManager.emitWorldFullMessage(ws);
|
||||
} else if (ws.reason === "error") {
|
||||
socketManager.emitErrorV2Message(ws, ws.error.type, ws.error.code, ws.error.title, ws.error.subtitle, ws.error.details, ws.error.timeToRetry, ws.error.canRetryManual, ws.error.urlToRedirect, ws.error.buttonTitle);
|
||||
} else {
|
||||
socketManager.emitConnexionErrorMessage(ws, ws.message);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,11 @@ export const isFetchMemberDataByUuidResponse = z.object({
|
||||
export type FetchMemberDataByUuidResponse = z.infer<typeof isFetchMemberDataByUuidResponse>;
|
||||
|
||||
class AdminApi {
|
||||
private locale: string = 'en';
|
||||
setLocale(locale: string){
|
||||
//console.info('PUSHER LOCALE SET TO :', locale);
|
||||
this.locale = locale;
|
||||
}
|
||||
/**
|
||||
* @var playUri: is url of the room
|
||||
* @var userId: can to be undefined or email or uuid
|
||||
@@ -42,7 +47,7 @@ class AdminApi {
|
||||
};
|
||||
|
||||
const res = await Axios.get<unknown, AxiosResponse<unknown>>(ADMIN_API_URL + "/api/map", {
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}` },
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}`, 'Accept-Language': this.locale },
|
||||
params,
|
||||
});
|
||||
|
||||
@@ -80,7 +85,7 @@ class AdminApi {
|
||||
ipAddress,
|
||||
characterLayers,
|
||||
},
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}` },
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}`, 'Accept-Language': this.locale },
|
||||
paramsSerializer: (p) => {
|
||||
return qs.stringify(p, { arrayFormat: "brackets" });
|
||||
},
|
||||
@@ -106,7 +111,7 @@ class AdminApi {
|
||||
//todo: this call can fail if the corresponding world is not activated or if the token is invalid. Handle that case.
|
||||
const res = await Axios.get(ADMIN_API_URL + "/api/login-url/" + organizationMemberToken, {
|
||||
params: { playUri },
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}` },
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}`, 'Accept-Language': this.locale },
|
||||
});
|
||||
|
||||
const adminApiData = isAdminApiData.safeParse(res.data);
|
||||
@@ -138,7 +143,7 @@ class AdminApi {
|
||||
reportWorldSlug,
|
||||
},
|
||||
{
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}` },
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}`, 'Accept-Language': this.locale },
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -157,7 +162,7 @@ class AdminApi {
|
||||
encodeURIComponent(userUuid) +
|
||||
"&roomUrl=" +
|
||||
encodeURIComponent(roomUrl),
|
||||
{ headers: { Authorization: `${ADMIN_API_TOKEN}` } }
|
||||
{ headers: { Authorization: `${ADMIN_API_TOKEN}`, 'Accept-Language': this.locale } }
|
||||
).then((data) => {
|
||||
return data.data;
|
||||
});
|
||||
@@ -169,7 +174,7 @@ class AdminApi {
|
||||
}
|
||||
|
||||
return Axios.get(ADMIN_API_URL + "/api/room/sameWorld" + "?roomUrl=" + encodeURIComponent(roomUrl), {
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}` },
|
||||
headers: { Authorization: `${ADMIN_API_TOKEN}`, 'Accept-Language': this.locale },
|
||||
}).then((data) => {
|
||||
return data.data;
|
||||
});
|
||||
|
||||
@@ -39,7 +39,7 @@ import {
|
||||
WorldFullMessage,
|
||||
PlayerDetailsUpdatedMessage,
|
||||
LockGroupPromptMessage,
|
||||
InvalidTextureMessage,
|
||||
InvalidTextureMessage, ErrorV2Message,
|
||||
} from "../Messages/generated/messages_pb";
|
||||
import { ProtobufUtils } from "../Model/Websocket/ProtobufUtils";
|
||||
import { ADMIN_API_URL, JITSI_ISS, JITSI_URL, SECRET_JITSI_KEY } from "../Enum/EnvironmentVariable";
|
||||
@@ -643,6 +643,26 @@ export class SocketManager implements ZoneEventListener {
|
||||
client.send(serverToClientMessage.serializeBinary().buffer, true);
|
||||
}
|
||||
|
||||
public emitErrorV2Message(client: compressors.WebSocket, type: string, code: string, title: string, subtitle: string, details: string, timeToRetry: number, canRetryManual: boolean, urlToRedirect: string, buttonTitle: string) {
|
||||
const errorMessage = new ErrorV2Message();
|
||||
errorMessage.setType(type);
|
||||
errorMessage.setCode(code);
|
||||
errorMessage.setTitle(title);
|
||||
errorMessage.setSubtitle(subtitle);
|
||||
errorMessage.setDetails(details);
|
||||
errorMessage.setTimetoretry(timeToRetry);
|
||||
errorMessage.setCanretrymanual(canRetryManual);
|
||||
errorMessage.setUrltoredirect(urlToRedirect);
|
||||
errorMessage.setButtontitle(buttonTitle);
|
||||
|
||||
const serverToClientMessage = new ServerToClientMessage();
|
||||
serverToClientMessage.setErrorv2message(errorMessage);
|
||||
|
||||
//if (!client.disconnecting) {
|
||||
client.send(serverToClientMessage.serializeBinary().buffer, true);
|
||||
//}
|
||||
}
|
||||
|
||||
private refreshRoomData(roomId: string, versionNumber: number): void {
|
||||
const room = this.rooms.get(roomId);
|
||||
//this function is run for every users connected to the room, so we need to make sure the room wasn't already refreshed.
|
||||
|
||||
Reference in New Issue
Block a user