Files
Gianluca Boiano 2e33b81914 Improve code quality and thread safety (#844)
- Format Go files (gofmt) for backend/windows/notify*.go
- Add thread safety to Stopwatch with sync.Mutex
- Add comprehensive unit tests for Stopwatch with race detection
- Add godoc comments to ImageCache public APIs
- Improve IPC documentation with platform-specific socket path details
- Document portable mode TODO for future enhancement
2026-02-03 11:39:47 -08:00

56 lines
1.7 KiB
Go

//go:build !windows
package ipc
import (
"fmt"
"net"
"os"
"os/user"
"path"
"runtime"
)
// socketPath is automatically initialized based on platform conventions:
// - macOS: ~/Library/Caches/supersonic/supersonic.sock (or /tmp/supersonic-{uid}.sock as fallback)
// - Linux/Unix: $XDG_RUNTIME_DIR/supersonic.sock (or /tmp/supersonic-{uid}.sock as fallback)
//
// TODO: Add support for portable mode by allowing override via environment variable
// or configuration file (e.g., SUPERSONIC_SOCKET_PATH).
var socketPath = "/tmp/supersonic.sock"
func init() {
if runtime.GOOS == "darwin" {
if home, err := os.UserHomeDir(); err == nil {
socketPath = path.Join(home, "Library", "Caches", "supersonic", "supersonic.sock")
} else if user, err := user.Current(); err == nil {
socketPath = fmt.Sprintf("/tmp/supersonic-%s.sock", user.Uid)
}
} else {
if runtime := os.Getenv("XDG_RUNTIME_DIR"); runtime != "" {
socketPath = path.Join(runtime, "supersonic.sock")
} else if user, err := user.Current(); err == nil {
socketPath = fmt.Sprintf("/tmp/supersonic-%s.sock", user.Uid)
}
}
}
// Dial establishes a connection to the IPC socket.
// Returns an error if the socket doesn't exist or connection fails.
func Dial() (net.Conn, error) {
return net.Dial("unix", socketPath)
}
// Listen creates a Unix domain socket listener at the configured path.
// The socket file is created automatically and should be cleaned up
// with DestroyConn() when done.
func Listen() (net.Listener, error) {
return net.Listen("unix", socketPath)
}
// DestroyConn removes the Unix socket file from the filesystem.
// Should be called during application shutdown.
func DestroyConn() error {
return os.Remove(socketPath)
}