@iosio/websocket-client
Version:
Simple wrapper for native client-side WebSocket. Similar to socket.io. Easy to use with any backend
138 lines (131 loc) • 5.82 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['exports', '@iosio/utils/lib/eventer', '@iosio/utils/lib/number_generation'], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require('@iosio/utils/lib/eventer'), require('@iosio/utils/lib/number_generation'));
} else {
var mod = {
exports: {}
};
factory(mod.exports, global.eventer, global.number_generation);
global.slim = mod.exports;
}
})(this, function (exports, _eventer2, _number_generation) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Socket = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
var isObject = function isObject(val) {
return (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object';
},
isFunction = function isFunction(val) {
return typeof val === 'function';
},
isString = function isString(val) {
return typeof val === 'string';
};
var Socket = exports.Socket = function Socket(_ref) {
var _url = _ref._url,
_websocket_options = _ref._websocket_options,
_auto_reconnect = _ref._auto_reconnect;
var _callbacks = Object.create(null),
_reconnectInterval = null,
_deliberateClose = false,
_socket = null,
_eventer = (0, _eventer2.Eventer)(_callbacks),
_attemptReconnect = function _attemptReconnect() {
if (_reconnectInterval) clearInterval(_reconnectInterval);
_reconnectInterval = setInterval(function () {
if (!_isConnected()) {
_eventer.emit('reconnecting');
open();
} else clearInterval(_reconnectInterval);
}, _auto_reconnect && _auto_reconnect.every ? _auto_reconnect.every : 2000);
},
close = function close() {
_deliberateClose = true;
if (_isConnected()) {
_socket.close();
_reconnectInterval && clearInterval(_reconnectInterval);
}
},
_isConnected = function _isConnected() {
return _socket ? _socket.readyState === _WebSocket.OPEN : false;
},
_isResponse = function _isResponse(res) {
return typeof res === 'string' && res.search('@response-') > -1;
},
open = function open() {
_deliberateClose = false;
if (_isConnected()) return;
try {
_socket = new WebSocket(_url, _websocket_options);
} catch (e) {
_socket = false;
}
if (!_socket) return;
_socket.onopen = function () {
return _eventer.emit('connect');
};
_socket.onerror = function () {
return _eventer.emit('error');
};
_socket.onclose = function () {
_eventer.emit('disconnect');
_auto_reconnect && !_deliberateClose && _attemptReconnect();
};
_socket.onmessage = function (_ref2) {
var data = _ref2.data;
var msg = void 0;
try {
msg = JSON.parse(data);
} catch (e) {
if (e) return;
}
_eventer.emit(msg.event, msg.data);
_isResponse(msg.event) && _eventer.destroy(msg.event);
};
},
on = function on(event, cb) {
return _eventer.on(event, cb);
},
off = function off(event, cb) {
return _eventer.off(event, cb);
},
send = function send(event) {
var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var response_id = arguments[2];
if (!_isConnected()) return;
var message = void 0;
if (typeof response_id === 'string') message = { event: event, data: data, type: 'request', response_id: response_id };else message = { event: event, data: data, type: 'send' };
_socket.send(JSON.stringify(message));
},
_validateRequestArgs = function _validateRequestArgs(event, par_or_cb, cb_if_par) {
var ok = true;
if (!isString(event)) ok = false;
if (!isObject(par_or_cb) && !isFunction(par_or_cb)) ok = false;
if (isObject(par_or_cb) && !isFunction(cb_if_par)) ok = false;
if (!ok) return { ok: false };
if (isObject(par_or_cb)) return { ok: true, params: par_or_cb, cb: cb_if_par };else if (isFunction(par_or_cb)) return { ok: true, params: {}, cb: par_or_cb };
return { ok: false };
},
request = function request(event, par_or_cb, cb_if_par) {
var _validateRequestArgs2 = _validateRequestArgs(event, par_or_cb, cb_if_par),
ok = _validateRequestArgs2.ok,
params = _validateRequestArgs2.params,
cb = _validateRequestArgs2.cb;
if (!ok) return;
var response_id = '@response-' + event + '-' + (0, _number_generation.uniqueID)();
send(event, params, response_id);
on(response_id, cb, true);
};
return { open: open, send: send, request: request, on: on, off: off, close: close };
};
exports.default = Socket;
});