aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/gizak/termui/debug/debuger.go
blob: f723b9686cb89b26532eaa07852bc18d8ed68ec0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2016 Zack Guo <gizak@icloud.com>. All rights reserved.
// Use of this source code is governed by a MIT license that can
// be found in the LICENSE file.

package debug

import (
    "fmt"
    "net/http"

    "golang.org/x/net/websocket"
)

type Server struct {
    Port string
    Addr string
    Path string
    Msg  chan string
    chs  []chan string
}

type Client struct {
    Port string
    Addr string
    Path string
    ws   *websocket.Conn
}

var defaultPort = ":8080"

func NewServer() *Server {
    return &Server{
        Port: defaultPort,
        Addr: "localhost",
        Path: "/echo",
        Msg:  make(chan string),
        chs:  make([]chan string, 0),
    }
}

func NewClient() Client {
    return Client{
        Port: defaultPort,
        Addr: "localhost",
        Path: "/echo",
    }
}

func (c Client) ConnectAndListen() error {
    ws, err := websocket.Dial("ws://"+c.Addr+c.Port+c.Path, "", "http://"+c.Addr)
    if err != nil {
        return err
    }
    defer ws.Close()

    var m string
    for {
        err := websocket.Message.Receive(ws, &m)
        if err != nil {
            fmt.Print(err)
            return err
        }
        fmt.Print(m)
    }
}

func (s *Server) ListenAndServe() error {
    http.Handle(s.Path, websocket.Handler(func(ws *websocket.Conn) {
        defer ws.Close()

        mc := make(chan string)
        s.chs = append(s.chs, mc)

        for m := range mc {
            websocket.Message.Send(ws, m)
        }
    }))

    go func() {
        for msg := range s.Msg {
            for _, c := range s.chs {
                go func(a chan string) {
                    a <- msg
                }(c)
            }
        }
    }()

    return http.ListenAndServe(s.Port, nil)
}

func (s *Server) Log(msg string) {
    go func() { s.Msg <- msg }()
}

func (s *Server) Logf(format string, a ...interface{}) {
    s.Log(fmt.Sprintf(format, a...))
}

var DefaultServer = NewServer()
var DefaultClient = NewClient()

func ListenAndServe() error {
    return DefaultServer.ListenAndServe()
}

func ConnectAndListen() error {
    return DefaultClient.ConnectAndListen()
}

func Log(msg string) {
    DefaultServer.Log(msg)
}

func Logf(format string, a ...interface{}) {
    DefaultServer.Logf(format, a...)
}