UNPKG

@zkp2p/reclaim-witness-sdk

Version:

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

126 lines 9.13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createBgpListener = createBgpListener; const ip_cidr_1 = __importDefault(require("ip-cidr")); const config_1 = require("../config"); const ws_1 = require("../utils/ws"); const ANNOUNCEMENT_OVERLAP = 'announcement-overlap'; class BGPAnnouncementOverlapEvent extends Event { constructor(data) { super(ANNOUNCEMENT_OVERLAP); this.data = data; } } /** * Listens for BGP announcements and emits events whenever * an announcement overlaps with a target IP. */ function createBgpListener(logger) { let ws; let closed = false; const targetIps = new Set(); const eventTarget = new EventTarget(); openWs(); return { onOverlap(ips, callback) { for (const ip of ips) { targetIps.add(ip); } eventTarget.addEventListener(ANNOUNCEMENT_OVERLAP, _callback); return () => { for (const ip of ips) { targetIps.delete(ip); } eventTarget.removeEventListener(ANNOUNCEMENT_OVERLAP, _callback); }; function _callback(event) { callback(event.data); } }, close() { ws.onclose = null; ws.onerror = null; ws.close(); closed = true; } }; function openWs() { logger.debug('connecting to BGP websocket'); ws = (0, ws_1.makeWebSocket)(config_1.BGP_WS_URL); ws.onopen = onOpen; ws.onerror = (err) => onClose(err); ws.onclose = () => onClose(new Error('Unexpected close')); ws.onmessage = ({ data }) => { const str = typeof data === 'string' ? data : data.toString(); try { onMessage(str); } catch (err) { logger.error({ data, err }, 'error processing BGP message'); } }; } function onOpen() { const subscriptionMessage = { type: 'ris_subscribe', data: { type: 'UPDATE', }, }; ws.send(JSON.stringify(subscriptionMessage)); logger.info('connected to BGP websocket'); } function onClose(err) { if (closed) { return; } logger.info({ err }, 'BGP websocket closed'); if (!err) { return; } logger.info('reconnecting to BGP websocket'); openWs(); } function onMessage(message) { var _a, _b; const data = JSON.parse(message); const announcements = (_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.announcements; logger.trace({ data }, 'got BGP update'); if (!Array.isArray(announcements)) { return; } const asPath = (_b = data === null || data === void 0 ? void 0 : data.data) === null || _b === void 0 ? void 0 : _b.path; for (const announcement of announcements) { const prefixes = announcement === null || announcement === void 0 ? void 0 : announcement.prefixes; const nextHop = announcement === null || announcement === void 0 ? void 0 : announcement['next_hop']; const hasPrefixes = (prefixes === null || prefixes === void 0 ? void 0 : prefixes.length) && (nextHop || asPath); if (!hasPrefixes) { return; } for (const prefix of prefixes) { if (!overlapsTargetIps(prefix)) { continue; } // emit event eventTarget.dispatchEvent(new BGPAnnouncementOverlapEvent({ prefix })); } } } function overlapsTargetIps(prefix) { // ignore all prefixes that end with /0 if (prefix.endsWith('/0')) { return false; } const cidr = new ip_cidr_1.default(prefix); for (const ip of targetIps) { if (cidr.contains(ip)) { return true; } } return false; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmdwLWxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2JncC1saXN0ZW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWtCQSw4Q0F1SUM7QUF6SkQsc0RBQTBCO0FBRTFCLHVDQUF1QztBQUV2QyxxQ0FBNEM7QUFFNUMsTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQTtBQUVuRCxNQUFNLDJCQUE0QixTQUFRLEtBQUs7SUFDOUMsWUFBNEIsSUFBZ0M7UUFDM0QsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFEQSxTQUFJLEdBQUosSUFBSSxDQUE0QjtJQUU1RCxDQUFDO0NBQ0Q7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxNQUFjO0lBQy9DLElBQUksRUFBb0MsQ0FBQTtJQUN4QyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUE7SUFFbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtJQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO0lBRXJDLE1BQU0sRUFBRSxDQUFBO0lBRVIsT0FBTztRQUNOLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUTtZQUN0QixLQUFJLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2xCLENBQUM7WUFFRCxXQUFXLENBQUMsZ0JBQWdCLENBQzNCLG9CQUFvQixFQUNwQixTQUFTLENBQ1QsQ0FBQTtZQUVELE9BQU8sR0FBRyxFQUFFO2dCQUNYLEtBQUksTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ3JCLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ3JCLENBQUM7Z0JBRUQsV0FBVyxDQUFDLG1CQUFtQixDQUM5QixvQkFBb0IsRUFDcEIsU0FBUyxDQUNULENBQUE7WUFDRixD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