UNPKG

caravan-x

Version:

A terminal-based utility for managing Caravan multisig wallets in regtest mode. This tool simplifies development and testing with Caravan by providing an easy-to-use interface

169 lines (168 loc) • 6.48 kB
"use strict"; /** * Snapshot Commands for Caravan-X */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SnapshotCommands = void 0; const prompts_1 = require("@inquirer/prompts"); const chalk_1 = __importDefault(require("chalk")); const terminal_1 = require("../utils/terminal"); const cli_table3_1 = __importDefault(require("cli-table3")); class SnapshotCommands { constructor(snapshotService) { this.snapshotService = snapshotService; } async showSnapshotMenu() { (0, terminal_1.displayCommandTitle)("Blockchain Snapshots"); const action = await (0, prompts_1.select)({ message: "What would you like to do?", choices: [ { name: "šŸ“ø Create Snapshot", value: "create" }, { name: "šŸ“‹ List Snapshots", value: "list" }, { name: "ā™»ļø Restore Snapshot", value: "restore" }, { name: "šŸ” Compare Snapshots", value: "diff" }, { name: "šŸ—‘ļø Delete Snapshot", value: "delete" }, { name: "šŸ”™ Back", value: "back" }, ], }); switch (action) { case "create": await this.createSnapshot(); break; case "list": await this.listSnapshots(); break; case "restore": await this.restoreSnapshot(); break; case "diff": await this.compareSnapshots(); break; case "delete": await this.deleteSnapshot(); break; case "back": return; } if (action !== "back") { await this.showSnapshotMenu(); } } async createSnapshot() { const name = await (0, prompts_1.input)({ message: "Snapshot name:", required: true, }); const description = await (0, prompts_1.input)({ message: "Description (optional):", }); const snapshot = await this.snapshotService.createSnapshot({ name, description, }); console.log(terminal_1.colors.success(`\nāœ… Snapshot created: ${snapshot.name}`)); console.log(terminal_1.colors.info(`Block height: ${snapshot.blockHeight}`)); console.log(terminal_1.colors.info(`ID: ${snapshot.id}`)); } async listSnapshots() { const snapshots = await this.snapshotService.listSnapshots(); if (snapshots.length === 0) { console.log(terminal_1.colors.warning("\nNo snapshots found.")); return; } const table = new cli_table3_1.default({ head: ["Name", "Block Height", "Created", "Wallets"], colWidths: [25, 15, 20, 30], }); for (const snapshot of snapshots) { table.push([ snapshot.name, snapshot.blockHeight, new Date(snapshot.createdAt).toLocaleString(), snapshot.wallets.join(", "), ]); } console.log("\n" + table.toString()); } async restoreSnapshot() { const snapshots = await this.snapshotService.listSnapshots(); if (snapshots.length === 0) { console.log(terminal_1.colors.warning("\nNo snapshots available to restore.")); return; } const snapshotId = await (0, prompts_1.select)({ message: "Select snapshot to restore:", choices: snapshots.map((s) => ({ name: `${s.name} (height: ${s.blockHeight})`, value: s.id, })), }); const confirmRestore = await (0, prompts_1.confirm)({ message: "This will replace your current blockchain state. Continue?", default: false, }); if (confirmRestore) { await this.snapshotService.restoreSnapshot(snapshotId, { stopBitcoin: true, restartBitcoin: false, }); } } async compareSnapshots() { const snapshots = await this.snapshotService.listSnapshots(); if (snapshots.length < 2) { console.log(terminal_1.colors.warning("\nNeed at least 2 snapshots to compare.")); return; } const snapshot1 = await (0, prompts_1.select)({ message: "Select first snapshot:", choices: snapshots.map((s) => ({ name: `${s.name} (height: ${s.blockHeight})`, value: s.id, })), }); const snapshot2 = await (0, prompts_1.select)({ message: "Select second snapshot:", choices: snapshots.map((s) => ({ name: `${s.name} (height: ${s.blockHeight})`, value: s.id, })), }); const diff = await this.snapshotService.diffSnapshots(snapshot1, snapshot2); console.log(chalk_1.default.bold("\nšŸ” Snapshot Comparison\n")); console.log(`${diff.snapshot1.name} → ${diff.snapshot2.name}`); console.log(`Block height difference: ${diff.heightDiff}`); console.log(`Wallets added: ${diff.walletsDiff.added.join(", ") || "none"}`); console.log(`Wallets removed: ${diff.walletsDiff.removed.join(", ") || "none"}`); } async deleteSnapshot() { const snapshots = await this.snapshotService.listSnapshots(); if (snapshots.length === 0) { console.log(terminal_1.colors.warning("\nNo snapshots to delete.")); return; } const snapshotIds = await (0, prompts_1.checkbox)({ message: "Select snapshots to delete:", choices: snapshots.map((s) => ({ name: `${s.name} (height: ${s.blockHeight})`, value: s.id, })), }); if (snapshotIds.length === 0) { return; } const confirmDelete = await (0, prompts_1.confirm)({ message: `Delete ${snapshotIds.length} snapshot(s)?`, default: false, }); if (confirmDelete) { for (const id of snapshotIds) { await this.snapshotService.deleteSnapshot(id); } } } } exports.SnapshotCommands = SnapshotCommands;