Merge branch 'add_unsubscribe_callback_to_blockchain' into 'development'

Make Blockchain Subscribe methods return Unsubscribe callback

See merge request GeneralProtocols/xo/stack!78
This commit is contained in:
Jim Hamill
2025-04-24 07:54:51 +00:00
4 changed files with 19 additions and 3 deletions
@@ -4,6 +4,7 @@ import {
type BlockchainCallback,
type BlockchainUTXOs,
type BlockchainTransactions,
type BlockchainUnsubscribeCallback,
} from './types.js';
import { Transaction } from '@xocash/primitives';
@@ -109,7 +110,7 @@ export abstract class BaseBlockchain<
abstract subscribeLockscript(
lockscript: string | Uint8Array,
callback: BlockchainCallback<AddressNotificationPayload>,
): Promise<void>;
): Promise<BlockchainUnsubscribeCallback>;
/**
* Removes a subscription for a specific blockchain address.
@@ -136,7 +137,7 @@ export abstract class BaseBlockchain<
abstract subscribeAddress(
address: string,
callback: BlockchainCallback<AddressNotificationPayload>,
): Promise<void>;
): Promise<BlockchainUnsubscribeCallback>;
/**
* Removes a subscription for a specific blockchain address.
@@ -163,7 +164,7 @@ export abstract class BaseBlockchain<
abstract subscribeTransaction(
transactionHash: string,
callback: BlockchainCallback<TransactionNotificationPayload>,
): Promise<void>;
): Promise<BlockchainUnsubscribeCallback>;
/**
* Removes a subscription for a specific transaction.
@@ -397,6 +397,9 @@ export class BlockchainElectrum extends BaseBlockchain<
// Add the callback to the set
callbacks.add(callback);
// Return an unsubscribe callback.
return async () => await this.unsubscribeAddress(address, callback);
}
async unsubscribeAddress(
@@ -464,6 +467,9 @@ export class BlockchainElectrum extends BaseBlockchain<
// Add the callback to the set
callbacks.add(callback);
// Return an unsubscribe callback.
return async () => this.unsubscribeTransaction(transactionHash, callback);
}
async unsubscribeTransaction(
@@ -173,6 +173,9 @@ export class BlockchainInMemory extends BaseBlockchain {
// Add the address notification callback.
this.addressSubscriptions.get(lockscriptHex)!.add(callback);
// Return an unsubscribe callback.
return async () => await this.unsubscribeAddress(address, callback);
}
async unsubscribeAddress(address: string, callback: BlockchainCallback) {
@@ -206,6 +209,10 @@ export class BlockchainInMemory extends BaseBlockchain {
this.transactionSubscriptions.set(transactionHash, new Set());
}
this.transactionSubscriptions.get(transactionHash)!.add(callback);
// Return an unsubscribe callback.
return async () =>
await this.unsubscribeTransaction(transactionHash, callback);
}
async unsubscribeTransaction(
+2
View File
@@ -7,6 +7,8 @@ export type BlockchainCallback<Payload = undefined> = (
payload?: Payload | undefined,
) => void;
export type BlockchainUnsubscribeCallback = () => Promise<boolean>;
export type BlockchainTransaction = {
hash: TransactionHash;
height: number;