Make Blockchain Subscribe methods return Unsubscribe callback

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