Merge pull request #1558 from mempool/nymkappa/bugfix/liquid-icons
This commit is contained in:
commit
aea86e520e
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user