More refactoring; eventstream is working, but still needs work.
This commit is contained in:
parent
011447ef60
commit
930ecd3bad
4
Gopkg.lock
generated
4
Gopkg.lock
generated
@ -11,11 +11,11 @@
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:63eb8e7863bcc41b162d76c3e1b5dd4991fd01f29585017b3a8bab7a5928edd3"
|
||||
digest = "1:b44621ef75eb48a8c09e7d6ce4d3f6681534307189c9bc0267c9532094c20a2a"
|
||||
name = "github.com/r3labs/sse"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "ad82e5b42970ce737f0ce61490a1607331299496"
|
||||
revision = "507597500aa545836a85909d89a59e50d260f366"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
|
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
2
arlo.go
2
arlo.go
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
import (
|
||||
"github.com/jeffreydwalter/arlo-golang/internal/request"
|
||||
|
@ -1 +1 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
@ -1,9 +1,8 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/jeffreydwalter/arlo-golang/internal/util"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@ -43,7 +42,7 @@ type Basestation struct {
|
||||
type Basestations []Basestation
|
||||
|
||||
func (b *Basestation) Subscribe() (*Status, error) {
|
||||
b.eventStream = NewEventStream(BaseUrl+fmt.Sprintf(SubscribeUri, b.arlo.Account.Token), b.arlo.client.HttpClient, util.HeaderToMap(*b.arlo.client.BaseHttpHeader))
|
||||
b.eventStream = NewEventStream(BaseUrl+fmt.Sprintf(SubscribeUri, b.arlo.Account.Token), b.arlo.client.HttpClient)
|
||||
b.eventStream.Listen()
|
||||
|
||||
transId := GenTransId()
|
||||
@ -71,22 +70,6 @@ func (b *Basestation) Subscribe() (*Status, error) {
|
||||
return &status, nil
|
||||
}
|
||||
|
||||
/*
|
||||
This is an example of the json you would pass in the body to UpdateFriends():
|
||||
{
|
||||
"firstName":"Some",
|
||||
"lastName":"Body",
|
||||
"devices":{
|
||||
"XXXXXXXXXXXXX":"Camera 1",
|
||||
"XXXXXXXXXXXXX":"Camera 2 ",
|
||||
"XXXXXXXXXXXXX":"Camera 3"
|
||||
},
|
||||
"lastModified":1463977440911,
|
||||
"adminUser":true,
|
||||
"email":"user@example.com",
|
||||
"id":"XXX-XXXXXXX"
|
||||
}
|
||||
*/
|
||||
func (b *Basestation) GetState() (*NotifyResponse, error) {
|
||||
|
||||
transId := GenTransId()
|
||||
@ -100,11 +83,7 @@ func (b *Basestation) GetState() (*NotifyResponse, error) {
|
||||
To: b.DeviceId,
|
||||
}
|
||||
|
||||
//fmt.Printf("BODY: %+v\n", body)
|
||||
//fmt.Printf("HEADERS: %+v\n", a.client.BaseHttpHeader)
|
||||
|
||||
fmt.Println("Subscribing to the eventstream.")
|
||||
b.eventStream.Subscriptions[transId] = new(Subscriber)
|
||||
b.eventStream.Subscriptions[transId] = make(chan *NotifyResponse)
|
||||
|
||||
resp, err := b.arlo.client.Post(fmt.Sprintf(NotifyUri, b.DeviceId), body, nil)
|
||||
if err != nil {
|
||||
@ -120,6 +99,37 @@ func (b *Basestation) GetState() (*NotifyResponse, error) {
|
||||
return nil, errors.New("failed to get basestation status")
|
||||
}
|
||||
|
||||
notifyResponse := <-*b.eventStream.Subscriptions[transId]
|
||||
return ¬ifyResponse, nil
|
||||
return <-b.eventStream.Subscriptions[transId], nil
|
||||
}
|
||||
|
||||
func (b *Basestation) GetCameraState() (*NotifyResponse, error) {
|
||||
|
||||
transId := GenTransId()
|
||||
|
||||
body := NotifyPayload{
|
||||
Action: "get",
|
||||
Resource: "cameras",
|
||||
PublishResponse: false,
|
||||
TransId: transId,
|
||||
From: fmt.Sprintf("%s_%s", b.UserId, TransIdPrefix),
|
||||
To: b.DeviceId,
|
||||
}
|
||||
|
||||
b.eventStream.Subscriptions[transId] = make(chan *NotifyResponse)
|
||||
|
||||
resp, err := b.arlo.client.Post(fmt.Sprintf(NotifyUri, b.DeviceId), body, nil)
|
||||
if err != nil {
|
||||
return nil, errors.WithMessage(err, "failed to get basestation state")
|
||||
}
|
||||
|
||||
var status Status
|
||||
if err := resp.Decode(&status); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !status.Success {
|
||||
return nil, errors.New("failed to get basestation status")
|
||||
}
|
||||
|
||||
return <-b.eventStream.Subscriptions[transId], nil
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
// A Camera is a Device of type "camera".
|
||||
// This type is here just for semantics. Some methods explicitly require a device of a certain type.
|
||||
|
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
@ -18,31 +18,27 @@ var (
|
||||
FAILED_TO_SUBSCRIBE = errors.New("Failed to subscribe to SSEClient")
|
||||
)
|
||||
|
||||
type Subscriber chan NotifyResponse
|
||||
|
||||
type EventStream struct {
|
||||
SSEClient *sse.Client
|
||||
Subscriptions map[string]chan *NotifyResponse
|
||||
Events chan *sse.Event
|
||||
ErrorChan chan error
|
||||
Registered bool
|
||||
Connected bool
|
||||
SSEClient *sse.Client
|
||||
Events chan *sse.Event
|
||||
Subscriptions map[string]*Subscriber
|
||||
ErrorChan chan error
|
||||
Responses map[string]NotifyResponse
|
||||
Verbose bool
|
||||
|
||||
sync.Mutex
|
||||
}
|
||||
|
||||
func NewEventStream(url string, client *http.Client, headers map[string]string) *EventStream {
|
||||
func NewEventStream(url string, client *http.Client) *EventStream {
|
||||
|
||||
SSEClient := sse.NewClient(url)
|
||||
SSEClient.Connection = client
|
||||
SSEClient.Headers = headers
|
||||
|
||||
return &EventStream{
|
||||
SSEClient: SSEClient,
|
||||
Events: make(chan *sse.Event),
|
||||
Subscriptions: map[string]*Subscriber{},
|
||||
Subscriptions: make(map[string]chan *NotifyResponse),
|
||||
ErrorChan: make(chan error, 1),
|
||||
}
|
||||
}
|
||||
@ -59,9 +55,11 @@ func (e *EventStream) Listen() {
|
||||
|
||||
go func() {
|
||||
for event := range e.Events {
|
||||
fmt.Println("Got event message.")
|
||||
fmt.Printf("EVENT: %X\n", event.Event)
|
||||
fmt.Printf("DATA: %X\n", event.Data)
|
||||
/*
|
||||
fmt.Println("Got event message.")
|
||||
fmt.Printf("EVENT: %s\n", event.Event)
|
||||
fmt.Printf("DATA: %s\n", event.Data)
|
||||
*/
|
||||
|
||||
if event.Data != nil {
|
||||
notifyResponse := &NotifyResponse{}
|
||||
@ -72,28 +70,19 @@ func (e *EventStream) Listen() {
|
||||
break
|
||||
}
|
||||
|
||||
fmt.Printf("%s\n", notifyResponse)
|
||||
if notifyResponse.Status == "connected" {
|
||||
fmt.Println("Connected.")
|
||||
e.Connected = true
|
||||
} else if notifyResponse.Status == "disconnected" {
|
||||
fmt.Println("Disconnected.")
|
||||
e.Connected = false
|
||||
} else {
|
||||
fmt.Printf("Message for transId: %s\n", notifyResponse.TransId)
|
||||
if subscriber, ok := e.Subscriptions[notifyResponse.TransId]; ok {
|
||||
e.Lock()
|
||||
*subscriber <- *notifyResponse
|
||||
close(*subscriber)
|
||||
subscriber <- notifyResponse
|
||||
close(subscriber)
|
||||
delete(e.Subscriptions, notifyResponse.TransId)
|
||||
e.Unlock()
|
||||
} else {
|
||||
// Throw away the message.
|
||||
fmt.Println("Throwing away message.")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("Event data was nil.\n")
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
@ -1,4 +1,4 @@
|
||||
package arlo_golang
|
||||
package arlo
|
||||
|
||||
// UpdateResponse is an intermediate struct used when parsing data from the UpdateProfile() call.
|
||||
type Status struct {
|
||||
|
Loading…
Reference in New Issue
Block a user