From 26a61291a0e73006598a9d2598803a3e89aa3876 Mon Sep 17 00:00:00 2001 From: Jim Hamill Date: Thu, 24 Apr 2025 07:54:51 +0000 Subject: [PATCH] Make Blockchain Subscribe methods return Unsubscribe callback --- packages/stack/src/blockchain/base-blockchain.ts | 7 ++++--- packages/stack/src/blockchain/blockchain-electrum.ts | 6 ++++++ packages/stack/src/blockchain/blockchain-inmemory.ts | 7 +++++++ packages/stack/src/blockchain/types.ts | 2 ++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/stack/src/blockchain/base-blockchain.ts b/packages/stack/src/blockchain/base-blockchain.ts index 228bae9..9a60d5f 100644 --- a/packages/stack/src/blockchain/base-blockchain.ts +++ b/packages/stack/src/blockchain/base-blockchain.ts @@ -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, - ): Promise; + ): Promise; /** * Removes a subscription for a specific blockchain address. @@ -136,7 +137,7 @@ export abstract class BaseBlockchain< abstract subscribeAddress( address: string, callback: BlockchainCallback, - ): Promise; + ): Promise; /** * Removes a subscription for a specific blockchain address. @@ -163,7 +164,7 @@ export abstract class BaseBlockchain< abstract subscribeTransaction( transactionHash: string, callback: BlockchainCallback, - ): Promise; + ): Promise; /** * Removes a subscription for a specific transaction. diff --git a/packages/stack/src/blockchain/blockchain-electrum.ts b/packages/stack/src/blockchain/blockchain-electrum.ts index bffaded..bf55a8c 100644 --- a/packages/stack/src/blockchain/blockchain-electrum.ts +++ b/packages/stack/src/blockchain/blockchain-electrum.ts @@ -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( diff --git a/packages/stack/src/blockchain/blockchain-inmemory.ts b/packages/stack/src/blockchain/blockchain-inmemory.ts index bc486be..9ad9dc8 100644 --- a/packages/stack/src/blockchain/blockchain-inmemory.ts +++ b/packages/stack/src/blockchain/blockchain-inmemory.ts @@ -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( diff --git a/packages/stack/src/blockchain/types.ts b/packages/stack/src/blockchain/types.ts index 38b5459..4b07145 100644 --- a/packages/stack/src/blockchain/types.ts +++ b/packages/stack/src/blockchain/types.ts @@ -7,6 +7,8 @@ export type BlockchainCallback = ( payload?: Payload | undefined, ) => void; +export type BlockchainUnsubscribeCallback = () => Promise; + export type BlockchainTransaction = { hash: TransactionHash; height: number;