facade-signalr-client
Version:
facade signalr client
114 lines • 4.39 kB
JavaScript
import * as signalR from '@microsoft/signalr';
import events from './../events';
export default class SignalRClient {
constructor() {
/**
* 连接SignalR,返回SignalR的Promise连接
* @param {string} baseUrl 连接 SignalR 地址
* @param {string} queryString 地址的拼接参数,可空,如:id=xxx&name=xxxx;
*/
this.connect = (baseUrl, queryString) => {
if (queryString) {
baseUrl += (baseUrl.indexOf('?') === -1 ? '?' : '&') + queryString;
}
const start = async (transport) => {
console.log('Starting connection using ' +
signalR.HttpTransportType[transport] +
' transport');
const connection = new signalR.HubConnectionBuilder()
.withUrl(baseUrl, transport)
.withAutomaticReconnect()
.build();
// 配置
// Reconnect if hub disconnects
connection.onclose(e => {
if (e) {
console.log('Connection closed with error: ' + e);
}
else {
console.log('Disconnected');
}
// 尝试重新连接
this.reconnect();
});
try {
await connection.start();
this.connection = connection;
console.log('Connected to SignalR server!');
// Call the Register method on the hub.
connection.invoke('register').then(() => {
console.log('Registered to the SignalR server!');
});
this.events.trigger('signalr.connected', connection);
return connection;
}
catch (error) {
console.log('Cannot start the connection using ' +
signalR.HttpTransportType[transport] +
' transport. ' +
error.message);
if (transport !== signalR.HttpTransportType.LongPolling) {
return start(transport + 1);
}
return Promise.reject(error);
}
};
return start(signalR.HttpTransportType.WebSockets);
};
/**
* 发送消息
* @param {string} methodName 发送的方法名
* @param {any} request 发送的请求参数
*/
this.sendMessage = (methodName, request) => {
if (this.connection) {
return this.connection.invoke(methodName, request);
}
else {
return Promise.reject('SignalR fail');
}
};
/**
* 接受消息
* @param {string} methodName 接受消息的方法名
* @param {ICallback} callback 回调函数
*/
this.receiveMessage = (methodName, callback) => {
if (this.connection) {
this.connection.on(methodName, callback);
}
else {
console.log('SignalR fail');
}
};
/**
* 重新连接
*/
this.reconnect = () => {
this.pingTimer = setTimeout(() => {
if (this.connection) {
this.connection
.start()
.then(() => { })
.catch(error => {
console.log(error);
this.reconnect();
})
.finally(() => {
if (this.pingTimer) {
clearTimeout(this.pingTimer);
}
});
}
else {
console.log('SignalR fail');
}
}, 5000);
};
this.pingTimer = undefined;
this.connection = undefined;
this.events = events;
}
}
// export default new SignalRClient()
//# sourceMappingURL=index.js.map