Goserver.go -rw-r--r-- 1.5 KiB
1package main
2
3import (
4 "encoding/json"
5 "net"
6)
7
8// Server listens on a Unix domain socket
9// for Pomo status requests
10type Server struct {
11 listener net.Listener
12 runner *TaskRunner
13 running bool
14}
15
16func (s *Server) listen() {
17 for s.running {
18 conn, err := s.listener.Accept()
19 if err != nil {
20 break
21 }
22 buf := make([]byte, 512)
23 // Ignore any content
24 conn.Read(buf)
25 raw, _ := json.Marshal(s.runner.Status())
26 conn.Write(raw)
27 conn.Close()
28 }
29}
30
31func (s *Server) Start() {
32 s.running = true
33 go s.listen()
34}
35
36func (s *Server) Stop() {
37 s.running = false
38 s.listener.Close()
39}
40
41func NewServer(path string, runner *TaskRunner) (*Server, error) {
42 listener, err := net.Listen("unix", path)
43 if err != nil {
44 return nil, err
45 }
46 return &Server{listener: listener, runner: runner}, nil
47}
48
49// Client makes requests to a listening
50// pomo server to check the status of
51// any currently running task session.
52type Client struct {
53 conn net.Conn
54}
55
56func (c Client) read(statusCh chan *Status) {
57 buf := make([]byte, 512)
58 n, _ := c.conn.Read(buf)
59 status := &Status{}
60 json.Unmarshal(buf[0:n], status)
61 statusCh <- status
62}
63
64func (c Client) Status() (*Status, error) {
65 statusCh := make(chan *Status)
66 c.conn.Write([]byte("status"))
67 go c.read(statusCh)
68 return <-statusCh, nil
69}
70
71func (c Client) Close() error { return c.conn.Close() }
72
73func NewClient(path string) (*Client, error) {
74 conn, err := net.Dial("unix", path)
75 if err != nil {
76 return nil, err
77 }
78 return &Client{conn: conn}, nil
79}