WGShare.Client.Electron/src/utils/package/signalr.ts

180 lines
4.3 KiB
TypeScript

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()
storage.setItem('isSignalr', true)
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("AllLeave", () => {
callBack({
key: 'AllLeave',
})
});
// 全员看他
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('AllLeave');
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':
// 4:屏幕共享
await connection.invoke(str, data.roomNum, data.type)
break;
}
}
export const onStop = async () => {
if (connection) {
storage.setItem('isSignalr', false)
connection.off('Invitation');
connection.off('ForceLogout');
connection.stop()
connection = ""
}
}