EvalueTonSavoir/test/stressTest/class/roomParticipant.js
MathieuSevignyLavallee 49fbdb1ffd refactor
2024-11-27 18:36:59 -05:00

72 lines
No EOL
2.4 KiB
JavaScript

import { io } from "socket.io-client";
export class RoomParticipant {
constructor(username, roomName) {
this.username = username;
this.roomName = roomName;
this.socket = null;
this.maxRetries = 3;
this.retryDelay = 1000;
}
async connectToRoom(baseUrl, onConnectCallback) {
let retries = 0;
const connect = () => {
return new Promise((resolve, reject) => {
try {
const socket = io(baseUrl, {
path: `/api/room/${this.roomName}/socket`,
transports: ['websocket'],
timeout: 5000,
reconnection: true,
reconnectionAttempts: 3,
reconnectionDelay: 1000,
});
const connectionTimeout = setTimeout(() => {
socket.close();
reject(new Error('Connection timeout'));
}, 5000);
socket.on('connect', () => {
clearTimeout(connectionTimeout);
this.socket = socket;
if (onConnectCallback) {
onConnectCallback();
}
resolve(socket);
});
socket.on('connect_error', (error) => {
clearTimeout(connectionTimeout);
reject(new Error(`Connection error: ${error.message}`));
});
} catch (error) {
reject(error);
}
});
};
while (retries < this.maxRetries) {
try {
return await connect();
} catch (error) {
retries++;
if (retries === this.maxRetries) {
throw new Error(`Failed to connect ${this.username} after ${this.maxRetries} attempts: ${error.message}`);
}
console.warn(`Retry ${retries}/${this.maxRetries} for ${this.username}`);
await new Promise(resolve => setTimeout(resolve, this.retryDelay));
}
}
}
disconnect() {
if (this.socket) {
this.socket.disconnect();
this.socket = null;
}
}
}