From 8efaf61d10dcd985b772ce398f050e8077a78f8b Mon Sep 17 00:00:00 2001 From: Anderson Balduino Jachinski Date: Thu, 12 Nov 2026 20:14:09 -0300 Subject: [PATCH] fix(painel): move sameShare declaration before records initialization --- src/painel.js | 5 +++-- tests/painel.unit.test.js | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/painel.js b/src/painel.js index 24b9732..aba4e34 100644 --- a/src/painel.js +++ b/src/painel.js @@ -298,6 +298,9 @@ const proxyUp = () => !!PROXY_URL() && Date.now() - proxy.okAt < 2 * 60e3; // Para esquecer um worker, apague-o de workers.json e reinicie o serviço. let known = loadJson('workers.json', {}); +// O mesmo share chega por mais de um caminho (pool com 2 casas, proxy com mais): 1410,95 e 1410,9534 são um recorde só +const sameShare = (a, b) => Math.abs(a - b) <= Math.max(Math.min(0.011, Math.max(a, b) * 0.01), Math.max(a, b) * 1e-4); + let records = loadJson('records.json', null); let recordsDirty = false; if (!Array.isArray(records)) { records = []; recordsDirty = true; } @@ -308,8 +311,6 @@ for (const w of Object.values(known)) { recordsDirty = true; } } -// O mesmo share chega por mais de um caminho (pool com 2 casas, proxy com mais): 1410,95 e 1410,9534 são um recorde só -const sameShare = (a, b) => Math.abs(a - b) <= Math.max(Math.min(0.011, Math.max(a, b) * 0.01), Math.max(a, b) * 1e-4); function dedupeRecords(list) { const out = []; for (const r of [...list].sort((a, b) => new Date(a.at || 0) - new Date(b.at || 0))) { diff --git a/tests/painel.unit.test.js b/tests/painel.unit.test.js index 2ca4098..2cde09e 100644 --- a/tests/painel.unit.test.js +++ b/tests/painel.unit.test.js @@ -728,3 +728,15 @@ test('recordes com dificuldade fracionária (< 1, ex.: NerdMiner / ESP32)', () = fs.rmSync(dir, { recursive: true, force: true }); } }); + +test('inicialização com workers.json preexistente não causa ReferenceError de sameShare', () => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'painel-init-')); + fs.writeFileSync(path.join(dir, 'workers.json'), JSON.stringify({ + miner1: { name: 'miner1', bestDifficulty: 0.5, lastSeen: new Date().toISOString() } + })); + const { execFileSync } = require('child_process'); + assert.doesNotThrow(() => { + execFileSync(process.execPath, ['-e', `process.env.DATA_DIR = ${JSON.stringify(dir)}; require('./src/painel');`]); + }); + fs.rmSync(dir, { recursive: true, force: true }); +});