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

Notify through websocket new number of notifications

This commit is contained in:
Pierre HUBERT 2020-03-30 15:37:36 +02:00
parent d18914066b
commit 9816caf4db
3 changed files with 73 additions and 2 deletions

View File

@ -9,6 +9,7 @@ import { RequestHandler } from '../entities/RequestHandler';
import { time } from '../utils/DateUtils'; import { time } from '../utils/DateUtils';
import { randomStr } from '../utils/CryptUtils'; import { randomStr } from '../utils/CryptUtils';
import { EventsHelper } from '../helpers/EventsHelper'; import { EventsHelper } from '../helpers/EventsHelper';
import { NotificationsHelper } from '../helpers/NotificationsHelper';
interface PendingRequests { interface PendingRequests {
time: number, time: number,
@ -18,11 +19,18 @@ interface PendingRequests {
} }
interface ActiveClient { interface ActiveClient {
socketID: string,
clientID: number, clientID: number,
userID: number, userID: number,
ws: ws ws: ws
} }
interface WsMessage {
id: string,
title: string,
data: any
}
// Tokens are valid only 10 seconds after they are generated // Tokens are valid only 10 seconds after they are generated
const TOKENS_DURATION = 10 const TOKENS_DURATION = 10
const TOKEN_LENGTH = 20 const TOKEN_LENGTH = 20
@ -105,6 +113,7 @@ export class UserWebSocketController {
// Add the client to the list of active clients // Add the client to the list of active clients
const client: ActiveClient = { const client: ActiveClient = {
socketID: randomStr(30),
clientID: entry.clientID, clientID: entry.clientID,
userID: entry.userID, userID: entry.userID,
ws: ws ws: ws
@ -150,7 +159,59 @@ export class UserWebSocketController {
for(const entry of this.active_clients.filter((f) => f.clientID == clientID && f.userID == userID)) for(const entry of this.active_clients.filter((f) => f.clientID == clientID && f.userID == userID))
entry.ws.close(); entry.ws.close();
} }
/**
* Send a message to a socket
*
* @param userID Target user ID
* @param socketID Target socket ID (if null the message is sent to
* all the active sockets of the user)
* @param message The message to send
*/
public static Send(userID: number, socketID: string, message: WsMessage) {
for(const entry of this.active_clients.filter(
(e) => e.userID == userID
&& (socketID.length == 0 || e.socketID == socketID)))
{
if(entry.ws.readyState == ws.OPEN)
entry.ws.send(JSON.stringify(message));
}
}
/**
* Check out whether a user has an active websocket or not
*
* @param userID Target user ID
*/
public static IsConnected(userID: number) : boolean {
return this.active_clients.find((e) => e.userID == userID) != undefined;
}
/**
* Send updated notifications number to some users
*
* @param usersID Target users ID
*/
public static async SendNewNotificationsNumber(usersID: number[]) {
// Process each user
for(const userID of usersID) {
if(!this.IsConnected(userID))
continue;
// Notify user
this.Send(userID, "", {
title: "number_notifs",
id: "",
data: await NotificationsHelper.CountUnread(userID)
});
}
}
} }
// When user sign out // When user sign out
EventsHelper.Listen("destroyed_login_tokens", (e) => UserWebSocketController.CloseClientSockets(e.client.id, e.userID)); EventsHelper.Listen("destroyed_login_tokens", (e) => UserWebSocketController.CloseClientSockets(e.client.id, e.userID));
// When we get a new number of notifications
EventsHelper.Listen("updated_number_notifications", async (e) => await UserWebSocketController.SendNewNotificationsNumber(e.usersID));

View File

@ -13,11 +13,17 @@ export interface DestroyedLoginTokensEvent {
client: APIClient client: APIClient
} }
// When some user might have an updated number of notifications
export interface UpdatedNotificationsNumberEvent {
usersID: number[]
}
/** /**
* Global map of all possible events * Global map of all possible events
*/ */
export interface EventsMap { export interface EventsMap {
"destroyed_login_tokens": DestroyedLoginTokensEvent "destroyed_login_tokens": DestroyedLoginTokensEvent,
"updated_number_notifications": UpdatedNotificationsNumberEvent,
} }
export class EventsHelper { export class EventsHelper {

View File

@ -6,6 +6,7 @@ import { PostPageKind, PostVisibilityLevel } from "../entities/Post";
import { FriendsHelper } from "./FriendsHelper"; import { FriendsHelper } from "./FriendsHelper";
import { GroupsHelper } from "./GroupsHelper"; import { GroupsHelper } from "./GroupsHelper";
import { GroupMembershipLevels } from "../entities/GroupMember"; import { GroupMembershipLevels } from "../entities/GroupMember";
import { EventsHelper } from "./EventsHelper";
/** /**
* Notifications helper * Notifications helper
@ -308,6 +309,9 @@ export class NotificationsHelper {
NOTIFICATIONS_TABLE, NOTIFICATIONS_TABLE,
this.NotifToDB(n, true) this.NotifToDB(n, true)
) )
// Trigger notify system
await EventsHelper.Emit("updated_number_notifications", {usersID: [n.destUserID]});
} }
/** /**