UNPKG

@reclaimprotocol/attestor-core

Version:

<div> <div> <img src="https://raw.githubusercontent.com/reclaimprotocol/.github/main/assets/banners/Attestor-Core.png" /> </div> </div>

115 lines 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AttestorServerSocket = void 0; const message_handler_1 = require("../client/utils/message-handler"); const handlers_1 = require("../server/handlers"); const apm_1 = require("../server/utils/apm"); const generics_1 = require("../server/utils/generics"); const utils_1 = require("../utils"); const socket_base_1 = require("../utils/socket-base"); const util_1 = require("util"); class AttestorServerSocket extends socket_base_1.AttestorSocket { constructor(socket, sessionId, bgpListener, logger) { // @ts-ignore super(socket, {}, logger); this.sessionId = sessionId; this.bgpListener = bgpListener; this.tunnels = {}; // handle RPC requests this.addEventListener('rpc-request', handleRpcRequest.bind(this)); // forward packets to the appropriate tunnel this.addEventListener('tunnel-message', handleTunnelMessage.bind(this)); // close all tunnels when the connection is terminated // since this tunnel can no longer be written to this.addEventListener('connection-terminated', () => { for (const tunnelId in this.tunnels) { const tunnel = this.tunnels[tunnelId]; void tunnel.close(new Error('WS session terminated')); } }); } getTunnel(tunnelId) { const tunnel = this.tunnels[tunnelId]; if (!tunnel) { throw new utils_1.AttestorError('ERROR_NOT_FOUND', `Tunnel "${tunnelId}" not found`); } return tunnel; } removeTunnel(tunnelId) { delete this.tunnels[tunnelId]; } static async acceptConnection(socket, { req, logger, bgpListener }) { // promisify ws.send -- so the sendMessage method correctly // awaits the send operation const bindSend = socket.send.bind(socket); socket.send = (0, util_1.promisify)(bindSend); const sessionId = (0, utils_1.generateSessionId)(); logger = logger.child({ sessionId }); const client = new AttestorServerSocket(socket, sessionId, bgpListener, logger); try { const initMsgs = (0, generics_1.getInitialMessagesFromQuery)(req); logger.trace({ initMsgs: initMsgs.length }, 'new connection, validating...'); for (const msg of initMsgs) { await message_handler_1.handleMessage.call(client, msg); } logger.debug('connection accepted'); } catch (err) { logger.error({ err }, 'error in new connection'); if (client.isOpen) { await client.terminateConnection(err instanceof utils_1.AttestorError ? err : utils_1.AttestorError.badRequest(err.message)); } return; } return client; } } exports.AttestorServerSocket = AttestorServerSocket; async function handleTunnelMessage({ data: { tunnelId, message } }) { var _a; try { const tunnel = this.getTunnel(tunnelId); await tunnel.write(message); } catch (err) { (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error({ err, tunnelId, }, 'error writing to tunnel'); } } async function handleRpcRequest({ data: { data, requestId, respond, type } }) { var _a, _b; const logger = this.logger.child({ rpc: type, requestId }); const apm = (0, apm_1.getApm)(); const tx = apm === null || apm === void 0 ? void 0 : apm.startTransaction(type); tx === null || tx === void 0 ? void 0 : tx.setLabel('requestId', requestId); tx === null || tx === void 0 ? void 0 : tx.setLabel('sessionId', this.sessionId.toString()); const userId = (_b = (_a = this.metadata.auth) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.id; if (userId) { tx === null || tx === void 0 ? void 0 : tx.setLabel('authUserId', userId); } try { logger.debug({ data }, 'handling RPC request'); const handler = handlers_1.HANDLERS[type]; const res = await handler(data, { client: this, logger, tx }); respond(res); logger.debug({ res }, 'handled RPC request'); tx === null || tx === void 0 ? void 0 : tx.setOutcome('success'); } catch (err) { logger.error({ err }, 'error in RPC request'); respond(utils_1.AttestorError.fromError(err)); tx === null || tx === void 0 ? void 0 : tx.setOutcome('failure'); apm === null || apm === void 0 ? void 0 : apm.captureError(err, { parent: tx }); } finally { tx === null || tx === void 0 ? void 0 : tx.end(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0VBQWdFO0FBRWhFLGtEQUE4QztBQUM5Qyw4Q0FBNkM7QUFDN0Msd0RBQXVFO0FBRXZFLHFDQUE0RDtBQUM1RCx1REFBc0Q7QUFDdEQsK0JBQWdDO0FBR2hDLE1BQWEsb0JBQXFCLFNBQVEsNEJBQWM7SUFJdkQsWUFDQyxNQUFVLEVBQ0gsU0FBaUIsRUFDakIsV0FBb0MsRUFDM0MsTUFBYztRQUVkLGFBQWE7UUFDYixLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUxsQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUw1QyxZQUFPLEdBQXFDLEVBQUUsQ0FBQTtRQVU3QyxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNqRSw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3ZFLHNEQUFzRDtRQUN0RCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtZQUNuRCxLQUFJLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDckMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQTtZQUN0RCxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUE7SUFD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