From eeb8591407a5e8b1b1b51d30eb246a0005ff03b3 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 23 Jun 2023 13:41:38 +0300 Subject: [PATCH 01/11] Add window event manager --- src/window-event-manager/index.js | 93 +++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/window-event-manager/index.js diff --git a/src/window-event-manager/index.js b/src/window-event-manager/index.js new file mode 100644 index 00000000..f5f281de --- /dev/null +++ b/src/window-event-manager/index.js @@ -0,0 +1,93 @@ +'use strict' + +const wins = require('../windows') + +const WINDOW_EVENT_NAMES = { + CLOSED: 'closed' +} + +const windowMap = new Map() + +const addOnceProcEventHandler = (eventName, handler, window) => { + const _window = window ?? wins.mainWindow + + if ( + !_window || + !eventName || + typeof eventName !== 'string' || + typeof handler !== 'function' + ) { + return { + isAdded: false, + removeListener: () => {} + } + } + + const handlerSet = _setWinEventHandler(eventName, handler, window) + + const ctx = { + isAdded: true, + removeListener: () => handlerSet.delete(handler) + } + + return ctx +} + +const _setWinEventHandler = (eventName, handler, window) => { + const winEventHandlerMap = _getWinEventHandlerMap(window) + const foundHandlerSet = winEventHandlerMap.get(eventName)?.handlerSet + + if (foundHandlerSet instanceof Set) { + foundHandlerSet.add(handler) + + return foundHandlerSet + } + + const handlerSet = new Set([handler]) + const rootHandler = () => { + winEventHandlerMap.delete(eventName) + + for (const handler of handlerSet) { + try { + handlerSet.delete(handler) + + const res = handler() + + if (!(res instanceof Promise)) { + return + } + + res.then(() => {}, (err) => { console.error(err) }) + } catch (err) { + console.error(err) + } + } + } + + window.once(eventName, rootHandler) + winEventHandlerMap.set(eventName, { + rootHandler, + handlerSet + }) + + return handlerSet +} + +const _getWinEventHandlerMap = (window) => { + const foundWinEventHandlerMap = windowMap.get(window) + + if (foundWinEventHandlerMap instanceof Map) { + return foundWinEventHandlerMap + } + + const winEventHandlerMap = new Map() + windowMap.set(window, winEventHandlerMap) + + return winEventHandlerMap +} + +module.exports = { + WINDOW_EVENT_NAMES, + + addOnceProcEventHandler +} From 53c05261d689e5fa616a593a1f3b7c90cd455ba1 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 23 Jun 2023 13:43:06 +0300 Subject: [PATCH 02/11] Manage closed win event for auto-updater --- src/auto-updater/index.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/auto-updater/index.js b/src/auto-updater/index.js index 2020e42a..37ce5522 100644 --- a/src/auto-updater/index.js +++ b/src/auto-updater/index.js @@ -23,6 +23,10 @@ const { closeAlert } = require('../modal-dialog-src/utils') const parseEnvValToBool = require('../helpers/parse-env-val-to-bool') +const { + WINDOW_EVENT_NAMES, + addOnceProcEventHandler +} = require('../window-event-manager') const isAutoUpdateDisabled = parseEnvValToBool(process.env.IS_AUTO_UPDATE_DISABLED) @@ -90,9 +94,10 @@ const _fireToast = ( const alert = new Alert([fonts, style, script]) toast = alert - const _closeAlert = () => closeAlert(alert) - - win.once('closed', _closeAlert) + const eventHandlerCtx = addOnceProcEventHandler( + WINDOW_EVENT_NAMES.CLOSED, + () => closeAlert(alert) + ) const bwOptions = { frame: false, @@ -151,7 +156,7 @@ const _fireToast = ( alert.browserWindow.hide() }, didClose: () => { - win.removeListener('closed', _closeAlert) + eventHandlerCtx.removeListener() didClose(alert) } From 57a34ca1b43f5e341f60b8bcb80f45c02e39681a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 23 Jun 2023 14:00:22 +0300 Subject: [PATCH 03/11] Fix passing window obj --- src/window-event-manager/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window-event-manager/index.js b/src/window-event-manager/index.js index f5f281de..d3def58b 100644 --- a/src/window-event-manager/index.js +++ b/src/window-event-manager/index.js @@ -23,7 +23,7 @@ const addOnceProcEventHandler = (eventName, handler, window) => { } } - const handlerSet = _setWinEventHandler(eventName, handler, window) + const handlerSet = _setWinEventHandler(eventName, handler, _window) const ctx = { isAdded: true, From b43ad34a8af520b18e6282c79e4b297172c703a1 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 26 Jun 2023 13:05:26 +0300 Subject: [PATCH 04/11] Manage closed win event for sync frequency changer --- src/change-sync-frequency.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/change-sync-frequency.js b/src/change-sync-frequency.js index c29dbf12..1b6f81cd 100644 --- a/src/change-sync-frequency.js +++ b/src/change-sync-frequency.js @@ -26,6 +26,10 @@ const { getConfigsKeeperByName } = require('./configs-keeper') const getAlertCustomClassObj = require( './helpers/get-alert-custom-class-obj' ) +const { + WINDOW_EVENT_NAMES, + addOnceProcEventHandler +} = require('./window-event-manager') const _getSchedulerRule = (timeFormat, alertRes) => { if (timeFormat.value === 'days') { @@ -219,8 +223,16 @@ module.exports = () => { return async () => { const win = electron.BrowserWindow.getFocusedWindow() - win.once('closed', closeTimeFormatAlert) - win.once('closed', closeAlert) + const timeFormatAlertEventHandlerCtx = addOnceProcEventHandler( + WINDOW_EVENT_NAMES.CLOSED, + closeTimeFormatAlert, + win + ) + const alertEventHandlerCtx = addOnceProcEventHandler( + WINDOW_EVENT_NAMES.CLOSED, + closeAlert, + win + ) try { const savedSchedulerRule = await configsKeeper @@ -234,7 +246,7 @@ module.exports = () => { inputValue: timeData.timeFormat } ) - win.removeListener('closed', closeTimeFormatAlert) + timeFormatAlertEventHandlerCtx.removeListener() if (timeFormat.dismiss) { return @@ -244,7 +256,7 @@ module.exports = () => { alert, getAlertOpts(timeFormat, timeData) ) - win.removeListener('closed', closeAlert) + alertEventHandlerCtx.removeListener() if (alertRes.dismiss) { return From 1987d8aac96bffbf9fdee26d752d8cafc3d2534d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 26 Jun 2023 13:07:16 +0300 Subject: [PATCH 05/11] Manage closed win event for showing modal dialog --- src/error-manager/show-modal-dialog.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/error-manager/show-modal-dialog.js b/src/error-manager/show-modal-dialog.js index eba312c1..3fd09959 100644 --- a/src/error-manager/show-modal-dialog.js +++ b/src/error-manager/show-modal-dialog.js @@ -18,6 +18,10 @@ const isMainWinAvailable = require( const { closeAlert } = require('../modal-dialog-src/utils') +const { + WINDOW_EVENT_NAMES, + addOnceProcEventHandler +} = require('../window-event-manager') const mdStyle = fs.readFileSync(path.join( rootPath, 'node_modules', 'github-markdown-css/github-markdown.css' @@ -69,9 +73,11 @@ const _fireAlert = (params) => { const maxHeight = Math.floor(screenHeight * 0.90) const alert = new Alert([mdS, fonts, style, script]) - const _close = () => closeAlert(alert) - win.once('closed', _close) + const eventHandlerCtx = addOnceProcEventHandler( + WINDOW_EVENT_NAMES.CLOSED, + () => closeAlert(alert) + ) const bwOptions = { frame: false, @@ -138,7 +144,7 @@ const _fireAlert = (params) => { alert.browserWindow.hide() }, didClose: () => { - win.removeListener('closed', _close) + eventHandlerCtx.removeListener() } } From 55a4c01006b0cf52d56468533d7a60ed5d4eff69 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 26 Jun 2023 13:18:55 +0300 Subject: [PATCH 06/11] Manage closed win event for restoring db --- src/restore-db/index.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/restore-db/index.js b/src/restore-db/index.js index 1bb4b689..200e03fb 100644 --- a/src/restore-db/index.js +++ b/src/restore-db/index.js @@ -26,6 +26,10 @@ const { const { DbRestoringError } = require('../errors') +const { + WINDOW_EVENT_NAMES, + addOnceProcEventHandler +} = require('../window-event-manager') const fontsStyle = fs.readFileSync(path.join( rootPath, 'bfx-report-ui/build/fonts/roboto.css' @@ -79,9 +83,11 @@ const _fireAlert = (params) => { const maxHeight = Math.floor(screenHeight * 0.90) const alert = new Alert([fonts, style, script]) - const _close = () => closeAlert(alert) - win.once('closed', _close) + const eventHandlerCtx = addOnceProcEventHandler( + WINDOW_EVENT_NAMES.CLOSED, + () => closeAlert(alert) + ) const bwOptions = { resizable: true, @@ -154,7 +160,7 @@ const _fireAlert = (params) => { alert.browserWindow.hide() }, didClose: () => { - win.removeListener('closed', _close) + eventHandlerCtx.removeListener() } } From 566da941900eb16f8b637454061f1716eb65869c Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 26 Jun 2023 13:20:05 +0300 Subject: [PATCH 07/11] Manage closed win event for showing docs --- src/show-docs/index.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/show-docs/index.js b/src/show-docs/index.js index 158db758..b9072f49 100644 --- a/src/show-docs/index.js +++ b/src/show-docs/index.js @@ -23,6 +23,10 @@ const mdUserManual = fs.readFileSync( path.join(rootPath, 'docs/user-manual.md'), 'utf8' ) +const { + WINDOW_EVENT_NAMES, + addOnceProcEventHandler +} = require('../window-event-manager') const mdStyle = fs.readFileSync(path.join( rootPath, 'node_modules', 'github-markdown-css/github-markdown.css' @@ -75,9 +79,11 @@ const _fireAlert = (params) => { const maxHeight = Math.floor(screenHeight * 0.90) const alert = new Alert([mdS, fonts, style, script]) - const _close = () => closeAlert(alert) - win.once('closed', _close) + const eventHandlerCtx = addOnceProcEventHandler( + WINDOW_EVENT_NAMES.CLOSED, + () => closeAlert(alert) + ) const bwOptions = { frame: false, @@ -143,7 +149,7 @@ const _fireAlert = (params) => { alert.browserWindow.hide() }, didClose: () => { - win.removeListener('closed', _close) + eventHandlerCtx.removeListener() } } From 65811a4d3e26d3a526396d4781adb512dc82d08e Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 14 Jul 2023 11:34:15 +0300 Subject: [PATCH 08/11] Fix download progress showing for auto-update --- src/auto-updater/index.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/auto-updater/index.js b/src/auto-updater/index.js index 37ce5522..ec3473a9 100644 --- a/src/auto-updater/index.js +++ b/src/auto-updater/index.js @@ -57,13 +57,11 @@ const script = `` const sound = { freq: 'F2', type: 'triange', duration: 1.5 } const _sendProgress = (progress) => { - if ( - !toast || - !toast.browserWindow || - !Number.isFinite(progress) - ) return + if (!Number.isFinite(progress)) { + return + } - toast.browserWindow.webContents.send( + toast?.browserWindow?.webContents.send( 'progress', progress ) @@ -392,7 +390,7 @@ const _autoUpdaterFactory = () => { }) autoUpdater.on('download-progress', async (progressObj) => { try { - const { percent } = { ...progressObj } + const { percent } = progressObj ?? {} if (isProgressToastEnabled) { _sendProgress(percent) @@ -400,6 +398,8 @@ const _autoUpdaterFactory = () => { return } + isProgressToastEnabled = true + await _fireToast( { title: 'Downloading...', @@ -409,8 +409,6 @@ const _autoUpdaterFactory = () => { didOpen: (alert) => { _sendProgress(percent) alert.showLoading() - - isProgressToastEnabled = true }, didClose: () => { isProgressToastEnabled = false From e99f2e45abb614b30cdcf4591b9ad93f138c11fd Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 2 Aug 2023 10:17:22 +0300 Subject: [PATCH 09/11] Bump version up to v4.9.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e307971b..a429555f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bfx-report-electron", - "version": "4.9.1", + "version": "4.9.2", "repository": "https://github.com/bitfinexcom/bfx-report-electron", "description": "Reporting tool", "author": "bitfinex.com", From ff5c4abbb85c87d70d5f617acda8b8cd8ca08be1 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 2 Aug 2023 10:18:05 +0300 Subject: [PATCH 10/11] Add changelog for v4.9.2 --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23f38af8..754921a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.9.2] - 2023-08-02 + +### Changed + +- Removed the `Cumulative Weighted Price` column and corresponding logic from the `Weighted Averages` report according to the latest requirements. Added `Cost` and `Sale` columns to the `Weighted Averages` report. PRs: [bfx-report#319](https://github.com/bitfinexcom/bfx-report/pull/319), [bfx-reports-framework#302](https://github.com/bitfinexcom/bfx-reports-framework/pull/302), [bfx-report-ui#681](https://github.com/bitfinexcom/bfx-report-ui/pull/681) +- Improved sync time estimation flow as follows: in addition to existing emitting `WS` events when the next collection is syncing to not hold the previous time value (some collections can sync very long) adds an ability to emit the `progress` event every `1sec` with new values `spentTime` and `leftTime` for better UX (so that the user does not think that sync has stalled). PR: [bfx-reports-framework#303](https://github.com/bitfinexcom/bfx-reports-framework/pull/303) +- Changed `Rate Limits` for public endpoints: `trades` to 15 req/min, `candles` to 60 req/min. PR: [bfx-reports-framework#304](https://github.com/bitfinexcom/bfx-reports-framework/pull/304) + +### Fixed + +- Fixed issues with the incorrect synchronization estimation time conversion and representation. PR: [bfx-report-ui#680](https://github.com/bitfinexcom/bfx-report-ui/pull/680) +- Fixed handling bfx api `ERR_AUTH_API: ERR_INVALID_CREDENTIALS` error to prevent showing `500 Internal Server Error` and error modal dialog in the electron app. PR: [bfx-report#318](https://github.com/bitfinexcom/bfx-report/pull/318) +- Fixed the issue [#215](https://github.com/bitfinexcom/bfx-report-electron/issues/215) related to `MaxListenersExceededWarning` warning for the electron windows. PR: [bfx-report-electron#229](https://github.com/bitfinexcom/bfx-report-electron/pull/229) + ## [4.9.1] - 2023-07-12 ### Added From 7d702874d134384d79f11e6d370896481b12e97c Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 2 Aug 2023 12:16:45 +0300 Subject: [PATCH 11/11] Update sub-modules --- bfx-report-ui | 2 +- bfx-reports-framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bfx-report-ui b/bfx-report-ui index 90f33c4e..e0f01423 160000 --- a/bfx-report-ui +++ b/bfx-report-ui @@ -1 +1 @@ -Subproject commit 90f33c4e6d4c0bf78472fe199dbb51776d53a56a +Subproject commit e0f014235526f184494e83e783d4a9d8e79ec1fc diff --git a/bfx-reports-framework b/bfx-reports-framework index a4ac5578..805a612f 160000 --- a/bfx-reports-framework +++ b/bfx-reports-framework @@ -1 +1 @@ -Subproject commit a4ac55781988f046af36be6e6e5d6b1503c359d1 +Subproject commit 805a612fbc2f70c4cbe4c2875d6719ad41a8c4f8