fix: logout disconnection sockets

This commit is contained in:
yassinedorbozgithub 2025-01-29 14:50:05 +01:00
parent 1288eb87cf
commit 79cb85f74f
3 changed files with 29 additions and 5 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2024 Hexastack. All rights reserved. * Copyright © 2025 Hexastack. All rights reserved.
* *
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
@ -11,6 +11,8 @@ import {
Body, Body,
Controller, Controller,
Get, Get,
Headers,
Inject,
InternalServerErrorException, InternalServerErrorException,
Param, Param,
Post, Post,
@ -21,7 +23,9 @@ import {
UseGuards, UseGuards,
UseInterceptors, UseInterceptors,
} from '@nestjs/common'; } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { CsrfCheck, CsrfGen, CsrfGenAuth } from '@tekuconcept/nestjs-csrf'; import { CsrfCheck, CsrfGen, CsrfGenAuth } from '@tekuconcept/nestjs-csrf';
import cookie from 'cookie';
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { Session as ExpressSession } from 'express-session'; import { Session as ExpressSession } from 'express-session';
@ -38,6 +42,9 @@ import { UserService } from '../services/user.service';
import { ValidateAccountService } from '../services/validate-account.service'; import { ValidateAccountService } from '../services/validate-account.service';
export class BaseAuthController { export class BaseAuthController {
@Inject(EventEmitter2)
private readonly eventEmitter: EventEmitter2;
constructor(protected readonly logger: LoggerService) {} constructor(protected readonly logger: LoggerService) {}
/** /**
@ -66,7 +73,13 @@ export class BaseAuthController {
logout( logout(
@Session() session: ExpressSession, @Session() session: ExpressSession,
@Res({ passthrough: true }) res: Response, @Res({ passthrough: true }) res: Response,
@Headers() headers: Record<string, string>,
) { ) {
const parsedCookie = cookie.parse(headers['cookie']);
const sessionCookie = encodeURIComponent(
String(parsedCookie[config.session.name] || ''),
);
this.eventEmitter.emit('hook:user:logout', sessionCookie);
res.clearCookie(config.session.name); res.clearCookie(config.session.name);
session.destroy((error) => { session.destroy((error) => {

View File

@ -1,12 +1,12 @@
/* /*
* Copyright © 2024 Hexastack. All rights reserved. * Copyright © 2025 Hexastack. All rights reserved.
* *
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
*/ */
import { EventEmitter2 } from '@nestjs/event-emitter'; import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
import { import {
ConnectedSocket, ConnectedSocket,
MessageBody, MessageBody,
@ -258,6 +258,17 @@ export class WebsocketGateway
this.eventEmitter.emit(`hook:websocket:connection`, client); this.eventEmitter.emit(`hook:websocket:connection`, client);
} }
@OnEvent('hook:user:logout')
disconnectSockets(sessionCookie: string) {
if (sessionCookie.length) {
for (const [socketId, socket] of this.io.sockets.sockets) {
if (socket.handshake.headers.cookie?.includes(sessionCookie)) {
this.io.sockets.sockets.get(socketId)?.disconnect(true);
}
}
}
}
async handleDisconnect(client: Socket): Promise<void> { async handleDisconnect(client: Socket): Promise<void> {
this.logger.log(`Client id:${client.id} disconnected`); this.logger.log(`Client id:${client.id} disconnected`);
// Configurable custom afterDisconnect logic here // Configurable custom afterDisconnect logic here

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2024 Hexastack. All rights reserved. * Copyright © 2025 Hexastack. All rights reserved.
* *
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
@ -162,7 +162,7 @@ declare module '@nestjs/event-emitter' {
model: TDefinition<Model>; model: TDefinition<Model>;
permission: TDefinition<Permission>; permission: TDefinition<Permission>;
role: TDefinition<Role>; role: TDefinition<Role>;
user: TDefinition<User, { lastvisit: Subscriber }>; user: TDefinition<User, { lastvisit: Subscriber; logout: string }>;
} }
/* entities hooks having schemas */ /* entities hooks having schemas */