.net10 сервер с рабочими звонками и файлами

This commit is contained in:
Халимов Рустам
2026-03-12 01:48:58 +03:00
parent 50d4d75c04
commit d025c98e61
741 changed files with 35231 additions and 1863 deletions
+65 -34
View File
@@ -1,42 +1,73 @@
import { io, Socket } from 'socket.io-client';
import { HubConnection, HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
let socket: Socket | null = null;
export function connectSocket(token: string): Socket {
if (socket?.connected) {
return socket;
}
// Clean up old socket instance if it exists but is disconnected
if (socket) {
socket.removeAllListeners();
socket.disconnect();
socket = null;
}
socket = io(window.location.origin, {
auth: { token },
transports: ['websocket', 'polling'],
});
socket.on('connect', () => {
console.log('Socket подключён');
});
socket.on('connect_error', (err) => {
console.error('Ошибка подключения Socket:', err.message);
});
return socket;
export interface SocketCompat {
on(event: string, callback: (...args: any[]) => void): void;
off(event: string, callback?: (...args: any[]) => void): void;
emit(event: string, ...args: any[]): void;
disconnect(): void;
status: string;
}
export function getSocket(): Socket | null {
return socket;
let connection: HubConnection | null = null;
let socketWrapper: SocketCompat | null = null;
export function connectSocket(token: string): SocketCompat {
if (connection && (connection.state === 'Connected' || connection.state === 'Connecting')) {
return socketWrapper!;
}
connection = new HubConnectionBuilder()
.withUrl('/hubs/chat', {
accessTokenFactory: () => token
})
.withAutomaticReconnect()
.configureLogging(LogLevel.Information)
.build();
// Обертка для совместимости с Socket.io API
socketWrapper = {
on: (event: string, callback: (...args: any[]) => void) => {
connection?.on(event, callback);
},
off: (event: string, callback?: (...args: any[]) => void) => {
if (callback) {
connection?.off(event, callback);
} else {
connection?.off(event);
}
},
emit: (event: string, ...args: any[]) => {
if (connection?.state === 'Connected') {
// В SignalR invoke возвращает Promise, но Socket.io emit - нет.
// Мы просто запускаем и логируем ошибки.
connection.invoke(event, ...args).catch(err => console.error(`SignalR emit error (${event}):`, err));
} else {
console.warn(`SignalR emit skipped (${event}): connection state is ${connection?.state}`);
}
},
disconnect: () => {
connection?.stop();
},
get status() {
return connection?.state || 'Disconnected';
}
};
connection.start()
.then(() => console.log('SignalR подключён'))
.catch(err => console.error('Ошибка подключения SignalR:', err.toString()));
return socketWrapper;
}
export function getSocket(): SocketCompat | null {
return socketWrapper;
}
export function disconnectSocket() {
if (socket) {
socket.disconnect();
socket = null;
if (connection) {
connection.stop();
connection = null;
socketWrapper = null;
}
}