fix: update server initialization to support preferred port and persist last used port

This commit is contained in:
Sarto
2026-05-09 00:40:30 +03:30
parent b5cf5b91f2
commit 7e4554942a
3 changed files with 25 additions and 12 deletions
+5 -2
View File
@@ -33,13 +33,16 @@ final class ServerController: ObservableObject {
guard instance == nil else { return }
do {
let dir = try Self.dataDir()
let saved = UserDefaults.standard.integer(forKey: "tf.lastPort")
var err: NSError?
guard let s = MobileNewServer(dir.path, &err) else {
guard let s = MobileNewServer(dir.path, saved, &err) else {
lastError = err?.localizedDescription ?? "server start failed"
return
}
instance = s
port = Int(s.port())
let actual = Int(s.port())
port = actual
UserDefaults.standard.set(actual, forKey: "tf.lastPort")
lastError = nil
} catch {
lastError = error.localizedDescription
+16 -6
View File
@@ -7,6 +7,7 @@ package mobile
import (
"errors"
"net"
"strconv"
"sync"
"github.com/sartoopjj/thefeed/internal/web"
@@ -24,15 +25,24 @@ type Server struct {
done chan struct{}
}
// NewServer starts a server on a kernel-assigned port. dataDir must be
// a writable, app-private directory (e.g. NSDocumentDirectory on iOS).
func NewServer(dataDir string) (*Server, error) {
// NewServer starts a server on 127.0.0.1. preferredPort=0 picks a
// kernel-assigned port; a positive value is tried first and falls
// back to kernel-assigned on bind failure. dataDir must be a writable
// app-private directory (e.g. NSDocumentDirectory on iOS).
func NewServer(dataDir string, preferredPort int) (*Server, error) {
if dataDir == "" {
return nil, errors.New("mobile: dataDir is empty")
}
ln, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
return nil, err
var ln net.Listener
var err error
if preferredPort > 0 {
ln, err = net.Listen("tcp", net.JoinHostPort("127.0.0.1", strconv.Itoa(preferredPort)))
}
if ln == nil {
ln, err = net.Listen("tcp", "127.0.0.1:0")
if err != nil {
return nil, err
}
}
port := ln.Addr().(*net.TCPAddr).Port
+4 -4
View File
@@ -10,14 +10,14 @@ import (
)
func TestNewServerEmptyDir(t *testing.T) {
if _, err := NewServer(""); err == nil {
if _, err := NewServer("", 0); err == nil {
t.Errorf("NewServer(\"\") succeeded, want error")
}
}
func TestServerLifecycle(t *testing.T) {
dir := t.TempDir()
s, err := NewServer(dir)
s, err := NewServer(dir, 0)
if err != nil {
t.Fatalf("NewServer: %v", err)
}
@@ -43,7 +43,7 @@ func TestServerLifecycle(t *testing.T) {
}
func TestStopIsIdempotent(t *testing.T) {
s, err := NewServer(t.TempDir())
s, err := NewServer(t.TempDir(), 0)
if err != nil {
t.Fatalf("NewServer: %v", err)
}
@@ -53,7 +53,7 @@ func TestStopIsIdempotent(t *testing.T) {
func TestStopReleasesPort(t *testing.T) {
dir := t.TempDir()
s, err := NewServer(dir)
s, err := NewServer(dir, 0)
if err != nil {
t.Fatalf("NewServer: %v", err)
}