ns2-front-module-common
Version:
NS2 common module
143 lines • 6.07 kB
JavaScript
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