Implement backend.Stdout that can be subscribed/unsubscribed.

This commit is contained in:
Kleissner
2022-01-06 04:11:28 +01:00
parent a19bac1916
commit 5c8b8eb94b
3 changed files with 51 additions and 1 deletions

View File

@@ -8,6 +8,7 @@ package core
import (
"bytes"
"encoding/hex"
"fmt"
"github.com/PeernetOfficial/core/dht"
@@ -214,7 +215,7 @@ func (peer *PeerInfo) cmdPong(msg *protocol.MessageRaw, connection *Connection)
// cmdChat handles a chat message [debug]
func (peer *PeerInfo) cmdChat(msg *protocol.MessageRaw, connection *Connection) {
fmt.Printf("Chat from '%s': %s\n", connection.Address.String(), string(msg.PacketRaw.Payload))
fmt.Fprintf(peer.Backend.Stdout, "Chat from %s '%s': %s\n", hex.EncodeToString(peer.PublicKey.SerializeCompressed()), connection.Address.String(), string(msg.PacketRaw.Payload))
}
// cmdLocalDiscovery handles an incoming announcement via local discovery

View File

@@ -9,12 +9,15 @@ Filters allow the caller to intercept events. The filter functions must not modi
package core
import (
"io"
"log"
"sync"
"github.com/PeernetOfficial/core/blockchain"
"github.com/PeernetOfficial/core/btcec"
"github.com/PeernetOfficial/core/dht"
"github.com/PeernetOfficial/core/protocol"
"github.com/google/uuid"
)
// Filters contains all functions to install the hook. Use nil for unused.
@@ -123,3 +126,45 @@ func (backend *Backend) initFilters() {
func DefaultLogError(function, format string, v ...interface{}) {
log.Printf("["+function+"] "+format, v...)
}
// MultiWriter code that allows to subscribe/unsubscribe.
type multiWriter struct {
writers map[uuid.UUID]io.Writer
sync.Mutex
}
// Creates a new writer that duplicates its writes to all the subscribed writers.
// Each write is written to each subscribed writer, one at a time. If any writer returns an error, the entire write operation continues.
func newMultiWriter() *multiWriter {
return &multiWriter{writers: make(map[uuid.UUID]io.Writer)}
}
// Subscribe a new writer to the list of writers
func (m *multiWriter) Subscribe(writer io.Writer) (id uuid.UUID) {
m.Lock()
defer m.Unlock()
id = uuid.New()
m.writers[id] = writer
return id
}
// Unsubscribe a writer from the list of writers
func (m *multiWriter) Unsubscribe(id uuid.UUID) {
m.Lock()
defer m.Unlock()
delete(m.writers, id)
}
// Write a slice of byte to each of the subscribed writers. It will not return any errors.
func (m *multiWriter) Write(p []byte) (n int, err error) {
m.Lock()
defer m.Unlock()
for _, w := range m.writers {
w.Write(p)
}
return len(p), nil
}

View File

@@ -29,6 +29,7 @@ func Init(UserAgent string, ConfigFilename string, Filters *Filters) (backend *B
backend = &Backend{
ConfigFilename: ConfigFilename,
userAgent: UserAgent,
Stdout: newMultiWriter(),
}
if Filters != nil {
@@ -108,4 +109,7 @@ type Backend struct {
// peerMonitor is a list of channels receiving information about new peers
peerMonitor []chan<- *PeerInfo
// Stdout bundles any output for the end-user. Writers may subscribe/unsubscribe.
Stdout *multiWriter
}