UNPKG

facade-signalr-client

Version:

facade signalr client

114 lines 4.39 kB
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