mirror of
https://github.com/mochi-mqtt/server.git
synced 2025-09-26 20:21:12 +08:00

* Implement file-based configuration * Implement file-based configuration * Replace DefaultServerCapabilities with NewDefaultServerCapabilities() to avoid data race (#360) Co-authored-by: JB <28275108+mochi-co@users.noreply.github.com> * Only pass a copy of system.Info to hooks (#365) * Only pass a copy of system.Info to hooks * Rename Itoa to Int64toa --------- Co-authored-by: JB <28275108+mochi-co@users.noreply.github.com> * Allow configurable max stored qos > 0 messages (#359) * Allow configurable max stored qos > 0 messages * Only rollback Inflight if QoS > 0 * Only rollback Inflight if QoS > 0 * Minor refactor * Update server version * Implement file-based configuration * Implement file-based configuration * update configs with maximum_inflight value * update docker configuration * fix tests --------- Co-authored-by: mochi-co <moumochi@icloud.com> Co-authored-by: thedevop <60499013+thedevop@users.noreply.github.com>
106 lines
2.3 KiB
Go
106 lines
2.3 KiB
Go
// SPDX-License-Identifier: MIT
|
|
// SPDX-FileCopyrightText: 2022 mochi-mqtt, mochi-co
|
|
// SPDX-FileContributor: mochi-co
|
|
|
|
package listeners
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"sync"
|
|
|
|
"log/slog"
|
|
)
|
|
|
|
const TypeMock = "mock"
|
|
|
|
// MockEstablisher is a function signature which can be used in testing.
|
|
func MockEstablisher(id string, c net.Conn) error {
|
|
return nil
|
|
}
|
|
|
|
// MockCloser is a function signature which can be used in testing.
|
|
func MockCloser(id string) {}
|
|
|
|
// MockListener is a mock listener for establishing client connections.
|
|
type MockListener struct {
|
|
sync.RWMutex
|
|
id string // the id of the listener
|
|
address string // the network address the listener binds to
|
|
Config *Config // configuration for the listener
|
|
done chan bool // indicate the listener is done
|
|
Serving bool // indicate the listener is serving
|
|
Listening bool // indiciate the listener is listening
|
|
ErrListen bool // throw an error on listen
|
|
}
|
|
|
|
// NewMockListener returns a new instance of MockListener.
|
|
func NewMockListener(id, address string) *MockListener {
|
|
return &MockListener{
|
|
id: id,
|
|
address: address,
|
|
done: make(chan bool),
|
|
}
|
|
}
|
|
|
|
// Serve serves the mock listener.
|
|
func (l *MockListener) Serve(establisher EstablishFn) {
|
|
l.Lock()
|
|
l.Serving = true
|
|
l.Unlock()
|
|
|
|
for range l.done {
|
|
return
|
|
}
|
|
}
|
|
|
|
// Init initializes the listener.
|
|
func (l *MockListener) Init(log *slog.Logger) error {
|
|
if l.ErrListen {
|
|
return fmt.Errorf("listen failure")
|
|
}
|
|
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.Listening = true
|
|
return nil
|
|
}
|
|
|
|
// ID returns the id of the mock listener.
|
|
func (l *MockListener) ID() string {
|
|
return l.id
|
|
}
|
|
|
|
// Address returns the address of the listener.
|
|
func (l *MockListener) Address() string {
|
|
return l.address
|
|
}
|
|
|
|
// Protocol returns the address of the listener.
|
|
func (l *MockListener) Protocol() string {
|
|
return "mock"
|
|
}
|
|
|
|
// Close closes the mock listener.
|
|
func (l *MockListener) Close(closer CloseFn) {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.Serving = false
|
|
closer(l.id)
|
|
close(l.done)
|
|
}
|
|
|
|
// IsServing indicates whether the mock listener is serving.
|
|
func (l *MockListener) IsServing() bool {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
return l.Serving
|
|
}
|
|
|
|
// IsListening indicates whether the mock listener is listening.
|
|
func (l *MockListener) IsListening() bool {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
return l.Listening
|
|
}
|