|
| 1 | +// Package unix communicate internal access |
| 2 | +package unix |
| 3 | + |
| 4 | +import ( |
| 5 | + "encoding/json" |
| 6 | + "fmt" |
| 7 | + "net" |
| 8 | + |
| 9 | + "github.com/hatappi/gomodoro/logger" |
| 10 | + "github.com/hatappi/gomodoro/timer" |
| 11 | +) |
| 12 | + |
| 13 | +// Response represents unix server response |
| 14 | +type Response struct { |
| 15 | + RemainSec int |
| 16 | +} |
| 17 | + |
| 18 | +// GetRemain get remain string |
| 19 | +func (r *Response) GetRemain() string { |
| 20 | + if r.RemainSec == 0 { |
| 21 | + return "00:00" |
| 22 | + } |
| 23 | + min := r.RemainSec / 60 |
| 24 | + sec := r.RemainSec % 60 |
| 25 | + return fmt.Sprintf("%02d:%02d", min, sec) |
| 26 | +} |
| 27 | + |
| 28 | +// Server represents server |
| 29 | +type Server interface { |
| 30 | + Serve() |
| 31 | + Close() |
| 32 | +} |
| 33 | + |
| 34 | +type serverImpl struct { |
| 35 | + listener net.Listener |
| 36 | + timer timer.Timer |
| 37 | +} |
| 38 | + |
| 39 | +// NewServer initialize Server |
| 40 | +func NewServer(socketPath string, timer timer.Timer) (Server, error) { |
| 41 | + listener, err := net.Listen("unix", socketPath) |
| 42 | + if err != nil { |
| 43 | + return nil, err |
| 44 | + } |
| 45 | + |
| 46 | + return &serverImpl{ |
| 47 | + listener: listener, |
| 48 | + timer: timer, |
| 49 | + }, nil |
| 50 | +} |
| 51 | + |
| 52 | +// Serve start unix domain socket server |
| 53 | +func (c *serverImpl) Serve() { |
| 54 | + for { |
| 55 | + conn, err := c.listener.Accept() |
| 56 | + logger.Infof("accept") |
| 57 | + if err != nil { |
| 58 | + logger.Warnf("listener failed to accept. err: %+s", err) |
| 59 | + return |
| 60 | + } |
| 61 | + |
| 62 | + go func() { |
| 63 | + defer func() { |
| 64 | + _ = conn.Close() |
| 65 | + }() |
| 66 | + |
| 67 | + rs := c.timer.GetRemainSec() |
| 68 | + |
| 69 | + r := &Response{ |
| 70 | + RemainSec: rs, |
| 71 | + } |
| 72 | + |
| 73 | + b, err := json.Marshal(r) |
| 74 | + if err != nil { |
| 75 | + logger.Errorf("faield to marshal Response: %+v", err) |
| 76 | + return |
| 77 | + } |
| 78 | + |
| 79 | + _, err = conn.Write(b) |
| 80 | + if err != nil { |
| 81 | + logger.Errorf("faield to write Response: %+v", err) |
| 82 | + } |
| 83 | + }() |
| 84 | + } |
| 85 | +} |
| 86 | + |
| 87 | +func (c *serverImpl) Close() { |
| 88 | + _ = c.listener.Close() |
| 89 | +} |
0 commit comments