Skip to content

Commit afb6c59

Browse files
committed
Unsubscribe pull point subscription to prevent exhausting pull points limit.
1 parent 065a30b commit afb6c59

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

cmd/gonvif/events/stream-events.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package events
22

33
import (
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+
1224
var 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

4256
func 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

Comments
 (0)