streams.go
author Mikael Berthe <mikael@lilotux.net>
Sat, 29 Apr 2017 17:27:15 +0200
changeset 156 70aadba26338
parent 140 7665451f74cc
child 159 408aa794d9bb
permissions -rw-r--r--
Add field "All" to LimitParams, change Limit behaviour If All is true, the library will send several requests (if needed) until the API server has sent all the results. If not, and if a Limit is set, the library will try to fetch at least this number of results.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
130
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     1
/*
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     2
Copyright 2017 Mikael Berthe
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     3
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     4
Licensed under the MIT license.  Please see the LICENSE file is this directory.
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     5
*/
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 128
diff changeset
     6
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
     7
package madon
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
import (
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"encoding/json"
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
	"errors"
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
	"fmt"
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    13
	"net/url"
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
	"strings"
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    16
	"github.com/gorilla/websocket"
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
)
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
// StreamEvent contains a single event from the streaming API
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
type StreamEvent struct {
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
	Event string      // Name of the event (error, update, notification or delete)
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
	Data  interface{} // Status, Notification or status ID
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
	Error error       // Error message from the StreamListener
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
// openStream opens a stream URL and returns an http.Response
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
// Note that the caller should close the connection when it's done reading
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
// the stream.
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    29
// The stream name can be "user", "local", "public" or "hashtag".
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    30
// When it is "hashtag", the hashTag argument cannot be empty.
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    31
func (mc *Client) openStream(streamName, hashTag string) (*websocket.Conn, error) {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    32
	var tag string
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
	switch streamName {
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    35
	case "user", "public", "public:local":
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
	case "hashtag":
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
		if hashTag == "" {
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
			return nil, ErrInvalidParameter
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
		}
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    40
		tag = hashTag
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
	default:
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
		return nil, ErrInvalidParameter
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
	}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    45
	if !strings.HasPrefix(mc.APIBase, "http") {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    46
		return nil, errors.New("cannot create Websocket URL: unexpected API base URL")
128
a5a00fad7a32 Add checks for client initialization
Mikael Berthe <mikael@lilotux.net>
parents: 122
diff changeset
    47
	}
a5a00fad7a32 Add checks for client initialization
Mikael Berthe <mikael@lilotux.net>
parents: 122
diff changeset
    48
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    49
	// Build streaming websocket URL
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    50
	u, err := url.Parse("ws" + mc.APIBase[4:] + "/streaming/")
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
	if err != nil {
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    52
		return nil, errors.New("cannot create Websocket URL: " + err.Error())
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
	}
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 117
diff changeset
    54
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    55
	urlParams := url.Values{}
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    56
	urlParams.Add("stream", streamName)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    57
	urlParams.Add("access_token", mc.UserToken.AccessToken)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    58
	if tag != "" {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    59
		urlParams.Add("tag", tag)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
	}
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    61
	u.RawQuery = urlParams.Encode()
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    62
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    63
	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    64
	return c, err
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
// readStream reads from the http.Response and sends events to the events channel
122
50c7733ee886 Change StreamListener prototype
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
    68
// It stops when the connection is closed or when the stopCh channel is closed.
50c7733ee886 Change StreamListener prototype
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
    69
// The foroutine will close the doneCh channel when it terminates.
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    70
func (mc *Client) readStream(events chan<- StreamEvent, stopCh <-chan bool, doneCh chan bool, c *websocket.Conn) {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    71
	defer c.Close()
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    72
	defer close(doneCh)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    74
	go func() {
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
		select {
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
		case <-stopCh:
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    77
			// Close connection
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    78
			c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    79
		case <-doneCh:
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    80
			// Leave
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
		}
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    82
	}()
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    84
	for {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    85
		var msg struct {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    86
			Event   string
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    87
			Payload interface{}
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
		}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    90
		err := c.ReadJSON(&msg)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    91
		if err != nil {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    92
			if strings.Contains(err.Error(), "close 1000 (normal)") {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    93
				break // Connection properly closed
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    94
			}
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    95
			e := fmt.Errorf("read error: %v", err)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
			events <- StreamEvent{Event: "error", Error: e}
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    97
			break
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
		}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
		var obj interface{}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
		// Decode API object
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   103
		switch msg.Event {
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
		case "update":
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   105
			strPayload, ok := msg.Payload.(string)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   106
			if !ok {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   107
				e := fmt.Errorf("could not decode status: payload isn't a string")
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   108
				events <- StreamEvent{Event: "error", Error: e}
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   109
				continue
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   110
			}
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
			var s Status
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   112
			if err := json.Unmarshal([]byte(strPayload), &s); err != nil {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   113
				e := fmt.Errorf("could not decode status: %v", err)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
				events <- StreamEvent{Event: "error", Error: e}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
				continue
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
			}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
			obj = s
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
		case "notification":
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   119
			strPayload, ok := msg.Payload.(string)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   120
			if !ok {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   121
				e := fmt.Errorf("could not decode notification: payload isn't a string")
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   122
				events <- StreamEvent{Event: "error", Error: e}
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   123
				continue
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   124
			}
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   125
			var notif Notification
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   126
			if err := json.Unmarshal([]byte(strPayload), &notif); err != nil {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   127
				e := fmt.Errorf("could not decode notification: %v", err)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   128
				events <- StreamEvent{Event: "error", Error: e}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   129
				continue
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   130
			}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   131
			obj = notif
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   132
		case "delete":
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   133
			floatPayload, ok := msg.Payload.(float64)
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   134
			if !ok {
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   135
				e := fmt.Errorf("could not decode deletion: payload isn't a number")
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   136
				events <- StreamEvent{Event: "error", Error: e}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   137
				continue
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   138
			}
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   139
			obj = int(floatPayload) // statusID
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   140
		default:
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   141
			e := fmt.Errorf("unhandled event '%s'", msg.Event)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   142
			events <- StreamEvent{Event: "error", Error: e}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   143
			continue
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   144
		}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   145
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   146
		// Send event to the channel
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   147
		events <- StreamEvent{Event: msg.Event, Data: obj}
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   148
	}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   149
}
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   150
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   151
// StreamListener listens to a stream from the Mastodon server
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   152
// The stream 'name' can be "user", "local", "public" or "hashtag".
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   153
// For 'hashtag', the hashTag argument cannot be empty.
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   154
// The events are sent to the events channel (the errors as well).
122
50c7733ee886 Change StreamListener prototype
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
   155
// The streaming is terminated if the 'stopCh' channel is closed.
50c7733ee886 Change StreamListener prototype
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
   156
// The 'doneCh' channel is closed if the connection is closed by the server.
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   157
// Please note that this method launches a goroutine to listen to the events.
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   158
func (mc *Client) StreamListener(name, hashTag string, events chan<- StreamEvent, stopCh <-chan bool, doneCh chan bool) error {
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   159
	if mc == nil {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   160
		return ErrUninitializedClient
128
a5a00fad7a32 Add checks for client initialization
Mikael Berthe <mikael@lilotux.net>
parents: 122
diff changeset
   161
	}
a5a00fad7a32 Add checks for client initialization
Mikael Berthe <mikael@lilotux.net>
parents: 122
diff changeset
   162
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   163
	conn, err := mc.openStream(name, hashTag)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   164
	if err != nil {
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   165
		return err
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   166
	}
140
7665451f74cc streams: Use websockets
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   167
	go mc.readStream(events, stopCh, doneCh, conn)
117
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   168
	return nil
7f8ac782cf5d Add streaming API support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   169
}