From 0f5ad8375050edf6885f5a9c2a561ad21968d642 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 7 Dec 2024 14:22:06 +0100 Subject: [PATCH] Golang/ Javascript plugins: make errors permanent (#17631) --- provider/go.go | 2 ++ provider/javascript.go | 11 ++++++++++- provider/pipeline/pipeline.go | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/provider/go.go b/provider/go.go index cbcf7452a..ce585c9e7 100644 --- a/provider/go.go +++ b/provider/go.go @@ -6,6 +6,7 @@ import ( "fmt" "reflect" + "github.com/cenkalti/backoff/v4" "github.com/evcc-io/evcc/provider/golang" "github.com/evcc-io/evcc/util" "github.com/traefik/yaegi/interp" @@ -167,6 +168,7 @@ func (p *Go) evaluate() (res any, err error) { if r := recover(); r != nil { err = fmt.Errorf("panic: %v", r) } + err = backoff.Permanent(err) }() v, err := p.vm.Eval(p.script) diff --git a/provider/javascript.go b/provider/javascript.go index c36fc5946..27dc443e2 100644 --- a/provider/javascript.go +++ b/provider/javascript.go @@ -2,7 +2,9 @@ package provider import ( "context" + "fmt" + "github.com/cenkalti/backoff/v4" "github.com/evcc-io/evcc/provider/javascript" "github.com/evcc-io/evcc/util" "github.com/robertkrimen/otto" @@ -147,7 +149,14 @@ func (p *Javascript) handleSetter(param string, val any) error { return transformOutputs(p.out, v) } -func (p *Javascript) evaluate() (any, error) { +func (p *Javascript) evaluate() (res any, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("panic: %v", r) + } + err = backoff.Permanent(err) + }() + v, err := p.vm.Eval(p.script) if err != nil { return nil, err diff --git a/provider/pipeline/pipeline.go b/provider/pipeline/pipeline.go index 00ef6de40..467d006db 100644 --- a/provider/pipeline/pipeline.go +++ b/provider/pipeline/pipeline.go @@ -9,6 +9,7 @@ import ( "strings" xj "github.com/basgys/goxml2json" + "github.com/cenkalti/backoff/v4" "github.com/evcc-io/evcc/util" "github.com/evcc-io/evcc/util/jq" "github.com/itchyny/gojq" @@ -185,7 +186,7 @@ func (p *Pipeline) Process(in []byte) ([]byte, error) { if p.jq != nil { v, err := jq.Query(p.jq, b) if err != nil { - return b, err + return b, backoff.Permanent(err) } b = []byte(fmt.Sprintf("%v", v)) }