adds generic solution for custom events handling instead of any data type

This commit is contained in:
StarAppeal
2025-09-19 22:29:17 +02:00
parent f866d2b5ab
commit 85afec219c
13 changed files with 36 additions and 20 deletions
+2 -1
View File
@@ -9,7 +9,7 @@ import {RestAuth} from "./rest/auth";
import {config} from "./config";
import cookieParser from 'cookie-parser';
import {authLimiter, spotifyLimiter} from "./rest/middleware/rateLimit";
import {extractTokenFromCookie} from "./rest/middleware/extractTokenFromCookie ";
import {extractTokenFromCookie} from "./rest/middleware/extractTokenFromCookie";
import {UserService} from "./db/services/db/UserService";
import {randomUUID} from "crypto";
import {JwtAuthenticator} from "./utils/jwtAuthenticator";
@@ -22,6 +22,7 @@ export async function startServer(jwtSecret: string) {
app.set("trust proxy", 1);
app.use(cookieParser());
// test
app.use(cors({
origin: config.cors.origin,
credentials: config.cors.credentials,
@@ -0,0 +1,3 @@
export interface NoData{
}
@@ -1,8 +1,8 @@
import {ExtendedWebSocket} from "../../../interfaces/extendedWebsocket";
export abstract class CustomWebsocketEvent {
export abstract class CustomWebsocketEvent<T = any> {
abstract event: string;
abstract handler: (data: any) => void;
abstract handler: (data: T) => void;
protected ws: ExtendedWebSocket;
public constructor(ws: ExtendedWebSocket) {
@@ -2,7 +2,7 @@ import {ExtendedWebSocket} from "../../../interfaces/extendedWebsocket";
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {UserService} from "../../../db/services/db/UserService";
export abstract class CustomWebsocketEventUserService extends CustomWebsocketEvent {
export abstract class CustomWebsocketEventUserService<T = any> extends CustomWebsocketEvent<T> {
protected readonly userService: UserService;
public constructor(ws: ExtendedWebSocket, userService: UserService) {
@@ -2,16 +2,20 @@ import {WebsocketEventType} from "./websocketEventType";
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {ExtendedWebSocket} from "../../../interfaces/extendedWebsocket";
export class ErrorEvent extends CustomWebsocketEvent {
interface ErrorData {
message: string;
traceback: string
}
export class ErrorEvent extends CustomWebsocketEvent<ErrorData> {
event: string = WebsocketEventType.ERROR;
constructor(ws: ExtendedWebSocket) {
super(ws);
}
handler = async (data: any) => {
const {message, traceback} = data;
console.warn("Error message received", message);
console.warn("Traceback", traceback);
handler = async (data: ErrorData) => {
console.warn("Error message received", data.message);
console.warn("Traceback", data.traceback);
}
}
@@ -1,7 +1,8 @@
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {WebsocketEventType} from "./websocketEventType";
import {NoData} from "./NoData";
export class GetSettingsEvent extends CustomWebsocketEvent {
export class GetSettingsEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.GET_SETTINGS;
@@ -3,10 +3,11 @@ import {WebsocketEventType} from "./websocketEventType";
import {SpotifyTokenService} from "../../../db/services/spotifyTokenService";
import {getCurrentlyPlaying} from "../../../db/services/spotifyApiService";
import {CustomWebsocketEventUserService} from "./customWebsocketEventUserService";
import {NoData} from "./NoData";
export const SpotifyAsyncUpdateEvent = "SPOTIFY_UPDATE";
export class GetSpotifyUpdatesEvent extends CustomWebsocketEvent {
export class GetSpotifyUpdatesEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.GET_SPOTIFY_UPDATES;
@@ -26,7 +27,7 @@ export class GetSpotifyUpdatesEvent extends CustomWebsocketEvent {
}
}
export class GetSingleSpotifyUpdateEvent extends CustomWebsocketEventUserService {
export class GetSingleSpotifyUpdateEvent extends CustomWebsocketEventUserService<NoData> {
event = WebsocketEventType.GET_SINGLE_SPOTIFY_UPDATE;
@@ -1,7 +1,8 @@
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {WebsocketEventType} from "./websocketEventType";
import {NoData} from "./NoData";
export class GetStateEvent extends CustomWebsocketEvent {
export class GetStateEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.GET_STATE;
handler = async () => {
@@ -1,10 +1,11 @@
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {WebsocketEventType} from "./websocketEventType";
import {getCurrentWeather} from "../../../db/services/owmApiService";
import {NoData} from "./NoData";
export const WeatherAsyncUpdateEvent = "WEATHER_UPDATE";
export class GetWeatherUpdatesEvent extends CustomWebsocketEvent {
export class GetWeatherUpdatesEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.GET_WEATHER_UPDATES;
@@ -24,7 +25,7 @@ export class GetWeatherUpdatesEvent extends CustomWebsocketEvent {
}
}
export class GetSingleWeatherUpdateEvent extends CustomWebsocketEvent {
export class GetSingleWeatherUpdateEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.GET_SINGLE_WEATHER_UPDATE;
@@ -1,8 +1,9 @@
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {WebsocketEventType} from "./websocketEventType";
import {SpotifyAsyncUpdateEvent} from "./getSpotifyUpdatesEvent";
import {NoData} from "./NoData";
export class StopSpotifyUpdatesEvent extends CustomWebsocketEvent {
export class StopSpotifyUpdatesEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.STOP_SPOTIFY_UPDATES;
@@ -1,8 +1,9 @@
import {WebsocketEventType} from "./websocketEventType";
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {UserAsyncUpdateEvent} from "./updateUserEvent";
import {NoData} from "./NoData";
export class StopUpdateUserEvent extends CustomWebsocketEvent {
export class StopUpdateUserEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.STOP_UPDATE_USER;
@@ -1,8 +1,9 @@
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {WebsocketEventType} from "./websocketEventType";
import {WeatherAsyncUpdateEvent} from "./getWeatherUpdatesEvent";
import {NoData} from "./NoData";
export class StopWeatherUpdatesEvent extends CustomWebsocketEvent {
export class StopWeatherUpdatesEvent extends CustomWebsocketEvent<NoData> {
event = WebsocketEventType.STOP_WEATHER_UPDATES;
@@ -2,10 +2,11 @@ import {WebsocketEventType} from "./websocketEventType";
import {CustomWebsocketEvent} from "./customWebsocketEvent";
import {IUser} from "../../../db/models/user";
import {CustomWebsocketEventUserService} from "./customWebsocketEventUserService";
import {NoData} from "./NoData";
export const UserAsyncUpdateEvent = "USER_UPDATE";
export class UpdateUserEvent extends CustomWebsocketEventUserService {
export class UpdateUserEvent extends CustomWebsocketEventUserService<NoData> {
event = WebsocketEventType.UPDATE_USER;
handler = async () => {
@@ -23,7 +24,7 @@ export class UpdateUserEvent extends CustomWebsocketEventUserService {
}
}
export class UpdateUserSingleEvent extends CustomWebsocketEvent {
export class UpdateUserSingleEvent extends CustomWebsocketEvent<IUser> {
event = WebsocketEventType.UPDATE_USER_SINGLE;
handler = async (data: IUser) => {