@salutejs/client
Version:
Модуль взаимодействия с виртуальным ассистентом
129 lines (126 loc) • 4.89 kB
JavaScript
import { d as createNanoEvents, b as __awaiter, c as __generator } from './common-ba25e019.js';
var RETRY_INTERVAL = 300; // ms
var defaultWSCreator = function (url) { return new WebSocket(url); };
var createTransport = function (_a) {
var _b = _a.createWS, createWS = _b === void 0 ? defaultWSCreator : _b, checkCertUrl = _a.checkCertUrl;
var _c = createNanoEvents(), on = _c.on, emit = _c.emit;
var hasCert = !checkCertUrl;
var retryTimeoutId = -1;
var retries = 0;
var status = 'closed';
var webSocket;
var stopped = true;
var checkCert = function (checkUrl) {
return new Promise(function (resolve) {
window
.fetch(checkUrl)
.then(function () { return resolve(true); })
.catch(function () { return resolve(false); });
});
};
var close = function () {
stopped = true;
if (status === 'closing' || status === 'closed') {
return;
}
status = 'closing';
webSocket === null || webSocket === void 0 ? void 0 : webSocket.close();
};
var connect = function (url) { return __awaiter(void 0, void 0, void 0, function () {
var okay;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
status = 'connecting';
emit('connecting');
if (!(!hasCert && window.navigator.onLine)) return [3 /*break*/, 2];
return [4 /*yield*/, checkCert(checkCertUrl)];
case 1:
okay = _a.sent();
if (!okay) {
status = 'closed';
emit('close');
emit('error', new Error('Cert authority invalid'));
return [2 /*return*/];
}
hasCert = true;
_a.label = 2;
case 2:
webSocket = createWS(url);
webSocket.binaryType = 'arraybuffer';
webSocket.addEventListener('open', function () {
if (webSocket.readyState !== 1) {
return;
}
window.clearTimeout(retryTimeoutId);
retries = 0;
status = 'open';
emit('open');
});
webSocket.addEventListener('close', function () {
status = 'closed';
emit('close');
});
webSocket.addEventListener('error', function (e) {
if (status !== 'connecting') {
throw e;
}
// пробуем переподключаться, если возникла ошибка при коннекте
if (!webSocket || (webSocket.readyState === 3 && !stopped)) {
window.clearTimeout(retryTimeoutId);
if (retries < 2) {
retryTimeoutId = window.setTimeout(function () {
// eslint-disable-next-line @typescript-eslint/no-use-before-define
open(url);
retries++;
}, RETRY_INTERVAL * retries);
}
else {
retries = 0;
emit('error', e);
}
}
});
webSocket.addEventListener('message', function (_a) {
var data = _a.data;
emit('message', data);
});
return [2 /*return*/];
}
});
}); };
var open = function (url) {
if (status === 'connecting' || status === 'open') {
return;
}
stopped = false;
connect(url);
};
var reconnect = function (url) {
if (status === 'closed') {
open(url);
return;
}
window.setTimeout(function () { return reconnect(url); });
close();
};
var send = function (data) {
if (!window.navigator.onLine) {
close();
emit('error');
throw new Error('The client seems to be offline');
}
webSocket.send(data);
};
return {
close: close,
get isOnline() {
return window.navigator.onLine;
},
on: on,
open: open,
reconnect: reconnect,
send: send,
};
};
export { createTransport as c };