return states, nil
}
-func (g *gateway) action(ctx context.Context, mac string, action Action) (State, error) {
- err := g.wait(ctx)
- if err != nil {
- return State{}, fmt.Errorf("wait for action slot: %w", err)
- }
-
- ctx, cancel := context.WithTimeout(ctx, gatewayExchangeTimeout)
- defer cancel()
-
- state, err := g.client.Action(ctx, mac, action)
- if err != nil {
- return State{}, fmt.Errorf("exchange gateway action: %w", err)
- }
-
- return state, nil
-}
-
func (g *gateway) wait(ctx context.Context) error {
err := ctx.Err()
if err != nil {
return err
}
+ deadline, exists := ctx.Deadline()
+ if exists && !time.Now().Before(deadline) {
+ return context.DeadlineExceeded
+ }
+
g.nextStart = time.Now().Add(gatewayRequestInterval)
return nil
}
+
+func (g *gateway) action(ctx context.Context, mac string, action Action) (State, error) {
+ err := g.wait(ctx)
+ if err != nil {
+ return State{}, fmt.Errorf("wait for action slot: %w", err)
+ }
+
+ ctx, cancel := context.WithTimeout(ctx, gatewayExchangeTimeout)
+ defer cancel()
+
+ state, err := g.client.Action(ctx, mac, action)
+ if err != nil {
+ return State{}, fmt.Errorf("exchange gateway action: %w", err)
+ }
+
+ return state, nil
+}