docs: fix R4 Sonnet issues (circular imports, missing method signatures)
Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
parent
a7d16b7685
commit
eb896a065f
1 changed files with 92 additions and 6 deletions
98
docs/RFC.md
98
docs/RFC.md
|
|
@ -46,6 +46,28 @@ The v1 scope covers:
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 1.1 Import Graph (no circular imports)
|
||||||
|
|
||||||
|
Shared types (`Job`, `PoolConfig`, `Config`, `Miner`, `UpstreamStats`, event types) are defined in the root `proxy` package. Sub-packages import `proxy` but `proxy` never imports sub-packages directly — it uses interfaces (`Splitter`, `ShareSink`) injected at construction time.
|
||||||
|
|
||||||
|
```
|
||||||
|
proxy (root) ← defines shared types, Splitter interface, Proxy orchestrator
|
||||||
|
├── pool ← imports proxy (for Job, PoolConfig). proxy does NOT import pool.
|
||||||
|
├── nicehash ← imports proxy (for Miner, Job, events) and pool (for Strategy)
|
||||||
|
├── simple ← imports proxy and pool
|
||||||
|
├── log ← imports proxy (for Event)
|
||||||
|
└── api ← imports proxy (for Proxy) and core/api
|
||||||
|
```
|
||||||
|
|
||||||
|
The `Proxy` orchestrator wires sub-packages via interface injection:
|
||||||
|
```go
|
||||||
|
// proxy.go receives a Splitter (implemented by nicehash or simple)
|
||||||
|
// and a pool.StrategyFactory (closure that creates pool.Strategy instances).
|
||||||
|
// No import of nicehash, simple, or pool packages from proxy.go.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 2. File Map
|
## 2. File Map
|
||||||
|
|
||||||
| File | Package | Purpose |
|
| File | Package | Purpose |
|
||||||
|
|
@ -565,6 +587,29 @@ func (m *NonceMapper) Submit(event *proxy.SubmitEvent) {}
|
||||||
//
|
//
|
||||||
// if mapper.IsActive() { /* safe to assign miners */ }
|
// if mapper.IsActive() { /* safe to assign miners */ }
|
||||||
func (m *NonceMapper) IsActive() bool {}
|
func (m *NonceMapper) IsActive() bool {}
|
||||||
|
|
||||||
|
// Start connects the pool strategy. Called by NonceSplitter after creating the mapper.
|
||||||
|
//
|
||||||
|
// mapper.Start()
|
||||||
|
func (m *NonceMapper) Start() {}
|
||||||
|
|
||||||
|
// OnJob receives a new job from the pool. Implements pool.StratumListener.
|
||||||
|
// Calls storage.SetJob to distribute to all active miners.
|
||||||
|
//
|
||||||
|
// // called by pool.StratumClient when pool pushes a job
|
||||||
|
func (m *NonceMapper) OnJob(job proxy.Job) {}
|
||||||
|
|
||||||
|
// OnResultAccepted receives a share result from the pool. Implements pool.StratumListener.
|
||||||
|
// Correlates by sequence to the originating miner and sends success/error reply.
|
||||||
|
//
|
||||||
|
// // called by pool.StratumClient on pool reply
|
||||||
|
func (m *NonceMapper) OnResultAccepted(sequence int64, accepted bool, errorMessage string) {}
|
||||||
|
|
||||||
|
// OnDisconnect handles pool connection loss. Implements pool.StratumListener.
|
||||||
|
// Suspends the mapper; miners keep their slots but receive no new jobs until reconnect.
|
||||||
|
//
|
||||||
|
// // called by pool.StratumClient on disconnect
|
||||||
|
func (m *NonceMapper) OnDisconnect() {}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8.3 NonceStorage
|
### 8.3 NonceStorage
|
||||||
|
|
@ -841,6 +886,32 @@ type Event struct {
|
||||||
|
|
||||||
func NewEventBus() *EventBus {}
|
func NewEventBus() *EventBus {}
|
||||||
|
|
||||||
|
// LoginEvent is the typed event passed to Splitter.OnLogin.
|
||||||
|
//
|
||||||
|
// splitter.OnLogin(&LoginEvent{Miner: m})
|
||||||
|
type LoginEvent struct {
|
||||||
|
Miner *Miner
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubmitEvent is the typed event passed to Splitter.OnSubmit.
|
||||||
|
//
|
||||||
|
// splitter.OnSubmit(&SubmitEvent{Miner: m, JobID: "abc", Nonce: "deadbeef"})
|
||||||
|
type SubmitEvent struct {
|
||||||
|
Miner *Miner
|
||||||
|
JobID string
|
||||||
|
Nonce string
|
||||||
|
Result string
|
||||||
|
Algo string
|
||||||
|
RequestID int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloseEvent is the typed event passed to Splitter.OnClose.
|
||||||
|
//
|
||||||
|
// splitter.OnClose(&CloseEvent{Miner: m})
|
||||||
|
type CloseEvent struct {
|
||||||
|
Miner *Miner
|
||||||
|
}
|
||||||
|
|
||||||
// Subscribe registers a handler for the given event type. Safe to call before Start.
|
// Subscribe registers a handler for the given event type. Safe to call before Start.
|
||||||
//
|
//
|
||||||
// bus.Subscribe(proxy.EventAccept, func(e proxy.Event) { stats.OnAccept(e.Diff) })
|
// bus.Subscribe(proxy.EventAccept, func(e proxy.Event) { stats.OnAccept(e.Diff) })
|
||||||
|
|
@ -979,6 +1050,21 @@ func (w *Workers) List() []WorkerRecord {}
|
||||||
//
|
//
|
||||||
// w.Tick()
|
// w.Tick()
|
||||||
func (w *Workers) Tick() {}
|
func (w *Workers) Tick() {}
|
||||||
|
|
||||||
|
// OnLogin upserts the worker record for the miner's login. Called via EventBus subscription.
|
||||||
|
//
|
||||||
|
// bus.Subscribe(proxy.EventLogin, func(e proxy.Event) { w.OnLogin(e) })
|
||||||
|
func (w *Workers) OnLogin(e Event) {}
|
||||||
|
|
||||||
|
// OnAccept records an accepted share for the worker. Called via EventBus subscription.
|
||||||
|
//
|
||||||
|
// bus.Subscribe(proxy.EventAccept, func(e proxy.Event) { w.OnAccept(e) })
|
||||||
|
func (w *Workers) OnAccept(e Event) {}
|
||||||
|
|
||||||
|
// OnReject records a rejected share for the worker. Called via EventBus subscription.
|
||||||
|
//
|
||||||
|
// bus.Subscribe(proxy.EventReject, func(e proxy.Event) { w.OnReject(e) })
|
||||||
|
func (w *Workers) OnReject(e Event) {}
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -1025,7 +1111,7 @@ func (cd *CustomDiff) OnLogin(e proxy.Event) {}
|
||||||
type AccessLog struct {
|
type AccessLog struct {
|
||||||
path string
|
path string
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
f core.File // opened append-only on first write; nil until first event
|
f io.WriteCloser // opened append-only on first write; nil until first event
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAccessLog(path string) *AccessLog {}
|
func NewAccessLog(path string) *AccessLog {}
|
||||||
|
|
@ -1055,7 +1141,7 @@ func (l *AccessLog) OnClose(e proxy.Event) {}
|
||||||
type ShareLog struct {
|
type ShareLog struct {
|
||||||
path string
|
path string
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
f core.File
|
f io.WriteCloser
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewShareLog(path string) *ShareLog {}
|
func NewShareLog(path string) *ShareLog {}
|
||||||
|
|
@ -1076,13 +1162,13 @@ func (l *ShareLog) OnReject(e proxy.Event) {}
|
||||||
## 16. HTTP Monitoring API
|
## 16. HTTP Monitoring API
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// RegisterRoutes registers the proxy monitoring routes on a core/api Router.
|
// RegisterRoutes registers the proxy monitoring routes on a core/api Engine.
|
||||||
// GET /1/summary — aggregated proxy stats
|
// GET /1/summary — aggregated proxy stats
|
||||||
// GET /1/workers — per-worker hashrate table
|
// GET /1/workers — per-worker hashrate table
|
||||||
// GET /1/miners — per-connection state table
|
// GET /1/miners — per-connection state table
|
||||||
//
|
//
|
||||||
// proxyapi.RegisterRoutes(apiRouter, p)
|
// proxyapi.RegisterRoutes(engine, p)
|
||||||
func RegisterRoutes(r api.Router, p *proxy.Proxy) {}
|
func RegisterRoutes(r *api.Engine, p *proxy.Proxy) {}
|
||||||
```
|
```
|
||||||
|
|
||||||
### GET /1/summary — response shape
|
### GET /1/summary — response shape
|
||||||
|
|
@ -1402,7 +1488,7 @@ func TestStorage_Add_Good(t *testing.T) {
|
||||||
// TestJob_BlobWithFixedByte_Bad: blob shorter than 80 chars → returns original blob unchanged.
|
// TestJob_BlobWithFixedByte_Bad: blob shorter than 80 chars → returns original blob unchanged.
|
||||||
// TestJob_BlobWithFixedByte_Ugly: fixedByte 0xFF → "ff" (lowercase, not "FF").
|
// TestJob_BlobWithFixedByte_Ugly: fixedByte 0xFF → "ff" (lowercase, not "FF").
|
||||||
func TestJob_BlobWithFixedByte_Good(t *testing.T) {
|
func TestJob_BlobWithFixedByte_Good(t *testing.T) {
|
||||||
j := proxy.Job{Blob: core.RepeatString("0", 160)}
|
j := proxy.Job{Blob: strings.Repeat("0", 160)}
|
||||||
result := j.BlobWithFixedByte(0x2A)
|
result := j.BlobWithFixedByte(0x2A)
|
||||||
require.Equal(t, "2a", result[78:80])
|
require.Equal(t, "2a", result[78:80])
|
||||||
require.Equal(t, 160, len(result))
|
require.Equal(t, 160, len(result))
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue