status-console-client/node_signals.go

106 lines
2.2 KiB
Go

package main
import (
"encoding/hex"
"encoding/json"
"log"
"sync"
"github.com/ethereum/go-ethereum/common"
"github.com/status-im/status-go/signal"
)
type signalEnvelope struct {
Type string `json:"type"`
Event json.RawMessage `json:"event"`
}
type mailTypeEvent struct {
RequestID common.Hash `json:"requestID"`
Hash common.Hash `json:"hash"`
LastEnvelopeHash common.Hash `json:"lastEnvelopeHash"`
}
type mailTypeSignal struct {
Type string
RequestID string
LastEnvelopeID []byte
}
type signalForwarder struct {
sync.Mutex
in chan mailTypeSignal
out map[string]chan<- mailTypeSignal
}
func newSignalForwarder() *signalForwarder {
return &signalForwarder{
in: make(chan mailTypeSignal),
out: make(map[string]chan<- mailTypeSignal),
}
}
func (s *signalForwarder) Start() {
for {
sig, ok := <-s.in
if !ok {
return
}
s.Lock()
out, found := s.out[sig.RequestID]
s.Unlock()
if found {
out <- sig
}
}
}
func (s *signalForwarder) cancel(reqID []byte) {
s.Lock()
delete(s.out, hex.EncodeToString(reqID))
s.Unlock()
}
func (s *signalForwarder) Filter(reqID []byte) (<-chan mailTypeSignal, func()) {
c := make(chan mailTypeSignal)
s.Lock()
s.out[hex.EncodeToString(reqID)] = c
s.Unlock()
return c, func() { s.cancel(reqID); close(c) }
}
func filterMailTypesHandler(in chan<- mailTypeSignal) func(string) {
return func(event string) {
var envelope signalEnvelope
if err := json.Unmarshal([]byte(event), &envelope); err != nil {
log.Printf("faild to unmarshal signal Envelope: %v", err)
}
switch envelope.Type {
case signal.EventMailServerRequestCompleted:
var event mailTypeEvent
if err := json.Unmarshal(envelope.Event, &event); err != nil {
log.Printf("faild to unmarshal signal event: %v", err)
}
in <- mailTypeSignal{
envelope.Type,
hex.EncodeToString(event.RequestID.Bytes()),
event.LastEnvelopeHash.Bytes(),
}
case signal.EventMailServerRequestExpired:
var event mailTypeEvent
if err := json.Unmarshal(envelope.Event, &event); err != nil {
log.Printf("faild to unmarshal signal event: %v", err)
}
in <- mailTypeSignal{
envelope.Type,
hex.EncodeToString(event.Hash.Bytes()),
nil,
}
}
}
}