feat: ratelimit, ghcr package support, media path sensitization, LID to CN migration (#6)
* feat: ratelimit, ghcr package and proper project refactor from askarzh * fix(bridge): validate media path * update: dependencies * fix: added LID to contact number migration
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package wastate
|
||||
|
||||
import "sync"
|
||||
|
||||
// State tracks the WhatsApp client's connection + login state, the
|
||||
// current pairing QR PNG bytes (populated only while pairing is required),
|
||||
// and the most recent WhatsApp Web client version string applied to the store.
|
||||
type State struct {
|
||||
mu sync.RWMutex
|
||||
connected bool
|
||||
loggedIn bool
|
||||
pairingQRPNG []byte
|
||||
waVersion string
|
||||
}
|
||||
|
||||
func New() *State {
|
||||
return &State{}
|
||||
}
|
||||
|
||||
func (s *State) Connected() bool {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return s.connected
|
||||
}
|
||||
|
||||
func (s *State) LoggedIn() bool {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return s.loggedIn
|
||||
}
|
||||
|
||||
// PairingQRPNG returns a copy of the current QR PNG bytes, or nil if
|
||||
// pairing is not required. Returning a copy avoids aliasing issues if
|
||||
// the state is updated concurrently.
|
||||
func (s *State) PairingQRPNG() []byte {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
if s.pairingQRPNG == nil {
|
||||
return nil
|
||||
}
|
||||
out := make([]byte, len(s.pairingQRPNG))
|
||||
copy(out, s.pairingQRPNG)
|
||||
return out
|
||||
}
|
||||
|
||||
// PairingRequired returns true when the client is not logged in AND
|
||||
// a pairing QR is currently available.
|
||||
func (s *State) PairingRequired() bool {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return !s.loggedIn && s.pairingQRPNG != nil
|
||||
}
|
||||
|
||||
func (s *State) SetConnected(v bool) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
s.connected = v
|
||||
}
|
||||
|
||||
func (s *State) SetLoggedIn(v bool) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
s.loggedIn = v
|
||||
}
|
||||
|
||||
func (s *State) SetPairingQRPNG(b []byte) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
s.pairingQRPNG = b
|
||||
}
|
||||
|
||||
func (s *State) ClearPairingQR() {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
s.pairingQRPNG = nil
|
||||
}
|
||||
|
||||
func (s *State) WAVersion() string {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return s.waVersion
|
||||
}
|
||||
|
||||
func (s *State) SetWAVersion(v string) {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
s.waVersion = v
|
||||
}
|
||||
Reference in New Issue
Block a user