Tests. Autocomplete. Few Fixes. Mocks for Electrum Service. Template-to-Json parser. Fix global paths. Use IO Dependency injection for logging from cli. Additional commands in CLI.

This commit is contained in:
2026-04-20 10:30:38 +00:00
parent df4f438f6d
commit ff2fe126c6
44 changed files with 8220 additions and 1503 deletions

View File

@@ -7,10 +7,10 @@ import {
import type { XOInvitation } from "@xo-cash/types";
import { Invitation } from "./invitation.js";
import { Storage } from "./storage.js";
import { BaseStorage, Storage } from "./storage.js";
import { SyncServer } from "../utils/sync-server.js";
import { HistoryService } from "./history.js";
import { ElectrumService } from "./electrum.js";
import { type BlockchainService, ElectrumService } from "./electrum.js";
import { EventEmitter } from "../utils/event-emitter.js";
@@ -42,10 +42,10 @@ export interface AppConfig {
export class AppService extends EventEmitter<AppEventMap> {
public engine: Engine;
public storage: Storage;
public storage: BaseStorage;
public config: AppConfig;
public history: HistoryService;
public electrum: ElectrumService;
public electrum: BlockchainService;
public invitations: Invitation[] = [];
private invitationEventCleanup = new Map<
@@ -101,9 +101,9 @@ export class AppService extends EventEmitter<AppEventMap> {
constructor(
engine: Engine,
storage: Storage,
storage: BaseStorage,
config: AppConfig,
electrum: ElectrumService,
electrum: BlockchainService,
) {
super();
@@ -224,14 +224,14 @@ export class AppService extends EventEmitter<AppEventMap> {
*/
async unreserveAllResources(): Promise<number> {
const allUnspentOutputs = await this.engine.listUnspentOutputsData();
const reserved = allUnspentOutputs.filter((o) => o.reserved);
const reserved = allUnspentOutputs.filter((o) => o.reservedBy);
// Group by invitation identifier so the engine can clear them properly.
const byInvitation = new Map<string, typeof reserved>();
for (const output of reserved) {
const existing = byInvitation.get(output.invitationIdentifier) ?? [];
const existing = byInvitation.get(output.reservedBy!) ?? [];
existing.push(output);
byInvitation.set(output.invitationIdentifier, existing);
byInvitation.set(output.reservedBy!, existing);
}
for (const [invitationIdentifier, outputs] of byInvitation) {