Live video on the AT Protocol

add and fix errors reported by golangci-lint (#184)

* add and fix errors reported by golangci-lint

* Update pkg/media/media_data_parser.go

Co-authored-by: Eli Mallon <eli@stream.place>

* chore: linting tweaks

* chore: last few linting things

* chore: golangci-lint v2

* chore: golangci-lint changed a few things

* media: fix audio_smear context cancel

* chore: update captilization of vars to match

* github action: add golangci-lint github action

* github action: build dependencies for golangci to run

* github action: ope fix the ordering of steps

* github action: set in-container-cmd

* add and fix errors reported by golangci-lint

* Update pkg/media/media_data_parser.go

Co-authored-by: Eli Mallon <eli@stream.place>

* chore: linting tweaks

* chore: last few linting things

* chore: golangci-lint v2

* chore: golangci-lint changed a few things

* media: fix audio_smear context cancel

* chore: update captilization of vars to match

* github action: add golangci-lint github action

* github action: build dependencies for golangci to run

* github action: ope fix the ordering of steps

* github action: set in-container-cmd

* test: try and run without building everything again

* test: set CGO_ENABLED env

* test: set up minimal env to run with linting

* test: install meson

* test: build in container

* test?

* do everything in the action runner

* do everything in the action runner

* revert removing n

* clone with tag

* set test tag?

* use meson from pip

* copy from builder dockerfile

* remove nuget

* is missing part

* build: golangci-lint inna container

* build: fake build for golangci-lint

* lmao

* fix linting errors, add precommit hook

* linting polish

* linting: fix selftest

---------

Co-authored-by: Eli Mallon <eli@stream.place>
Co-authored-by: Eli Mallon <eli@aquareum.tv>

authored by seiso.moe

Eli Mallon
Eli Mallon
and committed by
GitHub
4afc87bf 88572304

+1363 -516
+1 -1
.ci/dockerfile-hash.yaml
··· 1 1 variables: 2 - DOCKERFILE_HASH: 8f02476e6d54c58386f461a8b2cffe2b2d53a9bd 2 + DOCKERFILE_HASH: 583418b2ecd509eceb3afbf4dffd40013fe24983
+30
.github/workflows/golangci-lint.yaml
··· 1 + name: golangci-lint 2 + 3 + on: 4 + push: 5 + pull_request: 6 + 7 + jobs: 8 + golangci: 9 + name: lint 10 + runs-on: ubuntu-latest 11 + steps: 12 + - name: Check out code 13 + uses: actions/checkout@v4.1.7 14 + with: 15 + fetch-depth: 0 16 + fetch-tags: true 17 + ref: ${{ github.event.pull_request.head.sha }} 18 + 19 + - name: run build for linting 20 + run: | 21 + sudo apt install podman -y 22 + sudo ln -s $(realpath ./hack/golangci-lint) /usr/bin/golangci-lint 23 + make golangci-lint-container 24 + 25 + - name: golangci-lint 26 + uses: golangci/golangci-lint-action@v8 27 + with: 28 + version: v2.1 29 + args: --config=./.golangci.yaml 30 + install-mode: none
+19
.golangci.yaml
··· 1 + version: "2" 2 + linters: 3 + settings: 4 + staticcheck: 5 + checks: 6 + - all 7 + - -QF1003 # "could use tagged switch" 8 + disable: 9 + - unused 10 + exclusions: 11 + generated: lax 12 + presets: 13 + - comments 14 + - common-false-positives 15 + - legacy 16 + - std-error-handling 17 + formatters: 18 + exclusions: 19 + generated: lax
+1
.husky/pre-commit
··· 1 + make golangci-lint 1 2 ./node_modules/.bin/lint-staged 2 3 cd js/app && yarn run check 3 4
+8 -1
.vscode/settings.json
··· 9 9 "avfilter.h": "c" 10 10 }, 11 11 "mesonbuild.configureOnOpen": false, 12 - "cSpell.words": ["Devplace", "streamplace", "webrtc"] 12 + "cSpell.words": ["Devplace", "streamplace", "webrtc"], 13 + "go.lintTool": "golangci-lint", 14 + "go.lintFlags": ["--path-mode=abs", "--fast-only"], 15 + "go.formatTool": "custom", 16 + "go.alternateTools": { 17 + "customFormatter": "golangci-lint" 18 + }, 19 + "go.formatFlags": ["fmt", "--stdin"] 13 20 }
+20
Makefile
··· 69 69 DYLD_LIBRARY_PATH=$(SHARED_DYLD_LIBRARY_PATH) \ 70 70 go build -o $(BUILDDIR)/libstreamplace ./cmd/libstreamplace/... 71 71 72 + .PHONY: golangci-lint 73 + golangci-lint: 74 + @PKG_CONFIG_PATH=$(SHARED_PKG_CONFIG_PATH) \ 75 + go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint run -c ./.golangci.yaml 76 + 72 77 .PHONY: dev-test 73 78 dev-test: 74 79 PKG_CONFIG_PATH=$(SHARED_PKG_CONFIG_PATH) \ ··· 454 459 docker-build-builder: 455 460 podman build --target=builder --os=linux --arch=amd64 -f docker/build.Dockerfile -t dist.stream.place/streamplace/streamplace:builder . 456 461 462 + .PHONY: golangci-lint-container 463 + golangci-lint-container: docker-build-builder 464 + podman run \ 465 + -v $$(pwd):$$(pwd) \ 466 + -w $$(pwd) \ 467 + -e PKG_CONFIG_PATH=$$(pwd)/build-linux-amd64/meson-uninstalled \ 468 + -d \ 469 + --name golangci-lint \ 470 + dist.stream.place/streamplace/streamplace:builder \ 471 + tail -f /dev/null 472 + podman exec golangci-lint mkdir -p js/app/dist 473 + podman exec golangci-lint touch js/app/dist/skip-build.txt 474 + podman exec golangci-lint make node 475 + 457 476 .PHONY: docker-build-in-container 458 477 docker-build-in-container: 459 478 podman run -v $$(pwd):$$(pwd) -w $$(pwd) --rm -it dist.stream.place/streamplace/streamplace:builder make app-and-node ··· 560 579 561 580 .PHONY: check 562 581 check: install 582 + $(MAKE) golangci-lint 563 583 yarn run check 564 584 if [ "`gofmt -l . | wc -l`" -gt 0 ]; then echo 'gofmt failed, run make fix'; exit 1; fi 565 585
+5
docker/build.Dockerfile
··· 80 80 # && cd .. \ 81 81 # && rm -rf streamplace 82 82 83 + RUN curl -L https://github.com/golangci/golangci-lint/releases/download/v2.1.6/golangci-lint-2.1.6-linux-amd64.tar.gz -o golangci-lint.tar.gz \ 84 + && tar -xf golangci-lint.tar.gz \ 85 + && mv golangci-lint-2.1.6-linux-amd64/golangci-lint /usr/local/bin/ \ 86 + && rm -rf golangci-lint.tar.gz golangci-lint-2.1.6-linux-amd64 87 + 83 88 LABEL org.opencontainers.image.authors="support@stream.place"
+198 -29
go.mod
··· 26 26 github.com/go-gst/go-gst v1.4.0 27 27 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 28 28 github.com/golang/glog v1.2.4 29 + github.com/golangci/golangci-lint/v2 v2.1.6 29 30 github.com/google/uuid v1.6.0 30 31 github.com/gorilla/websocket v1.5.3 31 32 github.com/ipfs/go-cid v0.4.1 ··· 59 60 go.uber.org/goleak v1.3.0 60 61 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 61 62 golang.org/x/image v0.22.0 62 - golang.org/x/net v0.35.0 63 - golang.org/x/sync v0.11.0 64 - golang.org/x/term v0.29.0 65 - golang.org/x/time v0.8.0 66 - golang.org/x/tools v0.25.0 63 + golang.org/x/net v0.39.0 64 + golang.org/x/sync v0.13.0 65 + golang.org/x/term v0.31.0 66 + golang.org/x/time v0.11.0 67 + golang.org/x/tools v0.32.0 67 68 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 68 - google.golang.org/api v0.189.0 69 + google.golang.org/api v0.228.0 69 70 gorm.io/datatypes v1.2.4 70 71 gorm.io/driver/sqlite v1.5.7 71 72 ) ··· 74 75 github.com/jinzhu/inflection v1.0.0 // indirect 75 76 github.com/jinzhu/now v1.1.5 // indirect 76 77 github.com/mattn/go-isatty v0.0.20 77 - golang.org/x/sys v0.31.0 // indirect 78 + golang.org/x/sys v0.32.0 // indirect 78 79 gorm.io/gorm v1.26.1 79 80 ) 80 81 ··· 86 87 ) 87 88 88 89 require ( 89 - cloud.google.com/go v0.115.0 // indirect 90 - cloud.google.com/go/auth v0.7.2 // indirect 91 - cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect 90 + 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect 91 + 4d63.com/gochecknoglobals v0.2.2 // indirect 92 + cloud.google.com/go v0.116.0 // indirect 93 + cloud.google.com/go/auth v0.15.0 // indirect 94 + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect 92 95 cloud.google.com/go/compute/metadata v0.6.0 // indirect 93 - cloud.google.com/go/firestore v1.15.0 // indirect 94 - cloud.google.com/go/iam v1.1.10 // indirect 95 - cloud.google.com/go/longrunning v0.5.9 // indirect 96 - cloud.google.com/go/storage v1.41.0 // indirect 96 + cloud.google.com/go/firestore v1.16.0 // indirect 97 + cloud.google.com/go/iam v1.2.0 // indirect 98 + cloud.google.com/go/longrunning v0.6.0 // indirect 99 + cloud.google.com/go/storage v1.43.0 // indirect 97 100 dario.cat/mergo v1.0.0 // indirect 98 101 filippo.io/edwards25519 v1.1.0 // indirect 102 + github.com/4meepo/tagalign v1.4.2 // indirect 103 + github.com/Abirdcfly/dupword v0.1.3 // indirect 104 + github.com/Antonboom/errname v1.1.0 // indirect 105 + github.com/Antonboom/nilnil v1.1.0 // indirect 106 + github.com/Antonboom/testifylint v1.6.1 // indirect 99 107 github.com/AxisCommunications/go-dpop v1.1.2 // indirect 100 - github.com/BurntSushi/toml v1.4.0 // indirect 108 + github.com/BurntSushi/toml v1.5.0 // indirect 109 + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect 110 + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect 111 + github.com/Masterminds/semver/v3 v3.3.1 // indirect 101 112 github.com/MicahParks/keyfunc v1.9.0 // indirect 102 113 github.com/Microsoft/go-winio v0.6.2 // indirect 114 + github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect 103 115 github.com/ProtonMail/go-crypto v1.0.0 // indirect 104 116 github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b // indirect 105 117 github.com/agnivade/levenshtein v1.2.0 // indirect 118 + github.com/alecthomas/chroma/v2 v2.17.2 // indirect 119 + github.com/alecthomas/go-check-sumtype v0.3.1 // indirect 120 + github.com/alexkohler/nakedret/v2 v2.0.6 // indirect 121 + github.com/alexkohler/prealloc v1.0.0 // indirect 122 + github.com/alingse/asasalint v0.0.11 // indirect 123 + github.com/alingse/nilnesserr v0.2.0 // indirect 124 + github.com/ashanbrown/forbidigo v1.6.0 // indirect 125 + github.com/ashanbrown/makezero v1.2.0 // indirect 126 + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect 106 127 github.com/beorn7/perks v1.0.1 // indirect 107 128 github.com/bits-and-blooms/bitset v1.10.0 // indirect 129 + github.com/bkielbasa/cyclop v1.2.3 // indirect 130 + github.com/blizzy78/varnamelen v0.8.0 // indirect 131 + github.com/bombsimon/wsl/v4 v4.7.0 // indirect 132 + github.com/breml/bidichk v0.3.3 // indirect 133 + github.com/breml/errchkjson v0.4.1 // indirect 108 134 github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect 135 + github.com/butuzov/ireturn v0.4.0 // indirect 136 + github.com/butuzov/mirror v1.3.0 // indirect 109 137 github.com/carlmjohnson/versioninfo v0.22.5 // indirect 138 + github.com/catenacyber/perfsprint v0.9.1 // indirect 139 + github.com/ccojocar/zxcvbn-go v1.0.2 // indirect 110 140 github.com/cenkalti/backoff/v4 v4.3.0 // indirect 111 141 github.com/cespare/xxhash/v2 v2.3.0 // indirect 142 + github.com/charithe/durationcheck v0.0.10 // indirect 143 + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect 144 + github.com/charmbracelet/lipgloss v1.1.0 // indirect 145 + github.com/charmbracelet/x/ansi v0.8.0 // indirect 146 + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect 147 + github.com/charmbracelet/x/term v0.2.1 // indirect 148 + github.com/chavacava/garif v0.1.0 // indirect 149 + github.com/ckaznocha/intrange v0.3.1 // indirect 112 150 github.com/cloudflare/circl v1.3.7 // indirect 113 151 github.com/consensys/bavard v0.1.13 // indirect 114 152 github.com/consensys/gnark-crypto v0.12.1 // indirect 115 - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect 153 + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect 116 154 github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect 155 + github.com/curioswitch/go-reassign v0.3.0 // indirect 117 156 github.com/cyphar/filepath-securejoin v0.2.4 // indirect 157 + github.com/daixiang0/gci v0.13.6 // indirect 158 + github.com/dave/dst v0.27.3 // indirect 118 159 github.com/deckarep/golang-set/v2 v2.6.0 // indirect 119 160 github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0 // indirect 120 161 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect 162 + github.com/denis-tingaikin/go-header v0.5.0 // indirect 163 + github.com/dlclark/regexp2 v1.11.5 // indirect 121 164 github.com/emirpasic/gods v1.18.1 // indirect 122 165 github.com/ethereum/c-kzg-4844 v1.0.0 // indirect 166 + github.com/ettle/strcase v0.2.0 // indirect 167 + github.com/fatih/color v1.18.0 // indirect 168 + github.com/fatih/structtag v1.2.0 // indirect 123 169 github.com/felixge/httpsnoop v1.0.4 // indirect 170 + github.com/firefart/nonamedreturns v1.0.6 // indirect 124 171 github.com/fsnotify/fsnotify v1.6.0 // indirect 172 + github.com/fzipp/gocyclo v0.6.0 // indirect 173 + github.com/ghostiam/protogetter v0.3.15 // indirect 174 + github.com/go-critic/go-critic v0.13.0 // indirect 125 175 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect 126 176 github.com/go-git/go-billy/v5 v5.5.0 // indirect 127 177 github.com/go-logr/logr v1.4.2 // indirect 128 178 github.com/go-logr/stdr v1.2.2 // indirect 129 179 github.com/go-sql-driver/mysql v1.8.1 // indirect 180 + github.com/go-toolsmith/astcast v1.1.0 // indirect 181 + github.com/go-toolsmith/astcopy v1.1.0 // indirect 182 + github.com/go-toolsmith/astequal v1.2.0 // indirect 183 + github.com/go-toolsmith/astfmt v1.1.0 // indirect 184 + github.com/go-toolsmith/astp v1.1.0 // indirect 185 + github.com/go-toolsmith/strparse v1.1.0 // indirect 186 + github.com/go-toolsmith/typep v1.1.0 // indirect 187 + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect 188 + github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect 189 + github.com/gobwas/glob v0.2.3 // indirect 130 190 github.com/goccy/go-json v0.10.3 // indirect 131 191 github.com/gocql/gocql v1.7.0 // indirect 192 + github.com/gofrs/flock v0.12.1 // indirect 132 193 github.com/gogo/protobuf v1.3.2 // indirect 133 194 github.com/golang-jwt/jwt/v4 v4.5.0 // indirect 134 195 github.com/golang-jwt/jwt/v5 v5.2.2 // indirect 135 196 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect 136 197 github.com/golang/protobuf v1.5.4 // indirect 137 198 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect 138 - github.com/google/s2a-go v0.1.7 // indirect 139 - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect 140 - github.com/googleapis/gax-go/v2 v2.12.5 // indirect 199 + github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect 200 + github.com/golangci/go-printf-func-name v0.1.0 // indirect 201 + github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect 202 + github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect 203 + github.com/golangci/misspell v0.6.0 // indirect 204 + github.com/golangci/plugin-module-register v0.1.1 // indirect 205 + github.com/golangci/revgrep v0.8.0 // indirect 206 + github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect 207 + github.com/google/go-cmp v0.7.0 // indirect 208 + github.com/google/s2a-go v0.1.9 // indirect 209 + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect 210 + github.com/googleapis/gax-go/v2 v2.14.1 // indirect 211 + github.com/gordonklaus/ineffassign v0.1.0 // indirect 212 + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect 213 + github.com/gostaticanalysis/comment v1.5.0 // indirect 214 + github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect 215 + github.com/gostaticanalysis/nilerr v0.1.1 // indirect 141 216 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect 142 217 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect 143 218 github.com/hashicorp/errwrap v1.1.0 // indirect 144 219 github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 220 + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect 145 221 github.com/hashicorp/go-multierror v1.1.1 // indirect 146 222 github.com/hashicorp/go-retryablehttp v0.7.5 // indirect 147 - github.com/hashicorp/go-version v1.4.0 // indirect 223 + github.com/hashicorp/go-version v1.7.0 // indirect 148 224 github.com/hashicorp/golang-lru v1.0.2 // indirect 149 225 github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect 226 + github.com/hashicorp/hcl v1.0.0 // indirect 227 + github.com/hexops/gotextdiff v1.0.3 // indirect 150 228 github.com/holiman/uint256 v1.3.0 // indirect 229 + github.com/inconshreveable/mousetrap v1.1.0 // indirect 151 230 github.com/ipfs/bbloom v0.0.4 // indirect 152 231 github.com/ipfs/go-block-format v0.2.0 // indirect 153 232 github.com/ipfs/go-blockservice v0.5.2 // indirect ··· 174 253 github.com/jackc/puddle/v2 v2.2.1 // indirect 175 254 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect 176 255 github.com/jbenet/goprocess v0.1.4 // indirect 256 + github.com/jgautheron/goconst v1.8.1 // indirect 257 + github.com/jingyugao/rowserrcheck v1.1.1 // indirect 258 + github.com/jjti/go-spancheck v0.6.4 // indirect 177 259 github.com/jstemmer/go-junit-report v1.0.0 // indirect 260 + github.com/julz/importas v0.2.0 // indirect 261 + github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect 178 262 github.com/kevinburke/ssh_config v1.2.0 // indirect 263 + github.com/kisielk/errcheck v1.9.0 // indirect 264 + github.com/kkHAIKE/contextcheck v1.1.6 // indirect 179 265 github.com/klauspost/cpuid/v2 v2.2.7 // indirect 266 + github.com/kulti/thelper v0.6.3 // indirect 267 + github.com/kunwardeep/paralleltest v1.0.14 // indirect 180 268 github.com/labstack/gommon v0.4.2 // indirect 269 + github.com/lasiar/canonicalheader v1.1.2 // indirect 270 + github.com/ldez/exptostd v0.4.3 // indirect 271 + github.com/ldez/gomoddirectives v0.6.1 // indirect 272 + github.com/ldez/grignotin v0.9.0 // indirect 273 + github.com/ldez/tagliatelle v0.7.1 // indirect 274 + github.com/ldez/usetesting v0.4.3 // indirect 275 + github.com/leonklingele/grouper v1.1.2 // indirect 181 276 github.com/lestrrat-go/blackmagic v1.0.3 // indirect 182 277 github.com/lestrrat-go/httpcc v1.0.1 // indirect 183 278 github.com/lestrrat-go/httprc v1.0.6 // indirect 184 279 github.com/lestrrat-go/iter v1.0.2 // indirect 185 280 github.com/lestrrat-go/option v1.0.1 // indirect 186 281 github.com/livepeer/m3u8 v0.11.1 // indirect 282 + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect 283 + github.com/macabu/inamedparam v0.2.0 // indirect 284 + github.com/magiconair/properties v1.8.6 // indirect 285 + github.com/manuelarte/funcorder v0.2.1 // indirect 286 + github.com/maratori/testableexamples v1.0.0 // indirect 287 + github.com/maratori/testpackage v1.1.1 // indirect 288 + github.com/matoous/godox v1.1.0 // indirect 187 289 github.com/mattn/go-colorable v0.1.14 // indirect 188 290 github.com/mattn/go-pointer v0.0.1 // indirect 291 + github.com/mattn/go-runewidth v0.0.16 // indirect 189 292 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect 293 + github.com/mgechev/revive v1.9.0 // indirect 190 294 github.com/miekg/pkcs11 v1.1.1 // indirect 191 295 github.com/minio/sha256-simd v1.0.1 // indirect 296 + github.com/mitchellh/go-homedir v1.1.0 // indirect 192 297 github.com/mitchellh/gox v1.0.1 // indirect 193 298 github.com/mitchellh/iochan v1.0.0 // indirect 299 + github.com/mitchellh/mapstructure v1.5.0 // indirect 194 300 github.com/mmcloughlin/addchain v0.4.0 // indirect 301 + github.com/moricho/tparallel v0.3.2 // indirect 302 + github.com/muesli/termenv v0.16.0 // indirect 195 303 github.com/multiformats/go-base32 v0.1.0 // indirect 196 304 github.com/multiformats/go-base36 v0.2.0 // indirect 197 305 github.com/multiformats/go-multibase v0.2.0 // indirect 198 306 github.com/multiformats/go-varint v0.0.7 // indirect 307 + github.com/nakabonne/nestif v0.3.1 // indirect 308 + github.com/nishanths/exhaustive v0.12.0 // indirect 309 + github.com/nishanths/predeclared v0.2.2 // indirect 310 + github.com/nunnatsa/ginkgolinter v0.19.1 // indirect 311 + github.com/olekukonko/tablewriter v0.0.5 // indirect 199 312 github.com/opentracing/opentracing-go v1.2.0 // indirect 313 + github.com/pelletier/go-toml v1.9.5 // indirect 314 + github.com/pelletier/go-toml/v2 v2.2.4 // indirect 200 315 github.com/pion/datachannel v1.5.9 // indirect 201 316 github.com/pion/dtls/v3 v3.0.4 // indirect 202 317 github.com/pion/ice/v4 v4.0.3 // indirect ··· 213 328 github.com/pjbgf/sha1cd v0.3.0 // indirect 214 329 github.com/pkg/errors v0.9.1 // indirect 215 330 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect 331 + github.com/polyfloyd/go-errorlint v1.8.0 // indirect 216 332 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect 217 333 github.com/prometheus/client_model v0.5.0 // indirect 218 334 github.com/prometheus/common v0.45.0 // indirect 219 335 github.com/prometheus/procfs v0.12.0 // indirect 336 + github.com/quasilyte/go-ruleguard v0.4.4 // indirect 337 + github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect 338 + github.com/quasilyte/gogrep v0.5.0 // indirect 339 + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect 340 + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect 341 + github.com/raeperd/recvcheck v0.2.0 // indirect 342 + github.com/rivo/uniseg v0.4.7 // indirect 343 + github.com/rogpeppe/go-internal v1.14.1 // indirect 220 344 github.com/russross/blackfriday/v2 v2.1.0 // indirect 345 + github.com/ryancurrah/gomodguard v1.4.1 // indirect 346 + github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect 347 + github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect 348 + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect 349 + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect 350 + github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect 351 + github.com/securego/gosec/v2 v2.22.3 // indirect 221 352 github.com/segmentio/asm v1.2.0 // indirect 222 353 github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect 223 354 github.com/sirupsen/logrus v1.9.3 // indirect 355 + github.com/sivchari/containedctx v1.0.3 // indirect 224 356 github.com/skeema/knownhosts v1.2.2 // indirect 357 + github.com/sonatard/noctx v0.1.0 // indirect 225 358 github.com/sosodev/duration v1.3.1 // indirect 359 + github.com/sourcegraph/go-diff v0.7.0 // indirect 226 360 github.com/spaolacci/murmur3 v1.1.0 // indirect 361 + github.com/spf13/afero v1.14.0 // indirect 362 + github.com/spf13/cast v1.5.0 // indirect 363 + github.com/spf13/cobra v1.9.1 // indirect 364 + github.com/spf13/jwalterweatherman v1.1.0 // indirect 365 + github.com/spf13/pflag v1.0.6 // indirect 366 + github.com/spf13/viper v1.12.0 // indirect 367 + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect 368 + github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect 227 369 github.com/stretchr/objx v0.5.2 // indirect 370 + github.com/subosito/gotenv v1.4.1 // indirect 228 371 github.com/supranational/blst v0.3.11 // indirect 372 + github.com/tdakkota/asciicheck v0.4.1 // indirect 373 + github.com/tetafro/godot v1.5.1 // indirect 229 374 github.com/thales-e-security/pool v0.0.2 // indirect 375 + github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect 376 + github.com/timonwong/loggercheck v0.11.0 // indirect 377 + github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect 378 + github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect 379 + github.com/ultraware/funlen v0.2.0 // indirect 380 + github.com/ultraware/whitespace v0.2.0 // indirect 230 381 github.com/urfave/cli/v2 v2.27.5 // indirect 382 + github.com/uudashr/gocognit v1.2.0 // indirect 383 + github.com/uudashr/iface v1.3.1 // indirect 231 384 github.com/valyala/bytebufferpool v1.0.0 // indirect 232 385 github.com/valyala/fasttemplate v1.2.2 // indirect 233 386 github.com/vektah/gqlparser/v2 v2.5.22 // indirect 234 387 github.com/wlynxg/anet v0.0.5 // indirect 235 388 github.com/xanzy/ssh-agent v0.3.3 // indirect 389 + github.com/xen0n/gosmopolitan v1.3.0 // indirect 390 + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect 236 391 github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect 392 + github.com/yagipy/maintidx v1.0.0 // indirect 393 + github.com/yeya24/promlinter v0.3.0 // indirect 394 + github.com/ykadowak/zerologlint v0.1.5 // indirect 395 + gitlab.com/bosi/decorder v0.4.2 // indirect 237 396 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect 238 397 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect 398 + go-simpler.org/musttag v0.13.1 // indirect 399 + go-simpler.org/sloglint v0.11.0 // indirect 400 + go.augendre.info/fatcontext v0.8.0 // indirect 239 401 go.opencensus.io v0.24.0 // indirect 240 402 go.opentelemetry.io/auto/sdk v1.1.0 // indirect 241 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect 242 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect 403 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect 404 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect 243 405 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect 244 406 go.opentelemetry.io/otel/metric v1.35.0 // indirect 245 407 go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect 246 408 go.opentelemetry.io/proto/otlp v1.5.0 // indirect 247 409 go.uber.org/atomic v1.11.0 // indirect 410 + go.uber.org/automaxprocs v1.6.0 // indirect 248 411 go.uber.org/multierr v1.11.0 // indirect 249 412 go.uber.org/zap v1.26.0 // indirect 250 - golang.org/x/crypto v0.33.0 // indirect 251 - golang.org/x/mod v0.21.0 // indirect 252 - golang.org/x/oauth2 v0.26.0 // indirect 253 - golang.org/x/text v0.22.0 // indirect 413 + golang.org/x/crypto v0.37.0 // indirect 414 + golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect 415 + golang.org/x/mod v0.24.0 // indirect 416 + golang.org/x/oauth2 v0.28.0 // indirect 417 + golang.org/x/text v0.24.0 // indirect 254 418 google.golang.org/appengine/v2 v2.0.2 // indirect 255 - google.golang.org/genproto v0.0.0-20240722135656-d784300faade // indirect 419 + google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect 256 420 google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect 257 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect 421 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect 258 422 google.golang.org/grpc v1.71.0 // indirect 259 - google.golang.org/protobuf v1.36.5 // indirect 423 + google.golang.org/protobuf v1.36.6 // indirect 260 424 gopkg.in/inf.v0 v0.9.1 // indirect 425 + gopkg.in/ini.v1 v1.67.0 // indirect 261 426 gopkg.in/warnings.v0 v0.1.2 // indirect 427 + gopkg.in/yaml.v2 v2.4.0 // indirect 262 428 gorm.io/driver/mysql v1.5.6 // indirect 263 429 gorm.io/driver/postgres v1.5.7 // indirect 430 + honnef.co/go/tools v0.6.1 // indirect 264 431 lukechampine.com/blake3 v1.2.1 // indirect 432 + mvdan.cc/gofumpt v0.8.0 // indirect 433 + mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect 265 434 rsc.io/tmplfunc v0.0.3 // indirect 266 435 )
+493 -68
go.sum
··· 1 + 4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A= 2 + 4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY= 3 + 4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU= 4 + 4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= 1 5 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 - cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= 3 - cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= 4 - cloud.google.com/go/auth v0.7.2 h1:uiha352VrCDMXg+yoBtaD0tUF4Kv9vrtrWPYXwutnDE= 5 - cloud.google.com/go/auth v0.7.2/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs= 6 - cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI= 7 - cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I= 6 + cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= 7 + cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= 8 + cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= 9 + cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= 10 + cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= 11 + cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= 8 12 cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= 9 13 cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= 10 - cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= 11 - cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= 12 - cloud.google.com/go/iam v1.1.10 h1:ZSAr64oEhQSClwBL670MsJAW5/RLiC6kfw3Bqmd5ZDI= 13 - cloud.google.com/go/iam v1.1.10/go.mod h1:iEgMq62sg8zx446GCaijmA2Miwg5o3UbO+nI47WHJps= 14 - cloud.google.com/go/longrunning v0.5.9 h1:haH9pAuXdPAMqHvzX0zlWQigXT7B0+CL4/2nXXdBo5k= 15 - cloud.google.com/go/longrunning v0.5.9/go.mod h1:HD+0l9/OOW0za6UWdKJtXoFAX/BGg/3Wj8p10NeWF7c= 16 - cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= 17 - cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= 14 + cloud.google.com/go/firestore v1.16.0 h1:YwmDHcyrxVRErWcgxunzEaZxtNbc8QoFYA/JOEwDPgc= 15 + cloud.google.com/go/firestore v1.16.0/go.mod h1:+22v/7p+WNBSQwdSwP57vz47aZiY+HrDkrOsJNhk7rg= 16 + cloud.google.com/go/iam v1.2.0 h1:kZKMKVNk/IsSSc/udOb83K0hL/Yh/Gcqpz+oAkoIFN8= 17 + cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= 18 + cloud.google.com/go/longrunning v0.6.0 h1:mM1ZmaNsQsnb+5n1DNPeL0KwQd9jQRqSqSDEkBZr+aI= 19 + cloud.google.com/go/longrunning v0.6.0/go.mod h1:uHzSZqW89h7/pasCWNYdUpwGz3PcVWhrWupreVPYLts= 20 + cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= 21 + cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= 18 22 dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= 19 23 dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= 20 24 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= ··· 23 27 firebase.google.com/go/v4 v4.14.1/go.mod h1:fgk2XshgNDEKaioKco+AouiegSI9oTWVqRaBdTTGBoM= 24 28 git.stream.place/streamplace/c2pa-go v0.7.0 h1:cRbOxgAFgM42XDmvK39ImYP/LrJEekYZ+GoxMGIcakk= 25 29 git.stream.place/streamplace/c2pa-go v0.7.0/go.mod h1:ymtm/Gk3K8Q67SuBoZUqmA0prdymNwAI9BjLj6plhBM= 30 + github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E= 31 + github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI= 26 32 github.com/99designs/gqlgen v0.17.64 h1:BzpqO5ofQXyy2XOa93Q6fP1BHLRjTOeU35ovTEsbYlw= 27 33 github.com/99designs/gqlgen v0.17.64/go.mod h1:kaxLetFxPGeBBwiuKk75NxuI1fe9HRvob17In74v/Zc= 34 + github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE= 35 + github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw= 36 + github.com/Antonboom/errname v1.1.0 h1:A+ucvdpMwlo/myWrkHEUEBWc/xuXdud23S8tmTb/oAE= 37 + github.com/Antonboom/errname v1.1.0/go.mod h1:O1NMrzgUcVBGIfi3xlVuvX8Q/VP/73sseCaAppfjqZw= 38 + github.com/Antonboom/nilnil v1.1.0 h1:jGxJxjgYS3VUUtOTNk8Z1icwT5ESpLH/426fjmQG+ng= 39 + github.com/Antonboom/nilnil v1.1.0/go.mod h1:b7sAlogQjFa1wV8jUW3o4PMzDVFLbTux+xnQdvzdcIE= 40 + github.com/Antonboom/testifylint v1.6.1 h1:6ZSytkFWatT8mwZlmRCHkWz1gPi+q6UBSbieji2Gj/o= 41 + github.com/Antonboom/testifylint v1.6.1/go.mod h1:k+nEkathI2NFjKO6HvwmSrbzUcQ6FAnbZV+ZRrnXPLI= 28 42 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 29 - github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= 30 - github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 43 + github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= 44 + github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 31 45 github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= 32 46 github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= 47 + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= 48 + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= 49 + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 h1:Sz1JIXEcSfhz7fUi7xHnhpIE0thVASYjvosApmHuD2k= 50 + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1/go.mod h1:n/LSCXNuIYqVfBlVXyHfMQkZDdp1/mmxfSjADd3z1Zg= 51 + github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= 52 + github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 33 53 github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= 34 54 github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= 35 55 github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= ··· 37 57 github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= 38 58 github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= 39 59 github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= 60 + github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= 61 + github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= 40 62 github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= 41 63 github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= 42 64 github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b h1:5/++qT1/z812ZqBvqQt6ToRswSuPZ/B33m6xVHRzADU= ··· 49 71 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= 50 72 github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY= 51 73 github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= 74 + github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= 75 + github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= 76 + github.com/alecthomas/chroma/v2 v2.17.2 h1:Rm81SCZ2mPoH+Q8ZCc/9YvzPUN/E7HgPiPJD8SLV6GI= 77 + github.com/alecthomas/chroma/v2 v2.17.2/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= 78 + github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= 79 + github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= 80 + github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= 81 + github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= 52 82 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= 53 83 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= 84 + github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= 85 + github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q= 86 + github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= 87 + github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= 88 + github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= 89 + github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= 90 + github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w= 91 + github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= 54 92 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= 55 93 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= 56 94 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= ··· 63 101 github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= 64 102 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= 65 103 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= 104 + github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= 105 + github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= 106 + github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU= 107 + github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4= 108 + github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= 109 + github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= 66 110 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 67 111 github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= 68 112 github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= ··· 72 116 github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= 73 117 github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= 74 118 github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= 119 + github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= 120 + github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= 121 + github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= 122 + github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= 75 123 github.com/bluesky-social/indigo v0.0.0-20250520232546-236dd575c91e h1:DVD+HxQsDCVJtAkjfIKZVaBNc3kayHaU+A2TJZkFdp4= 76 124 github.com/bluesky-social/indigo v0.0.0-20250520232546-236dd575c91e/go.mod h1:ovyxp8AMO1Hoe838vMJUbqHTZaAR8ABM3g3TXu+A5Ng= 77 125 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= 78 126 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= 127 + github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= 128 + github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= 129 + github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= 130 + github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= 131 + github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= 132 + github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s= 79 133 github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= 80 134 github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= 81 135 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= 82 136 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 137 + github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E= 138 + github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70= 139 + github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= 140 + github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= 83 141 github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= 84 142 github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= 85 143 github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= 144 + github.com/catenacyber/perfsprint v0.9.1 h1:5LlTp4RwTooQjJCvGEFV6XksZvWE7wCOUvjD2z0vls0= 145 + github.com/catenacyber/perfsprint v0.9.1/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM= 146 + github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= 147 + github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= 86 148 github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= 87 149 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 88 150 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= ··· 90 152 github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= 91 153 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 92 154 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 155 + github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= 156 + github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= 157 + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= 158 + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= 159 + github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= 160 + github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= 161 + github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= 162 + github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= 163 + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= 164 + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= 165 + github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= 166 + github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= 167 + github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= 168 + github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= 169 + github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= 170 + github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= 93 171 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 94 172 github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= 95 173 github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= ··· 112 190 github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= 113 191 github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= 114 192 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 115 - github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= 116 - github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 193 + github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= 194 + github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= 117 195 github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= 118 196 github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= 119 197 github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= 120 198 github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= 121 199 github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= 122 200 github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= 201 + github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= 202 + github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= 123 203 github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= 124 204 github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 205 + github.com/daixiang0/gci v0.13.6 h1:RKuEOSkGpSadkGbvZ6hJ4ddItT3cVZ9Vn9Rybk6xjl8= 206 + github.com/daixiang0/gci v0.13.6/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= 207 + github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= 208 + github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= 209 + github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= 210 + github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= 125 211 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 126 212 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 127 213 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= ··· 139 225 github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0/go.mod h1:3s92l0paYkZoIHuj4X93Teg/HB7eGM9x/zokGw+u4mY= 140 226 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= 141 227 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= 228 + github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= 229 + github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= 142 230 github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= 143 231 github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= 232 + github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= 233 + github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 144 234 github.com/dunglas/httpsfv v1.0.2 h1:iERDp/YAfnojSDJ7PW3dj1AReJz4MrwbECSSE59JWL0= 145 235 github.com/dunglas/httpsfv v1.0.2/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg= 146 236 github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= ··· 157 247 github.com/ethereum/go-ethereum v1.14.7/go.mod h1:Mq0biU2jbdmKSZoqOj29017ygFrMnB5/Rifwp980W4o= 158 248 github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= 159 249 github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= 250 + github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= 251 + github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= 252 + github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= 253 + github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= 254 + github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= 255 + github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= 160 256 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= 161 257 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 258 + github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E= 259 + github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= 162 260 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 163 261 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 164 262 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= 165 263 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= 264 + github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= 265 + github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= 166 266 github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= 167 267 github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= 268 + github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY= 269 + github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= 168 270 github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= 169 271 github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= 272 + github.com/go-critic/go-critic v0.13.0 h1:kJzM7wzltQasSUXtYyTl6UaPVySO6GkaR1thFnJ6afY= 273 + github.com/go-critic/go-critic v0.13.0/go.mod h1:M/YeuJ3vOCQDnP2SU+ZhjgRzwzcBW87JqLpMJLrZDLI= 170 274 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= 171 275 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= 172 276 github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= ··· 186 290 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 187 291 github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= 188 292 github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 293 + github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= 294 + github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= 189 295 github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= 190 296 github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= 191 297 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= 192 298 github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= 193 299 github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= 300 + github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= 301 + github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= 302 + github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= 303 + github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= 304 + github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= 305 + github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= 306 + github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= 307 + github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= 308 + github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= 309 + github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= 310 + github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= 311 + github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= 312 + github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= 313 + github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= 314 + github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= 315 + github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= 316 + github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= 317 + github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= 318 + github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= 319 + github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= 320 + github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= 194 321 github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= 195 322 github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= 323 + github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= 324 + github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= 196 325 github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= 326 + github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= 327 + github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= 197 328 github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= 198 329 github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 199 - github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= 200 - github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= 330 + github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= 331 + github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= 201 332 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 202 333 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 203 334 github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= ··· 234 365 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 235 366 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= 236 367 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 368 + github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw= 369 + github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= 370 + github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= 371 + github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= 372 + github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= 373 + github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= 374 + github.com/golangci/golangci-lint/v2 v2.1.6 h1:LXqShFfAGM5BDzEOWD2SL1IzJAgUOqES/HRBsfKjI+w= 375 + github.com/golangci/golangci-lint/v2 v2.1.6/go.mod h1:EPj+fgv4TeeBq3TcqaKZb3vkiV5dP4hHHKhXhEhzci8= 376 + github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8= 377 + github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ= 378 + github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= 379 + github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= 380 + github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= 381 + github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= 382 + github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s= 383 + github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= 384 + github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM= 385 + github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc= 237 386 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 238 387 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 239 388 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 240 389 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 241 390 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 391 + github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 392 + github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 242 393 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 394 + github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 243 395 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 396 + github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 397 + github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 244 398 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 245 399 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 246 400 github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= 247 401 github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= 248 402 github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= 249 403 github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= 404 + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= 405 + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= 250 406 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 251 - github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= 252 - github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= 407 + github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= 408 + github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= 253 409 github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= 254 410 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 255 411 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 256 412 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 257 - github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= 258 - github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= 259 - github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= 260 - github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= 413 + github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= 414 + github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= 415 + github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= 416 + github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= 261 417 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 262 418 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 419 + github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= 420 + github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= 263 421 github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= 264 422 github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 423 + github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= 424 + github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= 425 + github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= 426 + github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= 427 + github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8= 428 + github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc= 429 + github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk= 430 + github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY= 431 + github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= 432 + github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= 433 + github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= 434 + github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8= 435 + github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= 265 436 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= 266 437 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= 267 438 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= ··· 271 442 github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 272 443 github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 273 444 github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 274 - github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= 275 445 github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= 446 + github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= 447 + github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= 448 + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= 449 + github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= 276 450 github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= 277 451 github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= 278 452 github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= 279 453 github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= 454 + github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= 455 + github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 280 456 github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 281 - github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= 282 - github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 457 + github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 458 + github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= 459 + github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 283 460 github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= 284 461 github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 285 462 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= 286 463 github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 464 + github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 465 + github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 466 + github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= 467 + github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= 287 468 github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4= 288 469 github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= 289 470 github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= 290 471 github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= 472 + github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 473 + github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 291 474 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= 292 475 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 293 476 github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= ··· 368 551 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= 369 552 github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= 370 553 github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= 554 + github.com/jgautheron/goconst v1.8.1 h1:PPqCYp3K/xlOj5JmIe6O1Mj6r1DbkdbLtR3AJuZo414= 555 + github.com/jgautheron/goconst v1.8.1/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako= 556 + github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= 557 + github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= 371 558 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= 372 559 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= 373 560 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= 374 561 github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 562 + github.com/jjti/go-spancheck v0.6.4 h1:Tl7gQpYf4/TMU7AT84MN83/6PutY21Nb9fuQjFTpRRc= 563 + github.com/jjti/go-spancheck v0.6.4/go.mod h1:yAEYdKJ2lRkDA8g7X+oKUHXOWVAXSBJRv04OhF+QUjk= 375 564 github.com/johncgriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:2n/HCxBM7oa5PNCPKIhV26EtJkaPXFfcVojPAT3ujTU= 376 565 github.com/johncgriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:B9OPZOhZ3FIi6bu54lAgCMzXLh11Z7ilr3rOr/ClP+E= 377 566 github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= ··· 382 571 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 383 572 github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= 384 573 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 574 + github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= 575 + github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= 576 + github.com/karamaru-alpha/copyloopvar v1.2.1 h1:wmZaZYIjnJ0b5UoKDjUHrikcV0zuPyyxI4SVplLd2CI= 577 + github.com/karamaru-alpha/copyloopvar v1.2.1/go.mod h1:nFmMlFNlClC2BPvNaHMdkirmTJxVCY0lhxBtlfOypMM= 385 578 github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= 386 579 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 387 580 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 581 + github.com/kisielk/errcheck v1.9.0 h1:9xt1zI9EBfcYBvdU1nVrzMzzUPUtPKs9bVSIM3TAb3M= 582 + github.com/kisielk/errcheck v1.9.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= 388 583 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 584 + github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= 585 + github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= 389 586 github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= 390 587 github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= 391 588 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= ··· 399 596 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 400 597 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 401 598 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 599 + github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= 600 + github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= 601 + github.com/kunwardeep/paralleltest v1.0.14 h1:wAkMoMeGX/kGfhQBPODT/BL8XhK23ol/nuQ3SwFaUw8= 602 + github.com/kunwardeep/paralleltest v1.0.14/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= 402 603 github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 403 604 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 404 605 github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= 405 606 github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= 406 607 github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= 407 608 github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= 609 + github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= 610 + github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= 611 + github.com/ldez/exptostd v0.4.3 h1:Ag1aGiq2epGePuRJhez2mzOpZ8sI9Gimcb4Sb3+pk9Y= 612 + github.com/ldez/exptostd v0.4.3/go.mod h1:iZBRYaUmcW5jwCR3KROEZ1KivQQp6PHXbDPk9hqJKCQ= 613 + github.com/ldez/gomoddirectives v0.6.1 h1:Z+PxGAY+217f/bSGjNZr/b2KTXcyYLgiWI6geMBN2Qc= 614 + github.com/ldez/gomoddirectives v0.6.1/go.mod h1:cVBiu3AHR9V31em9u2kwfMKD43ayN5/XDgr+cdaFaKs= 615 + github.com/ldez/grignotin v0.9.0 h1:MgOEmjZIVNn6p5wPaGp/0OKWyvq42KnzAt/DAb8O4Ow= 616 + github.com/ldez/grignotin v0.9.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk= 617 + github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk= 618 + github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I= 619 + github.com/ldez/usetesting v0.4.3 h1:pJpN0x3fMupdTf/IapYjnkhiY1nSTN+pox1/GyBRw3k= 620 + github.com/ldez/usetesting v0.4.3/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= 408 621 github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= 409 622 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= 623 + github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= 624 + github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= 410 625 github.com/lestrrat-go/blackmagic v1.0.3 h1:94HXkVLxkZO9vJI/w2u1T0DAoprShFd13xtnSINtDWs= 411 626 github.com/lestrrat-go/blackmagic v1.0.3/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw= 412 627 github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= ··· 442 657 github.com/livepeer/m3u8 v0.11.1/go.mod h1:IUqAtwWPAG2CblfQa4SVzTQoDcEMPyfNOaBSxqHMS04= 443 658 github.com/lmittmann/tint v1.1.0 h1:0hDmvuGv3U+Cep/jHpPxwjrCFjT6syam7iY7nTmA7ug= 444 659 github.com/lmittmann/tint v1.1.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= 660 + github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= 661 + github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= 662 + github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= 663 + github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= 664 + github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= 665 + github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 666 + github.com/manuelarte/funcorder v0.2.1 h1:7QJsw3qhljoZ5rH0xapIvjw31EcQeFbF31/7kQ/xS34= 667 + github.com/manuelarte/funcorder v0.2.1/go.mod h1:BQQ0yW57+PF9ZpjpeJDKOffEsQbxDFKW8F8zSMe/Zd0= 668 + github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= 669 + github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= 670 + github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= 671 + github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= 672 + github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= 673 + github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= 674 + github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= 675 + github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 445 676 github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= 446 677 github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= 447 678 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= ··· 449 680 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 450 681 github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= 451 682 github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= 452 - github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= 453 - github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 683 + github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 684 + github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= 685 + github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 454 686 github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= 455 687 github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 456 688 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= 457 689 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= 690 + github.com/mgechev/revive v1.9.0 h1:8LaA62XIKrb8lM6VsBSQ92slt/o92z5+hTw3CmrvSrM= 691 + github.com/mgechev/revive v1.9.0/go.mod h1:LAPq3+MgOf7GcL5PlWIkHb0PT7XH4NuC2LdWymhb9Mo= 458 692 github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= 459 693 github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= 460 694 github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= ··· 463 697 github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= 464 698 github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= 465 699 github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= 700 + github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 701 + github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 466 702 github.com/mitchellh/gox v1.0.1 h1:x0jD3dcHk9a9xPSDN6YEL4xL6Qz0dvNYm8yZqui5chI= 467 703 github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4= 468 704 github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= 469 705 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 706 + github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= 707 + github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 470 708 github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= 471 709 github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= 472 710 github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= 711 + github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= 712 + github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= 473 713 github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= 474 714 github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 715 + github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= 716 + github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= 475 717 github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= 476 718 github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= 477 719 github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= ··· 492 734 github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= 493 735 github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= 494 736 github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 737 + github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= 738 + github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= 739 + github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= 740 + github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= 741 + github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= 742 + github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= 743 + github.com/nunnatsa/ginkgolinter v0.19.1 h1:mjwbOlDQxZi9Cal+KfbEJTCz327OLNfwNvoZ70NJ+c4= 744 + github.com/nunnatsa/ginkgolinter v0.19.1/go.mod h1:jkQ3naZDmxaZMXPWaS9rblH+i+GWXQCaS/JFIWcOH2s= 495 745 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= 496 746 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 497 - github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= 498 - github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= 747 + github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= 748 + github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= 749 + github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= 750 + github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= 751 + github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= 499 752 github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= 500 753 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 501 754 github.com/orandin/slog-gorm v1.4.0 h1:FgA8hJufF9/jeNSYoEXmHPPBwET2gwlF3B85JdpsTUU= 502 755 github.com/orandin/slog-gorm v1.4.0/go.mod h1:MoZ51+b7xE9lwGNPYEhxcUtRNrYzjdcKvA8QXQQGEPA= 756 + github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= 757 + github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= 758 + github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= 759 + github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= 760 + github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= 761 + github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= 762 + github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= 763 + github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= 764 + github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= 765 + github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= 766 + github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 503 767 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= 504 768 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= 505 769 github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= ··· 548 812 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 549 813 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= 550 814 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= 815 + github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= 816 + github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= 551 817 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= 552 818 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= 819 + github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= 820 + github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= 553 821 github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= 554 822 github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= 555 823 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= ··· 559 827 github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= 560 828 github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= 561 829 github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= 562 - github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= 830 + github.com/quasilyte/go-ruleguard v0.4.4 h1:53DncefIeLX3qEpjzlS1lyUmQoUEeOWPFWqaTJq9eAQ= 831 + github.com/quasilyte/go-ruleguard v0.4.4/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= 832 + github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= 833 + github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= 834 + github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= 835 + github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= 836 + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= 837 + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= 838 + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= 839 + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= 840 + github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= 841 + github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= 563 842 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 843 + github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 844 + github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 564 845 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 565 - github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= 566 - github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 846 + github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= 847 + github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= 567 848 github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= 568 849 github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= 569 850 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 570 851 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 571 852 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 853 + github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= 854 + github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I= 855 + github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= 856 + github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= 572 857 github.com/samber/slog-http v1.4.0 h1:s2hSzMlQBFDIPTUBDm6G+SGfv7F4xR9q8edjxtY6aho= 573 858 github.com/samber/slog-http v1.4.0/go.mod h1:n6h4x2ZBeTgLqMKf95EuNlU6mcJF1b/RVLxo1od5+V0= 859 + github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= 860 + github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= 861 + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= 862 + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= 863 + github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= 864 + github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= 865 + github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxXUzwsMDBkR21cyQ= 866 + github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= 574 867 github.com/scylladb/gocql v1.14.4 h1:MhevwCfyAraQ6RvZYFO3pF4Lt0YhvQlfg8Eo2HEqVQA= 575 868 github.com/scylladb/gocql v1.14.4/go.mod h1:ZLEJ0EVE5JhmtxIW2stgHq/v1P4fWap0qyyXSKyV8K0= 869 + github.com/securego/gosec/v2 v2.22.3 h1:mRrCNmRF2NgZp4RJ8oJ6yPJ7G4x6OCiAXHd8x4trLRc= 870 + github.com/securego/gosec/v2 v2.22.3/go.mod h1:42M9Xs0v1WseinaB/BmNGO8AVqG8vRfhC2686ACY48k= 576 871 github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= 577 872 github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= 578 873 github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= 579 874 github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= 580 875 github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= 581 876 github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 877 + github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= 878 + github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= 582 879 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 583 880 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 584 881 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 585 882 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 883 + github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= 884 + github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= 586 885 github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= 587 886 github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= 588 887 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= ··· 591 890 github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= 592 891 github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= 593 892 github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= 893 + github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM= 894 + github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c= 594 895 github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= 595 896 github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= 897 + github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= 898 + github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= 596 899 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 597 900 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 901 + github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= 902 + github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= 903 + github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= 904 + github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= 905 + github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= 906 + github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= 907 + github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= 908 + github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 909 + github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 910 + github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= 911 + github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 912 + github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= 913 + github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= 914 + github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= 915 + github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= 916 + github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= 917 + github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= 598 918 github.com/streamplace/atproto-oauth-golang v0.0.0-20250521042753-9cfa9e504155 h1:OAJ2Hh9XQcU77aUdxgT5tTcGKLYzwCXvPWR22V5xV5o= 599 919 github.com/streamplace/atproto-oauth-golang v0.0.0-20250521042753-9cfa9e504155/go.mod h1:/AUT+i6CBJJ13AWx89XyvFdSkmDT3IoEg8pl34MaUgs= 600 920 github.com/streamplace/go-dpop v0.0.0-20250510031900-c897158a8ad4 h1:L1fS4HJSaAyNnkwfuZubgfeZy8rkWmA0cMtH5Z0HqNc= ··· 609 929 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 610 930 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 611 931 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 932 + github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 612 933 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 613 934 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 614 935 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= ··· 618 939 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 619 940 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 620 941 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 942 + github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= 943 + github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= 621 944 github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= 622 945 github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= 623 946 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= 624 947 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= 948 + github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8= 949 + github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8= 950 + github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= 951 + github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= 952 + github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= 953 + github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= 954 + github.com/tetafro/godot v1.5.1 h1:PZnjCol4+FqaEzvZg5+O8IY2P3hfY9JzRBNPv1pEDS4= 955 + github.com/tetafro/godot v1.5.1/go.mod h1:cCdPtEndkmqqrhiCfkmxDodMQJ/f3L1BCNskCUZdTwk= 625 956 github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= 626 957 github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= 958 + github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk= 959 + github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= 960 + github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= 961 + github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= 627 962 github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= 628 963 github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= 629 964 github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= 630 965 github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= 966 + github.com/tomarrell/wrapcheck/v2 v2.11.0 h1:BJSt36snX9+4WTIXeJ7nvHBQBcm1h2SjQMSlmQ6aFSU= 967 + github.com/tomarrell/wrapcheck/v2 v2.11.0/go.mod h1:wFL9pDWDAbXhhPZZt+nG8Fu+h29TtnZ2MW6Lx4BRXIU= 968 + github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= 969 + github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= 970 + github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= 971 + github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA= 972 + github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g= 973 + github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= 631 974 github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 632 975 github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= 633 976 github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= 977 + github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA= 978 + github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU= 979 + github.com/uudashr/iface v1.3.1 h1:bA51vmVx1UIhiIsQFSNq6GZ6VPTk3WNMZgRiCe9R29U= 980 + github.com/uudashr/iface v1.3.1/go.mod h1:4QvspiRd3JLPAEXBQ9AiZpLbJlrWWgRChOKDJEuQTdg= 634 981 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 635 982 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 636 983 github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= ··· 649 996 github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= 650 997 github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= 651 998 github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= 999 + github.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM= 1000 + github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4= 1001 + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= 1002 + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= 652 1003 github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= 653 1004 github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= 1005 + github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= 1006 + github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= 1007 + github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= 1008 + github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= 1009 + github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= 1010 + github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= 1011 + github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 654 1012 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 1013 + github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 655 1014 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 656 1015 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 1016 + github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 657 1017 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 1018 + gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= 1019 + gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= 658 1020 gitlab.com/gitlab-org/release-cli v0.18.0 h1:vVNxGRIy4w4FIo0ucO8ZyYecSH+jwV+vdZygpBt+E/0= 659 1021 gitlab.com/gitlab-org/release-cli v0.18.0/go.mod h1:VRzoYTcZ/1CgyaQBKbz0LIfjigKGUh0leWA1f1cLAFc= 660 1022 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= 661 1023 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= 662 1024 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= 663 1025 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= 1026 + go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= 1027 + go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= 1028 + go-simpler.org/musttag v0.13.1 h1:lw2sJyu7S1X8lc8zWUAdH42y+afdcCnHhWpnkWvd6vU= 1029 + go-simpler.org/musttag v0.13.1/go.mod h1:8r450ehpMLQgvpb6sg+hV5Ur47eH6olp/3yEanfG97k= 1030 + go-simpler.org/sloglint v0.11.0 h1:JlR1X4jkbeaffiyjLtymeqmGDKBDO1ikC6rjiuFAOco= 1031 + go-simpler.org/sloglint v0.11.0/go.mod h1:CFDO8R1i77dlciGfPEPvYke2ZMx4eyGiEIWkyeW2Pvw= 1032 + go.augendre.info/fatcontext v0.8.0 h1:2dfk6CQbDGeu1YocF59Za5Pia7ULeAM6friJ3LP7lmk= 1033 + go.augendre.info/fatcontext v0.8.0/go.mod h1:oVJfMgwngMsHO+KB2MdgzcO+RvtNdiCEOlWvSFtax/s= 664 1034 go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= 665 1035 go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 666 1036 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= 667 1037 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= 668 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= 669 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= 670 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= 671 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= 1038 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= 1039 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= 1040 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= 1041 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= 672 1042 go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= 673 1043 go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= 674 1044 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= ··· 689 1059 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 690 1060 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= 691 1061 go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= 1062 + go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= 1063 + go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= 692 1064 go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 693 1065 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 694 1066 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= ··· 709 1081 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 710 1082 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= 711 1083 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= 712 - golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= 713 - golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= 1084 + golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 1085 + golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 1086 + golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= 1087 + golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= 714 1088 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 715 1089 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= 716 1090 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= 1091 + golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= 1092 + golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= 1093 + golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4= 1094 + golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= 717 1095 golang.org/x/image v0.22.0 h1:UtK5yLUzilVrkjMAZAZ34DXGpASN8i8pj8g+O+yd10g= 718 1096 golang.org/x/image v0.22.0/go.mod h1:9hPFhljd4zZ1GNSIZJ49sqbp45GKK9t6w+iXvGqZUz4= 719 1097 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= ··· 723 1101 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 724 1102 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 725 1103 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 1104 + golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 726 1105 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 1106 + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 727 1107 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 1108 + golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 728 1109 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 729 - golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= 730 - golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 1110 + golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 1111 + golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 1112 + golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 1113 + golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= 1114 + golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= 731 1115 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 732 1116 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 733 1117 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= ··· 735 1119 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 736 1120 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 737 1121 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 1122 + golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 738 1123 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 739 1124 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 740 1125 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 741 1126 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 1127 + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 742 1128 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 743 1129 golang.org/x/net v0.0.0-20220526153639-5463443f8c37/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 744 1130 golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= ··· 746 1132 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= 747 1133 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 748 1134 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= 749 - golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= 750 - golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= 1135 + golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 1136 + golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 1137 + golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 1138 + golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= 1139 + golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= 751 1140 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 752 - golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= 753 - golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 1141 + golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= 1142 + golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= 754 1143 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 755 1144 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 756 1145 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 757 1146 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 1147 + golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 758 1148 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 759 1149 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 760 1150 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 761 1151 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 762 - golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= 763 - golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 1152 + golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 1153 + golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 1154 + golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= 1155 + golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 764 1156 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 765 1157 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 766 1158 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 767 1159 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 1160 + golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 768 1161 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 769 1162 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 770 1163 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= ··· 773 1166 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 774 1167 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 775 1168 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 1169 + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 1170 + golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 776 1171 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 777 1172 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 778 1173 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= ··· 781 1176 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 782 1177 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 783 1178 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 784 - golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= 785 - golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 1179 + golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 1180 + golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 1181 + golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 1182 + golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= 1183 + golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 786 1184 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 787 1185 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 788 1186 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= 789 1187 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 790 1188 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 791 - golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= 792 - golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= 1189 + golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 1190 + golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 1191 + golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= 1192 + golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= 1193 + golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= 793 1194 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 1195 + golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 794 1196 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 795 1197 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 796 1198 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 797 1199 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 798 1200 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 799 1201 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 800 - golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= 801 - golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= 802 - golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= 803 - golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 1202 + golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 1203 + golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 1204 + golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= 1205 + golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= 1206 + golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= 1207 + golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= 804 1208 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 805 1209 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 806 1210 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= ··· 811 1215 golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 812 1216 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 813 1217 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 1218 + golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 1219 + golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 814 1220 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 1221 + golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 1222 + golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 1223 + golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 815 1224 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 1225 + golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 1226 + golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= 1227 + golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 816 1228 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 1229 + golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= 817 1230 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 1231 + golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= 818 1232 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 819 - golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= 820 - golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= 1233 + golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= 1234 + golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 1235 + golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= 1236 + golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= 1237 + golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= 821 1238 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 822 1239 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 823 1240 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 824 1241 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 825 1242 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= 826 1243 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 827 - google.golang.org/api v0.189.0 h1:equMo30LypAkdkLMBqfeIqtyAnlyig1JSZArl4XPwdI= 828 - google.golang.org/api v0.189.0/go.mod h1:FLWGJKb0hb+pU2j+rJqwbnsF+ym+fQs73rbJ+KAUgy8= 1244 + google.golang.org/api v0.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs= 1245 + google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= 829 1246 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 830 1247 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 831 1248 google.golang.org/appengine/v2 v2.0.2 h1:MSqyWy2shDLwG7chbwBJ5uMyw6SNqJzhJHNDwYB0Akk= ··· 833 1250 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 834 1251 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 835 1252 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 836 - google.golang.org/genproto v0.0.0-20240722135656-d784300faade h1:lKFsS7wpngDgSCeFn7MoLy+wBDQZ1UQIJD4UNM1Qvkg= 837 - google.golang.org/genproto v0.0.0-20240722135656-d784300faade/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= 1253 + google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= 1254 + google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= 838 1255 google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0= 839 1256 google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= 840 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4= 841 - google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ= 1257 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= 1258 + google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= 842 1259 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 843 1260 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 844 1261 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= ··· 857 1274 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 858 1275 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 859 1276 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 860 - google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= 861 - google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 1277 + google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= 1278 + google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 862 1279 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 863 1280 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 864 1281 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= ··· 867 1284 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 868 1285 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= 869 1286 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 1287 + gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= 1288 + gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 870 1289 gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= 871 1290 gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 872 1291 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= ··· 893 1312 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 894 1313 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 895 1314 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 1315 + honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= 1316 + honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= 896 1317 lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= 897 1318 lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= 1319 + mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k= 1320 + mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg= 1321 + mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8= 1322 + mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5ginj6dA2oLE7YNlta9qhBNNdCaLE= 898 1323 rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= 899 1324 rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= 900 1325 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+8
hack/golangci-lint
··· 1 + #!/bin/bash 2 + 3 + # This script is used to trick the GitHub action for golangci-lint to run inside a container 4 + # so that we can use the local build of streamplace 5 + 6 + set -euo pipefail 7 + 8 + exec podman exec golangci-lint golangci-lint "$@"
+33 -15
pkg/api/api.go
··· 184 184 router.Handler("PUT", "/xrpc/*resource", xrpcHandler) 185 185 router.Handler("PATCH", "/xrpc/*resource", xrpcHandler) 186 186 router.Handler("DELETE", "/xrpc/*resource", xrpcHandler) 187 - router.GET("/.well-known/did.json", a.HandleDidJson(ctx)) 187 + router.GET("/.well-known/did.json", a.HandleDidJSON(ctx)) 188 188 router.GET("/dl/*params", a.HandleAppDownload(ctx)) 189 189 router.POST("/", a.HandleWebRTCIngest(ctx)) 190 190 for _, redirect := range a.CLI.Redirects { ··· 296 296 log.Error(ctx, "error generating default card", "error", err) 297 297 } 298 298 w.Header().Set("Content-Type", "text/html") 299 - w.Write(bs) 299 + if _, err := w.Write(bs); err != nil { 300 + log.Error(ctx, "error writing response", "error", err) 301 + } 300 302 } else { 301 303 log.Warn(ctx, "error opening file", "error", err) 302 304 apierrors.WriteHTTPInternalServerError(w, "file not found", err) ··· 339 341 return 340 342 } 341 343 w.Header().Set("Content-Type", "text/html") 342 - w.Write(bs) 344 + if _, err := w.Write(bs); err != nil { 345 + log.Error(ctx, "error writing response", "error", err) 346 + } 343 347 }), nil 344 348 } 345 349 ··· 355 359 return 356 360 } 357 361 358 - fullstream := fmt.Sprintf("%s+%s", mistconfig.STREAM_NAME, stream) 362 + fullstream := fmt.Sprintf("%s+%s", mistconfig.StreamName, stream) 359 363 prefix := fmt.Sprintf(tmpl, fullstream) 360 364 resource := params.ByName("resource") 361 365 ··· 382 386 383 387 copyHeader(w.Header(), resp.Header) 384 388 w.WriteHeader(resp.StatusCode) 385 - io.Copy(w, resp.Body) 389 + if _, err := io.Copy(w, resp.Body); err != nil { 390 + log.Error(ctx, "error writing response", "error", err) 391 + } 386 392 } 387 393 } 388 394 ··· 398 404 } 399 405 400 406 func (a *StreamplaceAPI) RedirectHandler(ctx context.Context) (http.Handler, error) { 401 - _, tlsPort, err := net.SplitHostPort(a.CLI.HttpsAddr) 407 + _, tlsPort, err := net.SplitHostPort(a.CLI.HTTPSAddr) 402 408 if err != nil { 403 409 return nil, err 404 410 } ··· 506 512 return 507 513 } 508 514 w.Header().Add("Content-Type", "application/json") 509 - w.Write(bs) 515 + if _, err := w.Write(bs); err != nil { 516 + log.Error(ctx, "error writing response", "error", err) 517 + } 510 518 } 511 519 } 512 520 ··· 538 546 return 539 547 } 540 548 w.Header().Add("Content-Type", "application/json") 541 - w.Write(bs) 549 + if _, err := w.Write(bs); err != nil { 550 + log.Error(ctx, "error writing response", "error", err) 551 + } 542 552 } 543 553 } 544 554 ··· 560 570 apierrors.WriteHTTPInternalServerError(w, "could not marshal view count", err) 561 571 return 562 572 } 563 - w.Write(bs) 573 + if _, err := w.Write(bs); err != nil { 574 + log.Error(ctx, "error writing response", "error", err) 575 + } 564 576 } 565 577 } 566 578 ··· 582 594 apierrors.WriteHTTPInternalServerError(w, "could not marshal signing keys", err) 583 595 return 584 596 } 585 - w.Write(bs) 597 + if _, err := w.Write(bs); err != nil { 598 + log.Error(ctx, "error writing response", "error", err) 599 + } 586 600 } 587 601 } 588 602 ··· 615 629 return 616 630 } 617 631 w.Header().Set("Content-Type", "application/json") 618 - w.Write(bs) 632 + if _, err := w.Write(bs); err != nil { 633 + log.Error(ctx, "error writing response", "error", err) 634 + } 619 635 } 620 636 } 621 637 ··· 654 670 return 655 671 } 656 672 w.Header().Set("Content-Type", "application/json") 657 - w.Write(bs) 673 + if _, err := w.Write(bs); err != nil { 674 + log.Error(ctx, "error writing response", "error", err) 675 + } 658 676 } 659 677 } 660 678 ··· 687 705 return err 688 706 } 689 707 return a.ServerWithShutdown(ctx, handler, func(s *http.Server) error { 690 - s.Addr = a.CLI.HttpAddr 708 + s.Addr = a.CLI.HTTPAddr 691 709 log.Log(ctx, "http server starting", "addr", s.Addr) 692 710 return s.ListenAndServe() 693 711 }) ··· 699 717 return err 700 718 } 701 719 return a.ServerWithShutdown(ctx, handler, func(s *http.Server) error { 702 - s.Addr = a.CLI.HttpAddr 720 + s.Addr = a.CLI.HTTPAddr 703 721 log.Log(ctx, "http tls redirecct server starting", "addr", s.Addr) 704 722 return s.ListenAndServe() 705 723 }) ··· 711 729 return err 712 730 } 713 731 return a.ServerWithShutdown(ctx, handler, func(s *http.Server) error { 714 - s.Addr = a.CLI.HttpsAddr 732 + s.Addr = a.CLI.HTTPSAddr 715 733 log.Log(ctx, "https server starting", 716 734 "addr", s.Addr, 717 735 "certPath", a.CLI.TLSCertPath,
+41 -15
pkg/api/api_internal.go
··· 40 40 return err 41 41 } 42 42 return a.ServerWithShutdown(ctx, handler, func(s *http.Server) error { 43 - s.Addr = a.CLI.HttpInternalAddr 43 + s.Addr = a.CLI.HTTPInternalAddr 44 44 log.Log(ctx, "http server starting", "addr", s.Addr) 45 45 return s.ListenAndServe() 46 46 }) ··· 72 72 } 73 73 74 74 ms := time.Now().UnixMilli() 75 - out := fmt.Sprintf("%s+%s_%d", mistconfig.STREAM_NAME, mediaSigner.Streamer(), ms) 75 + out := fmt.Sprintf("%s+%s_%d", mistconfig.StreamName, mediaSigner.Streamer(), ms) 76 76 a.SignerCacheMu.Lock() 77 77 a.SignerCache[mediaSigner.Streamer()] = mediaSigner 78 78 a.SignerCacheMu.Unlock() ··· 217 217 _, err := io.Copy(w, pr) 218 218 return err 219 219 }) 220 - g.Wait() 220 + if err := g.Wait(); err != nil { 221 + errors.WriteHTTPBadRequest(w, "request failed", err) 222 + } 221 223 }) 222 224 223 225 router.HEAD("/playback/:user/:rendition/stream.mkv", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 242 244 errors.WriteHTTPNotFound(w, "http-pipe not found", nil) 243 245 return 244 246 } 245 - io.Copy(pr, r.Body) 247 + if _, err := io.Copy(pr, r.Body); err != nil { 248 + errors.WriteHTTPInternalServerError(w, "failed to copy response", nil) 249 + } 246 250 }) 247 251 248 252 // self-destruct code, useful for dumping goroutines on windows 249 253 router.POST("/abort", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { 250 - rtpprof.Lookup("goroutine").WriteTo(os.Stderr, 2) 254 + if err := rtpprof.Lookup("goroutine").WriteTo(os.Stderr, 2); err != nil { 255 + log.Log(ctx, "error writing rtpprof", "error", err) 256 + } 251 257 log.Log(ctx, "got POST /abort, self-destructing") 252 258 os.Exit(1) 253 259 }) ··· 308 314 errors.WriteHTTPInternalServerError(w, "unable to marhsal json", err) 309 315 return 310 316 } 311 - w.Write(bs) 317 + if _, err := w.Write(bs); err != nil { 318 + log.Error(ctx, "error writing response", "error", err) 319 + } 312 320 }) 313 321 314 322 router.GET("/segment/:id", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 336 344 errors.WriteHTTPInternalServerError(w, "unable to marhsal json", err) 337 345 return 338 346 } 339 - w.Write(bs) 347 + if _, err := w.Write(bs); err != nil { 348 + log.Error(ctx, "error writing response", "error", err) 349 + } 340 350 }) 341 351 342 352 router.DELETE("/player-events", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 366 376 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 367 377 return 368 378 } 369 - w.Write(bs) 379 + if _, err := w.Write(bs); err != nil { 380 + log.Error(ctx, "error writing response", "error", err) 381 + } 370 382 }) 371 383 372 384 router.GET("/followers/:user", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 386 398 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 387 399 return 388 400 } 389 - w.Write(bs) 401 + if _, err := w.Write(bs); err != nil { 402 + log.Error(ctx, "error writing response", "error", err) 403 + } 390 404 }) 391 405 392 406 router.GET("/following/:user", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 406 420 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 407 421 return 408 422 } 409 - w.Write(bs) 423 + if _, err := w.Write(bs); err != nil { 424 + log.Error(ctx, "error writing response", "error", err) 425 + } 410 426 }) 411 427 412 428 router.GET("/notifications", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 420 436 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 421 437 return 422 438 } 423 - w.Write(bs) 439 + if _, err := w.Write(bs); err != nil { 440 + log.Error(ctx, "error writing response", "error", err) 441 + } 424 442 }) 425 443 426 444 router.GET("/chat-posts", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 434 452 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 435 453 return 436 454 } 437 - w.Write(bs) 455 + if _, err := w.Write(bs); err != nil { 456 + log.Error(ctx, "error writing response", "error", err) 457 + } 438 458 }) 439 459 440 460 router.GET("/chat/:cid", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 458 478 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 459 479 return 460 480 } 461 - w.Write(bs) 481 + if _, err := w.Write(bs); err != nil { 482 + log.Error(ctx, "error writing response", "error", err) 483 + } 462 484 }) 463 485 464 486 router.GET("/oauth-sessions", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 472 494 errors.WriteHTTPInternalServerError(w, "unable to marshal oauth sessions", err) 473 495 return 474 496 } 475 - w.Write(bs) 497 + if _, err := w.Write(bs); err != nil { 498 + log.Error(ctx, "error writing response", "error", err) 499 + } 476 500 }) 477 501 478 502 router.POST("/notification-blast", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 574 598 errors.WriteHTTPInternalServerError(w, "unable to marshal json", err) 575 599 return 576 600 } 577 - w.Write(bs) 601 + if _, err := w.Write(bs); err != nil { 602 + log.Error(ctx, "error writing response", "error", err) 603 + } 578 604 }) 579 605 580 606 handler := sloghttp.Recovery(router)
+1 -1
pkg/api/api_test.go
··· 53 53 54 54 for _, tt := range tests { 55 55 t.Run(tt.name, func(t *testing.T) { 56 - cli := &config.CLI{HttpAddr: tt.httpAddr, HttpsAddr: tt.httpsAddr} 56 + cli := &config.CLI{HTTPAddr: tt.httpAddr, HTTPSAddr: tt.httpsAddr} 57 57 mod := &model.DBModel{} 58 58 a := StreamplaceAPI{CLI: cli, Model: mod} 59 59
+7 -7
pkg/api/app-downloads_test.go
··· 98 98 branch := "electron" 99 99 cli := &config.CLI{GitLabURL: "https://example.com/api/v4/projects/173"} 100 100 queryGitlab = func(url string) (io.ReadCloser, error) { 101 - pkgUrl := fmt.Sprintf("%s/packages?order_by=created_at&sort=desc&package_name=%s", cli.GitLabURL, branch) 102 - fileUrl := fmt.Sprintf("%s/packages/339/package_files", cli.GitLabURL) 101 + pkgURL := fmt.Sprintf("%s/packages?order_by=created_at&sort=desc&package_name=%s", cli.GitLabURL, branch) 102 + fileURL := fmt.Sprintf("%s/packages/339/package_files", cli.GitLabURL) 103 103 var bs []byte 104 - if url == pkgUrl { 104 + if url == pkgURL { 105 105 bs = packageRes 106 - } else if url == fileUrl { 106 + } else if url == fileURL { 107 107 bs = fileRes 108 108 } else { 109 - return nil, fmt.Errorf("unknown url: '%s' (wanted '%s' or '%s')", url, pkgUrl, fileUrl) 109 + return nil, fmt.Errorf("unknown url: '%s' (wanted '%s' or '%s')", url, pkgURL, fileURL) 110 110 } 111 111 r := bytes.NewReader(bs) 112 112 return io.NopCloser(r), nil ··· 173 173 174 174 handler := a.HandleAppDownload(context.Background()) 175 175 176 - reqUrl := fmt.Sprintf("/dl/%s/%s", branch, tt.in) 176 + reqURL := fmt.Sprintf("/dl/%s/%s", branch, tt.in) 177 177 178 - req := httptest.NewRequest("GET", reqUrl, nil) 178 + req := httptest.NewRequest("GET", reqURL, nil) 179 179 rr := httptest.NewRecorder() 180 180 181 181 handler(rr, req, httprouter.Params{})
+4 -1
pkg/api/app-return.go
··· 8 8 9 9 "github.com/julienschmidt/httprouter" 10 10 apierrors "stream.place/streamplace/pkg/errors" 11 + "stream.place/streamplace/pkg/log" 11 12 ) 12 13 13 14 //go:embed app-return.html ··· 21 22 } 22 23 html := strings.Replace(appReturnHTML, "APP_BUNDLE_ID_REPLACE_ME", a.CLI.AppBundleID, 1) 23 24 w.Header().Set("Content-Type", "text/html") 24 - w.Write([]byte(html)) 25 + if _, err := w.Write([]byte(html)); err != nil { 26 + log.Error(ctx, "error writing response", "error", err) 27 + } 25 28 } 26 29 }
+12 -7
pkg/api/app-updates.go
··· 124 124 return &man, nil 125 125 } 126 126 127 - var DEFAULT_KEY = "main" 127 + var DefaultKey = "main" 128 128 129 129 // get keyid, with a default if there's not one 130 - func getKeyId(header string) string { 130 + func getKeyID(header string) string { 131 131 d, err := httpsfv.UnmarshalDictionary([]string{header}) 132 132 if err != nil { 133 - return DEFAULT_KEY 133 + return DefaultKey 134 134 } 135 135 key, ok := d.Get("keyid") 136 136 if !ok { 137 - return DEFAULT_KEY 137 + return DefaultKey 138 138 } 139 139 keystr, ok := key.(httpsfv.Item).Value.(string) 140 140 if !ok { 141 - return DEFAULT_KEY 141 + return DefaultKey 142 142 } 143 143 return keystr 144 144 } ··· 157 157 } 158 158 var header string 159 159 if u.SigningKey != nil { 160 - keyid := getKeyId(signing) 160 + keyid := getKeyID(signing) 161 161 msgHash := sha256.New() 162 162 _, err = msgHash.Write(bs) 163 163 if err != nil { ··· 225 225 } 226 226 227 227 extra, err := app.PackageJSON() 228 + if err != nil { 229 + return nil, fmt.Errorf("package.json failed") 230 + } 228 231 229 232 rt, ok := extra["runtimeVersion"] 230 233 if !ok { ··· 292 295 w.Header().Set("expo-protocol-version", "1") 293 296 w.Header().Set("expo-sfv-version", "0") 294 297 w.WriteHeader(http.StatusOK) 295 - w.Write(bs) 298 + if _, err := w.Write(bs); err != nil { 299 + log.Error(ctx, "error writing response", "error", err) 300 + } 296 301 } 297 302 } 298 303
+4 -2
pkg/api/desktop-updates.go
··· 34 34 35 35 // If this is a POST, add post data 36 36 if r.Method == "POST" { 37 - r.ParseForm() 37 + _ = r.ParseForm() 38 38 request = append(request, "\n") 39 39 request = append(request, r.Form.Encode()) 40 40 } ··· 139 139 if err != nil { 140 140 log.Log(ctx, "error marshaling mac update manifest", "error", err) 141 141 } 142 - w.Write(bs) 142 + if _, err := w.Write(bs); err != nil { 143 + log.Error(ctx, "error writing response", "error", err) 144 + } 143 145 } 144 146 } 145 147
+4 -2
pkg/api/feeds.go
··· 10 10 "stream.place/streamplace/pkg/log" 11 11 ) 12 12 13 - func (a *StreamplaceAPI) HandleDidJson(ctx context.Context) httprouter.Handle { 13 + func (a *StreamplaceAPI) HandleDidJSON(ctx context.Context) httprouter.Handle { 14 14 return func(w http.ResponseWriter, req *http.Request, params httprouter.Params) { 15 15 host := req.Host 16 16 didJSON := map[string]any{ ··· 33 33 log.Error(ctx, "could not marshal did json", "error", err) 34 34 return 35 35 } 36 - w.Write(bs) 36 + if _, err := w.Write(bs); err != nil { 37 + log.Error(ctx, "error writing response", "error", err) 38 + } 37 39 } 38 40 }
+3 -1
pkg/api/mimes.go
··· 26 26 if ext[0] == '#' { 27 27 break 28 28 } 29 - mime.AddExtensionType("."+ext, mimeType) 29 + if err := mime.AddExtensionType("."+ext, mimeType); err != nil { 30 + panic(err) 31 + } 30 32 } 31 33 } 32 34 if err := scanner.Err(); err != nil {
+16 -8
pkg/api/playback.go
··· 86 86 _, err := io.Copy(w, pr) 87 87 return err 88 88 }) 89 - g.Wait() 89 + if err := g.Wait(); err != nil { 90 + errors.WriteHTTPBadRequest(w, "request failed", err) 91 + } 90 92 } 91 93 } 92 94 ··· 138 140 _, err := io.Copy(w, pr) 139 141 return err 140 142 }) 141 - g.Wait() 143 + if err := g.Wait(); err != nil { 144 + errors.WriteHTTPBadRequest(w, "request failed", err) 145 + } 142 146 } 143 147 } 144 148 ··· 168 172 } 169 173 w.WriteHeader(201) 170 174 w.Header().Add("Location", r.URL.Path) 171 - w.Write([]byte(answer.SDP)) 175 + if _, err := w.Write([]byte(answer.SDP)); err != nil { 176 + log.Error(ctx, "error writing response", "error", err) 177 + } 172 178 } 173 179 } 174 180 175 - const BEARER_PREFIX = "Bearer " 176 - const KEY_PREFIX = "0x" 181 + const BearerPrefix = "Bearer " 182 + const KeyPrefix = "0x" 177 183 178 184 func (a *StreamplaceAPI) HandleWebRTCIngest(ctx context.Context) httprouter.Handle { 179 185 return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ··· 192 198 errors.WriteHTTPUnauthorized(w, "authorization header required", nil) 193 199 return 194 200 } 195 - if !strings.HasPrefix(auth, BEARER_PREFIX) { 201 + if !strings.HasPrefix(auth, BearerPrefix) { 196 202 errors.WriteHTTPUnauthorized(w, "invalid authorization header (needs Bearer prefix)", nil) 197 203 return 198 204 } 199 - encoded = auth[len(BEARER_PREFIX):] 205 + encoded = auth[len(BearerPrefix):] 200 206 // it's easy to copy-paste a trailing or leading space, so clear those out 201 207 encoded = strings.TrimSpace(encoded) 202 208 } ··· 230 236 log.Log(ctx, "location", "location", location) 231 237 w.Header().Set("Location", location) 232 238 w.WriteHeader(201) 233 - w.Write([]byte(answer.SDP)) 239 + if _, err := w.Write([]byte(answer.SDP)); err != nil { 240 + log.Error(ctx, "error writing response", "error", err) 241 + } 234 242 } 235 243 } 236 244
+3 -2
pkg/aqio/aqio.go
··· 65 65 // Returns a ReadSeeker based on the current value of the buffer. 66 66 // Don't write to it afterwards! 67 67 func (rws *ReadWriteSeeker) ReadSeeker() io.ReadSeeker { 68 - rws.Seek(0, io.SeekStart) 68 + // can't fail, we're seeking to 0 69 + _, _ = rws.Seek(0, io.SeekStart) 69 70 return rws 70 71 } 71 72 72 73 // Returns the current value of the buffer. 73 74 // Don't write to it afterwards! 74 75 func (rws *ReadWriteSeeker) Bytes() ([]byte, error) { 75 - rws.Seek(0, io.SeekStart) 76 + _, _ = rws.Seek(0, io.SeekStart) 76 77 bs, err := io.ReadAll(rws) 77 78 if err != nil { 78 79 return nil, err
+4 -9
pkg/atproto/firehose.go
··· 150 150 constants.APP_BSKY_GRAPH_BLOCK, 151 151 } 152 152 153 - func (atsync *ATProtoSynchronizer) handleCommitEventOps(ctx context.Context, evt *comatproto.SyncSubscribeRepos_Commit) error { 153 + func (atsync *ATProtoSynchronizer) handleCommitEventOps(ctx context.Context, evt *comatproto.SyncSubscribeRepos_Commit) { 154 154 ctx = log.WithLogValues(ctx, "event", "commit", "did", evt.Repo, "rev", evt.Rev, "seq", fmt.Sprintf("%d", evt.Seq), "func", "handleCommitEventOps") 155 155 now := time.Now() 156 156 atsync.LastSeen = now 157 157 158 158 if evt.TooBig { 159 159 log.Warn(ctx, "skipping tooBig events for now") 160 - return nil 160 + return 161 161 } 162 162 163 163 rr, err := repo.ReadRepoFromCar(ctx, bytes.NewReader(evt.Blocks)) 164 164 if err != nil { 165 165 log.Error(ctx, "failed to read repo from car", "err", err) 166 - return nil 166 + return 167 167 } 168 168 169 169 for _, op := range evt.Ops { 170 170 collection, rkey, err := syntax.ParseRepoPath(op.Path) 171 171 if err != nil { 172 172 log.Error(ctx, "invalid path in repo op", "eventKind", op.Action, "path", op.Path) 173 - return nil 173 + return 174 174 } 175 175 ctx = log.WithLogValues(ctx, "eventKind", op.Action, "collection", collection.String(), "rkey", rkey.String()) 176 176 ··· 198 198 if err != nil { 199 199 log.Error(ctx, "failed to get repo", "err", err) 200 200 continue 201 - } 202 - if r == nil { 203 - // someone we don't know aboutd 204 - // continue 205 201 } 206 202 // log.Warn(ctx, "got record we care about", "collection", collection, "rkey", rkey) 207 203 ··· 254 250 log.Error(ctx, "unexpected record op kind") 255 251 } 256 252 } 257 - return nil 258 253 }
+4 -2
pkg/atproto/sync.go
··· 172 172 return fmt.Errorf("livestream url is not a string") 173 173 } 174 174 log.Debug(ctx, "livestream url", "url", url) 175 - atsync.Model.CreateFeedPost(ctx, &model.FeedPost{ 175 + if err := atsync.Model.CreateFeedPost(ctx, &model.FeedPost{ 176 176 CID: cid, 177 177 CreatedAt: createdAt, 178 178 FeedPost: recCBOR, ··· 181 181 Type: "livestream", 182 182 URI: aturi.String(), 183 183 IndexedAt: &now, 184 - }) 184 + }); err != nil { 185 + return fmt.Errorf("failed to create bluesky post: %w", err) 186 + } 185 187 } else { 186 188 if rec.Reply == nil || rec.Reply.Root == nil { 187 189 return nil
+2 -1
pkg/atproto/util.go
··· 15 15 if !ok { 16 16 return nil, fmt.Errorf("public key is not an ECDSA public key") 17 17 } 18 - publicKeyBytes := elliptic.Marshal(ethcrypto.S256(), ecdsaPub.X, ecdsaPub.Y) 18 + 19 + publicKeyBytes := elliptic.Marshal(ethcrypto.S256(), ecdsaPub.X, ecdsaPub.Y) //nolint:all 19 20 atkey, err := atcrypto.ParsePublicUncompressedBytesK256(publicKeyBytes) 20 21 if err != nil { 21 22 return nil, err
+13 -2
pkg/cmd/sign.go
··· 22 22 streamerName := fs.String("streamer", "", "streamer name") 23 23 taURL := fs.String("ta-url", "http://timestamp.digicert.com", "timestamp authority server for signing") 24 24 startTime := fs.Int64("start-time", 0, "start time of the stream") 25 - fs.Parse(os.Args[2:]) 25 + if err := fs.Parse(os.Args[2:]); err != nil { 26 + return err 27 + } 26 28 27 29 keyBs, err := base58.Decode(*key) 28 30 if err != nil { ··· 45 47 } 46 48 47 49 pub, err := aqpub.FromPublicKey(signer.Public().(*ecdsa.PublicKey)) 50 + if err != nil { 51 + return err 52 + } 48 53 49 54 ms := &media.MediaSignerLocal{ 50 55 Signer: signer, ··· 60 65 } 61 66 62 67 mp4, err := ms.SignMP4(ctx, bytes.NewReader(inputBs), *startTime) 63 - io.Copy(os.Stdout, bytes.NewReader(mp4)) 68 + if err != nil { 69 + return err 70 + } 71 + _, err = io.Copy(os.Stdout, bytes.NewReader(mp4)) 72 + if err != nil { 73 + return err 74 + } 64 75 65 76 return nil 66 77 }
+4 -1
pkg/cmd/stream.go
··· 15 15 if resp.StatusCode != 200 { 16 16 return fmt.Errorf("http status %s", resp.Status) 17 17 } 18 - io.Copy(os.Stdout, resp.Body) 18 + _, err = io.Copy(os.Stdout, resp.Body) 19 + if err != nil { 20 + return fmt.Errorf("failed copying body: %w", err) 21 + } 19 22 return nil 20 23 }
+11 -7
pkg/cmd/streamplace.go
··· 70 70 } 71 71 if selfTest { 72 72 runtime.GC() 73 - pprof.Lookup("goroutine").WriteTo(os.Stderr, 2) 73 + if err := pprof.Lookup("goroutine").WriteTo(os.Stderr, 2); err != nil { 74 + log.Error(context.Background(), "error creating pprof", "error", err) 75 + } 74 76 fmt.Println("self-test successful!") 75 77 os.Exit(0) 76 78 } ··· 111 113 fmt.Println("self-test successful!") 112 114 os.Exit(0) 113 115 } 114 - flag.Set("logtostderr", "true") 116 + _ = flag.Set("logtostderr", "true") 115 117 vFlag := flag.Lookup("v") 116 118 fs := flag.NewFlagSet("streamplace", flag.ExitOnError) 117 119 cli := config.CLI{Build: build} 118 120 fs.StringVar(&cli.DataDir, "data-dir", config.DefaultDataDir(), "directory for keeping all streamplace data") 119 - fs.StringVar(&cli.HttpAddr, "http-addr", ":38080", "Public HTTP address") 120 - fs.StringVar(&cli.HttpInternalAddr, "http-internal-addr", "127.0.0.1:39090", "Private, admin-only HTTP address") 121 - fs.StringVar(&cli.HttpsAddr, "https-addr", ":38443", "Public HTTPS address") 121 + fs.StringVar(&cli.HTTPAddr, "http-addr", ":38080", "Public HTTP address") 122 + fs.StringVar(&cli.HTTPInternalAddr, "http-internal-addr", "127.0.0.1:39090", "Private, admin-only HTTP address") 123 + fs.StringVar(&cli.HTTPSAddr, "https-addr", ":38443", "Public HTTPS address") 122 124 fs.BoolVar(&cli.Secure, "secure", false, "Run with HTTPS. Required for WebRTC output") 123 125 cli.DataDirFlag(fs, &cli.TLSCertPath, "tls-cert", filepath.Join("tls", "tls.crt"), "Path to TLS certificate") 124 126 cli.DataDirFlag(fs, &cli.TLSKeyPath, "tls-key", filepath.Join("tls", "tls.key"), "Path to TLS key") ··· 184 186 if err != nil { 185 187 return err 186 188 } 187 - vFlag.Value.Set(*verbosity) 189 + _ = vFlag.Value.Set(*verbosity) 188 190 log.SetColorLogger(cli.Color) 189 191 ctx := context.Background() 190 192 ctx = log.WithDebugValue(ctx, cli.Debug) ··· 475 477 select { 476 478 case s := <-c: 477 479 if s == syscall.SIGABRT { 478 - pprof.Lookup("goroutine").WriteTo(os.Stderr, 2) 480 + if err := pprof.Lookup("goroutine").WriteTo(os.Stderr, 2); err != nil { 481 + log.Error(ctx, "failed to create pprof", "error", err) 482 + } 479 483 } 480 484 log.Log(ctx, "caught signal, attempting clean shutdown", "signal", s) 481 485 return fmt.Errorf("%w signal=%v", ErrCaughtSignal, s)
+44 -36
pkg/cmd/whep.go
··· 59 59 60 60 func (w *WHEPClient) StartWHEPConnection(ctx context.Context) (*WHEPConnection, error) { 61 61 62 - ctx, cancel := context.WithCancel(ctx) 63 - 64 62 // Prepare the configuration 65 63 config := webrtc.Configuration{} 66 64 ··· 133 131 } 134 132 }() 135 133 136 - peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) { 137 - log.Log(ctx, "track received", "track", track.ID()) 134 + go func() { 135 + ctx, cancel := context.WithCancel(ctx) 136 + peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) { 137 + log.Log(ctx, "track received", "track", track.ID()) 138 138 139 - // Determine track type 140 - trackType := "video" 141 - if track.Kind() == webrtc.RTPCodecTypeAudio { 142 - trackType = "audio" 143 - } 139 + // Determine track type 140 + trackType := "video" 141 + if track.Kind() == webrtc.RTPCodecTypeAudio { 142 + trackType = "audio" 143 + } 144 144 145 - trackStat := stats[trackType] 145 + trackStat := stats[trackType] 146 + 147 + for { 148 + if ctx.Err() != nil { 149 + return 150 + } 151 + rtp, _, err := track.ReadRTP() 152 + if err != nil { 153 + log.Log(ctx, "error reading RTP", "error", err) 154 + cancel() 155 + return 156 + } 146 157 147 - for { 148 - if ctx.Err() != nil { 149 - return 158 + trackStat.mu.Lock() 159 + trackStat.total += len(rtp.Payload) 160 + trackStat.mu.Unlock() 150 161 } 151 - rtp, _, err := track.ReadRTP() 152 - if err != nil { 153 - log.Log(ctx, "error reading RTP", "error", err) 154 - cancel() 155 - return 162 + }) 163 + peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { 164 + log.Log(ctx, "WHEP connection State has changed", "state", connectionState.String()) 165 + for _, state := range failureStates { 166 + if connectionState == state { 167 + log.Log(ctx, "connection failed, cancelling") 168 + cancel() 169 + } 156 170 } 171 + }) 157 172 158 - trackStat.mu.Lock() 159 - trackStat.total += len(rtp.Payload) 160 - trackStat.mu.Unlock() 161 - } 162 - }) 163 - peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { 164 - log.Log(ctx, "WHEP connection State has changed", "state", connectionState.String()) 165 - for _, state := range failureStates { 166 - if connectionState == state { 167 - log.Log(ctx, "connection failed, cancelling") 168 - cancel() 169 - } 170 - } 171 - }) 173 + <-ctx.Done() 174 + peerConnection.Close() 175 + }() 172 176 peerConnection.OnICECandidate(func(candidate *webrtc.ICECandidate) { 173 177 log.Log(ctx, "ICE candidate", "candidate", candidate) 174 178 }) 175 - peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo, webrtc.RTPTransceiverInit{ 179 + if _, err := peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeVideo, webrtc.RTPTransceiverInit{ 176 180 Direction: webrtc.RTPTransceiverDirectionRecvonly, 177 - }) 178 - peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio, webrtc.RTPTransceiverInit{ 181 + }); err != nil { 182 + return nil, fmt.Errorf("failed to add video transceiver: %w", err) 183 + } 184 + if _, err := peerConnection.AddTransceiverFromKind(webrtc.RTPCodecTypeAudio, webrtc.RTPTransceiverInit{ 179 185 Direction: webrtc.RTPTransceiverDirectionRecvonly, 180 - }) 186 + }); err != nil { 187 + return nil, fmt.Errorf("failed to add audio transceiver: %w", err) 188 + } 181 189 182 190 // Create an offer 183 191 offer, err := peerConnection.CreateOffer(nil)
+7 -3
pkg/cmd/whip.go
··· 105 105 return err 106 106 } 107 107 108 - fileSrc.Set("location", w.File) 108 + if err := fileSrc.Set("location", w.File); err != nil { 109 + return err 110 + } 109 111 110 112 videoSink, err := pipeline.GetElementByName("videoappsink") 111 113 if err != nil { ··· 204 206 205 207 errCh := make(chan error, 1) 206 208 207 - for i, _ := range sinks { 209 + for i := range sinks { 208 210 func(i int) { 209 211 sink := sinks[i] 210 212 trackType := "video" ··· 265 267 } 266 268 267 269 go func() { 268 - media.HandleBusMessages(ctx, pipeline) 270 + if err := media.HandleBusMessages(ctx, pipeline); err != nil { 271 + log.Log(ctx, "pipeline error", "error", err) 272 + } 269 273 cancel() 270 274 }() 271 275
+12 -12
pkg/config/config.go
··· 24 24 "stream.place/streamplace/pkg/crypto/aqpub" 25 25 ) 26 26 27 - const SP_DATA_DIR = "$SP_DATA_DIR" 28 - const SEGMENTS_DIR = "segments" 27 + const SPDataDir = "$SP_DATA_DIR" 28 + const SegmentsDir = "segments" 29 29 30 30 type BuildFlags struct { 31 31 Version string ··· 53 53 EthPassword string 54 54 FirebaseServiceAccount string 55 55 GitLabURL string 56 - HttpAddr string 57 - HttpInternalAddr string 58 - HttpsAddr string 56 + HTTPAddr string 57 + HTTPInternalAddr string 58 + HTTPSAddr string 59 59 RtmpsAddr string 60 60 Secure bool 61 61 NoMist bool ··· 102 102 dataDirFlags []*string 103 103 } 104 104 105 - var STREAMPLACE_SCHEME_PREFIX = "streamplace://" 105 + var StreamplaceSchemePrefix = "streamplace://" 106 106 107 107 func (cli *CLI) OwnInternalURL() string { 108 108 // No errors because we know it's valid from AddrFlag 109 - host, port, _ := net.SplitHostPort(cli.HttpInternalAddr) 109 + host, port, _ := net.SplitHostPort(cli.HTTPInternalAddr) 110 110 ip := net.ParseIP(host) 111 111 if ip.IsUnspecified() { 112 112 host = "127.0.0.1" ··· 162 162 return fmt.Errorf("could not determine default data dir (no $HOME) and none provided, please set --data-dir") 163 163 } 164 164 for _, dest := range cli.dataDirFlags { 165 - *dest = strings.Replace(*dest, SP_DATA_DIR, cli.DataDir, 1) 165 + *dest = strings.Replace(*dest, SPDataDir, cli.DataDir, 1) 166 166 } 167 167 return nil 168 168 } ··· 241 241 } 242 242 fname := fmt.Sprintf("%s%s", aqt.FileSafeString(), ext) 243 243 yr, mon, day, hr, min, _, _ := aqt.Parts() 244 - return cli.DataFilePath([]string{SEGMENTS_DIR, user, yr, mon, day, hr, min, fname}), nil 244 + return cli.DataFilePath([]string{SegmentsDir, user, yr, mon, day, hr, min, fname}), nil 245 245 } 246 246 247 247 // get a path to a segment file in our database 248 248 func (cli *CLI) HLSDir(user string) (string, error) { 249 - return cli.DataFilePath([]string{SEGMENTS_DIR, "hls", user}), nil 249 + return cli.DataFilePath([]string{SegmentsDir, "hls", user}), nil 250 250 } 251 251 252 252 // create a segment file in our database 253 253 func (cli *CLI) SegmentFileCreate(user string, aqt aqtime.AQTime, ext string) (*os.File, error) { 254 254 fname := fmt.Sprintf("%s.%s", aqt.FileSafeString(), ext) 255 255 yr, mon, day, hr, min, _, _ := aqt.Parts() 256 - return cli.DataFileCreate([]string{SEGMENTS_DIR, user, yr, mon, day, hr, min, fname}, false) 256 + return cli.DataFileCreate([]string{SegmentsDir, user, yr, mon, day, hr, min, fname}, false) 257 257 } 258 258 259 259 // read a file from our data dir ··· 274 274 275 275 func (cli *CLI) DataDirFlag(fs *flag.FlagSet, dest *string, name, defaultValue, usage string) { 276 276 cli.dataDirFlags = append(cli.dataDirFlags, dest) 277 - *dest = filepath.Join(SP_DATA_DIR, defaultValue) 277 + *dest = filepath.Join(SPDataDir, defaultValue) 278 278 usage = fmt.Sprintf(`%s (default: "%s")`, usage, *dest) 279 279 fs.Func(name, usage, func(s string) error { 280 280 *dest = s
+19 -17
pkg/config/git/git.go
··· 38 38 ` 39 39 40 40 func gitlabURL() string { 41 - CI_API_V4_URL := os.Getenv("CI_API_V4_URL") 42 - CI_PROJECT_ID := os.Getenv("CI_PROJECT_ID") 41 + CI_API_V4_URL := os.Getenv("CI_API_V4_URL") //nolint:all 42 + CIProjectID := os.Getenv("CI_PROJECT_ID") 43 43 CI_API_V4_URL = strings.Replace(CI_API_V4_URL, "https://git.stream.place", "https://git-cloudflare.stream.place", 1) 44 - return fmt.Sprintf("%s/projects/%s", CI_API_V4_URL, CI_PROJECT_ID) 44 + return fmt.Sprintf("%s/projects/%s", CI_API_V4_URL, CIProjectID) 45 45 } 46 46 47 47 func gitlab(suffix string, dest any) { ··· 112 112 } else if *doBranch { 113 113 out = branch() 114 114 } else if *env { 115 - STREAMPLACE_BRANCH := branch() 115 + StreamplaceBranch := branch() 116 116 outMap := map[string]string{} 117 - outMap["STREAMPLACE_BRANCH"] = STREAMPLACE_BRANCH 117 + outMap["STREAMPLACE_BRANCH"] = StreamplaceBranch 118 118 outMap["STREAMPLACE_VERSION"] = desc 119 - outMap["STREAMPLACE_BRANCH"] = STREAMPLACE_BRANCH 119 + outMap["STREAMPLACE_BRANCH"] = StreamplaceBranch 120 120 for _, arch := range []string{"amd64", "arm64"} { 121 121 k := fmt.Sprintf("STREAMPLACE_URL_LINUX_%s", strings.ToUpper(arch)) 122 - v := fmt.Sprintf("%s/packages/generic/%s/%s/streamplace-%s-linux-%s.tar.gz", gitlabURL(), STREAMPLACE_BRANCH, desc, desc, arch) 122 + v := fmt.Sprintf("%s/packages/generic/%s/%s/streamplace-%s-linux-%s.tar.gz", gitlabURL(), StreamplaceBranch, desc, desc, arch) 123 123 outMap[k] = v 124 124 macK := fmt.Sprintf("STREAMPLACE_URL_DARWIN_%s", strings.ToUpper(arch)) 125 - macV := fmt.Sprintf("%s/packages/generic/%s/%s/streamplace-%s-darwin-%s.zip", gitlabURL(), STREAMPLACE_BRANCH, desc, desc, arch) 125 + macV := fmt.Sprintf("%s/packages/generic/%s/%s/streamplace-%s-darwin-%s.zip", gitlabURL(), StreamplaceBranch, desc, desc, arch) 126 126 outMap[macK] = macV 127 127 } 128 - outMap["STREAMPLACE_DESKTOP_URL_WINDOWS_AMD64"] = fmt.Sprintf("%s/packages/generic/%s/%s/streamplace-desktop-%s-windows-amd64.exe", gitlabURL(), STREAMPLACE_BRANCH, desc, desc) 128 + outMap["STREAMPLACE_DESKTOP_URL_WINDOWS_AMD64"] = fmt.Sprintf("%s/packages/generic/%s/%s/streamplace-desktop-%s-windows-amd64.exe", gitlabURL(), StreamplaceBranch, desc, desc) 129 129 for k, v := range outMap { 130 130 out = out + fmt.Sprintf("%s=%s\n", k, v) 131 131 } ··· 143 143 return s1 < s2 144 144 }) 145 145 for _, file := range pkgFiles { 146 - fileJson := map[string]string{ 146 + fileJSON := map[string]string{ 147 147 "name": file["file_name"].(string), 148 148 "url": fmt.Sprintf("%s/packages/generic/%s/%s/%s", gitlabURL(), branch(), desc, file["file_name"].(string)), 149 149 } 150 - bs, err := json.Marshal(fileJson) 150 + bs, err := json.Marshal(fileJSON) 151 151 if err != nil { 152 152 return err 153 153 } ··· 168 168 } 169 169 170 170 if *output != "" { 171 - os.WriteFile(*output, []byte(out), 0644) 171 + if err := os.WriteFile(*output, []byte(out), 0644); err != nil { 172 + return err 173 + } 172 174 } else { 173 175 fmt.Print(out) 174 176 } ··· 176 178 } 177 179 178 180 func branch() string { 179 - CI_COMMIT_TAG := os.Getenv("CI_COMMIT_TAG") 180 - CI_COMMIT_BRANCH := os.Getenv("CI_COMMIT_BRANCH") 181 - if CI_COMMIT_TAG != "" { 181 + CICommitTag := os.Getenv("CI_COMMIT_TAG") 182 + CICommitBranch := os.Getenv("CI_COMMIT_BRANCH") 183 + if CICommitTag != "" { 182 184 return "latest" 183 - } else if CI_COMMIT_BRANCH != "" { 184 - return strings.Replace(CI_COMMIT_BRANCH, "/", "-", -1) 185 + } else if CICommitBranch != "" { 186 + return strings.ReplaceAll(CICommitBranch, "/", "-") 185 187 } else { 186 188 panic("CI_COMMIT_TAG and CI_COMMIT_BRANCH undefined, can't get branch") 187 189 }
+3 -1
pkg/config/uuid/uuid.go
··· 20 20 21 21 flag.Parse() 22 22 if *output != "" { 23 - os.WriteFile(*output, []byte(u.String()), 0644) 23 + if err := os.WriteFile(*output, []byte(u.String()), 0644); err != nil { 24 + panic(err) 25 + } 24 26 } else { 25 27 fmt.Printf("%s", u) 26 28 }
+10 -10
pkg/constants/constants.go
··· 1 1 package constants 2 2 3 - var PLACE_STREAM_KEY = "place.stream.key" 4 - var PLACE_STREAM_LIVESTREAM = "place.stream.livestream" 5 - var PLACE_STREAM_CHAT_MESSAGE = "place.stream.chat.message" 6 - var PLACE_STREAM_CHAT_PROFILE = "place.stream.chat.profile" 7 - var STREAMPLACE_SIGNING_KEY = "signingKey" 8 - var APP_BSKY_GRAPH_FOLLOW = "app.bsky.graph.follow" 9 - var APP_BSKY_FEED_POST = "app.bsky.feed.post" 10 - var APP_BSKY_GRAPH_BLOCK = "app.bsky.graph.block" 3 + var PLACE_STREAM_KEY = "place.stream.key" //nolint:all 4 + var PLACE_STREAM_LIVESTREAM = "place.stream.livestream" //nolint:all 5 + var PLACE_STREAM_CHAT_MESSAGE = "place.stream.chat.message" //nolint:all 6 + var PLACE_STREAM_CHAT_PROFILE = "place.stream.chat.profile" //nolint:all 7 + var STREAMPLACE_SIGNING_KEY = "signingKey" //nolint:all 8 + var APP_BSKY_GRAPH_FOLLOW = "app.bsky.graph.follow" //nolint:all 9 + var APP_BSKY_FEED_POST = "app.bsky.feed.post" //nolint:all 10 + var APP_BSKY_GRAPH_BLOCK = "app.bsky.graph.block" //nolint:all 11 11 12 - const DID_KEY_PREFIX = "did:key" 13 - const ADDRESS_KEY_PREFIX = "0x" 12 + const DID_KEY_PREFIX = "did:key" //nolint:all 13 + const ADDRESS_KEY_PREFIX = "0x" //nolint:all
+3 -3
pkg/crypto/signers/eip712/eip712test/eip712test.go
··· 127 127 return parsePKCS8PrivateKey(der) 128 128 } 129 129 130 - var OID_RSA_PSS asn1.ObjectIdentifier = []int{1, 2, 840, 113549, 1, 1, 10} 131 - var OID_EC asn1.ObjectIdentifier = []int{1, 2, 840, 10045, 2, 1} 132 - var OID_SECP256K1 asn1.ObjectIdentifier = []int{1, 3, 132, 0, 10} 130 + var OID_RSA_PSS asn1.ObjectIdentifier = []int{1, 2, 840, 113549, 1, 1, 10} //nolint:all 131 + var OID_EC asn1.ObjectIdentifier = []int{1, 2, 840, 10045, 2, 1} //nolint:all 132 + var OID_SECP256K1 asn1.ObjectIdentifier = []int{1, 3, 132, 0, 10} //nolint:all 133 133 134 134 func parsePKCS8PrivateKey(der []byte) (crypto.Signer, error) { 135 135 var privKey pkcs8
+8 -8
pkg/crypto/signers/signers.go
··· 41 41 // pub := priv.Public().(*ecdsa.PublicKey) 42 42 // publicKeyBytes := elliptic.Marshal(elliptic.P256(), pub.X, pub.Y) 43 43 pub := signer.Public().(*ecdsa.PublicKey) 44 - publicKeyBytes := elliptic.Marshal(crypto.S256(), pub.X, pub.Y) 44 + publicKeyBytes := elliptic.Marshal(crypto.S256(), pub.X, pub.Y) //nolint:all 45 45 idhash := sha1.Sum(publicKeyBytes) 46 - subjectKeyId := idhash[:] 46 + subjectKeyID := idhash[:] 47 47 hex := HexAddr(pub) 48 48 49 49 template := x509.Certificate{ ··· 57 57 KeyUsage: keyUsage, 58 58 ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageEmailProtection}, 59 59 BasicConstraintsValid: true, 60 - SubjectKeyId: subjectKeyId, 61 - AuthorityKeyId: subjectKeyId, 60 + SubjectKeyId: subjectKeyID, 61 + AuthorityKeyId: subjectKeyID, 62 62 } 63 63 64 64 p256DERBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, priv.Public(), priv) ··· 99 99 Validity: old.Validity, 100 100 Subject: old.Subject, 101 101 PublicKey: k256info, 102 - UniqueId: old.UniqueId, 103 - SubjectUniqueId: old.SubjectUniqueId, 102 + UniqueID: old.UniqueID, 103 + SubjectUniqueID: old.SubjectUniqueID, 104 104 Extensions: old.Extensions, 105 105 } 106 106 ··· 182 182 Validity validity 183 183 Subject asn1.RawValue 184 184 PublicKey publicKeyInfo 185 - UniqueId asn1.BitString `asn1:"optional,tag:1"` 186 - SubjectUniqueId asn1.BitString `asn1:"optional,tag:2"` 185 + UniqueID asn1.BitString `asn1:"optional,tag:1"` 186 + SubjectUniqueID asn1.BitString `asn1:"optional,tag:2"` 187 187 Extensions []pkix.Extension `asn1:"omitempty,optional,explicit,tag:3"` 188 188 } 189 189
+14 -4
pkg/director/stream_session.go
··· 338 338 339 339 func (ss *StreamSession) Transcode(ctx context.Context, spseg *streamplace.Segment, data []byte) error { 340 340 rs, err := renditions.GenerateRenditions(spseg) 341 + if err != nil { 342 + return fmt.Errorf("failed to generated renditions: %w", err) 343 + } 344 + 341 345 if ss.lp == nil { 342 346 var err error 343 347 ss.lp, err = livepeer.NewLivepeerSession(ctx, spseg.Creator, ss.cli.LivepeerGatewayURL) ··· 365 369 log.Debug(ctx, "publishing segment", "rendition", rs[i]) 366 370 fd, err := ss.cli.SegmentFileCreate(spseg.Creator, aqt, fmt.Sprintf("%s.mp4", rs[i].Name)) 367 371 if err != nil { 368 - return err 372 + return fmt.Errorf("failed to create transcoded segment file: %w", err) 369 373 } 370 374 defer fd.Close() 371 - fd.Write(seg) 375 + _, err = fd.Write(seg) 376 + if err != nil { 377 + return fmt.Errorf("failed to write transcoded segment file: %w", err) 378 + } 372 379 go ss.TryAddToHLS(ctx, spseg, rs[i].Name, seg) 373 380 go ss.mm.PublishSegment(ctx, spseg.Creator, rs[i].Name, &segchanman.Seg{ 374 381 Filepath: fd.Name(), ··· 407 414 return fmt.Errorf("failed to parse segment start time: %w", err) 408 415 } 409 416 log.Debug(ctx, "transmuxed to mpegts, adding to hls", "rendition", rendition, "size", buf.Len()) 410 - ss.hls.GetRendition(rendition).NewSegment(&media.Segment{ 417 + if err := ss.hls.GetRendition(rendition).NewSegment(&media.Segment{ 411 418 Buf: &buf, 412 419 Duration: time.Duration(dur), 413 420 Time: aqt.Time(), 414 - }) 421 + }); err != nil { 422 + return fmt.Errorf("failed to create new segment: %w", err) 423 + } 424 + 415 425 return nil 416 426 }
+9 -9
pkg/errors/errors.go
··· 14 14 Err error `json:"-"` 15 15 } 16 16 17 - func writeHttpError(w http.ResponseWriter, msg string, status int, err error) APIError { 17 + func writeHTTPError(w http.ResponseWriter, msg string, status int, err error) APIError { 18 18 w.WriteHeader(status) 19 19 20 20 var errorDetail string ··· 35 35 36 36 // HTTP Errors 37 37 func WriteHTTPUnauthorized(w http.ResponseWriter, msg string, err error) APIError { 38 - return writeHttpError(w, msg, http.StatusUnauthorized, err) 38 + return writeHTTPError(w, msg, http.StatusUnauthorized, err) 39 39 } 40 40 41 41 func WriteHTTPForbidden(w http.ResponseWriter, msg string, err error) APIError { 42 - return writeHttpError(w, msg, http.StatusForbidden, err) 42 + return writeHTTPError(w, msg, http.StatusForbidden, err) 43 43 } 44 44 45 45 func WriteHTTPBadRequest(w http.ResponseWriter, msg string, err error) APIError { 46 - return writeHttpError(w, msg, http.StatusBadRequest, err) 46 + return writeHTTPError(w, msg, http.StatusBadRequest, err) 47 47 } 48 48 49 49 func WriteHTTPUnsupportedMediaType(w http.ResponseWriter, msg string, err error) APIError { 50 - return writeHttpError(w, msg, http.StatusUnsupportedMediaType, err) 50 + return writeHTTPError(w, msg, http.StatusUnsupportedMediaType, err) 51 51 } 52 52 53 53 func WriteHTTPNotFound(w http.ResponseWriter, msg string, err error) APIError { 54 - return writeHttpError(w, msg, http.StatusNotFound, err) 54 + return writeHTTPError(w, msg, http.StatusNotFound, err) 55 55 } 56 56 57 57 func WriteHTTPInternalServerError(w http.ResponseWriter, msg string, err error) APIError { 58 - return writeHttpError(w, msg, http.StatusInternalServerError, err) 58 + return writeHTTPError(w, msg, http.StatusInternalServerError, err) 59 59 } 60 60 61 61 func WriteHTTPNotImplemented(w http.ResponseWriter, msg string, err error) APIError { 62 - return writeHttpError(w, msg, http.StatusNotImplemented, err) 62 + return writeHTTPError(w, msg, http.StatusNotImplemented, err) 63 63 } 64 64 65 65 func WriteHTTPTooManyRequests(w http.ResponseWriter, msg string) APIError { 66 - return writeHttpError(w, msg, http.StatusTooManyRequests, nil) 66 + return writeHTTPError(w, msg, http.StatusTooManyRequests, nil) 67 67 }
-8
pkg/gen/gen.go
··· 1 1 package main 2 2 3 3 import ( 4 - "reflect" 5 - 6 - "github.com/bluesky-social/indigo/mst" 7 4 "stream.place/streamplace/pkg/streamplace" 8 5 9 6 cbg "github.com/whyrusleeping/cbor-gen" 10 7 ) 11 8 12 9 func main() { 13 - var typVals []any 14 - for _, typ := range mst.CBORTypes() { 15 - typVals = append(typVals, reflect.New(typ).Elem().Interface()) 16 - } 17 - 18 10 genCfg := cbg.Gen{ 19 11 MaxStringLength: 1_000_000, 20 12 }
+10 -10
pkg/linking/linking.go
··· 49 49 } 50 50 51 51 titleStr := fmt.Sprintf("@%s is 🔴LIVE on %s!", lsv.Author.Handle, u.Host) 52 - outUrl := u.String() 52 + outURL := u.String() 53 53 54 54 pageTitle := fmt.Sprintf("@%s | %s", lsv.Author.Handle, u.Host) 55 55 56 - thumbUrl, _ := url.Parse(u.String()) 57 - thumbUrl.Path = fmt.Sprintf("/api/playback/%s/stream.jpg", lsv.Author.Did) 56 + thumbURL, _ := url.Parse(u.String()) 57 + thumbURL.Path = fmt.Sprintf("/api/playback/%s/stream.jpg", lsv.Author.Did) 58 58 59 59 // Define all meta tags 60 60 metaTags := []MetaTag{ ··· 66 66 {Type: "property", Key: "og:type", Content: "website"}, 67 67 {Type: "property", Key: "og:title", Content: titleStr}, 68 68 {Type: "property", Key: "og:description", Content: ls.Title}, 69 - {Type: "property", Key: "og:image", Content: thumbUrl.String()}, 69 + {Type: "property", Key: "og:image", Content: thumbURL.String()}, 70 70 71 71 // Twitter Meta Tags 72 72 {Type: "name", Key: "twitter:card", Content: "summary_large_image"}, 73 73 {Type: "property", Key: "twitter:domain", Content: u.Host}, 74 - {Type: "property", Key: "twitter:url", Content: outUrl}, 74 + {Type: "property", Key: "twitter:url", Content: outURL}, 75 75 {Type: "name", Key: "twitter:title", Content: titleStr}, 76 76 {Type: "name", Key: "twitter:description", Content: ls.Title}, 77 - {Type: "name", Key: "twitter:image", Content: thumbUrl.String()}, 77 + {Type: "name", Key: "twitter:image", Content: thumbURL.String()}, 78 78 } 79 79 80 80 return l.GenerateHTML(ctx, &PageConfig{ ··· 88 88 return nil, errors.New("url is nil") 89 89 } 90 90 91 - thumbUrl, _ := url.Parse(u.String()) 92 - thumbUrl.Path = "/linkbanner.png" 91 + thumbURL, _ := url.Parse(u.String()) 92 + thumbURL.Path = "/linkbanner.png" 93 93 94 94 // Define all meta tags 95 95 metaTags := []MetaTag{ ··· 101 101 {Type: "property", Key: "og:type", Content: "website"}, 102 102 {Type: "property", Key: "og:title", Content: "Stream.place"}, 103 103 {Type: "property", Key: "og:description", Content: "Stream.place is open-source livestreaming on the AT Protocol."}, 104 - {Type: "property", Key: "og:image", Content: thumbUrl.String()}, 104 + {Type: "property", Key: "og:image", Content: thumbURL.String()}, 105 105 106 106 // Twitter Meta Tags 107 107 {Type: "name", Key: "twitter:card", Content: "summary_large_image"}, ··· 109 109 {Type: "property", Key: "twitter:url", Content: u.String()}, 110 110 {Type: "name", Key: "twitter:title", Content: "Stream.place"}, 111 111 {Type: "name", Key: "twitter:description", Content: "Stream.place is open-source livestreaming on the AT Protocol."}, 112 - {Type: "name", Key: "twitter:image", Content: thumbUrl.String()}, 112 + {Type: "name", Key: "twitter:image", Content: thumbURL.String()}, 113 113 } 114 114 115 115 return l.GenerateHTML(ctx, &PageConfig{
+2 -2
pkg/livepeer/livepeer.go
··· 22 22 "stream.place/streamplace/pkg/streamplace" 23 23 ) 24 24 25 - const SEGMENTS_IN_FLIGHT = 2 25 + const SegmentsInFlight = 2 26 26 27 27 type LivepeerSession struct { 28 28 SessionID string ··· 48 48 SessionID: fmt.Sprintf("%s-%s", did, sessionID), 49 49 Count: 0, 50 50 GatewayURL: gatewayURL, 51 - Guard: make(chan struct{}, SEGMENTS_IN_FLIGHT), 51 + Guard: make(chan struct{}, SegmentsInFlight), 52 52 }, nil 53 53 } 54 54
-1
pkg/log/log.go
··· 163 163 if glog.Level(ll) > highestLevel { 164 164 found = true 165 165 highestLevel = glog.Level(ll) 166 - } else { 167 166 } 168 167 } 169 168 }
+8 -15
pkg/media/audio_smear.go
··· 85 85 86 86 lastVideo = s.Video[len(s.Video)-1] 87 87 lastAudio = s.Audio[len(s.Audio)-1] 88 - videoEnd = lastVideo.pts.Nanoseconds() + lastVideo.dur.Nanoseconds() 89 - audioEnd = lastAudio.pts.Nanoseconds() + lastAudio.dur.Nanoseconds() 90 88 91 89 return nil 92 90 } ··· 101 99 } 102 100 103 101 ctx, cancel := context.WithCancel(ctx) 102 + defer cancel() 104 103 105 104 pipeline, err := gst.NewPipelineFromString(strings.Join(pipelineSlice, "\n")) 106 105 if err != nil { ··· 116 115 }() 117 116 118 117 defer func() { 119 - cancel() 120 118 err := <-errCh 121 119 if err != nil { 122 120 log.Error(ctx, "bus handler error", "error", err) ··· 181 179 dur: buffer.Duration().AsDuration(), 182 180 }) 183 181 184 - if err != nil { 185 - src.Error("could not get sink pads", err) 186 - return gst.FlowError 187 - } 188 - 189 182 return gst.FlowOK 190 183 }, 191 184 }) ··· 238 231 }, 239 232 }) 240 233 241 - pipeline.SetState(gst.StatePlaying) 234 + if err := pipeline.SetState(gst.StatePlaying); err != nil { 235 + return nil, fmt.Errorf("failed to set pipeline state: %w", err) 236 + } 242 237 243 238 <-ctx.Done() 244 239 ··· 256 251 } 257 252 258 253 ctx, cancel := context.WithCancel(ctx) 254 + defer cancel() 259 255 260 256 pipeline, err := gst.NewPipelineFromString(strings.Join(pipelineSlice, "\n")) 261 257 if err != nil { ··· 271 267 }() 272 268 273 269 defer func() { 274 - cancel() 275 270 err := <-errCh 276 271 if err != nil { 277 272 log.Error(ctx, "bus handler error", "error", err) ··· 305 300 ret := videoSrc.PushBuffer(buf) 306 301 if ret != gst.FlowOK { 307 302 return fmt.Errorf("failed to push video buffer: %s", ret) 308 - } else { 309 - // log.Log(ctx, "pushed video buffer", "presentation_timestamp", seg.pts, "duration", seg.dur) 310 303 } 311 304 } 312 305 ··· 330 323 ret := audioSrc.PushBuffer(buf) 331 324 if ret != gst.FlowOK { 332 325 return fmt.Errorf("failed to push audio buffer: %s", ret) 333 - } else { 334 - // log.Log(ctx, "pushed audio buffer", "presentation_timestamp", seg.pts, "duration", seg.dur) 335 326 } 336 327 } 337 328 ··· 349 340 NewSampleFunc: WriterNewSample(ctx, output), 350 341 }) 351 342 352 - pipeline.SetState(gst.StatePlaying) 343 + if err := pipeline.SetState(gst.StatePlaying); err != nil { 344 + return fmt.Errorf("failed to set pipeline state: %w", err) 345 + } 353 346 354 347 <-ctx.Done() 355 348
+2 -1
pkg/media/bus_handler_test.go
··· 21 21 22 22 g, ctx := errgroup.WithContext(context.Background()) 23 23 ctx = log.WithDebugValue(ctx, map[string]map[string]int{"func": {"TestBusHandler": 9}}) 24 - for i := 0; i < streamplaceTestCount; i++ { 24 + for i := range streamplaceTestCount { 25 25 g.Go(func() error { 26 26 err := testBusHandlerCleanupInner(ctx, i) 27 27 if err == nil { ··· 37 37 func testBusHandlerCleanupInner(ctx context.Context, i int) error { 38 38 ctx = log.WithLogValues(ctx, "func", "TestBusHandler") 39 39 ctx, cancel := context.WithCancel(ctx) 40 + defer cancel() 40 41 41 42 pipeline, err := gst.NewPipeline(fmt.Sprintf("TestBusHandler-%d", i)) 42 43 if err != nil {
+17 -4
pkg/media/concat.go
··· 24 24 func ConcatStream(ctx context.Context, pipeline *gst.Pipeline, user string, rendition string, streamer ConcatStreamer) (*gst.Element, <-chan struct{}, error) { 25 25 ctx = log.WithLogValues(ctx, "func", "ConcatStream") 26 26 ctx, cancel := context.WithCancel(ctx) 27 + defer cancel() 27 28 28 29 // make 1000000000000 elements! 29 30 ··· 363 364 } 364 365 365 366 log.Debug(ctx, "ending segment") 366 - demux.SetState(gst.StateNull) 367 + if err := demux.SetState(gst.StateNull); err != nil { 368 + log.Error(ctx, "failed to set demux state", "error", err) 369 + return 370 + } 367 371 src.SetCallbacks(&app.SourceCallbacks{}) 368 - appsrc.SetState(gst.StateNull) 369 - pipeline.Remove(demux) 370 - pipeline.Remove(appsrc) 372 + if err := appsrc.SetState(gst.StateNull); err != nil { 373 + log.Error(ctx, "failed to set appsrc state", "error", err) 374 + return 375 + } 376 + if err := pipeline.Remove(demux); err != nil { 377 + log.Error(ctx, "failed to remove demux from pipleine", "error", err) 378 + return 379 + } 380 + if err := pipeline.Remove(appsrc); err != nil { 381 + log.Error(ctx, "failed to remove appsrc from pipleine", "error", err) 382 + return 383 + } 371 384 pr.Close() 372 385 pw.Close() 373 386 }
+3 -1
pkg/media/concat2.go
··· 185 185 demuxBinPadVideoSrc.AddProbe(gst.PadProbeTypeEventBoth, eos) 186 186 demuxBinPadAudioSrc.AddProbe(gst.PadProbeTypeEventBoth, eos) 187 187 188 - bin.SetState(gst.StatePlaying) 188 + if err := bin.SetState(gst.StatePlaying); err != nil { 189 + return fmt.Errorf("failed to set state: %w", err) 190 + } 189 191 190 192 <-eosCh 191 193 <-eosCh
+4 -4
pkg/media/concat2_test.go
··· 28 28 defer goleak.VerifyNone(t, ignore) 29 29 30 30 g, _ := errgroup.WithContext(context.Background()) 31 - for i := 0; i < streamplaceTestCount; i++ { 31 + for range streamplaceTestCount { 32 32 g.Go(func() error { 33 33 return innerTestConcatBin(t) 34 34 }) ··· 48 48 uuidStr = fmt.Sprintf("%s-%s", tag, uuidStr) 49 49 } 50 50 ctx = log.WithLogValues(ctx, "func", "ConcatBin", "uuid", uuidStr) 51 - ctx, cancel := context.WithCancel(ctx) 52 - // defer cancel() 53 51 54 52 pipeline, err := gst.NewPipeline("TestConcatBin") 55 53 if err != nil { 56 54 return fmt.Errorf("failed to create pipeline: %w", err) 57 55 } 56 + 57 + ctx, cancel := context.WithCancel(ctx) 58 58 59 59 errCh := make(chan error) 60 60 go func() { ··· 85 85 } 86 86 87 87 testSegs := []*segchanman.Seg{} 88 - for i := 0; i < 5; i++ { 88 + for range 5 { 89 89 testSegs = append(testSegs, &segchanman.Seg{ 90 90 Data: bs, 91 91 Filepath: filename,
+3 -3
pkg/media/concat_demux_test.go
··· 26 26 defer goleak.VerifyNone(t, ignore) 27 27 28 28 g, _ := errgroup.WithContext(context.Background()) 29 - for i := 0; i < streamplaceTestCount; i++ { 29 + for range streamplaceTestCount { 30 30 g.Go(func() error { 31 31 return innerTestConcatDemuxBin(t) 32 32 }) ··· 39 39 func innerTestConcatDemuxBin(t *testing.T) error { 40 40 ctx := log.WithDebugValue(context.Background(), map[string]map[string]int{"func": {"ConcatStream": 9, "TestConcat2": 9, "SegDemuxBin": 9}}) 41 41 ctx = log.WithLogValues(ctx, "func", "TestConcat2") 42 - ctx, cancel := context.WithCancel(ctx) 43 - // defer cancel() 44 42 45 43 pipeline, err := gst.NewPipeline("TestConcat2") 46 44 if err != nil { 47 45 return fmt.Errorf("failed to create pipeline: %w", err) 48 46 } 47 + 48 + ctx, cancel := context.WithCancel(ctx) 49 49 50 50 errCh := make(chan error) 51 51 go func() {
+21 -11
pkg/media/gstreamer.go
··· 21 21 "stream.place/streamplace/test" 22 22 ) 23 23 24 - const HLS_PLAYLIST = "stream.m3u8" 24 + const HLSPlaylist = "stream.m3u8" 25 25 26 26 // Pipe with a mechanism to keep the FDs not garbage collected 27 27 func SafePipe() (*os.File, *os.File, func(), error) { ··· 132 132 }) 133 133 134 134 go func() { 135 - HandleBusMessages(ctx, pipeline) 135 + if err := HandleBusMessages(ctx, pipeline); err != nil { 136 + log.Debug(ctx, "handle bus messages failed", "error", err) 137 + } 136 138 cancel() 137 139 }() 138 140 ··· 157 159 return nil 158 160 } 159 161 160 - const TESTSRC_WIDTH = 1280 161 - const TESTSRC_HEIGHT = 720 162 - const QR_SIZE = 256 162 + const TestSrcWidth = 1280 163 + const TestSrcHeight = 720 164 + const QRSize = 256 163 165 164 166 type QRData struct { 165 167 Now int64 `json:"now"` ··· 171 173 pipelineSlice := []string{ 172 174 "h264parse name=videoparse", 173 175 "compositor name=comp ! videoconvert ! video/x-raw,format=I420 ! x264enc speed-preset=ultrafast key-int-max=30 ! queue ! videoparse.", 174 - fmt.Sprintf(`videotestsrc is-live=true ! video/x-raw,format=AYUV,framerate=30/1,width=%d,height=%d ! comp.`, TESTSRC_WIDTH, TESTSRC_HEIGHT), 175 - fmt.Sprintf("videobox border-alpha=0 top=-%d left=-%d name=box ! comp.", (TESTSRC_HEIGHT/2)-(QR_SIZE/2), (TESTSRC_WIDTH/2)-(QR_SIZE/2)), 176 + fmt.Sprintf(`videotestsrc is-live=true ! video/x-raw,format=AYUV,framerate=30/1,width=%d,height=%d ! comp.`, TestSrcWidth, TestSrcHeight), 177 + fmt.Sprintf("videobox border-alpha=0 top=-%d left=-%d name=box ! comp.", (TestSrcHeight/2)-(QRSize/2), (TestSrcWidth/2)-(QRSize/2)), 176 178 "appsrc name=pngsrc ! pngdec ! videoconvert ! videorate ! video/x-raw,format=AYUV,framerate=1/1 ! box.", 177 179 "appsrc name=timetext ! pngdec ! videoconvert ! videorate ! video/x-raw,format=AYUV,framerate=1/1 ! comp.", 178 180 "audiotestsrc ! audioconvert ! opusenc inband-fec=true perfect-timestamp=true bitrate=128000 ! queue ! opusparse name=audioparse", ··· 197 199 if err != nil { 198 200 return err 199 201 } 200 - pipeline.Add(signer) 202 + if err := pipeline.Add(signer); err != nil { 203 + return err 204 + } 201 205 202 206 err = videoparse.Link(signer) 203 207 if err != nil { ··· 259 263 defer cancel() 260 264 go func() { 261 265 <-ctx.Done() 262 - pipeline.BlockSetState(gst.StateNull) 266 + if err := pipeline.BlockSetState(gst.StateNull); err != nil { 267 + log.Log(ctx, "failed to set pipeline state", "error", err) 268 + } 263 269 mainLoop.Quit() 264 270 }() 265 271 266 272 go func() { 267 - HandleBusMessages(ctx, pipeline) 273 + if err := HandleBusMessages(ctx, pipeline); err != nil { 274 + log.Log(ctx, "pipeline error", "error", err) 275 + } 268 276 cancel() 269 277 }() 270 278 271 279 // Start the pipeline 272 - pipeline.SetState(gst.StatePlaying) 280 + if err := pipeline.SetState(gst.StatePlaying); err != nil { 281 + log.Log(ctx, "failed to set pipeline state", "error", err) 282 + } 273 283 274 284 g, _ := errgroup.WithContext(ctx) 275 285
+9 -3
pkg/media/leak/leak.go
··· 33 33 if err != nil { 34 34 log.Fatal(err) 35 35 } 36 - process.Signal(syscall.SIGUSR1) 36 + if err := process.Signal(syscall.SIGUSR1); err != nil { 37 + log.Fatal(err) 38 + } 37 39 time.Sleep(1 * time.Second) 38 40 } 39 41 ··· 45 47 } 46 48 47 49 mainLoop := glib.NewMainLoop(glib.MainContextDefault(), false) 48 - pipeline.SetState(gst.StatePlaying) 50 + if err := pipeline.BlockSetState(gst.StatePlaying); err != nil { 51 + return fmt.Errorf("failed to set pipeline state: %w", err) 52 + } 49 53 50 54 pipeline.GetBus().AddWatch(func(msg *gst.Message) bool { 51 55 if msg.Type() == gst.MessageEOS { ··· 57 61 58 62 mainLoop.Run() 59 63 60 - pipeline.BlockSetState(gst.StateNull) 64 + if err := pipeline.BlockSetState(gst.StateNull); err != nil { 65 + return fmt.Errorf("failed to set pipeline state: %w", err) 66 + } 61 67 62 68 return nil 63 69 }
+16 -16
pkg/media/leak_test.go
··· 19 19 "stream.place/streamplace/pkg/gstinit" 20 20 ) 21 21 22 - const IGNORE_LEAKS = "STREAMPLACE_IGNORE_LEAKS" 23 - const GST_DEBUG_NEEDED = "leaks:9,GST_TRACER:9" 24 - const LEAK_LINE = "GST_TRACER :0:: object-alive" 22 + const IgnoreLeaks = "STREAMPLACE_IGNORE_LEAKS" 23 + const GSTDebugNeeded = "leaks:9,GST_TRACER:9" 24 + const LeakLine = "GST_TRACER :0:: object-alive" 25 25 26 - var LEAK_DONE_REGEX = regexp.MustCompile(`listed\s+(\d+)\s+alive\s+objects`) 26 + var LeakDoneRegex = regexp.MustCompile(`listed\s+(\d+)\s+alive\s+objects`) 27 27 28 28 var LeakReport = []string{} 29 29 var LeakReportMutex sync.Mutex 30 30 var LeakDoneCh = make(chan struct{}) 31 31 32 32 func TestMain(m *testing.M) { 33 - if os.Getenv(IGNORE_LEAKS) != "" { 33 + if os.Getenv(IgnoreLeaks) != "" { 34 34 gstinit.InitGST() 35 35 os.Exit(m.Run()) 36 36 return 37 37 } 38 38 gstDebug := os.Getenv("GST_DEBUG") 39 39 if gstDebug == "" { 40 - gstDebug = GST_DEBUG_NEEDED 40 + gstDebug = GSTDebugNeeded 41 41 } else { 42 - gstDebug = fmt.Sprintf("%s,%s", gstDebug, GST_DEBUG_NEEDED) 42 + gstDebug = fmt.Sprintf("%s,%s", gstDebug, GSTDebugNeeded) 43 43 } 44 44 os.Setenv("GST_DEBUG", gstDebug) 45 45 os.Setenv("GST_TRACERS", "leaks") ··· 69 69 line := scanner.Text() 70 70 fmt.Println(line) 71 71 line = stripansi.Strip(line) 72 - if strings.Contains(line, LEAK_LINE) { 72 + if strings.Contains(line, LeakLine) { 73 73 LeakReportMutex.Lock() 74 74 LeakReport = append(LeakReport, line) 75 75 LeakReportMutex.Unlock() 76 - } else if LEAK_DONE_REGEX.MatchString(line) { 76 + } else if LeakDoneRegex.MatchString(line) { 77 77 LeakDoneCh <- struct{}{} 78 78 } else { 79 79 continue ··· 88 88 } 89 89 90 90 func getLeakCount(t *testing.T) int { 91 - if os.Getenv(IGNORE_LEAKS) != "" { 91 + if os.Getenv(IgnoreLeaks) != "" { 92 92 return 0 93 93 } 94 94 process, err := os.FindProcess(os.Getpid()) 95 + require.NoError(t, err) 96 + 95 97 LeakReportMutex.Lock() 96 98 LeakReport = []string{} 97 99 LeakReportMutex.Unlock() ··· 102 104 flushes = 5 103 105 } 104 106 105 - for i := 0; i < flushes; i++ { 107 + for range flushes { 106 108 ch := make(chan struct{}) 107 109 done := false 108 110 go func() { ··· 116 118 go func() { 117 119 runtime.GC() 118 120 runtime.GC() 119 - for { 120 - if done { 121 - break 122 - } 121 + for !done { 122 + 123 123 runtime.GC() 124 124 runtime.GC() 125 125 time.Sleep(500 * time.Millisecond) ··· 142 142 } 143 143 144 144 func checkGStreamerLeaks(t *testing.T, expected int) { 145 - if os.Getenv(IGNORE_LEAKS) != "" { 145 + if os.Getenv(IgnoreLeaks) != "" { 146 146 return 147 147 } 148 148 leaks := getLeakCount(t)
+9 -9
pkg/media/m3u8.go
··· 15 15 ) 16 16 17 17 // how many segments are served in the live playlist? 18 - const LIVE_PLAYLIST_SIZE = 8 18 + const LivePlaylistSize = 8 19 19 20 20 // how long should we keep old segments around? 21 - const RETAIN_SEGMENT_SIZE = LIVE_PLAYLIST_SIZE * 3 21 + const RetainSegmentSize = LivePlaylistSize * 3 22 22 23 - const INDEX_M3U8 = "index.m3u8" 23 + const IndexM3U8 = "index.m3u8" 24 24 25 25 type Segment struct { 26 26 MSN uint64 // media sequence number ··· 65 65 lines := []string{} 66 66 lines = append(lines, "#EXTM3U") 67 67 lines = append(lines, fmt.Sprintf("#EXT-X-STREAM-INF:BANDWIDTH=%d,RESOLUTION=%dx%d", r.Rendition.Bitrate, r.Rendition.Width, r.Rendition.Height)) 68 - lines = append(lines, fmt.Sprintf("%s/%s?session=%s", r.Rendition.Name, INDEX_M3U8, session)) 68 + lines = append(lines, fmt.Sprintf("%s/%s?session=%s", r.Rendition.Name, IndexM3U8, session)) 69 69 return strings.Join(lines, "\n") 70 70 } 71 71 ··· 83 83 lines := []string{} 84 84 lines = append(lines, "#EXTM3U") 85 85 lines = append(lines, "#EXT-X-VERSION:3") 86 - startWith := len(r.Segments) - LIVE_PLAYLIST_SIZE 86 + startWith := len(r.Segments) - LivePlaylistSize 87 87 if startWith < 0 { 88 88 startWith = 0 89 89 } ··· 143 143 // - 720p/segment00015.ts 144 144 func (m *M3U8) GetFile(str string, session string, rendition string) ([]byte, error) { 145 145 str = strings.TrimPrefix(str, "/") 146 - if str == INDEX_M3U8 { 146 + if str == IndexM3U8 { 147 147 return m.GetMultivariantPlaylist(rendition), nil 148 148 } 149 149 parts := strings.Split(str, "/") ··· 157 157 if rend == nil { 158 158 return nil, fmt.Errorf("rendition not found") 159 159 } 160 - if fStr == INDEX_M3U8 { 160 + if fStr == IndexM3U8 { 161 161 return rend.GetPlaylist(session), nil 162 162 } 163 163 seg := rend.GetSegment(session, fStr) ··· 173 173 seg.MSN = r.MSN 174 174 r.MSN += 1 175 175 r.Segments = append(r.Segments, seg) 176 - if len(r.Segments) > RETAIN_SEGMENT_SIZE { 176 + if len(r.Segments) > RetainSegmentSize { 177 177 // Calculate how many segments to remove 178 - removeCount := len(r.Segments) - RETAIN_SEGMENT_SIZE 178 + removeCount := len(r.Segments) - RetainSegmentSize 179 179 // Remove the oldest segments (from the front of the slice) 180 180 r.Segments = r.Segments[removeCount:] 181 181 }
+6 -6
pkg/media/media.go
··· 28 28 "github.com/piprate/json-gold/ld" 29 29 ) 30 30 31 - const CERT_FILE = "cert.pem" 32 - const SEGMENTS_DIR = "segments" 31 + const CertFile = "cert.pem" 32 + const SegmentsDir = "segments" 33 33 34 - var STREAMPLACE_METADATA = "place.stream.metadata" 34 + var StreamplaceMetadata = "place.stream.metadata" 35 35 36 36 type MediaManager struct { 37 37 cli *config.CLI ··· 197 197 var ErrInvalidMetadata = errors.New("invalid segment metadata") 198 198 199 199 func ParseSegmentAssertions(ctx context.Context, mani *manifeststore.Manifest) (*SegmentMetadata, error) { 200 - ctx, span := otel.Tracer("signer").Start(ctx, "ParseSegmentAssertions") 200 + _, span := otel.Tracer("signer").Start(ctx, "ParseSegmentAssertions") 201 201 defer span.End() 202 202 var ass *manifeststore.ManifestAssertion 203 203 for _, a := range mani.Assertions { 204 - if a.Label == STREAMPLACE_METADATA { 204 + if a.Label == StreamplaceMetadata { 205 205 ass = &a 206 206 break 207 207 } 208 208 } 209 209 if ass == nil { 210 - return nil, fmt.Errorf("couldn't find %s assertions", STREAMPLACE_METADATA) 210 + return nil, fmt.Errorf("couldn't find %s assertions", StreamplaceMetadata) 211 211 } 212 212 proc := ld.NewJsonLdProcessor() 213 213 options := ld.NewJsonLdOptions("")
+13 -4
pkg/media/media_data_parser.go
··· 113 113 if err != nil { 114 114 return nil, fmt.Errorf("error creating SegmentMetadata pipeline: %w", err) 115 115 } 116 - demux.Connect("pad-added", onPadAdded) 116 + _, err = demux.Connect("pad-added", onPadAdded) 117 + if err != nil { 118 + return nil, fmt.Errorf("error connecting pad-add: %w", err) 119 + } 117 120 118 121 go func() { 119 - HandleBusMessages(ctx, pipeline) 122 + if err := HandleBusMessages(ctx, pipeline); err != nil { 123 + log.Log(ctx, "pipeline error", "error", err) 124 + } 120 125 cancel() 121 126 }() 122 127 123 128 // Start the pipeline 124 - pipeline.SetState(gst.StatePlaying) 129 + if err := pipeline.SetState(gst.StatePlaying); err != nil { 130 + return nil, err 131 + } 125 132 126 133 <-ctx.Done() 127 134 ··· 137 144 meta.Duration = dur 138 145 } 139 146 140 - pipeline.BlockSetState(gst.StateNull) 147 + if err := pipeline.BlockSetState(gst.StateNull); err != nil { 148 + return nil, err 149 + } 141 150 142 151 return meta, nil 143 152 }
+8 -4
pkg/media/media_signer.go
··· 41 41 if err != nil { 42 42 return nil, "", err 43 43 } 44 - fSlice := []string{pub.String(), CERT_FILE} 44 + fSlice := []string{pub.String(), CertFile} 45 45 exists, err := cli.DataFileExists(fSlice) 46 46 if err != nil { 47 47 return nil, "", err ··· 56 56 if err != nil { 57 57 return nil, "", err 58 58 } 59 - log.Log(ctx, "wrote new media signing certificate", "file", filepath.Join(pub.String(), CERT_FILE)) 59 + log.Log(ctx, "wrote new media signing certificate", "file", filepath.Join(pub.String(), CertFile)) 60 60 } 61 61 buf := bytes.Buffer{} 62 - cli.DataFileRead(fSlice, &buf) 62 + if err := cli.DataFileRead(fSlice, &buf); err != nil { 63 + return nil, "", err 64 + } 65 + 63 66 fPath := cli.DataFilePath(fSlice) 64 67 cert := buf.Bytes() 65 68 return cert, fPath, nil ··· 105 108 }, 106 109 }, 107 110 { 108 - "label": STREAMPLACE_METADATA, 111 + "label": StreamplaceMetadata, 109 112 "data": obj{ 110 113 "@context": obj{ 111 114 "dc": "http://purl.org/dc/elements/1.1/", ··· 157 160 span.End() 158 161 159 162 ctx, span = otel.Tracer("signer").Start(ctx, "SignMP4_OutputBytes") 163 + defer ctx.Done() 160 164 bs, err := output.Bytes() 161 165 if err != nil { 162 166 return nil, fmt.Errorf("failed to get output bytes: %w", err)
+1 -1
pkg/media/media_signer_ext.go
··· 56 56 57 57 func (ms *MediaSignerExt) SignMP4(ctx context.Context, input io.ReadSeeker, start int64) ([]byte, error) { 58 58 startTime := time.Now() 59 - ctx, span := otel.Tracer("signer").Start(ctx, "SignMP4_Ext") 59 + _, span := otel.Tracer("signer").Start(ctx, "SignMP4_Ext") 60 60 defer span.End() 61 61 // Get the path to the current executable 62 62 execPath, err := os.Executable()
+6 -2
pkg/media/segment_conv.go
··· 242 242 // Handle bus messages in a separate goroutine 243 243 g, ctx := errgroup.WithContext(ctx) 244 244 g.Go(func() error { 245 - HandleBusMessages(ctx, pipeline) 245 + if err := HandleBusMessages(ctx, pipeline); err != nil { 246 + log.Log(ctx, "pipeline error", "error", err) 247 + } 246 248 cancel() 247 249 return nil 248 250 }) ··· 533 535 } 534 536 } 535 537 } 536 - videodemux.Connect("pad-added", onPadAdded) 538 + if _, err := videodemux.Connect("pad-added", onPadAdded); err != nil { 539 + return fmt.Errorf("failed connect pad-added handler: %w", err) 540 + } 537 541 538 542 // Handle bus messages in a separate goroutine 539 543 g, ctx := errgroup.WithContext(ctx)
+2 -1
pkg/media/segment_conv_test.go
··· 33 33 // Create temporary output file 34 34 35 35 g, _ := errgroup.WithContext(context.Background()) 36 - for i := 0; i < streamplaceTestCount; i++ { 36 + for range streamplaceTestCount { 37 37 g.Go(func() error { 38 38 _, err := MP4ToMPEGTS(context.Background(), bytes.NewReader(bs), &buf) 39 39 return err ··· 66 66 buf := bytes.Buffer{} 67 67 68 68 bs, err := io.ReadAll(inputFile) 69 + require.NoError(t, err) 69 70 70 71 // Convert MP4 to MPEG-TS 71 72 _, err = MP4ToMPEGTS(context.Background(), bytes.NewReader(bs), &buf)
+4 -1
pkg/media/segmenter.go
··· 54 54 } 55 55 }() 56 56 57 - elem.Connect("sink-added", func(split, sinkEle *gst.Element) { 57 + _, err = elem.Connect("sink-added", func(split, sinkEle *gst.Element) { 58 58 buf := &bytes.Buffer{} 59 59 appsink := app.SinkFromElement(sinkEle) 60 60 if appsink == nil { ··· 94 94 }, 95 95 }) 96 96 }) 97 + if err != nil { 98 + return nil, fmt.Errorf("failed to connect sink-added handler: %w", err) 99 + } 97 100 98 101 return elem, nil 99 102 }
+40 -27
pkg/media/segmenter_hls.go
··· 108 108 } 109 109 }() 110 110 111 - splitmuxsink.Connect("sink-added", func(split, sinkEle *gst.Element) { 111 + _, err = splitmuxsink.Connect("sink-added", func(split, sinkEle *gst.Element) { 112 112 log.Debug(ctx, "hls-check sink-added") 113 113 vf, err := ps.GetNextSegment(ctx) 114 114 if err != nil { ··· 123 123 }, 124 124 }) 125 125 }) 126 + if err != nil { 127 + return fmt.Errorf("failed to add hls-check to sink: %w", err) 128 + } 126 129 127 130 onPadAdded := func(element *gst.Element, pad *gst.Pad) { 128 131 caps := pad.GetCurrentCaps() ··· 141 144 142 145 name := structure.Name() 143 146 fmt.Printf("Structure Name: %s\n", name) 144 - 145 - if name[:5] == "video" { 146 - // Get some common video properties 147 - // widthVal, _ := structure.GetValue("width") 148 - // heightVal, _ := structure.GetValue("height") 149 - 150 - // width, ok := widthVal.(int) 151 - // if ok { 152 - // m3u8.Width = uint64(width) 153 - // } 154 - // height, ok := heightVal.(int) 155 - // if ok { 156 - // m3u8.Height = uint64(height) 157 - // } 158 - } 159 147 } 160 148 161 - splitmuxsink.Connect("pad-added", onPadAdded) 149 + _, err = splitmuxsink.Connect("pad-added", onPadAdded) 150 + if err != nil { 151 + return fmt.Errorf("failed to add pad: %w", err) 152 + } 162 153 163 154 defer cancel() 164 155 go func() { 165 - HandleBusMessagesCustom(ctx, pipeline, func(msg *gst.Message) { 156 + err := HandleBusMessagesCustom(ctx, pipeline, func(msg *gst.Message) { 166 157 switch msg.Type() { 167 158 case gst.MessageElement: 168 159 structure := msg.GetStructure() ··· 179 170 cancel() 180 171 } 181 172 log.Debug(ctx, "hls-check splitmuxsink-fragment-opened", "runningTime", runningTimeInt) 182 - ps.FragmentOpened(ctx, runningTimeInt) 173 + if err := ps.FragmentOpened(ctx, runningTimeInt); err != nil { 174 + log.Debug(ctx, "fragment open error", "error", err) 175 + cancel() 176 + } 183 177 } 184 178 if name == "splitmuxsink-fragment-closed" { 185 179 runningTime, err := structure.GetValue("running-time") ··· 193 187 cancel() 194 188 } 195 189 log.Debug(ctx, "hls-check splitmuxsink-fragment-closed", "runningTime", runningTimeInt) 196 - ps.FragmentClosed(ctx, runningTimeInt) 190 + if err := ps.FragmentClosed(ctx, runningTimeInt); err != nil { 191 + log.Debug(ctx, "fragment close error", "error", err) 192 + cancel() 193 + } 197 194 } 198 195 } 199 196 }) 197 + if err != nil { 198 + log.Log(ctx, "pipeline error", "error", err) 199 + } 200 200 cancel() 201 201 }() 202 202 203 203 // Start the pipeline 204 - pipeline.SetState(gst.StatePlaying) 204 + if err := pipeline.SetState(gst.StatePlaying); err != nil { 205 + return fmt.Errorf("error setting pipeline state: %w", err) 206 + } 205 207 206 208 <-ctx.Done() 207 209 208 - pipeline.BlockSetState(gst.StateNull) 210 + if err := pipeline.BlockSetState(gst.StateNull); err != nil { 211 + return fmt.Errorf("error setting pipeline state: %w", err) 212 + } 209 213 210 214 return nil 211 215 } ··· 242 246 defer ps.lock.Unlock() 243 247 log.Debug(ctx, "close segment", "MSN", seg.MSN) 244 248 seg.Closed = true 245 - ps.checkSegments(ctx) 249 + if err := ps.checkSegments(ctx); err != nil { 250 + log.Debug(ctx, "faile to check segments segment") 251 + } 246 252 } 247 253 248 254 func (ps *PendingSegments) FragmentOpened(ctx context.Context, t uint64) error { ··· 258 264 break 259 265 } 260 266 } 261 - ps.checkSegments(ctx) 267 + if err := ps.checkSegments(ctx); err != nil { 268 + return fmt.Errorf("failed to check segments: %w", err) 269 + } 262 270 return nil 263 271 } 264 272 ··· 277 285 break 278 286 } 279 287 } 280 - ps.checkSegments(ctx) 288 + if err := ps.checkSegments(ctx); err != nil { 289 + return fmt.Errorf("failed to check segments: %w", err) 290 + } 281 291 return nil 282 292 } 283 293 ··· 286 296 // all of those functions call this one, and it checks if we have the necessary information 287 297 // to finalize a segment and add it to our playlist. 288 298 // only call if you're holding ps.lock! 289 - func (ps *PendingSegments) checkSegments(ctx context.Context) { 299 + func (ps *PendingSegments) checkSegments(ctx context.Context) error { 290 300 pending := ps.segments[0] 291 301 if pending.StartTS != nil && pending.EndTS != nil && pending.Closed { 292 - ps.rendition.NewSegment(pending) 302 + if err := ps.rendition.NewSegment(pending); err != nil { 303 + return fmt.Errorf("failed to add new segment: %w", err) 304 + } 293 305 log.Debug(ctx, "finalizing segment", "MSN", pending.MSN) 294 306 ps.segments = ps.segments[1:] 295 307 } 308 + return nil 296 309 }
+3 -3
pkg/media/text.go
··· 75 75 } 76 76 } 77 77 78 - code := strings.Replace(textContent, "\t", " ", -1) // convert tabs into spaces 79 - text := strings.Split(code, "\n") // split newlines into arrays 78 + code := strings.ReplaceAll(textContent, "\t", " ") // convert tabs into spaces 79 + text := strings.Split(code, "\n") // split newlines into arrays 80 80 81 81 fg := image.NewUniform(fgColor) 82 82 bg := image.NewUniform(bgColor) ··· 96 96 97 97 pt := freetype.Pt(textXOffset, textYOffset) 98 98 for _, s := range text { 99 - _, err := c.DrawString(strings.Replace(s, "\r", "", -1), pt) 99 + _, err := c.DrawString(strings.ReplaceAll(s, "\r", ""), pt) 100 100 if err != nil { 101 101 return nil, err 102 102 }
+6 -2
pkg/media/thumbnail.go
··· 57 57 NewSampleFunc: WriterNewSample(ctx, w), 58 58 }) 59 59 60 - pipeline.SetState(gst.StatePlaying) 60 + if err := pipeline.BlockSetState(gst.StatePlaying); err != nil { 61 + return fmt.Errorf("error setting pipeline state: %w", err) 62 + } 61 63 62 64 <-ctx.Done() 63 65 64 - pipeline.BlockSetState(gst.StateNull) 66 + if err := pipeline.BlockSetState(gst.StateNull); err != nil { 67 + return fmt.Errorf("error setting pipeline state: %w", err) 68 + } 65 69 66 70 return <-errCh 67 71 }
+1 -2
pkg/media/thumbnail_test.go
··· 34 34 for i := 0; i < streamplaceTestCount; i++ { 35 35 g.Go(func() error { 36 36 thumbnail := bytes.Buffer{} 37 - thumbnailCtx := context.Background() 38 37 // thumbnailCtx = log.WithDebugValue(ctx, map[string]map[string]int{"function": {"Thumbnail": 9}}) 39 - err := Thumbnail(thumbnailCtx, bytes.NewReader(bs), &thumbnail) 38 + err := Thumbnail(ctx, bytes.NewReader(bs), &thumbnail) 40 39 if err != nil { 41 40 return err 42 41 }
+3 -1
pkg/media/validate.go
··· 77 77 defer fd.Close() 78 78 go mm.replicator.NewSegment(ctx, buf) 79 79 r = bytes.NewReader(buf) 80 - io.Copy(fd, r) 80 + if _, err := io.Copy(fd, r); err != nil { 81 + return err 82 + } 81 83 scmSeg := &segchanman.Seg{ 82 84 Filepath: fd.Name(), 83 85 Data: buf,
+15 -20
pkg/media/webrtc_ingest.go
··· 21 21 return nil, err 22 22 } 23 23 24 - ctx, cancel := context.WithCancel(ctx) 25 24 ctx = log.WithLogValues(ctx, "webrtcID", uu.String(), "mediafunc", "WebRTCIngest") 26 - 27 - // Setup the codecs you want to use. 28 - // We'll use a VP8 and Opus but you can also define your own 29 25 30 26 // Create a new RTCPeerConnection 31 27 peerConnection, err := mm.webrtcAPI.NewPeerConnection(mm.webrtcConfig) ··· 50 46 if err != nil { 51 47 return nil, fmt.Errorf("failed to create GStreamer pipeline: %w", err) 52 48 } 53 - 54 - go func() { 55 - HandleBusMessages(ctx, pipeline) 56 - cancel() 57 - }() 58 49 59 50 queue, err := pipeline.GetElementByName("queue") 60 51 if err != nil { ··· 149 140 // Setup complete! Now we boot up streaming in the background while returning the SDP offer to the user. 150 141 151 142 go func() { 143 + ctx, cancel := context.WithCancel(ctx) 144 + defer cancel() 145 + 146 + go func() { 147 + if err := HandleBusMessages(ctx, pipeline); err != nil { 148 + log.Log(ctx, "pipeilne error", "error", err) 149 + } 150 + cancel() 151 + }() 152 + 152 153 log.Debug(ctx, "starting pipeline") 153 154 154 155 // Start the pipeline ··· 162 163 // This will notify you when the peer has connected/disconnected 163 164 peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { 164 165 log.Log(ctx, "Connection State has changed", "state", connectionState.String()) 165 - if connectionState == webrtc.ICEConnectionStateConnected { 166 - // iceConnectedCtxCancel() 167 - } 168 166 }) 169 167 170 168 // Set the handler for Peer connection state ··· 206 204 } 207 205 }() 208 206 209 - codecName := strings.Split(track.Codec().RTPCodecCapability.MimeType, "/")[1] 207 + codecName := strings.Split(track.Codec().MimeType, "/")[1] 210 208 log.Log(ctx, "Track has started", "payloadType", track.PayloadType(), "codecName", codecName) 211 209 212 210 // appSrc := pipelineForCodec(track, codecName) ··· 246 244 } 247 245 if track.Kind() == webrtc.RTPCodecTypeAudio { 248 246 249 - codecName := strings.Split(track.Codec().RTPCodecCapability.MimeType, "/")[1] 247 + codecName := strings.Split(track.Codec().MimeType, "/")[1] 250 248 log.Log(ctx, "Track has started", "payloadType", track.PayloadType(), "codecName", codecName) 251 249 252 250 buf := make([]byte, 1400) ··· 286 284 287 285 <-ctx.Done() 288 286 289 - err = pipeline.BlockSetState(gst.StateNull) 290 - if err != nil { 287 + if err := pipeline.BlockSetState(gst.StateNull); err != nil { 291 288 log.Log(ctx, "failed to set pipeline state to null", "error", err) 292 289 } 293 290 294 - audioSrcElem.SetState(gst.StateNull) 295 - if err != nil { 291 + if err := audioSrcElem.SetState(gst.StateNull); err != nil { 296 292 log.Log(ctx, "failed to set audioSrcElem state to null", "error", err) 297 293 } 298 294 299 - videoSrcElem.SetState(gst.StateNull) 300 - if err != nil { 295 + if err := videoSrcElem.SetState(gst.StateNull); err != nil { 301 296 log.Log(ctx, "failed to set videoSrcElem state to null", "error", err) 302 297 } 303 298
+15 -13
pkg/media/webrtc_playback.go
··· 19 19 // we have a bug that prevents us from correctly probing video durations 20 20 // a lot of the time. so when we don't have them we use the last duration 21 21 // that we had, and when we don't have that we use a default duration 22 - var DEFAULT_DURATION = time.Duration(32 * time.Millisecond) 22 + var DefaultDuration = time.Duration(32 * time.Millisecond) 23 23 24 24 // This function remains in scope for the duration of a single users' playback 25 25 func (mm *MediaManager) WebRTCPlayback(ctx context.Context, user string, rendition string, offer *webrtc.SessionDescription) (*webrtc.SessionDescription, error) { ··· 28 28 return nil, err 29 29 } 30 30 ctx = log.WithLogValues(ctx, "webrtcID", uu.String()) 31 - ctx, cancel := context.WithCancel(ctx) 32 - 33 31 ctx = log.WithLogValues(ctx, "mediafunc", "WebRTCPlayback") 34 32 35 33 pipelineSlice := []string{ ··· 41 39 if err != nil { 42 40 return nil, fmt.Errorf("failed to create GStreamer pipeline: %w", err) 43 41 } 44 - 45 - go func() { 46 - HandleBusMessages(ctx, pipeline) 47 - cancel() 48 - }() 49 42 50 43 segBuffer := make(chan *segchanman.Seg, 1024) 51 44 go func() { ··· 209 202 } 210 203 }() 211 204 212 - var lastVideoDuration = &DEFAULT_DURATION 205 + var lastVideoDuration = &DefaultDuration 213 206 214 207 go func() { 208 + ctx, cancel := context.WithCancel(ctx) 209 + defer cancel() 210 + 211 + go func() { 212 + if err := HandleBusMessages(ctx, pipeline); err != nil { 213 + log.Log(ctx, "pipeline error", "error", err) 214 + } 215 + cancel() 216 + }() 215 217 216 218 videoappsink := app.SinkFromElement(videoappsinkele) 217 219 videoappsink.SetCallbacks(&app.SinkCallbacks{ ··· 300 302 }) 301 303 302 304 // Start the pipeline 303 - pipeline.SetState(gst.StatePlaying) 305 + err := pipeline.SetState(gst.StatePlaying) 306 + if err != nil { 307 + log.Log(ctx, "failed to set pipeline state to null", "error", err) 308 + } 304 309 spmetrics.ViewerInc(user) 305 310 defer spmetrics.ViewerDec(user) 306 311 ··· 326 331 // This will notify you when the peer has connected/disconnected 327 332 peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { 328 333 log.Log(ctx, "Connection State has changed", "state", connectionState.String()) 329 - if connectionState == webrtc.ICEConnectionStateConnected { 330 - // iceConnectedCtxCancel() 331 - } 332 334 }) 333 335 334 336 // Set the handler for Peer connection state
+3 -3
pkg/mist/mistconfig/mistconfig.go
··· 10 10 "stream.place/streamplace/pkg/mist/misttriggers" 11 11 ) 12 12 13 - var STREAM_NAME = "stream" 13 + var StreamName = "stream" 14 14 15 15 func Generate(cli *config.CLI) ([]byte, error) { 16 16 exec, err := os.Executable() ··· 87 87 "trustedproxy": []string{}, 88 88 }, 89 89 "streams": map[string]map[string]any{ 90 - STREAM_NAME: { 91 - "name": STREAM_NAME, 90 + StreamName: { 91 + "name": StreamName, 92 92 "segmentsize": 1, 93 93 "source": fmt.Sprintf("mkv-exec:%s stream %s/playback/$wildcard/stream.mkv", exec, cli.OwnInternalURL()), 94 94 "stop_sessions": false,
+3 -3
pkg/mist/misttriggers/push_end.go
··· 27 27 return PushEndPayload{}, fmt.Errorf("expected 6 lines in PUSH_END payload but got %d. Payload: %s", len(lines), body) 28 28 } 29 29 30 - pushId, err := strconv.Atoi(lines[0]) 30 + pushID, err := strconv.Atoi(lines[0]) 31 31 if err != nil { 32 - return PushEndPayload{}, fmt.Errorf("error converting pushId to number pushId=%s err=%w", lines[0], err) 32 + return PushEndPayload{}, fmt.Errorf("error converting pushID to number pushID=%s err=%w", lines[0], err) 33 33 } 34 34 35 35 stats := &mistclient.MistPushStats{} ··· 39 39 } 40 40 41 41 return PushEndPayload{ 42 - PushID: pushId, 42 + PushID: pushID, 43 43 StreamName: lines[1], 44 44 Destination: lines[2], 45 45 ActualDestination: lines[3],
+2 -2
pkg/mist/misttriggers/push_end_test.go
··· 34 34 x 35 35 `) 36 36 37 - var pushEndPayloadInvalidJson = MistTriggerBody(` 37 + var pushEndPayloadInvalidJSON = MistTriggerBody(` 38 38 1234 39 39 x 40 40 x ··· 46 46 var badPushEndCases = []MistTriggerBody{ 47 47 pushEndPayloadInvalidLines, 48 48 pushEndPayloadInvalidNumber, 49 - pushEndPayloadInvalidJson, 49 + pushEndPayloadInvalidJSON, 50 50 } 51 51 52 52 func TestItCanParseValidPushEndPayload(t *testing.T) {
+3 -3
pkg/mist/misttriggers/push_rewrite_test.go
··· 22 22 rtmp://127.0.0.1:1935/live/c447-3l8v-1vmz-ej5t 23 23 `) 24 24 25 - var pushRewritePayloadBadUrl = MistTriggerBody(` 25 + var pushRewritePayloadBadURL = MistTriggerBody(` 26 26 http://hostname with spaces.com 27 27 127.0.0.1 28 28 c447-3l8v-1vmz-ej5t ··· 40 40 func TestItCanRejectABadPushRewritePayload(t *testing.T) { 41 41 _, err := ParsePushRewritePayload(pushRewritePayloadInvalid) 42 42 require.Error(t, err) 43 - _, err = ParsePushRewritePayload(pushRewritePayloadBadUrl) 43 + _, err = ParsePushRewritePayload(pushRewritePayloadBadURL) 44 44 require.Error(t, err) 45 45 } 46 46 ··· 81 81 } 82 82 83 83 func TestPushRewriteCanErrorPushRewriteRequests(t *testing.T) { 84 - rr := doPushRewriteRequest(t, pushRewritePayloadBadUrl, func(ctx context.Context, prp *PushRewritePayload) (string, error) { 84 + rr := doPushRewriteRequest(t, pushRewritePayloadBadURL, func(ctx context.Context, prp *PushRewritePayload) (string, error) { 85 85 require.Fail(t, "test should be failing before it gets to me") 86 86 return "", nil 87 87 })
+16 -16
pkg/mist/misttriggers/triggers.go
··· 14 14 ) 15 15 16 16 const ( 17 - TRIGGER_PUSH_END = "PUSH_END" 18 - TRIGGER_PUSH_OUT_START = "PUSH_OUT_START" 19 - TRIGGER_PUSH_REWRITE = "PUSH_REWRITE" 20 - TRIGGER_STREAM_BUFFER = "STREAM_BUFFER" 21 - TRIGGER_LIVE_TRACK_LIST = "LIVE_TRACK_LIST" 22 - TRIGGER_USER_NEW = "USER_NEW" 23 - TRIGGER_USER_END = "USER_END" 24 - TRIGGER_STREAM_SOURCE = "STREAM_SOURCE" 17 + TRIGGER_PUSH_END = "PUSH_END" //nolint:all 18 + TRIGGER_PUSH_OUT_START = "PUSH_OUT_START" //nolint:all 19 + TRIGGER_PUSH_REWRITE = "PUSH_REWRITE" //nolint:all 20 + TRIGGER_STREAM_BUFFER = "STREAM_BUFFER" //nolint:all 21 + TRIGGER_LIVE_TRACK_LIST = "LIVE_TRACK_LIST" //nolint:all 22 + TRIGGER_USER_NEW = "USER_NEW" //nolint:all 23 + TRIGGER_USER_END = "USER_END" //nolint:all 24 + TRIGGER_STREAM_SOURCE = "STREAM_SOURCE" //nolint:all 25 25 ) 26 26 27 27 var BlockingTriggers = map[string]bool{ 28 - TRIGGER_PUSH_END: false, 29 - TRIGGER_PUSH_OUT_START: true, 30 - TRIGGER_PUSH_REWRITE: true, 31 - TRIGGER_STREAM_BUFFER: false, 32 - TRIGGER_LIVE_TRACK_LIST: false, 33 - TRIGGER_USER_NEW: true, 34 - TRIGGER_USER_END: false, 35 - TRIGGER_STREAM_SOURCE: true, 28 + TRIGGER_PUSH_END: false, //nolint:all 29 + TRIGGER_PUSH_OUT_START: true, //nolint:all 30 + TRIGGER_PUSH_REWRITE: true, //nolint:all 31 + TRIGGER_STREAM_BUFFER: false, //nolint:all 32 + TRIGGER_LIVE_TRACK_LIST: false, //nolint:all 33 + TRIGGER_USER_NEW: true, //nolint:all 34 + TRIGGER_USER_END: false, //nolint:all 35 + TRIGGER_STREAM_SOURCE: true, //nolint:all 36 36 } 37 37 38 38 type MistCallbackHandlersCollection struct {
+5 -3
pkg/model/model.go
··· 29 29 ListNotifications() ([]Notification, error) 30 30 31 31 CreatePlayerEvent(event PlayerEventAPI) error 32 - ListPlayerEvents(playerId string) ([]PlayerEvent, error) 33 - PlayerReport(playerId string) (map[string]any, error) 32 + ListPlayerEvents(playerID string) ([]PlayerEvent, error) 33 + PlayerReport(playerID string) (map[string]any, error) 34 34 ClearPlayerEvents() error 35 35 36 36 CreateSegment(segment *Segment) error ··· 103 103 // if this isn't ":memory:", ensure that directory exists (eg, if db 104 104 // file is being initialized) 105 105 if !strings.Contains(sqliteSuffix, ":?") { 106 - os.MkdirAll(filepath.Dir(sqliteSuffix), os.ModePerm) 106 + if err := os.MkdirAll(filepath.Dir(sqliteSuffix), os.ModePerm); err != nil { 107 + return nil, fmt.Errorf("error creating database path: %w", err) 108 + } 107 109 } 108 110 } 109 111 dial := sqlite.Open(sqliteSuffix)
+7 -7
pkg/model/player_event.go
··· 14 14 type PlayerEventAPI struct { 15 15 ID string `json:"id"` 16 16 Time time.Time `json:"time"` 17 - PlayerId string `json:"playerId"` 17 + PlayerID string `json:"playerId"` 18 18 EventType string `json:"eventType"` 19 19 Meta map[string]any `json:"meta"` 20 20 } ··· 22 22 type PlayerEvent struct { 23 23 ID string `gorm:"primarykey"` 24 24 Time time.Time 25 - PlayerId string `gorm:"index"` 25 + PlayerID string `gorm:"index"` 26 26 EventType string 27 27 Meta datatypes.JSON 28 28 } ··· 46 46 err = m.DB.Model(PlayerEvent{}).Create(PlayerEvent{ 47 47 ID: uu.String(), 48 48 Time: event.Time, 49 - PlayerId: event.PlayerId, 49 + PlayerID: event.PlayerID, 50 50 EventType: event.EventType, 51 51 Meta: datatypes.JSON(metaBs), 52 52 }).Error ··· 56 56 return nil 57 57 } 58 58 59 - func (m *DBModel) ListPlayerEvents(playerId string) ([]PlayerEvent, error) { 59 + func (m *DBModel) ListPlayerEvents(playerID string) ([]PlayerEvent, error) { 60 60 events := []PlayerEvent{} 61 61 // err := m.DB.Find(&events).Error 62 - err := m.DB.Where("player_id = ?", playerId).Find(&events).Error 62 + err := m.DB.Where("player_id = ?", playerID).Find(&events).Error 63 63 if err != nil { 64 64 return nil, fmt.Errorf("error retrieving player events: %w", err) 65 65 } 66 66 return events, nil 67 67 } 68 68 69 - func (m *DBModel) PlayerReport(playerId string) (map[string]any, error) { 70 - events, err := m.ListPlayerEvents(playerId) 69 + func (m *DBModel) PlayerReport(playerID string) (map[string]any, error) { 70 + events, err := m.ListPlayerEvents(playerID) 71 71 if err != nil { 72 72 return nil, err 73 73 }
+1 -1
pkg/model/signing_key.go
··· 26 26 } 27 27 28 28 func (m *DBModel) GetSigningKey(ctx context.Context, did, repoDID string) (*SigningKey, error) { 29 - ctx, span := otel.Tracer("signer").Start(ctx, "GetSigningKey") 29 + _, span := otel.Tracer("signer").Start(ctx, "GetSigningKey") 30 30 defer span.End() 31 31 var key SigningKey 32 32 res := m.DB.Model(SigningKey{}).Where("did = ?", did).Where("repo_did = ?", repoDID).First(&key)
+3 -3
pkg/proc/proc.go
··· 62 62 line, isPrefix, err := reader.ReadLine() 63 63 if err != nil { 64 64 if !errors.Is(err, io.EOF) { 65 - output(fmt.Sprintf("reader gave error, ending logging for fd=%d err=%s", i+1, err)) 65 + _, _ = output(fmt.Sprintf("reader gave error, ending logging for fd=%d err=%s", i+1, err)) 66 66 } 67 67 line, _, err := reader.ReadLine() 68 68 if string(line) != "" { 69 - output(string(line)) 69 + _, _ = output(string(line)) 70 70 } 71 71 return err 72 72 } 73 73 if isPrefix { 74 - output("warning: preceding line exceeds 64k logging limit and was split") 74 + _, _ = output("warning: preceding line exceeds 64k logging limit and was split") 75 75 } 76 76 if string(line) != "" { 77 77 level, procName, pid, path, streamName, msg, err := ParseMistLog(string(line))
+5 -5
pkg/renditions/renditions.go
··· 23 23 Parent *Rendition 24 24 } 25 25 26 - type JsonProfile struct { 26 + type JSONProfile struct { 27 27 Name string `json:"name,omitempty"` 28 28 Width int `json:"width,omitempty"` 29 29 Height int `json:"height,omitempty"` ··· 36 36 Quality uint `json:"quality,omitempty"` 37 37 } 38 38 39 - func (r Rendition) ToLivepeerProfile() JsonProfile { 40 - p := JsonProfile{ 39 + func (r Rendition) ToLivepeerProfile() JSONProfile { 40 + p := JSONProfile{ 41 41 Name: r.Name, 42 42 Bitrate: r.Bitrate, 43 43 FPS: r.Framerate.Num, ··· 68 68 69 69 type Renditions []Rendition 70 70 71 - func (rs Renditions) ToLivepeerProfiles() []JsonProfile { 72 - profiles := make([]JsonProfile, len(rs)) 71 + func (rs Renditions) ToLivepeerProfiles() []JSONProfile { 72 + profiles := make([]JSONProfile, len(rs)) 73 73 for i, r := range rs { 74 74 profiles[i] = r.ToLivepeerProfile() 75 75 }
+2 -2
pkg/spmetrics/spmetrics.go
··· 10 10 "stream.place/streamplace/pkg/log" 11 11 ) 12 12 13 - const SESSION_EXPIRE_TIME = 30 * time.Second 13 + const SessionExpireTime = 30 * time.Second //nolint:all 14 14 15 15 var viewers = map[string]int{} 16 16 var viewersLock sync.RWMutex ··· 129 129 sessionsLock.Lock() 130 130 for user, sessions := range sessions { 131 131 for session, seen := range sessions { 132 - if time.Since(seen) > SESSION_EXPIRE_TIME { 132 + if time.Since(seen) > SessionExpireTime { 133 133 delete(sessions, session) 134 134 ViewerDec(user) 135 135 }
+5 -6
pkg/spxrpc/app_bsky_feed.go
··· 9 9 "strings" 10 10 11 11 "github.com/bluesky-social/indigo/api/bsky" 12 - appbskytypes "github.com/bluesky-social/indigo/api/bsky" 13 12 "github.com/labstack/echo/v4" 14 13 "stream.place/streamplace/pkg/log" 15 14 "stream.place/streamplace/pkg/model" ··· 25 24 return fmt.Sprintf("did:%s:%s", matches[1], matches[2]), matches[3], nil 26 25 } 27 26 28 - const FEED_LIVE_STREAMS = "live-streams" 29 - const FEED_ALL_STREAMS = "all-streams" 27 + const FeedLiveStreams = "live-streams" 28 + const FeedAllStreams = "all-streams" 30 29 31 - func (s *Server) handleAppBskyFeedGetFeedSkeleton(ctx context.Context, inCursor string, feed string, limit int) (*appbskytypes.FeedGetFeedSkeleton_Output, error) { 30 + func (s *Server) handleAppBskyFeedGetFeedSkeleton(ctx context.Context, inCursor string, feed string, limit int) (*bsky.FeedGetFeedSkeleton_Output, error) { 32 31 _, name, err := parseFeedSkeleton(feed) 33 32 if err != nil { 34 33 return nil, err ··· 46 45 } 47 46 var posts []model.FeedPost 48 47 outCursor := "" 49 - if name == FEED_ALL_STREAMS { 48 + if name == FeedAllStreams { 50 49 posts, err = s.model.ListFeedPostsByType("livestream", limit, ts) 51 50 if err != nil { 52 51 return nil, echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to list feed posts: %v", err)) ··· 56 55 ts := last.CreatedAt.UnixMilli() 57 56 outCursor = fmt.Sprintf("%d::%s", ts, last.CID) 58 57 } 59 - } else if name == FEED_LIVE_STREAMS { 58 + } else if name == FeedLiveStreams { 60 59 segs, err := s.model.MostRecentSegments() 61 60 if err != nil { 62 61 return nil, echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to get recent segments: %v", err))
+2 -2
pkg/spxrpc/graph.go
··· 16 16 17 17 _, didErr := syntax.ParseDID(userDID) 18 18 if userDID == "" || didErr != nil { 19 - return nil, fmt.Errorf("Missing or invalid user DID") 19 + return nil, fmt.Errorf("missing or invalid user DID") 20 20 } 21 21 22 22 follow, err := s.model.GetUserFollowingUser(ctx, userDID, subjectDID) 23 23 if err != nil { 24 - return nil, fmt.Errorf("Failed to get user following: %w", err) 24 + return nil, fmt.Errorf("failed to get user following: %w", err) 25 25 } 26 26 27 27 output := &placestreamtypes.GraphGetFollowingUser_Output{}
+1
tools.go
··· 6 6 _ "github.com/99designs/gqlgen" 7 7 _ "github.com/99designs/gqlgen/graphql/introspection" 8 8 _ "github.com/bluesky-social/indigo/cmd/lexgen" 9 + _ "github.com/golangci/golangci-lint/v2/cmd/golangci-lint" 9 10 _ "golang.org/x/tools/cmd/goimports" 10 11 )