electrs backend request and error handling improvements
This commit is contained in:
		
							parent
							
								
									d1fce86adb
								
							
						
					
					
						commit
						67fb17f242
					
				@ -9,173 +9,218 @@ class ElectrsApi implements AbstractBitcoinApi {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getMempoolInfo(): Promise<IMempoolInfo> {
 | 
					  getMempoolInfo(): Promise<IMempoolInfo> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/mempool', { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/mempool', { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          resolve({
 | 
				
			||||||
 | 
					            size: response.count,
 | 
				
			||||||
 | 
					            bytes: response.vsize,
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve({
 | 
					 | 
				
			||||||
          size: response.count,
 | 
					 | 
				
			||||||
          bytes: response.vsize,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getRawMempool(): Promise<ITransaction['txid'][]> {
 | 
					  getRawMempool(): Promise<ITransaction['txid'][]> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/mempool/txids', { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/mempool/txids', { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getRawTransaction(txId: string): Promise<ITransaction> {
 | 
					  getRawTransaction(txId: string): Promise<ITransaction> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/tx/' + txId, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/tx/' + txId, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          response.vsize = Math.round(response.weight / 4);
 | 
				
			||||||
 | 
					          response.fee = response.fee / 100000000;
 | 
				
			||||||
 | 
					          response.blockhash = response.status.block_hash;
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        response.vsize = Math.round(response.weight / 4);
 | 
					 | 
				
			||||||
        response.fee = response.fee / 100000000;
 | 
					 | 
				
			||||||
        response.blockhash = response.status.block_hash;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlockCount(): Promise<number> {
 | 
					  getBlockCount(): Promise<number> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/blocks/tip/height', { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/blocks/tip/height', { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlockAndTransactions(hash: string): Promise<IBlock> {
 | 
					  getBlockAndTransactions(hash: string): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/block/' + hash, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/block/' + hash, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
        }
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
        request(config.ELECTRS_API_URL + '/block/' + hash + '/txids', { json: true }, (err2, res2, response2) => {
 | 
					          reject(response);
 | 
				
			||||||
          if (err2) {
 | 
					        } else {
 | 
				
			||||||
            reject(err2);
 | 
					          request(config.ELECTRS_API_URL + '/block/' + hash + '/txids', { json: true, timeout: 10000 }, (err2, res2, response2) => {
 | 
				
			||||||
          }
 | 
					            if (err2) {
 | 
				
			||||||
          const block = response;
 | 
					              reject(err2);
 | 
				
			||||||
          block.hash = hash;
 | 
					            } else if (res.statusCode !== 200) {
 | 
				
			||||||
          block.nTx = block.tx_count;
 | 
					              reject(response);
 | 
				
			||||||
          block.time = block.timestamp;
 | 
					            } else {
 | 
				
			||||||
          block.tx = response2;
 | 
					              const block = response;
 | 
				
			||||||
 | 
					              block.hash = hash;
 | 
				
			||||||
 | 
					              block.nTx = block.tx_count;
 | 
				
			||||||
 | 
					              block.time = block.timestamp;
 | 
				
			||||||
 | 
					              block.tx = response2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          resolve(block);
 | 
					              resolve(block);
 | 
				
			||||||
        });
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlockHash(height: number): Promise<string> {
 | 
					  getBlockHash(height: number): Promise<string> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/block-height/' + height, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/block-height/' + height, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlocks(): Promise<string> {
 | 
					  getBlocks(): Promise<string> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/blocks', { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/blocks', { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlocksFromHeight(height: number): Promise<string> {
 | 
					  getBlocksFromHeight(height: number): Promise<string> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/blocks/' + height, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/blocks/' + height, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlock(hash: string): Promise<IBlock> {
 | 
					  getBlock(hash: string): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/block/' + hash, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/block/' + hash, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlockTransactions(hash: string): Promise<IBlock> {
 | 
					  getBlockTransactions(hash: string): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/block/' + hash + '/txs', { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/block/' + hash + '/txs', { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlockTransactionsFromIndex(hash: string, index: number): Promise<IBlock> {
 | 
					  getBlockTransactionsFromIndex(hash: string, index: number): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/block/' + hash + '/txs/' + index, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/block/' + hash + '/txs/' + index, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getAddress(address: string): Promise<IBlock> {
 | 
					  getAddress(address: string): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/address/' + address, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/address/' + address, { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getAddressTransactions(address: string): Promise<IBlock> {
 | 
					  getAddressTransactions(address: string): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/address/' + address + '/txs', { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/address/' + address + '/txs', { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getAddressTransactionsFromLastSeenTxid(address: string, lastSeenTxid: string): Promise<IBlock> {
 | 
					  getAddressTransactionsFromLastSeenTxid(address: string, lastSeenTxid: string): Promise<IBlock> {
 | 
				
			||||||
    return new Promise(async (resolve, reject) => {
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
      request(config.ELECTRS_API_URL + '/address/' + address + '/txs/chain/' + lastSeenTxid, { json: true }, (err, res, response) => {
 | 
					      request(config.ELECTRS_API_URL + '/address/' + address + '/txs/chain/' + lastSeenTxid,
 | 
				
			||||||
 | 
					        { json: true, timeout: 10000 }, (err, res, response) => {
 | 
				
			||||||
        if (err) {
 | 
					        if (err) {
 | 
				
			||||||
          reject(err);
 | 
					          reject(err);
 | 
				
			||||||
 | 
					        } else if (res.statusCode !== 200) {
 | 
				
			||||||
 | 
					          reject(response);
 | 
				
			||||||
 | 
					        } else  {
 | 
				
			||||||
 | 
					          resolve(response);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        resolve(response);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -1619,10 +1619,10 @@ core-js@^2.4.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f"
 | 
					  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.10.tgz#8a5b8391f8cc7013da703411ce5b585706300d7f"
 | 
				
			||||||
  integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==
 | 
					  integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
core-js@^3.3.3:
 | 
					core-js@^3.4.1:
 | 
				
			||||||
  version "3.4.1"
 | 
					  version "3.4.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.4.1.tgz#76dd6828412900ab27c8ce0b22e6114d7ce21b18"
 | 
					  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.4.7.tgz#57c35937da80fe494fbc3adcf9cf3dc00eb86b34"
 | 
				
			||||||
  integrity sha512-KX/dnuY/J8FtEwbnrzmAjUYgLqtk+cxM86hfG60LGiW3MmltIc2yAmDgBgEkfm0blZhUrdr1Zd84J2Y14mLxzg==
 | 
					  integrity sha512-qaPVGw30J1wQ0GR3GvoPqlGf9GZfKKF4kFC7kiHlcsPTqH3txrs9crCp3ZiMAXuSenhz89Jnl4GZs/67S5VOSg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
core-util-is@1.0.2, core-util-is@~1.0.0:
 | 
					core-util-is@1.0.2, core-util-is@~1.0.0:
 | 
				
			||||||
  version "1.0.2"
 | 
					  version "1.0.2"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user