11package events
22
33import (
4+ "context"
5+ "time"
6+
47 "github.com/spf13/cobra"
58
69 "github.com/eyetowers/gonvif/cmd/gonvif/root"
@@ -9,6 +12,15 @@ import (
912 "github.com/eyetowers/gonvif/pkg/gonvif"
1013)
1114
15+ const (
16+ unsubscribeTimeout = 2 * time .Second
17+ pollTimeout = "PT60S"
18+ )
19+
20+ var (
21+ subscriptionTimeout wsnt.AbsoluteOrRelativeTimeType = "PT120S"
22+ )
23+
1224var streamEvents = & cobra.Command {
1325 Use : "stream-events" ,
1426 Short : "Stream live Onvif events from the device." ,
@@ -27,7 +39,9 @@ func runStreamEvents(client gonvif.Client) error {
2739 if err != nil {
2840 return err
2941 }
30- resp , err := events .CreatePullPointSubscription (& wsdl.CreatePullPointSubscription {})
42+ resp , err := events .CreatePullPointSubscription (& wsdl.CreatePullPointSubscription {
43+ InitialTerminationTime : & subscriptionTimeout ,
44+ })
3145 if err != nil {
3246 return err
3347 }
@@ -40,19 +54,28 @@ func runStreamEvents(client gonvif.Client) error {
4054}
4155
4256func processEvents (subscription wsdl.PullPointSubscription ) error {
57+ defer func () { _ = unsubscribe (subscription ) }()
4358 for {
44- resp , err := subscription .PullMessages (& wsdl.PullMessages {MessageLimit : 100 , Timeout : "PT60S" })
59+ resp , err := subscription .PullMessages (& wsdl.PullMessages {MessageLimit : 100 , Timeout : pollTimeout })
4560 if err != nil {
4661 return err
4762 }
4863 err = root .OutputJSON (resp )
4964 if err != nil {
5065 return err
5166 }
52- var time wsnt.AbsoluteOrRelativeTimeType = "PT120S"
53- _ , err = subscription .Renew (& wsnt.Renew {TerminationTime : & time })
67+ _ , err = subscription .Renew (& wsnt.Renew {TerminationTime : & subscriptionTimeout })
5468 if err != nil {
5569 return err
5670 }
5771 }
5872}
73+
74+ func unsubscribe (subscription wsdl.PullPointSubscription ) error {
75+ ctx , cancel := context .WithTimeout (context .Background (), unsubscribeTimeout )
76+ defer cancel ()
77+
78+ var empty wsdl.EmptyString
79+ _ , err := subscription .UnsubscribeContext (ctx , & empty )
80+ return err
81+ }
0 commit comments