From fb367ac5f0df90a69857887b6a2b13d9020f50af Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 5 Jun 2026 23:44:00 -0400 Subject: [PATCH] sv1-sv2 routing --- src/services/stratum-v1.service.spec.ts | 9 +++++++++ src/services/stratum-v1.service.ts | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/services/stratum-v1.service.spec.ts b/src/services/stratum-v1.service.spec.ts index 39f861a..32e0738 100644 --- a/src/services/stratum-v1.service.spec.ts +++ b/src/services/stratum-v1.service.spec.ts @@ -157,6 +157,15 @@ describe('StratumV1Service', () => { expect((service as any).detectProtocol(firstChunk)).toBe('v1'); }); + it('should detect JSON-RPC as Stratum V1 even with non-printable trailing bytes', () => { + const firstChunk = Buffer.concat([ + Buffer.from('{"id": 1, "method": "mining.subscribe", "params": []}\n'), + Buffer.from([0x00, 0xff]) + ]); + + expect((service as any).detectProtocol(firstChunk)).toBe('v1'); + }); + it('should detect binary Noise traffic as Stratum V2', () => { const firstChunk = Buffer.concat([ Buffer.from([0x01, 0x02, 0x03, 0x04]), diff --git a/src/services/stratum-v1.service.ts b/src/services/stratum-v1.service.ts index edad5b3..aa19de7 100644 --- a/src/services/stratum-v1.service.ts +++ b/src/services/stratum-v1.service.ts @@ -453,6 +453,13 @@ export class StratumV1Service implements OnModuleInit { return false; } + const jsonPrefix = firstChunk + .subarray(firstNonWhitespace, Math.min(firstChunk.length, firstNonWhitespace + 256)) + .toString('utf8'); + if (jsonPrefix.includes('"method"') || jsonPrefix.includes('"id"')) { + return true; + } + for (const byte of firstChunk) { const isWhitespace = byte === 0x09 || byte === 0x0a || byte === 0x0d; const isPrintableAscii = byte >= 0x20 && byte <= 0x7e;