diff --git a/packages/backend/package-lock.json b/packages/backend/package-lock.json index 094013c7c4..d9c6a3709e 100644 --- a/packages/backend/package-lock.json +++ b/packages/backend/package-lock.json @@ -39,7 +39,7 @@ "joi": "^17.8.1", "level": "8.0.0", "libp2p": "0.42.2", - "luxon": "^1.11.4", + "luxon": "^3.4.4", "multiaddr": "^10.0.1", "node-fetch": "^3.3.0", "orbit-db": "0.29.0", @@ -68,7 +68,7 @@ "@types/crypto-js": "^4.0.2", "@types/express": "^4.17.9", "@types/jest": "28.1.8", - "@types/luxon": "^3.3.0", + "@types/luxon": "^3.4.2", "@types/mock-fs": "^4.13.1", "@types/node": "18.11.9", "@types/node-fetch": "^2.5.11", @@ -7368,9 +7368,10 @@ "license": "MIT" }, "node_modules/@types/luxon": { - "version": "3.3.0", - "dev": true, - "license": "MIT" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true }, "node_modules/@types/mime": { "version": "2.0.3", @@ -18382,10 +18383,11 @@ } }, "node_modules/luxon": { - "version": "1.28.0", - "license": "MIT", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/macos-release": { @@ -28689,7 +28691,9 @@ "version": "4.0.1" }, "@types/luxon": { - "version": "3.3.0", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", "dev": true }, "@types/mime": { @@ -35776,7 +35780,9 @@ } }, "luxon": { - "version": "1.28.0" + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" }, "macos-release": { "version": "2.5.1", diff --git a/packages/backend/package.json b/packages/backend/package.json index 531ec3d3c3..00bec63478 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -61,7 +61,7 @@ "@types/crypto-js": "^4.0.2", "@types/express": "^4.17.9", "@types/jest": "28.1.8", - "@types/luxon": "^3.3.0", + "@types/luxon": "^3.4.2", "@types/mock-fs": "^4.13.1", "@types/node": "18.11.9", "@types/node-fetch": "^2.5.11", @@ -108,9 +108,8 @@ "dotenv": "8.2.0", "events": "^3.2.0", "express": "^4.17.1", - "fetch-retry": "^6.0.0", - "node-fetch": "^3.3.0", "fastq": "^1.17.1", + "fetch-retry": "^6.0.0", "get-port": "^5.1.1", "go-ipfs": "npm:mocked-go-ipfs@0.17.0", "http-server": "^0.12.3", @@ -122,8 +121,9 @@ "joi": "^17.8.1", "level": "8.0.0", "libp2p": "0.42.2", - "luxon": "^1.11.4", + "luxon": "^3.4.4", "multiaddr": "^10.0.1", + "node-fetch": "^3.3.0", "orbit-db": "0.29.0", "orbit-db-access-controllers": "^0.4.0", "orbit-db-identity-provider": "0.5.0", diff --git a/packages/backend/src/backendManager.ts b/packages/backend/src/backendManager.ts index d76d655a9b..f5b3403707 100644 --- a/packages/backend/src/backendManager.ts +++ b/packages/backend/src/backendManager.ts @@ -9,11 +9,11 @@ import { TorControl } from './nest/tor/tor-control.service' import { torBinForPlatform, torDirForPlatform } from './nest/common/utils' import initRnBridge from './rn-bridge' import { INestApplicationContext } from '@nestjs/common' -import logger from './nest/common/logger' import { OpenServices, validateOptions } from './options' import { SOCKS_PROXY_AGENT } from './nest/const' +import { createLogger } from './nest/common/logger' -const log = logger('backendManager') +const logger = createLogger('backendManager') const program = new Command() @@ -33,9 +33,11 @@ program program.parse(process.argv) const options = program.opts() -console.log('options', options) +logger.info('options', options) export const runBackendDesktop = async () => { + logger.info('Running backend manager desktop') + const isDev = process.env.NODE_ENV === 'development' const webcrypto = new Crypto() @@ -69,7 +71,7 @@ export const runBackendDesktop = async () => { try { await connectionsManager.closeAllServices() } catch (e) { - log.error('Error occurred while closing backend services', e) + logger.error('Error occurred while closing backend services', e) } if (process.send) process.send('closed-services') } @@ -77,7 +79,7 @@ export const runBackendDesktop = async () => { try { await connectionsManager.leaveCommunity() } catch (e) { - log.error('Error occurred while leaving community', e) + logger.error('Error occurred while leaving community', e) } if (process.send) process.send('leftCommunity') } @@ -85,6 +87,8 @@ export const runBackendDesktop = async () => { } export const runBackendMobile = async () => { + logger.info('Running backend manager mobile') + // Enable triggering push notifications process.env['BACKEND'] = 'mobile' process.env['CONNECTION_TIME'] = (new Date().getTime() / 1000).toString() // Get time in seconds @@ -131,12 +135,12 @@ const platform = options.platform if (platform === 'desktop') { runBackendDesktop().catch(error => { - log.error('Error occurred while initializing backend', error) + logger.error('Error occurred while initializing backend', error) throw error }) } else if (platform === 'mobile') { runBackendMobile().catch(async error => { - log.error('Error occurred while initializing backend', error) + logger.error('Error occurred while initializing backend', error) // Prevent stopping process before getting output await new Promise(resolve => { setTimeout(() => { diff --git a/packages/backend/src/nest/app.module.ts b/packages/backend/src/nest/app.module.ts index 01b4215930..4d040f314d 100644 --- a/packages/backend/src/nest/app.module.ts +++ b/packages/backend/src/nest/app.module.ts @@ -33,6 +33,9 @@ import { StorageModule } from './storage/storage.module' import { IpfsModule } from './ipfs/ipfs.module' import { Level } from 'level' import { verifyToken } from '@quiet/common' +import { createLogger } from './common/logger' + +const logger = createLogger('appModule') @Global() @Module({ @@ -58,7 +61,7 @@ import { verifyToken } from '@quiet/common' export class AppModule { static forOptions(options: ConnectionsManagerTypes) { const configOptions: ConfigOptions = { ...options, ...new ConnectionsManagerOptions() } - console.log('configOptions', configOptions) + logger.info('configOptions', configOptions) return { module: AppModule, providers: [ @@ -105,7 +108,7 @@ export class AppModule { io.engine.use((req, res, next) => { const authHeader = req.headers['authorization'] if (!authHeader) { - console.error('Backend server: No authorization header') + logger.error('Backend server: No authorization header') res.writeHead(401, 'No authorization header') res.end() return @@ -113,7 +116,7 @@ export class AppModule { const token = authHeader && authHeader.split(' ')[1] if (!token) { - console.error('Backend server: No auth token') + logger.error('Backend server: No auth token') res.writeHead(401, 'No authorization token') res.end() return @@ -122,12 +125,12 @@ export class AppModule { if (verifyToken(options.socketIOSecret, token)) { next() } else { - console.error('Backend server: Unauthorized') + logger.error('Backend server: Unauthorized') res.writeHead(401, 'Unauthorized') res.end() } }) - console.log('ok') + logger.info('ok') return { server, io } }, inject: [EXPRESS_PROVIDER], diff --git a/packages/backend/src/nest/common/logger.ts b/packages/backend/src/nest/common/logger.ts index a187ed83ee..185552065c 100644 --- a/packages/backend/src/nest/common/logger.ts +++ b/packages/backend/src/nest/common/logger.ts @@ -1,7 +1,3 @@ -import { logger } from '@quiet/logger' +import { createQuietLogger } from '@quiet/logger' -const createLogger = (name: string) => { - return logger('backend')(name) -} - -export default createLogger +export const createLogger = createQuietLogger('backend') diff --git a/packages/backend/src/nest/common/utils.ts b/packages/backend/src/nest/common/utils.ts index d2dc00e184..0b6e5230e9 100644 --- a/packages/backend/src/nest/common/utils.ts +++ b/packages/backend/src/nest/common/utils.ts @@ -9,14 +9,14 @@ import tmp from 'tmp' import crypto, { sign } from 'crypto' import { type PermsData } from '@quiet/types' import { TestConfig } from '../const' -import logger from './logger' import { Libp2pNodeParams } from '../libp2p/libp2p.types' import { createLibp2pAddress, createLibp2pListenAddress, isDefined } from '@quiet/common' import { Libp2pService } from '../libp2p/libp2p.service' import { CertFieldsTypes, getReqFieldValue, loadCSR } from '@quiet/identity' import { execFile } from 'child_process' +import { createLogger } from './logger' -const log = logger('test') +const logger = createLogger('utils') export interface Ports { socksPort: number @@ -27,7 +27,7 @@ export interface Ports { } export function createPaths(paths: string[]) { - console.log('creating paths in fn - utils') + logger.info('creating paths in fn - utils') for (const path of paths) { if (!fs.existsSync(path)) { fs.mkdirSync(path, { recursive: true }) @@ -37,7 +37,7 @@ export function createPaths(paths: string[]) { export function removeFilesFromDir(dirPath: string) { if (fs.existsSync(dirPath)) { - log(`Removing ${dirPath}`) + logger.info(`Removing ${dirPath}`) fs.rmdirSync(dirPath, { recursive: true }) } } @@ -114,12 +114,12 @@ export const getPorts = async (): Promise => { export class DummyIOServer extends Server { emit(event: string, ...args: any[]): boolean { - log(`Emitting ${event} with args:`, args) + logger.info(`Emitting ${event} with args:`, args) return true } close() { - log('Closing DummyIOServer') + logger.info('Closing DummyIOServer') } } diff --git a/packages/backend/src/nest/connections-manager/connections-manager.service.tor.spec.ts b/packages/backend/src/nest/connections-manager/connections-manager.service.tor.spec.ts index cf798e1036..0dcc50a440 100644 --- a/packages/backend/src/nest/connections-manager/connections-manager.service.tor.spec.ts +++ b/packages/backend/src/nest/connections-manager/connections-manager.service.tor.spec.ts @@ -31,6 +31,9 @@ import { Libp2pEvents } from '../libp2p/libp2p.types' import { sleep } from '../common/sleep' import { createLibp2pAddress } from '@quiet/common' import { lib } from 'crypto-js' +import { createLogger } from '../common/logger' + +const logger = createLogger('connectionsManager:test') jest.setTimeout(100_000) @@ -200,7 +203,7 @@ describe('Connections manager', () => { const peerList: string[] = [] const peersCount = 7 for (let pCount = 0; pCount < peersCount; pCount++) { - console.log('pushing peer ', pCount) + logger.info('pushing peer ', pCount) peerList.push( createLibp2pAddress(`${Math.random().toString(36).substring(2, 13)}.onion`, (await createPeerId()).toString()) ) diff --git a/packages/backend/src/nest/connections-manager/connections-manager.service.ts b/packages/backend/src/nest/connections-manager/connections-manager.service.ts index d3e8782af9..e59a68b467 100644 --- a/packages/backend/src/nest/connections-manager/connections-manager.service.ts +++ b/packages/backend/src/nest/connections-manager/connections-manager.service.ts @@ -46,7 +46,6 @@ import { type UserProfile, type UserProfilesStoredEvent, } from '@quiet/types' -import Logger from '../common/logger' import { CONFIG_OPTIONS, QUIET_DIR, SERVER_IO_PROVIDER, SOCKS_PROXY_AGENT } from '../const' import { Libp2pService } from '../libp2p/libp2p.service' import { Libp2pEvents, Libp2pNodeParams, Libp2pPeerInfo } from '../libp2p/libp2p.types' @@ -64,6 +63,7 @@ import { Tor } from '../tor/tor.service' import { ConfigOptions, GetPorts, ServerIoProviderTypes } from '../types' import { ServiceState, TorInitState } from './connections-manager.types' import { DateTime } from 'luxon' +import { createLogger } from '../common/logger' @Injectable() export class ConnectionsManagerService extends EventEmitter implements OnModuleInit { @@ -74,7 +74,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI isTorInit: TorInitState = TorInitState.NOT_STARTED private peerInfo: Libp2pPeerInfo | undefined = undefined - private readonly logger = Logger(ConnectionsManagerService.name) + private readonly logger = createLogger(ConnectionsManagerService.name) constructor( @Inject(SERVER_IO_PROVIDER) public readonly serverIoProvider: ServerIoProviderTypes, @Inject(CONFIG_OPTIONS) public configOptions: ConfigOptions, @@ -93,12 +93,12 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI async onModuleInit() { process.on('unhandledRejection', error => { - console.error(error) + this.logger.error(error) throw new Error() }) // process.on('SIGINT', function () { // // This is not graceful even in a single percent. we must close services first, not just kill process % - // // this.logger('\nGracefully shutting down from SIGINT (Ctrl-C)') + // // this.logger.info('\nGracefully shutting down from SIGINT (Ctrl-C)') // process.exit(0) // }) const webcrypto = new Crypto() @@ -134,7 +134,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async init() { - console.log('init') + this.logger.info('init') this.communityState = ServiceState.DEFAULT await this.generatePorts() if (!this.configOptions.httpTunnelPort) { @@ -183,7 +183,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } this.socketService.on(SocketActionTypes.LOAD_MIGRATION_DATA, async (data: Record) => { - this.logger('Migrating LevelDB') + this.logger.info('Migrating LevelDB') await this.localDbService.load(data) onDataReceived() }) @@ -194,16 +194,16 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI // mechanism, like a table to hold migrations that have already been // applied. if ((await this.localDbService.exists(LocalDBKeys.COMMUNITY)) && keysRequired.length > 0) { - this.logger('Migration data required:', keysRequired) + this.logger.info('Migration data required:', keysRequired) this.serverIoProvider.io.emit(SocketActionTypes.MIGRATION_DATA_REQUIRED, keysRequired) await dataReceivedPromise } else { - this.logger('Nothing to migrate') + this.logger.info('Nothing to migrate') } } public async launchCommunityFromStorage() { - this.logger('Launching community from storage') + this.logger.info('Launching community from storage') const community = await this.localDbService.getCurrentCommunity() // TODO: Revisit this when we move the Identity model to the backend, since @@ -212,7 +212,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI if (community && network) { const sortedPeers = await this.localDbService.getSortedPeers(community.peerList ?? []) - this.logger('launchCommunityFromStorage - sorted peers', sortedPeers) + this.logger.info('launchCommunityFromStorage - sorted peers', sortedPeers) if (sortedPeers.length > 0) { community.peerList = sortedPeers } @@ -223,26 +223,26 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async closeAllServices(options: { saveTor: boolean } = { saveTor: false }) { - this.logger('Closing services') + this.logger.info('Closing services') await this.closeSocket() if (this.tor && !options.saveTor) { - this.logger('Killing tor') + this.logger.info('Killing tor') await this.tor.kill() } else if (options.saveTor) { - this.logger('Saving tor') + this.logger.info('Saving tor') } if (this.storageService) { - this.logger('Stopping OrbitDB') + this.logger.info('Stopping OrbitDB') await this.storageService?.stopOrbitDb() } if (this.libp2pService) { - this.logger('Stopping libp2p') + this.logger.info('Stopping libp2p') await this.libp2pService.close() } if (this.localDbService) { - this.logger('Closing local DB') + this.logger.info('Closing local DB') await this.localDbService.close() } } @@ -252,31 +252,31 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async pause() { - this.logger('Pausing!') + this.logger.info('Pausing!') await this.closeSocket() - this.logger('Pausing libp2pService!') + this.logger.info('Pausing libp2pService!') this.peerInfo = await this.libp2pService?.pause() - this.logger('Found the following peer info on pause: ', this.peerInfo) + this.logger.info('Found the following peer info on pause: ', this.peerInfo) } public async resume() { - this.logger('Resuming!') + this.logger.info('Resuming!') await this.openSocket() const peersToDial = await this.getPeersOnResume() this.libp2pService?.resume(peersToDial) } public async getPeersOnResume(): Promise { - this.logger('Getting peers to redial') + this.logger.info('Getting peers to redial') if (this.peerInfo && (this.peerInfo?.connected.length !== 0 || this.peerInfo?.dialed.length !== 0)) { - this.logger('Found peer info from pause: ', this.peerInfo) + this.logger.info('Found peer info from pause: ', this.peerInfo) return [...this.peerInfo.connected, ...this.peerInfo.dialed] } - this.logger('Getting peers from stored community (if exists)') + this.logger.info('Getting peers from stored community (if exists)') const community = await this.localDbService.getCurrentCommunity() if (!community) { - this.logger(`No community launched, no peers found`) + this.logger.warn(`No community launched, no peers found`) return [] } return await this.localDbService.getSortedPeers(community.peerList ?? []) @@ -288,23 +288,23 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async leaveCommunity(): Promise { - this.logger('Running leaveCommunity') + this.logger.info('Running leaveCommunity') await this.closeAllServices({ saveTor: true }) - this.logger('Purging data') + this.logger.info('Purging data') await this.purgeData() - this.logger('Resetting Tor') + this.logger.info('Resetting Tor') this.tor.resetHiddenServices() - this.logger('Resetting state') + this.logger.info('Resetting state') await this.resetState() - this.logger('Reopening local DB') + this.logger.info('Reopening local DB') await this.localDbService.open() - this.logger('Restarting socket') + this.logger.info('Restarting socket') await this.openSocket() return true @@ -317,7 +317,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async purgeData() { - this.logger('Purging community data') + this.logger.info('Purging community data') const dirsToRemove = fs .readdirSync(this.quietDir) .filter( @@ -326,26 +326,26 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI ) for (const dir of dirsToRemove) { const dirPath = path.join(this.quietDir, dir) - this.logger(`Removing dir: ${dirPath}`) + this.logger.info(`Removing dir: ${dirPath}`) removeFilesFromDir(dirPath) } } public async getNetwork(): Promise { - this.logger('Getting network information') + this.logger.info('Getting network information') - this.logger('Creating hidden service') + this.logger.info('Creating hidden service') const hiddenService = await this.tor.createNewHiddenService({ targetPort: this.ports.libp2pHiddenService }) - this.logger('Destroying the hidden service we created') + this.logger.info('Destroying the hidden service we created') await this.tor.destroyHiddenService(hiddenService.onionAddress.split('.')[0]) // TODO: Do we want to create the PeerId here? It doesn't necessarily have // anything to do with Tor. - this.logger('Getting peer ID') + this.logger.info('Getting peer ID') const peerId: PeerId = await PeerId.create() const peerIdJson = peerId.toJSON() - this.logger(`Created network for peer ${peerId.toString()}. Address: ${hiddenService.onionAddress}`) + this.logger.info(`Created network for peer ${peerId.toString()}. Address: ${hiddenService.onionAddress}`) return { hiddenService, @@ -373,7 +373,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async createCommunity(payload: InitCommunityPayload): Promise { - this.logger('Creating community', payload.id) + this.logger.info('Creating community', payload.id) if (!payload.CA || !payload.rootCa) { this.logger.error('CA and rootCa are required to create community') @@ -443,13 +443,13 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI await this.localDbService.setCommunity(community) } - this.logger(`Created and launched community ${community.id}`) + this.logger.info(`Created and launched community ${community.id}`) return community } public async downloadCommunityData(inviteData: InvitationDataV2) { - this.logger('Downloading invite data', inviteData) + this.logger.info('Downloading invite data', inviteData) this.storageServerProxyService.setServerAddress(inviteData.serverAddress) let downloadedData: ServerStoredCommunityMetadata try { @@ -466,7 +466,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async joinCommunity(payload: InitCommunityPayload): Promise { - this.logger('Joining community: peers:', payload.peers) + this.logger.info('Joining community: peers:', payload.peers) let metadata = { psk: payload.psk, peers: payload.peers, @@ -475,7 +475,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI const inviteData = payload.inviteData if (inviteData) { - this.logger(`Joining community: inviteData version: ${inviteData.version}`) + this.logger.info(`Joining community: inviteData version: ${inviteData.version}`) switch (inviteData.version) { case InvitationDataVersion.v2: const downloadedData = await this.downloadCommunityData(inviteData) @@ -538,7 +538,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI await this.localDbService.setNetworkInfo(network) await this.launchCommunity({ community, network }) - this.logger(`Joined and launched community ${community.id}`) + this.logger.info(`Joined and launched community ${community.id}`) return community } @@ -556,7 +556,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI try { await this.launch({ community, network }) } catch (e) { - this.logger(`Couldn't launch community for peer ${network.peerId.id}.`, e) + this.logger.error(`Couldn't launch community for peer ${network.peerId.id}.`, e) emitError(this.serverIoProvider.io, { type: SocketActionTypes.LAUNCH_COMMUNITY, message: ErrorMessages.COMMUNITY_LAUNCH_FAILED, @@ -566,7 +566,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI return } - this.logger(`Launched community ${community.id}`) + this.logger.info(`Launched community ${community.id}`) this.serverIoProvider.io.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.COMMUNITY_LAUNCHED) @@ -580,7 +580,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async spawnTorHiddenService(communityId: string, network: NetworkInfo): Promise { - this.logger(`Spawning hidden service for community ${communityId}, peer: ${network.peerId.id}`) + this.logger.info(`Spawning hidden service for community ${communityId}, peer: ${network.peerId.id}`) this.serverIoProvider.io.emit( SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.SPAWNING_HIDDEN_SERVICE @@ -592,7 +592,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } public async launch({ community, network }: { community: Community; network: NetworkInfo }) { - this.logger(`Launching community ${community.id}: peer: ${network.peerId.id}`) + this.logger.info(`Launching community ${community.id}: peer: ${network.peerId.id}`) const onionAddress = await this.spawnTorHiddenService(community.id, network) @@ -606,7 +606,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI const peerId = await peerIdFromKeys(restoredRsa.marshalPubKey(), restoredRsa.marshalPrivKey()) const peers = community.peerList - this.logger(`Launching community ${community.id}: payload peers: ${peers}`) + this.logger.info(`Launching community ${community.id}: payload peers: ${peers}`) const params: Libp2pNodeParams = { peerId, @@ -668,7 +668,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI }) } - this.logger('Storage initialized') + this.logger.info('Storage initialized') this.serverIoProvider.io.emit( SocketActionTypes.CONNECTION_PROCESS_INFO, @@ -677,13 +677,13 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI } private attachTorEventsListeners() { - this.logger('attachTorEventsListeners') + this.logger.info('attachTorEventsListeners') this.tor.on(SocketActionTypes.CONNECTION_PROCESS_INFO, data => { this.serverIoProvider.io.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, data) }) this.tor.on(SocketActionTypes.REDIAL_PEERS, async data => { - this.logger(`Socket - ${SocketActionTypes.REDIAL_PEERS}`) + this.logger.info(`Socket - ${SocketActionTypes.REDIAL_PEERS}`) const peerInfo = this.libp2pService?.getCurrentPeerInfo() await this.libp2pService?.redialPeers([...peerInfo.connected, ...peerInfo.dialed]) }) @@ -698,9 +698,9 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI // Update Frontend with Initialized Communities if (this.communityId) { this.serverIoProvider.io.emit(SocketActionTypes.COMMUNITY_LAUNCHED, { id: this.communityId }) - this.logger('this.libp2pService.connectedPeers', this.libp2pService.connectedPeers) - this.logger('this.libp2pservice', this.libp2pService) - this.logger('this.libp2pService.dialedPeers', this.libp2pService.dialedPeers) + this.logger.info('this.libp2pService.connectedPeers', this.libp2pService.connectedPeers) + this.logger.info('this.libp2pservice', this.libp2pService) + this.logger.info('this.libp2pService.dialedPeers', this.libp2pService.dialedPeers) this.serverIoProvider.io.emit( SocketActionTypes.CONNECTED_PEERS, Array.from(this.libp2pService.connectedPeers.keys()) @@ -714,14 +714,14 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI this.socketService.on( SocketActionTypes.CREATE_NETWORK, async (communityId: string, callback: (response: NetworkInfo | undefined) => void) => { - this.logger(`socketService - ${SocketActionTypes.CREATE_NETWORK}`) + this.logger.info(`socketService - ${SocketActionTypes.CREATE_NETWORK}`) callback(await this.createNetwork(communityId)) } ) this.socketService.on( SocketActionTypes.CREATE_COMMUNITY, async (args: InitCommunityPayload, callback: (response: Community | undefined) => void) => { - this.logger(`socketService - ${SocketActionTypes.CREATE_COMMUNITY}`) + this.logger.info(`socketService - ${SocketActionTypes.CREATE_COMMUNITY}`) callback(await this.createCommunity(args)) } ) @@ -729,19 +729,19 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI this.socketService.on( SocketActionTypes.LAUNCH_COMMUNITY, async (args: InitCommunityPayload, callback: (response: Community | undefined) => void) => { - this.logger(`socketService - ${SocketActionTypes.LAUNCH_COMMUNITY}`) + this.logger.info(`socketService - ${SocketActionTypes.LAUNCH_COMMUNITY}`) callback(await this.joinCommunity(args)) } ) this.socketService.on(SocketActionTypes.LEAVE_COMMUNITY, async (callback: (closed: boolean) => void) => { - this.logger(`socketService - ${SocketActionTypes.LEAVE_COMMUNITY}`) + this.logger.info(`socketService - ${SocketActionTypes.LEAVE_COMMUNITY}`) callback(await this.leaveCommunity()) }) // Username registration this.socketService.on(SocketActionTypes.ADD_CSR, async (payload: SaveCSRPayload) => { - this.logger(`socketService - ${SocketActionTypes.ADD_CSR}`) + this.logger.info(`socketService - ${SocketActionTypes.ADD_CSR}`) await this.storageService?.saveCSR(payload) }) @@ -764,7 +764,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI this.socketService.on( SocketActionTypes.DELETE_FILES_FROM_CHANNEL, async (payload: DeleteFilesFromChannelSocketPayload) => { - this.logger(`socketService - ${SocketActionTypes.DELETE_FILES_FROM_CHANNEL}`, payload) + this.logger.info(`socketService - ${SocketActionTypes.DELETE_FILES_FROM_CHANNEL}`, payload) await this.storageService?.deleteFilesFromChannel(payload) // await this.deleteFilesFromTemporaryDir() //crashes on mobile, will be fixes in next versions } @@ -810,7 +810,7 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI this.serverIoProvider.io.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, data) }) this.storageService.on(StorageEvents.CERTIFICATES_STORED, (payload: SendCertificatesResponse) => { - this.logger(`Storage - ${StorageEvents.CERTIFICATES_STORED}`) + this.logger.info(`Storage - ${StorageEvents.CERTIFICATES_STORED}`) this.serverIoProvider.io.emit(SocketActionTypes.CERTIFICATES_STORED, payload) }) this.storageService.on(StorageEvents.CHANNELS_STORED, (payload: ChannelsReplicatedPayload) => { @@ -847,13 +847,13 @@ export class ConnectionsManagerService extends EventEmitter implements OnModuleI this.serverIoProvider.io.emit(SocketActionTypes.PUSH_NOTIFICATION, payload) }) this.storageService.on(StorageEvents.CSRS_STORED, async (payload: { csrs: string[] }) => { - this.logger(`Storage - ${StorageEvents.CSRS_STORED}`) + this.logger.info(`Storage - ${StorageEvents.CSRS_STORED}`) this.libp2pService.emit(Libp2pEvents.DIAL_PEERS, await getLibp2pAddressesFromCsrs(payload.csrs)) this.serverIoProvider.io.emit(SocketActionTypes.CSRS_STORED, payload) this.registrationService.emit(RegistrationEvents.REGISTER_USER_CERTIFICATE, payload) }) this.storageService.on(StorageEvents.COMMUNITY_METADATA_STORED, async (meta: CommunityMetadata) => { - this.logger(`Storage - ${StorageEvents.COMMUNITY_METADATA_STORED}: ${meta}`) + this.logger.info(`Storage - ${StorageEvents.COMMUNITY_METADATA_STORED}: ${meta}`) const community = await this.localDbService.getCurrentCommunity() if (community) { diff --git a/packages/backend/src/nest/ipfs-file-manager/big-files.long.spec.ts b/packages/backend/src/nest/ipfs-file-manager/big-files.long.spec.ts index e0604f09d2..1e6da795af 100644 --- a/packages/backend/src/nest/ipfs-file-manager/big-files.long.spec.ts +++ b/packages/backend/src/nest/ipfs-file-manager/big-files.long.spec.ts @@ -19,6 +19,10 @@ import { IpfsFileManagerService } from './ipfs-file-manager.service' import { jest } from '@jest/globals' import { sleep } from '../common/sleep' import fs from 'fs' +import { createLogger } from '../common/logger' + +const logger = createLogger('bigFiles:test') + jest.setTimeout(200_000) describe('IpfsFileManagerService', () => { let module: TestingModule @@ -140,9 +144,9 @@ describe('IpfsFileManagerService', () => { await sleep(20_000) await ipfsFileManagerService.stop() - console.time('Stopping ipfs') + logger.time('Stopping ipfs') await ipfsService.ipfsInstance?.stop() - console.timeEnd('Stopping ipfs') + logger.timeEnd('Stopping ipfs') // The jest test doesn't exit cleanly because of some asynchronous actions need time to complete, I can't find what is it. await sleep(100000) diff --git a/packages/backend/src/nest/ipfs-file-manager/ipfs-file-manager.service.ts b/packages/backend/src/nest/ipfs-file-manager/ipfs-file-manager.service.ts index 210ceb39ad..9f0b5d20eb 100644 --- a/packages/backend/src/nest/ipfs-file-manager/ipfs-file-manager.service.ts +++ b/packages/backend/src/nest/ipfs-file-manager/ipfs-file-manager.service.ts @@ -22,10 +22,10 @@ import { BLOCK_FETCH_TIMEOUT, } from './ipfs-file-manager.const' import { LazyModuleLoader } from '@nestjs/core' -import Logger from '../common/logger' import { sleep } from '../common/sleep' const sizeOfPromisified = promisify(sizeOf) const { createPaths, compare } = await import('../common/utils') +import { createLogger } from '../common/logger' @Injectable() export class IpfsFileManagerService extends EventEmitter { @@ -40,7 +40,7 @@ export class IpfsFileManagerService extends EventEmitter { public cancelledDownloads: Set = new Set() public queue: PQueue public files: Map = new Map() - private readonly logger = Logger(IpfsFileManagerService.name) + private readonly logger = createLogger(IpfsFileManagerService.name) constructor( @Inject(QUIET_DIR) public readonly quietDir: string, private readonly lazyModuleLoader: LazyModuleLoader @@ -70,7 +70,7 @@ export class IpfsFileManagerService extends EventEmitter { await this.uploadFile(fileMetadata) }) this.on(IpfsFilesManagerEvents.DOWNLOAD_FILE, async (fileMetadata: FileMetadata) => { - this.logger('Downloading file:', fileMetadata.cid, fileMetadata.size) + this.logger.info('Downloading file:', fileMetadata.cid, fileMetadata.size) if (this.files.get(fileMetadata.cid)) return this.files.set(fileMetadata.cid, { size: fileMetadata.size || 0, @@ -86,7 +86,7 @@ export class IpfsFileManagerService extends EventEmitter { if (fileDownloaded) { await this.cancelDownload(fileDownloaded.cid) } else { - console.error(`downloading ${mid} has already been canceled or never started`) + this.logger.error(`downloading ${mid} has already been canceled or never started`) } }) } @@ -99,17 +99,17 @@ export class IpfsFileManagerService extends EventEmitter { try { const result = await this.ipfs.pin.rm(fileMetadata.cid, { recursive: true }) } catch (e) { - console.log('file removing error') - console.log(e) + this.logger.error('file removing error', e) } const gcresult = this.ipfs.repo.gc() for await (const res of gcresult) { - console.log('garbage collector result', res) + this.logger.info('garbage collector result', res) } } public async stop() { + this.logger.info('Stopping IpfsFileManagerService') for await (const cid of this.files.keys()) { await this.cancelDownload(cid) } @@ -124,7 +124,7 @@ export class IpfsFileManagerService extends EventEmitter { try { newFilename = decodeURIComponent(filename).replace(/\s/g, '') } catch (e) { - this.logger(`Could not decode filename ${filename}`) + this.logger.error(`Could not decode filename ${filename}`, e) newFilename = filename } @@ -137,7 +137,7 @@ export class IpfsFileManagerService extends EventEmitter { fs.copyFileSync(originalFilePath, newPath) filePath = newPath } catch (e) { - console.error(`Couldn't copy file ${originalFilePath} to ${newPath}. Error: ${e.message}`) + this.logger.error(`Couldn't copy file ${originalFilePath} to ${newPath}.`, e) } return filePath } @@ -145,11 +145,11 @@ export class IpfsFileManagerService extends EventEmitter { public deleteFile(filePath: string) { try { if (fs.existsSync(filePath)) { - this.logger(`Removing file ${filePath}`) + this.logger.info(`Removing file ${filePath}`) fs.unlinkSync(filePath) } } catch (e) { - this.logger(`Could not remove file ${filePath}. Reason: ${e.messages}`) + this.logger.error(`Could not remove file ${filePath}`, e) } } @@ -164,7 +164,7 @@ export class IpfsFileManagerService extends EventEmitter { try { imageSize = await sizeOfPromisified(metadata.path) } catch (e) { - console.error(`Couldn't get image dimensions (${metadata.path}). Error: ${e.message}`) + this.logger.error(`Couldn't get image dimensions (${metadata.path})`, e) throw new Error(`Couldn't get image dimensions (${metadata.path}). Error: ${e.message}`) } width = imageSize?.width @@ -191,10 +191,10 @@ export class IpfsFileManagerService extends EventEmitter { // Save copy to separate directory const filePath = this.copyFile(metadata.path, filename) - console.time(`Writing ${filename} to ipfs`) + this.logger.time(`Writing ${filename} to ipfs`) const newCid = await this.ipfs.add(uploadedFileStreamIterable) - console.timeEnd(`Writing ${filename} to ipfs`) + this.logger.timeEnd(`Writing ${filename} to ipfs`) this.emit(StorageEvents.REMOVE_DOWNLOAD_STATUS, { cid: metadata.cid }) const fileMetadata: FileMetadata = { @@ -454,7 +454,7 @@ export class IpfsFileManagerService extends EventEmitter { await new Promise((resolve, reject) => { writeStream.write(entry, err => { if (err) { - console.error(`${fileMetadata.name} writing to file error: ${err}`) + this.logger.error(`${fileMetadata.name} writing to file error`, err) reject(err) } }) diff --git a/packages/backend/src/nest/ipfs-file-manager/testUtils/storageSnapshot.ts b/packages/backend/src/nest/ipfs-file-manager/testUtils/storageSnapshot.ts index 3242695578..c6eb9b15a1 100644 --- a/packages/backend/src/nest/ipfs-file-manager/testUtils/storageSnapshot.ts +++ b/packages/backend/src/nest/ipfs-file-manager/testUtils/storageSnapshot.ts @@ -8,12 +8,13 @@ import type EventStore from 'orbit-db-eventstore' import type PeerId from 'peer-id' import { StorageOptions } from '../../common/types' -import logger from '../../logger' import { Storage } from '..' import { createPaths } from '../../common/utils' -const log = logger('dbSnap') +import { createLogger } from '../../logger' + +const logger = createLogger('storageSnapshot') class StorageTestSnapshotOptions extends StorageOptions { messagesCount: number @@ -56,7 +57,7 @@ export class StorageTestSnapshot extends Storage { } public async init(libp2p: Libp2p, peerID: PeerId): Promise { - log(`${this.name}; StorageTest: Entered init`) + logger.info(`${this.name}; StorageTest: Entered init`) if (this.options?.createPaths) { createPaths([this.ipfsRepoPath, this.orbitDbDir]) } @@ -66,7 +67,7 @@ export class StorageTestSnapshot extends Storage { await this.createDbForSnapshotInfo() await this.createDbForMessages() - log(`Initialized '${this.name}'`) + logger.info(`Initialized '${this.name}'`) } public setName(name: string) { @@ -87,21 +88,21 @@ export class StorageTestSnapshot extends Storage { this.snapshotInfoDb.events.on('replicated', async () => { // Retrieve snapshot that someone else saved to db if (!this.options.createSnapshot || process.env.CREATE_SNAPSHOT !== 'true') { - log('Replicated snapshotInfoDb') + logger.info('Replicated snapshotInfoDb') await this.saveRemoteSnapshot(this.messages) - console.time('load from snapshot') + logger.time('load from snapshot') await this.loadFromSnapshot(this.messages) - console.timeEnd('load from snapshot') + logger.timeEnd('load from snapshot') } }) // this.snapshotInfoDb.events.on('replicate.progress', (address, hash, entry, progress, total) => { - // log(`${this.name}; replication in progress:`, address, hash, entry, progress, total) - // log('>>', entry.payload.value.snapshot) + // logger.info(`${this.name}; replication in progress:`, address, hash, entry, progress, total) + // logger.info('>>', entry.payload.value.snapshot) // }) } private async createDbForMessages() { - log('createDbForMessages init') + logger.info('createDbForMessages init') this.messages = await this.orbitdb.log('3479623913-test', { accessController: { write: ['*'], @@ -110,25 +111,25 @@ export class StorageTestSnapshot extends Storage { // Create snapshot and save to db for other peers to retrieve if (this.options.createSnapshot || process.env.CREATE_SNAPSHOT === 'true') { - console.time(`${this.name}; Adding messages`) + logger.time(`${this.name}; Adding messages`) await this.addMessages() - console.timeEnd(`${this.name}; Adding messages`) - console.time('Loading messages') + logger.timeEnd(`${this.name}; Adding messages`) + logger.time('Loading messages') await this.messages.load() - console.timeEnd('Loading messages') + logger.timeEnd('Loading messages') if (this.useSnapshot) { - console.time('Saving Snapshot') + logger.time('Saving Snapshot') await this.saveSnapshot(this.messages) - console.timeEnd('Saving Snapshot') + logger.timeEnd('Saving Snapshot') } } // eslint-disable-next-line this.messages.events.on('replicated', async () => { this.msgReplCount += 1 - log(`${this.name}; Replicated ${this.msgReplCount} chunk`) + logger.info(`${this.name}; Replicated ${this.msgReplCount} chunk`) // await this.messages.load() - // log('Loaded entries after replication:', this.getAllEventLogEntries(this.messages).length) + // logger.info('Loaded entries after replication:', this.getAllEventLogEntries(this.messages).length) }) // eslint-disable-next-line @@ -136,42 +137,42 @@ export class StorageTestSnapshot extends Storage { 'replicate.progress', async (_address, _hash, _entry, progress, _total) => { if (!this.replicationStartTime) { - console.time(`${this.name}; Replication time`) + logger.time(`${this.name}; Replication time`) this.replicationStartTime = new Date() - log('progress start', progress) + logger.info('progress start', progress) } - // log('---') - // log(`replicate.progress: ${address}`) - // log(`replicate.progress: ${hash}`) - // log(`${this.name}; replicate.progress: ${entry.payload.value}`) - // log(`replicate.progress: ${progress}`) - // log(`replicate.progress: ${total}`) + // logger.info('---') + // logger.info(`replicate.progress: ${address}`) + // logger.info(`replicate.progress: ${hash}`) + // logger.info(`${this.name}; replicate.progress: ${entry.payload.value}`) + // logger.info(`replicate.progress: ${progress}`) + // logger.info(`replicate.progress: ${total}`) // await this.messages.load() - // log('Loaded entries replicate.progress:', this.getAllEventLogEntries(this.messages).length) + // logger.info('Loaded entries replicate.progress:', this.getAllEventLogEntries(this.messages).length) // fs.writeFileSync('allReplicatedMessages.json', JSON.stringify(this.getAllEventLogEntries(this.messages))) if (progress === this.messagesCount) { - console.timeEnd(`${this.name}; Replication time`) + logger.timeEnd(`${this.name}; Replication time`) const diff = new Date().getTime() - this.replicationStartTime.getTime() this.replicationTime = Number(diff / 1000) } }) await this.messages.load() - log(`${this.name}; Loaded entries:`, this.getAllEventLogEntries(this.messages).length) + logger.info(`${this.name}; Loaded entries:`, this.getAllEventLogEntries(this.messages).length) } private async addMessages() { // Generate and add "messages" to db - log(`Adding ${this.messagesCount} messages`) + logger.info(`Adding ${this.messagesCount} messages`) const range = (n: number) => Array.from(Array(n).keys()) const messages = range(this.messagesCount).map(nr => `message_${nr.toString()}`) await Promise.all(messages.map(async msg => await this.messages.add(msg))) // Use code below if you care about messages order // for (const nr of range(this.messagesCount)) { - // // console.time(`adding msg ${nr.toString()}`) + // // logger.time(`adding msg ${nr.toString()}`) // await this.messages.add(`message_${nr.toString()}`) - // // console.timeEnd(`adding msg ${nr.toString()}`) + // // logger.timeEnd(`adding msg ${nr.toString()}`) // } } @@ -188,7 +189,7 @@ export class StorageTestSnapshot extends Storage { if (this.snapshotSaved) { return } - log('Saving remote snapshot locally') + logger.info('Saving remote snapshot locally') const snapshotData = this.getSnapshotFromDb() await db._cache.set(snapshotData.snapshotPath, snapshotData.snapshot) @@ -197,7 +198,7 @@ export class StorageTestSnapshot extends Storage { } async saveSnapshotInfoToDb(queuePath: string, snapshotPath: string, snapshot: any, unfinished: any[]) { - log('Saving snapshot info to DB') + logger.info('Saving snapshot info to DB') await this.snapshotInfoDb.add({ queuePath, snapshotPath, @@ -206,14 +207,14 @@ export class StorageTestSnapshot extends Storage { size: snapshot.size, unfinished, }) - log('Saved snapshot info to DB') + logger.info('Saved snapshot info to DB') } public getSnapshotFromDb() { const snapshotInfo: SnapshotInfo = this.getAllEventLogEntries(this.snapshotInfoDb)[0] // Assume that at this point we replicated snapshot info - log(`${this.name}; snapshot retrieved`, snapshotInfo) + logger.info(`${this.name}; snapshot retrieved`, snapshotInfo) const cidObj = null - log('CID', cidObj) + logger.info('CID', cidObj) const snapshot = { path: snapshotInfo.hash, cid: cidObj, @@ -251,7 +252,7 @@ export class StorageTestSnapshot extends Storage { await db._cache.set(db.snapshotPath, snapshot) await db._cache.set(db.queuePath, unfinished) - console.debug(`Saved snapshot: ${snapshot.hash as string}, queue length: ${unfinished.length as string}`) + logger.debug(`Saved snapshot: ${snapshot.hash as string}, queue length: ${unfinished.length as string}`) await this.saveSnapshotInfoToDb( // Saving it to share with others db.queuePath, diff --git a/packages/backend/src/nest/ipfs/ipfs.service.ts b/packages/backend/src/nest/ipfs/ipfs.service.ts index bd5c4024d9..0147b7d672 100644 --- a/packages/backend/src/nest/ipfs/ipfs.service.ts +++ b/packages/backend/src/nest/ipfs/ipfs.service.ts @@ -2,13 +2,13 @@ import { Inject, Injectable } from '@nestjs/common' import { LazyModuleLoader } from '@nestjs/core' import { create, IPFS } from 'ipfs-core' import { IPFS_REPO_PATCH } from '../const' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' @Injectable() export class IpfsService { public ipfsInstance: IPFS | null private counter = 0 - private readonly logger = Logger(IpfsService.name) + private readonly logger = createLogger(IpfsService.name) constructor( @Inject(IPFS_REPO_PATCH) public readonly ipfsRepoPath: string, private readonly lazyModuleLoader: LazyModuleLoader @@ -16,7 +16,7 @@ export class IpfsService { public async createInstance(peerId: any) { this.counter++ - console.log('counter ipfs', this.counter) + this.logger.info('counter ipfs', this.counter) const { Libp2pModule } = await import('../libp2p/libp2p.module') const moduleRef = await this.lazyModuleLoader.load(() => Libp2pModule) const { Libp2pService } = await import('../libp2p/libp2p.service') @@ -53,7 +53,7 @@ export class IpfsService { try { await this.ipfsInstance?.stop() } catch (error) { - this.logger.error(error) + this.logger.error('Error while destroying IPFS instance', error) } this.ipfsInstance = null } diff --git a/packages/backend/src/nest/libp2p/libp2p.service.ts b/packages/backend/src/nest/libp2p/libp2p.service.ts index 47a90e1487..24a89b6e82 100644 --- a/packages/backend/src/nest/libp2p/libp2p.service.ts +++ b/packages/backend/src/nest/libp2p/libp2p.service.ts @@ -15,7 +15,6 @@ import { preSharedKey } from 'libp2p/pnet' import { DateTime } from 'luxon' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' -import Logger from '../common/logger' import { SERVER_IO_PROVIDER, SOCKS_PROXY_AGENT } from '../const' import { ServerIoProviderTypes } from '../types' import { webSockets } from '../websocketOverTor' @@ -23,6 +22,7 @@ import { all } from '../websocketOverTor/filters' import { Libp2pConnectedPeer, Libp2pEvents, Libp2pNodeParams, Libp2pPeerInfo } from './libp2p.types' import { ProcessInChunksService } from './process-in-chunks.service' import { peerIdFromString } from '@libp2p/peer-id' +import { createLogger } from '../common/logger' const KEY_LENGTH = 32 export const LIBP2P_PSK_METADATA = '/key/swarm/psk/1.0.0/\n/base16/\n' @@ -32,7 +32,7 @@ export class Libp2pService extends EventEmitter { public libp2pInstance: Libp2p | null public connectedPeers: Map = new Map() public dialedPeers: Set = new Set() - private readonly logger = Logger(Libp2pService.name) + private readonly logger = createLogger(Libp2pService.name) constructor( @Inject(SERVER_IO_PROVIDER) public readonly serverIoProvider: ServerIoProviderTypes, @Inject(SOCKS_PROXY_AGENT) public readonly socksProxyAgent: Agent, @@ -43,7 +43,7 @@ export class Libp2pService extends EventEmitter { private dialPeer = async (peerAddress: string) => { if (this.dialedPeers.has(peerAddress)) { - this.logger(`Skipping dial of ${peerAddress} because its already been dialed`) + this.logger.warn(`Skipping dial of ${peerAddress} because its already been dialed`) return } this.dialedPeers.add(peerAddress) @@ -69,11 +69,11 @@ export class Libp2pService extends EventEmitter { public resume = async (peersToDial: string[]): Promise => { this.processInChunksService.resume() if (peersToDial.length === 0) { - this.logger('No peers to redial!') + this.logger.warn('No peers to redial!') return } - this.logger(`Redialing ${peersToDial.length} peers`) + this.logger.info(`Redialing ${peersToDial.length} peers`) await this.redialPeers(peersToDial) } @@ -104,31 +104,31 @@ export class Libp2pService extends EventEmitter { } public async hangUpPeers(peers: string[]) { - this.logger('Hanging up on all peers') + this.logger.info('Hanging up on all peers') for (const peer of peers) { await this.hangUpPeer(peer) } - this.logger('All peers hung up') + this.logger.info('All peers hung up') } public async hangUpPeer(peerAddress: string) { - this.logger('Hanging up on peer', peerAddress) + this.logger.info('Hanging up on peer', peerAddress) try { const ma = multiaddr(peerAddress) const peerId = peerIdFromString(ma.getPeerId()!) - this.logger('Hanging up connection on libp2p') + this.logger.info('Hanging up connection on libp2p') await this.libp2pInstance?.hangUp(ma) - this.logger('Removing peer from peer store') + this.logger.info('Removing peer from peer store') await this.libp2pInstance?.peerStore.delete(peerId as any) } catch (e) { - this.logger.error(e) + this.logger.error('Error while hanging up on peer', e) } - this.logger('Clearing local data') + this.logger.info('Clearing local data') this.dialedPeers.delete(peerAddress) this.connectedPeers.delete(peerAddress) - this.logger('Done hanging up') + this.logger.info('Done hanging up') } /** @@ -141,11 +141,11 @@ export class Libp2pService extends EventEmitter { const toDial = peersToDial ?? [...this.connectedPeers.keys(), ...this.dialedPeers] if (dialed.length === 0) { - this.logger('No peers to redial!') + this.logger.info('No peers to redial!') return } - this.logger(`Re-dialing ${dialed.length} peers`) + this.logger.info(`Re-dialing ${dialed.length} peers`) // TODO: Sort peers await this.hangUpPeers(dialed) @@ -215,33 +215,33 @@ export class Libp2pService extends EventEmitter { throw new Error('libp2pInstance was not created') } - this.logger(`Local peerId: ${peerId.toString()}`) + this.logger.info(`Local peerId: ${peerId.toString()}`) this.on(Libp2pEvents.DIAL_PEERS, async (addresses: string[]) => { const nonDialedAddresses = addresses.filter(peerAddress => !this.dialedPeers.has(peerAddress)) - this.logger('Dialing', nonDialedAddresses.length, 'addresses') + this.logger.info('Dialing', nonDialedAddresses.length, 'addresses') this.processInChunksService.updateQueue(nonDialedAddresses) }) - this.logger(`Initializing libp2p for ${peerId.toString()}, bootstrapping with ${peers.length} peers`) + this.logger.info(`Initializing libp2p for ${peerId.toString()}, bootstrapping with ${peers.length} peers`) this.serverIoProvider.io.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.INITIALIZING_LIBP2P) this.processInChunksService.init([], this.dialPeer) this.libp2pInstance.addEventListener('peer:discovery', peer => { - this.logger(`${peerId.toString()} discovered ${peer.detail.id}`) + this.logger.info(`${peerId.toString()} discovered ${peer.detail.id}`) }) this.libp2pInstance.addEventListener('peer:connect', async peer => { const remotePeerId = peer.detail.remotePeer.toString() const localPeerId = peerId.toString() - this.logger(`${localPeerId} connected to ${remotePeerId}`) + this.logger.info(`${localPeerId} connected to ${remotePeerId}`) const connectedPeer: Libp2pConnectedPeer = { address: peer.detail.remoteAddr.toString(), connectedAtSeconds: DateTime.utc().valueOf(), } this.connectedPeers.set(remotePeerId, connectedPeer) - this.logger(`${localPeerId} is connected to ${this.connectedPeers.size} peers`) - this.logger(`${localPeerId} has ${this.libp2pInstance?.getConnections().length} open connections`) + this.logger.info(`${localPeerId} is connected to ${this.connectedPeers.size} peers`) + this.logger.info(`${localPeerId} has ${this.libp2pInstance?.getConnections().length} open connections`) this.emit(Libp2pEvents.PEER_CONNECTED, { peers: [remotePeerId], @@ -251,12 +251,12 @@ export class Libp2pService extends EventEmitter { this.libp2pInstance.addEventListener('peer:disconnect', async peer => { const remotePeerId = peer.detail.remotePeer.toString() const localPeerId = peerId.toString() - this.logger(`${localPeerId} disconnected from ${remotePeerId}`) + this.logger.info(`${localPeerId} disconnected from ${remotePeerId}`) if (!this.libp2pInstance) { this.logger.error('libp2pInstance was not created') throw new Error('libp2pInstance was not created') } - this.logger(`${localPeerId} has ${this.libp2pInstance.getConnections().length} open connections`) + this.logger.info(`${localPeerId} has ${this.libp2pInstance.getConnections().length} open connections`) const connectionStartTime: number = this.connectedPeers.get(remotePeerId)!.connectedAtSeconds if (!connectionStartTime) { @@ -269,7 +269,7 @@ export class Libp2pService extends EventEmitter { const connectionDuration: number = connectionEndTime - connectionStartTime this.connectedPeers.delete(remotePeerId) - this.logger(`${localPeerId} is connected to ${this.connectedPeers.size} peers`) + this.logger.info(`${localPeerId} is connected to ${this.connectedPeers.size} peers`) const peerStat: NetworkDataPayload = { peer: remotePeerId, connectionDuration, @@ -280,11 +280,11 @@ export class Libp2pService extends EventEmitter { this.processInChunksService.updateQueue(peers) - this.logger(`Initialized libp2p for peer ${peerId.toString()}`) + this.logger.info(`Initialized libp2p for peer ${peerId.toString()}`) } public async close(): Promise { - this.logger('Closing libp2p service') + this.logger.info('Closing libp2p service') await this.libp2pInstance?.stop() this.processInChunksService.pause() this.libp2pInstance = null diff --git a/packages/backend/src/nest/libp2p/process-in-chunks.service.ts b/packages/backend/src/nest/libp2p/process-in-chunks.service.ts index f83fd8d218..086984d949 100644 --- a/packages/backend/src/nest/libp2p/process-in-chunks.service.ts +++ b/packages/backend/src/nest/libp2p/process-in-chunks.service.ts @@ -1,7 +1,7 @@ import { EventEmitter } from 'events' import fastq, { queueAsPromised } from 'fastq' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' import { randomUUID } from 'crypto' const DEFAULT_CHUNK_SIZE = 10 @@ -19,13 +19,13 @@ export class ProcessInChunksService extends EventEmitter { private taskQueue: queueAsPromised> private deadLetterQueue: ProcessTask[] = [] private processItem: (arg: T) => Promise - private readonly logger = Logger(ProcessInChunksService.name) + private readonly logger = createLogger(ProcessInChunksService.name) constructor() { super() } public init(data: T[], processItem: (arg: T) => Promise, chunkSize: number = DEFAULT_CHUNK_SIZE) { - this.logger(`Initializing process-in-chunks.service with peers ${JSON.stringify(data, null, 2)}`) + this.logger.info(`Initializing process-in-chunks.service with peers`, data) this.processItem = processItem this.chunkSize = chunkSize this.taskQueue = fastq.promise(this, this.processOneItem, this.chunkSize) @@ -34,7 +34,7 @@ export class ProcessInChunksService extends EventEmitter { } public updateQueue(items: T[]) { - this.logger(`Adding ${items.length} items to the task queue`) + this.logger.info(`Adding ${items.length} items to the task queue`) items.forEach(item => this.addToTaskQueue(item)) } @@ -50,24 +50,24 @@ export class ProcessInChunksService extends EventEmitter { if ((itemOrTask as ProcessTask).taskId != null) { task = itemOrTask as ProcessTask } else { - this.logger(`Creating new task for ${itemOrTask}`) + this.logger.info(`Creating new task for ${itemOrTask}`) task = { data: itemOrTask as T, tries: 0, taskId: randomUUID() } } if (!this.isActive) { - this.logger( + this.logger.info( 'ProcessInChunksService is not active, adding tasks to the dead letter queue!\n\nWARNING: You must call "resume" on the ProcessInChunksService to process the dead letter queue!!!' ) this.deadLetterQueue.push(task) - this.logger(`There are now ${this.deadLetterQueue.length} items in the dead letter queue`) + this.logger.info(`There are now ${this.deadLetterQueue.length} items in the dead letter queue`) return } - this.logger(`Adding task ${task.taskId} with data ${task.data} to the task queue`) + this.logger.info(`Adding task ${task.taskId} with data ${task.data} to the task queue`) try { const success = await this.pushToQueueAndRun(task) if (!success) { - this.logger(`Will try to re-attempt task ${task.taskId} with data ${task.data}`) + this.logger.warn(`Will try to re-attempt task ${task.taskId} with data ${task.data}`) await this.pushToQueueAndRun({ ...task, tries: task.tries + 1 }) } } catch (e) { @@ -78,41 +78,41 @@ export class ProcessInChunksService extends EventEmitter { public async processOneItem(task: ProcessTask): Promise { let success: boolean = false try { - this.logger(`Processing task ${task.taskId} with data ${task.data}`) + this.logger.info(`Processing task ${task.taskId} with data ${task.data}`) await this.processItem(task.data) success = true } catch (e) { this.logger.error(`Processing task ${task.taskId} with data ${task.data} failed`, e) } finally { - this.logger(`Done attempting to process task with data ${task.data}`) + this.logger.info(`Done attempting to process task with data ${task.data}`) } return success } private async pushToQueueAndRun(task: ProcessTask): Promise { - this.logger( + this.logger.info( `Pushing task ${task.taskId} to queue, there will now be ${this.taskQueue.length() + 1} items in the queue` ) const success = await this.taskQueue.push(task) if (success) { - this.logger(`Task ${task.taskId} completed successfully`) + this.logger.info(`Task ${task.taskId} completed successfully`) } else { - this.logger(`Task ${task.taskId} failed`) + this.logger.warn(`Task ${task.taskId} failed`) } return success } public resume() { if (this.isActive) { - this.logger('ProcessInChunksService is already active') + this.logger.warn('ProcessInChunksService is already active') return } - this.logger('Resuming ProcessInChunksService') + this.logger.info('Resuming ProcessInChunksService') this.isActive = true this.taskQueue.resume() if (this.deadLetterQueue) { - this.logger(`Adding ${this.deadLetterQueue.length} tasks from the dead letter queue to the task queue`) + this.logger.warn(`Adding ${this.deadLetterQueue.length} tasks from the dead letter queue to the task queue`) this.deadLetterQueue.forEach(task => this.addToTaskQueue(task)) this.deadLetterQueue = [] } @@ -120,11 +120,11 @@ export class ProcessInChunksService extends EventEmitter { public pause() { if (!this.isActive) { - this.logger('ProcessInChunksService is already paused') + this.logger.warn('ProcessInChunksService is already paused') return } - this.logger('Pausing ProcessInChunksService') + this.logger.info('Pausing ProcessInChunksService') this.isActive = false this.deadLetterQueue = this.taskQueue.getQueue() this.taskQueue.kill() diff --git a/packages/backend/src/nest/libp2p/process-in-chunks.spec.ts b/packages/backend/src/nest/libp2p/process-in-chunks.spec.ts index 24d05dd42f..d46612ae3b 100644 --- a/packages/backend/src/nest/libp2p/process-in-chunks.spec.ts +++ b/packages/backend/src/nest/libp2p/process-in-chunks.spec.ts @@ -4,6 +4,10 @@ import waitForExpect from 'wait-for-expect' import { TestModule } from '../common/test.module' import { Test, TestingModule } from '@nestjs/testing' import { sleep } from '../common/sleep' +import { createLogger } from '../common/logger' + +const logger = createLogger('processInChunksService:test') + describe('ProcessInChunks', () => { let module: TestingModule let processInChunks: ProcessInChunksService @@ -19,7 +23,7 @@ describe('ProcessInChunks', () => { it('processes data', async () => { const mockProcessItem = jest .fn(async a => { - console.log('processing', a) + logger.info('processing', a) }) .mockResolvedValueOnce() .mockRejectedValueOnce(new Error('Rejected 1')) @@ -34,7 +38,7 @@ describe('ProcessInChunks', () => { it('processes new data', async () => { const mockProcessItem = jest .fn(async a => { - console.log('processing', a) + logger.info('processing', a) }) .mockResolvedValueOnce() .mockRejectedValueOnce(new Error('Rejected 1')) @@ -48,7 +52,7 @@ describe('ProcessInChunks', () => { it('processes data in chunks', async () => { const mockProcessItem = jest .fn(async a => { - console.log('processing', a) + logger.info('processing', a) }) .mockResolvedValueOnce() .mockRejectedValueOnce(new Error('Rejected 1')) diff --git a/packages/backend/src/nest/local-db/local-db.service.ts b/packages/backend/src/nest/local-db/local-db.service.ts index e3a94b4be9..10497fdd98 100644 --- a/packages/backend/src/nest/local-db/local-db.service.ts +++ b/packages/backend/src/nest/local-db/local-db.service.ts @@ -4,21 +4,21 @@ import { type Community, type NetworkInfo, NetworkStats } from '@quiet/types' import { createLibp2pAddress, filterAndSortPeers } from '@quiet/common' import { LEVEL_DB } from '../const' import { LocalDBKeys, LocalDbStatus } from './local-db.types' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' @Injectable() export class LocalDbService { peers: any - private readonly logger = Logger(LocalDbService.name) + private readonly logger = createLogger(LocalDbService.name) constructor(@Inject(LEVEL_DB) private readonly db: Level) {} public async close() { - this.logger('Closing leveldb') + this.logger.info('Closing leveldb') await this.db.close() } public async open() { - this.logger('Opening leveldb') + this.logger.info('Opening leveldb') await this.db.open() } @@ -27,7 +27,7 @@ export class LocalDbService { } public async purge() { - this.logger(`Purging db`) + this.logger.info(`Purging db`) await this.db.clear() } @@ -36,7 +36,7 @@ export class LocalDbService { try { data = await this.db.get(key) } catch (e) { - this.logger(`Getting '${key}'`, e) + this.logger.error(`Getting '${key}'`, e) return null } return data @@ -71,7 +71,7 @@ export class LocalDbService { try { return obj[value] } catch (e) { - this.logger(`${value} not found in ${key}`) + this.logger.error(`${value} not found in ${key}`) return null } } @@ -104,7 +104,7 @@ export class LocalDbService { if (network) { const localPeerAddress = createLibp2pAddress(network.hiddenService.onionAddress, network.peerId.id) - this.logger('Local peer', localPeerAddress) + this.logger.info('Local peer', localPeerAddress) return filterAndSortPeers(peers, stats, localPeerAddress, includeLocalPeerAddress) } else { return filterAndSortPeers(peers, stats, undefined, includeLocalPeerAddress) diff --git a/packages/backend/src/nest/registration/registration.functions.ts b/packages/backend/src/nest/registration/registration.functions.ts index 16ddf4d6af..16d51e3821 100644 --- a/packages/backend/src/nest/registration/registration.functions.ts +++ b/packages/backend/src/nest/registration/registration.functions.ts @@ -4,9 +4,9 @@ import { ErrorPayload, PermsData, SocketActionTypes, type SuccessfulRegistration import { CsrContainsFields, IsCsr } from './registration.validators' import { type RegistrationEvents } from './registration.types' import { loadCSR, CertFieldsTypes, getCertFieldValue, getReqFieldValue, parseCertificate } from '@quiet/identity' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' -const logger = Logger('registration.functions') +const logger = createLogger('registration.functions') export class UserCsrData { @IsNotEmpty() diff --git a/packages/backend/src/nest/registration/registration.service.ts b/packages/backend/src/nest/registration/registration.service.ts index 5e6057c91b..fdaf46bae9 100644 --- a/packages/backend/src/nest/registration/registration.service.ts +++ b/packages/backend/src/nest/registration/registration.service.ts @@ -10,12 +10,12 @@ import { SocketActionTypes, } from '@quiet/types' import { RegistrationEvents } from './registration.types' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' import { StorageService } from '../storage/storage.service' @Injectable() export class RegistrationService extends EventEmitter implements OnModuleInit { - private readonly logger = Logger(RegistrationService.name) + private readonly logger = createLogger(RegistrationService.name) private permsData: PermsData private storageService: StorageService private registrationEvents: { csrs: string[] }[] = [] @@ -44,14 +44,14 @@ export class RegistrationService extends EventEmitter implements OnModuleInit { } public async tryIssueCertificates() { - this.logger('Trying to process registration event') + this.logger.info('Trying to process registration event') // Process only a single registration event at a time so that we // do not register two certificates with the same name. if (!this.registrationEventInProgress) { // Get the next event. const event = this.registrationEvents.shift() if (event) { - this.logger('Processing registration event') + this.logger.info('Processing registration event') // Event processing in progress this.registrationEventInProgress = true @@ -62,7 +62,7 @@ export class RegistrationService extends EventEmitter implements OnModuleInit { certificates: (await this.storageService?.loadAllCertificates()) as string[], }) - this.logger('Finished processing registration event') + this.logger.info('Finished processing registration event') // Event processing finished this.registrationEventInProgress = false @@ -72,7 +72,7 @@ export class RegistrationService extends EventEmitter implements OnModuleInit { } } } else { - this.logger('Registration event processing already in progress') + this.logger.warn('Registration event processing already in progress') } } @@ -88,18 +88,18 @@ export class RegistrationService extends EventEmitter implements OnModuleInit { // certs before permsData is set. We may want to refactor this or // add the ability to retry. if (!this.permsData) { - this.logger('Not issuing certificates due to missing perms data') + this.logger.warn('Not issuing certificates due to missing perms data') return } const pendingCsrs = await extractPendingCsrs(payload) - this.logger(`Issuing certificates`) + this.logger.info(`Issuing certificates`) await Promise.all( pendingCsrs.map(async csr => { await this.registerUserCertificate(csr) }) ) - this.logger('Total certificates issued:', pendingCsrs.length) + this.logger.info('Total certificates issued:', pendingCsrs.length) } // TODO: This doesn't save the owner's certificate in OrbitDB, so perhaps we diff --git a/packages/backend/src/nest/registration/registration.validators.ts b/packages/backend/src/nest/registration/registration.validators.ts index f699f4688a..4fe2a8de05 100644 --- a/packages/backend/src/nest/registration/registration.validators.ts +++ b/packages/backend/src/nest/registration/registration.validators.ts @@ -1,8 +1,8 @@ import { loadCSR, CertFieldsTypes, getReqFieldValue } from '@quiet/identity' import { registerDecorator, ValidationArguments, ValidationOptions } from 'class-validator' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' -const logger = Logger('registration.validators') +const logger = createLogger('registration.validators') export function IsCsr(validationOptions?: ValidationOptions) { return function (object: object, propertyName: string) { diff --git a/packages/backend/src/nest/socket/socket.service.ts b/packages/backend/src/nest/socket/socket.service.ts index bbc767d4b8..6f137f3436 100644 --- a/packages/backend/src/nest/socket/socket.service.ts +++ b/packages/backend/src/nest/socket/socket.service.ts @@ -28,12 +28,12 @@ import EventEmitter from 'events' import { CONFIG_OPTIONS, SERVER_IO_PROVIDER } from '../const' import { ConfigOptions, ServerIoProviderTypes } from '../types' import { suspendableSocketEvents } from './suspendable.events' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' import type net from 'node:net' @Injectable() export class SocketService extends EventEmitter implements OnModuleInit { - private readonly logger = Logger(SocketService.name) + private readonly logger = createLogger(SocketService.name) public resolveReadyness: (value: void | PromiseLike) => void public readyness: Promise @@ -55,9 +55,9 @@ export class SocketService extends EventEmitter implements OnModuleInit { } async onModuleInit() { - this.logger('init: Started') + this.logger.info('init: Started') await this.init() - this.logger('init: Finished') + this.logger.info('init: Finished') } public async init() { @@ -71,30 +71,30 @@ export class SocketService extends EventEmitter implements OnModuleInit { await this.listen() - this.logger('init: Waiting for frontend to connect') + this.logger.info('init: Waiting for frontend to connect') await connection - this.logger('init: Frontend connected') + this.logger.info('init: Frontend connected') } private readonly attachListeners = () => { - this.logger('Attaching listeners') + this.logger.info('Attaching listeners') // Attach listeners here this.serverIoProvider.io.on(SocketActionTypes.CONNECTION, socket => { - this.logger('Socket connection') + this.logger.info('Socket connection') // On websocket connection, update presentation service with network data this.emit(SocketActionTypes.CONNECTION) socket.on(SocketActionTypes.CLOSE, async () => { - this.logger('Socket connection closed') + this.logger.info('Socket connection closed') this.emit(SocketActionTypes.CLOSE) }) socket.use(async (event, next) => { const type = event[0] if (suspendableSocketEvents.includes(type)) { - this.logger('Awaiting readyness before emitting: ', type) + this.logger.info('Awaiting readyness before emitting: ', type) await this.readyness } next() @@ -149,7 +149,7 @@ export class SocketService extends EventEmitter implements OnModuleInit { // ====== Certificates ====== socket.on(SocketActionTypes.ADD_CSR, async (payload: SaveCSRPayload) => { - this.logger(`On ${SocketActionTypes.ADD_CSR}`) + this.logger.info(`On ${SocketActionTypes.ADD_CSR}`) this.emit(SocketActionTypes.ADD_CSR, payload) }) @@ -158,7 +158,7 @@ export class SocketService extends EventEmitter implements OnModuleInit { socket.on( SocketActionTypes.CREATE_COMMUNITY, async (payload: InitCommunityPayload, callback: (response: Community | undefined) => void) => { - this.logger(`Creating community ${payload.id}`) + this.logger.info(`Creating community ${payload.id}`) this.emit(SocketActionTypes.CREATE_COMMUNITY, payload, callback) } ) @@ -166,7 +166,7 @@ export class SocketService extends EventEmitter implements OnModuleInit { socket.on( SocketActionTypes.LAUNCH_COMMUNITY, async (payload: InitCommunityPayload, callback: (response: Community | undefined) => void) => { - this.logger(`Launching community ${payload.id} for ${payload.peerId.id}`) + this.logger.info(`Launching community ${payload.id} for ${payload.peerId.id}`) this.emit(SocketActionTypes.LAUNCH_COMMUNITY, payload, callback) this.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.LAUNCHING_COMMUNITY) } @@ -175,18 +175,18 @@ export class SocketService extends EventEmitter implements OnModuleInit { socket.on( SocketActionTypes.CREATE_NETWORK, async (communityId: string, callback: (response: NetworkInfo | undefined) => void) => { - this.logger(`Creating network for community ${communityId}`) + this.logger.info(`Creating network for community ${communityId}`) this.emit(SocketActionTypes.CREATE_NETWORK, communityId, callback) } ) socket.on(SocketActionTypes.LEAVE_COMMUNITY, (callback: (closed: boolean) => void) => { - this.logger('Leaving community') + this.logger.info('Leaving community') this.emit(SocketActionTypes.LEAVE_COMMUNITY, callback) }) socket.on(SocketActionTypes.LIBP2P_PSK_STORED, payload => { - this.logger('Saving PSK', payload) + this.logger.info('Saving PSK', payload) this.emit(SocketActionTypes.LIBP2P_PSK_STORED, payload) }) @@ -228,29 +228,29 @@ export class SocketService extends EventEmitter implements OnModuleInit { // I also tried `this.serverIoProvider.io.disconnectSockets(true)` // which didn't work for me, but we still call it. public closeSockets = () => { - this.logger('Disconnecting sockets') + this.logger.info('Disconnecting sockets') this.serverIoProvider.io.disconnectSockets(true) this.sockets.forEach(s => s.destroy()) } public listen = async (): Promise => { - this.logger(`Opening data server on port ${this.configOptions.socketIOPort}`) + this.logger.info(`Opening data server on port ${this.configOptions.socketIOPort}`) if (this.serverIoProvider.server.listening) { - this.logger('Failed to listen. Server already listening.') + this.logger.warn('Failed to listen. Server already listening.') return } const numConnections = await this.getConnections() if (numConnections > 0) { - this.logger('Failed to listen. Connections still open:', numConnections) + this.logger.warn('Failed to listen. Connections still open:', numConnections) return } return new Promise(resolve => { this.serverIoProvider.server.listen(this.configOptions.socketIOPort, '127.0.0.1', () => { - this.logger(`Data server running on port ${this.configOptions.socketIOPort}`) + this.logger.info(`Data server running on port ${this.configOptions.socketIOPort}`) resolve() }) }) @@ -258,17 +258,17 @@ export class SocketService extends EventEmitter implements OnModuleInit { public close = (): Promise => { return new Promise(resolve => { - this.logger(`Closing data server on port ${this.configOptions.socketIOPort}`) + this.logger.info(`Closing data server on port ${this.configOptions.socketIOPort}`) if (!this.serverIoProvider.server.listening) { - this.logger('Data server is not running.') + this.logger.warn('Data server is not running.') resolve() return } this.serverIoProvider.io.close(err => { if (err) throw new Error(err.message) - this.logger('Data server closed') + this.logger.info('Data server closed') resolve() }) diff --git a/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.spec.ts b/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.spec.ts index aa2c7a5ca8..d15308b289 100644 --- a/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.spec.ts +++ b/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.spec.ts @@ -50,13 +50,13 @@ describe('CertificatesRequestsStore', () => { it('validateUserCs, correct csr', async () => { const cert = 'MIIDITCCAsYCAQAwSTFHMEUGA1UEAxM+anR3c3hxMnZ1dWthY3JodWhvdnAzd2JxbzRxNXc0d2s3Nm1qbWJ3cXk3eGNma2FsdmRxb3hhYWQub25pb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQE2q6iS+WCmIVCSFI2AjHrW6ujUdrceD5T2xkcTJBTn0y50WphcupUajCRgkXaTBkTsGNJ3qWRZAKX7CiuehBJoIICGTAuBgkqhkiG9w0BCQ4xITAfMB0GA1UdDgQWBBQuE5JgPY/BYBpgG5pnjMkEEIkrGjCCAUcGCSqGSIb3DQEJDDGCATgEggE0BDlx84glBl72q82F2a+y8iTVKM8IMiXYYrmNyhFPj6XsfVQpvLhNviZ5zHdMBWbFj44vTSUIasNP9I9eCWSEAaEJqjngEh18WCRS/XbvQxI/8qB5pzcfghvM8BCgSLbSEjK2GMYVhCXmRH1YGHIZu0+Ii9pe5nwG154JlPUsmIRgu6ruY6PQk65Aoo4OyhPn5CCUFInptHcz1JpAiCRe0Z6wuQHud03VY50fx4ETdmUNJBEIPOyd/Xn6lMOi6SaWGHbCWiufeJRm+mRdoHJAEt6kPLhGIYGyduNT/8cGoe2xKyQDvNoTr4dqqRZ2HgZ18nicsTHswpGqAlUnZXaA3V85Qu1cvaMAqEoPOUlGP9AriIVwtIZM0hdWHqKHgBCZrKfHb5oLxt6ourQ3+q19tvx+u6UwFAYKKwYBBAGDjBsCATEGEwRlbGxvMD0GCSsGAQIBDwMBATEwEy5RbVVvNXN0NXNqR3RFMUtQeXhOVW5pTWhnQXduV0JVNXk3TnpoMlpRRkdacVdiMEcGA1UdETFAEz5qdHdzeHEydnV1a2Fjcmh1aG92cDN3YnFvNHE1dzR3azc2bWptYndxeTd4Y2ZrYWx2ZHFveGFhZC5vbmlvbjAKBggqhkjOPQQDAgNJADBGAiEAt9udw7B7vnjJyWvkkRLb7DImFXwsrSxirqbmhIH+1rUCIQD86GWyfAE2d8gCNAn4h1t9B+mAx33ZdPLgFssHl1i3pA==' - const result = await CertificatesRequestsStore.validateUserCsr(cert) + const result = await certificatesRequestsStore.validateUserCsr(cert) expect(result).toBe(true) }) it('validateUserCsr, malformed string', async () => { const cert = 'notACsr' - const result = await CertificatesRequestsStore.validateUserCsr(cert) + const result = await certificatesRequestsStore.validateUserCsr(cert) expect(result).toBe(false) }) diff --git a/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.ts b/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.ts index 0b23a48cf0..afcfe13032 100644 --- a/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.ts +++ b/packages/backend/src/nest/storage/certifacteRequests/certificatesRequestsStore.ts @@ -8,20 +8,20 @@ import { validate } from 'class-validator' import { UserCsrData } from '../../registration/registration.functions' import { Injectable } from '@nestjs/common' import { OrbitDb } from '../orbitDb/orbitDb.service' -import Logger from '../../common/logger' +import { createLogger } from '../../common/logger' @Injectable() export class CertificatesRequestsStore extends EventEmitter { public store: EventStore - private readonly logger = Logger(CertificatesRequestsStore.name) + private readonly logger = createLogger(CertificatesRequestsStore.name) constructor(private readonly orbitDbService: OrbitDb) { super() } public async init() { - this.logger('Initializing certificates requests store') + this.logger.info('Initializing certificates requests store') this.store = await this.orbitDbService.orbitDb.log('csrs', { replicate: false, @@ -32,16 +32,16 @@ export class CertificatesRequestsStore extends EventEmitter { await this.store.load() this.store.events.on('write', async (_address, entry) => { - this.logger('Added CSR to database') + this.logger.info('Added CSR to database') this.loadedCertificateRequests() }) this.store.events.on('replicated', async () => { - this.logger('Replicated CSRs') + this.logger.info('Replicated CSRs') this.loadedCertificateRequests() }) - this.logger('Initialized') + this.logger.info('Initialized') } public async loadedCertificateRequests() { @@ -51,9 +51,9 @@ export class CertificatesRequestsStore extends EventEmitter { } public async close() { - this.logger('Closing certificate requests DB') + this.logger.info('Closing certificate requests DB') await this.store?.close() - this.logger('Closed certificate requests DB') + this.logger.info('Closed certificate requests DB') } public getAddress() { @@ -65,7 +65,7 @@ export class CertificatesRequestsStore extends EventEmitter { return true } - public static async validateUserCsr(csr: string) { + public async validateUserCsr(csr: string) { try { const crypto = getCrypto() if (!crypto) { @@ -75,13 +75,13 @@ export class CertificatesRequestsStore extends EventEmitter { await parsedCsr.verify() await this.validateCsrFormat(csr) } catch (err) { - console.error('Failed to validate user CSR:', csr, err?.message) + this.logger.error('Failed to validate user CSR:', csr, err?.message) return false } return true } - public static async validateCsrFormat(csr: string) { + public async validateCsrFormat(csr: string) { const userData = new UserCsrData() userData.csr = csr const validationErrors = await validate(userData) @@ -96,13 +96,13 @@ export class CertificatesRequestsStore extends EventEmitter { .map(e => { return e.payload.value }) - this.logger('Total CSRs:', allEntries.length) + this.logger.info('Total CSRs:', allEntries.length) const allCsrsUnique = [...new Set(allEntries)] await Promise.all( allCsrsUnique .filter(async csr => { - const validation = await CertificatesRequestsStore.validateUserCsr(csr) + const validation = await this.validateUserCsr(csr) if (validation) return true return false }) @@ -117,7 +117,7 @@ export class CertificatesRequestsStore extends EventEmitter { }) ) const validCsrs = [...filteredCsrsMap.values()] - this.logger('Valid CSRs:', validCsrs.length) + this.logger.info('Valid CSRs:', validCsrs.length) return validCsrs } diff --git a/packages/backend/src/nest/storage/certificates/certificates.store.ts b/packages/backend/src/nest/storage/certificates/certificates.store.ts index f8699c0651..7a0cf6ed81 100644 --- a/packages/backend/src/nest/storage/certificates/certificates.store.ts +++ b/packages/backend/src/nest/storage/certificates/certificates.store.ts @@ -15,7 +15,7 @@ import { validate } from 'class-validator' import { CertificateData } from '../../registration/registration.functions' import { OrbitDb } from '../orbitDb/orbitDb.service' import { Injectable } from '@nestjs/common' -import Logger from '../../common/logger' +import { createLogger } from '../../common/logger' @Injectable() export class CertificatesStore extends EventEmitter { @@ -24,7 +24,7 @@ export class CertificatesStore extends EventEmitter { private filteredCertificatesMapping: Map> private usernameMapping: Map - private readonly logger = Logger(CertificatesStore.name) + private readonly logger = createLogger(CertificatesStore.name) constructor(private readonly orbitDbService: OrbitDb) { super() @@ -33,7 +33,7 @@ export class CertificatesStore extends EventEmitter { } public async init() { - this.logger('Initializing certificates log store') + this.logger.info('Initializing certificates log store') this.store = await this.orbitDbService.orbitDb.log('certificates', { replicate: false, @@ -43,24 +43,24 @@ export class CertificatesStore extends EventEmitter { }) this.store.events.on('ready', async () => { - this.logger('Loaded certificates to memory') + this.logger.info('Loaded certificates to memory') this.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.CERTIFICATES_STORED) }) this.store.events.on('write', async () => { - this.logger('Saved certificate locally') + this.logger.info('Saved certificate locally') await this.loadedCertificates() }) this.store.events.on('replicated', async () => { - this.logger('REPLICATED: Certificates') + this.logger.info('REPLICATED: Certificates') this.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.CERTIFICATES_STORED) await this.loadedCertificates() }) await this.store.load() - this.logger('Initialized') + this.logger.info('Initialized') } public async loadedCertificates() { @@ -70,9 +70,9 @@ export class CertificatesStore extends EventEmitter { } public async close() { - this.logger('Closing certificates DB') + this.logger.info('Closing certificates DB') await this.store?.close() - this.logger('Closed certificates DB') + this.logger.info('Closed certificates DB') } public getAddress() { @@ -80,7 +80,7 @@ export class CertificatesStore extends EventEmitter { } public async addCertificate(certificate: string) { - this.logger('Adding user certificate') + this.logger.info('Adding user certificate') await this.store?.add(certificate) return true } @@ -148,9 +148,9 @@ export class CertificatesStore extends EventEmitter { * https://github.com/TryQuiet/quiet/issues/1899 */ public async getCertificates(): Promise { - this.logger('Getting certificates') + this.logger.info('Getting certificates') if (!this.store) { - this.logger('No store found!') + this.logger.warn('No store found!') return [] } @@ -159,7 +159,7 @@ export class CertificatesStore extends EventEmitter { .collect() .map(e => e.payload.value) - this.logger(`All certificates: ${allCertificates.length}`) + this.logger.info(`All certificates: ${allCertificates.length}`) const validCertificates = await Promise.all( allCertificates.map(async certificate => { if (this.filteredCertificatesMapping.has(certificate)) { @@ -189,7 +189,7 @@ export class CertificatesStore extends EventEmitter { ) const validCerts = validCertificates.filter(i => i != undefined) - this.logger(`Valid certificates: ${validCerts.length}`) + this.logger.info(`Valid certificates: ${validCerts.length}`) // TODO: Why doesn't TS infer this properly? return validCerts as string[] } diff --git a/packages/backend/src/nest/storage/communityMetadata/communityMetadata.store.ts b/packages/backend/src/nest/storage/communityMetadata/communityMetadata.store.ts index 1b9ceca296..14e0b785df 100644 --- a/packages/backend/src/nest/storage/communityMetadata/communityMetadata.store.ts +++ b/packages/backend/src/nest/storage/communityMetadata/communityMetadata.store.ts @@ -10,7 +10,7 @@ import { KeyValueIndex } from '../orbitDb/keyValueIndex' import { LocalDbService } from '../../local-db/local-db.service' import { OrbitDb } from '../orbitDb/orbitDb.service' import { Injectable } from '@nestjs/common' -import createLogger from '../../common/logger' +import { createLogger } from '../../common/logger' import { constructPartial } from '@quiet/common' const logger = createLogger('CommunityMetadataStore') @@ -27,7 +27,7 @@ export class CommunityMetadataStore extends EventEmitter { } public async init() { - logger('Initializing community metadata key/value store') + logger.info('Initializing community metadata key/value store') // If the owner initializes the CommunityMetadataStore, then the // ID would be undefined at this point when they first create the @@ -66,7 +66,7 @@ export class CommunityMetadataStore extends EventEmitter { }) this.store.events.on('replicated', async () => { - logger('Replicated community metadata') + logger.info('Replicated community metadata') const meta = this.getCommunityMetadata() if (meta) { this.emit(StorageEvents.COMMUNITY_METADATA_STORED, meta) @@ -78,7 +78,7 @@ export class CommunityMetadataStore extends EventEmitter { if (meta) { this.emit(StorageEvents.COMMUNITY_METADATA_STORED, meta) } - logger('Loaded community metadata to memory') + logger.info('Loaded community metadata to memory') } public getAddress() { @@ -86,9 +86,9 @@ export class CommunityMetadataStore extends EventEmitter { } public async close() { - logger('Closing community metadata DB') + logger.info('Closing community metadata DB') await this.store?.close() - logger('Closed community metadata DB') + logger.info('Closed community metadata DB') } public async updateCommunityMetadata(newMeta: CommunityMetadata): Promise { @@ -102,7 +102,7 @@ export class CommunityMetadataStore extends EventEmitter { return } - logger(`About to update community metadata`, newMeta?.id) + logger.info(`About to update community metadata`, newMeta?.id) if (!newMeta.id) return // FIXME: update community metadata if it has changed (so that @@ -112,7 +112,7 @@ export class CommunityMetadataStore extends EventEmitter { return oldMeta } - logger(`Updating community metadata`) + logger.info(`Updating community metadata`) // @ts-expect-error - OrbitDB's type declaration of OrbitDB lacks identity const ownerOrbitDbIdentity = this.orbitDbService.orbitDb.identity.id const meta = { @@ -157,7 +157,7 @@ export class CommunityMetadataStore extends EventEmitter { // Verify that owner certificate is signed by root certificate return await ownerCert.verify(rootCert) } catch (err) { - logger.error('Failed to validate community metadata:', communityMetadata.id, err?.message) + logger.error('Failed to validate community metadata:', communityMetadata.id, err) return false } } @@ -200,7 +200,7 @@ export class CommunityMetadataStore extends EventEmitter { const valid = await CommunityMetadataStore.validateCommunityMetadata(entry.payload.value) return valid } catch (err) { - logger.error('Failed to verify community metadata entry:', entry.hash, err?.message) + logger.error('Failed to verify community metadata entry:', entry.hash, err) return false } } diff --git a/packages/backend/src/nest/storage/orbitDb/ChannelsAccessController.ts b/packages/backend/src/nest/storage/orbitDb/ChannelsAccessController.ts index 6d9233cc34..68cdabba61 100644 --- a/packages/backend/src/nest/storage/orbitDb/ChannelsAccessController.ts +++ b/packages/backend/src/nest/storage/orbitDb/ChannelsAccessController.ts @@ -2,6 +2,9 @@ import AccessController from 'orbit-db-access-controllers' import { PublicChannel } from '@quiet/types' import OrbitDB from 'orbit-db' import PeerId from 'peer-id' +import { createLogger } from '../../common/logger' + +const logger = createLogger('channelsAccessController') const Keystore = await import('orbit-db-keystore') @@ -15,13 +18,13 @@ export const createChannelAccessController = (peerId: PeerId, dir: string) => { } async canAppend(entry: LogEntry, identityProvider: any) { - // console.log('can append entry ', entry) + // logger.info('can append entry ', entry) // const keystore = identityProvider._keystore // const stringPeerId = 'QmTBYqK1qTXW9E6os3vc9phR9JWRs1jUTutgpLEGJVtubY' - // console.log('identityProvider', identityProvider) + // logger.info('identityProvider', identityProvider) // identityProvider.getId(peerId.toString()) // const identity = await Identities.createIdentity({ @@ -29,32 +32,32 @@ export const createChannelAccessController = (peerId: PeerId, dir: string) => { // keystore // }) - // console.log('identity ', identity) + // logger.info('identity ', identity) - // console.log('access controller id ', identity) + // logger.info('access controller id ', identity) - // console.log('peerId ', peerId.toString()) - // console.log('entry ', entry) + // logger.info('peerId ', peerId.toString()) + // logger.info('entry ', entry) // const identityProvider2 = new OrbitDBIdentityProvider(identityProvider._keystore) - // console.log(identityProvider2) - // console.log(identityProvider2.getId({id: + // logger.info(identityProvider2) + // logger.info(identityProvider2.getId({id: // 'QmeiTFqysrzRqi2gy94b7BRpouCHuwTDxf65tRtNxbtZhQ'})) - // // console.log('before sleep') + // // logger.info('before sleep') // // await sleep(50000) - // // console.log('after sleep') + // // logger.info('after sleep') // const orbit = await identityProvider2.getId({id: // 'QmeiTFqysrzRqi2gy94b7BRpouCHuwTDxf65tRtNxbtZhQ'}) - // console.log('access controller keystore ', identityProvider._keystore) + // logger.info('access controller keystore ', identityProvider._keystore) // const orbit1 = await identityProvider._keystore.createKey(peerId.toString()) // const orbit2 = await identityProvider._keystore.createKey(peerId.toString()) - // console.log('orbitDB string') + // logger.info('orbitDB string') // const uKey = Buffer.from(orbit1.public.marshal()).toString('hex') // const uKey2 = Buffer.from(orbit2.public.marshal()).toString('hex') diff --git a/packages/backend/src/nest/storage/orbitDb/keyValueIndex.ts b/packages/backend/src/nest/storage/orbitDb/keyValueIndex.ts index 154b2aeba0..fc7d0273ad 100644 --- a/packages/backend/src/nest/storage/orbitDb/keyValueIndex.ts +++ b/packages/backend/src/nest/storage/orbitDb/keyValueIndex.ts @@ -1,6 +1,6 @@ import { IdentityProvider } from 'orbit-db-identity-provider' -import createLogger from '../../common/logger' +import { createLogger } from '../../common/logger' const logger = createLogger('KeyValueIndex') diff --git a/packages/backend/src/nest/storage/orbitDb/orbitDb.service.ts b/packages/backend/src/nest/storage/orbitDb/orbitDb.service.ts index 2788a4e38a..77a6221a06 100644 --- a/packages/backend/src/nest/storage/orbitDb/orbitDb.service.ts +++ b/packages/backend/src/nest/storage/orbitDb/orbitDb.service.ts @@ -1,6 +1,6 @@ import { Inject, Injectable } from '@nestjs/common' import { ORBIT_DB_DIR } from '../../const' -import Logger from '../../common/logger' +import { createLogger } from '../../common/logger' import PeerId from 'peer-id' import AccessControllers from 'orbit-db-access-controllers' import { MessagesAccessController } from './MessagesAccessController' @@ -12,7 +12,7 @@ import { IPFS } from 'ipfs-core' export class OrbitDb { private orbitDbInstance: OrbitDB | null = null - private readonly logger = Logger(OrbitDb.name) + private readonly logger = createLogger(OrbitDb.name) constructor(@Inject(ORBIT_DB_DIR) public readonly orbitDbDir: string) {} @@ -25,7 +25,7 @@ export class OrbitDb { } public async create(peerId: PeerId, ipfs: IPFS) { - this.logger('[create]:started') + this.logger.info('[create]:started') if (this.orbitDbInstance) return const channelsAccessController = createChannelAccessController(peerId, this.orbitDbDir) @@ -46,11 +46,11 @@ export class OrbitDb { public async stop() { if (this.orbitDbInstance) { - this.logger('Stopping OrbitDB') + this.logger.info('Stopping OrbitDB') try { await this.orbitDbInstance.stop() } catch (err) { - this.logger.error(`Following error occured during closing orbitdb database: ${err as string}`) + this.logger.error(`Following error occured during closing orbitdb database`, err) } } diff --git a/packages/backend/src/nest/storage/storage.service.spec.ts b/packages/backend/src/nest/storage/storage.service.spec.ts index 9893376b79..9324a7390d 100644 --- a/packages/backend/src/nest/storage/storage.service.spec.ts +++ b/packages/backend/src/nest/storage/storage.service.spec.ts @@ -44,6 +44,9 @@ import { CertificatesStore } from './certificates/certificates.store' import { CommunityMetadataStore } from './communityMetadata/communityMetadata.store' import { OrbitDb } from './orbitDb/orbitDb.service' import { UserProfileStore } from './userProfile/userProfile.store' +import { createLogger } from '../common/logger' + +const logger = createLogger('storageService:test') const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -53,7 +56,7 @@ jest.unstable_mockModule('../common/utils', async () => { return { ...(actual as object), createPaths: jest.fn((paths: string[]) => { - console.log('creating paths in fn - mock') + logger.info('creating paths in fn - mock') for (const path of paths) { if (!fs.existsSync(path)) { fs.mkdirSync(path, { recursive: true }) @@ -361,7 +364,7 @@ describe('StorageService', () => { // await storageService.subscribeToChannel(channelio) // const eventSpy = jest.spyOn(storageService, 'emit') - // console.log( + // logger.info( // 'storageService.publicChannelsRepos.get(message.channelId)', // storageService.publicChannelsRepos.get(message.channelId) // ) diff --git a/packages/backend/src/nest/storage/storage.service.ts b/packages/backend/src/nest/storage/storage.service.ts index e8b866ab0a..a8d4afa60b 100644 --- a/packages/backend/src/nest/storage/storage.service.ts +++ b/packages/backend/src/nest/storage/storage.service.ts @@ -45,7 +45,7 @@ import { IpfsFilesManagerEvents } from '../ipfs-file-manager/ipfs-file-manager.t import { LocalDBKeys } from '../local-db/local-db.types' import { LocalDbService } from '../local-db/local-db.service' import { LazyModuleLoader } from '@nestjs/core' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' import { DirectMessagesRepo, PublicChannelsRepo } from '../common/types' import { removeFiles, removeDirs, createPaths } from '../common/utils' import { DBOptions, StorageEvents } from './storage.types' @@ -69,7 +69,7 @@ export class StorageService extends EventEmitter { private peerId: PeerId | null = null private ipfsStarted: boolean - private readonly logger = Logger(StorageService.name) + private readonly logger = createLogger(StorageService.name) constructor( @Inject(QUIET_DIR) public readonly quietDir: string, @@ -87,7 +87,7 @@ export class StorageService extends EventEmitter { } private prepare() { - this.logger('Initializing storage') + this.logger.info('Initializing storage') removeFiles(this.quietDir, 'LOCK') removeDirs(this.quietDir, 'repo.lock') this.ipfsStarted = false @@ -98,7 +98,7 @@ export class StorageService extends EventEmitter { this.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.STORAGE_INITIALIZED) - this.logger('Initialized storage') + this.logger.info('Initialized storage') } public async init(peerId: any) { @@ -134,20 +134,20 @@ export class StorageService extends EventEmitter { } private async startIpfs() { - this.logger('Starting IPFS') + this.logger.info('Starting IPFS') return this.ipfs .start() .then(async () => { - this.logger('IPFS started') + this.logger.info('IPFS started') this.ipfsStarted = true try { await this.startReplicate() } catch (e) { - console.log(`Couldn't start store replication`) + this.logger.error(`Couldn't start store replication`, e) } }) .catch((e: Error) => { - console.log(`Couldn't start ipfs node`, e.message) + this.logger.error(`Couldn't start ipfs node`, e) throw new Error(e.message) }) } @@ -186,9 +186,9 @@ export class StorageService extends EventEmitter { } public async initDatabases() { - console.time('Storage.initDatabases') + this.logger.time('Storage.initDatabases') - this.logger('1/3') + this.logger.info('1/3') this.attachStoreListeners() // FIXME: This is sort of messy how we are initializing things. @@ -196,29 +196,29 @@ export class StorageService extends EventEmitter { // initialization which is picked up by the CertificatesStore, but // the CertificatesStore is not initialized yet. Perhaps we can // initialize stores first and then load data/send events. - this.logger('2/3') + this.logger.info('2/3') await this.communityMetadataStore.init() await this.certificatesStore.init() await this.certificatesRequestsStore.init() await this.userProfileStore.init() - this.logger('3/3') + this.logger.info('3/3') await this.createDbForChannels() await this.initAllChannels() - console.timeEnd('Storage.initDatabases') - this.logger('Initialized DBs') + this.logger.timeEnd('Storage.initDatabases') + this.logger.info('Initialized DBs') this.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.DBS_INITIALIZED) } private async subscribeToPubSub(addr: string[]) { if (!this.ipfsStarted) { - this.logger(`IPFS not started. Not subscribing to ${addr}`) + this.logger.warn(`IPFS not started. Not subscribing to ${addr}`) return } for (const a of addr) { - this.logger(`Pubsub - subscribe to ${a}`) + this.logger.info(`Pubsub - subscribe to ${a}`) // @ts-ignore await this.orbitDbService.orbitDb._pubsub.subscribe( a, @@ -232,13 +232,13 @@ export class StorageService extends EventEmitter { private async __stopIPFS() { if (this.ipfs) { - this.logger('Stopping IPFS files manager') + this.logger.info('Stopping IPFS files manager') try { await this.filesManager.stop() } catch (e) { - this.logger.error('cannot stop filesManager') + this.logger.error('cannot stop filesManager', e) } - this.logger('Stopping IPFS') + this.logger.info('Stopping IPFS') try { await this.ipfs.stop() } catch (err) { @@ -250,9 +250,9 @@ export class StorageService extends EventEmitter { public async stopOrbitDb() { try { - this.logger('Closing channels DB') + this.logger.info('Closing channels DB') await this.channels?.close() - this.logger('Closed channels DB') + this.logger.info('Closed channels DB') } catch (e) { this.logger.error('Error closing channels db', e) } @@ -327,7 +327,7 @@ export class StorageService extends EventEmitter { // Always include existing peers. Otherwise, if CSRs or // certificates do not replicate, then this could remove peers. const existingPeers = community.peerList ?? [] - this.logger('Existing peers count:', existingPeers.length) + this.logger.info('Existing peers count:', existingPeers.length) const users = await this.getAllUsers() const peers = Array.from( @@ -340,26 +340,26 @@ export class StorageService extends EventEmitter { throw new Error('Failed to update peers list - no peers') } - this.logger('Updating community peer list. Peers count:', sortedPeers.length) + this.logger.info('Updating community peer list. Peers count:', sortedPeers.length) community.peerList = sortedPeers await this.localDbService.setCommunity(community) this.emit(StorageEvents.COMMUNITY_UPDATED, community) } public async loadAllCertificates() { - this.logger('Loading all certificates') + this.logger.info('Loading all certificates') return await this.certificatesStore.loadAllCertificates() } public async loadAllChannels() { - this.logger('Getting all channels') + this.logger.info('Getting all channels') this.emit(StorageEvents.CHANNELS_STORED, { channels: this.channels.all as unknown as { [key: string]: PublicChannel }, }) } private async createDbForChannels() { - this.logger('createDbForChannels init') + this.logger.info('createDbForChannels init') this.channels = await this.orbitDbService.orbitDb.keyvalue('public-channels', { replicate: false, accessController: { @@ -369,11 +369,11 @@ export class StorageService extends EventEmitter { }) this.channels.events.on('write', async (_address, entry) => { - this.logger('WRITE: Channels') + this.logger.info('WRITE: Channels') }) this.channels.events.on('replicated', async () => { - this.logger('REPLICATED: Channels') + this.logger.info('REPLICATED: Channels') this.emit(SocketActionTypes.CONNECTION_PROCESS_INFO, ConnectionProcessInfo.CHANNELS_STORED) const channels = Object.values(this.channels.all) @@ -396,12 +396,12 @@ export class StorageService extends EventEmitter { }) await this.channels.load() - this.logger('Channels count:', Object.keys(this.channels.all).length) - this.logger('Channels names:', Object.keys(this.channels.all)) + this.logger.info('Channels count:', Object.keys(this.channels.all).length) + this.logger.info('Channels names:', Object.keys(this.channels.all)) Object.values(this.channels.all).forEach(async (channel: PublicChannel) => { await this.subscribeToChannel(channel) }) - this.logger('STORAGE: Finished createDbForChannels') + this.logger.info('STORAGE: Finished createDbForChannels') } async initAllChannels() { @@ -458,17 +458,17 @@ export class StorageService extends EventEmitter { return } if (!db) { - this.logger(`Can't subscribe to channel ${channelData.id}`) + this.logger.error(`Can't subscribe to channel ${channelData.id}`) return } repo = this.publicChannelsRepos.get(channelData.id) } if (repo && !repo.eventsAttached) { - this.logger('Subscribing to channel ', channelData.id) + this.logger.info('Subscribing to channel ', channelData.id) db.events.on('write', async (_address, entry) => { - this.logger(`Writing to public channel db ${channelData.id}`) + this.logger.info(`Writing to public channel db ${channelData.id}`) const verified = await this.verifyMessage(entry.payload.value) this.emit(StorageEvents.MESSAGES_STORED, { @@ -478,7 +478,7 @@ export class StorageService extends EventEmitter { }) db.events.on('replicate.progress', async (address, _hash, entry, progress, total) => { - this.logger(`progress ${progress as string}/${total as string}. Address: ${address as string}`) + this.logger.info(`progress ${progress as string}/${total as string}. Address: ${address as string}`) const messages = [entry.payload.value] const verified = await this.verifyMessage(messages[0]) @@ -514,7 +514,7 @@ export class StorageService extends EventEmitter { }) db.events.on('replicated', async address => { - this.logger('Replicated.', address) + this.logger.info('Replicated.', address) const ids = this.getAllEventLogEntries(db).map(msg => msg.id) const community = await this.localDbService.getCurrentCommunity() @@ -545,7 +545,7 @@ export class StorageService extends EventEmitter { repo.eventsAttached = true } - this.logger(`Subscribed to channel ${channelData.id}`) + this.logger.info(`Subscribed to channel ${channelData.id}`) this.emit(StorageEvents.CHANNEL_SUBSCRIBED, { channelId: channelData.id, }) @@ -575,7 +575,7 @@ export class StorageService extends EventEmitter { throw new Error('Create channel validation error') } - this.logger(`Creating channel ${channelData.id}`) + this.logger.info(`Creating channel ${channelData.id}`) const channelId = channelData.id const db: EventStore = await this.orbitDbService.orbitDb.log( @@ -590,27 +590,27 @@ export class StorageService extends EventEmitter { ) const channel = this.channels.get(channelId) - this.logger('Found existing channel:', channel) + this.logger.info('Found existing channel:', channel) if (channel === undefined) { await this.channels.put(channelId, { ...channelData }) } this.publicChannelsRepos.set(channelId, { db, eventsAttached: false }) - this.logger(`Set ${channelId} to local channels`) + this.logger.info(`Set ${channelId} to local channels`) await db.load() - this.logger(`Created channel ${channelId}`) + this.logger.info(`Created channel ${channelId}`) await this.subscribeToPubSub([StorageService.dbAddress(db.address)]) return db } public async deleteChannel(payload: { channelId: string; ownerPeerId: string }) { - console.log('deleting channel storage', payload) + this.logger.info('deleting channel storage', payload) const { channelId, ownerPeerId } = payload const channel = this.channels.get(channelId) if (!this.peerId) { - this.logger('deleteChannel - peerId is null') + this.logger.error('deleteChannel - peerId is null') throw new Error('deleteChannel - peerId is null') } const isOwner = ownerPeerId === this.peerId.toString() @@ -647,17 +647,17 @@ export class StorageService extends EventEmitter { } public async deleteChannelMessages(hashes: CID[]) { - console.log('hashes ', hashes) + this.logger.info('hashes ', hashes) const gcresult = this.ipfs.repo.gc() for await (const res of gcresult) { // @ts-ignore // const ccc = base58.base58btc.encode(res.cid?.multihash.bytes) - // console.log('base58btc encoded', ccc) - // console.log('garbage collector result', res) + // this.logger.info('base58btc encoded', ccc) + // this.logger.info('garbage collector result', res) } // for await (const result of this.ipfs.block.rm(hashes)) { // if (result.error) { - // console.error(`Failed to remove block ${result.cid} due to ${result.error.message}`) + // logger.error(`Failed to remove block ${result.cid}`, result.error) // } // } } @@ -673,7 +673,7 @@ export class StorageService extends EventEmitter { return } try { - this.logger('Sending message:', message.id) + this.logger.info('Sending message:', message.id) await repo.db.add(message) } catch (e) { this.logger.error( @@ -716,12 +716,12 @@ export class StorageService extends EventEmitter { } public async saveCertificate(payload: SaveCertificatePayload): Promise { - this.logger('About to save certificate...') + this.logger.info('About to save certificate...') if (!payload.certificate) { - this.logger('Certificate is either null or undefined, not saving to db') + this.logger.error('Certificate is either null or undefined, not saving to db') return false } - this.logger('Saving certificate...') + this.logger.info('Saving certificate...') const result = await this.certificatesStore.addCertificate(payload.certificate) return result } @@ -739,7 +739,7 @@ export class StorageService extends EventEmitter { const certs = await this.certificatesStore.getCertificates() const allUsersByKey: Record = {} - this.logger(`Retrieving all users. CSRs count: ${csrs.length} Certificates count: ${certs.length}`) + this.logger.info(`Retrieving all users. CSRs count: ${csrs.length} Certificates count: ${certs.length}`) for (const cert of certs) { const parsedCert = parseCertificate(cert) @@ -779,7 +779,7 @@ export class StorageService extends EventEmitter { const allUsers = Object.values(allUsersByKey) - this.logger(`All users count: ${allUsers.length}`) + this.logger.info(`All users count: ${allUsers.length}`) return allUsers } @@ -805,17 +805,17 @@ export class StorageService extends EventEmitter { const message = messages[key] if (message?.media?.path) { const mediaPath = message.media.path - this.logger('deleteFilesFromChannel : mediaPath', mediaPath) + this.logger.info('deleteFilesFromChannel : mediaPath', mediaPath) const isFileExist = await this.checkIfFileExist(mediaPath) - this.logger(`deleteFilesFromChannel : isFileExist- ${isFileExist}`) + this.logger.info(`deleteFilesFromChannel : isFileExist- ${isFileExist}`) if (isFileExist) { fs.unlink(mediaPath, unlinkError => { if (unlinkError) { - this.logger(`deleteFilesFromChannel : unlink error - ${unlinkError}`) + this.logger.error(`deleteFilesFromChannel : unlink error`, unlinkError) } }) } else { - this.logger(`deleteFilesFromChannel : file dont exist - ${mediaPath}`) + this.logger.error(`deleteFilesFromChannel : file does not exist`, mediaPath) } } }) diff --git a/packages/backend/src/nest/storage/userProfile/userProfile.store.ts b/packages/backend/src/nest/storage/userProfile/userProfile.store.ts index 503baf45af..a8f344e331 100644 --- a/packages/backend/src/nest/storage/userProfile/userProfile.store.ts +++ b/packages/backend/src/nest/storage/userProfile/userProfile.store.ts @@ -8,12 +8,11 @@ import * as Block from 'multiformats/block' import * as dagCbor from '@ipld/dag-cbor' import { stringToArrayBuffer } from 'pvutils' -import { Logger } from '@quiet/logger' import { NoCryptoEngineError, UserProfile } from '@quiet/types' import { keyObjectFromString, verifySignature } from '@quiet/identity' import { constructPartial } from '@quiet/common' -import createLogger from '../../common/logger' +import { createLogger } from '../../common/logger' import { OrbitDb } from '../orbitDb/orbitDb.service' import { StorageEvents } from '../storage.types' import { KeyValueIndex } from '../orbitDb/keyValueIndex' @@ -37,7 +36,7 @@ export class UserProfileStore extends EventEmitter { } public async init() { - logger('Initializing user profiles key/value store') + logger.info('Initializing user profiles key/value store') this.store = await this.orbitDbService.orbitDb.keyvalue('user-profiles', { replicate: false, @@ -57,21 +56,21 @@ export class UserProfileStore extends EventEmitter { }) this.store.events.on('write', (_address, entry) => { - logger('Saved user profile locally') + logger.info('Saved user profile locally') this.emit(StorageEvents.USER_PROFILES_STORED, { profiles: [entry.payload.value], }) }) this.store.events.on('ready', async () => { - logger('Loaded user profiles to memory') + logger.info('Loaded user profiles to memory') this.emit(StorageEvents.USER_PROFILES_STORED, { profiles: this.getUserProfiles(), }) }) this.store.events.on('replicated', async () => { - logger('Replicated user profiles') + logger.info('Replicated user profiles') this.emit(StorageEvents.USER_PROFILES_STORED, { profiles: this.getUserProfiles(), }) @@ -85,13 +84,13 @@ export class UserProfileStore extends EventEmitter { } public async close() { - logger('Closing user profile DB') + logger.info('Closing user profile DB') await this.store?.close() - logger('Closed user profile DB') + logger.info('Closed user profile DB') } public async addUserProfile(userProfile: UserProfile) { - logger('Adding user profile') + logger.info('Adding user profile') try { if (!UserProfileStore.validateUserProfile(userProfile)) { // TODO: Send validation errors to frontend or replicate @@ -133,7 +132,7 @@ export class UserProfileStore extends EventEmitter { return false } } catch (err) { - logger.error('Failed to validate user profile:', userProfile.pubKey, err?.message) + logger.error('Failed to validate user profile:', userProfile.pubKey, err) return false } @@ -146,13 +145,13 @@ export class UserProfileStore extends EventEmitter { ) { try { if (entry.payload.key !== entry.payload.value.pubKey) { - logger.error('Failed to verify user profile entry:', entry.hash, 'entry key != payload pubKey') + logger.error(`Failed to verify user profile entry: ${entry.hash} entry key != payload pubKey`) return false } return await UserProfileStore.validateUserProfile(entry.payload.value) } catch (err) { - logger.error('Failed to validate user profile entry:', entry.hash, err?.message) + logger.error('Failed to validate user profile entry:', entry.hash, err) return false } } diff --git a/packages/backend/src/nest/storage/userProfile/userProfile.utils.ts b/packages/backend/src/nest/storage/userProfile/userProfile.utils.ts index ac8221d911..1e6fe7a5d6 100644 --- a/packages/backend/src/nest/storage/userProfile/userProfile.utils.ts +++ b/packages/backend/src/nest/storage/userProfile/userProfile.utils.ts @@ -1,4 +1,4 @@ -import createLogger from '../../common/logger' +import { createLogger } from '../../common/logger' const logger = createLogger('UserProfileStoreUtils') diff --git a/packages/backend/src/nest/storageServiceClient/storageServiceClient.service.ts b/packages/backend/src/nest/storageServiceClient/storageServiceClient.service.ts index 482fdf9c82..4e702c0712 100644 --- a/packages/backend/src/nest/storageServiceClient/storageServiceClient.service.ts +++ b/packages/backend/src/nest/storageServiceClient/storageServiceClient.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common' import EventEmitter from 'events' import { ServerStoredCommunityMetadata } from './storageServiceClient.types' import fetchRetry, { RequestInitWithRetry } from 'fetch-retry' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' import { isServerStoredMetadata } from '../validation/validators' import fetch, { Response } from 'node-fetch' @@ -17,7 +17,7 @@ class HTTPResponseError extends Error { @Injectable() export class StorageServiceClient extends EventEmitter { DEFAULT_FETCH_RETRIES = 5 - private readonly logger = Logger(StorageServiceClient.name) + private readonly logger = createLogger(StorageServiceClient.name) _serverAddress: string fetch: any fetchConfig: RequestInitWithRetry @@ -28,7 +28,7 @@ export class StorageServiceClient extends EventEmitter { this.fetchConfig = { retries: this.DEFAULT_FETCH_RETRIES, retryDelay: (attempt: number, _error: Error | null, _response: Response | null) => { - this.logger(`Retrying request ${attempt}/${this.DEFAULT_FETCH_RETRIES}`) + this.logger.info(`Retrying request ${attempt}/${this.DEFAULT_FETCH_RETRIES}`) return Math.pow(2, attempt) * 1000 }, } @@ -59,12 +59,12 @@ export class StorageServiceClient extends EventEmitter { } auth = async (): Promise => { - this.logger('Authenticating') + this.logger.info('Authenticating') const authResponse = await this.fetch(this.authUrl, { method: 'POST', ...this.fetchConfig, }) - this.logger('Auth response status', authResponse.status) + this.logger.info('Auth response status', authResponse.status) const authResponseData = await authResponse.json() return authResponseData['access_token'] } @@ -74,25 +74,25 @@ export class StorageServiceClient extends EventEmitter { } public downloadData = async (cid: string): Promise => { - this.logger(`Downloading data for cid: ${cid}`) + this.logger.info(`Downloading data for cid: ${cid}`) const accessToken = await this.auth() const dataResponse: Response = await this.fetch(this.getInviteUrl(cid), { method: 'GET', headers: { Authorization: this.getAuthorizationHeader(accessToken) }, ...this.fetchConfig, }) - this.logger('Download data response status', dataResponse.status) + this.logger.info('Download data response status', dataResponse.status) if (!dataResponse.ok) { throw new HTTPResponseError('Failed to download data', dataResponse) } const data = (await dataResponse.json()) as ServerStoredCommunityMetadata this.validateMetadata(data) - this.logger('Downloaded data', data) + this.logger.info('Downloaded data', data) return data } public uploadData = async (cid: string, data: ServerStoredCommunityMetadata) => { - this.logger(`Uploading data for cid: ${cid}`, data) + this.logger.info(`Uploading data for cid: ${cid}`, data) this.validateMetadata(data) const accessToken = await this.auth() const dataResponse: Response = await this.fetch(this.getInviteUrl(cid), { @@ -104,7 +104,7 @@ export class StorageServiceClient extends EventEmitter { body: JSON.stringify(data), ...this.fetchConfig, }) - this.logger('Upload data response status', dataResponse.status) + this.logger.info('Upload data response status', dataResponse.status) if (!dataResponse.ok) { throw new HTTPResponseError('Failed to upload data', dataResponse) } diff --git a/packages/backend/src/nest/tor/tor-control.service.ts b/packages/backend/src/nest/tor/tor-control.service.ts index 9051994853..a5a7cdb084 100644 --- a/packages/backend/src/nest/tor/tor-control.service.ts +++ b/packages/backend/src/nest/tor/tor-control.service.ts @@ -3,14 +3,14 @@ import net from 'net' import { CONFIG_OPTIONS, TOR_CONTROL_PARAMS } from '../const' import { ConfigOptions } from '../types' import { TorControlAuthType, TorControlParams } from './tor.types' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' @Injectable() export class TorControl { connection: net.Socket | null isSending: boolean authString: string - private readonly logger = Logger(TorControl.name) + private readonly logger = createLogger(TorControl.name) constructor( @Inject(TOR_CONTROL_PARAMS) public torControlParams: TorControlParams, @@ -60,9 +60,9 @@ export class TorControl { // eslint-disable-next-line no-constant-condition while (true) { try { - this.logger(`Connecting to Tor, host: ${this.torControlParams.host} port: ${this.torControlParams.port}`) + this.logger.info(`Connecting to Tor, host: ${this.torControlParams.host} port: ${this.torControlParams.port}`) await this._connect() - this.logger('Tor connected') + this.logger.info('Tor connected') return } catch (e) { this.logger.error('Retrying due to error...', e) @@ -93,7 +93,7 @@ export class TorControl { resolve({ code: 250, messages: dataArray }) } else { clearTimeout(connectionTimeout) - console.error(`TOR CONNECTION ERROR: ${JSON.stringify(dataArray, null, 2)}`) + this.logger.error(`TOR CONNECTION ERROR:`, dataArray) reject(`${dataArray[0]}`) } clearTimeout(connectionTimeout) @@ -104,16 +104,16 @@ export class TorControl { } public async sendCommand(command: string): Promise<{ code: number; messages: string[] }> { - this.logger(`Sending tor command: ${command}`) + this.logger.info(`Sending tor command: ${command}`) // Only send one command at a time. if (this.isSending) { - this.logger('Tor connection already established, waiting...') + this.logger.info('Tor connection already established, waiting...') } // Wait for existing command to finish. while (this.isSending) { const timeout = 750 - this.logger(`Waiting for ${timeout}ms to retry command...`) + this.logger.info(`Waiting for ${timeout}ms to retry command...`) await new Promise(r => setTimeout(r, timeout)) } diff --git a/packages/backend/src/nest/tor/tor.service.ts b/packages/backend/src/nest/tor/tor.service.ts index 6b739f0572..63e679d503 100644 --- a/packages/backend/src/nest/tor/tor.service.ts +++ b/packages/backend/src/nest/tor/tor.service.ts @@ -11,7 +11,7 @@ import { CONFIG_OPTIONS, QUIET_DIR, SERVER_IO_PROVIDER, TOR_PARAMS_PROVIDER, TOR import { TorControl } from './tor-control.service' import { GetInfoTorSignal, HiddenServiceData, TorParams, TorParamsProvider, TorPasswordProvider } from './tor.types' -import Logger from '../common/logger' +import { createLogger } from '../common/logger' export class Tor extends EventEmitter implements OnModuleInit { socksPort: number @@ -22,7 +22,7 @@ export class Tor extends EventEmitter implements OnModuleInit { controlPort: number | undefined interval: any initTimeout: any - private readonly logger = Logger(Tor.name) + private readonly logger = createLogger(Tor.name) private hiddenServices: Map = new Map() private initializedHiddenServices: Map = new Map() constructor( @@ -36,7 +36,7 @@ export class Tor extends EventEmitter implements OnModuleInit { super() this.controlPort = configOptions.torControlPort - console.log('QUIET DIR', this.quietDir) + this.logger.info('QUIET DIR', this.quietDir) } async onModuleInit() { @@ -60,10 +60,10 @@ export class Tor extends EventEmitter implements OnModuleInit { } private async isBootstrappingFinished(): Promise { - this.logger('Checking bootstrap status') + this.logger.info('Checking bootstrap status') const output = await this.torControl.sendCommand('GETINFO status/bootstrap-phase') if (output.messages[0] === '250-status/bootstrap-phase=NOTICE BOOTSTRAP PROGRESS=100 TAG=done SUMMARY="Done"') { - this.logger('Bootstrapping finished!') + this.logger.info('Bootstrapping finished!') return true } return false @@ -71,11 +71,11 @@ export class Tor extends EventEmitter implements OnModuleInit { public async init(timeout = 120_000): Promise { if (!this.socksPort) this.socksPort = await getPort() - this.logger('Initializing tor...') + this.logger.info('Initializing tor...') return await new Promise((resolve, reject) => { if (!fs.existsSync(this.quietDir)) { - this.logger("Quiet dir doesn't exist, creating it now") + this.logger.info("Quiet dir doesn't exist, creating it now") fs.mkdirSync(this.quietDir) } @@ -85,11 +85,11 @@ export class Tor extends EventEmitter implements OnModuleInit { if (fs.existsSync(this.torPidPath)) { const file = fs.readFileSync(this.torPidPath) oldTorPid = Number(file.toString()) - this.logger(`${this.torPidPath} exists. Old tor pid: ${oldTorPid}`) + this.logger.info(`${this.torPidPath} exists. Old tor pid: ${oldTorPid}`) } this.initTimeout = setTimeout(async () => { - this.logger('Checking init timeout') + this.logger.info('Checking init timeout') const bootstrapDone = await this.isBootstrappingFinished() if (!bootstrapDone) { this.initializedHiddenServices = new Map() @@ -100,39 +100,39 @@ export class Tor extends EventEmitter implements OnModuleInit { const tryToSpawnTor = async () => { if (oldTorPid != null) { - this.logger(`Clearing out old tor process with pid ${oldTorPid}`) + this.logger.info(`Clearing out old tor process with pid ${oldTorPid}`) this.clearOldTorProcess(oldTorPid) } try { - this.logger('Clearing out hanging tor process(es)') + this.logger.info('Clearing out hanging tor process(es)') this.clearHangingTorProcess() } catch (e) { - this.logger('Error occured while trying to clear hanging tor processes', e) + this.logger.error('Error occured while trying to clear hanging tor processes', e) } try { - this.logger('Spawning new tor process(es)') + this.logger.info('Spawning new tor process(es)') await this.spawnTor() this.interval = setInterval(async () => { - this.logger('Checking bootstrap interval') + this.logger.info('Checking bootstrap interval') const bootstrapDone = await this.isBootstrappingFinished() if (bootstrapDone) { - this.logger(`Sending ${SocketActionTypes.TOR_INITIALIZED}`) + this.logger.info(`Sending ${SocketActionTypes.TOR_INITIALIZED}`) this.serverIoProvider.io.emit(SocketActionTypes.TOR_INITIALIZED) // TODO: Figure out how to get redialing (or, ideally, initial dialing) on tor initialization working - // this.logger('Attempting to redial peers (if possible)') + // this.logger.info('Attempting to redial peers (if possible)') // this.emit(SocketActionTypes.REDIAL_PEERS) clearInterval(this.interval) } }, 2500) - this.logger(`Spawned tor with pid(s): ${this.getTorProcessIds()}`) + this.logger.info(`Spawned tor with pid(s): ${this.getTorProcessIds()}`) resolve() } catch (e) { - this.logger('Killing tor due to error', e) + this.logger.error('Killing tor due to error', e) this.clearHangingTorProcess() removeFilesFromDir(this.torDataDirectory) @@ -183,14 +183,14 @@ export class Tor extends EventEmitter implements OnModuleInit { } public clearHangingTorProcess() { - this.logger('Attempting to kill hanging tor processes') + this.logger.info('Attempting to kill hanging tor processes') const ids = this.getTorProcessIds() if (ids.length === 0) { - this.logger('No tor process(es) found to kill') + this.logger.info('No tor process(es) found to kill') return } - this.logger(`Found tor process(es) with pid(s) ${ids}. Killing...`) + this.logger.info(`Found tor process(es) with pid(s) ${ids}. Killing...`) for (const id of ids) { try { @@ -210,14 +210,14 @@ export class Tor extends EventEmitter implements OnModuleInit { this.logger.error(err) } if (stdout.trim() === 'tor' || stdout.search('tor.exe') !== -1) { - this.logger(`Killing old tor, pid: ${oldTorPid}`) + this.logger.info(`Killing old tor, pid: ${oldTorPid}`) try { process.kill(oldTorPid, 'SIGTERM') } catch (e) { - this.logger.error(`Tried killing old tor process. Failed. Reason: ${e.message}`) + this.logger.error(`Tried killing old tor process. Failed.`, e) } } else { - this.logger(`Deleting ${this.torPidPath}`) + this.logger.info(`Deleting ${this.torPidPath}`) fs.unlinkSync(this.torPidPath) } } @@ -225,7 +225,7 @@ export class Tor extends EventEmitter implements OnModuleInit { } protected async spawnTor(): Promise { - this.logger('Spawning tor') + this.logger.info('Spawning tor') return await new Promise((resolve, reject) => { if (!this.configOptions.httpTunnelPort) { this.logger.error("Can't spawn tor - no httpTunnelPort") @@ -269,7 +269,7 @@ export class Tor extends EventEmitter implements OnModuleInit { }) this.process.on('exit', (code, signal) => { - this.logger(`Tor exited with code ${code} and signal ${signal}`) + this.logger.info(`Tor exited with code ${code} and signal ${signal}`) }) this.process.on('error', err => { @@ -277,8 +277,6 @@ export class Tor extends EventEmitter implements OnModuleInit { }) this.process.stdout.on('data', (data: any) => { - this.logger(data.toString()) - const bootstrappedRegexp = /Bootstrapped 0/ // TODO: Figure out if there's a way to get this working in tests // const bootstrappedRegexp = /Loaded enough directory info to build circuits/ @@ -289,13 +287,13 @@ export class Tor extends EventEmitter implements OnModuleInit { }) this.process.stderr.on('data', (data: any) => { - this.logger('ERROR:', data.toString()) + this.logger.error('ERROR:', data) }) }) } public async spawnHiddenServices() { - this.logger(`Spawning hidden service(s) (count: ${this.hiddenServices.size})`) + this.logger.info(`Spawning hidden service(s) (count: ${this.hiddenServices.size})`) for (const el of this.hiddenServices.values()) { await this.spawnHiddenService(el) } @@ -310,17 +308,17 @@ export class Tor extends EventEmitter implements OnModuleInit { privKey: string virtPort?: number }): Promise { - this.logger(`Spawning Tor hidden service`) + this.logger.info(`Spawning Tor hidden service`) const initializedHiddenService = this.initializedHiddenServices.get(privKey) if (initializedHiddenService) { - this.logger(`Hidden service already initialized for ${initializedHiddenService.onionAddress}`) + this.logger.warn(`Hidden service already initialized for ${initializedHiddenService.onionAddress}`) return initializedHiddenService.onionAddress } const status = await this.torControl.sendCommand( `ADD_ONION ${privKey} Flags=Detach Port=${virtPort},127.0.0.1:${targetPort}` ) const onionAddress = status.messages[0].replace('250-ServiceID=', '') - this.logger(`Spawned hidden service with onion address ${onionAddress}`) + this.logger.info(`Spawned hidden service with onion address ${onionAddress}`) const hiddenService: HiddenServiceData = { targetPort, privKey, virtPort, onionAddress } this.hiddenServices.set(privKey, hiddenService) @@ -363,28 +361,28 @@ export class Tor extends EventEmitter implements OnModuleInit { public async switchToCleanCircuts() { try { - this.logger('Sending newnym') + this.logger.info('Sending newnym') const response = await this.torControl.sendCommand('SIGNAL NEWNYM') - this.logger('Newnym response', response) + this.logger.info('Newnym response', response) } catch (e) { - this.logger('Could not send newnym', e.message) + this.logger.error('Could not send newnym', e) } } public async getInfo(getInfoTarget: GetInfoTorSignal) { try { const response = await this.torControl.sendCommand(`GETINFO ${getInfoTarget}`) - this.logger('GETINFO', getInfoTarget, response) + this.logger.info('GETINFO', getInfoTarget, response) } catch (e) { - this.logger('Could not get info', getInfoTarget) + this.logger.error('Could not get info', getInfoTarget, e) } } public async kill(): Promise { return await new Promise((resolve, reject) => { - this.logger('Killing tor... with pid', this.process?.pid) + this.logger.info('Killing tor... with pid', this.process?.pid) if (this.process === null) { - this.logger('TOR: Process is not initalized.') + this.logger.warn('TOR: Process is not initalized.') resolve() return } diff --git a/packages/backend/src/nest/validation/validators.ts b/packages/backend/src/nest/validation/validators.ts index d562af45b7..b9c26d3a73 100644 --- a/packages/backend/src/nest/validation/validators.ts +++ b/packages/backend/src/nest/validation/validators.ts @@ -3,6 +3,9 @@ import joi from 'joi' import { ChannelMessage, PublicChannel } from '@quiet/types' import { ServerStoredCommunityMetadata } from '../storageServiceClient/storageServiceClient.types' import { isPSKcodeValid } from '@quiet/common' +import { createLogger } from '../common/logger' + +const logger = createLogger('rnBridge') const messageMediaSchema = joi.object({ path: joi.string().allow(null), @@ -81,7 +84,7 @@ export const isChannel = (channel: PublicChannel): boolean => { export const isServerStoredMetadata = (metadata: ServerStoredCommunityMetadata): boolean => { const value = metadataSchema.validate(metadata) // Leave this log for first iterations of QSS - console.log(value.error) + logger.info(value.error) return !value.error } diff --git a/packages/backend/src/nest/websocketOverTor/index.ts b/packages/backend/src/nest/websocketOverTor/index.ts index c0b1160214..00ea1bd075 100644 --- a/packages/backend/src/nest/websocketOverTor/index.ts +++ b/packages/backend/src/nest/websocketOverTor/index.ts @@ -17,9 +17,9 @@ import { connect } from 'it-ws' import { type ServerOptions, type WebSocketServer as ItWsWebsocketServer } from 'it-ws/server' import { multiaddr } from '@multiformats/multiaddr' import { type MultiaddrConnection, type Connection } from '@libp2p/interface-connection' -import logger from '../common/logger' +import { createLogger } from '../common/logger' -const log = logger('libp2p:websockets') +const logger = createLogger('libp2p:websockets') const symbol = Symbol.for('@libp2p/transport') @@ -84,23 +84,23 @@ export class WebSockets extends EventEmitter { signal: options.signal, }) } catch (e) { - log.error('error connecting to %s. Details: %s', ma, e) + logger.error(`error connecting to ${ma}`, e) throw e } try { maConn = socketToMaConn(socket, ma, { signal: options.signal }) - log('new outbound connection %s', maConn.remoteAddr) + logger.info('new outbound connection:', maConn.remoteAddr) } catch (e) { - log.error('error creating new outbound connection %s. Details: %s', ma, e) + logger.error(`error creating new outbound connection ${ma}`, e) throw e } try { conn = await options.upgrader.upgradeOutbound(maConn) - log('outbound connection %s upgraded', maConn.remoteAddr) + logger.info('outbound connection upgraded:', maConn.remoteAddr) return conn } catch (e) { - log.error('error upgrading outbound connection %s. Details: %s', maConn.remoteAddr, e) + logger.error(`error upgrading outbound connection ${maConn.remoteAddr}`, e) throw e } } @@ -110,11 +110,11 @@ export class WebSockets extends EventEmitter { throw new AbortError() } const cOpts = ma.toOptions() - log('connect %s:%s', cOpts.host, cOpts.port) + logger.info(`connect ${cOpts.host}:${cOpts.port}`) const errorPromise = pDefer() const errfn = (event: ErrorEvent) => { - log.error(`connection error`, event) + logger.error(`connection error`, event) errorPromise.reject(event) } @@ -131,7 +131,7 @@ export class WebSockets extends EventEmitter { if (!options.signal) { await Promise.race([rawSocket.connected(), errorPromise.promise]) - log(`${this.localAddress} connected %s`, ma) + logger.info(`${this.localAddress} connected to:`, ma) return rawSocket } @@ -142,7 +142,7 @@ export class WebSockets extends EventEmitter { onAbort = () => { reject(new AbortError()) rawSocket.close().catch(err => { - log.error('error closing raw socket', err) + logger.error('error closing raw socket', err) }) } @@ -160,7 +160,7 @@ export class WebSockets extends EventEmitter { options.signal.removeEventListener('abort', onAbort) } - log('connected %s', ma) + logger.info('connected:', ma) return rawSocket } @@ -170,8 +170,7 @@ export class WebSockets extends EventEmitter { * `upgrader.upgradeInbound` */ prepareListener = ({ handler, upgrader }: CreateListenerOptions): any => { - console.log('preparing listener') - log('prepareListener') + logger.info('prepareListener') const listener: any = new EventEmitter() const trackConn = (server: WebSocketServer, maConn: MultiaddrConnection) => { @@ -196,7 +195,7 @@ export class WebSockets extends EventEmitter { let conn: Connection // eslint-disable-next-line const query = url.parse(request.url, true).query - log('server connecting with', query.remoteAddress) + logger.info('server connecting with', query.remoteAddress) if (!query.remoteAddress) return const remoteAddress = query.remoteAddress.toString() @@ -207,21 +206,21 @@ export class WebSockets extends EventEmitter { multiaddrs: [maConn.remoteAddr], } this.discovery.emit('peer', peer) - log('new inbound connection %s', maConn.remoteAddr) + logger.info('new inbound connection:', maConn.remoteAddr) } catch (e) { - log.error(`Failed to convert stream into a MultiaddrConnection for ${remoteAddress}:`, e) + logger.error(`Failed to convert stream into a MultiaddrConnection for ${remoteAddress}:`, e) return } try { conn = await upgrader.upgradeInbound(maConn) } catch (err) { - log.error('inbound connection failed to upgrade', err) + logger.error('inbound connection failed to upgrade', err) await maConn?.close() return } - log('inbound connection %s upgraded', maConn.remoteAddr) + logger.info('inbound connection upgraded:', maConn.remoteAddr) trackConn(server, maConn) @@ -230,7 +229,7 @@ export class WebSockets extends EventEmitter { }) .on('listening', () => listener.emit('listening')) .on('error', err => { - log.error(`Websocket error`, err) + logger.error(`Websocket error`, err) listener.emit('error', err) }) .on('close', () => listener.emit('close')) diff --git a/packages/backend/src/nest/websocketOverTor/listener.ts b/packages/backend/src/nest/websocketOverTor/listener.ts index 54c63e6ca1..114058847b 100644 --- a/packages/backend/src/nest/websocketOverTor/listener.ts +++ b/packages/backend/src/nest/websocketOverTor/listener.ts @@ -1,6 +1,6 @@ // import os from 'os' // import { createServer } from 'it-ws/server' -// import logger from '../../logger' +// import { createLogger } from '../../logger' // import { socketToMaConn } from './socket-to-conn.js' // import { EventEmitter, CustomEvent } from './events' // import type { Listener, ListenerEvents, CreateListenerOptions } from '@libp2p/interface-transport' @@ -10,7 +10,7 @@ // import type { Connection } from '@libp2p/interface-connection' // import type { Multiaddr } from '@multiformats/multiaddr' -// const log = logger('libp2p:websockets:listener') +// const logger = createLogger('libp2p:websockets:listener') // // @ts-ignore // class WebSocketListener extends EventEmitter implements Listener { @@ -33,7 +33,7 @@ // ...init, // onConnection: (stream: DuplexWebSocket) => { // const maConn = socketToMaConn(stream, this.toMultiaddr(stream.remoteAddress ?? '', stream.remotePort ?? 0)) -// log('new inbound connection %s', maConn.remoteAddr) +// logger.info('new inbound connection %s', maConn.remoteAddr) // this.connections.add(stream) @@ -44,7 +44,7 @@ // try { // void init.upgrader.upgradeInbound(maConn) // .then((conn) => { -// log('inbound connection %s upgraded', maConn.remoteAddr) +// logger.info('inbound connection %s upgraded', maConn.remoteAddr) // if (init?.handler != null) { // init?.handler(conn) @@ -55,16 +55,16 @@ // })) // }) // .catch(async err => { -// log.error('inbound connection failed to upgrade', err) +// logger.error('inbound connection failed to upgrade', err) // await maConn.close().catch(err => { -// log.error('inbound connection failed to close after upgrade failed', err) +// logger.error('inbound connection failed to close after upgrade failed', err) // }) // }) // } catch (err) { -// log.error('inbound connection failed to upgrade', err) +// logger.error('inbound connection failed to upgrade', err) // maConn.close().catch(err => { -// log.error('inbound connection failed to close after upgrade failed', err) +// logger.error('inbound connection failed to close after upgrade failed', err) // }) // } // } diff --git a/packages/backend/src/nest/websocketOverTor/socket-to-conn.ts b/packages/backend/src/nest/websocketOverTor/socket-to-conn.ts index 2417b529f3..3db3b7fee2 100644 --- a/packages/backend/src/nest/websocketOverTor/socket-to-conn.ts +++ b/packages/backend/src/nest/websocketOverTor/socket-to-conn.ts @@ -6,9 +6,9 @@ import type { Multiaddr } from '@multiformats/multiaddr' import type { DuplexWebSocket } from 'it-ws/duplex' import pTimeout from 'p-timeout' -import logger from '../common/logger' +import { createLogger } from '../common/logger' -const log = logger('libp2p:websockets:socket') +const logger = createLogger('libp2p:websockets:socket') export interface SocketToConnOptions extends AbortOptions { localAddr?: Multiaddr @@ -33,7 +33,7 @@ export function socketToMaConn( await stream.sink(source) } catch (err: any) { if (err.type !== 'aborted') { - log.error(err) + logger.error(`Error creating MultiaddrConnection from socket`, err) } } }, @@ -52,7 +52,10 @@ export function socketToMaConn( await pTimeout(stream.close(), CLOSE_TIMEOUT) } catch (err) { const { host, port } = maConn.remoteAddr.toOptions() - log('timeout closing stream to %s:%s after %dms, destroying it manually', host, port, Date.now() - start) + logger.error( + `timeout closing stream to ${host}:${port} after ${Date.now() - start}ms, destroying it manually`, + err + ) stream.destroy() } finally { diff --git a/packages/backend/src/nest/websocketOverTor/websocketOverTor.tor.spec.ts b/packages/backend/src/nest/websocketOverTor/websocketOverTor.tor.spec.ts index f8fc150f63..ba11474081 100644 --- a/packages/backend/src/nest/websocketOverTor/websocketOverTor.tor.spec.ts +++ b/packages/backend/src/nest/websocketOverTor/websocketOverTor.tor.spec.ts @@ -17,6 +17,10 @@ import crypto from 'crypto' import { TorControl } from '../tor/tor-control.service' import { TorControlAuthType } from '../tor/tor.types' import { createLibp2pAddress } from '@quiet/common' +import { createLogger } from '../common/logger' + +const logger = createLogger('websocketOverTor:test') + jest.setTimeout(120000) describe('websocketOverTor', () => { @@ -125,12 +129,12 @@ describe('websocketOverTor', () => { ])('connects successfully with CA passed as %s', async (_name: string, caType: (ca: string) => any) => { const pems = await createCertificatesTestHelper(`${service1.onionAddress}`, `${service2.onionAddress}`) // In case test fails on CI, we will be able to conduct test against failing credentials. - console.log(`serVert ${pems.servCert}`) - console.log(`servKey ${pems.servKey}`) - console.log(`ca ${pems.ca}`) - console.log(`caKey ${pems.ca_key}`) - console.log(`userCert ${pems.userCert}`) - console.log(`userKey ${pems.userKey}`) + logger.info(`serVert ${pems.servCert}`) + logger.info(`servKey ${pems.servKey}`) + logger.info(`ca ${pems.ca}`) + logger.info(`caKey ${pems.ca_key}`) + logger.info(`userCert ${pems.userCert}`) + logger.info(`userKey ${pems.userKey}`) const prepareListenerArg: CreateListenerOptions = { handler: x => x, upgrader: { @@ -198,7 +202,7 @@ describe('websocketOverTor', () => { upgrader: prepareListenerArg.upgrader, }) } catch (e) { - console.log(`caught Error ${e.message as string}, retryCount is ${retryCount}`) + logger.info(`caught Error ${e.message as string}, retryCount is ${retryCount}`) if (retryCount < 2) { retryCount++ await tryDial() diff --git a/packages/backend/src/rn-bridge.ts b/packages/backend/src/rn-bridge.ts index d7df0d60f8..f7322fc794 100644 --- a/packages/backend/src/rn-bridge.ts +++ b/packages/backend/src/rn-bridge.ts @@ -1,7 +1,10 @@ import { emit } from 'process' +import { createLogger } from './nest/common/logger' const EventEmitter = require('events') +const logger = createLogger('rnBridge') + const initRnBridge = () => { // @ts-ignore const NativeBridge = process._linkedBinding('rn_bridge') @@ -46,19 +49,19 @@ const initRnBridge = () => { const parsed: { [key: string]: string } = {} const entries = message.split('|') if (entries.length < 1) { - console.warn('Malformed or non-existen rn-bridge payload ', entries) + logger.warn('Malformed or non-existen rn-bridge payload ', entries) return parsed } entries.forEach(s => { const split = s.split(':') if (split.length !== 2) { - console.warn('Malformed rn-bridge entry: ', split) + logger.warn('Malformed rn-bridge entry: ', split) return } parsed[split[0]] = split[1] }) - console.log('parsed', parsed) + logger.info('parsed', parsed) return parsed } @@ -221,7 +224,7 @@ const initRnBridge = () => { if (channels.hasOwnProperty(channelName)) { channels[channelName].processData(data) } else { - console.error('ERROR: Channel not found:', channelName) + logger.error('ERROR: Channel not found:', channelName) } } diff --git a/packages/common/package-lock.json b/packages/common/package-lock.json index 3d0b13a152..85242e7bb6 100644 --- a/packages/common/package-lock.json +++ b/packages/common/package-lock.json @@ -9,6 +9,9 @@ "version": "2.0.2-alpha.1", "license": "GPL-3.0-or-later", "dependencies": { + "@formatjs/intl-datetimeformat": "^6.12.3", + "@formatjs/intl-getcanonicallocales": "^2.3.0", + "@formatjs/intl-locale": "^3.4.5", "cross-env": "^5.2.0", "debug": "^4.3.1", "validator": "^13.11.0" @@ -676,6 +679,92 @@ "node": ">=0.1.95" } }, + "node_modules/@formatjs/intl-datetimeformat": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@formatjs/intl-datetimeformat/-/intl-datetimeformat-6.12.3.tgz", + "integrity": "sha512-NCuib8A83IbD2tAEo6kVG+udnHc9Vd0tj3vPlz/HuRQ7O6tvMYyJzbqaNlhjnB4qP7HT0XHWEBQQviM3xjphNw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-datetimeformat/node_modules/@formatjs/ecma402-abstract": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-datetimeformat/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-datetimeformat/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@formatjs/intl-getcanonicallocales": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-2.3.0.tgz", + "integrity": "sha512-BOXbLwqQ7nKua/l7tKqDLRN84WupDXFDhGJQMFvsMVA2dKuOdRaWTxWpL3cJ7qPkoNw11Jf+Xpj4OSPBBvW0eQ==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-getcanonicallocales/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@formatjs/intl-locale": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-locale/-/intl-locale-3.4.5.tgz", + "integrity": "sha512-obUNTK0Py9sDSTlCXfNQotC7Oy5xd3iBx6dVtzd9YXProkP0NxcRrhlPmfHO9AuYNXdHuarHlozoBxZjOtM4mQ==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/intl-enumerator": "1.4.5", + "@formatjs/intl-getcanonicallocales": "2.3.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-locale/node_modules/@formatjs/ecma402-abstract": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-locale/node_modules/@formatjs/intl-enumerator": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-enumerator/-/intl-enumerator-1.4.5.tgz", + "integrity": "sha512-IbEJHzJO0buoq//RqbLRDettIkZ/WYGOL+8dy5oxzefqlpTsmJFUo5t1sK0/1EoC+eOFiyhdgh5ihCH3Cehc0w==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-locale/node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-locale/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -7314,6 +7403,98 @@ "minimist": "^1.2.0" } }, + "@formatjs/intl-datetimeformat": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@formatjs/intl-datetimeformat/-/intl-datetimeformat-6.12.3.tgz", + "integrity": "sha512-NCuib8A83IbD2tAEo6kVG+udnHc9Vd0tj3vPlz/HuRQ7O6tvMYyJzbqaNlhjnB4qP7HT0XHWEBQQviM3xjphNw==", + "requires": { + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + }, + "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "requires": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "requires": { + "tslib": "^2.4.0" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@formatjs/intl-getcanonicallocales": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-2.3.0.tgz", + "integrity": "sha512-BOXbLwqQ7nKua/l7tKqDLRN84WupDXFDhGJQMFvsMVA2dKuOdRaWTxWpL3cJ7qPkoNw11Jf+Xpj4OSPBBvW0eQ==", + "requires": { + "tslib": "^2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, + "@formatjs/intl-locale": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-locale/-/intl-locale-3.4.5.tgz", + "integrity": "sha512-obUNTK0Py9sDSTlCXfNQotC7Oy5xd3iBx6dVtzd9YXProkP0NxcRrhlPmfHO9AuYNXdHuarHlozoBxZjOtM4mQ==", + "requires": { + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/intl-enumerator": "1.4.5", + "@formatjs/intl-getcanonicallocales": "2.3.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "@formatjs/ecma402-abstract": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "requires": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "@formatjs/intl-enumerator": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-enumerator/-/intl-enumerator-1.4.5.tgz", + "integrity": "sha512-IbEJHzJO0buoq//RqbLRDettIkZ/WYGOL+8dy5oxzefqlpTsmJFUo5t1sK0/1EoC+eOFiyhdgh5ihCH3Cehc0w==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "requires": { + "tslib": "^2.4.0" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", diff --git a/packages/common/package.json b/packages/common/package.json index fe699063d9..c26d9268e1 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -30,6 +30,9 @@ "typescript": "^4.9.3" }, "dependencies": { + "@formatjs/intl-datetimeformat": "^6.12.3", + "@formatjs/intl-getcanonicallocales": "^2.3.0", + "@formatjs/intl-locale": "^3.4.5", "@quiet/logger": "^2.0.2-alpha.0", "@quiet/types": "^2.0.2-alpha.1", "cross-env": "^5.2.0", diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 1885e4ec9e..71099f52b4 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -13,3 +13,4 @@ export * from './auth' export * from './messages' export * from './compare' export * from './dir' +export * from './polyfill' diff --git a/packages/common/src/invitationCode.ts b/packages/common/src/invitationCode.ts index 8be7478615..8d26195cfc 100644 --- a/packages/common/src/invitationCode.ts +++ b/packages/common/src/invitationCode.ts @@ -2,8 +2,8 @@ import { InvitationData, InvitationDataV1, InvitationDataV2, InvitationDataVersi import { QUIET_JOIN_PAGE } from './const' import { createLibp2pAddress, isPSKcodeValid } from './libp2p' // import { CID } from 'multiformats/cid' // Fixme: dependency issue -import Logger from './logger' -const logger = Logger('invite') +import { createLogger } from './logger' +const logger = createLogger('invite') // V1 invitation code format (p2p without relay) export const PSK_PARAM_KEY = 'k' @@ -108,7 +108,7 @@ const parseDeepUrl = ({ url, expectedProtocol = `${DEEP_URL_SCHEME}:` }: ParseDe if (!data) throw new Error(`Could not parse invitation code from deep url '${url}'`) - logger(`Invitation data '${data}' parsed`) + logger.info(`Invitation data '${data}' parsed`) return data } @@ -138,18 +138,18 @@ export const p2pAddressesToPairs = (addresses: string[]): InvitationPair[] => { try { peerId = peerAddress.split('/p2p/')[1] } catch (e) { - console.info(`Could not add peer address '${peerAddress}' to invitation url. Reason: ${e.message}`) + logger.error(`Could not add peer address '${peerAddress}' to invitation url.`, e) continue } try { onionAddress = peerAddress.split('/tcp/')[0].split('/dns4/')[1] } catch (e) { - console.info(`Could not add peer address '${peerAddress}' to invitation url. Reason: ${e.message}`) + logger.error(`Could not add peer address '${peerAddress}' to invitation url.`, e) continue } if (!peerId || !onionAddress) { - console.error(`No peerId or address in ${peerAddress}`) + logger.error(`No peerId or address in ${peerAddress}`) continue } const rawAddress = onionAddress.endsWith('.onion') ? onionAddress.split('.')[0] : onionAddress @@ -210,10 +210,10 @@ export const argvInvitationCode = (argv: string[]): InvitationData | null => { let invitationData: InvitationData | null = null for (const arg of argv) { if (!arg.startsWith(DEEP_URL_SCHEME_WITH_SEPARATOR)) { - console.log('Not a deep url, not parsing', arg) + logger.warn('Not a deep url, not parsing', arg) continue } - logger('Parsing deep url', arg) + logger.info('Parsing deep url', arg) invitationData = parseInvitationCodeDeepUrl(arg) switch (invitationData.version) { case InvitationDataVersion.v1: @@ -230,11 +230,11 @@ export const argvInvitationCode = (argv: string[]): InvitationData | null => { const peerDataValid = ({ peerId, onionAddress }: { peerId: string; onionAddress: string }): boolean => { if (!peerId.match(PEER_ID_REGEX)) { // TODO: test it more properly e.g with PeerId.createFromB58String(peerId.trim()) - logger(`PeerId ${peerId} is not valid`) + logger.warn(`PeerId ${peerId} is not valid`) return false } if (!onionAddress.trim().match(ONION_ADDRESS_REGEX)) { - logger(`Onion address ${onionAddress} is not valid`) + logger.warn(`Onion address ${onionAddress} is not valid`) return false } return true @@ -258,7 +258,7 @@ const validateUrlParams = (params: URLSearchParams, requiredParams: string[]) => } const isParamValid = (param: string, value: string) => { - logger(`Validating param ${param} with value ${value}`) + logger.info(`Validating param ${param} with value ${value}`) switch (param) { case CID_PARAM_KEY: // try { diff --git a/packages/common/src/logger.ts b/packages/common/src/logger.ts index 31360daef5..25868475f3 100644 --- a/packages/common/src/logger.ts +++ b/packages/common/src/logger.ts @@ -1,7 +1,3 @@ -import { logger } from '@quiet/logger' +import { createQuietLogger } from '@quiet/logger' -const createLogger = (name: string) => { - return logger('utils')(name) -} - -export default createLogger +export const createLogger = createQuietLogger('utils') diff --git a/packages/common/src/polyfill.ts b/packages/common/src/polyfill.ts new file mode 100644 index 0000000000..4d5c3e0907 --- /dev/null +++ b/packages/common/src/polyfill.ts @@ -0,0 +1,40 @@ +/** + * Polyfills for mobile and more + * + * TODO: Is this the right place to put this? + */ + +import { shouldPolyfill as shouldPolyfillCanon } from '@formatjs/intl-getcanonicallocales/should-polyfill' +import { shouldPolyfill as shouldPolyfillLocale } from '@formatjs/intl-locale/should-polyfill' +import { shouldPolyfill as shouldPolyFillFormat } from '@formatjs/intl-datetimeformat/should-polyfill' + +/** + * Polyfill packages that are missing + */ +function polyfill() { + /** + * Locale/intl related polyfills for mobile (at least android) + * + * NOTE: I thought this was taken care of by `def jscFlavor = 'org.webkit:android-jsc-intl:+'` in the build.gradle file + * but it didn't work for me. I also tried polyfilling in various places in the mobile package and none of it worked. This + * is where I landed :shrug: + */ + + if (shouldPolyfillCanon()) { + require('@formatjs/intl-getcanonicallocales/polyfill') + } + + if (shouldPolyfillLocale()) { + require('@formatjs/intl-locale/polyfill') + } + + if (shouldPolyFillFormat()) { + require('@formatjs/intl-datetimeformat/polyfill') + require('@formatjs/intl-datetimeformat/locale-data/en') + } +} + +/** + * Perform the polyfills + */ +polyfill() diff --git a/packages/desktop/package-lock.json b/packages/desktop/package-lock.json index 3c1d17aa14..0456154fd7 100644 --- a/packages/desktop/package-lock.json +++ b/packages/desktop/package-lock.json @@ -18,6 +18,7 @@ "electron-updater": "^5.0.1", "get-port": "^5.1.1", "keymirror": "0.1.1", + "luxon": "^3.4.4", "pkijs": "^3.0.8", "react-markdown": "^6.0.3", "react-qr-code": "^2.0.11", @@ -58,7 +59,7 @@ "@types/jest": "^26.0.23", "@types/keymirror": "^0.1.1", "@types/lodash": "^4.14.169", - "@types/luxon": "^1.25.0", + "@types/luxon": "^3.4.2", "@types/node": "16.11.7", "@types/ps-node": "^0.1.0", "@types/ramda": "^0.27.31", @@ -103,7 +104,6 @@ "js-yaml": "4.1.0", "lint-staged": "^15.2.2", "local-cypress": "1.2.6", - "luxon": "^1.11.4", "mathjax-full": "^3.2.2", "node-polyfill-webpack-plugin": "^2.0.1", "ramda": "^0.26.1", @@ -17131,9 +17131,9 @@ "dev": true }, "node_modules/@types/luxon": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.25.0.tgz", - "integrity": "sha512-iIJp2CP6C32gVqI08HIYnzqj55tlLnodIBMCcMf28q9ckqMfMzocCmIzd9JWI/ALLPMUiTkCu1JGv3FFtu6t3g==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", "dev": true }, "node_modules/@types/mdast": { @@ -35911,12 +35911,11 @@ } }, "node_modules/luxon": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.11.4.tgz", - "integrity": "sha512-zTQ1DCShOGHIdNpa56yjDpUCowKDsBqeFVuEG2XBcrAM2udxN0g3N5RTZzbw94OkDiBgECsuDgLNnQTo73yghw==", - "dev": true, + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/lz-string": { @@ -59477,9 +59476,9 @@ "dev": true }, "@types/luxon": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.25.0.tgz", - "integrity": "sha512-iIJp2CP6C32gVqI08HIYnzqj55tlLnodIBMCcMf28q9ckqMfMzocCmIzd9JWI/ALLPMUiTkCu1JGv3FFtu6t3g==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", "dev": true }, "@types/mdast": { @@ -74062,10 +74061,9 @@ } }, "luxon": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.11.4.tgz", - "integrity": "sha512-zTQ1DCShOGHIdNpa56yjDpUCowKDsBqeFVuEG2XBcrAM2udxN0g3N5RTZzbw94OkDiBgECsuDgLNnQTo73yghw==", - "dev": true + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" }, "lz-string": { "version": "1.4.4", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index ec6a442fcf..3be68fd648 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -116,7 +116,7 @@ "build:renderer:prod": "webpack --config webpack/webpack.config.renderer.prod.js", "postBuild": "node scripts/postBuild.js", "prestart": "npm run build:main", - "start": "cross-env DEBUG='backend*,quiet*,state-manager*,desktop*,utils*,libp2p:websockets:listener:backend,libp2p:connection-manager:auto-dialler' npm run start:renderer", + "start": "cross-env DEBUG='backend*,quiet*,state-manager*,desktop*,utils*,identity*,common*,libp2p:websockets:listener:backend,libp2p:connection-manager:auto-dialler' npm run start:renderer", "start:main": "cross-env NODE_ENV=development electron .", "start:renderer": "cross-env NODE_ENV=development webpack-dev-server --config webpack/webpack.config.renderer.dev.js", "storybook": "export NODE_OPTIONS=--openssl-legacy-provider && start-storybook -p 6006", @@ -141,6 +141,7 @@ "electron-updater": "^5.0.1", "get-port": "^5.1.1", "keymirror": "0.1.1", + "luxon": "^3.4.4", "pkijs": "^3.0.8", "react-markdown": "^6.0.3", "react-qr-code": "^2.0.11", @@ -184,7 +185,7 @@ "@types/jest": "^26.0.23", "@types/keymirror": "^0.1.1", "@types/lodash": "^4.14.169", - "@types/luxon": "^1.25.0", + "@types/luxon": "^3.4.2", "@types/node": "16.11.7", "@types/ps-node": "^0.1.0", "@types/ramda": "^0.27.31", @@ -230,7 +231,6 @@ "js-yaml": "4.1.0", "lint-staged": "^15.2.2", "local-cypress": "1.2.6", - "luxon": "^1.11.4", "mathjax-full": "^3.2.2", "node-polyfill-webpack-plugin": "^2.0.1", "ramda": "^0.26.1", diff --git a/packages/desktop/src/main/backendHelpers.ts b/packages/desktop/src/main/backendHelpers.ts index 912c5d6143..b95f66f2a4 100644 --- a/packages/desktop/src/main/backendHelpers.ts +++ b/packages/desktop/src/main/backendHelpers.ts @@ -1,6 +1,9 @@ import { hangingBackendProcessCommand } from '@quiet/common' import { execSync } from 'child_process' import getPort from 'get-port' +import { createLogger } from './logger' + +const logger = createLogger('backendHelpers') export const getPorts = async (): Promise<{ socksPort: number @@ -30,14 +33,14 @@ export const closeHangingBackendProcess = (backendBundlePath: string, dataDir: s if (!command) return const backendPids = execSync(command).toString('utf8').trim() if (!backendPids) return - console.log('PIDs', backendPids) + logger.info('PIDs', backendPids) const PIDs = backendPids.split('\n') - console.log(`Found ${PIDs.length} hanging backend process(es) with pid(s) ${PIDs}. Killing...`) + logger.info(`Found ${PIDs.length} hanging backend process(es) with pid(s) ${PIDs}. Killing...`) for (const pid of PIDs) { try { process.kill(Number(pid), 'SIGKILL') } catch (e) { - console.error(`Tried killing hanging backend process (PID: ${pid}). Failed. Reason: ${e.message}`) + logger.error(`Tried killing hanging backend process (PID: ${pid}). Failed`, e) } } } diff --git a/packages/desktop/src/main/invitation.ts b/packages/desktop/src/main/invitation.ts index 06306bb337..68b9204e15 100644 --- a/packages/desktop/src/main/invitation.ts +++ b/packages/desktop/src/main/invitation.ts @@ -3,6 +3,9 @@ import path from 'path' import os from 'os' import { execSync } from 'child_process' import { BrowserWindow } from 'electron' +import { createLogger } from './logger' + +const logger = createLogger('invitation') export const processInvitationCode = (mainWindow: BrowserWindow, code: string | string[]) => { if (!code || !code.length) return @@ -22,19 +25,19 @@ export const updateDesktopFile = (isDev: boolean) => { fs.cpSync(resource, appDesktopFile) } } catch (e) { - console.error(`Can't copy .desktop file: ${e.message}`) + logger.error(`Can't copy .desktop file`, e) } try { updateExecPath(appDesktopFile) } catch (e) { - console.error(`Can't update .desktop file: ${e.message}`) + logger.error(`Can't update .desktop file`, e) } try { execSync('xdg-settings set default-url-scheme-handler quiet quiet.desktop') } catch (e) { - console.error("Couldn't set default scheme handler", e.message) + logger.error("Couldn't set default scheme handler", e) } } diff --git a/packages/desktop/src/main/loadMainEnvs.ts b/packages/desktop/src/main/loadMainEnvs.ts index 76f4835171..82b0859730 100644 --- a/packages/desktop/src/main/loadMainEnvs.ts +++ b/packages/desktop/src/main/loadMainEnvs.ts @@ -1,14 +1,17 @@ import fs from 'fs' import path from 'path' +import { createLogger } from './logger' + +const logger = createLogger('loadMainEnvs') if (process.env.NODE_ENV !== 'development') { try { const pathProd = path.join.apply(null, [process.resourcesPath, 'mainEnvs.json']) const envsFile = fs.readFileSync(pathProd, { encoding: 'utf8' }) const envs = JSON.parse(envsFile) - console.log('Read extra envs:', envs) + logger.info('Read extra envs:', envs) process.env.TEST_MODE = envs.TEST_MODE } catch (e) { - console.info(e.message) + logger.error(`Error occurred while loading main envs`, e) } } diff --git a/packages/desktop/src/main/logger.ts b/packages/desktop/src/main/logger.ts index 717ede2226..704f64e793 100644 --- a/packages/desktop/src/main/logger.ts +++ b/packages/desktop/src/main/logger.ts @@ -1,3 +1,3 @@ -import logger from '@quiet/logger' +import { createQuietLogger } from '@quiet/logger' -export default logger('desktop:main') +export const createLogger = createQuietLogger('desktop:main') diff --git a/packages/desktop/src/main/main.ts b/packages/desktop/src/main/main.ts index 7d30a6b149..340867b7d8 100644 --- a/packages/desktop/src/main/main.ts +++ b/packages/desktop/src/main/main.ts @@ -8,7 +8,7 @@ import url from 'url' import { getPorts, ApplicationPorts, closeHangingBackendProcess } from './backendHelpers' import { setEngine, CryptoEngine } from 'pkijs' import { Crypto } from '@peculiar/webcrypto' -import logger from './logger' +import { createLogger } from './logger' import { fork, ChildProcess } from 'child_process' import { DESKTOP_DATA_DIR, DESKTOP_DEV_DATA_DIR, getFilesData } from '@quiet/common' import { updateDesktopFile, processInvitationCode } from './invitation' @@ -18,7 +18,7 @@ const ElectronStore = require('electron-store') const remote = require('@electron/remote/main') remote.initialize() -const log = logger('main') +const logger = createLogger('main') let resetting = false @@ -58,18 +58,18 @@ ElectronStore.initRenderer() const gotTheLock = app.requestSingleInstanceLock() if (!gotTheLock) { - console.log('This is second instance. Quitting') + logger.info('This is second instance. Quitting') app.quit() app.exit() } else { try { updateDesktopFile(isDev) } catch (e) { - console.error(`Couldn't update desktop file: ${e.message}`) + logger.error(`Couldn't update desktop file`, e) } app.on('second-instance', (_event, commandLine) => { - log('Event: app.second-instance', commandLine) + logger.info('Event: app.second-instance', commandLine) if (mainWindow) { if (mainWindow.isMinimized()) mainWindow.restore() mainWindow.focus() @@ -78,14 +78,14 @@ if (!gotTheLock) { }) } -console.log('setAsDefaultProtocolClient', app.setAsDefaultProtocolClient('quiet')) +logger.info('setAsDefaultProtocolClient', app.setAsDefaultProtocolClient('quiet')) interface IWindowSize { width: number height: number } -console.log('electron main') +logger.info('electron main') const windowSize: IWindowSize = { width: 800, @@ -144,7 +144,7 @@ export const applyDevTools = async () => { app.on('open-url', (event, url) => { // MacOS only - log('Event app.open-url', url) + logger.info('Event app.open-url', url) invitationUrl = url // If user opens invitation link with closed app open-url fires too early - before mainWindow is initialized event.preventDefault() if (mainWindow) { @@ -214,7 +214,7 @@ export const createWindow = async () => { /* eslint-enable */ // Emitted when the window is closed. mainWindow.on('closed', () => { - log('Event mainWindow.closed') + logger.info('Event mainWindow.closed') mainWindow = null }) mainWindow.on('resize', () => { @@ -246,7 +246,7 @@ export const createWindow = async () => { if (!mainWindow || currentFactor <= 0.25) return mainWindow.webContents.zoomFactor = currentFactor - 0.2 }) - log('Created mainWindow') + logger.info('Created mainWindow') } const isNetworkError = (errorObject: { message: string }) => { @@ -265,30 +265,30 @@ export const checkForUpdate = async (win: BrowserWindow) => { await autoUpdater.checkForUpdates() } catch (error) { if (isNetworkError(error)) { - log.error('Network Error') + logger.error('Network Error') } else { - log.error('Unknown Error') - log.error(error == null ? 'unknown' : (error.stack || error).toString()) + logger.error('Unknown Error') + logger.error(error == null ? 'unknown' : (error.stack || error).toString()) } } autoUpdater.on('checking-for-update', () => { - log('updater: checking-for-update') + logger.info('updater: checking-for-update') }) autoUpdater.on('error', error => { - log('updater: error:', error) + logger.info('updater: error:', error) }) autoUpdater.on('update-not-available', () => { - log('updater: update-not-available') + logger.info('updater: update-not-available') }) autoUpdater.on('update-available', info => { - log('updater: update-available:', info) + logger.info('updater: update-available:', info) }) autoUpdater.on('update-downloaded', () => { - log('updater: update-downloaded') + logger.info('updater: update-downloaded') win.webContents.send('newUpdateAvailable') }) autoUpdater.on('before-quit-for-update', () => { - log('updater: before-quit-for-update') + logger.info('updater: before-quit-for-update') }) } @@ -308,13 +308,13 @@ const closeBackendProcess = () => { */ const forceClose = setTimeout(() => { const killed = backendProcess?.kill() - log(`Backend killed: ${killed}, Quitting.`) + logger.warn(`Backend killed: ${killed}, Quitting.`) app.quit() }, 2000) backendProcess.send('close') backendProcess.on('message', message => { if (message === 'closed-services') { - log('Closing the app') + logger.info('Closing the app') clearTimeout(forceClose) app.quit() } @@ -325,7 +325,7 @@ const closeBackendProcess = () => { } app.on('ready', async () => { - log('Event: app.ready') + logger.info('Event: app.ready') Menu.setApplicationMenu(null) await applyDevTools() @@ -375,14 +375,14 @@ app.on('ready', async () => { try { closeHangingBackendProcess(path.normalize(path.join('backend-bundle', 'bundle.cjs')), path.normalize(appDataPath)) } catch (e) { - console.error('Error occurred while trying to close hanging backend process', e.message) + logger.error('Error occurred while trying to close hanging backend process', e) } backendProcess = fork(backendBundlePath, forkArgvs) - log('Forked backend, PID:', backendProcess.pid) + logger.info('Forked backend, PID:', backendProcess.pid) backendProcess.on('error', e => { - log.error('Backend process returned error', e) + logger.error('Backend process returned error', e) throw Error(e.message) }) @@ -397,30 +397,30 @@ app.on('ready', async () => { } mainWindow.webContents.on('did-fail-load', () => { - log.error('failed loading webcontents') + logger.error('failed loading webcontents') }) mainWindow.once('close', e => { if (resetting) return e.preventDefault() - log('Closing main window') + logger.info('Closing main window') mainWindow?.webContents.send('force-save-state') }) splash?.once('close', e => { e.preventDefault() - log('Closing splash window') + logger.info('Closing splash window') mainWindow?.webContents.send('force-save-state') closeBackendProcess() }) ipcMain.on('state-saved', e => { mainWindow?.close() - log('Saved state, closed window') + logger.info('Saved state, closed window') }) ipcMain.on('clear-community', () => { - log('ipcMain: clear-community') + logger.info('ipcMain: clear-community') resetting = true backendProcess?.on('message', msg => { if (msg === 'leftCommunity') { @@ -431,13 +431,13 @@ app.on('ready', async () => { }) ipcMain.on('restart-app', () => { - log('ipcMain: restart-app') + logger.info('ipcMain: restart-app') app.relaunch() closeBackendProcess() }) ipcMain.on('writeTempFile', (event, arg) => { - log('ipcMain: writeTempFile') + logger.info('ipcMain: writeTempFile') const temporaryFilesDirectory = path.join(appDataPath, 'temporaryFiles') fs.mkdirSync(temporaryFilesDirectory, { recursive: true }) const id = `${Date.now()}_${Math.random().toString(36).substring(0, 20)}` @@ -454,10 +454,10 @@ app.on('ready', async () => { }) ipcMain.on('openUploadFileDialog', async e => { - log('ipcMain: openUploadFileDialog') + logger.info('ipcMain: openUploadFileDialog') let filesDialogResult: Electron.OpenDialogReturnValue if (!mainWindow) { - console.error('openUploadFileDialog - no mainWindow') + logger.error('openUploadFileDialog - no mainWindow') return } try { @@ -484,7 +484,7 @@ app.on('ready', async () => { }) mainWindow.webContents.once('did-finish-load', async () => { - log('Event: mainWindow did-finish-load') + logger.info('Event: mainWindow did-finish-load') if (!isBrowserWindow(mainWindow)) { throw new Error(`mainWindow is on unexpected type ${mainWindow}`) } @@ -492,7 +492,7 @@ app.on('ready', async () => { try { processInvitationCode(mainWindow, invitationUrl) } catch (e) { - console.warn(e.message) + logger.error('Error while processing invitation code from url', e) } finally { invitationUrl = null } @@ -501,7 +501,7 @@ app.on('ready', async () => { try { processInvitationCode(mainWindow, process.argv) } catch (e) { - console.warn(e.message) + logger.error('Error while processing invitation code from arguments') } } @@ -515,19 +515,19 @@ app.on('ready', async () => { }) ipcMain.on('proceed-update', () => { - log('ipcMain: proceed-update') + logger.info('ipcMain: proceed-update') autoUpdater.quitAndInstall() }) }) app.on('browser-window-created', (_, window) => { - log('Event: app.browser-window-created', window.getTitle()) + logger.info('Event: app.browser-window-created', window.getTitle()) remote.enable(window.webContents) }) // Quit when all windows are closed. app.on('window-all-closed', async () => { - log('Event: app.window-all-closed') + logger.info('Event: app.window-all-closed') closeBackendProcess() // On macOS it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q @@ -535,7 +535,7 @@ app.on('window-all-closed', async () => { }) app.on('activate', async () => { - log('Event: app.activate') + logger.info('Event: app.activate') // On macOS it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (mainWindow === null) { diff --git a/packages/desktop/src/renderer/components/ChangeUsername/ChangeUsername.component.tsx b/packages/desktop/src/renderer/components/ChangeUsername/ChangeUsername.component.tsx index ff8cd8a01d..bf4e998f04 100644 --- a/packages/desktop/src/renderer/components/ChangeUsername/ChangeUsername.component.tsx +++ b/packages/desktop/src/renderer/components/ChangeUsername/ChangeUsername.component.tsx @@ -17,6 +17,10 @@ import { userNameField } from '../../forms/fields/createUserFields' import { parseName } from '@quiet/common' +import { createLogger } from '../../logger' + +const logger = createLogger('changeUsername:component') + const PREFIX = 'ChangeUsername-' const classes = { @@ -174,7 +178,7 @@ export const ChangeUsername: React.FC = ({ const onSubmit = useCallback( (values: ChangeUserNameValues) => { if (errors.userName) { - console.error('Cannot submit form with errors') + logger.error('Cannot submit form with errors') return } diff --git a/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.stories.tsx b/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.stories.tsx index 622150610e..d186cd69c3 100644 --- a/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.stories.tsx +++ b/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.stories.tsx @@ -3,6 +3,9 @@ import { ComponentStory, ComponentMeta } from '@storybook/react' import { withTheme } from '../../../storybook/decorators' import CreateChannelComponent, { CreateChannelProps } from './CreateChannelComponent' +import { createLogger } from '../../../logger' + +const logger = createLogger('createChannel:stories') const Template: ComponentStory = args => { return @@ -13,7 +16,7 @@ export const Component = Template.bind({}) const args: CreateChannelProps = { open: true, createChannel: function (name: string): void { - console.log('creating channel: ', name) + logger.info('creating channel: ', name) }, handleClose: function (): void {}, clearErrorsDispatch: function (): void {}, diff --git a/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.test.tsx b/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.test.tsx index 59a36aa431..02f457fb6d 100644 --- a/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.test.tsx +++ b/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.test.tsx @@ -17,6 +17,10 @@ import { modalsActions } from '../../../sagas/modals/modals.slice' import { getFactory, identity, publicChannels } from '@quiet/state-manager' +import { createLogger } from '../../../logger' + +const logger = createLogger('createChannel:test') + describe('Add new channel', () => { let socket: MockedSocket @@ -50,7 +54,7 @@ describe('Add new channel', () => { async () => await waitFor(() => { user.click(screen.getByText('Create Channel')).catch(e => { - console.error(e) + logger.error(e) }) }) ) diff --git a/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.tsx b/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.tsx index 3d72eb91d1..0df900ff9f 100644 --- a/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.tsx +++ b/packages/desktop/src/renderer/components/Channel/CreateChannel/CreateChannel.tsx @@ -8,6 +8,9 @@ import { useModal } from '../../../containers/hooks' import { ModalName } from '../../../sagas/modals/modals.types' import { flushSync } from 'react-dom' import { generateChannelId } from '@quiet/common' +import { createLogger } from '../../../logger' + +const logger = createLogger('createChannel') export const CreateChannel = () => { const dispatch = useDispatch() @@ -46,7 +49,7 @@ export const CreateChannel = () => { // Clear errors clearErrors() if (!user) { - console.error('No identity found') + logger.error('No identity found') dispatch( errors.actions.addError({ type: SocketActionTypes.CREATE_CHANNEL, diff --git a/packages/desktop/src/renderer/components/Channel/DeleteChannel/DeleteChannel.stories.tsx b/packages/desktop/src/renderer/components/Channel/DeleteChannel/DeleteChannel.stories.tsx index bd498ae0d9..ad7c7f7421 100644 --- a/packages/desktop/src/renderer/components/Channel/DeleteChannel/DeleteChannel.stories.tsx +++ b/packages/desktop/src/renderer/components/Channel/DeleteChannel/DeleteChannel.stories.tsx @@ -6,6 +6,10 @@ import { useModal } from '../../../containers/hooks' import DeleteChannelComponent, { DeleteChannelProps } from './DeleteChannelComponent' +import { createLogger } from '../../../logger' + +const logger = createLogger('deleteChannel:stories') + const Template: ComponentStory = args => { return } @@ -15,7 +19,7 @@ export const Component = Template.bind({}) const args: ReturnType & DeleteChannelProps = { channelName: 'general', deleteChannel: () => { - console.log('deleting channel') + logger.info('deleting channel') }, open: true, // @ts-expect-error diff --git a/packages/desktop/src/renderer/components/Channel/DropZone/DropZoneComponent.tsx b/packages/desktop/src/renderer/components/Channel/DropZone/DropZoneComponent.tsx index 0773af35d9..e906bf3563 100644 --- a/packages/desktop/src/renderer/components/Channel/DropZone/DropZoneComponent.tsx +++ b/packages/desktop/src/renderer/components/Channel/DropZone/DropZoneComponent.tsx @@ -7,6 +7,9 @@ import Icon from '../../ui/Icon/Icon' import dropFiles from '../../../static/images/dropFiles.svg' import { DropTargetMonitor, useDrop } from 'react-dnd' import { NativeTypes } from 'react-dnd-html5-backend' +import { createLogger } from '../../../logger' + +const logger = createLogger('dropZone:component') const StyledDropZoneComponent = styled(Grid)(() => ({ position: 'relative', @@ -55,7 +58,7 @@ export const DropZoneComponent: React.FC = ({ children, if (fs.statSync(item.files[0].path).isDirectory()) return } catch (e) { // See: https://github.com/react-dnd/react-dnd/issues/3458 - console.error('drop error: ', e.message) + logger.error('drop error: ', e) return } handleFileDrop(item) @@ -67,7 +70,7 @@ export const DropZoneComponent: React.FC = ({ children, collect: (monitor: DropTargetMonitor) => { const item: any = monitor.getItem() if (item) { - console.log('collect', item.files, item.items) + logger.info('collect', item.files, item.items) } return { diff --git a/packages/desktop/src/renderer/components/Channel/File/FileComponent/FileComponent.stories.tsx b/packages/desktop/src/renderer/components/Channel/File/FileComponent/FileComponent.stories.tsx index 0c33e712ab..b33d50a2a6 100644 --- a/packages/desktop/src/renderer/components/Channel/File/FileComponent/FileComponent.stories.tsx +++ b/packages/desktop/src/renderer/components/Channel/File/FileComponent/FileComponent.stories.tsx @@ -3,6 +3,9 @@ import { ComponentStory, ComponentMeta } from '@storybook/react' import FileComponent, { FileComponentProps } from './FileComponent' import { withTheme } from '../../../../storybook/decorators' import { DownloadState } from '@quiet/types' +import { createLogger } from '../../../../logger' + +const logger = createLogger('fileComponent:stories') const Template: ComponentStory = args => { return ( @@ -97,13 +100,13 @@ Queued.args = { }, }, cancelDownload: () => { - console.log('cancel download') + logger.info('cancel download') }, } Ready.args = { ...args, downloadFile: () => { - console.log('download file') + logger.info('download file') }, } Downloading.args = { @@ -119,7 +122,7 @@ Downloading.args = { }, }, cancelDownload: () => { - console.log('cancel download') + logger.info('cancel download') }, } Canceling.args = { @@ -151,7 +154,7 @@ Completed.args = { }, }, openContainingFolder: () => { - console.log('show in folder') + logger.info('show in folder') }, } Malicious.args = { diff --git a/packages/desktop/src/renderer/components/ContextMenu/ContextMenu.stories.tsx b/packages/desktop/src/renderer/components/ContextMenu/ContextMenu.stories.tsx index cb75dfd915..eb9c00278d 100644 --- a/packages/desktop/src/renderer/components/ContextMenu/ContextMenu.stories.tsx +++ b/packages/desktop/src/renderer/components/ContextMenu/ContextMenu.stories.tsx @@ -3,6 +3,9 @@ import { ComponentStory, ComponentMeta } from '@storybook/react' import { withTheme } from '../../storybook/decorators' import { ContextMenu, ContextMenuItemList } from './ContextMenu.component' import { ContextMenuItemProps, ContextMenuProps } from './ContextMenu.types' +import { createLogger } from '../../logger' + +const logger = createLogger('contextMenu:stories') const Template: ComponentStory = args => { return @@ -14,7 +17,7 @@ const channel_items: ContextMenuItemProps[] = [ { title: 'Delete', action: () => { - console.log('clicked on delete channel') + logger.info('clicked on delete channel') }, }, ] @@ -24,7 +27,7 @@ const args: ContextMenuProps = { children: , visible: true, handleClose: () => { - console.log('closing menu') + logger.info('closing menu') }, } diff --git a/packages/desktop/src/renderer/components/ContextMenu/menus/UserProfileContextMenu.container.tsx b/packages/desktop/src/renderer/components/ContextMenu/menus/UserProfileContextMenu.container.tsx index 31ab730701..2c4d3626e4 100644 --- a/packages/desktop/src/renderer/components/ContextMenu/menus/UserProfileContextMenu.container.tsx +++ b/packages/desktop/src/renderer/components/ContextMenu/menus/UserProfileContextMenu.container.tsx @@ -13,6 +13,9 @@ import { ContextMenuItemProps, ContextMenuProps } from '../ContextMenu.types' import { MenuName } from '../../../../const/MenuNames.enum' import { ModalName } from '../../../sagas/modals/modals.types' import Jdenticon from '../../Jdenticon/Jdenticon' +import { createLogger } from '../../../logger' + +const logger = createLogger('userProfileContextMenu:container') const PREFIX = 'UserProfileContextMenu' @@ -345,21 +348,21 @@ export const UserProfileMenuEditView: FC = ({ ;({ width, height } = await getImageSize(photo)) } catch (err) { const msg = 'Failed to get image size' - console.error(msg) + logger.error(msg) setError(msg) return } if (width === 0 || height === 0) { const msg = `Image has invalid dimensions: width: ${width}, height: ${height}` - console.error(msg) + logger.error(msg) setError(msg) return } if (width > 200 || height > 200) { const msg = 'Image dimensions must be less than or equal to 200px by 200px' - console.error(msg) + logger.error(msg) setError(msg) return } @@ -367,7 +370,7 @@ export const UserProfileMenuEditView: FC = ({ // 200 KB = 204800 B limit if (photo.size > 204800) { const msg = 'Image size must be less than or equal to 200KB' - console.error(msg) + logger.error(msg) setError(msg) return } diff --git a/packages/desktop/src/renderer/components/CreateJoinCommunity/CreateCommunity/CreateCommunity.stories.tsx b/packages/desktop/src/renderer/components/CreateJoinCommunity/CreateCommunity/CreateCommunity.stories.tsx index 01188395c6..b91a8fb877 100644 --- a/packages/desktop/src/renderer/components/CreateJoinCommunity/CreateCommunity/CreateCommunity.stories.tsx +++ b/packages/desktop/src/renderer/components/CreateJoinCommunity/CreateCommunity/CreateCommunity.stories.tsx @@ -6,6 +6,10 @@ import { withTheme } from '../../../storybook/decorators' import PerformCommunityActionComponent, { PerformCommunityActionProps } from '../PerformCommunityActionComponent' import { CommunityOwnership } from '@quiet/types' +import { createLogger } from '../../../logger' + +const logger = createLogger('createCommunity:stories') + const Template: ComponentStory = args => { return } @@ -16,10 +20,10 @@ const args: PerformCommunityActionProps = { open: true, communityOwnership: CommunityOwnership.Owner, handleCommunityAction: function (value: string): void { - console.log('Creating community: ', value) + logger.info('Creating community: ', value) }, handleRedirection: function (): void { - console.log('Redirected to join community') + logger.info('Redirected to join community') }, handleClose: function (): void {}, isCloseDisabled: false, diff --git a/packages/desktop/src/renderer/components/CreateJoinCommunity/JoinCommunity/JoinCommunity.stories.tsx b/packages/desktop/src/renderer/components/CreateJoinCommunity/JoinCommunity/JoinCommunity.stories.tsx index 070d6e674f..8e291e3ebe 100644 --- a/packages/desktop/src/renderer/components/CreateJoinCommunity/JoinCommunity/JoinCommunity.stories.tsx +++ b/packages/desktop/src/renderer/components/CreateJoinCommunity/JoinCommunity/JoinCommunity.stories.tsx @@ -6,6 +6,10 @@ import { withTheme } from '../../../storybook/decorators' import PerformCommunityActionComponent, { PerformCommunityActionProps } from '../PerformCommunityActionComponent' import { CommunityOwnership } from '@quiet/types' +import { createLogger } from '../../../logger' + +const logger = createLogger('joinCommunity:stories') + const Template: ComponentStory = args => { return } @@ -17,10 +21,10 @@ const args: PerformCommunityActionProps = { open: true, communityOwnership: CommunityOwnership.User, handleCommunityAction: function (value: string): void { - console.log('Joining community: ', value) + logger.info('Joining community: ', value) }, handleRedirection: function (): void { - console.log('Redirected to create community') + logger.info('Redirected to create community') }, handleClose: function (): void {}, isCloseDisabled: false, diff --git a/packages/desktop/src/renderer/components/CreateJoinCommunity/PerformCommunityActionComponent.tsx b/packages/desktop/src/renderer/components/CreateJoinCommunity/PerformCommunityActionComponent.tsx index 116fc32c10..7f81b0e651 100644 --- a/packages/desktop/src/renderer/components/CreateJoinCommunity/PerformCommunityActionComponent.tsx +++ b/packages/desktop/src/renderer/components/CreateJoinCommunity/PerformCommunityActionComponent.tsx @@ -22,6 +22,9 @@ import VisibilityOff from '@mui/icons-material/VisibilityOff' import Visibility from '@mui/icons-material/Visibility' import { parseName } from '@quiet/common' import { getInvitationCodes } from '@quiet/state-manager' +import { createLogger } from '../../logger' + +const logger = createLogger('performCommunityAction:component') const PREFIX = 'PerformCommunityActionComponent' @@ -192,7 +195,7 @@ export const PerformCommunityActionComponent: React.FC = args => { return } @@ -15,7 +19,7 @@ const args: CreateUsernameComponentProps = { open: true, handleClose: function (): void {}, registerUsername: function (nickname: string): void { - console.log('Registering username: ', nickname) + logger.info('Registering username: ', nickname) }, } diff --git a/packages/desktop/src/renderer/components/CreateUsername/CreateUsernameComponent.tsx b/packages/desktop/src/renderer/components/CreateUsername/CreateUsernameComponent.tsx index 9f20950ac7..32382e6377 100644 --- a/packages/desktop/src/renderer/components/CreateUsername/CreateUsernameComponent.tsx +++ b/packages/desktop/src/renderer/components/CreateUsername/CreateUsernameComponent.tsx @@ -19,6 +19,10 @@ import { userNameField } from '../../forms/fields/createUserFields' import { parseName } from '@quiet/common' +import { createLogger } from '../../logger' + +const logger = createLogger('createUsername:component') + const PREFIX = 'CreateUsernameComponent-' const classes = { @@ -174,7 +178,7 @@ export const CreateUsernameComponent: React.FC = ( const onSubmit = useCallback( (values: CreateUserValues) => { if (errors.userName) { - console.error('Cannot submit form with errors') + logger.error('Cannot submit form with errors') return } diff --git a/packages/desktop/src/renderer/components/LoadingPanel/LoadingPanel.stories.tsx b/packages/desktop/src/renderer/components/LoadingPanel/LoadingPanel.stories.tsx index 1107935fab..94e8186cab 100644 --- a/packages/desktop/src/renderer/components/LoadingPanel/LoadingPanel.stories.tsx +++ b/packages/desktop/src/renderer/components/LoadingPanel/LoadingPanel.stories.tsx @@ -4,6 +4,9 @@ import { withTheme } from '../../storybook/decorators' import JoiningPanelComponent, { JoiningPanelComponentProps } from './JoiningPanelComponent' import StartingPanelComponent, { StartingPanelComponentProps } from './StartingPanelComponent' import { ConnectionProcessInfo } from '@quiet/types' +import { createLogger } from '../../logger' + +const logger = createLogger('loadingPanel:stories') const JoiningPanelTemplate: ComponentStory = args => { return @@ -18,7 +21,7 @@ export const StartingPanel = StartingPanelTemplate.bind({}) const JoiningPanelArgs: JoiningPanelComponentProps = { open: true, handleClose: function (): void {}, - openUrl: () => console.log('OpenURL'), + openUrl: () => logger.info('OpenURL'), connectionInfo: { number: 10, text: ConnectionProcessInfo.BACKEND_MODULES }, isOwner: false, } diff --git a/packages/desktop/src/renderer/components/MathMessage/MathMessageComponent.tsx b/packages/desktop/src/renderer/components/MathMessage/MathMessageComponent.tsx index 6e9fc3f3dc..d8142472ea 100644 --- a/packages/desktop/src/renderer/components/MathMessage/MathMessageComponent.tsx +++ b/packages/desktop/src/renderer/components/MathMessage/MathMessageComponent.tsx @@ -5,6 +5,9 @@ import { convertPromise, SourceLang } from './customMathJax' import { styled } from '@mui/material/styles' import theme from '../../theme' import classNames from 'classnames' +import { createLogger } from '../../logger' + +const logger = createLogger('mathMessage:component') const PREFIX = 'MathMessage' @@ -71,7 +74,7 @@ const MathComponent: React.FC = ({ } }, [node, message, display]) - if (error) console.error(`Error converting tex '${message}'`, error) + if (error) logger.error(`Error converting tex '${message}'`, error) if (isMath && !error) { const props = { @@ -116,7 +119,7 @@ export const MathMessageComponent: React.FC } diff --git a/packages/desktop/src/renderer/components/MathMessage/customMathJax.ts b/packages/desktop/src/renderer/components/MathMessage/customMathJax.ts index 165e901796..7ad2651381 100644 --- a/packages/desktop/src/renderer/components/MathMessage/customMathJax.ts +++ b/packages/desktop/src/renderer/components/MathMessage/customMathJax.ts @@ -6,6 +6,9 @@ import { SVG } from 'mathjax-full/js/output/svg' import { browserAdaptor } from 'mathjax-full/js/adaptors/browserAdaptor' import { RegisterHTMLHandler } from 'mathjax-full/js/handlers/html' import { STATE } from 'mathjax-full/js/core/MathItem' +import { createLogger } from '../../logger' + +const logger = createLogger('customMathJax') export const enum SourceLang { MathML = 'MathML', @@ -125,7 +128,7 @@ export function convertPromise( if (!(err instanceof CancelationException)) { throw err } else { - console.log('cancelled render!') + logger.info('cancelled render!') return null } }) diff --git a/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.stories.tsx b/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.stories.tsx index 1654d78466..b2cebb3891 100644 --- a/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.stories.tsx +++ b/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.stories.tsx @@ -5,6 +5,10 @@ import { withTheme } from '../../../storybook/decorators' import TextWithLink, { TextWithLinkProps } from './TextWithLink' +import { createLogger } from '../../../logger' + +const logger = createLogger('textWithLink:stories') + const Template: ComponentStory = args => { return } @@ -18,7 +22,7 @@ const args: TextWithLinkProps = { tag: 'a', label: 'linked', action: () => { - console.log('link clicked') + logger.info('link clicked') }, }, ], diff --git a/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.test.tsx b/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.test.tsx index 6ac48c706c..6a5fbabcbf 100644 --- a/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.test.tsx +++ b/packages/desktop/src/renderer/components/ui/TextWithLink/TextWithLink.test.tsx @@ -3,6 +3,10 @@ import React from 'react' import { renderComponent } from '../../../testUtils/renderComponent' import { TextWithLink } from './TextWithLink' +import { createLogger } from '../../../logger' + +const logger = createLogger('textWithLink:test') + describe('TextWithLink', () => { it('renders component', () => { const result = renderComponent( @@ -13,7 +17,7 @@ describe('TextWithLink', () => { tag: 'simple', label: 'simple', action: () => { - console.log('linked clicked') + logger.info('linked clicked') }, }, ]} diff --git a/packages/desktop/src/renderer/components/widgets/WarningModal/WarningModal.stories.tsx b/packages/desktop/src/renderer/components/widgets/WarningModal/WarningModal.stories.tsx index ec618f4f40..da8d22f265 100644 --- a/packages/desktop/src/renderer/components/widgets/WarningModal/WarningModal.stories.tsx +++ b/packages/desktop/src/renderer/components/widgets/WarningModal/WarningModal.stories.tsx @@ -4,6 +4,10 @@ import { ComponentMeta, ComponentStory } from '@storybook/react' import { withTheme } from '../../../storybook/decorators' import WarningModalComponent, { WarningModalComponentProps } from './WarningModal' +import { createLogger } from '../../../logger' + +const logger = createLogger('warningModal:stories') + const Template: ComponentStory = args => { return } @@ -13,7 +17,7 @@ export const Component = Template.bind({}) const args: WarningModalComponentProps = { open: true, handleClose: function (): void { - console.log('Closed modal') + logger.info('Closed modal') }, title: 'Warning title', subtitle: 'Warning description', diff --git a/packages/desktop/src/renderer/components/widgets/channels/BasicMessage.test.tsx b/packages/desktop/src/renderer/components/widgets/channels/BasicMessage.test.tsx index 2b9beeff3d..6f7e49aa9d 100644 --- a/packages/desktop/src/renderer/components/widgets/channels/BasicMessage.test.tsx +++ b/packages/desktop/src/renderer/components/widgets/channels/BasicMessage.test.tsx @@ -11,7 +11,13 @@ import store from '../../../store' describe('BasicMessage', () => { beforeEach(() => { jest.clearAllMocks() - jest.spyOn(DateTime, 'utc').mockImplementationOnce(() => DateTime.utc(2019, 3, 7, 13, 3, 48)) + jest.spyOn(DateTime, 'utc').mockImplementationOnce(() => { + const dt = DateTime.utc(2019, 3, 7, 13, 3, 48) + if (!dt.isValid) { + throw new Error('This is just here to satisfy the DateTime requirement') + } + return dt + }) }) it('renders component', async () => { diff --git a/packages/desktop/src/renderer/components/widgets/channels/ChannelInput/ChannelInput.stories.tsx b/packages/desktop/src/renderer/components/widgets/channels/ChannelInput/ChannelInput.stories.tsx index 041dec94fb..f82285e6d7 100644 --- a/packages/desktop/src/renderer/components/widgets/channels/ChannelInput/ChannelInput.stories.tsx +++ b/packages/desktop/src/renderer/components/widgets/channels/ChannelInput/ChannelInput.stories.tsx @@ -6,6 +6,10 @@ import { INPUT_STATE } from './InputState.enum' import { ChannelInputComponent, ChannelInputProps } from './ChannelInput' import { withTheme } from '../../../../storybook/decorators' +import { createLogger } from '../../../../logger' + +const logger = createLogger('channelInput:stories') + const Template: ComponentStory = args => { return (
@@ -23,7 +27,7 @@ const args: ChannelInputProps = { inputPlaceholder: '#general as @alice', onChange: function (_arg: string): void {}, onKeyPress: function (input: string): void { - console.log('send message', input) + logger.info('send message', input) }, infoClass: '', setInfoClass: function (_arg: string): void {}, @@ -37,7 +41,7 @@ const argsDisabledInput: ChannelInputProps = { inputPlaceholder: '#general as @alice', onChange: function (_arg: string): void {}, onKeyPress: function (input: string): void { - console.log('send message', input) + logger.info('send message', input) }, infoClass: '', setInfoClass: function (_arg: string): void {}, @@ -248,7 +252,7 @@ const argsLongMessage: ChannelInputProps = { initialMessage: initialMessage, onChange: function (_arg: string): void {}, onKeyPress: function (input: string): void { - console.log('send message', input) + logger.info('send message', input) }, infoClass: '', setInfoClass: function (_arg: string): void {}, diff --git a/packages/desktop/src/renderer/components/widgets/channels/ChannelMessages.test.tsx b/packages/desktop/src/renderer/components/widgets/channels/ChannelMessages.test.tsx index 24b937b94d..16ba5158f9 100644 --- a/packages/desktop/src/renderer/components/widgets/channels/ChannelMessages.test.tsx +++ b/packages/desktop/src/renderer/components/widgets/channels/ChannelMessages.test.tsx @@ -25,7 +25,13 @@ describe('ChannelMessages', () => { pubKey: 'string', } - jest.spyOn(DateTime, 'utc').mockImplementationOnce(() => DateTime.utc(2019, 3, 7, 13, 3, 48)) + jest.spyOn(DateTime, 'utc').mockImplementationOnce(() => { + const dt = DateTime.utc(2019, 3, 7, 13, 3, 48) + if (!dt.isValid) { + throw new Error('This is just here to satisfy the DateTime requirement') + } + return dt + }) const messages = { Today: [[message]], diff --git a/packages/desktop/src/renderer/components/widgets/sentryWarning/SentryWarning.stories.tsx b/packages/desktop/src/renderer/components/widgets/sentryWarning/SentryWarning.stories.tsx index 06a9c55027..ce6a0a805b 100644 --- a/packages/desktop/src/renderer/components/widgets/sentryWarning/SentryWarning.stories.tsx +++ b/packages/desktop/src/renderer/components/widgets/sentryWarning/SentryWarning.stories.tsx @@ -5,6 +5,10 @@ import { withTheme } from '../../../storybook/decorators' import { SentryWarningComponent, SentryWarningProps } from './SentryWarningComponent' +import { createLogger } from '../../../logger' + +const logger = createLogger('sentryWarning:stories') + const Template: ComponentStory = args => { return } @@ -14,7 +18,7 @@ export const Component = Template.bind({}) const args: SentryWarningProps = { open: true, handleClose: function (): void { - console.log('Closed modal') + logger.info('Closed modal') }, } diff --git a/packages/desktop/src/renderer/components/widgets/update/UpdateModalComponent.stories.tsx b/packages/desktop/src/renderer/components/widgets/update/UpdateModalComponent.stories.tsx index d8c17ce5b9..89123538ee 100644 --- a/packages/desktop/src/renderer/components/widgets/update/UpdateModalComponent.stories.tsx +++ b/packages/desktop/src/renderer/components/widgets/update/UpdateModalComponent.stories.tsx @@ -8,6 +8,10 @@ import theme from '../../../theme' import Button from '@mui/material/Button' +import { createLogger } from '../../../logger' + +const logger = createLogger('updateModal:component:stories') + const Template: ComponentStory = args => { return } @@ -15,7 +19,7 @@ const Template: ComponentStory = args => { const args: UpdateModalProps = { open: true, handleClose: function (): void { - console.log('modal closed') + logger.info('modal closed') }, buttons: [