From 715c14f048e1c071dc9f697cb040f4c1c64f4d1d Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 16 Mar 2026 18:27:34 +0000 Subject: [PATCH] refactor(process): replace os file ops with coreio.Local in pidfile and registry Replace all os.ReadFile, os.WriteFile, os.MkdirAll, os.Remove calls in pidfile.go and registry.go with coreio.Local equivalents (Read, Write, EnsureDir, Delete). Add forge.lthn.ai/core/go-io v0.1.2 as a direct dependency. Co-Authored-By: Virgil --- go.mod | 2 ++ go.sum | 4 ++++ pidfile.go | 18 ++++++++++-------- registry.go | 24 +++++++++++++----------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 2f33e1d..2d5e8f1 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,8 @@ require ( ) require ( + forge.lthn.ai/core/go-io v0.1.2 // indirect + forge.lthn.ai/core/go-log v0.0.2 // indirect github.com/99designs/gqlgen v0.17.88 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/agnivade/levenshtein v1.2.1 // indirect diff --git a/go.sum b/go.sum index 188b322..cfc0b77 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,10 @@ forge.lthn.ai/core/api v0.1.2 h1:VKHOQhjWcNCG4Xf9lJfrABRwk/+1tp8YsdQzPNVxzek= forge.lthn.ai/core/api v0.1.2/go.mod h1:vDkEihL/Cn1yKF8oA2jjf1CVOcd7kOP/WYWoIHIu2+E= forge.lthn.ai/core/go v0.3.1 h1:5FMTsUhLcxSr07F9q3uG0Goy4zq4eLivoqi8shSY4UM= forge.lthn.ai/core/go v0.3.1/go.mod h1:gE6c8h+PJ2287qNhVUJ5SOe1kopEwHEquvinstpuyJc= +forge.lthn.ai/core/go-io v0.1.2 h1:q8hj2jtOFqAgHlBr5wsUAOXtaFkxy9gqGrQT/il0WYA= +forge.lthn.ai/core/go-io v0.1.2/go.mod h1:PbNKW1Q25ywSOoQXeGdQHbV5aiIrTXvHIQ5uhplA//g= +forge.lthn.ai/core/go-log v0.0.2 h1:zJEgbajs5AjvhYzsbyybzn+S2Titiv56r3BG5E1cNUo= +forge.lthn.ai/core/go-log v0.0.2/go.mod h1:r14MXKOD3LF/sI8XUJQhRk/SZHBE7jAFVuCfgkXoZPw= forge.lthn.ai/core/go-ws v0.2.0 h1:w1uG5MgUeGoWGu1hBh8liTXcsMJDrjvPGeIsg6fyvYk= forge.lthn.ai/core/go-ws v0.2.0/go.mod h1:iDbJuR1NT27czjtNIluxnEdLrnfsYQdEBIrsoZnpkCk= github.com/99designs/gqlgen v0.17.88 h1:neMQDgehMwT1vYIOx/w5ZYPUU/iMNAJzRO44I5Intoc= diff --git a/pidfile.go b/pidfile.go index 3a2083e..96e7d5b 100644 --- a/pidfile.go +++ b/pidfile.go @@ -8,6 +8,8 @@ import ( "strings" "sync" "syscall" + + coreio "forge.lthn.ai/core/go-io" ) // PIDFile manages a process ID file for single-instance enforcement. @@ -27,8 +29,8 @@ func (p *PIDFile) Acquire() error { p.mu.Lock() defer p.mu.Unlock() - if data, err := os.ReadFile(p.path); err == nil { - pid, err := strconv.Atoi(strings.TrimSpace(string(data))) + if data, err := coreio.Local.Read(p.path); err == nil { + pid, err := strconv.Atoi(strings.TrimSpace(data)) if err == nil && pid > 0 { if proc, err := os.FindProcess(pid); err == nil { if err := proc.Signal(syscall.Signal(0)); err == nil { @@ -36,17 +38,17 @@ func (p *PIDFile) Acquire() error { } } } - _ = os.Remove(p.path) + _ = coreio.Local.Delete(p.path) } if dir := filepath.Dir(p.path); dir != "." { - if err := os.MkdirAll(dir, 0755); err != nil { + if err := coreio.Local.EnsureDir(dir); err != nil { return fmt.Errorf("failed to create PID directory: %w", err) } } pid := os.Getpid() - if err := os.WriteFile(p.path, []byte(strconv.Itoa(pid)), 0644); err != nil { + if err := coreio.Local.Write(p.path, strconv.Itoa(pid)); err != nil { return fmt.Errorf("failed to write PID file: %w", err) } @@ -57,7 +59,7 @@ func (p *PIDFile) Acquire() error { func (p *PIDFile) Release() error { p.mu.Lock() defer p.mu.Unlock() - return os.Remove(p.path) + return coreio.Local.Delete(p.path) } // Path returns the PID file path. @@ -69,12 +71,12 @@ func (p *PIDFile) Path() string { // Returns (pid, true) if the process is alive, (pid, false) if dead/stale, // or (0, false) if the file doesn't exist or is invalid. func ReadPID(path string) (int, bool) { - data, err := os.ReadFile(path) + data, err := coreio.Local.Read(path) if err != nil { return 0, false } - pid, err := strconv.Atoi(strings.TrimSpace(string(data))) + pid, err := strconv.Atoi(strings.TrimSpace(data)) if err != nil || pid <= 0 { return 0, false } diff --git a/registry.go b/registry.go index 0f87ddf..fca2399 100644 --- a/registry.go +++ b/registry.go @@ -7,6 +7,8 @@ import ( "strings" "syscall" "time" + + coreio "forge.lthn.ai/core/go-io" ) // DaemonEntry records a running daemon in the registry. @@ -47,7 +49,7 @@ func (r *Registry) Register(entry DaemonEntry) error { entry.Started = time.Now() } - if err := os.MkdirAll(r.dir, 0755); err != nil { + if err := coreio.Local.EnsureDir(r.dir); err != nil { return err } @@ -56,12 +58,12 @@ func (r *Registry) Register(entry DaemonEntry) error { return err } - return os.WriteFile(r.entryPath(entry.Code, entry.Daemon), data, 0644) + return coreio.Local.Write(r.entryPath(entry.Code, entry.Daemon), string(data)) } // Unregister removes a daemon entry from the registry. func (r *Registry) Unregister(code, daemon string) error { - return os.Remove(r.entryPath(code, daemon)) + return coreio.Local.Delete(r.entryPath(code, daemon)) } // Get reads a single daemon entry and checks whether its process is alive. @@ -69,19 +71,19 @@ func (r *Registry) Unregister(code, daemon string) error { func (r *Registry) Get(code, daemon string) (*DaemonEntry, bool) { path := r.entryPath(code, daemon) - data, err := os.ReadFile(path) + data, err := coreio.Local.Read(path) if err != nil { return nil, false } var entry DaemonEntry - if err := json.Unmarshal(data, &entry); err != nil { - _ = os.Remove(path) + if err := json.Unmarshal([]byte(data), &entry); err != nil { + _ = coreio.Local.Delete(path) return nil, false } if !isAlive(entry.PID) { - _ = os.Remove(path) + _ = coreio.Local.Delete(path) return nil, false } @@ -97,19 +99,19 @@ func (r *Registry) List() ([]DaemonEntry, error) { var alive []DaemonEntry for _, path := range matches { - data, err := os.ReadFile(path) + data, err := coreio.Local.Read(path) if err != nil { continue } var entry DaemonEntry - if err := json.Unmarshal(data, &entry); err != nil { - _ = os.Remove(path) + if err := json.Unmarshal([]byte(data), &entry); err != nil { + _ = coreio.Local.Delete(path) continue } if !isAlive(entry.PID) { - _ = os.Remove(path) + _ = coreio.Local.Delete(path) continue }