Separate tomahawk nodes & network pages, misc fixes
This commit is contained in:
		
							parent
							
								
									5f3ca3a321
								
							
						
					
					
						commit
						73e9c85ff1
					
				@ -6,7 +6,6 @@ import { EightBlocksComponent } from './components/eight-blocks/eight-blocks.com
 | 
				
			|||||||
import { MempoolBlockViewComponent } from './components/mempool-block-view/mempool-block-view.component';
 | 
					import { MempoolBlockViewComponent } from './components/mempool-block-view/mempool-block-view.component';
 | 
				
			||||||
import { ClockComponent } from './components/clock/clock.component';
 | 
					import { ClockComponent } from './components/clock/clock.component';
 | 
				
			||||||
import { StatusViewComponent } from './components/status-view/status-view.component';
 | 
					import { StatusViewComponent } from './components/status-view/status-view.component';
 | 
				
			||||||
import { ServerHealthComponent } from './components/server-health/server-health.component';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const browserWindow = window || {};
 | 
					const browserWindow = window || {};
 | 
				
			||||||
// @ts-ignore
 | 
					// @ts-ignore
 | 
				
			||||||
@ -32,11 +31,6 @@ let routes: Routes = [
 | 
				
			|||||||
        data: { networks: ['bitcoin', 'liquid'] },
 | 
					        data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
        component: StatusViewComponent
 | 
					        component: StatusViewComponent
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: 'nodes',
 | 
					 | 
				
			||||||
        data: { networks: ['bitcoin', 'liquid'] },
 | 
					 | 
				
			||||||
        component: ServerHealthComponent
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: '',
 | 
					        path: '',
 | 
				
			||||||
        loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule),
 | 
					        loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule),
 | 
				
			||||||
@ -72,11 +66,6 @@ let routes: Routes = [
 | 
				
			|||||||
        data: { networks: ['bitcoin', 'liquid'] },
 | 
					        data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
        component: StatusViewComponent
 | 
					        component: StatusViewComponent
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        path: 'nodes',
 | 
					 | 
				
			||||||
        data: { networks: ['bitcoin', 'liquid'] },
 | 
					 | 
				
			||||||
        component: ServerHealthComponent
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        path: '',
 | 
					        path: '',
 | 
				
			||||||
        loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule),
 | 
					        loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule),
 | 
				
			||||||
@ -145,11 +134,6 @@ let routes: Routes = [
 | 
				
			|||||||
    data: { networks: ['bitcoin', 'liquid'] },
 | 
					    data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
    component: StatusViewComponent
 | 
					    component: StatusViewComponent
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    path: 'nodes',
 | 
					 | 
				
			||||||
    data: { networks: ['bitcoin', 'liquid'] },
 | 
					 | 
				
			||||||
    component: ServerHealthComponent
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    path: '',
 | 
					    path: '',
 | 
				
			||||||
    loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule),
 | 
					    loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule),
 | 
				
			||||||
@ -189,11 +173,6 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') {
 | 
				
			|||||||
          data: { networks: ['bitcoin', 'liquid'] },
 | 
					          data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
          component: StatusViewComponent
 | 
					          component: StatusViewComponent
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          path: 'nodes',
 | 
					 | 
				
			||||||
          data: { networks: ['bitcoin', 'liquid'] },
 | 
					 | 
				
			||||||
          component: ServerHealthComponent
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          path: '',
 | 
					          path: '',
 | 
				
			||||||
          loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule),
 | 
					          loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule),
 | 
				
			||||||
@ -234,11 +213,6 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') {
 | 
				
			|||||||
      data: { networks: ['bitcoin', 'liquid']},
 | 
					      data: { networks: ['bitcoin', 'liquid']},
 | 
				
			||||||
      component: StatusViewComponent
 | 
					      component: StatusViewComponent
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      path: 'nodes',
 | 
					 | 
				
			||||||
      data: { networks: ['bitcoin', 'liquid'] },
 | 
					 | 
				
			||||||
      component: ServerHealthComponent
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      path: '',
 | 
					      path: '',
 | 
				
			||||||
      loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule),
 | 
					      loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule),
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,10 @@
 | 
				
			|||||||
<div class="tomahawk">
 | 
					<div class="tomahawk container-xl dashboard-container">
 | 
				
			||||||
 | 
					  <div class="links">
 | 
				
			||||||
 | 
					    <span>Status</span>
 | 
				
			||||||
 | 
					    <a [routerLink]='"/network"'>Live</a>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <h1 class="dashboard-title">Node Status</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <ng-container *ngIf="(hosts$ | async) as hosts">
 | 
					  <ng-container *ngIf="(hosts$ | async) as hosts">
 | 
				
			||||||
    <div class="status-panel">
 | 
					    <div class="status-panel">
 | 
				
			||||||
      <table class="status-table table table-borderless table-striped" *ngIf="(tip$ | async) as tip">
 | 
					      <table class="status-table table table-borderless table-striped" *ngIf="(tip$ | async) as tip">
 | 
				
			||||||
@ -9,7 +15,7 @@
 | 
				
			|||||||
            <th class="rtt">RTT</th>
 | 
					            <th class="rtt">RTT</th>
 | 
				
			||||||
            <th class="height">Height</th>
 | 
					            <th class="height">Height</th>
 | 
				
			||||||
          </tr>
 | 
					          </tr>
 | 
				
			||||||
          <tr *ngFor="let host of hosts;" (click)="scrollTo(host)">
 | 
					          <tr *ngFor="let host of hosts;">
 | 
				
			||||||
            <td class="active"><span *ngIf="host.active">⭐️</span></td>
 | 
					            <td class="active"><span *ngIf="host.active">⭐️</span></td>
 | 
				
			||||||
            <td class="host">{{ host.host }}</td>
 | 
					            <td class="host">{{ host.host }}</td>
 | 
				
			||||||
            <td class="rtt">{{ host.rtt | number : '1.0-0' }} {{ host.rtt == null ? '' : 'ms'}} {{ !host.checked ? '⏳' : (host.unreachable ? '🔥' : '✅') }}</td>
 | 
					            <td class="rtt">{{ host.rtt | number : '1.0-0' }} {{ host.rtt == null ? '' : 'ms'}} {{ !host.checked ? '⏳' : (host.unreachable ? '🔥' : '✅') }}</td>
 | 
				
			||||||
@ -19,11 +25,4 @@
 | 
				
			|||||||
      </table>
 | 
					      </table>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </ng-container>
 | 
					  </ng-container>
 | 
				
			||||||
 | 
					 | 
				
			||||||
  <ng-container *ngFor="let host of hosts; trackBy: trackByFn">
 | 
					 | 
				
			||||||
    <h5 [id]="host.host" class="hostLink">
 | 
					 | 
				
			||||||
      <a [href]="host.link">{{ host.link }}</a>
 | 
					 | 
				
			||||||
    </h5>
 | 
					 | 
				
			||||||
    <iframe class="mempoolStatus" [src]="host.statusPage"></iframe>
 | 
					 | 
				
			||||||
  </ng-container>
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,18 @@
 | 
				
			|||||||
.tomahawk {
 | 
					.tomahawk {
 | 
				
			||||||
 | 
					  .links {
 | 
				
			||||||
 | 
					    float: right;
 | 
				
			||||||
 | 
					    text-align: right;
 | 
				
			||||||
 | 
					    margin-top: 1em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    a, span {
 | 
				
			||||||
 | 
					      margin-left: 1em;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .dashboard-title {
 | 
				
			||||||
 | 
					    text-align: left;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .status-panel {
 | 
					  .status-panel {
 | 
				
			||||||
    max-width: 720px;
 | 
					    max-width: 720px;
 | 
				
			||||||
    margin: auto;
 | 
					    margin: auto;
 | 
				
			||||||
@ -16,20 +30,5 @@
 | 
				
			|||||||
        text-align: right;
 | 
					        text-align: right;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    td {
 | 
					 | 
				
			||||||
      cursor: pointer;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .mempoolStatus {
 | 
					 | 
				
			||||||
    width: 100%;
 | 
					 | 
				
			||||||
    height: 270px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .hostLink {
 | 
					 | 
				
			||||||
    text-align: center;
 | 
					 | 
				
			||||||
    margin: auto;
 | 
					 | 
				
			||||||
    margin-top: 1em;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { Component, OnInit, ChangeDetectionStrategy, SecurityContext, OnDestroy } from '@angular/core';
 | 
					import { Component, OnInit, ChangeDetectionStrategy, SecurityContext } from '@angular/core';
 | 
				
			||||||
import { WebsocketService } from '../../services/websocket.service';
 | 
					import { WebsocketService } from '../../services/websocket.service';
 | 
				
			||||||
import { Observable, Subject, map, tap } from 'rxjs';
 | 
					import { Observable, Subject, map } from 'rxjs';
 | 
				
			||||||
import { StateService } from '../../services/state.service';
 | 
					import { StateService } from '../../services/state.service';
 | 
				
			||||||
import { HealthCheckHost } from '../../interfaces/websocket.interface';
 | 
					import { HealthCheckHost } from '../../interfaces/websocket.interface';
 | 
				
			||||||
import { DomSanitizer } from '@angular/platform-browser';
 | 
					import { DomSanitizer } from '@angular/platform-browser';
 | 
				
			||||||
@ -11,10 +11,9 @@ import { DomSanitizer } from '@angular/platform-browser';
 | 
				
			|||||||
  styleUrls: ['./server-health.component.scss'],
 | 
					  styleUrls: ['./server-health.component.scss'],
 | 
				
			||||||
  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
export class ServerHealthComponent implements OnInit, OnDestroy {
 | 
					export class ServerHealthComponent implements OnInit {
 | 
				
			||||||
  hosts$: Observable<HealthCheckHost[]>;
 | 
					  hosts$: Observable<HealthCheckHost[]>;
 | 
				
			||||||
  tip$: Subject<number>;
 | 
					  tip$: Subject<number>;
 | 
				
			||||||
  hosts: HealthCheckHost[] = [];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(
 | 
					  constructor(
 | 
				
			||||||
    private websocketService: WebsocketService,
 | 
					    private websocketService: WebsocketService,
 | 
				
			||||||
@ -33,36 +32,17 @@ export class ServerHealthComponent implements OnInit, OnDestroy {
 | 
				
			|||||||
            statusUrl = window.location.host + subpath + '/status';
 | 
					            statusUrl = window.location.host + subpath + '/status';
 | 
				
			||||||
            linkHost = window.location.host + subpath;
 | 
					            linkHost = window.location.host + subpath;
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            statusUrl = host.host.slice(0, -4) + subpath + '/status';
 | 
					            const hostUrl = new URL(host.host);
 | 
				
			||||||
            linkHost = host.host.slice(0, -4) + subpath;
 | 
					            statusUrl = 'https://' + hostUrl.hostname + subpath + '/status';
 | 
				
			||||||
 | 
					            linkHost = hostUrl.hostname + subpath;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          host.statusPage = this.sanitizer.bypassSecurityTrustResourceUrl(this.sanitizer.sanitize(SecurityContext.URL, statusUrl));
 | 
					          host.statusPage = this.sanitizer.bypassSecurityTrustResourceUrl(this.sanitizer.sanitize(SecurityContext.URL, statusUrl));
 | 
				
			||||||
          host.link = linkHost;
 | 
					          host.link = linkHost;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return hosts;
 | 
					        return hosts;
 | 
				
			||||||
      }),
 | 
					 | 
				
			||||||
      tap((hosts) => {
 | 
					 | 
				
			||||||
        if (this.hosts.length !== hosts.length) {
 | 
					 | 
				
			||||||
          this.hosts = hosts;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    this.tip$ = this.stateService.chainTip$;
 | 
					    this.tip$ = this.stateService.chainTip$;
 | 
				
			||||||
    this.websocketService.want(['blocks', 'tomahawk']);
 | 
					    this.websocketService.want(['blocks', 'tomahawk']);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  scrollTo(host: HealthCheckHost): void {
 | 
					 | 
				
			||||||
    const el = document.getElementById(host.host);
 | 
					 | 
				
			||||||
    if (el) {
 | 
					 | 
				
			||||||
      el.scrollIntoView();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  trackByFn(index: number, host: HealthCheckHost): string {
 | 
					 | 
				
			||||||
    return host.host;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ngOnDestroy(): void {
 | 
					 | 
				
			||||||
    this.hosts = [];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<div class="tomahawk container-xl dashboard-container">
 | 
				
			||||||
 | 
					  <div class="links">
 | 
				
			||||||
 | 
					    <a [routerLink]='"/nodes"'>Status</a>
 | 
				
			||||||
 | 
					    <span>Live</span>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <h1 class="dashboard-title">Live Network</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <ng-container *ngFor="let host of hosts; trackBy: trackByFn">
 | 
				
			||||||
 | 
					    <h5 [id]="host.host" class="hostLink">
 | 
				
			||||||
 | 
					      <a [href]="'https://' + host.link">{{ host.link }}</a>
 | 
				
			||||||
 | 
					    </h5>
 | 
				
			||||||
 | 
					    <iframe class="mempoolStatus" [src]="host.statusPage"></iframe>
 | 
				
			||||||
 | 
					  </ng-container>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					.tomahawk {
 | 
				
			||||||
 | 
					  .links {
 | 
				
			||||||
 | 
					    float: right;
 | 
				
			||||||
 | 
					    text-align: right;
 | 
				
			||||||
 | 
					    margin-top: 1em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    a, span {
 | 
				
			||||||
 | 
					      margin-left: 1em;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .dashboard-title {
 | 
				
			||||||
 | 
					    text-align: left;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .mempoolStatus {
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    height: 270px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .hostLink {
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					    margin: auto;
 | 
				
			||||||
 | 
					    margin-top: 1em;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					import { Component, OnInit, ChangeDetectionStrategy, SecurityContext, OnDestroy, ChangeDetectorRef } from '@angular/core';
 | 
				
			||||||
 | 
					import { WebsocketService } from '../../services/websocket.service';
 | 
				
			||||||
 | 
					import { Observable, Subject, Subscription, map, tap } from 'rxjs';
 | 
				
			||||||
 | 
					import { StateService } from '../../services/state.service';
 | 
				
			||||||
 | 
					import { HealthCheckHost } from '../../interfaces/websocket.interface';
 | 
				
			||||||
 | 
					import { DomSanitizer } from '@angular/platform-browser';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'app-server-status',
 | 
				
			||||||
 | 
					  templateUrl: './server-status.component.html',
 | 
				
			||||||
 | 
					  styleUrls: ['./server-status.component.scss'],
 | 
				
			||||||
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class ServerStatusComponent implements OnInit, OnDestroy {
 | 
				
			||||||
 | 
					  tip$: Subject<number>;
 | 
				
			||||||
 | 
					  hosts: HealthCheckHost[] = [];
 | 
				
			||||||
 | 
					  hostSubscription: Subscription;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private websocketService: WebsocketService,
 | 
				
			||||||
 | 
					    private stateService: StateService,
 | 
				
			||||||
 | 
					    private cd: ChangeDetectorRef,
 | 
				
			||||||
 | 
					    public sanitizer: DomSanitizer,
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ngOnInit(): void {
 | 
				
			||||||
 | 
					    this.hostSubscription = this.stateService.serverHealth$.pipe(
 | 
				
			||||||
 | 
					      map((hosts) => {
 | 
				
			||||||
 | 
					        const subpath = window.location.pathname.slice(0, -8);
 | 
				
			||||||
 | 
					        for (const host of hosts) {
 | 
				
			||||||
 | 
					          let statusUrl = '';
 | 
				
			||||||
 | 
					          let linkHost = '';
 | 
				
			||||||
 | 
					          if (host.socket) {
 | 
				
			||||||
 | 
					            statusUrl = window.location.host + subpath + '/status';
 | 
				
			||||||
 | 
					            linkHost = window.location.host + subpath;
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            const hostUrl = new URL(host.host);
 | 
				
			||||||
 | 
					            statusUrl = 'https://' + hostUrl.hostname + subpath + '/status';
 | 
				
			||||||
 | 
					            linkHost = hostUrl.hostname + subpath;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          host.statusPage = this.sanitizer.bypassSecurityTrustResourceUrl(this.sanitizer.sanitize(SecurityContext.URL, statusUrl));
 | 
				
			||||||
 | 
					          host.link = linkHost;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return hosts;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      tap((hosts) => {
 | 
				
			||||||
 | 
					        if (this.hosts.length !== hosts.length) {
 | 
				
			||||||
 | 
					          this.hosts = hosts.sort((a,b) => {
 | 
				
			||||||
 | 
					            const aParts = (a.host?.split('.') || []).reverse();
 | 
				
			||||||
 | 
					            const bParts = (b.host?.split('.') || []).reverse();
 | 
				
			||||||
 | 
					            let i = 0;
 | 
				
			||||||
 | 
					            while (i < Math.max(aParts.length, bParts.length)) {
 | 
				
			||||||
 | 
					              if (aParts[i] && !bParts[i]) {
 | 
				
			||||||
 | 
					                return 1;
 | 
				
			||||||
 | 
					              } else if (bParts[i] && !aParts[i]) {
 | 
				
			||||||
 | 
					                return -1;
 | 
				
			||||||
 | 
					              } else if (aParts[i] !== bParts[i]) {
 | 
				
			||||||
 | 
					                return aParts[i].localeCompare(bParts[i]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              i++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return 0;
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.cd.markForCheck();
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    ).subscribe();
 | 
				
			||||||
 | 
					    this.tip$ = this.stateService.chainTip$;
 | 
				
			||||||
 | 
					    this.websocketService.want(['blocks', 'tomahawk']);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  trackByFn(index: number, host: HealthCheckHost): string {
 | 
				
			||||||
 | 
					    return host.host;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ngOnDestroy(): void {
 | 
				
			||||||
 | 
					    this.hosts = [];
 | 
				
			||||||
 | 
					    this.hostSubscription.unsubscribe();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -19,6 +19,8 @@ import { RecentPegsListComponent } from '../components/liquid-reserves-audit/rec
 | 
				
			|||||||
import { FederationWalletComponent } from '../components/liquid-reserves-audit/federation-wallet/federation-wallet.component';
 | 
					import { FederationWalletComponent } from '../components/liquid-reserves-audit/federation-wallet/federation-wallet.component';
 | 
				
			||||||
import { FederationUtxosListComponent } from '../components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component';
 | 
					import { FederationUtxosListComponent } from '../components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component';
 | 
				
			||||||
import { FederationAddressesListComponent } from '../components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component';
 | 
					import { FederationAddressesListComponent } from '../components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component';
 | 
				
			||||||
 | 
					import { ServerHealthComponent } from '../components/server-health/server-health.component';
 | 
				
			||||||
 | 
					import { ServerStatusComponent } from '../components/server-health/server-status.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const routes: Routes = [
 | 
					const routes: Routes = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -140,6 +142,19 @@ const routes: Routes = [
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (window['__env']?.OFFICIAL_MEMPOOL_SPACE) {
 | 
				
			||||||
 | 
					  routes[0].children.push({
 | 
				
			||||||
 | 
					    path: 'nodes',
 | 
				
			||||||
 | 
					    data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
 | 
					    component: ServerHealthComponent
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  routes[0].children.push({
 | 
				
			||||||
 | 
					    path: 'network',
 | 
				
			||||||
 | 
					    data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
 | 
					    component: ServerStatusComponent
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@NgModule({
 | 
					@NgModule({
 | 
				
			||||||
  imports: [
 | 
					  imports: [
 | 
				
			||||||
    RouterModule.forChild(routes)
 | 
					    RouterModule.forChild(routes)
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,8 @@ import { PushTransactionComponent } from './components/push-transaction/push-tra
 | 
				
			|||||||
import { CalculatorComponent } from './components/calculator/calculator.component';
 | 
					import { CalculatorComponent } from './components/calculator/calculator.component';
 | 
				
			||||||
import { BlocksList } from './components/blocks-list/blocks-list.component';
 | 
					import { BlocksList } from './components/blocks-list/blocks-list.component';
 | 
				
			||||||
import { RbfList } from './components/rbf-list/rbf-list.component';
 | 
					import { RbfList } from './components/rbf-list/rbf-list.component';
 | 
				
			||||||
 | 
					import { ServerHealthComponent } from './components/server-health/server-health.component';
 | 
				
			||||||
 | 
					import { ServerStatusComponent } from './components/server-health/server-status.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const browserWindow = window || {};
 | 
					const browserWindow = window || {};
 | 
				
			||||||
// @ts-ignore
 | 
					// @ts-ignore
 | 
				
			||||||
@ -96,6 +98,19 @@ const routes: Routes = [
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (window['__env']?.OFFICIAL_MEMPOOL_SPACE) {
 | 
				
			||||||
 | 
					  routes[0].children.push({
 | 
				
			||||||
 | 
					    path: 'nodes',
 | 
				
			||||||
 | 
					    data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
 | 
					    component: ServerHealthComponent
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  routes[0].children.push({
 | 
				
			||||||
 | 
					    path: 'network',
 | 
				
			||||||
 | 
					    data: { networks: ['bitcoin', 'liquid'] },
 | 
				
			||||||
 | 
					    component: ServerStatusComponent
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@NgModule({
 | 
					@NgModule({
 | 
				
			||||||
  imports: [
 | 
					  imports: [
 | 
				
			||||||
    RouterModule.forChild(routes)
 | 
					    RouterModule.forChild(routes)
 | 
				
			||||||
 | 
				
			|||||||
@ -54,6 +54,7 @@ import { AssetsComponent } from '../components/assets/assets.component';
 | 
				
			|||||||
import { AssetsNavComponent } from '../components/assets/assets-nav/assets-nav.component';
 | 
					import { AssetsNavComponent } from '../components/assets/assets-nav/assets-nav.component';
 | 
				
			||||||
import { StatusViewComponent } from '../components/status-view/status-view.component';
 | 
					import { StatusViewComponent } from '../components/status-view/status-view.component';
 | 
				
			||||||
import { ServerHealthComponent } from '../components/server-health/server-health.component';
 | 
					import { ServerHealthComponent } from '../components/server-health/server-health.component';
 | 
				
			||||||
 | 
					import { ServerStatusComponent } from '../components/server-health/server-status.component';
 | 
				
			||||||
import { FeesBoxComponent } from '../components/fees-box/fees-box.component';
 | 
					import { FeesBoxComponent } from '../components/fees-box/fees-box.component';
 | 
				
			||||||
import { DifficultyComponent } from '../components/difficulty/difficulty.component';
 | 
					import { DifficultyComponent } from '../components/difficulty/difficulty.component';
 | 
				
			||||||
import { DifficultyTooltipComponent } from '../components/difficulty/difficulty-tooltip.component';
 | 
					import { DifficultyTooltipComponent } from '../components/difficulty/difficulty-tooltip.component';
 | 
				
			||||||
@ -153,6 +154,7 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir
 | 
				
			|||||||
    AssetsComponent,
 | 
					    AssetsComponent,
 | 
				
			||||||
    StatusViewComponent,
 | 
					    StatusViewComponent,
 | 
				
			||||||
    ServerHealthComponent,
 | 
					    ServerHealthComponent,
 | 
				
			||||||
 | 
					    ServerStatusComponent,
 | 
				
			||||||
    FeesBoxComponent,
 | 
					    FeesBoxComponent,
 | 
				
			||||||
    DifficultyComponent,
 | 
					    DifficultyComponent,
 | 
				
			||||||
    DifficultyMiningComponent,
 | 
					    DifficultyMiningComponent,
 | 
				
			||||||
@ -280,6 +282,7 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir
 | 
				
			|||||||
    AssetsComponent,
 | 
					    AssetsComponent,
 | 
				
			||||||
    StatusViewComponent,
 | 
					    StatusViewComponent,
 | 
				
			||||||
    ServerHealthComponent,
 | 
					    ServerHealthComponent,
 | 
				
			||||||
 | 
					    ServerStatusComponent,
 | 
				
			||||||
    FeesBoxComponent,
 | 
					    FeesBoxComponent,
 | 
				
			||||||
    DifficultyComponent,
 | 
					    DifficultyComponent,
 | 
				
			||||||
    DifficultyMiningComponent,
 | 
					    DifficultyMiningComponent,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user