@synet/net
Version:
Network abstraction layer for Synet. visit https://syntehtism.ai for more information.
251 lines (250 loc) • 10.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SynetdAdapter = void 0;
const axios_1 = __importDefault(require("axios"));
const patterns_1 = require("@synet/patterns");
/**
* Adapter for managing WireGuard using the synetd API
*/
class SynetdAdapter {
constructor(keysRepository, baseUrl = "http://localhost:4001", logger) {
this.keysRepository = keysRepository;
this.baseUrl = baseUrl;
this.logger = logger;
this.apiClient = axios_1.default.create({
baseURL: baseUrl,
timeout: 10000,
headers: {
"Content-Type": "application/json",
},
});
}
async getKeys() {
this.logger?.debug("Getting WireGuard keys");
return await this.keysRepository.getKeys();
}
async generateKeys() {
this.logger?.debug("Generating WireGuard keys via synetd");
try {
const response = await this.apiClient.post("/generate-keys");
if (response.status !== 200 || !response.data) {
return patterns_1.Result.fail("Failed to generate keys: API returned error");
}
const { privateKey, publicKey } = response.data;
if (!privateKey || !publicKey) {
return patterns_1.Result.fail("Invalid key data returned from API");
}
const keys = { privateKey, publicKey };
// Save keys to repository
const saveResult = await this.keysRepository.saveKeys(keys);
if (saveResult.isFailure) {
return patterns_1.Result.fail(`Failed to save keys: ${saveResult.errorMessage}`, saveResult.errorCause);
}
return patterns_1.Result.success(keys);
}
catch (error) {
this.logger?.error("Failed to generate keys via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to generate keys: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to generate keys: Unknown error");
}
}
async setInterface(config) {
this.logger?.debug("Setting up WireGuard interface via synetd");
try {
await this.apiClient.post("/set-ip", {
address: config.address,
privateKey: config.privateKey,
...(config.listenPort && { listenPort: config.listenPort }),
...(config.dns && { dns: config.dns }),
});
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to set interface via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to set interface: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to set interface: Unknown error");
}
}
async addPeer(config) {
this.logger?.debug(`Adding peer ${config.publicKey.substring(0, 10)}... via synetd`);
try {
await this.apiClient.post("/add-peer", {
publicKey: config.publicKey,
endpoint: config.endpoint,
allowedIps: config.allowedIPs,
persistentKeepalive: config.persistentKeepalive || 25,
...(config.presharedKey && { presharedKey: config.presharedKey }),
});
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to add peer via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to add peer: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to add peer: Unknown error");
}
}
async removeInterface() {
this.logger?.debug("Removing WireGuard interface via synetd");
try {
await this.apiClient.post("/remove-ip");
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to remove interface via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to remove interface: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to remove interface: Unknown error");
}
}
/**
* Reload the WireGuard interface
* @description This method reloads the WireGuard interface configuration
* @returns Result<void>
*/
async reload() {
this.logger?.debug("Reloading WireGuard interface via synetd");
try {
await this.apiClient.post("/reload");
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to reload interface via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to reload interface: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to reload interface: Unknown error");
}
}
async removeAllPeers() {
this.logger?.debug("Removing all peers via synetd");
try {
await this.apiClient.post("/remove-all-peers");
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to remove all peers via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to remove all peers: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to remove all peers: Unknown error");
}
}
async removePeer(publicKey) {
this.logger?.debug(`Removing peer ${publicKey.substring(0, 10)}... via synetd`);
try {
await this.apiClient.post("/remove-peer", { publicKey });
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to remove peer via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to remove peer: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to remove peer: Unknown error");
}
}
async bringUp() {
this.logger?.info("Bringing up WireGuard interface via synetd");
try {
await this.apiClient.post("/bring-up");
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to bring up interface via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to bring up interface: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to bring up interface: Unknown error");
}
}
async bringDown() {
this.logger?.info("Bringing down WireGuard interface via synetd");
try {
await this.apiClient.post("/bring-down");
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to bring down interface via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to bring down interface: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to bring down interface: Unknown error");
}
}
async status() {
this.logger?.info("Checking WireGuard interface status via synetd");
try {
await this.apiClient.post("/status");
return patterns_1.Result.success(undefined);
}
catch (error) {
this.logger?.error("Failed to check interface status via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to check interface status: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to check interface status: Unknown error");
}
}
async peerStatus(publicKey) {
this.logger?.info("Checking WireGuard peer status via synetd");
try {
const response = await this.apiClient.post("/peer-status", {
publicKey,
});
if (response.status !== 200 || !response.data) {
return patterns_1.Result.fail("Failed to get peer status: API returned error");
}
const { latestHandshake, handshakeStatus, transfer } = response.data;
return patterns_1.Result.success({
publicKey: publicKey,
latestHandshake: new Date(latestHandshake * 1000).toISOString(),
handshakeStatus: handshakeStatus,
transfer: {
rx: transfer.rx,
tx: transfer.tx,
},
});
}
catch (error) {
this.logger?.error("Failed to check peer status via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to check peer status: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to check peer status: Unknown error");
}
}
async listPeers() {
this.logger?.info("Listing WireGuard peers via synetd");
try {
const response = await this.apiClient.post("/list-peers");
if (response.status !== 200 || !response.data) {
return patterns_1.Result.fail("Failed to list peers: API returned error");
}
const peers = response.data.map((peer) => ({
publicKey: peer.publicKey,
endpoint: peer.endpoint,
allowedIPs: peer.allowedIPs,
persistentKeepalive: peer.persistentKeepalive || 25,
}));
return patterns_1.Result.success(peers);
}
catch (error) {
this.logger?.error("Failed to list peers via synetd", error);
if (error instanceof Error) {
return patterns_1.Result.fail(`Failed to list peers: ${error.message}`, error);
}
return patterns_1.Result.fail("Failed to list peers: Unknown error");
}
}
}
exports.SynetdAdapter = SynetdAdapter;