@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
JavaScript
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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
;