diff --git a/app/cli.ts b/app/cli.ts index f0bb646c87ba360e32d03acb4d5493591e70cd9f..ca3e8db1c04f8d3d3617d28545af0c0f54691621 100644 --- a/app/cli.ts +++ b/app/cli.ts @@ -34,10 +34,10 @@ export const ExecuteCommand = () => { // Callback for command rejection let onReject: any = () => - Promise.reject(Error("Uninitilized rejection throw")); + Promise.reject(Error("Uninitialized rejection throw")); // Command execution promise - const currentCommand = new Promise((resolve, reject) => { + const currentCommand = new Promise<void>((resolve, reject) => { onResolve = resolve; onReject = reject; }); diff --git a/app/lib/common-libs/manual-promise.ts b/app/lib/common-libs/manual-promise.ts index 24d6382aa5f259c7d778a1f7d94f3a5312209ef8..2a7187ff8f29dbc55ad2873a3e6534fb36ba8c71 100644 --- a/app/lib/common-libs/manual-promise.ts +++ b/app/lib/common-libs/manual-promise.ts @@ -14,7 +14,7 @@ export interface ManualPromise<T> extends Querable<T> { export function newManualPromise<T>() { let resolveCb: (data: T) => void = () => {}; let rejectCb: (error: Error) => void = () => {}; - const p = new Promise((res, rej) => { + const p = new Promise<T>((res, rej) => { resolveCb = res; rejectCb = rej; }); diff --git a/app/lib/common-libs/timeout-promise.ts b/app/lib/common-libs/timeout-promise.ts index eab7d91f93ab0e2efe82905358e71b44d1b10694..08c6cce2ba2489e70e24336f46f77e01d782fe47 100644 --- a/app/lib/common-libs/timeout-promise.ts +++ b/app/lib/common-libs/timeout-promise.ts @@ -12,7 +12,7 @@ // GNU Affero General Public License for more details. export function newRejectTimeoutPromise(timeout: number) { - return new Promise((res, rej) => { + return new Promise<void>((res, rej) => { setTimeout(rej, timeout); }); } @@ -21,7 +21,7 @@ export function newResolveTimeoutPromise<T>( timeout: number, value: T ): Promise<T> { - return new Promise((res) => { + return new Promise<T>((res) => { setTimeout(() => res(value), timeout); }); } diff --git a/app/lib/dal/drivers/LevelDBDriver.ts b/app/lib/dal/drivers/LevelDBDriver.ts index 7959c3f1e632a97cb6ea8e069ace16587cb8816f..0fd4c034488a0a9c40fa892c52a7969c90a71876 100644 --- a/app/lib/dal/drivers/LevelDBDriver.ts +++ b/app/lib/dal/drivers/LevelDBDriver.ts @@ -20,7 +20,7 @@ import * as memdown from "memdown"; export const LevelDBDriver = { newMemoryInstance: (): Promise<LevelUp> => { const impl: any = memdown.default(); - return new Promise((res, rej) => { + return new Promise<LevelUp<any>>((res, rej) => { const db: LevelUp = levelup.default(impl, undefined, (err: Error) => { if (err) return rej(err); res(db); @@ -30,7 +30,7 @@ export const LevelDBDriver = { newFileInstance: (path: string): Promise<LevelUp> => { const impl: any = leveldown.default(path); - return new Promise((res, rej) => { + return new Promise<LevelUp<any>>((res, rej) => { const db: LevelUp = levelup.default(impl, undefined, (err: Error) => { if (err) return rej(err); res(db); diff --git a/app/lib/dal/drivers/SQLiteDriver.ts b/app/lib/dal/drivers/SQLiteDriver.ts index 404371634614543f04bee34812528d961a5ee043..0cc9700382c7bae95d6e2760beb10a3fbc722cdd 100644 --- a/app/lib/dal/drivers/SQLiteDriver.ts +++ b/app/lib/dal/drivers/SQLiteDriver.ts @@ -41,7 +41,7 @@ export class SQLiteDriver { // Force case sensitiveness on LIKE operator const sql = "PRAGMA case_sensitive_like=ON"; - await new Promise<any>((resolve, reject) => + await new Promise<void>((resolve, reject) => sqlite.exec(sql, (err: any) => { if (err) return reject( @@ -103,8 +103,8 @@ export class SQLiteDriver { this.logger.debug('Database "%s" removed', this.path); } - get closed() { - return this.dbPromise; + isClosed() { + return !this.dbPromise; } async closeConnection(): Promise<void> { @@ -115,7 +115,7 @@ export class SQLiteDriver { if (process.platform === "win32") { db.open; // For an unknown reason, we need this line. } - await new Promise((resolve, reject) => { + await new Promise<void>((resolve, reject) => { this.logger.debug('Closing SQLite database "%s"...', this.path); db.on("close", () => { this.logger.info('Database "%s" closed.', this.path); diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts index 2d7915db8d508ca3ab8014d3ef4129a454ff1cb8..2d04a61636ba9be157619801b22795d084a05e23 100644 --- a/app/lib/dal/fileDAL.ts +++ b/app/lib/dal/fileDAL.ts @@ -129,8 +129,7 @@ export class FileDAL implements ServerDAO { sindexDAL: SIndexDAO; cindexDAL: CIndexDAO; dividendDAL: DividendDAO; - newDals: { [k: string]: Initiable }; - private dals: (PeerDAO | WalletDAO | GenericDAO<any>)[]; + dals: { [k: string]: Initiable }; loadConfHook: (conf: ConfDTO) => Promise<void>; saveConfHook: (conf: ConfDTO) => Promise<ConfDTO>; @@ -174,7 +173,7 @@ export class FileDAL implements ServerDAO { this.cindexDAL = new LevelDBCindex(getLevelDB); this.dividendDAL = new LevelDBDividend(getLevelDB); - this.newDals = { + this.dals = { powDAL: this.powDAL, metaDAL: this.metaDAL, blockDAL: this.blockDAL, @@ -196,24 +195,9 @@ export class FileDAL implements ServerDAO { async init(conf: ConfDTO) { this.wotb = this.params.wotbf(); - this.dals = [ - this.blockDAL, - this.txsDAL, - this.peerDAL, - this.walletDAL, - this.bindexDAL, - this.mindexDAL, - this.iindexDAL, - this.sindexDAL, - this.cindexDAL, - this.dividendDAL, - ]; - for (const indexDAL of this.dals) { - indexDAL.triggerInit(); - } - const dalNames = Underscore.keys(this.newDals); + const dalNames = Underscore.keys(this.dals); for (const dalName of dalNames) { - const dal = this.newDals[dalName]; + const dal = this.dals[dalName]; await dal.init(); } logger.debug("Upgrade database..."); @@ -229,6 +213,23 @@ export class FileDAL implements ServerDAO { } } + generateUpgradeSql() { + // Make sure to always renable constraints (a.g. if the last sync failed, it can be still disabled) + return "PRAGMA ignore_check_constraints = true;"; + } + + async disableCheckConstraints() { + logger.info("Disabling database check constraints..."); + await this.metaDAL.exec("PRAGMA ignore_check_constraints = true;"); + await this.txsDAL.disableCheckConstraints(); + } + + async enableCheckConstraints() { + logger.info("Enabling database check constraints..."); + await this.metaDAL.exec("PRAGMA ignore_check_constraints = false;"); + await this.txsDAL.enableCheckConstraints(); + } + getDBVersion() { return this.metaDAL.getVersion(); } @@ -1583,14 +1584,14 @@ export class FileDAL implements ServerDAO { } async cleanCaches() { - await Underscore.values(this.newDals).map( + await Underscore.values(this.dals).map( (dal: Initiable) => dal.cleanCache && dal.cleanCache() ); } async close() { await Promise.all( - Underscore.values(this.newDals).map(async (dal: Initiable) => { + Underscore.values(this.dals).map(async (dal: Initiable) => { dal.cleanCache(); await dal.close(); }) @@ -1604,7 +1605,7 @@ export class FileDAL implements ServerDAO { } getLogContent(linesQuantity: number) { - return new Promise((resolve, reject) => { + return new Promise<string[]>((resolve, reject) => { try { let lines: string[] = [], i = 0; diff --git a/app/lib/dal/indexDAL/abstract/GenericDAO.ts b/app/lib/dal/indexDAL/abstract/GenericDAO.ts index b7df7ad288e7130df8bfee6d5f89bd0ffc7a9f69..f3f9651e6f95ac696bc564c3b2c6195bc5834750 100644 --- a/app/lib/dal/indexDAL/abstract/GenericDAO.ts +++ b/app/lib/dal/indexDAL/abstract/GenericDAO.ts @@ -1,11 +1,6 @@ import { Initiable } from "../../sqliteDAL/Initiable"; export interface GenericDAO<T> extends Initiable { - /** - * Trigger the initialization of the DAO. Called when the underlying DB is ready. - */ - triggerInit(): void; - /** * Make a generic find with some ordering. * @param criterion Criterion object, LokiJS's find object format. diff --git a/app/lib/dal/indexDAL/abstract/PeerDAO.ts b/app/lib/dal/indexDAL/abstract/PeerDAO.ts index 0432e2c15d551ab0944e7cd8e18aaec610915470..b85f893e540c63fc1d357ee633127e6ae602d539 100644 --- a/app/lib/dal/indexDAL/abstract/PeerDAO.ts +++ b/app/lib/dal/indexDAL/abstract/PeerDAO.ts @@ -2,11 +2,6 @@ import { DBPeer } from "../../../db/DBPeer"; import { Initiable } from "../../sqliteDAL/Initiable"; export interface PeerDAO extends Initiable { - /** - * Trigger the initialization of the DAO. Called when the underlying DB is ready. - */ - triggerInit(): void; - listAll(): Promise<DBPeer[]>; withUPStatus(): Promise<DBPeer[]>; diff --git a/app/lib/dal/indexDAL/abstract/TxsDAO.ts b/app/lib/dal/indexDAL/abstract/TxsDAO.ts index 93854de3e21bfd08ad732f1fba4731ad7b88975f..44a414484fe4d972288305869ef05fe89883835c 100644 --- a/app/lib/dal/indexDAL/abstract/TxsDAO.ts +++ b/app/lib/dal/indexDAL/abstract/TxsDAO.ts @@ -4,6 +4,10 @@ import { SandBox } from "../../sqliteDAL/SandBox"; import { DBTx } from "../../../db/DBTx"; export interface TxsDAO extends GenericDAO<DBTx> { + disableCheckConstraints(): Promise<void>; + + enableCheckConstraints(): Promise<void>; + trimExpiredNonWrittenTxs(limitTime: number): Promise<void>; getAllPending(versionMin: number): Promise<DBTx[]>; diff --git a/app/lib/dal/indexDAL/abstract/WalletDAO.ts b/app/lib/dal/indexDAL/abstract/WalletDAO.ts index 3e076f2ebcffe622680cf1654d32bbf0ee120d3d..00e047aba65430f7cec16844e4f79bc6c8d66706 100644 --- a/app/lib/dal/indexDAL/abstract/WalletDAO.ts +++ b/app/lib/dal/indexDAL/abstract/WalletDAO.ts @@ -2,11 +2,6 @@ import { Initiable } from "../../sqliteDAL/Initiable"; import { DBWallet } from "../../../db/DBWallet"; export interface WalletDAO extends Initiable { - /** - * Trigger the initialization of the DAO. Called when the underlying DB is ready. - */ - triggerInit(): void; - /** * Saves a wallet. * @param {DBWallet} wallet diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts index 4d1afc8e8beab4867fc4c5287da5e7b156854a72..161ddca3883413a691077d090b03296ac9d21493 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts @@ -32,9 +32,6 @@ export class LevelDBDividend extends LevelDBTable<DividendEntry> */ cleanCache(): void {} - - triggerInit(): void {} - async init(): Promise<void> { await super.init(); this.indexForTrimming = new LevelDBTable<string[]>( diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts index c6b1f6de2c9dab34d2780dae2bc64ce8af44d1af..f9d018a11a4afaef0ffe07e57d739cbb9d6d93ed 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts @@ -12,8 +12,6 @@ export class LevelDBTable<T> { cleanCache(): void {} - triggerInit(): void {} - async close() { await this.db.close(); } @@ -74,7 +72,7 @@ export class LevelDBTable<T> { public async count(options?: AbstractIteratorOptions) { let count = 0; - await new Promise((res) => { + await new Promise<void>((res) => { this.db .createReadStream(options) .on("data", () => count++) @@ -87,7 +85,7 @@ export class LevelDBTable<T> { callback: (entry: T) => void, options?: AbstractIteratorOptions ) { - await new Promise((res) => { + await new Promise<void>((res) => { this.db .createReadStream(options) .on("data", (data) => callback(JSON.parse(String(data.value)))) @@ -99,7 +97,7 @@ export class LevelDBTable<T> { callback: (entry: { key: string; value: T }) => void, options?: AbstractIteratorOptions ) { - await new Promise((res) => { + await new Promise<void>((res) => { this.db .createReadStream(options) .on("data", (data) => @@ -117,7 +115,7 @@ export class LevelDBTable<T> { options?: AbstractIteratorOptions ) { const ops: Promise<void>[] = []; - await new Promise((res) => { + await new Promise<void>((res) => { this.db .createReadStream(options) .on("data", (data) => diff --git a/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts b/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts index 3152d1174b3ee7d3aeb8d19d5ed10aec0804a024..d64cc48b342ad5194c37e5d23a6e0948abc06c0d 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts @@ -35,8 +35,6 @@ export class SqliteDividend extends SqliteTable<DividendEntry> cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts index d31696ed60b5d813473e917c8148051c948abdd0..a50fdb0416792dc09621fd0459c942a2364ae0cd 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts @@ -44,8 +44,6 @@ export class SqliteIIndex extends SqliteTable<IindexEntry> cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts index 6fe3b6230a545088d50a2cdcb03099cfdb1f80bb..0d8b60d2bb4768e50ddbd91490cf6ec222449d10 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts @@ -74,8 +74,6 @@ export class SqliteMIndex extends SqliteTable<MindexEntry> `); } - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts b/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts index 3b67bd9feb95686c3f779ef43d067718bd8b653b..50ce4109382fa961e2a42531fbd6b8cbdfd7c525 100644 --- a/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts +++ b/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts @@ -95,8 +95,6 @@ export class SqlitePeers extends SqliteTable<DBPeer> implements PeerDAO { return peer; } - triggerInit(): void {} - withUPStatus(): Promise<DBPeer[]> { return this.findEntities("SELECT * FROM peers WHERE status = ?", ["UP"]); } diff --git a/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts index c208fa380f3395ae3980d39f7e977582e019bd3f..9fdc1eb5ff5ee2de3c56a1e16b646759d39c4a20 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts @@ -46,8 +46,6 @@ export class SqliteSIndex extends SqliteTable<SindexEntry> cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ @@ -106,7 +104,7 @@ export class SqliteSIndex extends SqliteTable<SindexEntry> private async find(sql: string, params: any[]): Promise<SindexEntry[]> { return (await this.driver.sqlRead(sql, params)).map((r) => { return { - index: "CINDEX", + index: "SINDEX", op: r.op, written_on: r.written_on, writtenOn: r.writtenOn, diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts index 756d367c5df96461a44543f3b6def81e66b3cf24..a0ee566e0a120a2b74af4bd8cd7fe040907ce34f 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts @@ -4,7 +4,7 @@ import { SqliteNodeIOManager } from "./SqliteNodeIOManager"; import { SQLiteDriver } from "../../drivers/SQLiteDriver"; export class SqliteTable<T> { - private readonly pdriver: Promise<SQLiteDriver>; + private readonly _driverPromise: Promise<SQLiteDriver>; protected driver: SqliteNodeIOManager<T>; protected constructor( @@ -14,11 +14,11 @@ export class SqliteTable<T> { }, getSqliteDB: (dbName: string) => Promise<SQLiteDriver> ) { - this.pdriver = getSqliteDB(`${name}.db`); + this._driverPromise = getSqliteDB(`${name}.db`); } async init(): Promise<void> { - this.driver = new SqliteNodeIOManager(await this.pdriver, "sindex"); + this.driver = new SqliteNodeIOManager(await this._driverPromise, this.name); await this.driver.sqlExec(` BEGIN; ${this.generateCreateTable()}; @@ -32,11 +32,20 @@ export class SqliteTable<T> { await this.driver.close(); } + async disableCheckConstraints(): Promise<void> { + await this.driver.sqlExec("PRAGMA ignore_check_constraints = true;"); + } + + async enableCheckConstraints(): Promise<void> { + await this.driver.sqlExec("PRAGMA ignore_check_constraints = false;"); + } + generateCreateTable() { let sql = `CREATE TABLE IF NOT EXISTS ${this.name} (`; const fields = this.keys() - .map((fieldName) => { - const f = this.fields[fieldName] as SqlFieldDefinition; + .map((key) => { + const fieldName = String(key); + const f = this.fields[key] as SqlFieldDefinition; switch (f.type) { case "BOOLEAN": return `\n${fieldName} BOOLEAN${f.nullable ? " NULL" : ""}`; @@ -72,7 +81,9 @@ export class SqliteTable<T> { return this.keys() .filter((key) => this.fields[key]?.indexed) .map((fieldName) => { - return `CREATE INDEX IF NOT EXISTS idx_${this.name}_${fieldName} ON ${this.name} (${fieldName});\n`; + return `CREATE INDEX IF NOT EXISTS idx_${this.name}_${String( + fieldName + )} ON ${this.name} (${String(fieldName)});\n`; }) .join(""); } @@ -93,12 +104,14 @@ export class SqliteTable<T> { ) { const valuesOfRecord = fieldsToUpdate .map( - (fieldName) => `${fieldName} = ${this.getFieldValue(fieldName, record)}` + (fieldName) => + `${String(fieldName)} = ${this.getFieldValue(fieldName, record)}` ) .join(","); const conditionsOfRecord = whereFields .map( - (fieldName) => `${fieldName} = ${this.getFieldValue(fieldName, record)}` + (fieldName) => + `${String(fieldName)} = ${this.getFieldValue(fieldName, record)}` ) .join(","); await driver.sqlWrite( @@ -206,7 +219,9 @@ export class SqliteTable<T> { async countBy(fieldName: keyof T, fieldValue: any): Promise<number> { return (( await this.driver.sqlRead( - `SELECT COUNT(*) as max FROM ${this.name} WHERE ${fieldName} = ?`, + `SELECT COUNT(*) as max FROM ${this.name} WHERE ${String( + fieldName + )} = ?`, [fieldValue] ) )[0] as any).max; diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts index 0298fd57cf350b76660ea1992ddd8cdb82ebe3f6..f739136e5e47d3bdb3f1927a26c41038b140dbbb 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts @@ -357,7 +357,7 @@ export class SqliteTransactions extends SqliteTable<DBTx> implements TxsDAO { while (i < hashArray.length - 1) { const slice = hashArray.slice(i, i + 500); await this.driver.sqlWrite( - `DELETE FROM txs WHERE hash IN (${slice.map((_) => "?").join(", ")})`, + `DELETE FROM txs WHERE hash IN (${slice.map((_) => "?").join(",")})`, slice ); i += 500; @@ -368,8 +368,6 @@ export class SqliteTransactions extends SqliteTable<DBTx> implements TxsDAO { return this.driver.sqlWrite("DELETE FROM txs WHERE hash = ?", [hash]); } - triggerInit(): void {} - trimExpiredNonWrittenTxs(limitTime: number): Promise<void> { return this.driver.sqlWrite( "DELETE FROM txs WHERE NOT written AND blockstampTime <= ?", diff --git a/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts b/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts index 3b70811fe3ee3a6106ee3898fec4f5a6d6413536..a9f8fb03134194958ea298b49f64411ba686e6ed 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts @@ -23,8 +23,6 @@ export class SqliteWallet extends SqliteTable<DBWallet> implements WalletDAO { cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dto/ConfDTO.ts b/app/lib/dto/ConfDTO.ts index 7d5d8247423998f526d6ef3059966f5d492309f0..6449d4edd7d0847d5acfdd57d2be7f2ca904797a 100644 --- a/app/lib/dto/ConfDTO.ts +++ b/app/lib/dto/ConfDTO.ts @@ -68,8 +68,8 @@ export interface CurrencyConfDTO { export interface KeypairConfDTO { pair: Keypair; oldPair: Keypair | null; - salt: string; - passwd: string; + salt?: string; + passwd?: string; } export interface NetworkConfDTO { diff --git a/app/lib/dto/PeerDTO.ts b/app/lib/dto/PeerDTO.ts index 62e70afdf35260284e01f08e40bcd054875a78f8..7dae1e7b84b08469de0f54a84af87553fefb7ba8 100644 --- a/app/lib/dto/PeerDTO.ts +++ b/app/lib/dto/PeerDTO.ts @@ -381,6 +381,6 @@ export class PeerDTO implements Cloneable { } static isBMA(endpoint: string) { - return endpoint && !!endpoint.match(/^(BASIC_MERKLED_API|BMAS)/) || false; + return (endpoint && !!endpoint.match(/^(BASIC_MERKLED_API|BMAS)/)) || false; } } diff --git a/app/lib/indexer.ts b/app/lib/indexer.ts index c691672f4c65e06431fbe83894f2d28104eb0f9e..6a01b03df4a3ff0aeb5e994967f5c3be7f3f04e2 100644 --- a/app/lib/indexer.ts +++ b/app/lib/indexer.ts @@ -2436,7 +2436,7 @@ export function reduceForDBTrimming<T extends { writtenOn: number }>( export function reduce<T>(records: T[]): T { return records.reduce((obj: T, record) => { - const keys = Object.keys(record) as (keyof T)[]; + const keys = Underscore.keys<T>(record); for (const k of keys) { if (record[k] !== undefined && record[k] !== null) { obj[k] = record[k]; diff --git a/app/lib/streams/multicaster.ts b/app/lib/streams/multicaster.ts index 5afd88cd1e68267981d9c26c5bd6bcc46e1f48da..2dd59e92d61cacab894a5592f2018bf5e0db8cb3 100644 --- a/app/lib/streams/multicaster.ts +++ b/app/lib/streams/multicaster.ts @@ -267,7 +267,7 @@ export class Multicaster extends stream.Transform { if (!peer.isReachable()) { return Promise.resolve(); } - return new Promise((resolve, reject) => { + return new Promise<any>((resolve, reject) => { const postReq = request.post( { uri: protocol(peer.getPort()) + "://" + peer.getURL() + uri, diff --git a/app/lib/system/directory.ts b/app/lib/system/directory.ts index b8fec8b43c0249082539c6fe3d23363521ed59ef..3e8e445d6dde1466f1780b18b868de192cdaf826 100644 --- a/app/lib/system/directory.ts +++ b/app/lib/system/directory.ts @@ -95,8 +95,8 @@ class QioFileSystem implements FileSystem { } } else { // Use NodeJS streams for faster writing - let wstream = fs.createWriteStream(file); - await new Promise(async (res, rej) => { + const wstream = fs.createWriteStream(file); + await new Promise<void>(async (res, rej) => { // When done, return wstream.on("close", (err: any) => { if (err) return rej(err); diff --git a/app/lib/wizard.ts b/app/lib/wizard.ts index 1c38b02e1204e80150adb079fb7314881c94f926..3ef480391c093233979a1a769837828f586c02d4 100644 --- a/app/lib/wizard.ts +++ b/app/lib/wizard.ts @@ -33,7 +33,7 @@ export class Wizard { } function doTasks(todos: string[], conf: ConfDTO) { - return new Promise((res, rej) => { + return new Promise<void>((res, rej) => { async.forEachSeries( todos, function (task: any, callback: any) { diff --git a/app/modules/bma/index.ts b/app/modules/bma/index.ts index 73f4f5d5f7706a31b64665e575824e9fcd50a851..8a9372f76144f6aba3b968aedaf0ed98b77634d1 100644 --- a/app/modules/bma/index.ts +++ b/app/modules/bma/index.ts @@ -89,7 +89,11 @@ export const BmaDependency = { }, config: { - onLoading: async (conf: NetworkConfDTO, program: any, logger: any) => { + onLoading: async ( + conf: Partial<NetworkConfDTO>, + program: any, + logger: any + ) => { // If the usage of BMA hasn't been defined yet if (conf.nobma === undefined) { // Do we have an existing BMA conf? @@ -186,7 +190,7 @@ export const BmaDependency = { } }, - beforeSave: async (conf: NetworkConfDTO, program: any) => { + beforeSave: async (conf: Partial<NetworkConfDTO>, program: any) => { if (!conf.ipv4) delete conf.ipv4; if (!conf.ipv6) delete conf.ipv6; if (!conf.remoteipv4) delete conf.remoteipv4; @@ -212,9 +216,7 @@ export const BmaDependency = { } } if (!conf.nobma) { - server.addEndpointsDefinitions(async () => - getEndpoint(conf) - ); + server.addEndpointsDefinitions(async () => getEndpoint(conf)); server.addWrongEndpointFilter((endpoints: string[]) => getWrongEndpoints(endpoints, server.conf.pair.pub) ); @@ -246,10 +248,14 @@ async function getWrongEndpoints(endpoints: string[], selfPubkey: string) { .map(async (ep: string) => { const peer = PeerDTO.fromJSONObject({ endpoints: [ep] }); try { - const protocol = ep.startsWith("BMAS") || peer.getPort() == 443 ? "https" : "http"; - const answer = await rp(protocol + "://" + peer.getURL() + "/network/peering", { - json: true, - }); + const protocol = + ep.startsWith("BMAS") || peer.getPort() == 443 ? "https" : "http"; + const answer = await rp( + protocol + "://" + peer.getURL() + "/network/peering", + { + json: true, + } + ); if (!answer || answer.pubkey != selfPubkey) { throw Error("Not same pubkey as local instance"); } @@ -257,7 +263,7 @@ async function getWrongEndpoints(endpoints: string[], selfPubkey: string) { wrongs.push(ep); } }) - ); + ); return wrongs; } diff --git a/app/modules/bma/lib/upnp.ts b/app/modules/bma/lib/upnp.ts index 3c5eecb980b80cf0018e5753dcfd9f73220ebcae..50910d13bbe1e7437709746637dfa0e1fb6da00a 100644 --- a/app/modules/bma/lib/upnp.ts +++ b/app/modules/bma/lib/upnp.ts @@ -35,7 +35,7 @@ export const Upnp = async function ( await Q.nbind(client.externalIp, client)(); } catch (err) { if (err && err.message == "timeout") { - throw 'No UPnP gateway found: your node won\'t be reachable from the Internet. Use --noupnp option to avoid this message.'; + throw "No UPnP gateway found: your node won't be reachable from the Internet. Use --noupnp option to avoid this message."; } throw err; } finally { diff --git a/app/modules/config.ts b/app/modules/config.ts index 6776cd0455d7849cfd12fe921e937ec8e85b66d4..f5e90b3e0826e8422859303cb8b8a58492a9bb68 100644 --- a/app/modules/config.ts +++ b/app/modules/config.ts @@ -93,10 +93,9 @@ module.exports = { const aggregates = Underscore.uniq( lines .map((l) => l.match(/: (\[\w+\](\[\w+\])*)/)) - .filter((l) => l) - .map((l: string[]) => l[1]) + .filter((l) => !!l) + .map((l) => l && ((l[1] as unknown) as string)) ); - console.log(aggregates); const results = aggregates.map((a: string) => { return { name: a, diff --git a/app/modules/crawler/index.ts b/app/modules/crawler/index.ts index 7257de8c439007da6776aa0479bd846863b7e207..0ae24bd3661b5d108fe1d6593159d13c90078a11 100644 --- a/app/modules/crawler/index.ts +++ b/app/modules/crawler/index.ts @@ -309,7 +309,11 @@ export const CrawlerDependency = { ? [ { endpoints: [ - [fromPort == "443" ? "BMAS" : "BASIC_MERKLED_API", fromHost, fromPort].join(" "), + [ + fromPort == "443" ? "BMAS" : "BASIC_MERKLED_API", + fromHost, + fromPort, + ].join(" "), ], }, ] @@ -358,7 +362,11 @@ export const CrawlerDependency = { const { host, port } = extractHostPort(from); try { const peer = PeerDTO.fromJSONObject({ - endpoints: [[port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ")], + endpoints: [ + [port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join( + " " + ), + ], }); const fromHost = peer.getHostPreferDNS(); const fromPort = peer.getPort(); @@ -405,7 +413,11 @@ export const CrawlerDependency = { const { host, port } = extractHostPort(from); try { const peer = PeerDTO.fromJSONObject({ - endpoints: [[port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ")], + endpoints: [ + [port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join( + " " + ), + ], }); const fromHost = peer.getHostPreferDNS(); const fromPort = peer.getPort(); @@ -459,7 +471,11 @@ export const CrawlerDependency = { const { host: toHost, port: toPort } = extractHostPort(target); try { const peer = PeerDTO.fromJSONObject({ - endpoints: [[port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ")], + endpoints: [ + [port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join( + " " + ), + ], }); logger.info("Looking at %s...", source); try { @@ -508,7 +524,9 @@ export const CrawlerDependency = { const { host, port } = extractHostPort(source); try { const peer = PeerDTO.fromJSONObject({ - endpoints: [[port == "443" ? "BMAS" : "BASIC_MERKLED_API"].join(" ")], + endpoints: [ + [port == "443" ? "BMAS" : "BASIC_MERKLED_API"].join(" "), + ], }); logger.info("Looking at %s...", source); try { @@ -752,7 +770,11 @@ export const CrawlerDependency = { ? [ { endpoints: [ - [fromPort == "443" ? "BMAS" : "BASIC_MERKLED_API", fromHost, fromPort].join(" "), + [ + fromPort == "443" ? "BMAS" : "BASIC_MERKLED_API", + fromHost, + fromPort, + ].join(" "), ], }, ] diff --git a/app/modules/crawler/lib/req2fwd.ts b/app/modules/crawler/lib/req2fwd.ts index 14bee1a634139c3ea270bba8b9229d6c3297851b..befe13ec8f22d8346d82bcb1d62604613431d8e3 100644 --- a/app/modules/crawler/lib/req2fwd.ts +++ b/app/modules/crawler/lib/req2fwd.ts @@ -63,7 +63,7 @@ export const req2fwd = async ( for (const received of idty.pendingCerts) { const cid = [received.from, iid].join("-"); if (!certs[cid]) { - await new Promise((res) => setTimeout(res, 300)); + await new Promise<void>((res) => setTimeout(res, 300)); certs[cid] = received; const rawCert = rawer.getOfficialCertification({ currency: "g1", diff --git a/app/modules/crawler/lib/sync.ts b/app/modules/crawler/lib/sync.ts index 69d073a23e107ee909aad9db96dbb52f4246cae0..bf58408e4c2c3500af6e274b0286b29d39d0225d 100644 --- a/app/modules/crawler/lib/sync.ts +++ b/app/modules/crawler/lib/sync.ts @@ -183,6 +183,9 @@ export class Synchroniser extends stream.Duplex { // We use cautious mode if it is asked, or not particulary asked but blockchain has been started const cautious = askedCautious === true || localNumber >= 0; + // TODO Disable constraints + //if (!cautious) await this.server.dal.disableCheckConstraints(); + const milestonesStream = new ValidatorStream( localNumber, to, @@ -211,7 +214,7 @@ export class Synchroniser extends stream.Duplex { this.watcher ); - await new Promise((res, rej) => { + await new Promise<void>((res, rej) => { milestonesStream .pipe(download) .pipe(localIndexer) @@ -241,6 +244,9 @@ export class Synchroniser extends stream.Duplex { await this.syncStrategy.syncPeers(fullSync, to); } + // TODO Enable constraints + //if (!cautious) await this.server.dal.enableCheckConstraints(); + const syncDuration = Date.now() - syncStartTime; this.watcher.end(syncDuration); this.push({ sync: true }); diff --git a/app/modules/crawler/lib/sync/RemoteSynchronizer.ts b/app/modules/crawler/lib/sync/RemoteSynchronizer.ts index fa3c1099d626367fdcaef1e59b31972f81682319..028172c49220c50bc1319ed442e1090cd6c1d2ef 100644 --- a/app/modules/crawler/lib/sync/RemoteSynchronizer.ts +++ b/app/modules/crawler/lib/sync/RemoteSynchronizer.ts @@ -155,19 +155,17 @@ export class RemoteSynchronizer extends AbstractSynchronizer { // If we know this is a WS2P connection, don't try BMA if (access.isWS2P !== true) { try { + endpoint = + [port == 443 ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ") + + (path ? " " + path : ""); const contacter = await connect( PeerDTO.fromJSONObject({ - endpoints: [ - [port == 443 ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ") + - (path ? (' ' + path) : '') - ], + endpoints: [endpoint], }), 3000 ); peering = await contacter.getPeer(); api = new BMARemoteContacter(contacter); - endpoint = [port == 443 ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ") + - (path ? (' ' + path) : ''); } catch (e) {} } @@ -176,7 +174,7 @@ export class RemoteSynchronizer extends AbstractSynchronizer { const pair = new Key(keypair.pub, keypair.sec); const connection = WS2PConnection.newConnectionToAddress( 1, - `ws://${host}:${port}${path || ''}`, + `ws://${host}:${port}${path || ""}`, new (class SyncMessageHandler implements WS2PMessageHandler { async answerToRequest( json: any, diff --git a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts index 9abc78f271857c6420c73085376f43e5efa915ec..120578daa16ede72927bdef3cdae5fcc4e290a5d 100644 --- a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts +++ b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts @@ -90,7 +90,6 @@ export class GlobalIndexStream extends Duplex { private numberOfChunksToDownload: number; private memToCopyDone = false; - constructor( private conf: ConfDTO, private dal: FileDAL, @@ -125,12 +124,6 @@ export class GlobalIndexStream extends Duplex { })(); } - private async injectLoki<T, K extends keyof T>(dal: T, f: K, obj: T[K]) { - // this.mapInjection[f] = dal[f] - // dal[f] = obj - // await (obj as any).triggerInit() - } - readChunk(i: number) {} _read(size: number) { @@ -442,25 +435,25 @@ export class GlobalIndexStream extends Duplex { // if cautious, use a save (insert or update) if (this.cautious) { await Promise.all( - blocks.map((block) => - this.dal.saveTxsInFiles( - block.transactions, - block.number, - block.medianTime - ) + blocks.map((block) => + this.dal.saveTxsInFiles( + block.transactions, + block.number, + block.medianTime ) + ) ); } // If not cautious: use insert only else { await Promise.all( - blocks.map((block) => - this.dal.insertTxsInFiles( - block.transactions, - block.number, - block.medianTime - ) + blocks.map((block) => + this.dal.insertTxsInFiles( + block.transactions, + block.number, + block.medianTime ) + ) ); } } diff --git a/app/modules/crawler/lib/sync/v2/ValidatorStream.ts b/app/modules/crawler/lib/sync/v2/ValidatorStream.ts index 9f2802eb55758c66ab9b701df1e3ab7a867924f4..26322bac6a8336283246f5e70ae39f3caf54314e 100644 --- a/app/modules/crawler/lib/sync/v2/ValidatorStream.ts +++ b/app/modules/crawler/lib/sync/v2/ValidatorStream.ts @@ -74,7 +74,7 @@ export class ValidatorStream extends Readable { } } catch (e) { failures++; - await new Promise((res) => setTimeout(res, 3000)); + await new Promise<void>((res) => setTimeout(res, 3000)); if (failures >= 15) { NewLogger().error( "Could not get a validation from remote blockchain after %s trials. Stopping sync.", diff --git a/app/modules/daemon.ts b/app/modules/daemon.ts index 7604e6043c8ae898edeaca2af200896205cbc53f..984133fd8af307bff5b567572b39eff2bdac8c0a 100644 --- a/app/modules/daemon.ts +++ b/app/modules/daemon.ts @@ -129,7 +129,7 @@ module.exports = { constants.NB_INITIAL_LINES_TO_SHOW ); // Never ending command - return new Promise((res) => null); + return new Promise<void>((res) => null); }, }, { @@ -159,7 +159,7 @@ module.exports = { logger.info(">> Server ready!"); - return new Promise(() => null); // Never ending + return new Promise<void>(() => null); // Never ending }, }, ], @@ -173,7 +173,7 @@ function ServerService(server: Server) { } function startDaemon(daemon: any) { - return new Promise((resolve, reject) => + return new Promise<void>((resolve, reject) => daemon.start((err: any) => { if (err) return reject(err); resolve(); @@ -182,7 +182,7 @@ function startDaemon(daemon: any) { } function stopDaemon(daemon: any) { - return new Promise((resolve, reject) => + return new Promise<void>((resolve, reject) => daemon.stop((err: any) => { err && console.error(err); if (err) return reject(err); diff --git a/app/modules/keypair/index.ts b/app/modules/keypair/index.ts index a809f75fd2b2af3d665f6fa4443f7ad5a119748c..735b5b03bd28de2e739517a856b0f27e183dabe7 100644 --- a/app/modules/keypair/index.ts +++ b/app/modules/keypair/index.ts @@ -156,7 +156,7 @@ export const KeypairDependency = { }, beforeSave: async ( - conf: KeypairConfDTO, + conf: Partial<KeypairConfDTO>, program: any, logger: any, confDAL: any @@ -172,7 +172,7 @@ export const KeypairDependency = { // We save the key in a separate file const keyring = - 'pub: "' + conf.pair.pub + '"\n' + 'sec: "' + conf.pair.sec + '"'; + 'pub: "' + conf.pair?.pub + '"\n' + 'sec: "' + conf.pair?.sec + '"'; await confDAL.coreFS.write("keyring.yml", keyring); // We never want to store salt, password or keypair in the conf.json file diff --git a/app/modules/keypair/lib/scrypt.ts b/app/modules/keypair/lib/scrypt.ts index 3135ecad6609695a3a0c43684155613337bbae2e..8e35f8d3200224dd8edeb98330ce352d54effba0 100644 --- a/app/modules/keypair/lib/scrypt.ts +++ b/app/modules/keypair/lib/scrypt.ts @@ -32,24 +32,25 @@ export const Scrypt = async ( r = 16, p = 1 ) => { - const res: { pub: string; sec: string } = await new Promise( - (resolve, reject) => { - crypto.scrypt( - key, - salt, - SEED_LENGTH, - { N, r, p }, - (err: any, seed: Buffer) => { - if (err) return reject(err); - const pair = KeyPairBuilder.fromSeed(seed); - resolve({ - pub: pair.getPublicKey(), - sec: seedToSecretKey(seed), - }); - } - ); - } - ); + const res: { pub: string; sec: string } = await new Promise<{ + pub: string; + sec: string; + }>((resolve, reject) => { + crypto.scrypt( + key, + salt, + SEED_LENGTH, + { N, r, p }, + (err: any, seed: Buffer) => { + if (err) return reject(err); + const pair = KeyPairBuilder.fromSeed(seed); + resolve({ + pub: pair.getPublicKey(), + sec: seedToSecretKey(seed), + }); + } + ); + }); return res; }; diff --git a/app/modules/plugin.ts b/app/modules/plugin.ts index 06c60ff584a88e0ec9faf5dbb398fa2c16e12bae..83d2793393673321f3bacd691ede629950dd54c3 100644 --- a/app/modules/plugin.ts +++ b/app/modules/plugin.ts @@ -14,7 +14,7 @@ import { ConfDTO } from "../lib/dto/ConfDTO"; import { Server } from "../../server"; -"use strict"; +("use strict"); const fs = require("fs"); const path = require("path"); @@ -86,7 +86,7 @@ function npmInstall( npm: string | null = null, cwd: string | null = null ) { - return new Promise((res, rej) => { + return new Promise<void>((res, rej) => { const node = getNode(); npm = npm || getNPM(); cwd = cwd || getCWD(); @@ -117,7 +117,7 @@ function npmRemove( npm: string | null = null, cwd: string | null = null ) { - return new Promise((res, rej) => { + return new Promise<void>((res, rej) => { const node = getNode(); npm = npm || getNPM(); cwd = cwd || getCWD(); @@ -167,7 +167,7 @@ async function checkNPMAccess() { } async function getNPMAccess() { - const hasAccessToPackageJSON = await new Promise((res) => { + const hasAccessToPackageJSON = await new Promise<boolean>((res) => { fs.access( path.join(__dirname, "/../../package.json"), fs.constants.R_OK | fs.constants.W_OK, @@ -176,7 +176,7 @@ async function getNPMAccess() { } ); }); - const hasAccessToNodeModules = await new Promise((res) => { + const hasAccessToNodeModules = await new Promise<boolean>((res) => { fs.access( path.join(__dirname, "/../../node_modules"), fs.constants.R_OK | fs.constants.W_OK, diff --git a/app/modules/prover/index.ts b/app/modules/prover/index.ts index 2d4a3d1ddcfffe4a6a3ff74af3223f46854675fb..05cf362dc1762b4628cc9cf61f2d447fadd5a596 100644 --- a/app/modules/prover/index.ts +++ b/app/modules/prover/index.ts @@ -50,7 +50,7 @@ export const ProverDependency = { conf.powSecurityRetryDelay = ProverConstants.POW_SECURITY_RETRY_DELAY; conf.powMaxHandicap = ProverConstants.POW_MAXIMUM_ACCEPTABLE_HANDICAP; }, - beforeSave: async (conf: ConfDTO) => { + beforeSave: async (conf: Partial<ConfDTO>) => { delete conf.powSecurityRetryDelay; delete conf.powMaxHandicap; }, @@ -244,7 +244,7 @@ function generateAndSend( getGenerationMethod: any ) { const logger = server.logger; - return new Promise((resolve, reject) => { + return new Promise<any>((resolve, reject) => { if (!program.submitLocal) { if (!program.submitHost) { throw "Option --submit-host is required."; @@ -351,7 +351,13 @@ function proveAndSend( next(); } else { const peer = PeerDTO.fromJSONObject({ - endpoints: [[port == "443" ? "BMAS" : "BASIC_MERKLED_API", host, port].join(" ")], + endpoints: [ + [ + port == "443" ? "BMAS" : "BASIC_MERKLED_API", + host, + port, + ].join(" "), + ], }); program.show && console.log(proven.getRawSigned()); logger.info("Posted block " + proven.getRawSigned()); diff --git a/app/modules/prover/lib/permanentProver.ts b/app/modules/prover/lib/permanentProver.ts index bf52ee7d7cc2d7a77565b9c49aa3912497c22f2e..aaf574c96e505323a83023335c6dd7371f938b9c 100644 --- a/app/modules/prover/lib/permanentProver.ts +++ b/app/modules/prover/lib/permanentProver.ts @@ -20,6 +20,7 @@ import { parsers } from "../../../lib/common-libs/parsers/index"; import { Server } from "../../../../server"; import { Querable, querablep } from "../../../lib/common-libs/querable"; +import { BlockDTO } from "../../../lib/dto/BlockDTO"; export class PermanentProver { logger: any; @@ -29,12 +30,11 @@ export class PermanentProver { loops: number; private permanencePromise: Querable<void> | null = null; - - private blockchainChangedResolver: any = null; - private promiseOfWaitingBetween2BlocksOfOurs: any = null; - private lastComputedBlock: any = null; - private resolveContinuePromise: any = null; - private continuePromise: any = null; + private blockchainChangedResolver: ((value: void) => void) | null = null; + private promiseOfWaitingBetween2BlocksOfOurs: Promise<void> | null = null; + private lastComputedBlock: BlockDTO | null = null; + private resolveContinuePromise: ((value: boolean) => void) | null = null; + private continuePromise: Promise<boolean> | null = null; constructor(private server: Server) { this.logger = server.logger; @@ -44,7 +44,7 @@ export class PermanentProver { // Promises triggering the prooving lopp this.resolveContinuePromise = null; - this.continuePromise = new Promise( + this.continuePromise = new Promise<boolean>( (resolve) => (this.resolveContinuePromise = resolve) ); @@ -55,13 +55,13 @@ export class PermanentProver { if (!this.permanencePromise || this.permanencePromise.isFulfilled()) { this.startPermanence(); } - this.resolveContinuePromise(true); + this.resolveContinuePromise && this.resolveContinuePromise(true); } async startPermanence() { - let permanenceResolve = () => {}; + let permanenceResolve: (value: void) => void = () => {}; this.permanencePromise = querablep( - new Promise((res) => { + new Promise<void>((res) => { permanenceResolve = res; }) ); @@ -99,8 +99,8 @@ export class PermanentProver { this.checkTrialIsNotTooHigh(trial, current, selfPubkey); const lastIssuedByUs = current.issuer == selfPubkey; if (lastIssuedByUs && !this.promiseOfWaitingBetween2BlocksOfOurs) { - this.promiseOfWaitingBetween2BlocksOfOurs = new Promise((resolve) => - setTimeout(resolve, theConf.powDelay) + this.promiseOfWaitingBetween2BlocksOfOurs = new Promise<void>( + (resolve) => setTimeout(resolve, theConf.powDelay) ); this.logger.warn( "Waiting " + @@ -126,15 +126,15 @@ export class PermanentProver { let cancelAlreadyTriggered = false; // The canceller - (async () => { + setTimeout(async () => { // If the blockchain changes - await new Promise( + await new Promise<void>( (resolve) => (this.blockchainChangedResolver = resolve) ); cancelAlreadyTriggered = true; // Then cancel the generation await this.prover.cancel(); - })(); + }); let unsignedBlock = null, trial2 = 0; @@ -165,11 +165,13 @@ export class PermanentProver { ); } try { - const obj = parsers.parseBlock.syncWrite( - dos2unix(this.lastComputedBlock.getRawSigned()) - ); + const obj = + this.lastComputedBlock && + parsers.parseBlock.syncWrite( + dos2unix(this.lastComputedBlock.getRawSigned()) + ); await this.server.writeBlock(obj); - await new Promise((res) => { + await new Promise<void>((res) => { this.server.once("bcEvent", () => res()); }); } catch (err) { @@ -201,7 +203,7 @@ export class PermanentProver { await Promise.race( waitingRaces.concat([ // The blockchain has changed! We or someone else found a proof, we must make a gnu one - new Promise( + new Promise<void>( (resolve) => (this.blockchainChangedResolver = () => { this.logger.warn("Blockchain changed!"); @@ -210,7 +212,7 @@ export class PermanentProver { ), // Security: if nothing happens for a while, trigger the whole process again - new Promise((resolve) => + new Promise<void>((resolve) => setTimeout(() => { if (!raceDone) { this.logger.warn( @@ -251,10 +253,10 @@ export class PermanentProver { } } - async stopEveryting() { + async stopEverything() { // First: avoid continuing the main loop - this.resolveContinuePromise(true); - this.continuePromise = new Promise( + this.resolveContinuePromise && this.resolveContinuePromise(true); + this.continuePromise = new Promise<boolean>( (resolve) => (this.resolveContinuePromise = resolve) ); // Second: stop any started proof diff --git a/app/modules/prover/lib/proof.ts b/app/modules/prover/lib/proof.ts index f24d30571026488f51a3e663b20fdb2c9a5546c7..5c242b58e5631122ac9c2375588487a652ae0e73 100644 --- a/app/modules/prover/lib/proof.ts +++ b/app/modules/prover/lib/proof.ts @@ -53,7 +53,7 @@ export function createPowWorker() { process.exit(ExitCodes.OK); }); - process.on("message", async (message) => { + process.on("message", async (message: any) => { switch (message.command) { case "newPoW": (async () => { @@ -383,7 +383,7 @@ export function createPowWorker() { } function pSend(stuff: any) { - return new Promise(function (resolve, reject) { + return new Promise<void>(function (resolve, reject) { if (process.send) { process.send(stuff, function (error: any) { !error && resolve(); diff --git a/app/modules/prover/lib/prover.ts b/app/modules/prover/lib/prover.ts index c1adcbdea0927d6ed8d735e9f892ba128056731b..dbdce332842833595811977ebf7c51760e820f13 100644 --- a/app/modules/prover/lib/prover.ts +++ b/app/modules/prover/lib/prover.ts @@ -45,6 +45,6 @@ export class Prover extends stream.Transform { } async stopService() { - await this.permaProver.stopEveryting(); + await this.permaProver.stopEverything(); } } diff --git a/app/modules/upnp-provider.ts b/app/modules/upnp-provider.ts index 776453de15c99ea4e34140a4926da2146ec1c0a8..6783bb93703563f7522b13707df6f5b81f1403c8 100644 --- a/app/modules/upnp-provider.ts +++ b/app/modules/upnp-provider.ts @@ -43,7 +43,7 @@ export class UpnpProvider { async checkUPnPisAvailable() { try { - await new Promise((resolve, reject) => { + await new Promise<void>((resolve, reject) => { this.client.externalIp((err: any, res: any) => { if (err || !res) { reject(); @@ -179,7 +179,7 @@ export class UpnpProvider { } static async getUPnPMappings(client: any): Promise<any> { - return new Promise((resolve, reject) => { + return new Promise<any>((resolve, reject) => { client.getMappings((err: any, res: any) => { if (err) { reject(err); @@ -200,7 +200,7 @@ export class UpnpProvider { let keys = Underscore.keys(netInterfaces); let res = []; for (const name of keys) { - let addresses = netInterfaces[name]; + let addresses = netInterfaces[name] || []; for (const addr of addresses) { if (!family || addr.family == family) { res.push({ diff --git a/app/modules/ws2p/lib/WS2PConnection.ts b/app/modules/ws2p/lib/WS2PConnection.ts index e186327f196c8cd57512cd58f52668dc8544b403..4fd39fd37fb5d93b9b94bc717aef5911ebf942e3 100644 --- a/app/modules/ws2p/lib/WS2PConnection.ts +++ b/app/modules/ws2p/lib/WS2PConnection.ts @@ -528,7 +528,7 @@ export class WS2PConnection { try { await Promise.race([ connectionTimeout, - new Promise((resolve, reject) => { + new Promise<void>((resolve, reject) => { (async () => { await this.onWsOpened; try { @@ -737,7 +737,7 @@ export class WS2PConnection { async request(body: WS2PRequest) { await this.connectAsInitiator(); const uuid = nuuid.v4(); - return new Promise((resolve, reject) => { + return new Promise<void>((resolve, reject) => { this.nbRequestsCount++; this.ws.send( JSON.stringify({ @@ -761,7 +761,7 @@ export class WS2PConnection { extras, Promise.race([ // The answer - new Promise((res, rej) => { + new Promise<void>((res, rej) => { extras.resolve = res; extras.reject = () => { this.errorDetected(WS2P_ERR.REQUEST_FAILED); @@ -827,7 +827,7 @@ export class WS2PConnection { async pushData(type: WS2P_PUSH, key: string, data: any) { await this.connectAsInitiator(); - return new Promise((resolve, reject) => { + return new Promise<void>((resolve, reject) => { this.nbPushsToRemoteCount++; try { this.ws.send( diff --git a/app/modules/ws2p/lib/WS2PServer.ts b/app/modules/ws2p/lib/WS2PServer.ts index 5ebf238f6fc2b04121987615b0891089b9dafea7..fa66c2462bda81fc586ba6e7eff58d8983d3ef38 100644 --- a/app/modules/ws2p/lib/WS2PServer.ts +++ b/app/modules/ws2p/lib/WS2PServer.ts @@ -288,7 +288,7 @@ export class WS2PServer extends events.EventEmitter { async close() { await Promise.all(this.connections.map((c) => c.close())); - return new Promise((res, rej) => { + return new Promise<void>((res, rej) => { this.wss.close((err: any) => { if (err) return rej(err); res(); diff --git a/app/service/IdentityService.ts b/app/service/IdentityService.ts index f3173f885c8f1adc9595879298f1798ef10d52f7..9501db0bbe916ccad1eb83914fbd0a17b921d850 100644 --- a/app/service/IdentityService.ts +++ b/app/service/IdentityService.ts @@ -30,7 +30,7 @@ import { MindexEntry } from "../lib/indexer"; import { DataErrors } from "../lib/common-libs/errors"; import { Tristamp } from "../lib/common/Tristamp"; -"use strict"; +("use strict"); const constants = require("../lib/constants"); const BY_ABSORPTION = true; diff --git a/app/service/PeeringService.ts b/app/service/PeeringService.ts index aa8a7ca60ffca207ff4c863d54a6ed920bec025e..daec3e5899f338a9203fc0650cd3c980816870bb 100755 --- a/app/service/PeeringService.ts +++ b/app/service/PeeringService.ts @@ -76,10 +76,9 @@ export class PeeringService { async mirrorBMAEndpoints() { const localPeer = await this.peer(); const localEndpoints = await this.server.getEndpoints(); - return this.getOtherEndpoints( - localPeer.endpoints, - localEndpoints - ).filter(PeerDTO.isBMA); + return this.getOtherEndpoints(localPeer.endpoints, localEndpoints).filter( + PeerDTO.isBMA + ); } checkPeerSignature(p: PeerDTO) { @@ -363,8 +362,8 @@ export class PeeringService { const ws2pAccess = PeerDTO.fromJSONObject(p2).getFirstNonTorWS2P(); if (ws2pAccess) { logger.info( - `WS2P access: ${ws2pAccess.host}:${ws2pAccess.port}` - + (ws2pAccess.path ? (" " + ws2pAccess.path) : "") + `WS2P access: ${ws2pAccess.host}:${ws2pAccess.port}` + + (ws2pAccess.path ? " " + ws2pAccess.path : "") ); } logger.debug( diff --git a/server.ts b/server.ts index d5c4b7e5d30a25d83bfa321c83c52afc8afd2cbd..97f067ffa985d39c9d2af94c82cab73fa37ad81a 100644 --- a/server.ts +++ b/server.ts @@ -167,9 +167,9 @@ export class Server extends stream.Duplex implements HookableServer { async getSQLiteDB(dbName: string, home: string) { // Check in cach (useful to avoid migration task to create a new driver on the same DB file) let driver: SQLiteDriver = this.sqliteDBs[dbName]; - if (!driver || driver.closed) { + if (!driver || driver.isClosed()) { driver = await Directory.getHomeDB(this.memoryOnly, dbName, home); - this.sqliteDBs[dbName] = driver; + if (!this.memoryOnly) this.sqliteDBs[dbName] = driver; } return driver; } @@ -179,7 +179,7 @@ export class Server extends stream.Duplex implements HookableServer { let driver: LevelUp = this.levelDBs[dbName]; if (!driver || driver.isClosed()) { driver = await Directory.getHomeLevelDB(this.memoryOnly, dbName, home); - this.levelDBs[dbName] = driver; + if (!this.memoryOnly) this.levelDBs[dbName] = driver; } return driver; } @@ -514,6 +514,12 @@ export class Server extends stream.Duplex implements HookableServer { if (this.dal) { await this.dal.close() } + await Promise.all(Object.values(this.sqliteDBs) + .filter(db => db && !db.isClosed()) + .map(db => db.closeConnection())); + await Promise.all(Object.values(this.levelDBs) + .filter(db => db && !db.isClosed()) + .map(db => db.close())); } revert() { diff --git a/test/dal/basic-dal-tests.ts b/test/dal/basic-dal-tests.ts index ccc4ffd264927a573939c862e8688d930d80ffd4..6696c74c3f5b8348931f0ad8b204f702aefe8a48 100644 --- a/test/dal/basic-dal-tests.ts +++ b/test/dal/basic-dal-tests.ts @@ -113,6 +113,10 @@ describe("DAL", function(){ return fileDAL.saveConf({ currency: "meta_brouzouf" } as any); }) + after(() => { + return fileDAL.close(); + }) + it('should have last DB version', async () => { let version = await fileDAL.getDBVersion(); should.exist(version); diff --git a/test/fast/modules/ws2p/single_write.ts b/test/fast/modules/ws2p/single_write.ts index 31d8d09052bd50d9aaf62fb0c893facdff97184b..667aedcc58d36284c0e9e7f3ca3315e0362eb81b 100644 --- a/test/fast/modules/ws2p/single_write.ts +++ b/test/fast/modules/ws2p/single_write.ts @@ -26,7 +26,7 @@ describe('WS2P Single Write limiter', () => { const source = new Readable() const protection = new WS2PSingleWriteStream(PROTECTION_DURATION) let nbDocs = 0 - await new Promise(res => { + await new Promise<void>(res => { source .pipe(protection) .pipe(es.mapSync(() => { @@ -56,4 +56,4 @@ class Readable extends stream.Readable { async _read() { } -} \ No newline at end of file +} diff --git a/test/fast/prover/prover-pow-1-cluster.ts b/test/fast/prover/prover-pow-1-cluster.ts index ea00618c0ebb3e204810328e60656546d16fef45..3560bf861fdc67ab457942b0533a3c39998d4f15 100644 --- a/test/fast/prover/prover-pow-1-cluster.ts +++ b/test/fast/prover/prover-pow-1-cluster.ts @@ -111,7 +111,7 @@ describe('PoW Cluster', () => { } } }) - await new Promise(res => { + await new Promise<void>(res => { master.onInfoMessage = () => res() }) await master.cancelWork() diff --git a/test/integration/fork-resolution/register-fork-blocks.ts b/test/integration/fork-resolution/register-fork-blocks.ts index d448373d5f28797f5bb7148e6dbf79d604aed692..920d6f21bb839d26e022944c406e6bf72f0d8ca2 100644 --- a/test/integration/fork-resolution/register-fork-blocks.ts +++ b/test/integration/fork-resolution/register-fork-blocks.ts @@ -176,7 +176,7 @@ describe("Fork blocks", function() { await s2.sharePeeringWith(s1) await s2.writeBlock(b4a) const b3c = await s3.commit({ time: now + 33 }) - await new Promise((res, rej) => { + await new Promise<void>((res, rej) => { const event = CommonConstants.DocumentError s2.on(event, (e:any) => { try { diff --git a/test/integration/misc/http-api.ts b/test/integration/misc/http-api.ts index 6ec11146cb3f3f5e4fe202068494191e3ce03bc9..1dcb732f603be605e359f61189ce64a9495a2f5e 100644 --- a/test/integration/misc/http-api.ts +++ b/test/integration/misc/http-api.ts @@ -350,7 +350,7 @@ function postBlock(server2:TestingServer) { }) .then(async (result:HttpBlock) => { const numberToReach = block.number - await new Promise((res) => { + await new Promise<void>((res) => { const interval = setInterval(async () => { const current = await server2.dal.getCurrentBlockOrNull() if (current && current.number == numberToReach) { diff --git a/test/integration/proof-of-work/continuous-proof.ts b/test/integration/proof-of-work/continuous-proof.ts index 1db5b4f2882471bd7ca816113ddec6fa02807dfb..63fba46cd3edc61b99570088a9a407d8fb6677a1 100644 --- a/test/integration/proof-of-work/continuous-proof.ts +++ b/test/integration/proof-of-work/continuous-proof.ts @@ -117,9 +117,9 @@ describe("Continous proof-of-work", function() { s2.startBlockComputation(); await s2.until('block', 15); await s2.stopBlockComputation(); - await [ + await Promise.all([ CrawlerDependency.duniter.methods.pullBlocks(s3._server), - new Promise(res => { + new Promise<void>(res => { s3.pipe(es.mapSync((e:any) => { if (e.number === 15) { res() @@ -129,7 +129,7 @@ describe("Continous proof-of-work", function() { }), s3.startBlockComputation() - ]; + ]); const current = await s3.get('/blockchain/current') await s3.stopBlockComputation(); current.number.should.be.aboveOrEqual(14) diff --git a/test/integration/tools/test-until.ts b/test/integration/tools/test-until.ts index 4c05899eab0e5f7599930e6489edf6d440059642..eff7ba46b0890d75c5f8ac3f1ab642e39b65b7ca 100644 --- a/test/integration/tools/test-until.ts +++ b/test/integration/tools/test-until.ts @@ -18,7 +18,7 @@ const UNTIL_TIMEOUT = 115000; export function until(server:TestingServer, eventName:string, count:number) { let counted = 0; const max = count == undefined ? 1 : count; - return new Promise(function (resolve, reject) { + return new Promise<void>(function (resolve, reject) { let finished = false; server._server.on(eventName, function () { counted++; diff --git a/test/integration/tools/toolbox.ts b/test/integration/tools/toolbox.ts index 5dd1d545bbb3fcc8adc9d67b9bb6ef6a08a32995..5c3b65dcf327550c55409430c8bee8b3c3e2ddc6 100644 --- a/test/integration/tools/toolbox.ts +++ b/test/integration/tools/toolbox.ts @@ -260,7 +260,7 @@ export const NewTestingServer = (conf:any) => { } export const serverWaitBlock = async (server:Server, number:number) => { - await new Promise((res) => { + await new Promise<void>((res) => { const interval = setInterval(async () => { const current = await server.dal.getCurrentBlockOrNull() if (current && current.number == number) { @@ -276,7 +276,7 @@ export const waitToHaveBlock = async (server:Server, number:number) => { } export const waitForkResolution = async (server:Server, number:number) => { - await new Promise(res => { + await new Promise<void>(res => { server.pipe(es.mapSync((e:any) => { if (e.bcEvent === 'switched' && e.block.number === number) { res() @@ -288,7 +288,7 @@ export const waitForkResolution = async (server:Server, number:number) => { } export const waitForkWS2PConnection = async (server:Server, pubkey:string) => { - await new Promise(res => { + await new Promise<void>(res => { server.pipe(es.mapSync((e:any) => { if (e.ws2p === 'connected' && e.to.pubkey === pubkey) { res() @@ -300,7 +300,7 @@ export const waitForkWS2PConnection = async (server:Server, pubkey:string) => { } export const waitForkWS2PDisconnection = async (server:Server, pubkey:string) => { - await new Promise(res => { + await new Promise<void>((res) => { server.pipe(es.mapSync((e:any) => { if (e.ws2p === 'disconnected' && e.peer.pub === pubkey) { res() @@ -473,7 +473,7 @@ export class TestingServer { } push(chunk: any, encoding?: string) { - return this.server.push(chunk, encoding) + return this.server.push(chunk, encoding as BufferEncoding) } pipe(writable:stream.Writable) { @@ -562,7 +562,7 @@ export class TestingServer { async commitWaitError(options:any, expectedError:string) { const results = await Promise.all([ - new Promise(res => { + new Promise<void>((res) => { this.server.pipe(es.mapSync((e:any) => { if (e.blockResolutionError === expectedError) { res()