You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.4 KiB

9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. package core_client
  2. import (
  3. "github.com/tendermint/tendermint/Godeps/_workspace/src/github.com/gorilla/websocket"
  4. rpctypes "github.com/tendermint/tendermint/rpc/types"
  5. "net/http"
  6. )
  7. // A websocket client subscribes and unsubscribes to events
  8. type WSClient struct {
  9. host string
  10. conn *websocket.Conn
  11. }
  12. // create a new connection
  13. func NewWSClient(addr string) *WSClient {
  14. return &WSClient{
  15. host: addr,
  16. }
  17. }
  18. func (wsc *WSClient) Dial() (*http.Response, error) {
  19. dialer := websocket.DefaultDialer
  20. rHeader := http.Header{}
  21. conn, r, err := dialer.Dial(wsc.host, rHeader)
  22. if err != nil {
  23. return r, err
  24. }
  25. wsc.conn = conn
  26. return r, nil
  27. }
  28. // subscribe to an event
  29. func (wsc *WSClient) Subscribe(eventid string) error {
  30. return wsc.conn.WriteJSON(rpctypes.WSRequest{
  31. Type: "subscribe",
  32. Event: eventid,
  33. })
  34. }
  35. // unsubscribe from an event
  36. func (wsc *WSClient) Unsubscribe(eventid string) error {
  37. return wsc.conn.WriteJSON(rpctypes.WSRequest{
  38. Type: "unsubscribe",
  39. Event: eventid,
  40. })
  41. }
  42. type WSMsg struct {
  43. Data []byte
  44. Error error
  45. }
  46. // returns a channel from which messages can be pulled
  47. // from a go routine that reads the socket.
  48. // if the ws returns an error (eg. closes), we return
  49. func (wsc *WSClient) Read() chan *WSMsg {
  50. ch := make(chan *WSMsg)
  51. go func() {
  52. for {
  53. _, p, err := wsc.conn.ReadMessage()
  54. ch <- &WSMsg{p, err}
  55. if err != nil {
  56. return
  57. }
  58. }
  59. }()
  60. return ch
  61. }