Integrate BACKBEAT SDK and resolve KACHING license validation

Major integrations and fixes:
- Added BACKBEAT SDK integration for P2P operation timing
- Implemented beat-aware status tracking for distributed operations
- Added Docker secrets support for secure license management
- Resolved KACHING license validation via HTTPS/TLS
- Updated docker-compose configuration for clean stack deployment
- Disabled rollback policies to prevent deployment failures
- Added license credential storage (CHORUS-DEV-MULTI-001)

Technical improvements:
- BACKBEAT P2P operation tracking with phase management
- Enhanced configuration system with file-based secrets
- Improved error handling for license validation
- Clean separation of KACHING and CHORUS deployment stacks

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
anthonyrawlins
2025-09-06 07:56:26 +10:00
parent 543ab216f9
commit 9bdcbe0447
4730 changed files with 1480093 additions and 1916 deletions

View File

@@ -0,0 +1,7 @@
language: go
go:
- 1.13
script:
- go test -race -cpu=5 -v ./...

21
vendor/github.com/jbenet/go-temp-err-catcher/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014 Juan Batiz-Benet
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

78
vendor/github.com/jbenet/go-temp-err-catcher/README.md generated vendored Normal file
View File

@@ -0,0 +1,78 @@
# go-temp-err-catcher
This is a little package to use with your net.Listeners.
Docs: https://godoc.org/github.com/jbenet/go-temp-err-catcher
Get:
go get github.com/jbenet/go-temp-err-catcher
## Examples
It is meant to be used with things like net.Lister.Accept:
```go
import (
tec "github.com/jbenet/go-temp-err-catcher"
)
func listen(listener net.Listener) {
var c tec.TempErrCatcher
for {
conn, err := listener.Accept()
if err != nil && c.IsTemporary(c) {
continue
}
return conn, err
}
}
```
You can make your errors implement `Temporary`:
```go
type errTemp struct {
e error
}
func (e errTemp) Temporary() bool {
return true
}
func (e errTemp) Error() string {
return e.e.Error()
}
err := errors.New("beep boop")
var c tec.TempErrCatcher
c.IsTemporary(err) // false
c.IsTemporary(errTemp{err}) // true
```
Or just use `ErrTemp`:
```go
err := errors.New("beep boop")
var c tec.TempErrCatcher
c.IsTemporary(err) // false
c.IsTemporary(tec.ErrTemp{err}) // true
```
You can also define an `IsTemp` function to classify errors:
```go
var ErrSkip = errors.New("this should be skipped")
var ErrNotSkip = errors.New("this should not be skipped")
var c tec.TempErrCatcher
c.IsTemp = func(e error) bool {
return e == ErrSkip
}
c.IsTemporary(ErrSkip) // true
c.IsTemporary(ErrNotSkip) // false
c.IsTemporary(ErrTemp) // false! no longer accepts Temporary()
```

62
vendor/github.com/jbenet/go-temp-err-catcher/doc.go generated vendored Normal file
View File

@@ -0,0 +1,62 @@
// Package temperrcatcher provides a TempErrCatcher object,
// which implements simple error-retrying functionality.
// It is meant to be used with things like net.Lister.Accept:
//
// import (
// tec "github.com/jbenet/go-temp-err-catcher"
// )
//
// func listen(listener net.Listener) {
// var c tec.TempErrCatcher
//
// for {
// conn, err := listener.Accept()
// if err != nil && c.IsTemporary(c) {
// continue
// }
// return conn, err
// }
// }
//
// You can make your errors implement `Temporary`:
//
// type errTemp struct {
// e error
// }
//
// func (e errTemp) Temporary() bool {
// return true
// }
//
// func (e errTemp) Error() string {
// return e.e.Error()
// }
//
// err := errors.New("beep boop")
// var c tec.TempErrCatcher
// c.IsTemporary(err) // false
// c.IsTemporary(errTemp{err}) // true
//
// Or just use `ErrTemp`:
//
// err := errors.New("beep boop")
// var c tec.TempErrCatcher
// c.IsTemporary(err) // false
// c.IsTemporary(tec.ErrTemp{err}) // true
//
//
// You can also define an `IsTemp` function to classify errors:
//
// var ErrSkip = errors.New("this should be skipped")
// var ErrNotSkip = errors.New("this should not be skipped")
//
// var c tec.TempErrCatcher
// c.IsTemp = func(e error) bool {
// return e == ErrSkip
// }
//
// c.IsTemporary(ErrSkip) // true
// c.IsTemporary(ErrNotSkip) // false
// c.IsTemporary(ErrTemp) // false! no longer accepts Temporary()
//
package temperrcatcher

View File

@@ -0,0 +1,126 @@
// Package temperrcatcher provides a TempErrCatcher object,
// which implements simple error-retrying functionality.
package temperrcatcher
import (
"errors"
"time"
)
// InitialDelay governs how long to wait the first time.
// This is defaulted to time.Millisecond, which makes sense
// for network listener failures. You may want a much smaller
// delay. You can configure this package wide, or in each
// TempErrCatcher
var InitialDelay = time.Millisecond
// Temporary is an interface errors can implement to
// ensure they are correctly classified by the default
// TempErrCatcher classifier
type Temporary interface {
Temporary() bool
}
// ErrIsTemporary returns whether an error is Temporary(),
// iff it implements the Temporary interface.
func ErrIsTemporary(e error) bool {
var te Temporary
ok := errors.As(e, &te)
return ok && te.Temporary()
}
// TempErrCatcher catches temporary errors for you. It then sleeps
// for a bit before returning (you should then try again). This may
// seem odd, but it's exactly what net/http does:
// http://golang.org/src/net/http/server.go?s=51504:51550#L1728
//
// You can set a few options in TempErrCatcher. They all have defaults
// so a zero TempErrCatcher is ready to be used:
//
// var c tec.TempErrCatcher
// c.IsTemporary(tempErr)
//
type TempErrCatcher struct {
IsTemp func(error) bool // the classifier to use. default: ErrIsTemporary
Wait func(time.Duration) // the wait func to call. default: time.Sleep
Max time.Duration // the maximum time to wait. default: time.Second
Start time.Duration // the delay to start with. default: InitialDelay
delay time.Duration
last time.Time
}
func (tec *TempErrCatcher) init() {
if tec.Max == 0 {
tec.Max = time.Second
}
if tec.IsTemp == nil {
tec.IsTemp = ErrIsTemporary
}
if tec.Wait == nil {
tec.Wait = time.Sleep
}
if tec.Start == 0 {
tec.Start = InitialDelay
}
}
// IsTemporary checks whether an error is temporary. It will call
// tec.Wait before returning, with a delay. The delay is also
// doubled, so we do not constantly spin. This is the strategy
// net.Listener uses.
//
// Note: you will want to call Reset() if you get a success,
// so that the stored delay is brough back to 0.
func (tec *TempErrCatcher) IsTemporary(e error) bool {
tec.init()
if tec.IsTemp(e) {
now := time.Now()
if now.Sub(tec.last) > (tec.delay * 5) {
// this is a "new streak" of temp failures. reset.
tec.Reset()
}
if tec.delay == 0 { // init case.
tec.delay = tec.Start
} else {
tec.delay *= 2
}
if tec.delay > tec.Max {
tec.delay = tec.Max
}
tec.Wait(tec.delay)
tec.last = now
return true
}
tec.Reset() // different failure. call reset
return false
}
// Reset sets the internal delay counter to 0
func (tec *TempErrCatcher) Reset() {
tec.delay = 0
}
// ErrTemporary wraps any error and implements Temporary function.
//
// err := errors.New("beep boop")
// var c tec.TempErrCatcher
// c.IsTemporary(err) // false
// c.IsTemporary(tec.ErrTemp{err}) // true
//
type ErrTemporary struct {
Err error
}
func (e ErrTemporary) Temporary() bool {
return true
}
func (e ErrTemporary) Error() string {
return e.Err.Error()
}
func (e ErrTemporary) String() string {
return e.Error()
}