55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package client
|
|
|
|
import (
|
|
"log/slog"
|
|
"sync"
|
|
)
|
|
|
|
// RequestIDGenerator generates sequential request IDs for IB API calls
|
|
type RequestIDGenerator struct {
|
|
mu sync.Mutex
|
|
current int64
|
|
logger *slog.Logger
|
|
}
|
|
|
|
// NewRequestIDGenerator creates a new request ID generator starting at 1
|
|
func NewRequestIDGenerator(logger *slog.Logger) *RequestIDGenerator {
|
|
return &RequestIDGenerator{
|
|
current: 1,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// Next returns the next sequential request ID and logs it
|
|
func (r *RequestIDGenerator) Next() int64 {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
|
|
id := r.current
|
|
r.current++
|
|
|
|
if r.logger != nil {
|
|
r.logger.Debug("generated request ID", slog.Int64("req_id", id))
|
|
}
|
|
|
|
return id
|
|
}
|
|
|
|
// Current returns the current request ID without incrementing
|
|
func (r *RequestIDGenerator) Current() int64 {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
return r.current
|
|
}
|
|
|
|
// Reset resets the generator back to 1 (useful for testing or reconnection)
|
|
func (r *RequestIDGenerator) Reset() {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
r.current = 1
|
|
|
|
if r.logger != nil {
|
|
r.logger.Debug("reset request ID generator")
|
|
}
|
|
}
|