1 | package main
|
2 |
|
3 | import (
|
4 | "encoding/json"
|
5 | "net"
|
6 | )
|
7 |
|
8 | // Server listens on a Unix domain socket
|
9 | // for Pomo status requests
|
10 | type Server struct {
|
11 | listener net.Listener
|
12 | runner *TaskRunner
|
13 | running bool
|
14 | }
|
15 |
|
16 | func (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 |
|
31 | func (s *Server) Start() {
|
32 | s.running = true
|
33 | go s.listen()
|
34 | }
|
35 |
|
36 | func (s *Server) Stop() {
|
37 | s.running = false
|
38 | s.listener.Close()
|
39 | }
|
40 |
|
41 | func 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.
|
52 | type Client struct {
|
53 | conn net.Conn
|
54 | }
|
55 |
|
56 | func (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 |
|
64 | func (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 |
|
71 | func (c Client) Close() error { return c.conn.Close() }
|
72 |
|
73 | func 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 | }
|