From 991ede1e23620a2d37ccfd69b9d388d56151c61a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 28 May 2026 13:34:39 +0300 Subject: [PATCH 1/9] Fix cyclic unauth error when generating csv --- workers/loc.api/queue/processor.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/workers/loc.api/queue/processor.js b/workers/loc.api/queue/processor.js index 60866a31..a9241d01 100644 --- a/workers/loc.api/queue/processor.js +++ b/workers/loc.api/queue/processor.js @@ -21,10 +21,11 @@ const processReportFile = async (deps, args) => { const { data, filePath, - streamSet + streamSet, + isUnauth } = args - const write = data?.isUnauth + const write = isUnauth ? 'Your file could not be completed, please try again' : data @@ -37,7 +38,7 @@ const processReportFile = async (deps, args) => { jobData: data, pdfCustomTemplateName: data?.pdfCustomTemplateName, language: data?.args?.params.language, - isError: data?.isUnauth + isError: isUnauth }) streamSet.add(pdfStream) @@ -164,7 +165,8 @@ module.exports = ( { data, filePath, - streamSet + streamSet, + isUnauth } ) } @@ -190,12 +192,14 @@ module.exports = ( processorQueue.emit('error:unlink', job) } - job.done(err) - if (isAuthError(err)) { + job.done() processorQueue.emit('error:auth', job) + + return } + job.done(err) processorQueue.emit('error:base', err, job) } finally { for (const stream of streamSet) { From bfb4b198c76c1638b785a949ce013a0e2970a84d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 28 May 2026 13:57:51 +0300 Subject: [PATCH 2/9] Inject i18next service into processor --- workers/loc.api/di/app.deps.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workers/loc.api/di/app.deps.js b/workers/loc.api/di/app.deps.js index 699ebe3e..f3af548b 100644 --- a/workers/loc.api/di/app.deps.js +++ b/workers/loc.api/di/app.deps.js @@ -185,7 +185,8 @@ module.exports = ({ TYPES.ProcessorQueue, TYPES.AggregatorQueue, TYPES.WriteDataToStream, - TYPES.PdfWriter + TYPES.PdfWriter, + TYPES.I18next ] )) bind(TYPES.Aggregator).toConstantValue( From 1d47c59cbbfc76320d502fcc7097ff7f9c5b9a82 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 28 May 2026 13:58:18 +0300 Subject: [PATCH 3/9] Use translation for unauth message for csv gen --- workers/loc.api/queue/processor.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/workers/loc.api/queue/processor.js b/workers/loc.api/queue/processor.js index a9241d01..ed44a73d 100644 --- a/workers/loc.api/queue/processor.js +++ b/workers/loc.api/queue/processor.js @@ -15,7 +15,13 @@ const { createUniqueFileName } = require('./helpers') -const { isAuthError } = require('../helpers') +const { + isAuthError, + getTranslator +} = require('../helpers') +const TRANSLATION_NAMESPACES = require( + '../i18next/translation.namespaces' +) const processReportFile = async (deps, args) => { const { @@ -25,8 +31,20 @@ const processReportFile = async (deps, args) => { isUnauth } = args + const language = data?.args?.params?.language + const translate = getTranslator( + { i18next: deps.i18next }, + { + lng: language, + ns: TRANSLATION_NAMESPACES.PDF + } + ) + const defaultUnauthMsg = 'Your file could not be completed, please try again' + const unauthMsg = translate(defaultUnauthMsg, { + prop: 'template.errorMessage' + }) const write = isUnauth - ? 'Your file could not be completed, please try again' + ? unauthMsg : data const writable = createWriteStream(filePath) @@ -37,7 +55,7 @@ const processReportFile = async (deps, args) => { .createPDFStream({ jobData: data, pdfCustomTemplateName: data?.pdfCustomTemplateName, - language: data?.args?.params.language, + language, isError: isUnauth }) streamSet.add(pdfStream) @@ -86,7 +104,8 @@ module.exports = ( processorQueue, aggregatorQueue, writeDataToStream, - pdfWriter + pdfWriter, + i18next ) => { processorQueue.on('completed', (result) => { aggregatorQueue.addJob({ @@ -160,7 +179,8 @@ module.exports = ( await processReportFile( { writeDataToStream, - pdfWriter + pdfWriter, + i18next }, { data, From 8813dabea89c2064c8bb6d7a79f3a5c8a1f72b87 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 29 May 2026 12:35:47 +0300 Subject: [PATCH 4/9] Add helper to regen auth token --- .../auth-token-manager.js | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 workers/loc.api/queue/write-data-to-stream/auth-token-manager.js diff --git a/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js b/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js new file mode 100644 index 00000000..091f513f --- /dev/null +++ b/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js @@ -0,0 +1,54 @@ +'use strict' + +const { AuthError } = require('../../errors') + +const regenerateAuthToken = async (auth, deps) => { + const { authToken } = auth ?? {} + + if ( + !authToken || + typeof authToken !== 'string' + ) { + return auth + } + + const { + rService, + getDataFromApi + } = deps ?? {} + + try { + const opts = { + ttl: 24 * 60 * 60, + writePermission: false + } + + const res = await getDataFromApi({ + getData: (s, args) => rService._generateToken(args, opts), + args: { auth }, + callerName: 'REPORT_FILE_WRITER', + eNetErrorAttemptsTimeframeMin: 10 / 60, + eNetErrorAttemptsTimeoutMs: 1000, + shouldNotInterrupt: true + }) + + const [authToken] = Array.isArray(res) ? res : [null] + + if (!authToken) { + throw new AuthError() + } + + return { authToken } + } catch (err) { + throw new AuthError({ + data: { + isAuthTokenGenerationError: true, + rootMessage: err.toString() + } + }) + } +} + +module.exports = { + regenerateAuthToken +} From c6c38c5915f930e4c1dbf38e9de72964175df1fa Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 29 May 2026 12:36:45 +0300 Subject: [PATCH 5/9] Add helper to invalidate auth token --- .../auth-token-manager.js | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js b/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js index 091f513f..f26d1e8f 100644 --- a/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js +++ b/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js @@ -49,6 +49,41 @@ const regenerateAuthToken = async (auth, deps) => { } } +const invalidateAuthToken = async (auth, deps) => { + const { authToken } = auth ?? {} + + if ( + !authToken || + typeof authToken !== 'string' + ) { + return + } + + const { + rService, + getDataFromApi + } = deps ?? {} + + try { + await getDataFromApi({ + getData: (s, args) => rService._invalidateAuthToken(args), + args: { auth, params: { authToken } }, + callerName: 'REPORT_FILE_WRITER', + eNetErrorAttemptsTimeframeMin: 10 / 60, + eNetErrorAttemptsTimeoutMs: 1000, + shouldNotInterrupt: true + }) + } catch (err) { + throw new AuthError({ + data: { + isAuthTokenInvalidationError: true, + rootMessage: err.toString() + } + }) + } +} + module.exports = { - regenerateAuthToken + regenerateAuthToken, + invalidateAuthToken } From c8dd79b2813bf26f8d78334340996241cc7e547a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 29 May 2026 12:38:40 +0300 Subject: [PATCH 6/9] Regen auth token for report gen with 24h ttl --- .../loc.api/queue/write-data-to-stream/index.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/workers/loc.api/queue/write-data-to-stream/index.js b/workers/loc.api/queue/write-data-to-stream/index.js index 864f97a8..6c96a293 100644 --- a/workers/loc.api/queue/write-data-to-stream/index.js +++ b/workers/loc.api/queue/write-data-to-stream/index.js @@ -12,6 +12,9 @@ const { write, progress } = require('./helpers') +const { + regenerateAuthToken +} = require('./auth-token-manager') module.exports = ( rService, @@ -36,8 +39,15 @@ module.exports = ( const propName = jobData.propNameForPagination const formatSettings = jobData.formatSettings + const auth = await regenerateAuthToken( + jobData?.args?.auth, + { + rService, + getDataFromApi + } + ) const _args = { - auth: { ...jobData?.args?.auth }, + auth, params: omitExtraParamFieldsForReportExport(jobData?.args?.params) } @@ -48,7 +58,7 @@ module.exports = ( const getSymbols = rService.getSymbols.bind(rService) const symbols = (await getDataFromApi({ getData: getSymbols, - args: { auth: { ...jobData?.args?.auth } }, + args: { auth }, callerName: 'REPORT_FILE_WRITER', shouldNotInterrupt: true })) ?? {} From 5e957abdba36b53e103d48a541e00435ecde4db1 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 29 May 2026 12:40:02 +0300 Subject: [PATCH 7/9] Invalidate 24h auth token after report gen --- workers/loc.api/queue/write-data-to-stream/index.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/workers/loc.api/queue/write-data-to-stream/index.js b/workers/loc.api/queue/write-data-to-stream/index.js index 6c96a293..4ca0a945 100644 --- a/workers/loc.api/queue/write-data-to-stream/index.js +++ b/workers/loc.api/queue/write-data-to-stream/index.js @@ -13,7 +13,8 @@ const { progress } = require('./helpers') const { - regenerateAuthToken + regenerateAuthToken, + invalidateAuthToken } = require('./auth-token-manager') module.exports = ( @@ -186,4 +187,12 @@ module.exports = ( currIterationArgs.params.end = lastItem[propName] - 1 } } + + await invalidateAuthToken( + auth, + { + rService, + getDataFromApi + } + ) } From bb8f7821d29cce53c2fc676d4592be6d79433fac Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 4 Jun 2026 19:48:38 +0300 Subject: [PATCH 8/9] Regen auth token with 1h ttl --- .../loc.api/queue/write-data-to-stream/auth-token-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js b/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js index f26d1e8f..e66db2a4 100644 --- a/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js +++ b/workers/loc.api/queue/write-data-to-stream/auth-token-manager.js @@ -19,7 +19,7 @@ const regenerateAuthToken = async (auth, deps) => { try { const opts = { - ttl: 24 * 60 * 60, + ttl: 60 * 60, writePermission: false } From 67bcce6ac64c701dfdfa9c69a139faae1e7b6f61 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 5 Jun 2026 12:14:48 +0300 Subject: [PATCH 9/9] Bump version up to 5.2.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d119b5c..a944efa1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitfinex/bfx-report", - "version": "5.2.0", + "version": "5.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitfinex/bfx-report", - "version": "5.2.0", + "version": "5.2.1", "license": "Apache-2.0", "dependencies": { "@bitfinex/bfx-facs-deflate": "git+https://github.com/bitfinexcom/bfx-facs-deflate.git", diff --git a/package.json b/package.json index e6637d33..bbfac92c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitfinex/bfx-report", - "version": "5.2.0", + "version": "5.2.1", "description": "Reporting tool", "main": "worker.js", "engines": {