UNPKG

ns2-front-module-common

Version:
143 lines 6.07 kB
import { Injectable } from '@angular/core'; import Rxmq from 'rxmq'; /** * Сервис для работы с WebScoket-ами */ var WebsocketService = (function () { function WebsocketService() { // Объект канала в который отправляются сообщения из сокета this.channel = Rxmq.channel(WebsocketService.CHANNEL_NAME); // Время между попытками восстановления соединения this.reconnectTimeout = 1000; // Признак, установлено ли соединения или нет this.isConnected = false; } /** * Устанавливает точку обмена с сервером * @param {string} endPoint */ WebsocketService.prototype.setEndPoint = function (endPoint) { this.endPoint = endPoint; }; /** * Устанавливает время между попытками восстановления соединения * @param {number} connectTimeout */ WebsocketService.prototype.setReconnectTimeout = function (connectTimeout) { this.reconnectTimeout = connectTimeout; }; /** * Отправляет данные в сокет * @param {any} data Данные */ WebsocketService.prototype.send = function (data) { this.ws.send(JSON.stringify(data)); }; /** * Подписка на установление соединения * @param {Function} then Функция-подписчик * @returns {Subscription} */ WebsocketService.prototype.onOpen = function (then) { return this.channel.observe(WebsocketService.SOCKET_OPEN_TOPIC_NAME).subscribe(then); }; /** * Подписка на получение сообщения * @param {Function} then Функция-подписчик * @returns {Subscription} */ WebsocketService.prototype.onMessage = function (then) { return this.channel.observe(WebsocketService.SOCKET_MESSAGE_TOPIC_NAME).subscribe(then); }; /** * Подписка на закрытие сокета * @param {Function} then Функция-подписчик * @returns {Subscription} */ WebsocketService.prototype.onClose = function (then) { return this.channel.observe(WebsocketService.SOCKET_CLOSE_TOPIC_NAME).subscribe(then); }; /** * Подписка на ошибки сокета * @param {Function} then Функция-подписчик * @returns {Subscription} */ WebsocketService.prototype.onError = function (then) { return this.channel.observe(WebsocketService.SOCKET_ERROR_TOPIC_NAME).subscribe(then); }; /** * Установить соединение с сервером */ WebsocketService.prototype.connect = function (params) { if (!this.isConnected) { this.openConnection(params); this.isConnected = true; } }; /** * Закрыть соединение с сервером */ WebsocketService.prototype.disconnect = function () { if (this.isConnected) { this.ws.close(WebsocketService.SOCKET_CLOSE_NORMAL); this.isConnected = false; } }; /** * Открытие соединения с WebSocket и подписка на события */ WebsocketService.prototype.openConnection = function (params) { var _this = this; var url = this.endPoint, paramsArray = []; for (var pName in params) { if (params.hasOwnProperty(pName)) { paramsArray.push(pName + '=' + params[pName]); } } if (paramsArray.length > 0) { url += '?' + paramsArray.join('&'); } this.ws = new WebSocket(url); this.ws.onopen = function (ev) { _this.channel.subject(WebsocketService.SOCKET_OPEN_TOPIC_NAME).next(ev); }; this.ws.onmessage = function (response) { var data = JSON.parse(response.data) || {}; _this.channel.subject(WebsocketService.SOCKET_MESSAGE_TOPIC_NAME).next(data); }; this.ws.onerror = function (err) { _this.channel.subject(WebsocketService.SOCKET_ERROR_TOPIC_NAME).next(err); _this.ws.close(WebsocketService.SOCKET_CLOSE_ABNORMAL); }; this.ws.onclose = function (ev) { _this.channel.subject(WebsocketService.SOCKET_CLOSE_TOPIC_NAME).next(ev); if (ev.code !== WebsocketService.SOCKET_CLOSE_NORMAL) { setTimeout(function () { _this.openConnection(params); }, _this.reconnectTimeout); } }; }; return WebsocketService; }()); export { WebsocketService }; // Имя канала WebsocketService.CHANNEL_NAME = 'ws'; // Сообщения о открытии сокета WebsocketService.SOCKET_OPEN_TOPIC_NAME = 'socket_open'; // Сообщения о поступлении сообщения в сокет WebsocketService.SOCKET_MESSAGE_TOPIC_NAME = 'socket_message'; // Сообщения о закрытии сокета WebsocketService.SOCKET_CLOSE_TOPIC_NAME = 'socket_close'; // Сообщения о ошибке в сокете WebsocketService.SOCKET_ERROR_TOPIC_NAME = 'socket_error'; // Код нормального закрытия сокета (без дальнейшей попытки переустановки соединения) WebsocketService.SOCKET_CLOSE_NORMAL = 1000; // Код ненормального закрытия сокета (после такого закрытия будут предприняты попытки по переустановке соединения) WebsocketService.SOCKET_CLOSE_ABNORMAL = 3000; WebsocketService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ WebsocketService.ctorParameters = function () { return []; }; //# sourceMappingURL=websocket.service.js.map