convert soft 404s to hard 404s in unfurler ssr

This commit is contained in:
Mononaut 2023-03-09 02:34:21 -06:00
parent 2f3e498906
commit 105cccf9b0
No known key found for this signature in database
GPG Key ID: A3F058E41374C04E
19 changed files with 90 additions and 9 deletions

View File

@ -47,6 +47,7 @@ export class BisqAddressComponent implements OnInit, OnDestroy {
catchError((err) => { catchError((err) => {
this.isLoadingAddress = false; this.isLoadingAddress = false;
this.error = err; this.error = err;
this.seoService.logSoft404();
console.log(err); console.log(err);
return of(null); return of(null);
}) })
@ -62,6 +63,7 @@ export class BisqAddressComponent implements OnInit, OnDestroy {
(error) => { (error) => {
console.log(error); console.log(error);
this.error = error; this.error = error;
this.seoService.logSoft404();
this.isLoadingAddress = false; this.isLoadingAddress = false;
}); });
} }

View File

@ -82,6 +82,7 @@ export class BisqBlockComponent implements OnInit, OnDestroy {
) )
.subscribe((block: BisqBlock) => { .subscribe((block: BisqBlock) => {
if (!block) { if (!block) {
this.seoService.logSoft404();
return; return;
} }
this.isLoading = false; this.isLoading = false;
@ -97,6 +98,7 @@ export class BisqBlockComponent implements OnInit, OnDestroy {
caughtHttpError(err: HttpErrorResponse){ caughtHttpError(err: HttpErrorResponse){
this.error = err; this.error = err;
this.seoService.logSoft404();
return of(null); return of(null);
} }
} }

View File

@ -70,11 +70,13 @@ export class BisqTransactionComponent implements OnInit, OnDestroy {
catchError((txError: HttpErrorResponse) => { catchError((txError: HttpErrorResponse) => {
console.log(txError); console.log(txError);
this.error = txError; this.error = txError;
this.seoService.logSoft404();
return of(null); return of(null);
}) })
); );
} }
this.error = bisqTxError; this.error = bisqTxError;
this.seoService.logSoft404();
return of(null); return of(null);
}) })
); );
@ -103,6 +105,7 @@ export class BisqTransactionComponent implements OnInit, OnDestroy {
this.isLoadingTx = false; this.isLoadingTx = false;
if (!tx) { if (!tx) {
this.seoService.logSoft404();
return; return;
} }

View File

@ -88,6 +88,7 @@ export class AddressComponent implements OnInit, OnDestroy {
catchError((err) => { catchError((err) => {
this.isLoadingAddress = false; this.isLoadingAddress = false;
this.error = err; this.error = err;
this.seoService.logSoft404();
console.log(err); console.log(err);
return of(null); return of(null);
}) })
@ -157,6 +158,7 @@ export class AddressComponent implements OnInit, OnDestroy {
(error) => { (error) => {
console.log(error); console.log(error);
this.error = error; this.error = error;
this.seoService.logSoft404();
this.isLoadingAddress = false; this.isLoadingAddress = false;
}); });

View File

@ -86,6 +86,7 @@ export class AssetComponent implements OnInit, OnDestroy {
catchError((err) => { catchError((err) => {
this.isLoadingAsset = false; this.isLoadingAsset = false;
this.error = err; this.error = err;
this.seoService.logSoft404();
console.log(err); console.log(err);
return of(null); return of(null);
}) })
@ -153,6 +154,7 @@ export class AssetComponent implements OnInit, OnDestroy {
(error) => { (error) => {
console.log(error); console.log(error);
this.error = error; this.error = error;
this.seoService.logSoft404();
this.isLoadingAsset = false; this.isLoadingAsset = false;
}); });

View File

@ -82,6 +82,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy {
}), }),
catchError((err) => { catchError((err) => {
this.error = err; this.error = err;
this.seoService.logSoft404();
this.openGraphService.fail('block-data-' + this.rawId); this.openGraphService.fail('block-data-' + this.rawId);
this.openGraphService.fail('block-viz-' + this.rawId); this.openGraphService.fail('block-viz-' + this.rawId);
return of(null); return of(null);
@ -138,6 +139,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy {
(error) => { (error) => {
this.error = error; this.error = error;
this.isLoadingOverview = false; this.isLoadingOverview = false;
this.seoService.logSoft404();
this.openGraphService.fail('block-viz-' + this.rawId); this.openGraphService.fail('block-viz-' + this.rawId);
this.openGraphService.fail('block-data-' + this.rawId); this.openGraphService.fail('block-data-' + this.rawId);
if (this.blockGraph) { if (this.blockGraph) {

View File

@ -192,6 +192,7 @@ export class BlockComponent implements OnInit, OnDestroy {
this.error = err; this.error = err;
this.isLoadingBlock = false; this.isLoadingBlock = false;
this.isLoadingOverview = false; this.isLoadingOverview = false;
this.seoService.logSoft404();
return EMPTY; return EMPTY;
}) })
); );
@ -200,6 +201,7 @@ export class BlockComponent implements OnInit, OnDestroy {
this.error = err; this.error = err;
this.isLoadingBlock = false; this.isLoadingBlock = false;
this.isLoadingOverview = false; this.isLoadingOverview = false;
this.seoService.logSoft404();
return EMPTY; return EMPTY;
}), }),
); );
@ -215,6 +217,7 @@ export class BlockComponent implements OnInit, OnDestroy {
this.error = err; this.error = err;
this.isLoadingBlock = false; this.isLoadingBlock = false;
this.isLoadingOverview = false; this.isLoadingOverview = false;
this.seoService.logSoft404();
return EMPTY; return EMPTY;
}) })
); );

View File

@ -61,6 +61,7 @@ export class PoolPreviewComponent implements OnInit {
}), }),
catchError(() => { catchError(() => {
this.isLoading = false; this.isLoading = false;
this.seoService.logSoft404();
this.openGraphService.fail('pool-hash-' + this.slug); this.openGraphService.fail('pool-hash-' + this.slug);
return of([slug]); return of([slug]);
}) })
@ -70,6 +71,7 @@ export class PoolPreviewComponent implements OnInit {
return this.apiService.getPoolStats$(slug).pipe( return this.apiService.getPoolStats$(slug).pipe(
catchError(() => { catchError(() => {
this.isLoading = false; this.isLoading = false;
this.seoService.logSoft404();
this.openGraphService.fail('pool-stats-' + this.slug); this.openGraphService.fail('pool-stats-' + this.slug);
return of(null); return of(null);
}) })

View File

@ -1,8 +1,8 @@
import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { EChartsOption, graphic } from 'echarts'; import { EChartsOption, graphic } from 'echarts';
import { BehaviorSubject, Observable, timer } from 'rxjs'; import { BehaviorSubject, Observable, of, timer } from 'rxjs';
import { distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators'; import { catchError, distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators';
import { BlockExtended, PoolStat } from '../../interfaces/node-api.interface'; import { BlockExtended, PoolStat } from '../../interfaces/node-api.interface';
import { ApiService } from '../../services/api.service'; import { ApiService } from '../../services/api.service';
import { StateService } from '../../services/state.service'; import { StateService } from '../../services/state.service';
@ -59,10 +59,21 @@ export class PoolComponent implements OnInit {
this.prepareChartOptions(data.map(val => [val.timestamp * 1000, val.avgHashrate])); this.prepareChartOptions(data.map(val => [val.timestamp * 1000, val.avgHashrate]));
return [slug]; return [slug];
}), }),
catchError(() => {
this.isLoading = false;
this.seoService.logSoft404();
return of([slug]);
})
); );
}), }),
switchMap((slug) => { switchMap((slug) => {
return this.apiService.getPoolStats$(slug); return this.apiService.getPoolStats$(slug).pipe(
catchError(() => {
this.isLoading = false;
this.seoService.logSoft404();
return of(null);
})
);
}), }),
tap(() => { tap(() => {
this.loadMoreSubject.next(this.blocks[this.blocks.length - 1]?.height); this.loadMoreSubject.next(this.blocks[this.blocks.length - 1]?.height);

View File

@ -133,6 +133,7 @@ export class TransactionPreviewComponent implements OnInit, OnDestroy {
) )
.subscribe((tx: Transaction) => { .subscribe((tx: Transaction) => {
if (!tx) { if (!tx) {
this.seoService.logSoft404();
this.openGraphService.fail('tx-data-' + this.txId); this.openGraphService.fail('tx-data-' + this.txId);
return; return;
} }
@ -182,6 +183,7 @@ export class TransactionPreviewComponent implements OnInit, OnDestroy {
this.openGraphService.waitOver('tx-data-' + this.txId); this.openGraphService.waitOver('tx-data-' + this.txId);
}, },
(error) => { (error) => {
this.seoService.logSoft404();
this.openGraphService.fail('tx-data-' + this.txId); this.openGraphService.fail('tx-data-' + this.txId);
this.error = error; this.error = error;
this.isLoadingTx = false; this.isLoadingTx = false;

View File

@ -193,8 +193,10 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
}) })
).subscribe((tx) => { ).subscribe((tx) => {
if (!tx) { if (!tx) {
this.seoService.logSoft404();
return; return;
} }
this.seoService.clearSoft404();
this.tx = tx; this.tx = tx;
this.isCached = true; this.isCached = true;
@ -286,9 +288,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
}) })
) )
.subscribe((tx: Transaction) => { .subscribe((tx: Transaction) => {
if (!tx) { if (!tx) {
return; this.seoService.logSoft404();
} return;
}
this.seoService.clearSoft404();
this.tx = tx; this.tx = tx;
this.isCached = false; this.isCached = false;
@ -340,6 +344,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
}, },
(error) => { (error) => {
this.error = error; this.error = error;
this.seoService.logSoft404();
this.isLoadingTx = false; this.isLoadingTx = false;
} }
); );
@ -394,6 +399,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.waitingForTransaction = true; this.waitingForTransaction = true;
} }
this.error = error; this.error = error;
this.seoService.logSoft404();
this.isLoadingTx = false; this.isLoadingTx = false;
return of(false); return of(false);
} }

View File

@ -54,6 +54,7 @@ export class ChannelPreviewComponent implements OnInit {
}), }),
catchError((err) => { catchError((err) => {
this.error = err; this.error = err;
this.seoService.logSoft404();
this.openGraphService.fail('channel-map-' + this.shortId); this.openGraphService.fail('channel-map-' + this.shortId);
this.openGraphService.fail('channel-data-' + this.shortId); this.openGraphService.fail('channel-data-' + this.shortId);
return of(null); return of(null);

View File

@ -38,6 +38,7 @@ export class ChannelComponent implements OnInit {
}), }),
catchError((err) => { catchError((err) => {
this.error = err; this.error = err;
this.seoService.logSoft404();
return [{ return [{
short_id: params.get('short_id') short_id: params.get('short_id')
}]; }];

View File

@ -50,6 +50,7 @@ export class GroupPreviewComponent implements OnInit {
name: this.slug.replace(/-/gi, ' '), name: this.slug.replace(/-/gi, ' '),
description: '', description: '',
}; };
this.seoService.logSoft404();
this.openGraphService.fail('ln-group-map-' + this.slug); this.openGraphService.fail('ln-group-map-' + this.slug);
this.openGraphService.fail('ln-group-data-' + this.slug); this.openGraphService.fail('ln-group-data-' + this.slug);
return of(null); return of(null);
@ -106,6 +107,7 @@ export class GroupPreviewComponent implements OnInit {
}; };
}), }),
catchError(() => { catchError(() => {
this.seoService.logSoft404();
this.openGraphService.fail('ln-group-map-' + this.slug); this.openGraphService.fail('ln-group-map-' + this.slug);
this.openGraphService.fail('ln-group-data-' + this.slug); this.openGraphService.fail('ln-group-data-' + this.slug);
return of({ return of({

View File

@ -81,6 +81,7 @@ export class NodePreviewComponent implements OnInit {
}), }),
catchError(err => { catchError(err => {
this.error = err; this.error = err;
this.seoService.logSoft404();
this.openGraphService.fail('node-map-' + this.publicKey); this.openGraphService.fail('node-map-' + this.publicKey);
this.openGraphService.fail('node-data-' + this.publicKey); this.openGraphService.fail('node-data-' + this.publicKey);
return [{ return [{

View File

@ -121,6 +121,7 @@ export class NodeComponent implements OnInit {
}), }),
catchError(err => { catchError(err => {
this.error = err; this.error = err;
this.seoService.logSoft404();
return [{ return [{
alias: this.publicKey, alias: this.publicKey,
public_key: this.publicKey, public_key: this.publicKey,

View File

@ -85,6 +85,7 @@ export class NodesPerISPPreview implements OnInit {
}), }),
catchError(err => { catchError(err => {
this.error = err; this.error = err;
this.seoService.logSoft404();
this.openGraphService.fail('isp-map-' + this.id); this.openGraphService.fail('isp-map-' + this.id);
this.openGraphService.fail('isp-data-' + this.id); this.openGraphService.fail('isp-data-' + this.id);
return of({ return of({

View File

@ -1,5 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Title, Meta } from '@angular/platform-browser'; import { Title, Meta } from '@angular/platform-browser';
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { filter, map, switchMap } from 'rxjs';
import { StateService } from './state.service'; import { StateService } from './state.service';
@Injectable({ @Injectable({
@ -13,8 +15,22 @@ export class SeoService {
private titleService: Title, private titleService: Title,
private metaService: Meta, private metaService: Meta,
private stateService: StateService, private stateService: StateService,
private router: Router,
private activatedRoute: ActivatedRoute,
) { ) {
this.stateService.networkChanged$.subscribe((network) => this.network = network); this.stateService.networkChanged$.subscribe((network) => this.network = network);
this.router.events.pipe(
filter(event => event instanceof NavigationEnd),
map(() => this.activatedRoute),
map(route => {
while (route.firstChild) route = route.firstChild;
return route;
}),
filter(route => route.outlet === 'primary'),
switchMap(route => route.data),
).subscribe((data) => {
this.clearSoft404();
});
} }
setTitle(newTitle: string): void { setTitle(newTitle: string): void {
@ -53,4 +69,14 @@ export class SeoService {
ucfirst(str: string) { ucfirst(str: string) {
return str.charAt(0).toUpperCase() + str.slice(1); return str.charAt(0).toUpperCase() + str.slice(1);
} }
clearSoft404() {
window['soft404'] = false;
console.log('cleared soft 404');
}
logSoft404() {
window['soft404'] = true;
console.log('set soft 404');
}
} }

View File

@ -179,8 +179,15 @@ class Server {
await page.waitForNetworkIdle({ await page.waitForNetworkIdle({
timeout: config.PUPPETEER.RENDER_TIMEOUT || 3000, timeout: config.PUPPETEER.RENDER_TIMEOUT || 3000,
}); });
let html = await page.content(); const is404 = await page.evaluate(async () => {
return html; return !!window['soft404'];
});
if (is404) {
return '404';
} else {
let html = await page.content();
return html;
}
} catch (e) { } catch (e) {
if (e instanceof TimeoutError) { if (e instanceof TimeoutError) {
let html = await page.content(); let html = await page.content();
@ -258,7 +265,11 @@ class Server {
result = await this.renderUnfurlMeta(rawPath); result = await this.renderUnfurlMeta(rawPath);
} }
if (result && result.length) { if (result && result.length) {
res.send(result); if (result === '404') {
res.status(404).send();
} else {
res.send(result);
}
} else { } else {
res.status(500).send(); res.status(500).send();
} }