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

Can join a call

This commit is contained in:
Pierre HUBERT 2020-04-10 15:59:42 +02:00
parent 76105957a0
commit 93e5905095
5 changed files with 102 additions and 8 deletions

View File

@ -1,4 +1,9 @@
import { RequestHandler } from "../entities/RequestHandler"; import { RequestHandler } from "../entities/RequestHandler";
import { UserWebSocketRequestsHandler } from "../entities/WebSocketRequestHandler";
import { ActiveClient, UserWebSocketController } from "./UserWebSocketController";
import { EventsHelper } from "../helpers/EventsHelper";
import * as ws from 'ws'
import { WsMessage } from "../entities/WsMessage";
/** /**
* Legacy calls controller * Legacy calls controller
@ -9,16 +14,85 @@ import { RequestHandler } from "../entities/RequestHandler";
export class CallsController { export class CallsController {
/** /**
* Get calls config * Legacy calls config
*
* This version of the API DOES NOT SUPPORT calls system for
* now. It is planned to reimagine it completely before attempting
* an implementation...
*/ */
public static GetConfig(h: RequestHandler) { public static GetLegacyConfig(h: RequestHandler) {
h.send({ h.send({
enabled: false enabled: false
}); });
} }
/**
* Join a call
*
* @param h Request handler
*/
public static async JoinCall(h: UserWebSocketRequestsHandler) {
const convID = await h.postConversationId("convID");
// If the user was active in any other calls, remove him
for(const c of UserWebSocketController.active_clients.filter((f) => f.userID == convID && f.activeCalls.has(convID)))
await this.MakeUserLeaveCall(convID, c)
h.wsClient.activeCalls.add(convID);
// Notify all other users
await UserWebSocketController.SendToSpecifcClients(
(c) => c.activeCalls.has(convID) && c.userID != h.getUserId(),
() => WsMessage.NoIDMessage("user_joined_call", h.getUserId())
)
h.success();
}
/**
* Leave a call
*
* @param h Request handler
*/
public static async LeaveCall(h: UserWebSocketRequestsHandler) {
// Warning ! For some technical reasons, we do not check if the user
// really belongs to the conversation, so be careful when manipulating
// conversation ID here
const convID = h.postInt("convID");
// Check if user is already in the conversation
if(!h.wsClient.activeCalls.has(convID)) {
h.success();
return;
}
// Make the user leave the call
await this.MakeUserLeaveCall(convID, h.wsClient);
h.success();
}
/**
* Make the client leave the call
*
* @param c Client information
*/
public static async MakeUserLeaveCall(convID: number, c: ActiveClient) {
c.activeCalls.delete(convID)
// Notify user (if possible)
if(c.ws.readyState == ws.OPEN)
UserWebSocketController.SendToClient(c, WsMessage.NoIDMessage("call_closed",convID));
// Notify all other users
await UserWebSocketController.SendToSpecifcClients(
(c) => c.activeCalls.has(convID),
() => WsMessage.NoIDMessage("user_left_call", c.userID)
)
}
} }
// Listen for websocket closed
EventsHelper.Listen("user_ws_closed", async w => {
for(const convID of w.client.activeCalls)
await CallsController.MakeUserLeaveCall(convID, w.client)
});
// TODO : close all call when RTC WS is closed

View File

@ -306,6 +306,6 @@ export const Routes : Route[] = [
{path: "/webApp/getMemberships", cb: (h) => WebAppControllers.GetMemberships(h)}, {path: "/webApp/getMemberships", cb: (h) => WebAppControllers.GetMemberships(h)},
// Calls controller // Calls controller
{path: "/calls/config", cb: (h) => CallsController.GetConfig(h)}, {path: "/calls/config", cb: (h) => CallsController.GetLegacyConfig(h)},
] ]

View File

@ -30,6 +30,7 @@ export interface ActiveClient {
registeredConversations: Set<number>, registeredConversations: Set<number>,
registeredPosts: Set<number>, registeredPosts: Set<number>,
activeCalls: Set<number>,
} }
// Tokens are valid only 10 seconds after they are generated // Tokens are valid only 10 seconds after they are generated
@ -122,6 +123,7 @@ export class UserWebSocketController {
incognito: entry.incognito, incognito: entry.incognito,
registeredConversations: new Set(), registeredConversations: new Set(),
registeredPosts: new Set(), registeredPosts: new Set(),
activeCalls: new Set(),
} }
this.active_clients.push(client); this.active_clients.push(client);
@ -129,6 +131,12 @@ export class UserWebSocketController {
// Remove the client for the list as soon as the // Remove the client for the list as soon as the
// socket is closed // socket is closed
ws.addEventListener("close", () => { ws.addEventListener("close", () => {
// Propagage event
EventsHelper.Emit("user_ws_closed", {
client: client
});
this.active_clients.splice(this.active_clients.indexOf(client), 1); this.active_clients.splice(this.active_clients.indexOf(client), 1);
}) })

View File

@ -10,6 +10,7 @@
import { UserWebSocketRequestsHandler } from "../entities/WebSocketRequestHandler"; import { UserWebSocketRequestsHandler } from "../entities/WebSocketRequestHandler";
import { LikesController } from "./LikesController"; import { LikesController } from "./LikesController";
import { UserWebSocketActions } from "./UserWebSocketActions"; import { UserWebSocketActions } from "./UserWebSocketActions";
import { CallsController } from "./CallsController";
export interface UserWebSocketRoute { export interface UserWebSocketRoute {
title: string, title: string,
@ -31,4 +32,8 @@ export const UserWebSocketRoutes: UserWebSocketRoute[] = [
{title: "likes/update", handler: (h) => LikesController.Update(h)}, {title: "likes/update", handler: (h) => LikesController.Update(h)},
// Calls controller
{title: "calls/join", handler: (h) => CallsController.JoinCall(h)},
{title: "calls/leave", handler: (h) => CallsController.LeaveCall(h)},
] ]

View File

@ -1,6 +1,7 @@
import { APIClient } from "../entities/APIClient"; import { APIClient } from "../entities/APIClient";
import { ConversationMessage } from "../entities/ConversationMessage"; import { ConversationMessage } from "../entities/ConversationMessage";
import { Comment } from "../entities/Comment"; import { Comment } from "../entities/Comment";
import { ActiveClient } from "../controllers/UserWebSocketController";
/** /**
* Events manager * Events manager
@ -14,6 +15,11 @@ export interface DestroyedLoginTokensEvent {
client: APIClient client: APIClient
} }
// When a user WebSocket connection is closed
export interface UserWebSocketClosedEvent {
client: ActiveClient
}
// When some user might have an updated number of notifications // When some user might have an updated number of notifications
export interface UpdatedNotificationsNumberEvent { export interface UpdatedNotificationsNumberEvent {
usersID: number[] usersID: number[]
@ -59,6 +65,7 @@ export interface CommentDeletedEvent {
*/ */
export interface EventsMap { export interface EventsMap {
"destroyed_login_tokens": DestroyedLoginTokensEvent, "destroyed_login_tokens": DestroyedLoginTokensEvent,
"user_ws_closed": UserWebSocketClosedEvent,
"updated_number_notifications": UpdatedNotificationsNumberEvent, "updated_number_notifications": UpdatedNotificationsNumberEvent,
"updated_number_unread_conversations": UpdateNumberUnreadConversationsEvent, "updated_number_unread_conversations": UpdateNumberUnreadConversationsEvent,
"sent_conversation_message": SentNewConversationMessageEvent, "sent_conversation_message": SentNewConversationMessageEvent,