UNPKG

@salutejs/client

Version:

Модуль взаимодействия с виртуальным ассистентом

129 lines (126 loc) 4.89 kB
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 };