@@ -41,15 +41,13 @@ func (r *Ref) Listen(ctx context.Context) (*SnapshotIterator, error) {
41
41
return & SnapshotIterator {active : false }, err
42
42
}
43
43
44
- scanner := bufio .NewScanner (resp .Body )
45
-
46
- snapshot , err := getInitialNodeSnapshot (scanner , resp )
44
+ snapshot , err := getInitialNodeSnapshot (resp )
47
45
48
46
if err != nil {
49
47
return & SnapshotIterator {active : false }, err
50
48
}
51
49
52
- go startListening ( scanner , resp , sseDataChan )
50
+ go r . startListeningWithReconnect ( ctx , opts , resp , sseDataChan )
53
51
54
52
return & SnapshotIterator {
55
53
Snapshot : snapshot ,
@@ -61,10 +59,12 @@ func (r *Ref) Listen(ctx context.Context) (*SnapshotIterator, error) {
61
59
} // Listen()
62
60
63
61
// return initial snapshot (JSON-encoded string) from Ref.Path node location
64
- func getInitialNodeSnapshot (scanner * bufio. Scanner , resp * http.Response ) (string , error ) {
62
+ func getInitialNodeSnapshot (resp * http.Response ) (string , error ) {
65
63
66
64
var b []byte
67
65
66
+ scanner := bufio .NewScanner (resp .Body )
67
+
68
68
if scanner .Scan () == true {
69
69
70
70
b = scanner .Bytes ()
@@ -104,7 +104,9 @@ func getInitialNodeSnapshot(scanner *bufio.Scanner, resp *http.Response) (string
104
104
}
105
105
106
106
// called with goroutine
107
- func startListening (scanner * bufio.Scanner , resp * http.Response , sseDataChan chan <- string ) { // sseDataChan send only
107
+ func (r * Ref ) startListeningWithReconnect (ctx context.Context , opts []internal.HTTPOption , resp * http.Response , sseDataChan chan <- string ) {
108
+
109
+ scanner := bufio .NewScanner (resp .Body )
108
110
109
111
var b []byte
110
112
@@ -126,17 +128,36 @@ func startListening(scanner *bufio.Scanner, resp *http.Response, sseDataChan cha
126
128
if s [:5 ] == "data:" {
127
129
// trim 'data: '
128
130
sseDataChan <- s [6 :] // {"path":"/","data":{"test3":{"test4":4}}}
129
-
130
131
}
131
132
}
132
- }
133
+ } else if "event: auth_revoked" == string ( b ) {
133
134
135
+ // reconnect to re-establish authentication every hour
136
+ resp , err := r .sendListen (ctx , "GET" , opts ... )
137
+
138
+ if err == nil {
139
+ // not part of existing continuing listening events, so we don't send to the listening channel
140
+ snapshot , err := getInitialNodeSnapshot (resp )
141
+ _ = snapshot
142
+ _ = err
143
+ }
144
+
145
+ scanner = bufio .NewScanner (resp .Body )
146
+ }
134
147
} else {
148
+ // attemp to reconnect for other connection problems
149
+ resp , err := r .sendListen (ctx , "GET" , opts ... )
150
+
151
+ if err == nil {
152
+ // not part of existing continuing listening events, so we don't send to the listening channel
153
+ snapshot , err := getInitialNodeSnapshot (resp )
154
+ _ = snapshot
155
+ _ = err
156
+ }
135
157
136
- break
158
+ scanner = bufio . NewScanner ( resp . Body )
137
159
}
138
-
139
- } // for
160
+ }
140
161
}
141
162
142
163
// returns path and snapshot
0 commit comments