From afca8287ff1b8e1dfb78d854ed64e29843a345a5 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 9 Apr 2026 09:51:14 +0300 Subject: [PATCH 01/21] Update deps for gh workflow ci --- .github/workflows/ci.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df661e9e..538cf634 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6.0.2 with: submodules: recursive - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6.3.0 with: node-version: 24.14.0 - name: Setup configs @@ -28,17 +28,10 @@ jobs: && cp config/facs/grc.config.json.example config/facs/grc.config.json \ && cp config/facs/grc-slack.config.json.example config/facs/grc-slack.config.json - name: Install deps - run: npm i + run: npm ci - name: Run tests - uses: nick-fields/retry@v3 - continue-on-error: false - with: - timeout_minutes: 20 - retry_wait_seconds: 10 - max_attempts: 3 - retry_on: any - command: npm test -- --reporter=json --reporter-option output=test-report.json - - uses: actions/upload-artifact@v4 + run: npm test -- --reporter=json --reporter-option output=test-report.json + - uses: actions/upload-artifact@v7.0.0 if: success() || failure() with: name: test-results From 9a72b6fbd385e829b38f857fef0bcfa4a973af2d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 9 Apr 2026 09:51:37 +0300 Subject: [PATCH 02/21] Update deps for gh workflow for test report summary --- .github/workflows/test-report.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index 2a50a6d6..1717d163 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -18,22 +18,19 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Download test results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: test-results path: test-results - - uses: dorny/test-reporter@v1.8.0 + - uses: dorny/test-reporter@v3.0.0 id: test-results with: name: Mocha Tests path: test-results/test-report.json reporter: mocha-json + collapsed: never # Workaround for error 'fatal: not a git repository' caused by a call to 'git ls-files' # See: https://github.com/dorny/test-reporter/issues/169#issuecomment-1583560458 max-annotations: 0 - - name: Test Report Summary - run: | - echo "### Test Report page is ready! :rocket:" >> $GITHUB_STEP_SUMMARY - echo "And available at the following [Link](${{ steps.test-results.outputs.url_html }})" >> $GITHUB_STEP_SUMMARY From f5ff52bdbc814676f59e432df25553792c8676d7 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 9 Apr 2026 09:54:08 +0300 Subject: [PATCH 03/21] Apply npm audit fix --- package-lock.json | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a01d107..bb43982d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1615,9 +1615,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3687,9 +3687,9 @@ } }, "node_modules/flatted": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", - "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -5304,9 +5304,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash.defaults": { @@ -5617,9 +5617,9 @@ } }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -5862,9 +5862,9 @@ } }, "node_modules/nodemon/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6267,9 +6267,9 @@ "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "dev": true, "license": "MIT" }, @@ -6283,9 +6283,9 @@ } }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { From c499db9c13015823e0fbed3407e68338badbdf16 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 9 Apr 2026 10:09:02 +0300 Subject: [PATCH 04/21] Get gh actions wf file from triggered wf commit hash --- .github/workflows/ci.yml | 3 +++ .github/workflows/test-report.yml | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 538cf634..6e59307c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,3 +36,6 @@ jobs: with: name: test-results path: test-report.json + web-page-report: + needs: linux-test-runner + uses: ./.github/workflows/test-report.yml diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index 1717d163..43753b0a 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -2,10 +2,7 @@ name: 'Test Report' run-name: 'Test Report: Commit ${{ github.sha }}' on: - workflow_run: - workflows: ['CI'] - types: - - completed + workflow_call permissions: contents: read @@ -20,7 +17,6 @@ jobs: - name: Download test results uses: actions/download-artifact@v8.0.0 with: - run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: test-results path: test-results From 21024e10629887a09a986e4f43506e4ec2b9dfb5 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 17 Apr 2026 15:51:02 +0300 Subject: [PATCH 05/21] Fix node-fetch timeout handling --- workers/loc.api/helpers/api-errors-testers.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/workers/loc.api/helpers/api-errors-testers.js b/workers/loc.api/helpers/api-errors-testers.js index 981f0dce..fba086b0 100644 --- a/workers/loc.api/helpers/api-errors-testers.js +++ b/workers/loc.api/helpers/api-errors-testers.js @@ -39,8 +39,13 @@ const isETimedOutError = (err) => { return /ETIMEDOUT/i.test(_getErrorString(err)) } +/** + * https://github.com/node-fetch/node-fetch/blob/v2.6.9/src/index.js#L81 + * https://github.com/node-fetch/node-fetch/blob/v3.3.2/src/index.js#L70 + * https://github.com/node-fetch/node-fetch/blob/v2.6.9/src/body.js#L228 + */ const isNodeFetchTimeoutError = (err) => { - return /timeout/i.test(_getErrorString(err)) + return /(Response timeout while trying to fetch)|(The user aborted a request)|(The operation was aborted)/i.test(_getErrorString(err)) } const isEAiAgainError = (err) => { From ff21155461ea13fd356cd7e1d388470b68909be3 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 14:50:30 +0300 Subject: [PATCH 06/21] Remove isSignatureRequired param from validation --- workers/loc.api/data-validator/schemas/commonFileReq.js | 3 --- workers/loc.api/data-validator/schemas/defs.js | 3 --- .../data-validator/schemas/getActivePositionsFileReq.js | 3 --- workers/loc.api/data-validator/schemas/getCandlesFileReq.js | 3 --- workers/loc.api/data-validator/schemas/getLedgersFileReq.js | 3 --- workers/loc.api/data-validator/schemas/getMovementsFileReq.js | 3 --- workers/loc.api/data-validator/schemas/getMultipleFileReq.js | 3 --- .../loc.api/data-validator/schemas/getOrderTradesFileReq.js | 3 --- .../loc.api/data-validator/schemas/getPositionsAuditFileReq.js | 3 --- .../loc.api/data-validator/schemas/getPublicTradesFileReq.js | 3 --- .../loc.api/data-validator/schemas/getStatusMessagesFileReq.js | 3 --- .../loc.api/data-validator/schemas/getTickersHistoryFileReq.js | 3 --- workers/loc.api/data-validator/schemas/getWalletsFileReq.js | 3 --- .../data-validator/schemas/getWeightedAveragesReportFileReq.js | 3 --- 14 files changed, 42 deletions(-) diff --git a/workers/loc.api/data-validator/schemas/commonFileReq.js b/workers/loc.api/data-validator/schemas/commonFileReq.js index a5eeb011..69fb6f54 100644 --- a/workers/loc.api/data-validator/schemas/commonFileReq.js +++ b/workers/loc.api/data-validator/schemas/commonFileReq.js @@ -40,9 +40,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/defs.js b/workers/loc.api/data-validator/schemas/defs.js index d23518ed..325146ad 100644 --- a/workers/loc.api/data-validator/schemas/defs.js +++ b/workers/loc.api/data-validator/schemas/defs.js @@ -146,9 +146,6 @@ module.exports = { isPDFRequired: { type: 'boolean' }, - isSignatureRequired: { - type: 'boolean' - }, method: { type: 'string' }, diff --git a/workers/loc.api/data-validator/schemas/getActivePositionsFileReq.js b/workers/loc.api/data-validator/schemas/getActivePositionsFileReq.js index 8bbb83cb..b70a1a74 100644 --- a/workers/loc.api/data-validator/schemas/getActivePositionsFileReq.js +++ b/workers/loc.api/data-validator/schemas/getActivePositionsFileReq.js @@ -24,9 +24,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getCandlesFileReq.js b/workers/loc.api/data-validator/schemas/getCandlesFileReq.js index 1f7f7a78..7eec7539 100644 --- a/workers/loc.api/data-validator/schemas/getCandlesFileReq.js +++ b/workers/loc.api/data-validator/schemas/getCandlesFileReq.js @@ -51,9 +51,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getLedgersFileReq.js b/workers/loc.api/data-validator/schemas/getLedgersFileReq.js index ef916779..524896a6 100644 --- a/workers/loc.api/data-validator/schemas/getLedgersFileReq.js +++ b/workers/loc.api/data-validator/schemas/getLedgersFileReq.js @@ -62,9 +62,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getMovementsFileReq.js b/workers/loc.api/data-validator/schemas/getMovementsFileReq.js index 91499afb..b4a1df3d 100644 --- a/workers/loc.api/data-validator/schemas/getMovementsFileReq.js +++ b/workers/loc.api/data-validator/schemas/getMovementsFileReq.js @@ -46,9 +46,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getMultipleFileReq.js b/workers/loc.api/data-validator/schemas/getMultipleFileReq.js index 173e4c5f..98bfadec 100644 --- a/workers/loc.api/data-validator/schemas/getMultipleFileReq.js +++ b/workers/loc.api/data-validator/schemas/getMultipleFileReq.js @@ -17,9 +17,6 @@ module.exports = { isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' - }, multiExport: { type: 'array', diff --git a/workers/loc.api/data-validator/schemas/getOrderTradesFileReq.js b/workers/loc.api/data-validator/schemas/getOrderTradesFileReq.js index 3f6ea679..da6b5709 100644 --- a/workers/loc.api/data-validator/schemas/getOrderTradesFileReq.js +++ b/workers/loc.api/data-validator/schemas/getOrderTradesFileReq.js @@ -44,9 +44,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getPositionsAuditFileReq.js b/workers/loc.api/data-validator/schemas/getPositionsAuditFileReq.js index a4aa98f9..2e2d6d96 100644 --- a/workers/loc.api/data-validator/schemas/getPositionsAuditFileReq.js +++ b/workers/loc.api/data-validator/schemas/getPositionsAuditFileReq.js @@ -44,9 +44,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getPublicTradesFileReq.js b/workers/loc.api/data-validator/schemas/getPublicTradesFileReq.js index 66398c3b..f9ffd06a 100644 --- a/workers/loc.api/data-validator/schemas/getPublicTradesFileReq.js +++ b/workers/loc.api/data-validator/schemas/getPublicTradesFileReq.js @@ -44,9 +44,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getStatusMessagesFileReq.js b/workers/loc.api/data-validator/schemas/getStatusMessagesFileReq.js index a96adf89..ed8cea59 100644 --- a/workers/loc.api/data-validator/schemas/getStatusMessagesFileReq.js +++ b/workers/loc.api/data-validator/schemas/getStatusMessagesFileReq.js @@ -34,9 +34,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getTickersHistoryFileReq.js b/workers/loc.api/data-validator/schemas/getTickersHistoryFileReq.js index 97e8132b..ae4297fd 100644 --- a/workers/loc.api/data-validator/schemas/getTickersHistoryFileReq.js +++ b/workers/loc.api/data-validator/schemas/getTickersHistoryFileReq.js @@ -41,9 +41,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getWalletsFileReq.js b/workers/loc.api/data-validator/schemas/getWalletsFileReq.js index 7c7f7ee5..443e2f1e 100644 --- a/workers/loc.api/data-validator/schemas/getWalletsFileReq.js +++ b/workers/loc.api/data-validator/schemas/getWalletsFileReq.js @@ -28,9 +28,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } diff --git a/workers/loc.api/data-validator/schemas/getWeightedAveragesReportFileReq.js b/workers/loc.api/data-validator/schemas/getWeightedAveragesReportFileReq.js index f8da6041..5a2861fb 100644 --- a/workers/loc.api/data-validator/schemas/getWeightedAveragesReportFileReq.js +++ b/workers/loc.api/data-validator/schemas/getWeightedAveragesReportFileReq.js @@ -35,9 +35,6 @@ module.exports = { }, isPDFRequired: { $ref: 'defs#/definitions/isPDFRequired' - }, - isSignatureRequired: { - $ref: 'defs#/definitions/isSignatureRequired' } } } From 59de42fc8d825924184a2f8fe424e1d527850d0a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 14:53:09 +0300 Subject: [PATCH 07/21] Remove isSignatureRequired param from test cases --- test/3-report-signature.spec.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/3-report-signature.spec.js b/test/3-report-signature.spec.js index 7eba709e..ab05a698 100644 --- a/test/3-report-signature.spec.js +++ b/test/3-report-signature.spec.js @@ -93,7 +93,6 @@ describe('Signature', () => { method: 'getMultipleFile', params: { email, - isSignatureRequired: true, multiExport: [ { method: 'getTradesFile', @@ -138,8 +137,7 @@ describe('Signature', () => { start, limit: 1000, timezone: -3, - email, - isSignatureRequired: true + email }, id: 5 }) From 84b8eeecab76178c282d64f4fcf44d34aaea63ab Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 14:55:08 +0300 Subject: [PATCH 08/21] Remove isSignatureRequired param from omitting extra params --- .../helpers/omit-extra-param-fields-for-report-export.js | 1 - 1 file changed, 1 deletion(-) diff --git a/workers/loc.api/generate-report-file/helpers/omit-extra-param-fields-for-report-export.js b/workers/loc.api/generate-report-file/helpers/omit-extra-param-fields-for-report-export.js index 9a40f67a..61e4c46d 100644 --- a/workers/loc.api/generate-report-file/helpers/omit-extra-param-fields-for-report-export.js +++ b/workers/loc.api/generate-report-file/helpers/omit-extra-param-fields-for-report-export.js @@ -11,7 +11,6 @@ module.exports = (params) => { 'method', 'timezone', 'email', - 'isSignatureRequired', 'isDeposits', 'isWithdrawals', 'isTradingPair', From 53a3460a2e060f424ab9bf0d864a8e05b89952da Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 14:57:07 +0300 Subject: [PATCH 09/21] Remove isSignatureRequired param from report processor --- workers/loc.api/queue/processor.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/workers/loc.api/queue/processor.js b/workers/loc.api/queue/processor.js index ba9f7a5d..60866a31 100644 --- a/workers/loc.api/queue/processor.js +++ b/workers/loc.api/queue/processor.js @@ -129,7 +129,6 @@ module.exports = ( args: { params: { email, - isSignatureRequired, language } } @@ -179,7 +178,6 @@ module.exports = ( filePaths, subParamsArr, email, - isSignatureRequired, language, isUnauth }) From f2ddfc4968774f24956dba3d85aaa0bf691f611d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 14:57:33 +0300 Subject: [PATCH 10/21] Remove isSignatureRequired param from report aggregator --- workers/loc.api/queue/aggregator.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/workers/loc.api/queue/aggregator.js b/workers/loc.api/queue/aggregator.js index 7ae34ea9..c942cf36 100644 --- a/workers/loc.api/queue/aggregator.js +++ b/workers/loc.api/queue/aggregator.js @@ -27,7 +27,6 @@ module.exports = ( name, filePaths, subParamsArr, - isSignatureRequired, email, isUnauth, s3Conf, @@ -48,7 +47,6 @@ module.exports = ( filePaths, name, subParamsArr, - isSignatureRequired, { ...userInfo, email From 46afa453195b14129e93d9f52096847d5faf8542 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 15:06:16 +0300 Subject: [PATCH 11/21] Remove report signature test spec --- test/3-report-signature.spec.js | 182 -------------------------------- 1 file changed, 182 deletions(-) delete mode 100644 test/3-report-signature.spec.js diff --git a/test/3-report-signature.spec.js b/test/3-report-signature.spec.js deleted file mode 100644 index ab05a698..00000000 --- a/test/3-report-signature.spec.js +++ /dev/null @@ -1,182 +0,0 @@ -'use strict' - -const path = require('path') -const { assert } = require('chai') -const request = require('supertest') - -const { - startEnvironment, - stopEnvironment -} = require('./helpers/helpers.boot') -const { - rmDB, - rmAllFiles, - queueToPromise -} = require('./helpers/helpers.core') -const { - createMockRESTv2SrvWithDate -} = require('./helpers/helpers.mock-rest-v2') -const { - testMethodOfGettingReportFile -} = require('./helpers/helpers.tests') - -const signature = `-----BEGIN PGP SIGNATURE----- -Version: OpenPGP.js v4.5.2 -Comment: https://openpgpjs.org - -wl4EARYKAAYFAlzr1kMACgkQFh7gOz3Qo1Pe5QEAkpPma81YUttJNEK7zPfF -cvJxqAW4w9Crfobqk+wvb3cA/07ej6osCli0twWcNtDw6YkWiip+IT0+SMOH -08ODZ/ED -=hXVs ------END PGP SIGNATURE-----` -const fileHash = 'bdb9d457ab0e29806e7291bdb9d7fd17c90dad665cf437122b881cc57041899b' - -process.env.NODE_CONFIG_DIR = path.join(__dirname, 'config') -const { app } = require('@bitfinex/bfx-report-express') -const agent = request.agent(app) - -let wrkReportServiceApi = null -let processorQueue = null -let aggregatorQueue = null -let mockRESTv2Srv = null - -const basePath = '/api' -const tempDirPath = path.join(__dirname, '..', 'workers/loc.api/queue/temp') -const dbDirPath = path.join(__dirname, '..', 'db') -const date = new Date() -const end = date.getTime() -const start = (new Date()).setDate(date.getDate() - 90) -const email = 'fake@email.fake' -const auth = { - apiKey: 'fake', - apiSecret: 'fake' -} - -describe('Signature', () => { - before(async function () { - this.timeout(20000) - - mockRESTv2Srv = createMockRESTv2SrvWithDate(start, end, 10000) - - await rmAllFiles(tempDirPath) - await rmDB(dbDirPath) - const env = await startEnvironment() - - wrkReportServiceApi = env.wrksReportServiceApi[0] - processorQueue = wrkReportServiceApi.lokue_processor.q - aggregatorQueue = wrkReportServiceApi.lokue_aggregator.q - }) - - after(async function () { - this.timeout(20000) - - await stopEnvironment() - await rmDB(dbDirPath) - await rmAllFiles(tempDirPath) - - try { - await mockRESTv2Srv.close() - } catch (err) { } - }) - - it('it should be successfully performed by the getMultipleFile method', async function () { - this.timeout(60000) - - const procPromise = queueToPromise(processorQueue) - const aggrPromise = queueToPromise(aggregatorQueue) - - const res = await agent - .post(`${basePath}/json-rpc`) - .type('json') - .send({ - auth, - method: 'getMultipleFile', - params: { - email, - multiExport: [ - { - method: 'getTradesFile', - symbol: ['tBTCUSD', 'tETHUSD'], - end, - start, - limit: 1000, - timezone: 'America/Los_Angeles' - }, - { - method: 'getTickersHistoryFile', - symbol: 'BTC', - end, - start, - limit: 1000 - } - ] - }, - id: 5 - }) - .expect('Content-Type', /json/) - .expect(200) - - await testMethodOfGettingReportFile(procPromise, aggrPromise, res) - }) - - it('it should be successfully performed by the getLedgersFile method', async function () { - this.timeout(60000) - - const procPromise = queueToPromise(processorQueue) - const aggrPromise = queueToPromise(aggregatorQueue) - - const res = await agent - .post(`${basePath}/json-rpc`) - .type('json') - .send({ - auth, - method: 'getLedgersFile', - params: { - symbol: ['BTC'], - end, - start, - limit: 1000, - timezone: -3, - email - }, - id: 5 - }) - .expect('Content-Type', /json/) - .expect(200) - - await testMethodOfGettingReportFile(procPromise, aggrPromise, res) - }) - - it('it should be successfully performed by the verifyDigitalSignature method', async function () { - this.timeout(5000) - - const res = await agent - .post(`${basePath}/json-rpc`) - .type('json') - .send({ - auth, - method: 'verifyDigitalSignature', - signature, - fileHash, - id: 5 - }) - .expect('Content-Type', /json/) - .expect(200) - - assert.isOk(res) - }) - - // TODO: The feature is pending - it.skip('it should be successfully performed by the /verify-digital-signature route', async function () { - this.timeout(5000) - - const res = await agent - .post(`${basePath}/verify-digital-signature`) - .attach('file', Buffer.from('some report', 'utf8'), 'some-report.json') - .field({ signature }) - .expect('Content-Type', /json/) - .expect(200) - - assert.isOk(res) - }) -}) From 0c2d38a6f5dce74e4cc1d929ac2ac2d5de4b134b Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 15:08:03 +0300 Subject: [PATCH 12/21] Remove gpg mock spie --- test/helpers/helpers.worker.js | 1 - test/simulate/mocks-spies/gpg.js | 85 -------------------------------- 2 files changed, 86 deletions(-) delete mode 100644 test/simulate/mocks-spies/gpg.js diff --git a/test/helpers/helpers.worker.js b/test/helpers/helpers.worker.js index 4d6bce6a..5ecb3f0e 100644 --- a/test/helpers/helpers.worker.js +++ b/test/helpers/helpers.worker.js @@ -21,7 +21,6 @@ const startHelpers = ( workers = [ { name: 's3', port: 13371 }, { name: 'mail', port: 1310 }, - { name: 'gpg', port: 1320 }, { name: 'pdf', port: 1330 }, { name: 'testcalls', port: 1300 } ] diff --git a/test/simulate/mocks-spies/gpg.js b/test/simulate/mocks-spies/gpg.js deleted file mode 100644 index e0e091d5..00000000 --- a/test/simulate/mocks-spies/gpg.js +++ /dev/null @@ -1,85 +0,0 @@ -'use strict' - -const workerArgs = ['rest:ext:gpg'] - -function addFunctions (ExtApi) { - ExtApi.prototype.getDigitalSignature = function (space, file, args, cb) { - const signature = `-----BEGIN PGP SIGNATURE----- - Version: OpenPGP.js v4.5.2 - Comment: https://openpgpjs.org - - wl4EARYKAAYFAlzr1kMACgkQFh7gOz3Qo1Pe5QEAkpPma81YUttJNEK7zPfF - cvJxqAW4w9Crfobqk+wvb3cA/07ej6osCli0twWcNtDw6YkWiip+IT0+SMOH - 08ODZ/ED - =hXVs - -----END PGP SIGNATURE-----` - - const { - userId, - username, - email - } = args - - if (!file) return cb(new Error('ERR_API_NO_FILE')) - if (!userId) return cb(new Error('ERR_API_NO_USER_ID')) - if (!username) return cb(new Error('ERR_API_NO_USERNAME')) - if (!email) return cb(new Error('ERR_API_NO_EMAIL')) - - const grcBfx = this.ctx.grc_bfx - const call = { - worker: 'ext.gpg', - on: 'getDigitalSignature', - params: { file, args }, - res: { signature }, - timestamp: Date.now() - } - - grcBfx.req( - 'rest:ext:testcalls', - 'addCall', - [call], - { timeout: 10000 }, - (err, data) => { - if (err) cb(new Error('ext.gpg:getDigitalSignature:testcalls')) - else return cb(null, signature) - } - ) - } - - ExtApi.prototype.verifyDigitalSignature = function (space, file, args, cb) { - const isValid = true - - const { - signature, - fileHash - } = args - - if (!signature) return cb(new Error('ERR_API_NO_SIGNATURE')) - if (!file && !fileHash) return cb(new Error('ERR_API_NO_FILE_HASH_AND_FILE')) - - const grcBfx = this.ctx.grc_bfx - const call = { - worker: 'ext.gpg', - on: 'verifyDigitalSignature', - params: { file, args }, - res: { isValid }, - timestamp: Date.now() - } - - grcBfx.req( - 'rest:ext:testcalls', - 'addCall', - [call], - { timeout: 10000 }, - (err, data) => { - if (err) cb(new Error('ext.gpg:verifyDigitalSignature:testcalls')) - else return cb(null, isValid) - } - ) - } -} - -module.exports = { - addFunctions, - workerArgs -} From f9ed32a0ba2c1b3c7255f1dc053add69ad77568d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 15:10:23 +0300 Subject: [PATCH 13/21] Remove gpg service availability checker --- workers/loc.api/has.grc.service/index.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/workers/loc.api/has.grc.service/index.js b/workers/loc.api/has.grc.service/index.js index 1f3dad77..5ae5ca77 100644 --- a/workers/loc.api/has.grc.service/index.js +++ b/workers/loc.api/has.grc.service/index.js @@ -40,14 +40,6 @@ class HasGrcService { return !!(countS3Services && countMailServices) } - async hasGPGService () { - const countPGPServices = await this.lookUpFunction( - 'rest:ext:gpg' - ) - - return !!countPGPServices - } - async hasSlackService () { const workerName = ( this.grcSlackFac.conf && From ae8a113cdc56bb1d4ae5d2391a3919277d5f5853 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 15:11:39 +0300 Subject: [PATCH 14/21] Remove verifyDigitalSignature endpoint --- workers/loc.api/service.report.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/workers/loc.api/service.report.js b/workers/loc.api/service.report.js index dd9ba311..627b7213 100644 --- a/workers/loc.api/service.report.js +++ b/workers/loc.api/service.report.js @@ -163,16 +163,6 @@ class ReportService extends Api { }, 'getFilterModels', args, cb) } - verifyDigitalSignature (space, args, cb) { - return this._responder(() => { - return this._grcBfxReq({ - service: 'rest:ext:gpg', - action: 'verifyDigitalSignature', - args: [null, args] - }) - }, 'verifyDigitalSignature', args, cb) - } - isSyncModeConfig (space, args, cb) { return this._responder(() => { return this.container.get(TYPES.CONF).syncMode From 4480e6cc58e8ea616d57a4a3dc800a65ff830230 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 21 Apr 2026 11:00:40 +0300 Subject: [PATCH 15/21] Remove signature uploading to s3 --- workers/loc.api/queue/upload-to-s3/index.js | 75 --------------------- 1 file changed, 75 deletions(-) diff --git a/workers/loc.api/queue/upload-to-s3/index.js b/workers/loc.api/queue/upload-to-s3/index.js index 0a109443..a2f55184 100644 --- a/workers/loc.api/queue/upload-to-s3/index.js +++ b/workers/loc.api/queue/upload-to-s3/index.js @@ -1,66 +1,18 @@ 'use strict' const fs = require('fs') -const { Readable } = require('stream') const { getCompleteFileName, getReportContentType } = require('../helpers') -const _uploadSignToS3 = async ( - isCompress, - deflateFac, - grcBfxReq, - configs, - signature, - fileNameWithoutExt -) => { - const fileName = `SIGNATURE_${fileNameWithoutExt}.sig` - const signFileName = isCompress - ? `SIGNATURE_${fileNameWithoutExt}.zip` - : fileName - - const stream = new Readable() - stream._read = () => {} - stream.push(signature) - stream.push(null) - const signStream = { - stream, - data: { name: fileName } - } - - const signBuffers = await Promise.all(deflateFac.createBuffZip( - [signStream], - isCompress, - { - comment: `SIGNATURE_${fileNameWithoutExt.replace(/_/g, ' ')}` - } - )) - - const signHexStrBuff = signBuffers[0].toString('hex') - const signOpts = { - ...configs, - contentDisposition: `attachment; filename="${signFileName}"`, - contentType: isCompress - ? 'application/zip' - : 'application/pgp-signature' - } - - return grcBfxReq({ - service: 'rest:ext:s3', - action: 'uploadPresigned', - args: [signHexStrBuff, signOpts] - }) -} - module.exports = ( { isCompress, isAddedUniqueEndingToReportFileName }, deflateFac, - hasGrcService, grcBfxReq ) => { return async ( @@ -68,7 +20,6 @@ module.exports = ( filePaths, queueName, subParamsArr, - isSignatureRequired, userInfo, streamSet ) => { @@ -89,8 +40,6 @@ module.exports = ( isAddedUniqueEndingToReportFileName } ) - const isUppedPGPService = await hasGrcService.hasGPGService() - const isSignReq = isSignatureRequired && isUppedPGPService const streams = filePaths.map((filePath, i) => { const stream = fs.createReadStream(filePath) @@ -136,36 +85,12 @@ module.exports = ( } const hexStrBuff = buffer.toString('hex') - const signature = isSignReq - ? await grcBfxReq({ - service: 'rest:ext:gpg', - action: 'getDigitalSignature', - args: [hexStrBuff, userInfo] - }) - : null const reportS3 = await grcBfxReq({ service: 'rest:ext:s3', action: 'uploadPresigned', args: [hexStrBuff, opts] }) - if (isSignReq) { - const signatureS3 = await _uploadSignToS3( - isCompress, - deflateFac, - grcBfxReq, - configs, - signature, - fileNameWithoutExt - ) - - return { - ...reportS3, - fileName, - signatureS3 - } - } - return { ...reportS3, fileName From 75f8c66afc4bd873bb97aa4dcdcbb0ff12148b94 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 21 Apr 2026 11:01:10 +0300 Subject: [PATCH 16/21] Dont inject hasGrcService to s3 upload service --- workers/loc.api/di/app.deps.js | 1 - 1 file changed, 1 deletion(-) diff --git a/workers/loc.api/di/app.deps.js b/workers/loc.api/di/app.deps.js index 8a076fea..699ebe3e 100644 --- a/workers/loc.api/di/app.deps.js +++ b/workers/loc.api/di/app.deps.js @@ -164,7 +164,6 @@ module.exports = ({ [ TYPES.CONF, TYPES.DeflateFac, - TYPES.HasGrcService, TYPES.GrcBfxReq ] ) From be01d27d79304a35178abd533f703e5ba87d6d4e Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 21 Apr 2026 11:04:59 +0300 Subject: [PATCH 17/21] Rename queue base spec --- test/{4-queue-base.spec.js => 3-queue-base.spec.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{4-queue-base.spec.js => 3-queue-base.spec.js} (100%) diff --git a/test/4-queue-base.spec.js b/test/3-queue-base.spec.js similarity index 100% rename from test/4-queue-base.spec.js rename to test/3-queue-base.spec.js From 7f6906011ca0f7a3b09d89726fe9fa6bbab8c44d Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 21 Apr 2026 11:05:32 +0300 Subject: [PATCH 18/21] Rename queue load spec --- test/{5-queue-load.spec.js => 4-queue-load.spec.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{5-queue-load.spec.js => 4-queue-load.spec.js} (100%) diff --git a/test/5-queue-load.spec.js b/test/4-queue-load.spec.js similarity index 100% rename from test/5-queue-load.spec.js rename to test/4-queue-load.spec.js From 0084eddb0597401f8d235216a1299f41c4939519 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 09:44:04 +0300 Subject: [PATCH 19/21] Fix GH Actions workflow permissions --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e59307c..07c715bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,4 +38,8 @@ jobs: path: test-report.json web-page-report: needs: linux-test-runner + permissions: + contents: read + actions: read + checks: write uses: ./.github/workflows/test-report.yml From 495d36a94a850aff33d8ea7a93a9a1f2271ea564 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 11:20:52 +0300 Subject: [PATCH 20/21] Bump version up to 5.1.0 --- 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 bb43982d..d4ccc0ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitfinex/bfx-report", - "version": "5.0.0", + "version": "5.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitfinex/bfx-report", - "version": "5.0.0", + "version": "5.1.0", "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 4cd773ba..9857d052 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitfinex/bfx-report", - "version": "5.0.0", + "version": "5.1.0", "description": "Reporting tool", "main": "worker.js", "engines": { From 4d517760491e62ae1f7d03051ed74f8fe2c12e34 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 11:23:40 +0300 Subject: [PATCH 21/21] Update @bitfinex/bfx-report-express dep --- package-lock.json | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index d4ccc0ab..0a5b260e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -207,12 +207,11 @@ } }, "node_modules/@bitfinex/bfx-report-express": { - "version": "3.0.0", - "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-report-express.git#313b5c7450af639adb42e0b2632a1432d389988f", + "version": "3.1.0", + "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-report-express.git#510163a94336f889364da7b248103df804ef3a05", "dev": true, "license": "Apache-2.0", "dependencies": { - "better-npm-run": "0.1.1", "colors": "1.4.0", "config": "4.4.1", "cors": "2.8.6", @@ -1213,22 +1212,6 @@ "dev": true, "license": "MIT" }, - "node_modules/better-npm-run": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/better-npm-run/-/better-npm-run-0.1.1.tgz", - "integrity": "sha512-SBBYsUsb6bYcUMF9QUWy39GX5kzD4CoRBP11gx/k5jYkUr4Tr+irAokIeQX5FgfCRz0Q27rt8U0J4D2TlRgQFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^2.9.0", - "dotenv": "^2.0.0", - "object-assign": "^4.0.1" - }, - "bin": { - "better-npm-run": "index.js", - "bnr": "index.js" - } - }, "node_modules/bfx-api-mock-srv": { "version": "1.8.0", "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-api-mock-srv.git#3aeb5a5283a4a4c1fff142f9b6d27ec62944af98", @@ -2032,13 +2015,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -2582,13 +2558,6 @@ "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", "license": "MIT" }, - "node_modules/dotenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-2.0.0.tgz", - "integrity": "sha512-Y+zZAmv7p2zOdpyZcSIA+aIxohsyfTcNaMeh3YJn9exq85bQhso65Wz9IhjYYNB4zyvXnfi7Ae+FuygARljVJw==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",