UNPKG

@actyx/sdk

Version:
72 lines 3.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeWsMultiplexerV2 = exports.WebsocketEventStoreV2 = exports.v2getNodeId = void 0; /* * Actyx SDK: Functions for writing distributed apps * deployed on peer-to-peer networks, without any servers. * * Copyright (C) 2021 Actyx AG */ var utils_1 = require("./utils"); Object.defineProperty(exports, "v2getNodeId", { enumerable: true, get: function () { return utils_1.v2getNodeId; } }); var websocketEventStore_1 = require("./websocketEventStore"); Object.defineProperty(exports, "WebsocketEventStoreV2", { enumerable: true, get: function () { return websocketEventStore_1.WebsocketEventStore; } }); const rxjs_1 = require("../../node_modules/rxjs"); const log_1 = require("../internal_common/log"); const node_info_1 = require("../node-info"); const error_1 = require("../util/error"); const multiplexedWebsocket_1 = require("./multiplexedWebsocket"); const utils_2 = require("./utils"); const makeWsMultiplexerV2 = async (config, token, manifest) => { const apiLocation = (0, utils_2.getApiLocation)(config.actyxHost, config.actyxPort); const wsUrl = (tok) => `ws://${apiLocation}/events?${tok}`; const wsConfig = (0, multiplexedWebsocket_1.mkConfig)(wsUrl(token)); const getVersion = async (token) => (await (0, node_info_1.getInfo)(config)(token, -1)).semVer(); const version = await getVersion(token); const tokVer = [token, version]; const closeSubject = new rxjs_1.Subject(); wsConfig.closeObserver = closeSubject; const openSubject = new rxjs_1.Subject(); wsConfig.openObserver = openSubject; const ws = new multiplexedWebsocket_1.MultiplexedWebsocket(wsConfig); let disconnected = false; log_1.default.ws.info('websocket initiated'); closeSubject.subscribe({ next: (err) => { if (disconnected) { return; } disconnected = true; log_1.default.ws.warn('connection to Actyx lost', (0, error_1.massageError)(err)); config.onConnectionLost && config.onConnectionLost(); let renewing = false; const renewToken = async () => { if (renewing) return; renewing = true; if (!(await (0, utils_2.checkToken)(config, tokVer[0]))) { // tokVer[0] invalid but API working => reauthenticate tokVer[0] = await (0, utils_2.getToken)(config, manifest); wsConfig.url = wsUrl(tokVer[0]); tokVer[1] = await getVersion(tokVer[0]); ws.close(); // this disposes of the internal WebSocketSubject ws.request('wake up'); } }; setTimeout(() => renewToken().catch(() => (renewing = false)), 100); ws.errors() .pipe((0, rxjs_1.takeUntil)(openSubject)) .subscribe(() => renewToken().catch(() => (renewing = false))); }, }); openSubject.subscribe({ next: () => { log_1.default.ws.info('connection to Actyx established'); disconnected = false; config.onConnectionEstablished && config.onConnectionEstablished(); }, }); return [ws, tokVer]; }; exports.makeWsMultiplexerV2 = makeWsMultiplexerV2; //# sourceMappingURL=index.js.map