Merge pull request #1558 from mempool/nymkappa/bugfix/liquid-icons

This commit is contained in:
wiz 2022-04-23 00:51:36 +00:00 committed by GitHub
commit aea86e520e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 68 additions and 56 deletions

View File

@ -77,7 +77,7 @@ export class Common {
}; };
} }
static sleep(ms: number): Promise<void> { static sleep$(ms: number): Promise<void> {
return new Promise((resolve) => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve(); resolve();

View File

@ -1,8 +1,7 @@
import config from '../config'; import config from '../config';
import DB from '../database'; import DB from '../database';
import logger from '../logger'; import logger from '../logger';
import { Common } from './common';
const sleep = (ms: number) => new Promise(res => setTimeout(res, ms));
class DatabaseMigration { class DatabaseMigration {
private static currentVersion = 17; private static currentVersion = 17;
@ -25,7 +24,7 @@ class DatabaseMigration {
await this.$createMigrationStateTable(); await this.$createMigrationStateTable();
} catch (e) { } catch (e) {
logger.err('MIGRATIONS: Unable to create `state` table, aborting in 10 seconds. ' + e); logger.err('MIGRATIONS: Unable to create `state` table, aborting in 10 seconds. ' + e);
await sleep(10000); await Common.sleep$(10000);
process.exit(-1); process.exit(-1);
} }
logger.debug('MIGRATIONS: `state` table initialized.'); logger.debug('MIGRATIONS: `state` table initialized.');
@ -36,7 +35,7 @@ class DatabaseMigration {
databaseSchemaVersion = await this.$getSchemaVersionFromDatabase(); databaseSchemaVersion = await this.$getSchemaVersionFromDatabase();
} catch (e) { } catch (e) {
logger.err('MIGRATIONS: Unable to get current database migration version, aborting in 10 seconds. ' + e); logger.err('MIGRATIONS: Unable to get current database migration version, aborting in 10 seconds. ' + e);
await sleep(10000); await Common.sleep$(10000);
process.exit(-1); process.exit(-1);
} }
@ -52,7 +51,7 @@ class DatabaseMigration {
await this.$createMissingTablesAndIndexes(databaseSchemaVersion); await this.$createMissingTablesAndIndexes(databaseSchemaVersion);
} catch (e) { } catch (e) {
logger.err('MIGRATIONS: Unable to create required tables, aborting in 10 seconds. ' + e); logger.err('MIGRATIONS: Unable to create required tables, aborting in 10 seconds. ' + e);
await sleep(10000); await Common.sleep$(10000);
process.exit(-1); process.exit(-1);
} }

View File

@ -1,5 +1,4 @@
import * as fs from 'fs'; import * as fs from 'fs';
import config from '../../config';
import logger from '../../logger'; import logger from '../../logger';
class Icons { class Icons {

View File

@ -85,16 +85,16 @@ class Server {
this.setUpWebsocketHandling(); this.setUpWebsocketHandling();
await syncAssets.syncAssets(); await syncAssets.syncAssets$();
diskCache.loadMempoolCache(); diskCache.loadMempoolCache();
if (config.DATABASE.ENABLED) { if (config.DATABASE.ENABLED) {
await DB.checkDbConnection(); await DB.checkDbConnection();
try { try {
if (process.env.npm_config_reindex != undefined) { // Re-index requests if (process.env.npm_config_reindex !== undefined) { // Re-index requests
const tables = process.env.npm_config_reindex.split(','); const tables = process.env.npm_config_reindex.split(',');
logger.warn(`Indexed data for "${process.env.npm_config_reindex}" tables will be erased in 5 seconds (using '--reindex')`); logger.warn(`Indexed data for "${process.env.npm_config_reindex}" tables will be erased in 5 seconds (using '--reindex')`);
await Common.sleep(5000); await Common.sleep$(5000);
await databaseMigration.$truncateIndexedData(tables); await databaseMigration.$truncateIndexedData(tables);
} }
await databaseMigration.$initializeOrMigrateDatabase(); await databaseMigration.$initializeOrMigrateDatabase();

View File

@ -9,18 +9,23 @@ const PATH = './';
class SyncAssets { class SyncAssets {
constructor() { } constructor() { }
public async syncAssets() { public async syncAssets$() {
for (const url of config.MEMPOOL.EXTERNAL_ASSETS) { for (const url of config.MEMPOOL.EXTERNAL_ASSETS) {
await this.downloadFile(url); try {
await this.downloadFile$(url);
} catch (e) {
throw new Error(`Failed to download external asset. ` + (e instanceof Error ? e.message : e));
}
} }
} }
private async downloadFile(url: string) { private async downloadFile$(url: string) {
return new Promise((resolve, reject) => {
const fileName = url.split('/').slice(-1)[0]; const fileName = url.split('/').slice(-1)[0];
try { try {
if (config.SOCKS5PROXY.ENABLED) { if (config.SOCKS5PROXY.ENABLED) {
let socksOptions: any = { const socksOptions: any = {
agentOptions: { agentOptions: {
keepAlive: true, keepAlive: true,
}, },
@ -36,28 +41,37 @@ class SyncAssets {
const agent = new SocksProxyAgent(socksOptions); const agent = new SocksProxyAgent(socksOptions);
logger.info(`Downloading external asset ${fileName} over the Tor network...`); logger.info(`Downloading external asset ${fileName} over the Tor network...`);
await axios.get(url, { return axios.get(url, {
httpAgent: agent, httpAgent: agent,
httpsAgent: agent, httpsAgent: agent,
responseType: 'stream', responseType: 'stream',
timeout: 30000 timeout: 30000
}).then(function (response) { }).then(function (response) {
response.data.pipe(fs.createWriteStream(PATH + fileName)); const writer = fs.createWriteStream(PATH + fileName);
writer.on('finish', () => {
logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); logger.info(`External asset ${fileName} saved to ${PATH + fileName}`);
resolve(0);
});
response.data.pipe(writer);
}); });
} else { } else {
logger.info(`Downloading external asset ${fileName} over clearnet...`); logger.info(`Downloading external asset ${fileName} over clearnet...`);
await axios.get(url, { return axios.get(url, {
responseType: 'stream', responseType: 'stream',
timeout: 30000 timeout: 30000
}).then(function (response) { }).then(function (response) {
response.data.pipe(fs.createWriteStream(PATH + fileName)); const writer = fs.createWriteStream(PATH + fileName);
writer.on('finish', () => {
logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); logger.info(`External asset ${fileName} saved to ${PATH + fileName}`);
resolve(0);
});
response.data.pipe(writer);
}); });
} }
} catch (e: any) { } catch (e: any) {
throw new Error(`Failed to download external asset. ` + e); reject(e);
} }
});
} }
} }

View File

@ -64,7 +64,7 @@
</div> </div>
<div class="w-100 d-block d-md-none"></div> <div class="w-100 d-block d-md-none"></div>
<div class="col icon-holder"> <div class="col icon-holder">
<img *ngIf="!imageError; else defaultIcon" class="assetIcon" [src]="'https://liquid.network/api/v1/asset/' + asset.asset_id + '/icon'" (error)="imageError = true"> <img *ngIf="!imageError; else defaultIcon" class="assetIcon" [src]="'/api/v1/asset/' + asset.asset_id + '/icon'" (error)="imageError = true">
<ng-template #defaultIcon> <ng-template #defaultIcon>
<fa-icon class="defaultIcon" [icon]="['fas', 'database']" [fixedWidth]="true" size="8x"></fa-icon> <fa-icon class="defaultIcon" [icon]="['fas', 'database']" [fixedWidth]="true" size="8x"></fa-icon>
</ng-template> </ng-template>

View File

@ -15,7 +15,7 @@
<div *ngFor="let asset of group.assets"> <div *ngFor="let asset of group.assets">
<div class="card"> <div class="card">
<a [routerLink]="['/assets/asset' | relativeUrl, asset.asset_id]"> <a [routerLink]="['/assets/asset' | relativeUrl, asset.asset_id]">
<img class="assetIcon" [src]="'https://liquid.network/api/v1/asset/' + asset.asset_id + '/icon'"> <img class="assetIcon" [src]="'/api/v1/asset/' + asset.asset_id + '/icon'">
</a> </a>
<div class="title"> <div class="title">
<a [routerLink]="['/assets/asset/' | relativeUrl, asset.asset_id]">{{ asset.name }}</a> <a [routerLink]="['/assets/asset/' | relativeUrl, asset.asset_id]">{{ asset.name }}</a>

View File

@ -3,14 +3,14 @@
<div class="card" *ngFor="let group of featured"> <div class="card" *ngFor="let group of featured">
<ng-template [ngIf]="group.assets" [ngIfElse]="singleAsset"> <ng-template [ngIf]="group.assets" [ngIfElse]="singleAsset">
<a [routerLink]="['/assets/group' | relativeUrl, group.id]"> <a [routerLink]="['/assets/group' | relativeUrl, group.id]">
<img class="assetIcon" [src]="'https://liquid.network/api/v1/asset/' + group.assets[0] + '/icon'"> <img class="assetIcon" [src]="'/api/v1/asset/' + group.assets[0] + '/icon'">
</a> </a>
<div class="title"><a [routerLink]="['/assets/group' | relativeUrl, group.id]">{{ group.name }}</a></div> <div class="title"><a [routerLink]="['/assets/group' | relativeUrl, group.id]">{{ group.name }}</a></div>
<div class="sub-title" i18n>Group of {{ group.assets.length | number }} assets</div> <div class="sub-title" i18n>Group of {{ group.assets.length | number }} assets</div>
</ng-template> </ng-template>
<ng-template #singleAsset> <ng-template #singleAsset>
<a [routerLink]="['/assets/asset/' | relativeUrl, group.asset]"> <a [routerLink]="['/assets/asset/' | relativeUrl, group.asset]">
<img class="assetIcon" [src]="'https://liquid.network/api/v1/asset/' + group.asset + '/icon'"> <img class="assetIcon" [src]="'/api/v1/asset/' + group.asset + '/icon'">
</a> </a>
<div class="title"> <div class="title">
<a [routerLink]="['/assets/asset/' | relativeUrl, group.asset]">{{ group.name }}</a> <a [routerLink]="['/assets/asset/' | relativeUrl, group.asset]">{{ group.name }}</a>

View File

@ -79,7 +79,7 @@
<tr *ngFor="let group of featuredAssets"> <tr *ngFor="let group of featuredAssets">
<td class="asset-icon"> <td class="asset-icon">
<a [routerLink]="['/assets/asset/' | relativeUrl, group.asset]"> <a [routerLink]="['/assets/asset/' | relativeUrl, group.asset]">
<img class="assetIcon" [src]="'https://liquid.network/api/v1/asset/' + group.asset + '/icon'"> <img class="assetIcon" [src]="'/api/v1/asset/' + group.asset + '/icon'">
</a> </a>
</td> </td>
<td class="asset-title"> <td class="asset-title">