mirror of
https://github.com/sartoopjj/thefeed.git
synced 2026-05-18 02:14:43 +03:00
fix: update server initialization to support preferred port and persist last used port
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user