UNPKG

@reclaimprotocol/attestor-core

Version:

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

114 lines 10.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AttestorServerSocket = void 0; const message_handler_1 = require("../client/utils/message-handler"); const config_1 = require("../config"); 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); } const timeout = setTimeout(() => { logger.warn({ type, requestId }, 'RPC took too long to respond'); }, config_1.DEFAULT_RPC_TIMEOUT_MS); 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 { clearTimeout(timeout); tx === null || tx === void 0 ? void 0 : tx.end(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0VBQWdFO0FBQ2hFLHVDQUFtRDtBQUVuRCxrREFBOEM7QUFDOUMsOENBQTZDO0FBQzdDLHdEQUF1RTtBQUV2RSxxQ0FBNEQ7QUFDNUQsdURBQXNEO0FBQ3RELCtCQUFnQztBQUdoQyxNQUFhLG9CQUFxQixTQUFRLDRCQUFjO0lBSXZELFlBQ0MsTUFBVSxFQUNILFNBQWlCLEVBQ2pCLFdBQW9DLEVBQzNDLE1BQWM7UUFFZCxhQUFhO1FBQ2IsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFMbEIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFMNUMsWUFBTyxHQUFxQyxFQUFFLENBQUE7UUFVN0Msc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN2RSxzREFBc0Q7UUFDdEQsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7WUFDbkQsS0FBSSxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3JDLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUE7WUFDdEQsQ0FBQztRQUNGLENBQUMs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