mirror of
https://github.com/hexastack/hexabot
synced 2025-04-02 20:31:33 +00:00
Merge pull request #645 from Hexastack/644-bug---logout-api-disconnection
fix: logout disconnection sockets
This commit is contained in:
commit
0a6deae7b9
@ -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:
|
||||
* 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,7 @@ import {
|
||||
Body,
|
||||
Controller,
|
||||
Get,
|
||||
Inject,
|
||||
InternalServerErrorException,
|
||||
Param,
|
||||
Post,
|
||||
@ -21,6 +22,7 @@ import {
|
||||
UseGuards,
|
||||
UseInterceptors,
|
||||
} from '@nestjs/common';
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { CsrfCheck, CsrfGen, CsrfGenAuth } from '@tekuconcept/nestjs-csrf';
|
||||
import { Request, Response } from 'express';
|
||||
import { Session as ExpressSession } from 'express-session';
|
||||
@ -38,6 +40,9 @@ import { UserService } from '../services/user.service';
|
||||
import { ValidateAccountService } from '../services/validate-account.service';
|
||||
|
||||
export class BaseAuthController {
|
||||
@Inject(EventEmitter2)
|
||||
private readonly eventEmitter: EventEmitter2;
|
||||
|
||||
constructor(protected readonly logger: LoggerService) {}
|
||||
|
||||
/**
|
||||
@ -67,6 +72,7 @@ export class BaseAuthController {
|
||||
@Session() session: ExpressSession,
|
||||
@Res({ passthrough: true }) res: Response,
|
||||
) {
|
||||
this.eventEmitter.emit('hook:user:logout', session);
|
||||
res.clearCookie(config.session.name);
|
||||
|
||||
session.destroy((error) => {
|
||||
|
@ -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:
|
||||
* 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).
|
||||
*/
|
||||
|
||||
import { EventEmitter2 } from '@nestjs/event-emitter';
|
||||
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
|
||||
import {
|
||||
ConnectedSocket,
|
||||
MessageBody,
|
||||
@ -20,7 +20,7 @@ import {
|
||||
import cookie from 'cookie';
|
||||
import * as cookieParser from 'cookie-parser';
|
||||
import signature from 'cookie-signature';
|
||||
import { SessionData } from 'express-session';
|
||||
import { Session as ExpressSession, SessionData } from 'express-session';
|
||||
import { Server, Socket } from 'socket.io';
|
||||
import { sync as uid } from 'uid-safe';
|
||||
|
||||
@ -258,6 +258,15 @@ export class WebsocketGateway
|
||||
this.eventEmitter.emit(`hook:websocket:connection`, client);
|
||||
}
|
||||
|
||||
@OnEvent('hook:user:logout')
|
||||
disconnectSockets({ id }: ExpressSession) {
|
||||
for (const [, socket] of this.io.sockets.sockets) {
|
||||
if (socket.data['sessionID'] === id) {
|
||||
socket.disconnect(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async handleDisconnect(client: Socket): Promise<void> {
|
||||
this.logger.log(`Client id:${client.id} disconnected`);
|
||||
// Configurable custom afterDisconnect logic here
|
||||
|
5
api/types/event-emitter.d.ts
vendored
5
api/types/event-emitter.d.ts
vendored
@ -1,11 +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:
|
||||
* 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).
|
||||
*/
|
||||
|
||||
import { type Session as ExpressSession } from 'express-session';
|
||||
import type { Document, Query } from 'mongoose';
|
||||
import { type Socket } from 'socket.io';
|
||||
|
||||
@ -162,7 +163,7 @@ declare module '@nestjs/event-emitter' {
|
||||
model: TDefinition<Model>;
|
||||
permission: TDefinition<Permission>;
|
||||
role: TDefinition<Role>;
|
||||
user: TDefinition<User, { lastvisit: Subscriber }>;
|
||||
user: TDefinition<User, { lastvisit: Subscriber; logout: ExpressSession }>;
|
||||
}
|
||||
|
||||
/* entities hooks having schemas */
|
||||
|
Loading…
Reference in New Issue
Block a user