Skip to content
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@bitfinex/bfx-report",
"version": "5.2.0",
"version": "5.2.1",
"description": "Reporting tool",
"main": "worker.js",
"engines": {
Expand Down
3 changes: 2 additions & 1 deletion workers/loc.api/di/app.deps.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,8 @@ module.exports = ({
TYPES.ProcessorQueue,
TYPES.AggregatorQueue,
TYPES.WriteDataToStream,
TYPES.PdfWriter
TYPES.PdfWriter,
TYPES.I18next
]
))
bind(TYPES.Aggregator).toConstantValue(
Expand Down
46 changes: 35 additions & 11 deletions workers/loc.api/queue/processor.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,36 @@ 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 {
data,
filePath,
streamSet
streamSet,
isUnauth
} = args

const write = data?.isUnauth
? 'Your file could not be completed, please try again'
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
? unauthMsg
: data

const writable = createWriteStream(filePath)
Expand All @@ -36,8 +55,8 @@ const processReportFile = async (deps, args) => {
.createPDFStream({
jobData: data,
pdfCustomTemplateName: data?.pdfCustomTemplateName,
language: data?.args?.params.language,
isError: data?.isUnauth
language,
isError: isUnauth
})
streamSet.add(pdfStream)

Expand Down Expand Up @@ -85,7 +104,8 @@ module.exports = (
processorQueue,
aggregatorQueue,
writeDataToStream,
pdfWriter
pdfWriter,
i18next
) => {
processorQueue.on('completed', (result) => {
aggregatorQueue.addJob({
Expand Down Expand Up @@ -159,12 +179,14 @@ module.exports = (
await processReportFile(
{
writeDataToStream,
pdfWriter
pdfWriter,
i18next
},
{
data,
filePath,
streamSet
streamSet,
isUnauth
}
)
}
Expand All @@ -190,12 +212,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) {
Expand Down
89 changes: 89 additions & 0 deletions workers/loc.api/queue/write-data-to-stream/auth-token-manager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
'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: 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()
}
})
}
}

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,
invalidateAuthToken
}
23 changes: 21 additions & 2 deletions workers/loc.api/queue/write-data-to-stream/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ const {
write,
progress
} = require('./helpers')
const {
regenerateAuthToken,
invalidateAuthToken
} = require('./auth-token-manager')

module.exports = (
rService,
Expand All @@ -36,8 +40,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)
}

Expand All @@ -48,7 +59,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
})) ?? {}
Expand Down Expand Up @@ -176,4 +187,12 @@ module.exports = (
currIterationArgs.params.end = lastItem[propName] - 1
}
}

await invalidateAuthToken(
auth,
{
rService,
getDataFromApi
}
)
}