Cache electrum address history fetch a couple of seconds to prevent double requests on address page load.
This commit is contained in:
		
							parent
							
								
									9a23d2c6b0
								
							
						
					
					
						commit
						c4d1fad853
					
				@ -11,6 +11,7 @@ import * as ElectrumClient from '@mempool/electrum-client';
 | 
			
		||||
import * as sha256 from 'crypto-js/sha256';
 | 
			
		||||
import * as hexEnc from 'crypto-js/enc-hex';
 | 
			
		||||
import loadingIndicators from '../loading-indicators';
 | 
			
		||||
import memoryCache from '../memory-cache';
 | 
			
		||||
 | 
			
		||||
class BitcoindElectrsApi extends BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
  private electrumClient: any;
 | 
			
		||||
@ -158,7 +159,15 @@ class BitcoindElectrsApi extends BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private $getScriptHashHistory(scriptHash: string): Promise<IElectrumApi.ScriptHashHistory[]> {
 | 
			
		||||
    return this.electrumClient.blockchainScripthash_getHistory(this.encodeScriptHash(scriptHash));
 | 
			
		||||
    const fromCache = memoryCache.get<IElectrumApi.ScriptHashHistory[]>('Scripthash_getHistory', scriptHash);
 | 
			
		||||
    if (fromCache) {
 | 
			
		||||
      return Promise.resolve(fromCache);
 | 
			
		||||
    }
 | 
			
		||||
    return this.electrumClient.blockchainScripthash_getHistory(this.encodeScriptHash(scriptHash))
 | 
			
		||||
      .then((history) => {
 | 
			
		||||
        memoryCache.set('Scripthash_getHistory', scriptHash, history, 2);
 | 
			
		||||
        return history;
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private encodeScriptHash(scriptPubKey: string): string {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										38
									
								
								backend/src/api/memory-cache.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								backend/src/api/memory-cache.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
			
		||||
interface ICache {
 | 
			
		||||
  type: string;
 | 
			
		||||
  id: string;
 | 
			
		||||
  expires: Date;
 | 
			
		||||
  data: any;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class MemoryCache {
 | 
			
		||||
  private cache: ICache[] = [];
 | 
			
		||||
  constructor() {
 | 
			
		||||
    setInterval(this.cleanup.bind(this), 1000);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public set(type: string, id: string, data: any, secondsExpiry: number) {
 | 
			
		||||
    const expiry = new Date();
 | 
			
		||||
    expiry.setSeconds(expiry.getSeconds() + secondsExpiry);
 | 
			
		||||
    this.cache.push({
 | 
			
		||||
      type: type,
 | 
			
		||||
      id: id,
 | 
			
		||||
      data: data,
 | 
			
		||||
      expires: expiry,
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public get<T>(type: string, id: string): T | null {
 | 
			
		||||
    const found = this.cache.find((cache) => cache.type === type && cache.id === id);
 | 
			
		||||
    if (found) {
 | 
			
		||||
      return found.data;
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private cleanup() {
 | 
			
		||||
    this.cache = this.cache.filter((cache) => cache.expires < (new Date()));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default new MemoryCache();
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user