From c5796a8062371db2a87c114f59e22e66045507d6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 12 Apr 2020 03:03:51 +0700 Subject: [PATCH] Improved websocket tx/address tracking handling when disconnecting . --- backend/src/api/bitcoin/electrs-api.ts | 8 ++++-- .../components/address/address.component.ts | 8 ++++-- .../transaction/transaction.component.ts | 13 +++++++-- .../src/app/services/websocket.service.ts | 28 +++++++++++-------- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/backend/src/api/bitcoin/electrs-api.ts b/backend/src/api/bitcoin/electrs-api.ts index 4927f3f0c..565cf319e 100644 --- a/backend/src/api/bitcoin/electrs-api.ts +++ b/backend/src/api/bitcoin/electrs-api.ts @@ -131,8 +131,12 @@ class ElectrsApi { reject(err); } else if (res.statusCode !== 200) { reject(response); - } else { - resolve(response); + } else { + if (response.constructor === Object) { + resolve(response); + } else { + reject('getBlock returned invalid data'); + } } }); }); diff --git a/frontend/src/app/components/address/address.component.ts b/frontend/src/app/components/address/address.component.ts index 5ec5536f4..0293de689 100644 --- a/frontend/src/app/components/address/address.component.ts +++ b/frontend/src/app/components/address/address.component.ts @@ -7,7 +7,7 @@ import { WebsocketService } from 'src/app/services/websocket.service'; import { StateService } from 'src/app/services/state.service'; import { AudioService } from 'src/app/services/audio.service'; import { ApiService } from 'src/app/services/api.service'; -import { of, merge } from 'rxjs'; +import { of, merge, Subscription } from 'rxjs'; import { SeoService } from 'src/app/services/seo.service'; import { environment } from 'src/environments/environment'; @@ -25,6 +25,7 @@ export class AddressComponent implements OnInit, OnDestroy { transactions: Transaction[]; isLoadingTransactions = true; error: any; + mainSubscription: Subscription; totalConfirmedTxCount = 0; loadedConfirmedTxCount = 0; @@ -49,7 +50,7 @@ export class AddressComponent implements OnInit, OnDestroy { ngOnInit() { this.websocketService.want(['blocks', 'stats', 'mempool-blocks']); - this.route.paramMap + this.mainSubscription = this.route.paramMap .pipe( switchMap((params: ParamMap) => { this.error = undefined; @@ -192,6 +193,7 @@ export class AddressComponent implements OnInit, OnDestroy { } ngOnDestroy() { - this.websocketService.startTrackAddress('stop'); + this.mainSubscription.unsubscribe(); + this.websocketService.stopTrackingAddress(); } } diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index c510b9190..dd904727a 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -3,7 +3,7 @@ import { ElectrsApiService } from '../../services/electrs-api.service'; import { ActivatedRoute, ParamMap } from '@angular/router'; import { switchMap, filter, take } from 'rxjs/operators'; import { Transaction, Block } from '../../interfaces/electrs.interface'; -import { of, merge } from 'rxjs'; +import { of, merge, Subscription } from 'rxjs'; import { StateService } from '../../services/state.service'; import { WebsocketService } from '../../services/websocket.service'; import { AudioService } from 'src/app/services/audio.service'; @@ -28,6 +28,7 @@ export class TransactionComponent implements OnInit, OnDestroy { error: any = undefined; latestBlock: Block; transactionTime = -1; + subscription: Subscription; rightPosition = 0; @@ -42,7 +43,7 @@ export class TransactionComponent implements OnInit, OnDestroy { ) { } ngOnInit() { - this.route.paramMap.pipe( + this.subscription = this.route.paramMap.pipe( switchMap((params: ParamMap) => { this.txId = params.get('id') || ''; this.seoService.setTitle('Transaction: ' + this.txId, true); @@ -51,6 +52,7 @@ export class TransactionComponent implements OnInit, OnDestroy { this.isLoadingTx = true; this.transactionTime = -1; document.body.scrollTo(0, 0); + this.leaveTransaction(); return merge( of(true), this.stateService.connectionState$ @@ -160,7 +162,12 @@ export class TransactionComponent implements OnInit, OnDestroy { } ngOnDestroy() { - this.websocketService.startTrackTransaction('stop'); + this.subscription.unsubscribe(); + this.leaveTransaction(); + } + + leaveTransaction() { + this.websocketService.stopTrackingTransaction(); this.stateService.markBlock$.next({}); } } diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index 906714520..86132621d 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -15,8 +15,7 @@ export class WebsocketService { private websocketSubject: WebSocketSubject = webSocket(WEB_SOCKET_URL); private goneOffline = false; private lastWant: string[] | null = null; - private trackingTxId: string | null = null; - private trackingAddress: string | null = null; + private isTrackingTx = false; private latestGitCommit = ''; private onlineCheckTimeout: number; private onlineCheckTimeoutTwo: number; @@ -52,7 +51,7 @@ export class WebsocketService { } if (response.txConfirmed) { - this.trackingTxId = null; + this.isTrackingTx = false; this.stateService.txConfirmed$.next(response.block); } } @@ -105,12 +104,6 @@ export class WebsocketService { if (this.lastWant) { this.want(this.lastWant); } - if (this.trackingTxId) { - this.startTrackTransaction(this.trackingTxId); - } - if (this.trackingAddress) { - this.startTrackTransaction(this.trackingAddress); - } this.stateService.connectionState$.next(2); } @@ -129,12 +122,23 @@ export class WebsocketService { startTrackTransaction(txId: string) { this.websocketSubject.next({ 'track-tx': txId }); - this.trackingTxId = txId; + this.isTrackingTx = true; + } + + stopTrackingTransaction() { + if (this.isTrackingTx === false) { + return; + } + this.websocketSubject.next({ 'track-tx': 'stop' }); + this.isTrackingTx = false; } startTrackAddress(address: string) { this.websocketSubject.next({ 'track-address': address }); - this.trackingAddress = address; + } + + stopTrackingAddress() { + this.websocketSubject.next({ 'track-address': 'stop' }); } fetchStatistics(historicalDate: string) { @@ -168,6 +172,6 @@ export class WebsocketService { this.goOffline(); } }, 1000); - }, 10000); + }, 30000); } }