import * as signalR from '@microsoft/signalr'; import storage from './storage'; let connection = '' as any; export const startSignalr = async () => { const user = await JSON.parse(storage.getItem('user') as string); connection = new signalR.HubConnectionBuilder().withAutomaticReconnect() .withUrl(`${import.meta.env.VITE_BASE_URL_API}/session-manage`, { skipNegotiation: true, transport: signalR.HttpTransportType.WebSockets, accessTokenFactory: () => user.token }) .build(); onStart() connection.onclose(async () => { await onStart() }); } export const onStart = async (callBack?: Function) => { if (connection.state !== signalR.HubConnectionState.Connected) { try { await connection.start(); if (callBack) { callBack() } } catch (err) { setTimeout(onStart, 5000); } } } export const onReconnected = async (callBack: Function) => { if (connection) { connection.onreconnected(async (_newConnectionId: any) => { callBack() }); } } export const onOtherSignalr = (callBack: Function) => { if (connection) { // 邀请 connection.on("Invitation", (roomNum: string, roomName: string, InviterName: string) => { callBack({ key: 'Invitation', roomNum, roomName, InviterName }) }); // 退出 connection.on("ForceLogout", (msg: string) => { callBack({ key: 'ForceLogout', msg }) }); } } export const onSignalr = (callBack: Function) => { if (connection) { // 聊天 connection.on("ReceiveMessage", (uid: string, userName: string, message: string) => { callBack({ key: 'ReceiveMessage', uid, message, userName }) }); // 扩展操作 connection.on("Operation", (type: number) => { callBack({ key: 'Operation', type }) }); // 全员离开房间 connection.on("ForceExitRoom", () => { callBack({ key: 'ForceExitRoom', }) }); // 全员看他 connection.on("ShowUser", () => { callBack({ key: 'ShowUser', }) }); // 更新视图模式 connection.on("RefreshView", (type: string) => { callBack({ key: 'RefreshView', type }) }); // 用户加入频道回调 connection.on("UserJoined", (user: any) => { callBack({ key: 'UserJoined', user, }) }); // 用户退出频道回调 connection.on("UserLeave", (uid: string,) => { callBack({ key: 'UserLeave', uid, }) }); // 所有用户开闭麦 connection.on("OperAllMicr", (enableMicr: boolean, uid: string) => { callBack({ key: 'OperAllMicr', enableMicr, uid }) }); // 用户关闭开启麦克风 connection.on("OperMicr", (user: any) => { callBack({ key: 'OperMicr', user }) }); // 用户开启关闭摄像头 connection.on("OperCamera", (user: any) => { callBack({ key: 'OperCamera', user }) }); // 管理员用户信息刷新 connection.on("ManagerRefresh", (user: any) => { callBack({ key: 'ManagerRefresh', user }) }); } } export const offSignalr = () => { if (connection) { connection.off('ReceiveMessage'); connection.off('Operation'); connection.off('ForceExitRoom'); connection.off('ShowUser'); connection.off('RefreshView'); connection.off('UserJoined'); connection.off('UserLeave'); connection.off('OperAllMicr'); connection.off('OperMicr'); connection.off('OperCamera'); connection.off('ManagerRefresh'); } } export const onInvoke = async (str: string, data: any) => { switch (str) { case 'sendChannelMsg': await connection.invoke(str, data.roomNum, data.msg) break; case 'sendOper': // 1:全员退出会议 // 3:踢出房间 // 4:屏幕共享 await connection.invoke(str, data.roomNum, data.type) break; } } export const onStop = async () => { if (connection) { connection.off('Invitation'); connection.off('ForceLogout'); connection.stop() connection = "" } }