diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 864ee69..e3818cd 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -62,7 +62,7 @@ Total distributed third-party packages: 234 - [github.com/jbenet/go-temp-err-catcher](https://github.com/jbenet/go-temp-err-catcher/blob/v0.1.0/LICENSE) - [github.com/jpillora/backoff](https://github.com/jpillora/backoff/blob/v1.0.0/LICENSE) - [github.com/json-iterator/go](https://github.com/json-iterator/go/blob/v1.1.12/LICENSE) -- [github.com/klauspost/compress/zstd/internal/xxhash](https://github.com/klauspost/compress/blob/v1.19.0/zstd/internal/xxhash/LICENSE.txt) +- [github.com/klauspost/compress/zstd/internal/xxhash](https://github.com/klauspost/compress/blob/v1.19.1/zstd/internal/xxhash/LICENSE.txt) - [github.com/klauspost/cpuid/v2](https://github.com/klauspost/cpuid/blob/v2.3.0/LICENSE) - [github.com/knadh/koanf/maps](https://github.com/knadh/koanf/blob/maps/v0.1.2/maps/LICENSE) - [github.com/knadh/koanf/providers/confmap](https://github.com/knadh/koanf/blob/providers/confmap/v1.0.0/providers/confmap/LICENSE) @@ -138,8 +138,8 @@ Total distributed third-party packages: 234 - [cloud.google.com/go/auth](https://github.com/googleapis/google-cloud-go/blob/auth/v0.18.2/auth/LICENSE) - [cloud.google.com/go/auth/oauth2adapt](https://github.com/googleapis/google-cloud-go/blob/auth/oauth2adapt/v0.2.8/auth/oauth2adapt/LICENSE) - [cloud.google.com/go/compute/metadata](https://github.com/googleapis/google-cloud-go/blob/compute/metadata/v0.9.0/compute/metadata/LICENSE) -- [github.com/MicahParks/jwkset](https://github.com/MicahParks/jwkset/blob/v0.11.0/LICENSE) -- [github.com/MicahParks/keyfunc/v3](https://github.com/MicahParks/keyfunc/blob/v3.8.0/LICENSE) +- [github.com/MicahParks/jwkset](https://github.com/MicahParks/jwkset/blob/v0.11.1/LICENSE) +- [github.com/MicahParks/keyfunc/v3](https://github.com/MicahParks/keyfunc/blob/v3.8.1/LICENSE) - [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2/blob/v1.41.4/LICENSE.txt) - [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2/blob/config/v1.32.12/config/LICENSE.txt) - [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2/blob/credentials/v1.19.12/credentials/LICENSE.txt) @@ -161,7 +161,7 @@ Total distributed third-party packages: 234 - [github.com/googleapis/enterprise-certificate-proxy/client](https://github.com/googleapis/enterprise-certificate-proxy/blob/v0.3.14/LICENSE) - [github.com/ipfs/boxo](https://github.com/ipfs/boxo/blob/v0.30.0/LICENSE.md) - [github.com/jackpal/go-nat-pmp](https://github.com/jackpal/go-nat-pmp/blob/v1.0.2/LICENSE) -- [github.com/klauspost/compress](https://github.com/klauspost/compress/blob/v1.19.0/LICENSE) +- [github.com/klauspost/compress](https://github.com/klauspost/compress/blob/v1.19.1/LICENSE) - [github.com/kylelemons/godebug](https://github.com/kylelemons/godebug/blob/v1.1.0/LICENSE) - [github.com/libp2p/go-libp2p-pubsub](https://github.com/libp2p/go-libp2p-pubsub/blob/41b11d5cb1a7/LICENSE-APACHE) - [github.com/libp2p/go-libp2p/p2p/net/nat/internal/nat](https://github.com/libp2p/go-libp2p/blob/v0.48.0/p2p/net/nat/internal/nat/LICENSE) @@ -177,11 +177,11 @@ Total distributed third-party packages: 234 - [github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/processor/deltatocumulativeprocessor/v0.148.0/processor/deltatocumulativeprocessor/LICENSE) - [github.com/opentracing/opentracing-go](https://github.com/opentracing/opentracing-go/blob/v1.2.0/LICENSE) - [github.com/prometheus/client_golang/exp](https://github.com/prometheus/client_golang/blob/d8591d0db856/exp/LICENSE) -- [github.com/prometheus/client_golang/prometheus](https://github.com/prometheus/client_golang/blob/v1.23.2/LICENSE) +- [github.com/prometheus/client_golang/prometheus](https://github.com/prometheus/client_golang/blob/v1.24.1/LICENSE) - [github.com/prometheus/client_model/go](https://github.com/prometheus/client_model/blob/v0.6.2/LICENSE) -- [github.com/prometheus/common](https://github.com/prometheus/common/blob/v0.67.5/LICENSE) +- [github.com/prometheus/common](https://github.com/prometheus/common/blob/v0.70.1/LICENSE) - [github.com/prometheus/otlptranslator](https://github.com/prometheus/otlptranslator/blob/v1.0.0/LICENSE) -- [github.com/prometheus/procfs](https://github.com/prometheus/procfs/blob/v0.19.2/LICENSE) +- [github.com/prometheus/procfs](https://github.com/prometheus/procfs/blob/v0.21.1/LICENSE) - [github.com/prometheus/prometheus](https://github.com/prometheus/prometheus/blob/v0.311.3/LICENSE) - [github.com/prometheus/sigv4](https://github.com/prometheus/sigv4/blob/v0.4.1/LICENSE) - [github.com/puzpuzpuz/xsync/v4](https://github.com/puzpuzpuz/xsync/blob/v4.4.0/LICENSE) @@ -231,26 +231,26 @@ Total distributed third-party packages: 234 - [github.com/googleapis/gax-go/v2/internallog](https://github.com/googleapis/gax-go/blob/v2.18.0/v2/LICENSE) - [github.com/grafana/regexp](https://github.com/grafana/regexp/blob/f7b3be9d1853/LICENSE) - [github.com/hashicorp/golang-lru/v2/simplelru](https://github.com/hashicorp/golang-lru/blob/v2.0.7/simplelru/LICENSE_list) -- [github.com/klauspost/compress/internal/snapref](https://github.com/klauspost/compress/blob/v1.19.0/internal/snapref/LICENSE) -- [github.com/klauspost/compress/s2](https://github.com/klauspost/compress/blob/v1.19.0/s2/LICENSE) -- [github.com/klauspost/compress/snappy](https://github.com/klauspost/compress/blob/v1.19.0/snappy/LICENSE) +- [github.com/klauspost/compress/internal/snapref](https://github.com/klauspost/compress/blob/v1.19.1/internal/snapref/LICENSE) +- [github.com/klauspost/compress/s2](https://github.com/klauspost/compress/blob/v1.19.1/s2/LICENSE) +- [github.com/klauspost/compress/snappy](https://github.com/klauspost/compress/blob/v1.19.1/snappy/LICENSE) - [github.com/libp2p/go-netroute](https://github.com/libp2p/go-netroute/blob/v0.4.0/LICENSE) - [github.com/miekg/dns](https://github.com/miekg/dns/blob/v1.1.72/LICENSE) - [github.com/multiformats/go-base32](https://github.com/multiformats/go-base32/blob/v0.1.0/LICENSE) - [github.com/munnerz/goautoneg](https://github.com/munnerz/goautoneg/blob/a7dc8b61c822/LICENSE) - [github.com/pbnjay/memory](https://github.com/pbnjay/memory/blob/7b4eea64cf58/LICENSE) - [github.com/pmezard/go-difflib/difflib](https://github.com/pmezard/go-difflib/blob/5d4384ee4fb2/LICENSE) -- [github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil](https://github.com/prometheus/client_golang/blob/v1.23.2/internal/github.com/golang/gddo/LICENSE) +- [github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil](https://github.com/prometheus/client_golang/blob/v1.24.1/internal/github.com/golang/gddo/LICENSE) - [github.com/spaolacci/murmur3](https://github.com/spaolacci/murmur3/blob/v1.1.0/LICENSE) - [github.com/wlynxg/anet](https://github.com/wlynxg/anet/blob/v0.0.5/LICENSE) -- [golang.org/x/crypto](https://cs.opensource.google/go/x/crypto/+/v0.53.0:LICENSE) +- [golang.org/x/crypto](https://cs.opensource.google/go/x/crypto/+/v0.54.0:LICENSE) - [golang.org/x/exp](https://cs.opensource.google/go/x/exp/+/74f9aab9:LICENSE) -- [golang.org/x/net](https://cs.opensource.google/go/x/net/+/v0.56.0:LICENSE) +- [golang.org/x/net](https://cs.opensource.google/go/x/net/+/v0.57.0:LICENSE) - [golang.org/x/oauth2](https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE) -- [golang.org/x/sync/errgroup](https://cs.opensource.google/go/x/sync/+/v0.21.0:LICENSE) -- [golang.org/x/sys](https://cs.opensource.google/go/x/sys/+/v0.46.0:LICENSE) -- [golang.org/x/term](https://cs.opensource.google/go/x/term/+/v0.44.0:LICENSE) -- [golang.org/x/text](https://cs.opensource.google/go/x/text/+/v0.39.0:LICENSE) +- [golang.org/x/sync/errgroup](https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE) +- [golang.org/x/sys](https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE) +- [golang.org/x/term](https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE) +- [golang.org/x/text](https://cs.opensource.google/go/x/text/+/v0.40.0:LICENSE) - [golang.org/x/time/rate](https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE) - [gonum.org/v1/gonum/mathext](https://github.com/gonum/gonum/blob/v0.17.0/LICENSE) - [google.golang.org/api](https://github.com/googleapis/google-api-go-client/blob/v0.272.0/LICENSE) diff --git a/buf.gen.yaml b/buf.gen.yaml index d9f3b1c..f55c8ed 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -4,3 +4,7 @@ plugins: out: . opt: - module=github.com/getoptimum/optimum-gateway + - local: ["go", "tool", "protoc-gen-go-grpc"] + out: . + opt: + - module=github.com/getoptimum/optimum-gateway diff --git a/cmd/main.go b/cmd/main.go index c7a03b0..3fc843c 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,12 +2,17 @@ package main import ( "context" + "errors" "flag" "fmt" "io" + "net/http" "os" "os/signal" "syscall" + "time" + + "google.golang.org/grpc" commonio "github.com/getoptimum/optimum-common/pkg/io" "github.com/getoptimum/optimum-common/pkg/logger" @@ -16,6 +21,8 @@ import ( "github.com/getoptimum/optimum-gateway/pkg/service/auth_token" gateway "github.com/getoptimum/optimum-gateway/pkg/service/gossipsub-gateway" "github.com/getoptimum/optimum-gateway/pkg/service/message_router" + "github.com/getoptimum/optimum-gateway/pkg/service/stream" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" "github.com/getoptimum/optimum-gateway/pkg/service/telemetry" "github.com/getoptimum/optimum-gateway/pkg/utils" ) @@ -155,7 +162,35 @@ func main() { } } - srvGateway, err := gateway.NewService(ctx, l, appConf, srvMessageRouter, authMgr) + // Consumer block-stream (ADR-0011), opt-in and off by default. The hub must + // exist before the gateway so it can be wired as an emit sink; WS and gRPC + // share the one hub. + var streamServer *stream.Server + var streamGRPCServer *stream.GRPCServer + var hub *streamhub.Service + if appConf.StreamEnable { + hub = streamhub.New() + authenticator := stream.NewConsumerAuthenticator(authMgr, appConf.StreamRequireAuth) + // One limiter across both transports keeps the caps global, not + // per-transport; config validation guarantees the caps are > 0. + limiter := stream.NewConnLimiter(appConf.StreamMaxConns, appConf.StreamMaxConnsPerSub) + streamServer = stream.NewServer(hub, authenticator, stream.Config{ + Addr: appConf.StreamAddr, + MaxConns: appConf.StreamMaxConns, + MaxConnsPerSub: appConf.StreamMaxConnsPerSub, + BufferSize: appConf.StreamBufferSize, + Limiter: limiter, + }, l) + streamGRPCServer = stream.NewGRPCServer(hub, authenticator, stream.Config{ + Addr: appConf.StreamGRPCAddr, + MaxConns: appConf.StreamMaxConns, + MaxConnsPerSub: appConf.StreamMaxConnsPerSub, + BufferSize: appConf.StreamBufferSize, + Limiter: limiter, + }, l) + } + + srvGateway, err := gateway.NewService(ctx, l, appConf, srvMessageRouter, authMgr, gateway.WithStreamHub(hub)) if err != nil { l.Fatal("unable to initialize gossipsub gateway", err) } @@ -171,9 +206,33 @@ func main() { } }() + if streamServer != nil { + go func() { + if runErr := streamServer.Run(); runErr != nil && !errors.Is(runErr, http.ErrServerClosed) { + l.Fatal("failed to run consumer stream server", runErr) + } + }() + } + + if streamGRPCServer != nil { + go func() { + if runErr := streamGRPCServer.Run(); runErr != nil && !errors.Is(runErr, grpc.ErrServerStopped) { + l.Fatal("failed to run consumer stream grpc server", runErr) + } + }() + } + <-c // This blocks the main thread until an interrupt is received cancel() _ = appRouter.Stop() + if streamServer != nil { + shutdownCtx, cancelShutdown := context.WithTimeout(context.Background(), 5*time.Second) + _ = streamServer.Stop(shutdownCtx) + cancelShutdown() + } + if streamGRPCServer != nil { + streamGRPCServer.Stop() + } srvGateway.Stop() if lokiDone != nil { <-lokiDone // wait for final Loki flush to complete diff --git a/config/sample.app_conf.yml b/config/sample.app_conf.yml index 030acf2..f7a8b01 100644 --- a/config/sample.app_conf.yml +++ b/config/sample.app_conf.yml @@ -19,6 +19,17 @@ telemetry_port: 48123 # jwks_refresh_interval_sec: 3600 # bounds revocation-propagation lag # jwks_cache_path: /gateway/cache/jwks.json +# ─── Consumer block-stream (ADR-0011, opt-in, off by default) ──────────────── +# Exposes decoded beacon blocks to your own consumers over WebSocket + gRPC. +# See the "Consumer Block Stream" docs page for token minting and usage. +# stream_enable: false # default: false — master switch +# stream_addr: 0.0.0.0:9600 # default: 0.0.0.0:9600 — WebSocket listener (own port, off /metrics) +# stream_grpc_addr: 0.0.0.0:9601 # default: 0.0.0.0:9601 — gRPC listener +# stream_require_auth: true # default: true — verify consumer JWTs; false = loopback dev only +# stream_max_conns: 256 # default: 256 — global connection cap +# stream_max_conns_per_sub: 8 # default: 8 — per-consumer-key connection cap +# stream_buffer_size: 64 # default: 64 — per-connection ring buffer (drop-on-overflow) + # ─── Bootstrap ──────────────────────────────────────────────────────────────── # remote_bootstrap_url: bootstrap.getoptimum.io diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index fbc16f5..2b5ccaf 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -43,6 +43,7 @@ for (const v of versions) { { text: 'Quick Start', file: '01_quick_start.md' }, { text: 'Kubernetes (Helm)', file: '05_kubernetes.md' }, { text: 'Configuration', file: '02_configuration.md' }, + { text: 'Consumer Block Stream', file: '06_block_stream.md' }, { text: 'Metrics & Grafana', file: '03_telemetry.md' }, { text: 'Troubleshooting', file: '04_troubleshoot.md' }, { text: 'Metrics', file: 'metrics.md' }, diff --git a/docs/adr/0011-gateway-consumer-block-stream.md b/docs/adr/0011-gateway-consumer-block-stream.md index bfa5fce..69895fa 100644 --- a/docs/adr/0011-gateway-consumer-block-stream.md +++ b/docs/adr/0011-gateway-consumer-block-stream.md @@ -1,6 +1,6 @@ # ADR-0011: Gateway consumer block-stream API (WebSocket + gRPC) -**Status:** Approved (implementation pending) +**Status:** Approved (implemented) **Date:** 2026-08-05 ## Context @@ -47,7 +47,7 @@ The stream carries a small transport-neutral frame union, encoded per transport connection's cumulative `dropped` count so the consumer knows it missed events. Each subscriber has a bounded ring buffer (default 64). On overflow the hub drops -the oldest event, increments the per-connection `dropped` counter, and sends a +the incoming event, increments the per-connection `dropped` counter, and sends a `lagged` frame. The emit from ingest is a non-blocking send — it never waits on a consumer, so a slow/stalled subscriber cannot backpressure ingest. At-most-once, no replay (see Non-goals). @@ -59,7 +59,7 @@ Both read-only — consumers cannot publish into the mesh. * **WebSocket** — `GET /api/v1/stream/blocks` on its own listener (`OPT_STREAM_ADDR`) and Fiber app, so `/metrics` and `/health` stay off the exposed port. Params: `mode=metadata|raw`, `topics=beacon_block`. -* **gRPC** — `BlockStream.Subscribe(SubscribeRequest) returns (stream +* **gRPC** — `BlockStreamService.Subscribe(SubscribeRequest) returns (stream BlockEvent)` on `OPT_STREAM_GRPC_ADDR`, from a new `proto/getoptimum/optimum_gateway/service/stream/v1/stream.proto`. @@ -80,9 +80,9 @@ Consumers present a JWT minted by `auth.getoptimum.io` for a new audience unauthenticated connections are rejected, never subscribed. * No scope claim in v1 — `aud=stream` is the authorization. There is one topic (`beacon_block`), so a valid stream token grants read of the whole stream. The - gateway still caps connections per `sub` and globally and rate-limits events - per connection, but those are config-driven, not per-token. (If topics beyond - `beacon_block` are added later, a scope claim can gate them then.) + gateway still caps connections per `sub` and globally, but those caps are + config-driven, not per-token. (If topics beyond `beacon_block` are added later, + a scope claim can gate them then.) * The verifier sits behind a `ConsumerAuthenticator` interface so an operator-local key mode can replace central auth later without touching the transport or hub. Interface now, local impl later. @@ -105,9 +105,8 @@ Consumers present a JWT minted by `auth.getoptimum.io` for a new audience beyond `127.0.0.1`) requires TLS — native or a trusted TLS-terminating proxy. Startup validation must **reject** a non-loopback listener when `stream_require_auth=false`; disabling auth is allowed only on a loopback bind for -local dev. (Read/idle timeouts, max frame size, and the per-connection event-rate -cap are the other DoS mitigations — see Consequences — with concrete values fixed -in the implementation.) +local dev. (Read/idle timeouts, max frame size, and the connection caps are the +other DoS mitigations — see Consequences.) ### Data model — `BlockEvent` @@ -153,8 +152,8 @@ flowchart LR ## Consequences * New public surface means DoS exposure. Mitigations: auth-before-subscribe, - connection caps (global + per-`sub`), per-connection rate cap, read/idle - timeouts, max frame size, WS keepalive, TLS (proxy or native). + connection caps (global + per-`sub`), read/idle timeouts, max frame size, WS + keepalive, gRPC keepalive, TLS (proxy or native). * Central-auth coupling, bounded by the `ConsumerAuthenticator` seam. * Drop-on-lag means slow consumers miss events — surfaced via `lagged`/`dropped` rather than silently. diff --git a/docs/public/block_stream.png b/docs/public/block_stream.png new file mode 100644 index 0000000..18dbced Binary files /dev/null and b/docs/public/block_stream.png differ diff --git a/docs/sbom-full.json b/docs/sbom-full.json index dfc07a6..9248e67 100644 --- a/docs/sbom-full.json +++ b/docs/sbom-full.json @@ -1148,18 +1148,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", + "bom-ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", "type": "library", "name": "github.com/MicahParks/jwkset", - "version": "v0.11.0", + "version": "v0.11.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "c9cd331be8c2bd9a568050c59afb3cffc8eaa95046f68c886e606d9a33a1a324" + "content": "1abfba25e62827bb70ab20467fc317c63d8d48228fa17f1114cb5ecb7198f4dc" } ], - "purl": "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/MicahParks/jwkset", @@ -1177,18 +1177,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?type=module", + "bom-ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?type=module", "type": "library", "name": "github.com/MicahParks/keyfunc/v3", - "version": "v3.8.0", + "version": "v3.8.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "1f1d9d8088c05c693db256a433aad5f4139e6960cf1175d9e14b3c82e3417ddb" + "content": "551de3944b36c33d711a3bd45305077a807e789ea052706ba67201c91aed8fa8" } ], - "purl": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/MicahParks/keyfunc", @@ -3655,18 +3655,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "bom-ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "type": "library", "name": "github.com/getoptimum/optimum-common", - "version": "v0.1.2", + "version": "v0.1.4-0.20260811133125-9ee6a6cb5cf3", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "c5383e54c03d2ea8cb3abf973c75e61992b147eecfe6c1cef7fc8137e9d995f3" + "content": "4e4d7a60d31e81c7b392d842eaebe27ba1040c3b69d01741e7350065bdbe0d62" } ], - "purl": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/getoptimum/optimum-common", @@ -5832,18 +5832,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "bom-ref": "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "type": "library", "name": "github.com/klauspost/compress", - "version": "v1.19.0", + "version": "v1.19.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "b172c82df73d8d5d9061693314e3d64ad99c5151f6447101d4909d636a15bc24" + "content": "56c0781cfb308a1ee6999f1695e48543be5cfd48b5338b6b5f9a00b099e14a59" } ], - "purl": "pkg:golang/github.com/klauspost/compress@v1.19.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/klauspost/compress@v1.19.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/klauspost/compress", @@ -9022,18 +9022,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "bom-ref": "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "type": "library", "name": "github.com/prometheus/client_golang", - "version": "v1.23.2", + "version": "v1.24.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "25ef7aa1b721e510d5cb714332776852c8c0846e44762e3d8744495918bfa34a" + "content": "2672644445f35b151d0ae3c5a4859988f8aca53f71555e7dba2bb24766cf9675" } ], - "purl": "pkg:golang/github.com/prometheus/client_golang@v1.23.2?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/prometheus/client_golang@v1.24.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/prometheus/client_golang", @@ -9109,18 +9109,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "bom-ref": "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "type": "library", "name": "github.com/prometheus/common", - "version": "v0.67.5", + "version": "v0.70.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "a4880af78596950b7558bc000b98f6ca72da0510e28a7a006fce876474d4188e" + "content": "d47be33f80f9a0bdedf11b0f970c40f689efbd2b63b481d81395eebb03a2fcf6" } ], - "purl": "pkg:golang/github.com/prometheus/common@v0.67.5?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/prometheus/common@v0.70.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/prometheus/common", @@ -9167,18 +9167,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "bom-ref": "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "type": "library", "name": "github.com/prometheus/procfs", - "version": "v0.19.2", + "version": "v0.21.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "cd4321a845bae84c7b3972220e4965ded97d6b565d8a550e77f17a657c38570b" + "content": "1a58d90adfb34934be359abcf1cc90d4b8d9f91087a77b95b9a6c1580e7e3892" } ], - "purl": "pkg:golang/github.com/prometheus/procfs@v0.19.2?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/prometheus/procfs@v0.21.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/prometheus/procfs", @@ -11793,18 +11793,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "type": "library", "name": "golang.org/x/crypto", - "version": "v0.53.0", + "version": "v0.54.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "419e0cba8f131d7e828b3376bcf3dde5f0461f2a20add2bd7c6e302cf154b2da" + "content": "60b200e7d2b87e23731f38e766ddad50942342d5167d66de1c1a8ab64dde49cc" } ], - "purl": "pkg:golang/golang.org/x/crypto@v0.53.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/crypto@v0.54.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -11885,18 +11885,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/net@v0.57.0?type=module", "type": "library", "name": "golang.org/x/net", - "version": "v0.56.0", + "version": "v0.57.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "470f23fe11731af2546703415e702d7f9b150d5b7eeb948ad82ec8c42c59b79a" + "content": "2b9fb70e58ef22e0c6f7f26ff6bbf2332c18345090f5149463a38e4d3913fad1" } ], - "purl": "pkg:golang/golang.org/x/net@v0.56.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/net@v0.57.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -11931,18 +11931,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "type": "library", "name": "golang.org/x/sync", - "version": "v0.21.0", + "version": "v0.22.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "1cb208e314514ed091931629e0734517426cfce83aab68bef8a5db8348070b03" + "content": "4998e96de2e6ac2938c614526453595b980551e09e1608de92f23ffa07d271e9" } ], - "purl": "pkg:golang/golang.org/x/sync@v0.21.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/sync@v0.22.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -11954,18 +11954,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "type": "library", "name": "golang.org/x/sys", - "version": "v0.46.0", + "version": "v0.47.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "9e849fd85aba17c0c1812f8bcac224c7bac8131a0d1c9b31380b4fa78aed857c" + "content": "a3b5c63af6500800c1410e18ed536ad9d456411ec998e516f0ac71e19b0d816b" } ], - "purl": "pkg:golang/golang.org/x/sys@v0.46.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/sys@v0.47.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -12000,18 +12000,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/term@v0.44.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/term@v0.45.0?type=module", "type": "library", "name": "golang.org/x/term", - "version": "v0.44.0", + "version": "v0.45.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "d2b2ef0d10ad363d20664c885e10b239bd8e0331212d5a9ce01fa1aec061ae67" + "content": "3705b2066a0909b7d31e9c6b5a867d0bafd5c4e7fb89cdb5f48f3165915dadfd" } ], - "purl": "pkg:golang/golang.org/x/term@v0.44.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/term@v0.45.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -12023,18 +12023,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/text@v0.40.0?type=module", "type": "library", "name": "golang.org/x/text", - "version": "v0.39.0", + "version": "v0.40.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "51b673e292cebe7eb4d03e8e87a186108e950269ddac404bbfcffa0445f3caeb" + "content": "51bd99ebfc63805d56ad8433da7b884ce11e80a16d888cbeae279127994764ab" } ], - "purl": "pkg:golang/golang.org/x/text@v0.39.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/text@v0.40.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -12206,6 +12206,29 @@ ] } }, + { + "bom-ref": "pkg:golang/google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.6.2?type=module", + "type": "library", + "name": "google.golang.org/grpc/cmd/protoc-gen-go-grpc", + "version": "v1.6.2", + "scope": "required", + "hashes": [ + { + "alg": "SHA-256", + "content": "ae048dbeab1c159d49815ff8c07e463ac645485911d84b9af40b37288af62e53" + } + ], + "purl": "pkg:golang/google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.6.2?goarch=amd64&goos=linux&type=module", + "evidence": { + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ] + } + }, { "bom-ref": "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "type": "library", @@ -12667,12 +12690,13 @@ "ref": "pkg:golang/github.com/getoptimum/optimum-gateway@0.0.0-dev?type=module", "dependsOn": [ "pkg:golang/github.com/ferranbt/fastssz@v1.0.1-0.20251203093649-0b1f38e43198?type=module", - "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "pkg:golang/github.com/getoptimum/optimum-p2p@v0.0.1-rc12.2?type=module", "pkg:golang/github.com/gofiber/fiber/v3@v3.4.0?type=module", "pkg:golang/github.com/golang-jwt/jwt/v5@v5.3.1?type=module", "pkg:golang/github.com/golang/snappy@v1.0.0?type=module", "pkg:golang/github.com/google/uuid@v1.6.0?type=module", + "pkg:golang/github.com/gorilla/websocket@v1.5.4-0.20250319132907-e064f32e3674?type=module", "pkg:golang/github.com/ipfs/go-log@v1.0.5?type=module", "pkg:golang/github.com/libp2p/go-libp2p@v0.48.0?type=module", "pkg:golang/github.com/libp2p/go-libp2p-kad-dht@v0.33.1?type=module", @@ -12682,11 +12706,12 @@ "pkg:golang/github.com/libp2p/go-mplex@v0.7.0?type=module", "pkg:golang/github.com/montanaflynn/stats@v0.7.1?type=module", "pkg:golang/github.com/multiformats/go-multiaddr@v0.16.1?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "pkg:golang/github.com/prometheus/prometheus@v0.311.3?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", + "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module" ] @@ -12695,7 +12720,7 @@ "ref": "pkg:golang/4d63.com/gocheckcompilerdirectives@v1.3.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -12703,7 +12728,7 @@ "ref": "pkg:golang/4d63.com/gochecknoglobals@v0.2.2?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -12782,9 +12807,9 @@ "pkg:golang/github.com/spf13/pflag@v1.0.10?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -12815,7 +12840,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -12836,7 +12861,7 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -12878,8 +12903,8 @@ "pkg:golang/github.com/rivo/uniseg@v0.4.7?type=module", "pkg:golang/github.com/xo/terminfo@v0.0.0-20220910002029-abceb7e1c41e?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -12900,12 +12925,12 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -12920,9 +12945,9 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/googleapis/enterprise-certificate-proxy@v0.3.14?type=module", "pkg:golang/github.com/googleapis/gax-go/v2@v2.18.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module" ] @@ -12931,7 +12956,7 @@ "ref": "pkg:golang/cloud.google.com/go/compute/metadata@v0.9.0?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -12944,7 +12969,7 @@ "ref": "pkg:golang/codeberg.org/polyfloyd/go-errorlint@v1.9.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -12969,7 +12994,7 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -12982,7 +13007,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -12996,22 +13021,22 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, { "ref": "pkg:golang/filippo.io/bigmod@v0.1.1-0.20260103110540-f8a47775ebe5?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/filippo.io/keygen@v0.0.0-20260114151900-8e2790ea4c5b?type=module", "dependsOn": [ "pkg:golang/filippo.io/bigmod@v0.1.1-0.20260103110540-f8a47775ebe5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13022,7 +13047,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13031,7 +13056,7 @@ "ref": "pkg:golang/github.com/Abirdcfly/dupword@v0.1.7?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13039,7 +13064,7 @@ "ref": "pkg:golang/github.com/AdminBenni/iota-mixing@v1.0.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13047,7 +13072,7 @@ "ref": "pkg:golang/github.com/AlwxSin/noinlineerr@v1.0.5?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13055,7 +13080,7 @@ "ref": "pkg:golang/github.com/Antonboom/errname@v1.1.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13063,7 +13088,7 @@ "ref": "pkg:golang/github.com/Antonboom/nilnil@v1.1.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13071,7 +13096,7 @@ "ref": "pkg:golang/github.com/Antonboom/testifylint@v1.6.4?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13082,8 +13107,8 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -13100,10 +13125,10 @@ "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -13121,10 +13146,10 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -13136,7 +13161,7 @@ "pkg:golang/github.com/kylelemons/godebug@v1.1.0?type=module", "pkg:golang/github.com/montanaflynn/stats@v0.7.1?type=module", "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13147,7 +13172,7 @@ "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13155,7 +13180,7 @@ "ref": "pkg:golang/github.com/Djarvur/go-err113@v0.1.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13163,15 +13188,15 @@ "ref": "pkg:golang/github.com/Masterminds/semver/v3@v3.5.0?type=module" }, { - "ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", + "ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/time@v0.15.0?type=module" ] }, { - "ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?type=module", + "ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?type=module", "dependsOn": [ - "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", + "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", "pkg:golang/github.com/golang-jwt/jwt/v5@v5.3.1?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module" ] @@ -13181,7 +13206,7 @@ "dependsOn": [ "pkg:golang/github.com/sirupsen/logrus@v1.9.4?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13199,9 +13224,9 @@ "pkg:golang/github.com/xo/terminfo@v0.0.0-20220910002029-abceb7e1c41e?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13213,7 +13238,7 @@ "pkg:golang/github.com/gobwas/glob@v0.2.3?type=module", "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13230,7 +13255,7 @@ "dependsOn": [ "pkg:golang/github.com/hexops/gotextdiff@v1.0.3?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13244,7 +13269,7 @@ "ref": "pkg:golang/github.com/alexkohler/nakedret/v2@v2.0.6?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13253,7 +13278,7 @@ "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13264,7 +13289,7 @@ "ref": "pkg:golang/github.com/alingse/asasalint@v0.0.11?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13272,7 +13297,7 @@ "ref": "pkg:golang/github.com/alingse/nilnesserr@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13294,7 +13319,7 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13303,7 +13328,7 @@ "ref": "pkg:golang/github.com/ashanbrown/makezero/v2@v2.2.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13441,14 +13466,14 @@ "ref": "pkg:golang/github.com/bkielbasa/cyclop@v1.2.3?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/blizzy78/varnamelen@v0.8.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13456,7 +13481,7 @@ "ref": "pkg:golang/github.com/bombsimon/wsl/v4@v4.7.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13468,7 +13493,7 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13477,7 +13502,7 @@ "ref": "pkg:golang/github.com/breml/bidichk@v0.3.3?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13485,7 +13510,7 @@ "ref": "pkg:golang/github.com/breml/errchkjson@v0.4.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13534,7 +13559,7 @@ "pkg:golang/github.com/google/uuid@v1.6.0?type=module", "pkg:golang/github.com/inconshreveable/mousetrap@v1.1.0?type=module", "pkg:golang/github.com/jdx/go-netrc@v1.0.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/pgzip@v1.2.6?type=module", "pkg:golang/github.com/mattn/go-colorable@v0.1.15?type=module", "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", @@ -13570,14 +13595,14 @@ "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -13600,7 +13625,7 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/tidwall/btree@v1.8.1?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13613,7 +13638,7 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13625,7 +13650,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13634,7 +13659,7 @@ "ref": "pkg:golang/github.com/butuzov/mirror@v1.3.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13642,7 +13667,7 @@ "ref": "pkg:golang/github.com/catenacyber/perfsprint@v0.10.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13674,7 +13699,7 @@ "pkg:golang/github.com/lucasb-eyer/go-colorful@v1.4.0?type=module", "pkg:golang/github.com/mattn/go-runewidth@v0.0.23?type=module", "pkg:golang/github.com/xo/terminfo@v0.0.0-20220910002029-abceb7e1c41e?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13692,8 +13717,8 @@ "pkg:golang/github.com/muesli/cancelreader@v0.2.2?type=module", "pkg:golang/github.com/rivo/uniseg@v0.4.7?type=module", "pkg:golang/github.com/xo/terminfo@v0.0.0-20220910002029-abceb7e1c41e?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13708,19 +13733,19 @@ { "ref": "pkg:golang/github.com/charmbracelet/x/term@v0.2.2?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/charmbracelet/x/termios@v0.1.1?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/charmbracelet/x/windows@v0.2.2?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13728,16 +13753,16 @@ "dependsOn": [ "pkg:golang/github.com/hashicorp/go-version@v1.9.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/cli/browser@v1.3.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13757,7 +13782,7 @@ "dependsOn": [ "pkg:golang/github.com/containerd/errdefs@v1.0.0?type=module", "pkg:golang/github.com/gogo/protobuf@v1.3.2?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" @@ -13773,7 +13798,7 @@ "ref": "pkg:golang/github.com/curioswitch/go-reassign@v0.3.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13791,7 +13816,7 @@ "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -13800,7 +13825,7 @@ "ref": "pkg:golang/github.com/dave/dst@v0.27.3?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -13810,8 +13835,8 @@ { "ref": "pkg:golang/github.com/davidlazar/go-crypto@v0.0.0-20200604182044-b73af7476f6c?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13844,14 +13869,14 @@ { "ref": "pkg:golang/github.com/docker/docker-credential-helpers@v0.9.7?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/docker/go-connections@v0.7.0?type=module", "dependsOn": [ "pkg:golang/github.com/Microsoft/go-winio@v0.6.2?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13871,7 +13896,7 @@ "dependsOn": [ "pkg:golang/github.com/mattn/go-colorable@v0.1.15?type=module", "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13899,20 +13924,20 @@ "ref": "pkg:golang/github.com/firefart/nonamedreturns@v1.0.6?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/flynn/noise@v1.1.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module" ] }, { "ref": "pkg:golang/github.com/fsnotify/fsnotify@v1.9.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -13925,7 +13950,7 @@ "ref": "pkg:golang/github.com/fzipp/gocyclo@v0.6.0?type=module" }, { - "ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "dependsOn": [ "pkg:golang/4d63.com/gocheckcompilerdirectives@v1.3.0?type=module", "pkg:golang/4d63.com/gochecknoglobals@v0.2.2?type=module", @@ -13953,8 +13978,8 @@ "pkg:golang/github.com/ClickHouse/clickhouse-go-linter@v1.2.0?type=module", "pkg:golang/github.com/Djarvur/go-err113@v0.1.1?type=module", "pkg:golang/github.com/Masterminds/semver/v3@v3.5.0?type=module", - "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", - "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?type=module", + "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", + "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?type=module", "pkg:golang/github.com/Microsoft/go-winio@v0.6.2?type=module", "pkg:golang/github.com/MirrexOne/unqueryvet@v1.5.4?type=module", "pkg:golang/github.com/OpenPeeDeeP/depguard/v2@v2.2.1?type=module", @@ -14083,7 +14108,7 @@ "pkg:golang/github.com/karamaru-alpha/copyloopvar@v1.2.2?type=module", "pkg:golang/github.com/kisielk/errcheck@v1.10.0?type=module", "pkg:golang/github.com/kkHAIKE/contextcheck@v1.1.6?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/klauspost/pgzip@v1.2.6?type=module", "pkg:golang/github.com/kulti/thelper@v0.7.1?type=module", @@ -14136,10 +14161,10 @@ "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quasilyte/go-ruleguard@v0.4.5?type=module", "pkg:golang/github.com/quasilyte/go-ruleguard/dsl@v0.3.23?type=module", "pkg:golang/github.com/quasilyte/gogrep@v0.5.0?type=module", @@ -14202,17 +14227,17 @@ "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/exp/typeparams@v0.0.0-20260209203927-2842357ff358?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/telemetry@v0.0.0-20260625142307-59b4966ccb57?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", @@ -14245,7 +14270,7 @@ "pkg:golang/github.com/decred/dcrd/dcrec/secp256k1/v4@v4.4.0?type=module", "pkg:golang/github.com/dunglas/httpsfv@v1.1.0?type=module", "pkg:golang/github.com/flynn/noise@v1.1.0?type=module", - "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "pkg:golang/github.com/getoptimum/rlnc@v0.0.1-rc1.0.20260326154748-8ead5e1b16e5?type=module", "pkg:golang/github.com/go-logr/logr@v1.4.3?type=module", "pkg:golang/github.com/go-logr/stdr@v1.2.2?type=module", @@ -14267,7 +14292,7 @@ "pkg:golang/github.com/ipld/go-ipld-prime@v0.21.0?type=module", "pkg:golang/github.com/jackpal/go-nat-pmp@v1.0.2?type=module", "pkg:golang/github.com/jbenet/go-temp-err-catcher@v0.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -14327,10 +14352,10 @@ "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -14354,14 +14379,14 @@ "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/telemetry@v0.0.0-20260625142307-59b4966ccb57?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", @@ -14376,9 +14401,9 @@ { "ref": "pkg:golang/github.com/getoptimum/rlnc@v0.0.1-rc1.0.20260326154748-8ead5e1b16e5?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" @@ -14389,7 +14414,7 @@ "dependsOn": [ "pkg:golang/github.com/gobwas/glob@v0.2.3?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14411,7 +14436,7 @@ "pkg:golang/github.com/quasilyte/stdinfo@v0.0.0-20220114132959-f7386bf02567?type=module", "pkg:golang/golang.org/x/exp/typeparams@v0.0.0-20260209203927-2842357ff358?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14483,7 +14508,7 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -14497,7 +14522,7 @@ "pkg:golang/github.com/gofiber/schema@v1.8.0?type=module", "pkg:golang/github.com/gofiber/utils/v2@v2.1.1?type=module", "pkg:golang/github.com/google/uuid@v1.6.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/mattn/go-colorable@v0.1.15?type=module", "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", "pkg:golang/github.com/philhofer/fwd@v1.2.0?type=module", @@ -14507,10 +14532,10 @@ "pkg:golang/github.com/valyala/bytebufferpool@v1.0.0?type=module", "pkg:golang/github.com/valyala/fasthttp@v1.72.0?type=module", "pkg:golang/github.com/x448/float16@v0.8.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -14539,7 +14564,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -14560,7 +14585,7 @@ "ref": "pkg:golang/github.com/golangci/asciicheck@v0.5.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14571,7 +14596,7 @@ "ref": "pkg:golang/github.com/golangci/go-printf-func-name@v0.1.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14580,7 +14605,7 @@ "dependsOn": [ "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14723,10 +14748,10 @@ "pkg:golang/github.com/nunnatsa/ginkgolinter@v0.23.0?type=module", "pkg:golang/github.com/pelletier/go-toml/v2@v2.3.1?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quasilyte/go-ruleguard@v0.4.5?type=module", "pkg:golang/github.com/quasilyte/go-ruleguard/dsl@v0.3.23?type=module", "pkg:golang/github.com/quasilyte/gogrep@v0.5.0?type=module", @@ -14783,9 +14808,9 @@ "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/exp/typeparams@v0.0.0-20260209203927-2842357ff358?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", @@ -14807,9 +14832,9 @@ "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -14833,7 +14858,7 @@ "ref": "pkg:golang/github.com/golangci/rowserrcheck@v0.0.0-20260419091836-c5f79b8a11ba?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14844,7 +14869,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -14853,8 +14878,8 @@ "ref": "pkg:golang/github.com/golangci/unconvert@v0.0.0-20250410112200-a129a6e6413e?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -14866,7 +14891,7 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" @@ -14894,7 +14919,7 @@ "pkg:golang/github.com/go-logr/stdr@v1.2.2?type=module", "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/inconshreveable/mousetrap@v1.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/moby/docker-image-spec@v1.3.1?type=module", "pkg:golang/github.com/moby/moby/api@v1.54.2?type=module", "pkg:golang/github.com/moby/moby/client@v0.4.1?type=module", @@ -14912,16 +14937,16 @@ "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/google/gopacket@v1.1.19?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -14940,12 +14965,12 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -14960,17 +14985,17 @@ { "ref": "pkg:golang/github.com/googleapis/enterprise-certificate-proxy@v0.3.14?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/googleapis/gax-go/v2@v2.18.0?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -14982,14 +15007,14 @@ "ref": "pkg:golang/github.com/gordonklaus/ineffassign@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/gorilla/websocket@v1.5.4-0.20250319132907-e064f32e3674?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module" ] }, { @@ -15005,8 +15030,8 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/hashicorp/go-version@v1.9.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15014,7 +15039,7 @@ "ref": "pkg:golang/github.com/gostaticanalysis/forcetypeassert@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15023,8 +15048,8 @@ "dependsOn": [ "pkg:golang/github.com/gostaticanalysis/comment@v1.5.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15053,7 +15078,7 @@ { "ref": "pkg:golang/github.com/huin/goupnp@v1.3.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sync@v0.21.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module" ] }, { @@ -15088,7 +15113,7 @@ "pkg:golang/github.com/ipld/go-ipld-prime@v0.21.0?type=module", "pkg:golang/github.com/jackpal/go-nat-pmp@v1.0.2?type=module", "pkg:golang/github.com/jbenet/go-temp-err-catcher@v0.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -15142,10 +15167,10 @@ "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -15165,14 +15190,14 @@ "pkg:golang/go.uber.org/mock@v0.5.2?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -15195,8 +15220,8 @@ "pkg:golang/github.com/multiformats/go-multihash@v0.2.3?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] }, @@ -15229,7 +15254,7 @@ "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -15249,8 +15274,8 @@ "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] @@ -15271,7 +15296,7 @@ "ref": "pkg:golang/github.com/jjti/go-spancheck@v0.6.5?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15291,7 +15316,7 @@ "ref": "pkg:golang/github.com/julz/importas@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15299,7 +15324,7 @@ "ref": "pkg:golang/github.com/karamaru-alpha/copyloopvar@v1.2.2?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15307,7 +15332,7 @@ "ref": "pkg:golang/github.com/kisielk/errcheck@v1.10.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15317,17 +15342,17 @@ "pkg:golang/github.com/gostaticanalysis/analysisutil@v0.7.1?type=module", "pkg:golang/github.com/gostaticanalysis/comment@v1.5.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, { - "ref": "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module" + "ref": "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module" }, { "ref": "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -15360,15 +15385,15 @@ { "ref": "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/kulti/thelper@v0.7.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15376,7 +15401,7 @@ "ref": "pkg:golang/github.com/kunwardeep/paralleltest@v1.0.15?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15391,7 +15416,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -15400,7 +15425,7 @@ "ref": "pkg:golang/github.com/ldez/exptostd@v0.4.5?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15443,7 +15468,7 @@ "pkg:golang/github.com/hashicorp/go-immutable-radix/v2@v2.1.0?type=module", "pkg:golang/github.com/hashicorp/golang-lru/v2@v2.0.7?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15451,7 +15476,7 @@ "ref": "pkg:golang/github.com/ldez/usetesting@v0.5.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15543,10 +15568,10 @@ "pkg:golang/github.com/pion/turn/v4@v4.0.2?type=module", "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -15559,14 +15584,14 @@ "pkg:golang/go.uber.org/mock@v0.5.2?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/telemetry@v0.0.0-20260625142307-59b4966ccb57?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -15610,7 +15635,7 @@ "pkg:golang/github.com/ipld/go-ipld-prime@v0.21.0?type=module", "pkg:golang/github.com/jackpal/go-nat-pmp@v1.0.2?type=module", "pkg:golang/github.com/jbenet/go-temp-err-catcher@v0.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -15662,10 +15687,10 @@ "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -15682,13 +15707,13 @@ "pkg:golang/go.uber.org/mock@v0.5.2?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -15726,9 +15751,9 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" @@ -15762,9 +15787,9 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" @@ -15834,10 +15859,10 @@ "pkg:golang/github.com/pion/turn/v4@v4.0.2?type=module", "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -15849,13 +15874,13 @@ "pkg:golang/go.uber.org/mock@v0.5.2?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -15881,9 +15906,9 @@ "pkg:golang/github.com/multiformats/go-multihash@v0.2.3?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] @@ -15920,9 +15945,9 @@ "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" @@ -15938,7 +15963,7 @@ "pkg:golang/go.uber.org/atomic@v1.11.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -15956,8 +15981,8 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -15967,7 +15992,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -15988,7 +16013,7 @@ "ref": "pkg:golang/github.com/macabu/inamedparam@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -15996,7 +16021,7 @@ "ref": "pkg:golang/github.com/manuelarte/embeddedstructfieldcheck@v0.4.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16004,7 +16029,7 @@ "ref": "pkg:golang/github.com/manuelarte/funcorder@v0.6.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16012,7 +16037,7 @@ "ref": "pkg:golang/github.com/maratori/testableexamples@v1.0.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16020,7 +16045,7 @@ "ref": "pkg:golang/github.com/maratori/testpackage@v1.1.2?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16029,7 +16054,7 @@ "dependsOn": [ "pkg:golang/github.com/mikioh/tcpinfo@v0.0.0-20190314235526-30a79bb1804b?type=module", "pkg:golang/github.com/mikioh/tcpopt@v0.0.0-20190314235656-172688c1accc?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module" ] }, { @@ -16039,13 +16064,13 @@ "ref": "pkg:golang/github.com/mattn/go-colorable@v0.1.15?type=module", "dependsOn": [ "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -16068,9 +16093,9 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/spf13/afero@v1.15.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -16079,9 +16104,9 @@ "ref": "pkg:golang/github.com/miekg/dns@v1.1.72?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16095,7 +16120,7 @@ "ref": "pkg:golang/github.com/minio/sha256-simd@v1.0.1?type=module", "dependsOn": [ "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -16152,7 +16177,7 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module" ] }, @@ -16171,7 +16196,7 @@ "pkg:golang/github.com/gostaticanalysis/analysisutil@v0.7.1?type=module", "pkg:golang/github.com/gostaticanalysis/comment@v1.5.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16181,7 +16206,7 @@ { "ref": "pkg:golang/github.com/muesli/cancelreader@v0.2.2?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -16206,9 +16231,9 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] @@ -16228,10 +16253,10 @@ "pkg:golang/github.com/multiformats/go-multihash@v0.2.3?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] }, @@ -16260,8 +16285,8 @@ "pkg:golang/github.com/mr-tron/base58@v1.3.0?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] }, @@ -16291,7 +16316,7 @@ "ref": "pkg:golang/github.com/nishanths/exhaustive@v0.12.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16308,8 +16333,8 @@ "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/golang.org/x/exp/typeparams@v0.0.0-20260209203927-2842357ff358?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16394,7 +16419,7 @@ "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -16447,8 +16472,8 @@ "pkg:golang/github.com/pion/transport/v4@v4.0.1?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16467,9 +16492,9 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16501,8 +16526,8 @@ "dependsOn": [ "pkg:golang/github.com/pion/logging@v0.2.4?type=module", "pkg:golang/github.com/pion/transport/v3@v3.0.7?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -16560,7 +16585,7 @@ "pkg:golang/github.com/pion/transport/v3@v3.0.7?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16574,8 +16599,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16587,8 +16612,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16600,8 +16625,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -16618,8 +16643,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16646,16 +16671,16 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, { "ref": "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -16665,28 +16690,30 @@ "ref": "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module" }, { - "ref": "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "ref": "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "dependsOn": [ "pkg:golang/github.com/beorn7/perks@v1.0.1?type=module", "pkg:golang/github.com/cespare/xxhash/v2@v2.3.0?type=module", + "pkg:golang/github.com/golang-jwt/jwt/v5@v5.3.1?type=module", "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", + "pkg:golang/github.com/google/uuid@v1.6.0?type=module", "pkg:golang/github.com/jpillora/backoff@v1.0.0?type=module", "pkg:golang/github.com/json-iterator/go@v1.1.12?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/kylelemons/godebug@v1.1.0?type=module", "pkg:golang/github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd?type=module", "pkg:golang/github.com/modern-go/reflect2@v1.0.3-0.20250322232337-35a7c28c31ee?type=module", "pkg:golang/github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822?type=module", "pkg:golang/github.com/mwitkow/go-conntrack@v0.0.0-20190716064945-2f068394615f?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" ] }, @@ -16694,9 +16721,9 @@ "ref": "pkg:golang/github.com/prometheus/client_golang/exp@v0.0.0-20260325093428-d8591d0db856?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" ] @@ -16708,7 +16735,7 @@ ] }, { - "ref": "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "ref": "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "dependsOn": [ "pkg:golang/github.com/alecthomas/units@v0.0.0-20240927000941-0f3dac36c52b?type=module", "pkg:golang/github.com/beorn7/perks@v1.0.1?type=module", @@ -16721,16 +16748,15 @@ "pkg:golang/github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822?type=module", "pkg:golang/github.com/mwitkow/go-conntrack@v0.0.0-20190716064945-2f068394615f?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", - "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -16739,11 +16765,11 @@ "ref": "pkg:golang/github.com/prometheus/otlptranslator@v1.0.0?type=module" }, { - "ref": "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "ref": "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -16804,7 +16830,7 @@ "pkg:golang/github.com/hashicorp/golang-lru@v1.0.2?type=module", "pkg:golang/github.com/jpillora/backoff@v1.0.0?type=module", "pkg:golang/github.com/json-iterator/go@v1.1.12?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/knadh/koanf/maps@v0.1.2?type=module", "pkg:golang/github.com/knadh/koanf/providers/confmap@v1.0.0?type=module", "pkg:golang/github.com/knadh/koanf/v2@v2.3.3?type=module", @@ -16830,12 +16856,12 @@ "pkg:golang/github.com/pbnjay/memory@v0.0.0-20210728143218-7b4eea64cf58?type=module", "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_golang/exp@v0.0.0-20260325093428-d8591d0db856?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "pkg:golang/github.com/prometheus/otlptranslator@v1.0.0?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/prometheus/sigv4@v0.4.1?type=module", "pkg:golang/github.com/puzpuzpuz/xsync/v4@v4.4.0?type=module", "pkg:golang/github.com/santhosh-tekuri/jsonschema/v6@v6.0.2?type=module", @@ -16865,15 +16891,15 @@ "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", @@ -16921,16 +16947,16 @@ "pkg:golang/github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822?type=module", "pkg:golang/github.com/mwitkow/go-conntrack@v0.0.0-20190716064945-2f068394615f?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" @@ -16950,7 +16976,7 @@ "pkg:golang/github.com/quasilyte/stdinfo@v0.0.0-20220114132959-f7386bf02567?type=module", "pkg:golang/golang.org/x/exp/typeparams@v0.0.0-20260209203927-2842357ff358?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -16977,7 +17003,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -16990,12 +17016,12 @@ "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.uber.org/mock@v0.5.2?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -17009,10 +17035,10 @@ "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17020,7 +17046,7 @@ "ref": "pkg:golang/github.com/raeperd/recvcheck@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17031,7 +17057,7 @@ "ref": "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17067,10 +17093,10 @@ { "ref": "pkg:golang/github.com/ryanrolds/sqlclosecheck@v0.6.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17078,14 +17104,14 @@ "ref": "pkg:golang/github.com/sagikazarmark/locafero@v0.12.0?type=module", "dependsOn": [ "pkg:golang/github.com/spf13/afero@v1.15.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { "ref": "pkg:golang/github.com/sanposhiho/wastedassign/v2@v2.1.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17093,14 +17119,14 @@ "ref": "pkg:golang/github.com/santhosh-tekuri/jsonschema/v6@v6.0.2?type=module", "dependsOn": [ "pkg:golang/github.com/dlclark/regexp2@v1.12.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { "ref": "pkg:golang/github.com/sashamelentyev/interfacebloat@v1.1.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17108,7 +17134,7 @@ "ref": "pkg:golang/github.com/sashamelentyev/usestdlibvars@v1.29.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17142,12 +17168,12 @@ "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -17158,14 +17184,14 @@ { "ref": "pkg:golang/github.com/segmentio/asm@v1.2.1?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/segmentio/encoding@v0.5.4?type=module", "dependsOn": [ "pkg:golang/github.com/segmentio/asm@v1.2.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -17174,7 +17200,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17183,8 +17209,8 @@ "dependsOn": [ "pkg:golang/github.com/hashicorp/go-version@v1.9.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17194,7 +17220,7 @@ "pkg:golang/github.com/gostaticanalysis/analysisutil@v0.7.1?type=module", "pkg:golang/github.com/gostaticanalysis/comment@v1.5.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17210,7 +17236,7 @@ { "ref": "pkg:golang/github.com/spf13/afero@v1.15.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -17248,8 +17274,8 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/subosito/gotenv@v1.6.0?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17263,7 +17289,7 @@ "ref": "pkg:golang/github.com/stbenjam/no-sprintf-host-port@v0.3.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17291,7 +17317,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17304,7 +17330,7 @@ { "ref": "pkg:golang/github.com/tetratelabs/wazero@v1.11.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -17324,7 +17350,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -17353,9 +17379,9 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/subosito/gotenv@v1.6.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" @@ -17373,7 +17399,7 @@ "ref": "pkg:golang/github.com/ultraware/funlen@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17381,7 +17407,7 @@ "ref": "pkg:golang/github.com/ultraware/whitespace@v0.2.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17389,7 +17415,7 @@ "ref": "pkg:golang/github.com/uudashr/gocognit@v1.2.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17397,7 +17423,7 @@ "ref": "pkg:golang/github.com/uudashr/iface@v1.4.2?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17408,12 +17434,12 @@ "ref": "pkg:golang/github.com/valyala/fasthttp@v1.72.0?type=module", "dependsOn": [ "pkg:golang/github.com/andybalholm/brotli@v1.2.2?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/valyala/bytebufferpool@v1.0.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -17429,8 +17455,8 @@ "ref": "pkg:golang/github.com/xen0n/gosmopolitan@v1.3.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17444,7 +17470,7 @@ "ref": "pkg:golang/github.com/yagipy/maintidx@v1.0.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17456,12 +17482,12 @@ "pkg:golang/github.com/cespare/xxhash/v2@v2.3.0?type=module", "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" @@ -17473,8 +17499,8 @@ "pkg:golang/github.com/gostaticanalysis/comment@v1.5.0?type=module", "pkg:golang/github.com/hashicorp/go-version@v1.9.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17482,7 +17508,7 @@ "ref": "pkg:golang/gitlab.com/bosi/decorder@v0.4.2?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17490,7 +17516,7 @@ "ref": "pkg:golang/go-simpler.org/musttag@v0.14.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17499,7 +17525,7 @@ "dependsOn": [ "pkg:golang/github.com/ettle/strcase@v0.2.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17507,7 +17533,7 @@ "ref": "pkg:golang/go.augendre.info/arangolint@v0.4.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17515,7 +17541,7 @@ "ref": "pkg:golang/go.augendre.info/fatcontext@v0.9.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17524,7 +17550,7 @@ "dependsOn": [ "pkg:golang/github.com/segmentio/asm@v1.2.1?type=module", "pkg:golang/github.com/segmentio/encoding@v0.5.4?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -17542,7 +17568,7 @@ "pkg:golang/go.uber.org/atomic@v1.11.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -17695,9 +17721,9 @@ "pkg:golang/go.opentelemetry.io/collector/featuregate@v1.54.0?type=module", "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -17756,7 +17782,7 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17775,7 +17801,7 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17849,7 +17875,7 @@ "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -17869,7 +17895,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -17902,12 +17928,12 @@ "ref": "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module" }, { - "ref": "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "ref": "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -17915,7 +17941,7 @@ "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17929,12 +17955,12 @@ ] }, { - "ref": "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "ref": "pkg:golang/golang.org/x/net@v0.57.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -17944,30 +17970,30 @@ ] }, { - "ref": "pkg:golang/golang.org/x/sync@v0.21.0?type=module" + "ref": "pkg:golang/golang.org/x/sync@v0.22.0?type=module" }, { - "ref": "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "ref": "pkg:golang/golang.org/x/sys@v0.47.0?type=module" }, { "ref": "pkg:golang/golang.org/x/telemetry@v0.0.0-20260625142307-59b4966ccb57?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { - "ref": "pkg:golang/golang.org/x/term@v0.44.0?type=module", + "ref": "pkg:golang/golang.org/x/term@v0.45.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { - "ref": "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "ref": "pkg:golang/golang.org/x/text@v0.40.0?type=module", "dependsOn": [ "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -17979,9 +18005,9 @@ "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/telemetry@v0.0.0-20260625142307-59b4966ccb57?type=module" ] }, @@ -17991,8 +18017,8 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -18016,12 +18042,12 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -18031,9 +18057,9 @@ { "ref": "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" @@ -18059,17 +18085,28 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/api@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" ] }, + { + "ref": "pkg:golang/google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.6.2?type=module", + "dependsOn": [ + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", + "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", + "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", + "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" + ] + }, { "ref": "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "dependsOn": [ @@ -18092,8 +18129,8 @@ "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "pkg:golang/golang.org/x/exp/typeparams@v0.0.0-20260209203927-2842357ff358?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -18115,8 +18152,8 @@ "pkg:golang/github.com/x448/float16@v0.8.4?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/inf.v0@v0.9.1?type=module", @@ -18152,11 +18189,11 @@ "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/inf.v0@v0.9.1?type=module", @@ -18195,10 +18232,10 @@ "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", @@ -18230,8 +18267,8 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -18240,8 +18277,8 @@ "dependsOn": [ "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -18250,8 +18287,8 @@ "dependsOn": [ "pkg:golang/github.com/rogpeppe/go-internal@v1.14.1?type=module", "pkg:golang/golang.org/x/mod@v0.37.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/tools@v0.47.0?type=module" ] }, @@ -18265,7 +18302,7 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/spf13/pflag@v1.0.10?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] diff --git a/docs/sbom.json b/docs/sbom.json index 59e0138..5ff88d1 100644 --- a/docs/sbom.json +++ b/docs/sbom.json @@ -291,18 +291,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", + "bom-ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", "type": "library", "name": "github.com/MicahParks/jwkset", - "version": "v0.11.0", + "version": "v0.11.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "c9cd331be8c2bd9a568050c59afb3cffc8eaa95046f68c886e606d9a33a1a324" + "content": "1abfba25e62827bb70ab20467fc317c63d8d48228fa17f1114cb5ecb7198f4dc" } ], - "purl": "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/MicahParks/jwkset", @@ -320,18 +320,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?type=module", + "bom-ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?type=module", "type": "library", "name": "github.com/MicahParks/keyfunc/v3", - "version": "v3.8.0", + "version": "v3.8.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "1f1d9d8088c05c693db256a433aad5f4139e6960cf1175d9e14b3c82e3417ddb" + "content": "551de3944b36c33d711a3bd45305077a807e789ea052706ba67201c91aed8fa8" } ], - "purl": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/MicahParks/keyfunc", @@ -1210,18 +1210,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "bom-ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "type": "library", "name": "github.com/getoptimum/optimum-common", - "version": "v0.1.2", + "version": "v0.1.4-0.20260811133125-9ee6a6cb5cf3", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "c5383e54c03d2ea8cb3abf973c75e61992b147eecfe6c1cef7fc8137e9d995f3" + "content": "4e4d7a60d31e81c7b392d842eaebe27ba1040c3b69d01741e7350065bdbe0d62" } ], - "purl": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/getoptimum/optimum-common", @@ -2207,18 +2207,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "bom-ref": "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "type": "library", "name": "github.com/klauspost/compress", - "version": "v1.19.0", + "version": "v1.19.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "b172c82df73d8d5d9061693314e3d64ad99c5151f6447101d4909d636a15bc24" + "content": "56c0781cfb308a1ee6999f1695e48543be5cfd48b5338b6b5f9a00b099e14a59" } ], - "purl": "pkg:golang/github.com/klauspost/compress@v1.19.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/klauspost/compress@v1.19.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/klauspost/compress", @@ -4411,18 +4411,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "bom-ref": "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "type": "library", "name": "github.com/prometheus/client_golang", - "version": "v1.23.2", + "version": "v1.24.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "25ef7aa1b721e510d5cb714332776852c8c0846e44762e3d8744495918bfa34a" + "content": "2672644445f35b151d0ae3c5a4859988f8aca53f71555e7dba2bb24766cf9675" } ], - "purl": "pkg:golang/github.com/prometheus/client_golang@v1.23.2?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/prometheus/client_golang@v1.24.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/prometheus/client_golang", @@ -4498,18 +4498,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "bom-ref": "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "type": "library", "name": "github.com/prometheus/common", - "version": "v0.67.5", + "version": "v0.70.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "a4880af78596950b7558bc000b98f6ca72da0510e28a7a006fce876474d4188e" + "content": "d47be33f80f9a0bdedf11b0f970c40f689efbd2b63b481d81395eebb03a2fcf6" } ], - "purl": "pkg:golang/github.com/prometheus/common@v0.67.5?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/prometheus/common@v0.70.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/prometheus/common", @@ -4556,18 +4556,18 @@ } }, { - "bom-ref": "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "bom-ref": "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "type": "library", "name": "github.com/prometheus/procfs", - "version": "v0.19.2", + "version": "v0.21.1", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "cd4321a845bae84c7b3972220e4965ded97d6b565d8a550e77f17a657c38570b" + "content": "1a58d90adfb34934be359abcf1cc90d4b8d9f91087a77b95b9a6c1580e7e3892" } ], - "purl": "pkg:golang/github.com/prometheus/procfs@v0.19.2?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/github.com/prometheus/procfs@v0.21.1?goarch=amd64&goos=linux&type=module", "externalReferences": [ { "url": "https://github.com/prometheus/procfs", @@ -5520,18 +5520,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "type": "library", "name": "golang.org/x/crypto", - "version": "v0.53.0", + "version": "v0.54.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "419e0cba8f131d7e828b3376bcf3dde5f0461f2a20add2bd7c6e302cf154b2da" + "content": "60b200e7d2b87e23731f38e766ddad50942342d5167d66de1c1a8ab64dde49cc" } ], - "purl": "pkg:golang/golang.org/x/crypto@v0.53.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/crypto@v0.54.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -5566,18 +5566,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/net@v0.57.0?type=module", "type": "library", "name": "golang.org/x/net", - "version": "v0.56.0", + "version": "v0.57.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "470f23fe11731af2546703415e702d7f9b150d5b7eeb948ad82ec8c42c59b79a" + "content": "2b9fb70e58ef22e0c6f7f26ff6bbf2332c18345090f5149463a38e4d3913fad1" } ], - "purl": "pkg:golang/golang.org/x/net@v0.56.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/net@v0.57.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -5612,18 +5612,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/sync@v0.21.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/sync@v0.22.0?type=module", "type": "library", "name": "golang.org/x/sync", - "version": "v0.21.0", + "version": "v0.22.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "1cb208e314514ed091931629e0734517426cfce83aab68bef8a5db8348070b03" + "content": "4998e96de2e6ac2938c614526453595b980551e09e1608de92f23ffa07d271e9" } ], - "purl": "pkg:golang/golang.org/x/sync@v0.21.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/sync@v0.22.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -5635,18 +5635,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "type": "library", "name": "golang.org/x/sys", - "version": "v0.46.0", + "version": "v0.47.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "9e849fd85aba17c0c1812f8bcac224c7bac8131a0d1c9b31380b4fa78aed857c" + "content": "a3b5c63af6500800c1410e18ed536ad9d456411ec998e516f0ac71e19b0d816b" } ], - "purl": "pkg:golang/golang.org/x/sys@v0.46.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/sys@v0.47.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -5658,18 +5658,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/term@v0.44.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/term@v0.45.0?type=module", "type": "library", "name": "golang.org/x/term", - "version": "v0.44.0", + "version": "v0.45.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "d2b2ef0d10ad363d20664c885e10b239bd8e0331212d5a9ce01fa1aec061ae67" + "content": "3705b2066a0909b7d31e9c6b5a867d0bafd5c4e7fb89cdb5f48f3165915dadfd" } ], - "purl": "pkg:golang/golang.org/x/term@v0.44.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/term@v0.45.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -5681,18 +5681,18 @@ } }, { - "bom-ref": "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "bom-ref": "pkg:golang/golang.org/x/text@v0.40.0?type=module", "type": "library", "name": "golang.org/x/text", - "version": "v0.39.0", + "version": "v0.40.0", "scope": "required", "hashes": [ { "alg": "SHA-256", - "content": "51b673e292cebe7eb4d03e8e87a186108e950269ddac404bbfcffa0445f3caeb" + "content": "51bd99ebfc63805d56ad8433da7b884ce11e80a16d888cbeae279127994764ab" } ], - "purl": "pkg:golang/golang.org/x/text@v0.39.0?goarch=amd64&goos=linux&type=module", + "purl": "pkg:golang/golang.org/x/text@v0.40.0?goarch=amd64&goos=linux&type=module", "evidence": { "licenses": [ { @@ -6164,12 +6164,13 @@ "ref": "pkg:golang/github.com/getoptimum/optimum-gateway@0.0.0-dev?type=module#cmd", "dependsOn": [ "pkg:golang/github.com/ferranbt/fastssz@v1.0.1-0.20251203093649-0b1f38e43198?type=module", - "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "pkg:golang/github.com/getoptimum/optimum-p2p@v0.0.1-rc12.2?type=module", "pkg:golang/github.com/gofiber/fiber/v3@v3.4.0?type=module", "pkg:golang/github.com/golang-jwt/jwt/v5@v5.3.1?type=module", "pkg:golang/github.com/golang/snappy@v1.0.0?type=module", "pkg:golang/github.com/google/uuid@v1.6.0?type=module", + "pkg:golang/github.com/gorilla/websocket@v1.5.4-0.20250319132907-e064f32e3674?type=module", "pkg:golang/github.com/ipfs/go-log@v1.0.5?type=module", "pkg:golang/github.com/libp2p/go-libp2p@v0.48.0?type=module", "pkg:golang/github.com/libp2p/go-libp2p-kad-dht@v0.33.1?type=module", @@ -6179,11 +6180,12 @@ "pkg:golang/github.com/libp2p/go-mplex@v0.7.0?type=module", "pkg:golang/github.com/montanaflynn/stats@v0.7.1?type=module", "pkg:golang/github.com/multiformats/go-multiaddr@v0.16.1?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "pkg:golang/github.com/prometheus/prometheus@v0.311.3?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", + "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module" ] @@ -6206,12 +6208,12 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -6226,9 +6228,9 @@ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/googleapis/enterprise-certificate-proxy@v0.3.14?type=module", "pkg:golang/github.com/googleapis/gax-go/v2@v2.18.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module" ] @@ -6237,21 +6239,21 @@ "ref": "pkg:golang/cloud.google.com/go/compute/metadata@v0.9.0?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/filippo.io/bigmod@v0.1.1-0.20260103110540-f8a47775ebe5?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/filippo.io/keygen@v0.0.0-20260114151900-8e2790ea4c5b?type=module", "dependsOn": [ "pkg:golang/filippo.io/bigmod@v0.1.1-0.20260103110540-f8a47775ebe5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -6261,8 +6263,8 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -6279,10 +6281,10 @@ "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -6299,10 +6301,10 @@ "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -6314,19 +6316,19 @@ "pkg:golang/github.com/kylelemons/godebug@v1.1.0?type=module", "pkg:golang/github.com/montanaflynn/stats@v0.7.1?type=module", "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { - "ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", + "ref": "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", "dependsOn": [ "pkg:golang/golang.org/x/time@v0.15.0?type=module" ] }, { - "ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?type=module", + "ref": "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?type=module", "dependsOn": [ - "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", + "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", "pkg:golang/github.com/golang-jwt/jwt/v5@v5.3.1?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module" ] @@ -6479,8 +6481,8 @@ { "ref": "pkg:golang/github.com/davidlazar/go-crypto@v0.0.0-20200604182044-b73af7476f6c?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -6516,7 +6518,7 @@ { "ref": "pkg:golang/github.com/flynn/noise@v1.1.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module" ] }, { @@ -6526,7 +6528,7 @@ ] }, { - "ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "ref": "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "dependsOn": [ "pkg:golang/cloud.google.com/go/auth@v0.18.2?type=module", "pkg:golang/cloud.google.com/go/auth/oauth2adapt@v0.2.8?type=module", @@ -6535,8 +6537,8 @@ "pkg:golang/github.com/Azure/azure-sdk-for-go/sdk/azidentity@v1.13.1?type=module", "pkg:golang/github.com/Azure/azure-sdk-for-go/sdk/internal@v1.11.2?type=module", "pkg:golang/github.com/AzureAD/microsoft-authentication-library-for-go@v1.6.0?type=module", - "pkg:golang/github.com/MicahParks/jwkset@v0.11.0?type=module", - "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.0?type=module", + "pkg:golang/github.com/MicahParks/jwkset@v0.11.1?type=module", + "pkg:golang/github.com/MicahParks/keyfunc/v3@v3.8.1?type=module", "pkg:golang/github.com/aws/aws-sdk-go-v2@v1.41.4?type=module", "pkg:golang/github.com/aws/aws-sdk-go-v2/config@v1.32.12?type=module", "pkg:golang/github.com/aws/aws-sdk-go-v2/credentials@v1.19.12?type=module", @@ -6575,7 +6577,7 @@ "pkg:golang/github.com/ipfs/go-datastore@v0.8.2?type=module", "pkg:golang/github.com/ipfs/go-log@v1.0.5?type=module", "pkg:golang/github.com/ipfs/go-log/v2@v2.6.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/kylelemons/godebug@v1.1.0?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -6597,10 +6599,10 @@ "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.opentelemetry.io/auto/sdk@v1.2.1?type=module", @@ -6613,14 +6615,14 @@ "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -6643,7 +6645,7 @@ "pkg:golang/github.com/decred/dcrd/dcrec/secp256k1/v4@v4.4.0?type=module", "pkg:golang/github.com/dunglas/httpsfv@v1.1.0?type=module", "pkg:golang/github.com/flynn/noise@v1.1.0?type=module", - "pkg:golang/github.com/getoptimum/optimum-common@v0.1.2?type=module", + "pkg:golang/github.com/getoptimum/optimum-common@v0.1.4-0.20260811133125-9ee6a6cb5cf3?type=module", "pkg:golang/github.com/getoptimum/rlnc@v0.0.1-rc1.0.20260326154748-8ead5e1b16e5?type=module", "pkg:golang/github.com/go-logr/logr@v1.4.3?type=module", "pkg:golang/github.com/go-logr/stdr@v1.2.2?type=module", @@ -6664,7 +6666,7 @@ "pkg:golang/github.com/ipld/go-ipld-prime@v0.21.0?type=module", "pkg:golang/github.com/jackpal/go-nat-pmp@v1.0.2?type=module", "pkg:golang/github.com/jbenet/go-temp-err-catcher@v0.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -6721,10 +6723,10 @@ "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -6743,12 +6745,12 @@ "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -6762,9 +6764,9 @@ { "ref": "pkg:golang/github.com/getoptimum/rlnc@v0.0.1-rc1.0.20260326154748-8ead5e1b16e5?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" @@ -6794,7 +6796,7 @@ "pkg:golang/github.com/gofiber/schema@v1.8.0?type=module", "pkg:golang/github.com/gofiber/utils/v2@v2.1.1?type=module", "pkg:golang/github.com/google/uuid@v1.6.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/mattn/go-colorable@v0.1.15?type=module", "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", "pkg:golang/github.com/philhofer/fwd@v1.2.0?type=module", @@ -6804,10 +6806,10 @@ "pkg:golang/github.com/valyala/bytebufferpool@v1.0.0?type=module", "pkg:golang/github.com/valyala/fasthttp@v1.72.0?type=module", "pkg:golang/github.com/x448/float16@v0.8.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -6845,8 +6847,8 @@ { "ref": "pkg:golang/github.com/google/gopacket@v1.1.19?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -6865,12 +6867,12 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -6884,17 +6886,17 @@ { "ref": "pkg:golang/github.com/googleapis/enterprise-certificate-proxy@v0.3.14?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/googleapis/gax-go/v2@v2.18.0?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -6904,7 +6906,7 @@ { "ref": "pkg:golang/github.com/gorilla/websocket@v1.5.4-0.20250319132907-e064f32e3674?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module" ] }, { @@ -6922,7 +6924,7 @@ { "ref": "pkg:golang/github.com/huin/goupnp@v1.3.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sync@v0.21.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module" ] }, { @@ -6953,7 +6955,7 @@ "pkg:golang/github.com/ipld/go-ipld-prime@v0.21.0?type=module", "pkg:golang/github.com/jackpal/go-nat-pmp@v1.0.2?type=module", "pkg:golang/github.com/jbenet/go-temp-err-catcher@v0.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -7007,10 +7009,10 @@ "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -7028,13 +7030,13 @@ "pkg:golang/go.uber.org/fx@v1.24.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -7055,8 +7057,8 @@ "pkg:golang/github.com/multiformats/go-multihash@v0.2.3?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] }, @@ -7088,7 +7090,7 @@ "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -7107,8 +7109,8 @@ "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] @@ -7132,12 +7134,12 @@ ] }, { - "ref": "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module" + "ref": "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module" }, { "ref": "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -7167,8 +7169,8 @@ { "ref": "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -7255,10 +7257,10 @@ "pkg:golang/github.com/pion/turn/v4@v4.0.2?type=module", "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -7270,12 +7272,12 @@ "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", @@ -7317,7 +7319,7 @@ "pkg:golang/github.com/ipld/go-ipld-prime@v0.21.0?type=module", "pkg:golang/github.com/jackpal/go-nat-pmp@v1.0.2?type=module", "pkg:golang/github.com/jbenet/go-temp-err-catcher@v0.1.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", "pkg:golang/github.com/koron/go-ssdp@v0.0.6?type=module", "pkg:golang/github.com/libp2p/go-buffer-pool@v0.1.0?type=module", @@ -7369,10 +7371,10 @@ "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -7388,12 +7390,12 @@ "pkg:golang/go.uber.org/fx@v1.24.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", @@ -7429,9 +7431,9 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" @@ -7464,9 +7466,9 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" @@ -7536,10 +7538,10 @@ "pkg:golang/github.com/pion/turn/v4@v4.0.2?type=module", "pkg:golang/github.com/pion/webrtc/v4@v4.1.2?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/quic-go/webtransport-go@v0.10.0?type=module", @@ -7550,12 +7552,12 @@ "pkg:golang/go.uber.org/fx@v1.24.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", @@ -7580,9 +7582,9 @@ "pkg:golang/github.com/multiformats/go-multihash@v0.2.3?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] @@ -7618,9 +7620,9 @@ "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" @@ -7636,7 +7638,7 @@ "pkg:golang/go.uber.org/atomic@v1.11.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -7654,8 +7656,8 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -7665,7 +7667,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -7684,28 +7686,28 @@ "dependsOn": [ "pkg:golang/github.com/mikioh/tcpinfo@v0.0.0-20190314235526-30a79bb1804b?type=module", "pkg:golang/github.com/mikioh/tcpopt@v0.0.0-20190314235656-172688c1accc?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module" ] }, { "ref": "pkg:golang/github.com/mattn/go-colorable@v0.1.15?type=module", "dependsOn": [ "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/mattn/go-isatty@v0.0.22?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { "ref": "pkg:golang/github.com/miekg/dns@v1.1.72?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -7718,7 +7720,7 @@ "ref": "pkg:golang/github.com/minio/sha256-simd@v1.0.1?type=module", "dependsOn": [ "pkg:golang/github.com/klauspost/cpuid/v2@v2.3.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -7767,9 +7769,9 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] @@ -7789,10 +7791,10 @@ "pkg:golang/github.com/multiformats/go-multihash@v0.2.3?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] }, @@ -7821,8 +7823,8 @@ "pkg:golang/github.com/mr-tron/base58@v1.3.0?type=module", "pkg:golang/github.com/multiformats/go-varint@v0.1.0?type=module", "pkg:golang/github.com/spaolacci/murmur3@v1.1.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/lukechampine.com/blake3@v1.4.1?type=module" ] }, @@ -7922,7 +7924,7 @@ "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -7959,8 +7961,8 @@ "pkg:golang/github.com/pion/transport/v4@v4.0.1?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -7979,9 +7981,9 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8013,8 +8015,8 @@ "dependsOn": [ "pkg:golang/github.com/pion/logging@v0.2.4?type=module", "pkg:golang/github.com/pion/transport/v3@v3.0.7?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -8072,7 +8074,7 @@ "pkg:golang/github.com/pion/transport/v3@v3.0.7?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8086,8 +8088,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8099,8 +8101,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8112,8 +8114,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -8130,8 +8132,8 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8158,16 +8160,16 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/github.com/wlynxg/anet@v0.0.5?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, { "ref": "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -8177,28 +8179,30 @@ "ref": "pkg:golang/github.com/polydawn/refmt@v0.89.1-0.20221221234430-40501e09de1f?type=module" }, { - "ref": "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "ref": "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "dependsOn": [ "pkg:golang/github.com/beorn7/perks@v1.0.1?type=module", "pkg:golang/github.com/cespare/xxhash/v2@v2.3.0?type=module", + "pkg:golang/github.com/golang-jwt/jwt/v5@v5.3.1?type=module", "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", + "pkg:golang/github.com/google/uuid@v1.6.0?type=module", "pkg:golang/github.com/jpillora/backoff@v1.0.0?type=module", "pkg:golang/github.com/json-iterator/go@v1.1.12?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/kylelemons/godebug@v1.1.0?type=module", "pkg:golang/github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd?type=module", "pkg:golang/github.com/modern-go/reflect2@v1.0.3-0.20250322232337-35a7c28c31ee?type=module", "pkg:golang/github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822?type=module", "pkg:golang/github.com/mwitkow/go-conntrack@v0.0.0-20190716064945-2f068394615f?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" ] }, @@ -8206,9 +8210,9 @@ "ref": "pkg:golang/github.com/prometheus/client_golang/exp@v0.0.0-20260325093428-d8591d0db856?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" ] @@ -8220,7 +8224,7 @@ ] }, { - "ref": "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "ref": "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "dependsOn": [ "pkg:golang/github.com/alecthomas/units@v0.0.0-20240927000941-0f3dac36c52b?type=module", "pkg:golang/github.com/beorn7/perks@v1.0.1?type=module", @@ -8233,15 +8237,15 @@ "pkg:golang/github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822?type=module", "pkg:golang/github.com/mwitkow/go-conntrack@v0.0.0-20190716064945-2f068394615f?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] @@ -8250,11 +8254,11 @@ "ref": "pkg:golang/github.com/prometheus/otlptranslator@v1.0.0?type=module" }, { - "ref": "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "ref": "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { @@ -8307,7 +8311,7 @@ "pkg:golang/github.com/hashicorp/golang-lru@v1.0.2?type=module", "pkg:golang/github.com/jpillora/backoff@v1.0.0?type=module", "pkg:golang/github.com/json-iterator/go@v1.1.12?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/knadh/koanf/maps@v0.1.2?type=module", "pkg:golang/github.com/knadh/koanf/providers/confmap@v1.0.0?type=module", "pkg:golang/github.com/knadh/koanf/v2@v2.3.3?type=module", @@ -8329,12 +8333,12 @@ "pkg:golang/github.com/pbnjay/memory@v0.0.0-20210728143218-7b4eea64cf58?type=module", "pkg:golang/github.com/pkg/browser@v0.0.0-20240102092130-5ac0b6a4141c?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_golang/exp@v0.0.0-20260325093428-d8591d0db856?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", "pkg:golang/github.com/prometheus/otlptranslator@v1.0.0?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/prometheus/sigv4@v0.4.1?type=module", "pkg:golang/github.com/puzpuzpuz/xsync/v4@v4.4.0?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", @@ -8360,14 +8364,14 @@ "pkg:golang/go.uber.org/zap@v1.28.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/api@v0.272.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", @@ -8413,16 +8417,16 @@ "pkg:golang/github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822?type=module", "pkg:golang/github.com/mwitkow/go-conntrack@v0.0.0-20190716064945-2f068394615f?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/github.com/prometheus/client_golang@v1.23.2?type=module", + "pkg:golang/github.com/prometheus/client_golang@v1.24.1?type=module", "pkg:golang/github.com/prometheus/client_model@v0.6.2?type=module", - "pkg:golang/github.com/prometheus/common@v0.67.5?type=module", - "pkg:golang/github.com/prometheus/procfs@v0.19.2?type=module", + "pkg:golang/github.com/prometheus/common@v0.70.1?type=module", + "pkg:golang/github.com/prometheus/procfs@v0.21.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v2@v2.4.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" @@ -8437,7 +8441,7 @@ "pkg:golang/github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8448,11 +8452,11 @@ "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8465,10 +8469,10 @@ "pkg:golang/github.com/quic-go/qpack@v0.6.0?type=module", "pkg:golang/github.com/quic-go/quic-go@v0.59.1?type=module", "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8496,12 +8500,12 @@ "ref": "pkg:golang/github.com/valyala/fasthttp@v1.72.0?type=module", "dependsOn": [ "pkg:golang/github.com/andybalholm/brotli@v1.2.2?type=module", - "pkg:golang/github.com/klauspost/compress@v1.19.0?type=module", + "pkg:golang/github.com/klauspost/compress@v1.19.1?type=module", "pkg:golang/github.com/valyala/bytebufferpool@v1.0.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -8654,9 +8658,9 @@ "pkg:golang/go.opentelemetry.io/collector/featuregate@v1.54.0?type=module", "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", @@ -8715,7 +8719,7 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8734,7 +8738,7 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8808,7 +8812,7 @@ "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.uber.org/multierr@v1.11.0?type=module", "pkg:golang/go.uber.org/zap@v1.28.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module" ] }, @@ -8849,28 +8853,28 @@ "ref": "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module" }, { - "ref": "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", + "ref": "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { "ref": "pkg:golang/golang.org/x/exp@v0.0.0-20260508232706-74f9aab9d74a?type=module", "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module" ] }, { - "ref": "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "ref": "pkg:golang/golang.org/x/net@v0.57.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -8880,21 +8884,21 @@ ] }, { - "ref": "pkg:golang/golang.org/x/sync@v0.21.0?type=module" + "ref": "pkg:golang/golang.org/x/sync@v0.22.0?type=module" }, { - "ref": "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "ref": "pkg:golang/golang.org/x/sys@v0.47.0?type=module" }, { - "ref": "pkg:golang/golang.org/x/term@v0.44.0?type=module", + "ref": "pkg:golang/golang.org/x/term@v0.45.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sys@v0.46.0?type=module" + "pkg:golang/golang.org/x/sys@v0.47.0?type=module" ] }, { - "ref": "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "ref": "pkg:golang/golang.org/x/text@v0.40.0?type=module", "dependsOn": [ - "pkg:golang/golang.org/x/sync@v0.21.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module" ] }, { @@ -8905,8 +8909,8 @@ "dependsOn": [ "pkg:golang/github.com/google/go-cmp@v0.7.0?type=module", "pkg:golang/github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module" + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module" ] }, { @@ -8929,12 +8933,12 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/crypto@v0.53.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/crypto@v0.54.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/grpc@v1.82.1?type=module", @@ -8960,11 +8964,11 @@ "pkg:golang/go.opentelemetry.io/otel@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/metric@v1.43.0?type=module", "pkg:golang/go.opentelemetry.io/otel/trace@v1.43.0?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/gonum.org/v1/gonum@v0.17.0?type=module", "pkg:golang/google.golang.org/genproto/googleapis/rpc@v0.0.0-20260523011958-0a33c5d7ca68?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module" @@ -9001,8 +9005,8 @@ "pkg:golang/github.com/x448/float16@v0.8.4?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/inf.v0@v0.9.1?type=module", @@ -9035,11 +9039,11 @@ "pkg:golang/go.uber.org/goleak@v1.3.0?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", "pkg:golang/golang.org/x/oauth2@v0.36.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/term@v0.44.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/term@v0.45.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/golang.org/x/time@v0.15.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/inf.v0@v0.9.1?type=module", @@ -9075,10 +9079,10 @@ "pkg:golang/github.com/stretchr/testify@v1.11.1?type=module", "pkg:golang/go.yaml.in/yaml/v2@v2.4.4?type=module", "pkg:golang/go.yaml.in/yaml/v3@v3.0.4?type=module", - "pkg:golang/golang.org/x/net@v0.56.0?type=module", - "pkg:golang/golang.org/x/sync@v0.21.0?type=module", - "pkg:golang/golang.org/x/sys@v0.46.0?type=module", - "pkg:golang/golang.org/x/text@v0.39.0?type=module", + "pkg:golang/golang.org/x/net@v0.57.0?type=module", + "pkg:golang/golang.org/x/sync@v0.22.0?type=module", + "pkg:golang/golang.org/x/sys@v0.47.0?type=module", + "pkg:golang/golang.org/x/text@v0.40.0?type=module", "pkg:golang/google.golang.org/protobuf@v1.36.11?type=module", "pkg:golang/gopkg.in/yaml.v3@v3.0.1?type=module", "pkg:golang/k8s.io/klog/v2@v2.140.0?type=module", diff --git a/docs/versions/v1.1.1/02_configuration.md b/docs/versions/v1.1.1/02_configuration.md index 73e1951..83bd682 100644 --- a/docs/versions/v1.1.1/02_configuration.md +++ b/docs/versions/v1.1.1/02_configuration.md @@ -118,6 +118,16 @@ The gateway receives automatic config updates from bootstrap. | `direct_cl_peers` | `OPT_DIRECT_CL_PEERS` | *(empty)* | CL node multiaddrs for auto-reconnect; when set, only listed peer IDs may stay connected | | `log_level` | `OPT_LOG_LEVEL` | debug | `debug` / `info` | | `remote_push_enable` | `OPT_REMOTE_PUSH_ENABLE` | false | Optional Loki/Mimir push (requires `telemetry_enable: true`) | +| `stream_enable` | `OPT_STREAM_ENABLE` | false | Enable the consumer block stream (WebSocket + gRPC) | +| `stream_addr` | `OPT_STREAM_ADDR` | 0.0.0.0:9600 | WebSocket listener (own port, off `/metrics`) | +| `stream_grpc_addr` | `OPT_STREAM_GRPC_ADDR` | 0.0.0.0:9601 | gRPC listener | +| `stream_require_auth` | `OPT_STREAM_REQUIRE_AUTH` | true | Verify consumer JWTs; `false` only on a loopback bind | +| `stream_max_conns` | `OPT_STREAM_MAX_CONNS` | 256 | Global connection cap | +| `stream_max_conns_per_sub` | `OPT_STREAM_MAX_CONNS_PER_SUB` | 8 | Per-consumer-key connection cap | +| `stream_buffer_size` | `OPT_STREAM_BUFFER_SIZE` | 64 | Per-connection ring buffer (drop-on-overflow) | + +See [Consumer Block Stream](06_block_stream.md) for minting consumer tokens and +opening a stream. ## Validation diff --git a/docs/versions/v1.1.1/06_block_stream.md b/docs/versions/v1.1.1/06_block_stream.md new file mode 100644 index 0000000..3cf16de --- /dev/null +++ b/docs/versions/v1.1.1/06_block_stream.md @@ -0,0 +1,218 @@ +# Consumer Block Stream + +The consumer block stream lets a gateway expose the beacon blocks it already +decodes to your own downstream consumers, over **WebSocket** or **gRPC**. It is +read-only, opt-in, and off by default. Each consumer authenticates with its own +short-lived token, separate from the gateway's API key. + +![Consumer block-stream flow: mint an osc_ key, exchange it for a stream JWT, then connect over WebSocket or gRPC](/block_stream.png) + +## Enable it + +Add the stream fields to `config/app_conf.yml` and restart. Only `stream_enable` +is required; the rest have the defaults shown. + +```yaml +stream_enable: true # default: false +stream_addr: 0.0.0.0:9600 # WebSocket listener (own port, off /metrics) +stream_grpc_addr: 0.0.0.0:9601 # gRPC listener +stream_require_auth: true # verify consumer JWTs; false = loopback dev only +stream_max_conns: 256 # global connection cap +stream_max_conns_per_sub: 8 # per-consumer-key connection cap +stream_buffer_size: 64 # per-connection ring buffer (drop-on-overflow) +``` + +The gateway verifies consumer tokens against the JWKS at your `remote_auth_url`, +so it must point at the same auth service that mints the stream tokens. + +> **Exposure.** The stream listeners are separate from the `/metrics` and +> `/health` port. Any non-loopback bind must sit behind TLS (native or a +> terminating proxy); disabling auth is allowed only on a loopback bind. + +## Step 1 — mint a stream key (console) + +Open [dev-console.getoptimum.io](https://dev-console.getoptimum.io) and select +the operator you are minting for. **Check the network picker (top right) first** — +the key is minted for the selected chain. Open the API keys section (labelled +**Manage Gateways** for a customer-role login), choose the **Stream consumers** +tab, create a key, name it after the downstream consumer, and copy the value. + +* The raw `osc_` key is shown **once** and cannot be retrieved again — copy it + before dismissing the dialog. +* Mint **one key per consumer**. Revocation and the per-connection cap are both + per key, so a shared key cannot be cut off individually. + +## Step 2 — exchange the key for a JWT + +The consumer swaps its `osc_` key for a JWT. The key is the request body, so +there is no `Authorization` header on this call: + +```bash +curl -X POST https://dev-auth.getoptimum.io/api/v1/stream/token \ + -H "content-type: application/json" \ + -d '{"stream_key":"osc_test_..."}' +``` + +```json +{ + "access_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6...", + "token_type": "Bearer", + "expires_in": 3600, + "operator_id": "1" +} +``` + +The `access_token` is the stream JWT. Decoded, its claims look like this — the +gateway checks `aud=stream`, and caps and revocation key off `sub` +(`as_`): + +```json +{ + "aud": "stream", + "iss": "https://dev-auth.getoptimum.io", + "sub": "as_6772872d87e3e0e1f6a6c97630413fa9", + "operator_id": "1", + "chain_id": "560048", + "cluster_ids": ["optimum_hoodi_v0_2"], + "iat": 1786709057, + "exp": 1786712657 +} +``` + +Tokens are short-lived (default `3600s`, ceiling `21600s`). A real consumer +re-runs this call to refresh before expiry — the same way an OAuth client renews +a token. The gateway verifies the signature locally against the published JWKS +and never calls back to auth, so revoking a key stops **new** tokens immediately +but an already-issued token keeps working until it expires. Keep the lifetime +short so a cutoff takes effect quickly. + +## Step 3 — open a stream + +There are two payload modes: + +* **metadata** (default) — the decoded block event only: slot, proposer, roots, + size, source, timing. No block bytes. +* **raw** — the same event **plus** the verbatim `ssz_snappy` block bytes as a + base64 `raw` field. + +Set the token once, then connect. + +```bash +TOKEN=$(curl -s -X POST https://dev-auth.getoptimum.io/api/v1/stream/token \ + -H "content-type: application/json" \ + -d '{"stream_key":"osc_test_..."}' | jq -r .access_token) +``` + +### WebSocket + +```bash +wscat -H "Authorization: Bearer $TOKEN" \ + -c "ws://GATEWAY_HOST:9600/api/v1/stream/blocks?mode=metadata" +``` + +Each block arrives as one JSON frame (metadata mode): + +```json +{ + "type": "block", + "slot": 3706300, + "proposer_index": 535778, + "parent_root": "saTBS/MRxOtn3FMP5vZGLhMjcgDYoJo5ISec1nGpt8M=", + "state_root": "HgD2msizU7N6A6663xIsK5LiauwtPVGTY4Gnbc9mfIg=", + "block_size_bytes": 17365, + "topic": "/eth2/c6ecb76c/beacon_block/ssz_snappy", + "source": "mump2p", + "received_at_ms": 1786689003070, + "gateway_id": "ag_...", + "fork_digest": "c6ecb76c", + "stale": false +} +``` + +For **raw** mode, use `mode=raw`; the frame additionally carries the block bytes: + +```json +{ "type": "block", "slot": 3706300, "...": "...", "raw": "8gAA...base64 ssz_snappy..." } +``` + +Browsers cannot set request headers, so pass the token via the +`Sec-WebSocket-Protocol` header instead — offer two values, the marker +`optimum.stream.v1` and `bearer.`. The server negotiates only the marker +and never echoes the token. + +### gRPC + +```bash +grpcurl -plaintext \ + -import-path proto \ + -proto getoptimum/optimum_gateway/service/stream/v1/stream.proto \ + -H "authorization: Bearer $TOKEN" \ + -d '{"mode":"metadata"}' \ + GATEWAY_HOST:9601 \ + getoptimum.optimum_gateway.service.stream.v1.BlockStreamService/Subscribe +``` + +Each block is a `block` frame: + +```json +{ + "block": { + "slot": "3706300", + "proposerIndex": "535778", + "parentRoot": "saTBS/MRxOtn3FMP5vZGLhMjcgDYoJo5ISec1nGpt8M=", + "stateRoot": "HgD2msizU7N6A6663xIsK5LiauwtPVGTY4Gnbc9mfIg=", + "blockSizeBytes": "17365", + "topic": "/eth2/c6ecb76c/beacon_block/ssz_snappy", + "source": "mump2p", + "receivedAtMs": "1786689003070", + "gatewayId": "ag_...", + "forkDigest": "c6ecb76c" + } +} +``` + +The stream is open-ended, so stop it yourself: Ctrl-C for WebSocket, or +`-max-time ` for gRPC. A trailing gRPC `DeadlineExceeded` is your own +timeout expiring, not a server error. + +### Lag signal + +Each connection has a bounded buffer. If a consumer reads too slowly and the +buffer overflows, the gateway drops events and sends a lag frame with the +cumulative dropped count, then resumes. A slow consumer never stalls the gateway. + +```json +{ "type": "lagged", "dropped": 12 } +``` + +Over gRPC the same signal is a `lagged` frame: `{ "lagged": { "dropped": "12" } }`. + +## Errors + +| Condition | WebSocket | gRPC | +| --- | --- | --- | +| Missing / bad token | `401 Unauthorized` | `Unauthenticated` | +| Invalid `mode` | `400 Bad Request` | `InvalidArgument` | +| Connection cap reached | `503 Service Unavailable` | `ResourceExhausted` | +| Unknown / suspended / revoked key (at mint) | `401 invalid_key` | `401 invalid_key` | + +## Metrics + +The gateway exports these on the telemetry port (`telemetry_port`, default +`48123`): + +| Metric | Type | Meaning | +| --- | --- | --- | +| `mump2p_stream_connections` | gauge | currently open consumer connections | +| `mump2p_stream_events_sent_total` | counter | events written to consumers | +| `mump2p_stream_events_dropped_total` | counter | events dropped on buffer overflow (lag) | +| `mump2p_stream_auth_failures_total` | counter | connections rejected for bad/missing tokens | + +```bash +curl -s http://GATEWAY_HOST:48123/metrics | grep mump2p_stream_ +``` + +## Availability + +The stream token endpoint is available on **dev** only for now +(`https://dev-auth.getoptimum.io`). The production endpoint is not live yet. diff --git a/go.mod b/go.mod index da38d76..f06f11d 100644 --- a/go.mod +++ b/go.mod @@ -5,17 +5,19 @@ go 1.26.6 tool ( github.com/bufbuild/buf/cmd/buf github.com/golangci/golangci-lint/v2/cmd/golangci-lint + google.golang.org/grpc/cmd/protoc-gen-go-grpc google.golang.org/protobuf/cmd/protoc-gen-go ) require ( github.com/ferranbt/fastssz v1.0.1-0.20251203093649-0b1f38e43198 - github.com/getoptimum/optimum-common v0.1.2 + github.com/getoptimum/optimum-common v0.1.4-0.20260811133125-9ee6a6cb5cf3 github.com/getoptimum/optimum-p2p v0.0.1-rc12.2 github.com/gofiber/fiber/v3 v3.4.0 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/golang/snappy v1.0.0 github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 github.com/ipfs/go-log v1.0.5 github.com/libp2p/go-libp2p v0.48.0 github.com/libp2p/go-libp2p-kad-dht v0.33.1 @@ -25,11 +27,12 @@ require ( github.com/libp2p/go-mplex v0.7.0 github.com/montanaflynn/stats v0.7.1 github.com/multiformats/go-multiaddr v0.16.1 - github.com/prometheus/client_golang v1.23.2 + github.com/prometheus/client_golang v1.24.1 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.67.5 + github.com/prometheus/common v0.70.1 github.com/prometheus/prometheus v0.311.3 github.com/stretchr/testify v1.11.1 + google.golang.org/grpc v1.82.1 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v2 v2.4.0 ) @@ -79,8 +82,8 @@ require ( github.com/ClickHouse/clickhouse-go-linter v1.2.0 // indirect github.com/Djarvur/go-err113 v0.1.1 // indirect github.com/Masterminds/semver/v3 v3.5.0 // indirect - github.com/MicahParks/jwkset v0.11.0 // indirect - github.com/MicahParks/keyfunc/v3 v3.8.0 // indirect + github.com/MicahParks/jwkset v0.11.1 // indirect + github.com/MicahParks/keyfunc/v3 v3.8.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/MirrexOne/unqueryvet v1.5.4 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect @@ -206,7 +209,6 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.18.0 // indirect github.com/gordonklaus/ineffassign v0.2.0 // indirect - github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.5.0 // indirect github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect @@ -235,7 +237,7 @@ require ( github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect github.com/kisielk/errcheck v1.10.0 // indirect github.com/kkHAIKE/contextcheck v1.1.6 // indirect - github.com/klauspost/compress v1.19.0 // indirect + github.com/klauspost/compress v1.19.1 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/knadh/koanf/maps v0.1.2 // indirect @@ -339,7 +341,7 @@ require ( github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect github.com/prometheus/client_golang/exp v0.0.0-20260325093428-d8591d0db856 // indirect github.com/prometheus/otlptranslator v1.0.0 // indirect - github.com/prometheus/procfs v0.19.2 // indirect + github.com/prometheus/procfs v0.21.1 // indirect github.com/prometheus/sigv4 v0.4.1 // indirect github.com/prysmaticlabs/gohashtree v0.0.5-beta // indirect github.com/puzpuzpuz/xsync/v4 v4.4.0 // indirect @@ -436,24 +438,24 @@ require ( go.uber.org/zap v1.28.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.53.0 // indirect + golang.org/x/crypto v0.54.0 // indirect golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a // indirect golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect golang.org/x/mod v0.37.0 // indirect - golang.org/x/net v0.56.0 // indirect + golang.org/x/net v0.57.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57 // indirect - golang.org/x/term v0.44.0 // indirect - golang.org/x/text v0.39.0 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/tools v0.47.0 // indirect gonum.org/v1/gonum v0.17.0 // indirect google.golang.org/api v0.272.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect - google.golang.org/grpc v1.82.1 // indirect + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.7.0 // indirect diff --git a/go.sum b/go.sum index 72f088f..24361fc 100644 --- a/go.sum +++ b/go.sum @@ -100,10 +100,10 @@ github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/MicahParks/jwkset v0.11.0 h1:yc0zG+jCvZpWgFDFmvs8/8jqqVBG9oyIbmBtmjOhoyQ= -github.com/MicahParks/jwkset v0.11.0/go.mod h1:U2oRhRaLgDCLjtpGL2GseNKGmZtLs/3O7p+OZaL5vo0= -github.com/MicahParks/keyfunc/v3 v3.8.0 h1:Hx2dgIjAXGk9slakM6rV9BOeaWDPEXXZ4Us8guNBfds= -github.com/MicahParks/keyfunc/v3 v3.8.0/go.mod h1:z66bkCviwqfg2YUp+Jcc/xRE9IXLcMq6DrgV/+Htru0= +github.com/MicahParks/jwkset v0.11.1 h1:Gr+6JeYoJ7twqyBGf8MXxj2NSCKPoX8RFMtey3GY9Nw= +github.com/MicahParks/jwkset v0.11.1/go.mod h1:U2oRhRaLgDCLjtpGL2GseNKGmZtLs/3O7p+OZaL5vo0= +github.com/MicahParks/keyfunc/v3 v3.8.1 h1:VR3jlEs2wz1xGjvUUwUHeoB+eJ6gUnBrpnIByRrtj6g= +github.com/MicahParks/keyfunc/v3 v3.8.1/go.mod h1:LcorJ0sz2tZGvgZqIfaeyLkJmM+kxIfRDu8dFY0TAas= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ= @@ -327,8 +327,8 @@ github.com/fxamacker/cbor/v2 v2.9.2 h1:X4Ksno9+x3cz0TZv69ec1hxP/+tymuR8PXQJyDwfh github.com/fxamacker/cbor/v2 v2.9.2/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/getoptimum/optimum-common v0.1.2 h1:xTg+VMA9LqjLOr+XPHXmGZKxR+7P5sHO9/yBN+nZlfM= -github.com/getoptimum/optimum-common v0.1.2/go.mod h1:jqAL7Q0BsiVb0H6E4yeLEazZ3vvAWhfeHkqSn0pkY+Q= +github.com/getoptimum/optimum-common v0.1.4-0.20260811133125-9ee6a6cb5cf3 h1:Tk16YNMegcezkthC6uvie6EEDDtp0BdB5zUAZb2+DWI= +github.com/getoptimum/optimum-common v0.1.4-0.20260811133125-9ee6a6cb5cf3/go.mod h1:gOX2MYQQ7zqciRiybcVqIoCsV/tvw8cJdQfbmj4FSxc= github.com/getoptimum/optimum-p2p v0.0.1-rc12.2 h1:ujFmWPT1T0gwa5GOQk7MtwbDl94dM7eOcywk8TVdZTY= github.com/getoptimum/optimum-p2p v0.0.1-rc12.2/go.mod h1:vWLCLE139fmBTj9F7VVrYfIFHz85nK/Ao8cXxH4kO8A= github.com/getoptimum/rlnc v0.0.1-rc1.0.20260326154748-8ead5e1b16e5 h1:RYJV15OII3fJCwxxfD6GxRk6xL67aY1QRrGjiUZi9dw= @@ -591,8 +591,8 @@ github.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= -github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= -github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= +github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= @@ -859,18 +859,18 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= +github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= github.com/prometheus/client_golang/exp v0.0.0-20260325093428-d8591d0db856 h1:1Y6bmpZb8peQCy1IpctnAhIFuyhrdtMaDnETChhSNns= github.com/prometheus/client_golang/exp v0.0.0-20260325093428-d8591d0db856/go.mod h1:Vf0QcmVhGqpjLxZOaWrFSep86vchQtJmbztFaMM4f6Q= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= +github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= -github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= -github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= +github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/prometheus/prometheus v0.311.3 h1:3IrVxQv6v5i/ZCGi6OrYeBhtCwaPTn6Z3DYruXoYm3M= github.com/prometheus/prometheus v0.311.3/go.mod h1:gjsCxTKtHO1Q8T9333u1s+lUR1OjPyM7ruuGH8RvVyo= github.com/prometheus/sigv4 v0.4.1 h1:EIc3j+8NBea9u1iV6O5ZAN8uvPq2xOIUPcqCTivHuXs= @@ -1158,8 +1158,8 @@ golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= +golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a h1:+3jdDGGB8NGb1Zktc737jlt3/A5f6UlwSzmvqUuufxw= golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a/go.mod h1:d2fgXJLVs4dYDHUk5lwMIfzRzSrWCfGZb0ZqeLa/Vcw= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -1189,8 +1189,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1200,8 +1200,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1217,23 +1217,23 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57 h1:nwGZBCt+FnXUrGsj5vjzAsEmkcaFvd82BbOjECiFYZc= golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57/go.mod h1:3AWMyWHS+caVoiEXpiq6+tzKA40J4vQT3MYr80ZtQpc= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= -golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= -golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1275,6 +1275,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 h1:rgSNvqscFZ1JgV/4wH5GOsZFSFkR2Eua9As3KIr2LlM= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2/go.mod h1:iMEtFwDlAhjDU9L5mY6U1XLwlIId/G3h+QcBHDIvrJ8= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/config/config.go b/pkg/config/config.go index 1a9fb36..9ca05f4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "os" + "strconv" "strings" "sync/atomic" "time" @@ -90,6 +91,16 @@ type AppConfig struct { // gateway logs a loud startup warning when off. EnableAuth bool `yaml:"enable_auth" env:"OPT_ENABLE_AUTH" default:"true"` + // Consumer block-stream (ADR-0011): opt-in read-only fan-out of decoded + // beacon blocks over WebSocket/gRPC, off by default. + StreamEnable bool `yaml:"stream_enable" env:"OPT_STREAM_ENABLE" default:"false"` + StreamAddr string `yaml:"stream_addr" env:"OPT_STREAM_ADDR" default:"0.0.0.0:9600"` + StreamGRPCAddr string `yaml:"stream_grpc_addr" env:"OPT_STREAM_GRPC_ADDR" default:"0.0.0.0:9601"` + StreamRequireAuth bool `yaml:"stream_require_auth" env:"OPT_STREAM_REQUIRE_AUTH" default:"true"` + StreamMaxConns int `yaml:"stream_max_conns" env:"OPT_STREAM_MAX_CONNS" default:"256"` + StreamMaxConnsPerSub int `yaml:"stream_max_conns_per_sub" env:"OPT_STREAM_MAX_CONNS_PER_SUB" default:"8"` + StreamBufferSize int `yaml:"stream_buffer_size" env:"OPT_STREAM_BUFFER_SIZE" default:"64"` + RemotePushEnable bool `yaml:"remote_push_enable" env:"OPT_REMOTE_PUSH_ENABLE" default:"false"` RemotePushMimirURL string `yaml:"remote_push_mimir_url" env:"OPT_REMOTE_PUSH_MIMIR_URL" default:"https://v2-mimir.getoptimum.io"` RemotePushLokiURL string `yaml:"remote_push_loki_url" env:"OPT_REMOTE_PUSH_LOKI_URL" default:"https://v2-loki.getoptimum.io"` @@ -245,6 +256,27 @@ func (c *AppConfig) Validate() error { return fmt.Errorf("OPT_GATEWAY_CLUSTER_ID is required") } + if c.StreamEnable { + if err := validateStreamListener("stream_addr", c.StreamAddr, c.StreamRequireAuth); err != nil { + return err + } + if err := validateStreamListener("stream_grpc_addr", c.StreamGRPCAddr, c.StreamRequireAuth); err != nil { + return err + } + if strings.TrimSpace(c.StreamAddr) == strings.TrimSpace(c.StreamGRPCAddr) { + return fmt.Errorf("stream_addr and stream_grpc_addr must differ, got %q", c.StreamAddr) + } + if c.StreamMaxConns <= 0 { + return fmt.Errorf("stream_max_conns must be > 0") + } + if c.StreamMaxConnsPerSub <= 0 { + return fmt.Errorf("stream_max_conns_per_sub must be > 0") + } + if c.StreamBufferSize <= 0 { + return fmt.Errorf("stream_buffer_size must be > 0") + } + } + if c.AggregationIntervalMs < 0 { return fmt.Errorf("aggregation_interval_ms must be non-negative") } @@ -261,6 +293,34 @@ func (c *AppConfig) Validate() error { return nil } +// validateStreamListener enforces the ADR-0011 exposure rule: auth may be +// disabled only on a loopback bind. +func validateStreamListener(field, addr string, requireAuth bool) error { + host, port, err := net.SplitHostPort(strings.TrimSpace(addr)) + if err != nil { + return fmt.Errorf("invalid %s %q: %w", field, addr, err) + } + if p, perr := strconv.Atoi(port); perr != nil || p <= 0 || p > 65535 { + return fmt.Errorf("invalid %s %q: port must be between 1 and 65535", field, addr) + } + if !requireAuth && !isLoopbackHost(host) { + return fmt.Errorf("%s=%q requires stream_require_auth=true (auth may be disabled only on a loopback bind)", field, addr) + } + return nil +} + +// isLoopbackHost treats an empty host (binds all interfaces) as non-loopback. +func isLoopbackHost(host string) bool { + switch host { + case "": + return false + case "localhost": + return true + } + ip := net.ParseIP(host) + return ip != nil && ip.IsLoopback() +} + func (c *AppConfig) PropagationEnabled() bool { return c.propagationEnabled.Load() } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 5dab1b5..30e5200 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -269,3 +269,44 @@ gateway_id: local-dockerized require.Equal(t, "local-dockerized", cfg.GatewayID) require.Equal(t, "optimum_hoodi_v0_1", cfg.GatewayClusterID) } + +// The stream is off by default, and when enabled auth may be disabled only on +// a loopback bind (ADR-0011 exposure rule). +func TestStreamValidation(t *testing.T) { + base := func(t *testing.T) { + t.Helper() + t.Setenv("OPT_IDENTITY_LIBP2P_DIR", "./libid") + t.Setenv("OPT_IDENTITY_MUMP2P_DIR", "./mump2pid") + t.Setenv("OPT_AGENT_LIB_P2P_PORT", "5000") + t.Setenv("OPT_AGENT_MUMP2P_PORT", "5001") + t.Setenv("OPT_GATEWAY_CLUSTER_ID", "gw-cluster") + t.Setenv("OPT_TELEMETRY_PORT", "8888") + } + + t.Run("off by default", func(t *testing.T) { + base(t) + cfg, err := config.LoadConfig("") + require.NoError(t, err) + require.False(t, cfg.StreamEnable) + require.True(t, cfg.StreamRequireAuth) + }) + + t.Run("auth off on loopback allowed", func(t *testing.T) { + base(t) + t.Setenv("OPT_STREAM_ENABLE", "true") + t.Setenv("OPT_STREAM_REQUIRE_AUTH", "false") + t.Setenv("OPT_STREAM_ADDR", "127.0.0.1:9600") + t.Setenv("OPT_STREAM_GRPC_ADDR", "localhost:9601") + _, err := config.LoadConfig("") + require.NoError(t, err) + }) + + t.Run("auth off on exposed bind rejected", func(t *testing.T) { + base(t) + t.Setenv("OPT_STREAM_ENABLE", "true") + t.Setenv("OPT_STREAM_REQUIRE_AUTH", "false") + t.Setenv("OPT_STREAM_ADDR", "0.0.0.0:9600") + _, err := config.LoadConfig("") + require.ErrorContains(t, err, "stream_require_auth=true") + }) +} diff --git a/pkg/service/auth_token/manager.go b/pkg/service/auth_token/manager.go index 57cc184..33ada8e 100644 --- a/pkg/service/auth_token/manager.go +++ b/pkg/service/auth_token/manager.go @@ -279,6 +279,19 @@ func (m *Service) VerifyToken(rawJWT string) (*jwks_verifier.Claims, error) { return claims, nil } +// VerifyStreamToken checks a consumer block-stream JWT (aud=stream). +// No chain gate — stream authorization is audience-only in v1 (ADR-0011). +func (m *Service) VerifyStreamToken(rawJWT string) (*jwks_verifier.Claims, error) { + if !m.IsEnabled() { + return nil, nil + } + claims, err := m.verifier.Verify(rawJWT, jwks_verifier.AudStream) + if err != nil { + return nil, fmt.Errorf("auth_token: verify stream JWT: %w", err) + } + return claims, nil +} + // mint hits /auth/token, verifies the response locally, and atomically // swaps the cached token + claims + indexes. func (m *Service) mint(ctx context.Context) (string, error) { diff --git a/pkg/service/gossipsub-gateway/beacon_block_measures.go b/pkg/service/gossipsub-gateway/beacon_block_measures.go index 60b08fa..cd9d4c9 100644 --- a/pkg/service/gossipsub-gateway/beacon_block_measures.go +++ b/pkg/service/gossipsub-gateway/beacon_block_measures.go @@ -7,6 +7,7 @@ import ( "github.com/getoptimum/optimum-gateway/pkg/entities" chainstate "github.com/getoptimum/optimum-gateway/pkg/protocol/chain_state" "github.com/getoptimum/optimum-gateway/pkg/protocol/consensus" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" "github.com/getoptimum/optimum-gateway/pkg/service/telemetry" "github.com/getoptimum/optimum-gateway/pkg/utils" ) @@ -47,7 +48,28 @@ func (s *Service) processBeaconBlockArrival( // stale blocks are still measured above but not forwarded, to avoid polluting the mesh currentSlot := chainstate.CurrentSlot(time.Now()) - if diff := utils.DiffUint64(blockDecoded.Header.Slot, currentSlot); diff > staleSlotThreshold { + diff := utils.DiffUint64(blockDecoded.Header.Slot, currentSlot) + stale := diff > staleSlotThreshold + + // Stream every observation, stale flagged rather than dropped (ADR-0011). + if s.streamHub != nil { + s.streamHub.Emit(&streamhub.BlockEvent{ + Slot: blockDecoded.Header.Slot, + ProposerIndex: blockDecoded.Header.ProposerIndex, + ParentRoot: blockDecoded.Header.ParentRoot, + StateRoot: blockDecoded.Header.StateRoot, + BlockSizeBytes: uint64(len(msg)), + Topic: topic, + Source: source, + ReceivedAtMs: recvAt, + GatewayID: s.cfg.GatewayID, + ForkDigest: s.srvForkMgr.ActiveDigest(), + Stale: stale, + Raw: msg, + }) + } + + if stale { l.Info("stale_data, skipping publish of beacon_block", logger.WithUint64("current_slot", currentSlot), logger.WithUint64("diff", diff), diff --git a/pkg/service/gossipsub-gateway/service.go b/pkg/service/gossipsub-gateway/service.go index efaaa9c..c89317d 100644 --- a/pkg/service/gossipsub-gateway/service.go +++ b/pkg/service/gossipsub-gateway/service.go @@ -24,6 +24,7 @@ import ( "github.com/getoptimum/optimum-gateway/pkg/service/bootstrapper" "github.com/getoptimum/optimum-gateway/pkg/service/message_router" "github.com/getoptimum/optimum-gateway/pkg/service/mum_p2p" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" "github.com/getoptimum/optimum-gateway/pkg/service/telemetry/tracer" ) @@ -76,6 +77,8 @@ type Service struct { lastBlockReceivedAt atomic.Int64 // Unix ms — stamped on every beacon block from any source startedAt time.Time // wall-clock time the service was created + + streamHub *streamhub.Service // consumer block-stream fan-out (ADR-0011); nil disables it } // LastBlockReceivedMs returns Unix ms of the last beacon block seen (0 if none). @@ -94,6 +97,14 @@ func WithCustomMumP2PConnectionGater(gater connmgr.ConnectionGater) func(*Servic } } +// WithStreamHub wires the consumer block-stream fan-out (ADR-0011); nil (the +// default) leaves the stream off. +func WithStreamHub(hub *streamhub.Service) Option { + return func(s *Service) { + s.streamHub = hub + } +} + func NewService( ctx context.Context, log logger.AppLogger, diff --git a/pkg/service/gossipsub-gateway/stream_emit_test.go b/pkg/service/gossipsub-gateway/stream_emit_test.go new file mode 100644 index 0000000..5565835 --- /dev/null +++ b/pkg/service/gossipsub-gateway/stream_emit_test.go @@ -0,0 +1,41 @@ +package gossipsub_gateway + +import ( + "encoding/hex" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/getoptimum/optimum-gateway/pkg/entities" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" + "github.com/getoptimum/optimum-gateway/pkg/test_utils" +) + +// A decoded beacon block is emitted to the hub with its metadata and raw bytes. +func TestProcessBeaconBlockArrivalEmitsToStreamHub(t *testing.T) { + svc, _ := newGateway(t) + hub := streamhub.New() + svc.streamHub = hub + sub := hub.Subscribe(4) + + raw, err := hex.DecodeString(test_utils.HoodiBeaconBlockMessage1) + require.NoError(t, err) + topic := "/eth2/deadbeef/beacon_block/ssz_snappy" + + slot, _ := svc.processBeaconBlockArrival(svc.log, topic, raw, time.Now().UnixMilli(), entities.SourceLibP2P, "", "peer-x") + require.Equal(t, uint64(3435697), slot) + + select { + case ev := <-sub.Events(): + require.Equal(t, uint64(3435697), ev.Slot) + require.Equal(t, uint64(526417), ev.ProposerIndex) + require.Equal(t, entities.SourceLibP2P, ev.Source) + require.Equal(t, topic, ev.Topic) + require.Equal(t, "deadbeef", ev.ForkDigest) + require.Equal(t, raw, ev.Raw) + require.True(t, ev.Stale, "an old-slot fixture is flagged stale but still streamed") + default: + t.Fatal("expected a block event on the hub") + } +} diff --git a/pkg/service/jwks_verifier/verifier.go b/pkg/service/jwks_verifier/verifier.go index 6606106..9bd0482 100644 --- a/pkg/service/jwks_verifier/verifier.go +++ b/pkg/service/jwks_verifier/verifier.go @@ -24,9 +24,11 @@ const ( // AudP2P is the audience for the peer-visible handshake token used at the libp2p mumP2P handshake. // AudServices is the audience for the services token that carries operator_id to centralized services. +// AudStream is the audience for consumer block-stream JWTs (ADR-0011). const ( AudP2P = "p2p" AudServices = "services" + AudStream = "stream" ) // maxTokenLifetime caps exp - iat at the value the upstream auth service @@ -98,7 +100,7 @@ func New(ctx context.Context, log logger.AppLogger, appCfg *config.AppConfig) (* // - alg pinned to ES256 // - signature via JWKS kid lookup // - iss matches ExpectedIssuer -// - aud matches the expected audience (AudP2P for handshake tokens, AudServices for services tokens) +// - aud matches the expected audience (AudP2P, AudServices, or AudStream) // - iat is present and not in the future (with a small clockSkew tolerance) // - exp in future (required, with the same skew tolerance) // - exp - iat <= maxTokenLifetime (6h, plus a tiny skew buffer) diff --git a/pkg/service/stream/auth.go b/pkg/service/stream/auth.go new file mode 100644 index 0000000..7914f34 --- /dev/null +++ b/pkg/service/stream/auth.go @@ -0,0 +1,47 @@ +package stream + +import ( + "fmt" + + "github.com/getoptimum/optimum-gateway/pkg/service/auth_token" +) + +// ConsumerAuthenticator validates a consumer JWT and returns the subject +// used for per-connection caps (ADR-0011). +type ConsumerAuthenticator interface { + Authenticate(token string) (subject string, err error) +} + +const devLocalSubject = "dev-local" + +// NewConsumerAuthenticator returns the auth backend for the consumer stream. +func NewConsumerAuthenticator(auth *auth_token.Service, requireAuth bool) ConsumerAuthenticator { + if !requireAuth { + return allowAllAuthenticator{} + } + return jwksAuthenticator{auth: auth} +} + +type jwksAuthenticator struct { + auth *auth_token.Service +} + +func (a jwksAuthenticator) Authenticate(token string) (string, error) { + if a.auth == nil { + return "", fmt.Errorf("stream auth: verifier unavailable") + } + claims, err := a.auth.VerifyStreamToken(token) + if err != nil { + return "", err + } + if claims == nil { + return "", fmt.Errorf("stream auth: verifier unavailable") + } + return claims.Subject, nil +} + +type allowAllAuthenticator struct{} + +func (allowAllAuthenticator) Authenticate(string) (string, error) { + return devLocalSubject, nil +} diff --git a/pkg/service/stream/auth_test.go b/pkg/service/stream/auth_test.go new file mode 100644 index 0000000..7b7ef0e --- /dev/null +++ b/pkg/service/stream/auth_test.go @@ -0,0 +1,79 @@ +package stream_test + +import ( + "testing" + "time" + + "github.com/golang-jwt/jwt/v5" + "github.com/stretchr/testify/require" + + "github.com/getoptimum/optimum-common/pkg/logger" + "github.com/getoptimum/optimum-gateway/pkg/service/auth_token" + "github.com/getoptimum/optimum-gateway/pkg/service/jwks_verifier" + "github.com/getoptimum/optimum-gateway/pkg/service/stream" + "github.com/getoptimum/optimum-gateway/pkg/test_utils" +) + +func TestJWKSAuthenticator_AcceptsStreamToken(t *testing.T) { + m, rig := newAuthManager(t) + auth := stream.NewConsumerAuthenticator(m, true) + + tok := rig.MustSignToken(t, rig.PrivateKey, func(c *jwks_verifier.Claims) { + c.Audience = jwt.ClaimStrings{jwks_verifier.AudStream} + c.Subject = "as_stream-key-1" + c.ChainID = "mainnet" // stream auth is aud-only; no chain gate (ADR-0011) + }) + + sub, err := auth.Authenticate(tok) + require.NoError(t, err) + require.Equal(t, "as_stream-key-1", sub) +} + +func TestJWKSAuthenticator_RejectsNilAuthManager(t *testing.T) { + auth := stream.NewConsumerAuthenticator(nil, true) + + _, err := auth.Authenticate("any-token") + require.Error(t, err) + require.Contains(t, err.Error(), "verifier unavailable") +} + +func TestJWKSAuthenticator_RejectsWrongAudience(t *testing.T) { + m, rig := newAuthManager(t) + auth := stream.NewConsumerAuthenticator(m, true) + + tok := rig.MustSignToken(t, rig.PrivateKey, nil) // aud=p2p + + _, err := auth.Authenticate(tok) + require.Error(t, err) +} + +func TestJWKSAuthenticator_RejectsExpiredToken(t *testing.T) { + m, rig := newAuthManager(t) + auth := stream.NewConsumerAuthenticator(m, true) + + tok := rig.MustSignToken(t, rig.PrivateKey, func(c *jwks_verifier.Claims) { + c.Audience = jwt.ClaimStrings{jwks_verifier.AudStream} + c.ExpiresAt = jwt.NewNumericDate(time.Now().Add(-time.Hour)) + }) + + _, err := auth.Authenticate(tok) + require.Error(t, err) +} + +func TestAllowAllAuthenticator_ReturnsDevSubject(t *testing.T) { + auth := stream.NewConsumerAuthenticator(nil, false) + + sub, err := auth.Authenticate("") + require.NoError(t, err) + require.Equal(t, "dev-local", sub) +} + +// newAuthManager builds an enabled auth manager; VerifyStreamToken only needs +// the JWKS verifier, so no mint round-trip is required. +func newAuthManager(t *testing.T) (*auth_token.Service, *test_utils.AuthTestRig) { + t.Helper() + rig := test_utils.NewAuthTestRig(t) + m, err := auth_token.New(t.Context(), logger.NewAppSLogger(logger.Debug), rig.AppCfg(t)) + require.NoError(t, err) + return m, rig +} diff --git a/pkg/service/stream/grpc.go b/pkg/service/stream/grpc.go new file mode 100644 index 0000000..3209655 --- /dev/null +++ b/pkg/service/stream/grpc.go @@ -0,0 +1,157 @@ +package stream + +import ( + "context" + "net" + "strings" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + + "github.com/getoptimum/optimum-common/pkg/logger" + streamv1 "github.com/getoptimum/optimum-gateway/pkg/service/stream/v1" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" + "github.com/getoptimum/optimum-gateway/pkg/service/telemetry" +) + +// GRPCServer serves the consumer block-stream over gRPC on its own listener, +// reusing the hub, authenticator, and connection caps of the WS transport. +type GRPCServer struct { + streamv1.UnimplementedBlockStreamServiceServer + hub *streamhub.Service + auth ConsumerAuthenticator + cfg Config + log logger.AppLogger + limiter *ConnLimiter + grpcSrv *grpc.Server +} + +// maxConcurrentStreams bounds Subscribe streams per connection. The caps run +// after auth, so one unauthenticated socket would otherwise be unbounded. +const maxConcurrentStreams = 256 + +// NewGRPCServer builds the consumer gRPC server. It does not start listening; +// call Run. +func NewGRPCServer(hub *streamhub.Service, auth ConsumerAuthenticator, cfg Config, log logger.AppLogger) *GRPCServer { + cfg = withDefaults(cfg) + g := &GRPCServer{ + hub: hub, + auth: auth, + cfg: cfg, + log: log.With(logger.WithService("stream-grpc")), + limiter: cfg.Limiter, + grpcSrv: grpc.NewServer( + // Reap dead peers on the WS clock; the gRPC default is a 2h ping. + grpc.KeepaliveParams(keepalive.ServerParameters{Time: pingPeriod, Timeout: writeWait}), + grpc.MaxConcurrentStreams(maxConcurrentStreams), + ), + } + streamv1.RegisterBlockStreamServiceServer(g.grpcSrv, g) + return g +} + +// Run serves until Stop is called; grpc.ErrServerStopped on a clean stop is +// treated as normal by the caller. +func (g *GRPCServer) Run() error { + lis, err := net.Listen("tcp", g.cfg.Addr) + if err != nil { + return err + } + g.log.Info("starting consumer stream grpc server", logger.WithString("addr", g.cfg.Addr)) + return g.grpcSrv.Serve(lis) +} + +// Stop hard-stops the server, canceling active Subscribe streams so shutdown +// does not block on long-lived consumers. +func (g *GRPCServer) Stop() { g.grpcSrv.Stop() } + +// Subscribe authenticates and enforces caps before opening the stream, then +// drains the buffer as proto frames (metadata omits Raw); lagged on overflow. +func (g *GRPCServer) Subscribe(req *streamv1.SubscribeRequest, stream grpc.ServerStreamingServer[streamv1.BlockEvent]) error { + mode, ok := normalizeMode(req.GetMode()) + if !ok { + return status.Error(codes.InvalidArgument, "invalid mode") + } + if !topicsOK(req.GetTopics()...) { + return status.Error(codes.InvalidArgument, "unsupported topics") + } + + ctx := stream.Context() + subject, err := g.auth.Authenticate(metadataToken(ctx)) + if err != nil { + telemetry.RecordStreamAuthFailure() + return status.Error(codes.Unauthenticated, "unauthorized") + } + if !g.limiter.acquire(subject) { + return status.Error(codes.ResourceExhausted, "too many connections") + } + defer g.limiter.release(subject) + + sub := g.hub.Subscribe(g.cfg.BufferSize) + defer sub.Close() + + raw := mode == modeRaw + var lastDropped uint64 + for { + select { + case <-ctx.Done(): + return ctx.Err() + case ev, ok := <-sub.Events(): + if !ok { + return nil + } + if d := sub.Dropped(); d != lastDropped { + lastDropped = d + lag := &streamv1.BlockEvent{Frame: &streamv1.BlockEvent_Lagged{Lagged: &streamv1.Lagged{Dropped: d}}} + if err := stream.Send(lag); err != nil { + return err + } + } + if err := stream.Send(toProto(ev, raw)); err != nil { + return err + } + telemetry.RecordStreamEventSent() + } + } +} + +func toProto(ev *streamhub.BlockEvent, raw bool) *streamv1.BlockEvent { + b := &streamv1.Block{ + Slot: ev.Slot, + ProposerIndex: ev.ProposerIndex, + ParentRoot: ev.ParentRoot, + StateRoot: ev.StateRoot, + BlockSizeBytes: ev.BlockSizeBytes, + Topic: ev.Topic, + Source: string(ev.Source), + ReceivedAtMs: ev.ReceivedAtMs, + GatewayId: ev.GatewayID, + ForkDigest: ev.ForkDigest, + Stale: ev.Stale, + } + if raw { + b.Raw = ev.Raw + } + return &streamv1.BlockEvent{Frame: &streamv1.BlockEvent_Block{Block: b}} +} + +// metadataToken reads the consumer JWT from the "authorization" gRPC metadata, +// accepting either a bare token or a "Bearer " value. +func metadataToken(ctx context.Context) string { + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + return "" + } + vals := md.Get("authorization") + if len(vals) == 0 { + return "" + } + tok := vals[0] + if after, ok := strings.CutPrefix(tok, "Bearer "); ok { + tok = after + } + return strings.TrimSpace(tok) +} diff --git a/pkg/service/stream/grpc_test.go b/pkg/service/stream/grpc_test.go new file mode 100644 index 0000000..a611a1a --- /dev/null +++ b/pkg/service/stream/grpc_test.go @@ -0,0 +1,147 @@ +package stream + +import ( + "context" + "net" + "testing" + "time" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/grpc/test/bufconn" + + "github.com/getoptimum/optimum-common/pkg/logger" + streamv1 "github.com/getoptimum/optimum-gateway/pkg/service/stream/v1" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" + "github.com/getoptimum/optimum-gateway/pkg/test_utils" +) + +// newGRPCTestServer starts a GRPCServer over an in-memory bufconn and returns a +// connected client. Auth is always required; loopback no-auth is covered by WS. +func newGRPCTestServer(t *testing.T, cfg Config) (client streamv1.BlockStreamServiceClient, srv *GRPCServer, hub *streamhub.Service, rig *test_utils.AuthTestRig) { + t.Helper() + var authenticator ConsumerAuthenticator + authenticator, rig = testAuth(t, true) + hub = streamhub.New() + srv = NewGRPCServer(hub, authenticator, cfg, logger.NewAppSLogger(logger.Debug)) + + lis := bufconn.Listen(1 << 20) + go func() { _ = srv.grpcSrv.Serve(lis) }() + t.Cleanup(srv.grpcSrv.Stop) + + conn, err := grpc.NewClient("passthrough:///bufnet", + grpc.WithContextDialer(func(ctx context.Context, _ string) (net.Conn, error) { return lis.DialContext(ctx) }), + grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + t.Cleanup(func() { _ = conn.Close() }) + return streamv1.NewBlockStreamServiceClient(conn), srv, hub, rig +} + +func authCtx(t *testing.T, rig *test_utils.AuthTestRig, subject string) context.Context { + t.Helper() + return metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer "+streamToken(t, rig, subject)) +} + +func TestGRPC_RejectsWithoutToken(t *testing.T) { + client, _, hub, _ := newGRPCTestServer(t, Config{}) + + sub, err := client.Subscribe(context.Background(), &streamv1.SubscribeRequest{}) + require.NoError(t, err) + _, err = sub.Recv() + require.Equal(t, codes.Unauthenticated, status.Code(err)) + require.Zero(t, hub.SubscriberCount(), "rejected consumer must not create a subscriber") +} + +func TestGRPC_DeliversFraming(t *testing.T) { + for _, tc := range []struct { + name string + mode string + expectRaw bool + }{ + {"metadata omits raw", "metadata", false}, + {"raw includes bytes", "raw", true}, + } { + t.Run(tc.name, func(t *testing.T) { + client, _, hub, rig := newGRPCTestServer(t, Config{}) + sub, err := client.Subscribe(authCtx(t, rig, "sub-1"), &streamv1.SubscribeRequest{Mode: tc.mode}) + require.NoError(t, err) + + waitSubscribed(t, hub, 1) + hub.Emit(sampleEvent()) + + ev, err := sub.Recv() + require.NoError(t, err) + require.Nil(t, ev.GetLagged(), "a block frame carries no lagged signal") + require.EqualValues(t, 42, ev.GetBlock().GetSlot()) + if tc.expectRaw { + require.Equal(t, []byte("ssz-snappy-bytes"), ev.GetBlock().GetRaw()) + } else { + require.Empty(t, ev.GetBlock().GetRaw()) + } + }) + } +} + +func TestGRPC_LaggedOnOverflow(t *testing.T) { + client, _, hub, rig := newGRPCTestServer(t, Config{BufferSize: 1}) + // Above the loop deadline below, so a blocked Recv fails instead of hanging. + ctx, cancel := context.WithTimeout(authCtx(t, rig, "sub-1"), 5*time.Second) + defer cancel() + sub, err := client.Subscribe(ctx, &streamv1.SubscribeRequest{}) + require.NoError(t, err) + + waitSubscribed(t, hub, 1) + for range 3000 { + hub.Emit(sampleEvent()) + } + + var sawLagged bool + deadline := time.Now().Add(3 * time.Second) + for time.Now().Before(deadline) && !sawLagged { + ev, rerr := sub.Recv() + require.NoError(t, rerr) + if lag := ev.GetLagged(); lag != nil { + require.Positive(t, lag.GetDropped()) + sawLagged = true + } + } + require.True(t, sawLagged, "a lagged frame must be sent after overflow") +} + +func TestGRPC_GlobalCapRejects(t *testing.T) { + client, _, hub, rig := newGRPCTestServer(t, Config{MaxConns: 1}) + + first, err := client.Subscribe(authCtx(t, rig, "sub-a"), &streamv1.SubscribeRequest{}) + require.NoError(t, err) + waitSubscribed(t, hub, 1) + + second, err := client.Subscribe(authCtx(t, rig, "sub-b"), &streamv1.SubscribeRequest{}) + require.NoError(t, err) + _, err = second.Recv() + require.Equal(t, codes.ResourceExhausted, status.Code(err)) + + _ = first // keep the first stream open for the duration of the assertion +} + +func TestGRPC_CleanupOnCancel(t *testing.T) { + client, srv, hub, rig := newGRPCTestServer(t, Config{}) + ctx, cancel := context.WithCancel(authCtx(t, rig, "sub-1")) + _, err := client.Subscribe(ctx, &streamv1.SubscribeRequest{}) + require.NoError(t, err) + + waitSubscribed(t, hub, 1) + cancel() + + // Cancel must unwind the handler, closing the subscriber (drop-counter entry + // included) and releasing the cap slot, so nothing leaks. + waitSubscribed(t, hub, 0) + require.Eventually(t, func() bool { + srv.limiter.mu.Lock() + defer srv.limiter.mu.Unlock() + return srv.limiter.conns == 0 && len(srv.limiter.perSub) == 0 + }, 2*time.Second, 10*time.Millisecond) +} diff --git a/pkg/service/stream/transport.go b/pkg/service/stream/transport.go new file mode 100644 index 0000000..0bda8a9 --- /dev/null +++ b/pkg/service/stream/transport.go @@ -0,0 +1,92 @@ +package stream + +import ( + "sync" + + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" + "github.com/getoptimum/optimum-gateway/pkg/service/telemetry" +) + +const ( + defaultMaxConns = 256 + defaultMaxConnsPerSub = 8 +) + +// withDefaults fills unset (<=0) caps so both transports share the same limits. +func withDefaults(cfg Config) Config { + if cfg.MaxConns <= 0 { + cfg.MaxConns = defaultMaxConns + } + if cfg.MaxConnsPerSub <= 0 { + cfg.MaxConnsPerSub = defaultMaxConnsPerSub + } + if cfg.BufferSize <= 0 { + cfg.BufferSize = streamhub.DefaultBufferSize + } + if cfg.Limiter == nil { + cfg.Limiter = NewConnLimiter(cfg.MaxConns, cfg.MaxConnsPerSub) + } + return cfg +} + +// normalizeMode defaults empty to metadata and reports whether the value is allowed. +func normalizeMode(mode string) (string, bool) { + if mode == "" { + mode = modeMetadata + } + return mode, mode == modeMetadata || mode == modeRaw +} + +// topicsOK is true when every topic is empty or the v1-only beacon_block topic. +func topicsOK(topics ...string) bool { + for _, t := range topics { + if t != "" && t != defaultTopic { + return false + } + } + return true +} + +// ConnLimiter enforces the global and per-subject connection caps. One instance +// is shared by both transports so the caps stay global, not per-transport (ADR-0011). +type ConnLimiter struct { + maxConns int + maxConnsPerSub int + + mu sync.Mutex + conns int + perSub map[string]int +} + +// NewConnLimiter returns a limiter for the given caps. +func NewConnLimiter(maxConns, maxConnsPerSub int) *ConnLimiter { + return &ConnLimiter{ + maxConns: maxConns, + maxConnsPerSub: maxConnsPerSub, + perSub: make(map[string]int), + } +} + +// acquire admits a connection for subject when both caps allow it. +func (l *ConnLimiter) acquire(subject string) bool { + l.mu.Lock() + defer l.mu.Unlock() + if l.conns >= l.maxConns || l.perSub[subject] >= l.maxConnsPerSub { + return false + } + l.conns++ + l.perSub[subject]++ + telemetry.IncStreamConnections() + return true +} + +func (l *ConnLimiter) release(subject string) { + l.mu.Lock() + defer l.mu.Unlock() + l.conns-- + l.perSub[subject]-- + if l.perSub[subject] <= 0 { + delete(l.perSub, subject) + } + telemetry.DecStreamConnections() +} diff --git a/pkg/service/stream/v1/stream.pb.go b/pkg/service/stream/v1/stream.pb.go new file mode 100644 index 0000000..c3c377d --- /dev/null +++ b/pkg/service/stream/v1/stream.pb.go @@ -0,0 +1,433 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc (unknown) +// source: getoptimum/optimum_gateway/service/stream/v1/stream.proto + +package v1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// SubscribeRequest selects the payload mode and topics for a subscription. +type SubscribeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Mode string `protobuf:"bytes,1,opt,name=mode,proto3" json:"mode,omitempty"` // "metadata" (default) or "raw" + Topics []string `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` // validated only; v1 has one topic, so nothing is filtered + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeRequest) ProtoMessage() {} + +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescGZIP(), []int{0} +} + +func (x *SubscribeRequest) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + +func (x *SubscribeRequest) GetTopics() []string { + if x != nil { + return x.Topics + } + return nil +} + +// BlockEvent is one frame: a block observation or a lag signal (ADR-0011). +type BlockEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + // frame tells an observation apart from a control signal. + // + // Types that are valid to be assigned to Frame: + // + // *BlockEvent_Block + // *BlockEvent_Lagged + Frame isBlockEvent_Frame `protobuf_oneof:"frame"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BlockEvent) Reset() { + *x = BlockEvent{} + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BlockEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockEvent) ProtoMessage() {} + +func (x *BlockEvent) ProtoReflect() protoreflect.Message { + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockEvent.ProtoReflect.Descriptor instead. +func (*BlockEvent) Descriptor() ([]byte, []int) { + return file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescGZIP(), []int{1} +} + +func (x *BlockEvent) GetFrame() isBlockEvent_Frame { + if x != nil { + return x.Frame + } + return nil +} + +func (x *BlockEvent) GetBlock() *Block { + if x != nil { + if x, ok := x.Frame.(*BlockEvent_Block); ok { + return x.Block + } + } + return nil +} + +func (x *BlockEvent) GetLagged() *Lagged { + if x != nil { + if x, ok := x.Frame.(*BlockEvent_Lagged); ok { + return x.Lagged + } + } + return nil +} + +type isBlockEvent_Frame interface { + isBlockEvent_Frame() +} + +type BlockEvent_Block struct { + Block *Block `protobuf:"bytes,1,opt,name=block,proto3,oneof"` +} + +type BlockEvent_Lagged struct { + Lagged *Lagged `protobuf:"bytes,2,opt,name=lagged,proto3,oneof"` +} + +func (*BlockEvent_Block) isBlockEvent_Frame() {} + +func (*BlockEvent_Lagged) isBlockEvent_Frame() {} + +// Block is one block observation (fields mirror the streamhub hub type). +type Block struct { + state protoimpl.MessageState `protogen:"open.v1"` + Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"` + ProposerIndex uint64 `protobuf:"varint,2,opt,name=proposer_index,json=proposerIndex,proto3" json:"proposer_index,omitempty"` + ParentRoot []byte `protobuf:"bytes,3,opt,name=parent_root,json=parentRoot,proto3" json:"parent_root,omitempty"` + StateRoot []byte `protobuf:"bytes,4,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` + BlockSizeBytes uint64 `protobuf:"varint,5,opt,name=block_size_bytes,json=blockSizeBytes,proto3" json:"block_size_bytes,omitempty"` + Topic string `protobuf:"bytes,6,opt,name=topic,proto3" json:"topic,omitempty"` + Source string `protobuf:"bytes,7,opt,name=source,proto3" json:"source,omitempty"` + ReceivedAtMs int64 `protobuf:"varint,8,opt,name=received_at_ms,json=receivedAtMs,proto3" json:"received_at_ms,omitempty"` + GatewayId string `protobuf:"bytes,9,opt,name=gateway_id,json=gatewayId,proto3" json:"gateway_id,omitempty"` + ForkDigest string `protobuf:"bytes,10,opt,name=fork_digest,json=forkDigest,proto3" json:"fork_digest,omitempty"` + Stale bool `protobuf:"varint,11,opt,name=stale,proto3" json:"stale,omitempty"` + Raw []byte `protobuf:"bytes,12,opt,name=raw,proto3" json:"raw,omitempty"` // present only in raw mode + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Block) Reset() { + *x = Block{} + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Block) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Block) ProtoMessage() {} + +func (x *Block) ProtoReflect() protoreflect.Message { + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Block.ProtoReflect.Descriptor instead. +func (*Block) Descriptor() ([]byte, []int) { + return file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescGZIP(), []int{2} +} + +func (x *Block) GetSlot() uint64 { + if x != nil { + return x.Slot + } + return 0 +} + +func (x *Block) GetProposerIndex() uint64 { + if x != nil { + return x.ProposerIndex + } + return 0 +} + +func (x *Block) GetParentRoot() []byte { + if x != nil { + return x.ParentRoot + } + return nil +} + +func (x *Block) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *Block) GetBlockSizeBytes() uint64 { + if x != nil { + return x.BlockSizeBytes + } + return 0 +} + +func (x *Block) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *Block) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +func (x *Block) GetReceivedAtMs() int64 { + if x != nil { + return x.ReceivedAtMs + } + return 0 +} + +func (x *Block) GetGatewayId() string { + if x != nil { + return x.GatewayId + } + return "" +} + +func (x *Block) GetForkDigest() string { + if x != nil { + return x.ForkDigest + } + return "" +} + +func (x *Block) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +func (x *Block) GetRaw() []byte { + if x != nil { + return x.Raw + } + return nil +} + +// Lagged reports the cumulative drop count after a buffer overflow. +type Lagged struct { + state protoimpl.MessageState `protogen:"open.v1"` + Dropped uint64 `protobuf:"varint,1,opt,name=dropped,proto3" json:"dropped,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Lagged) Reset() { + *x = Lagged{} + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Lagged) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Lagged) ProtoMessage() {} + +func (x *Lagged) ProtoReflect() protoreflect.Message { + mi := &file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Lagged.ProtoReflect.Descriptor instead. +func (*Lagged) Descriptor() ([]byte, []int) { + return file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescGZIP(), []int{3} +} + +func (x *Lagged) GetDropped() uint64 { + if x != nil { + return x.Dropped + } + return 0 +} + +var File_getoptimum_optimum_gateway_service_stream_v1_stream_proto protoreflect.FileDescriptor + +const file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDesc = "" + + "\n" + + "9getoptimum/optimum_gateway/service/stream/v1/stream.proto\x12,getoptimum.optimum_gateway.service.stream.v1\">\n" + + "\x10SubscribeRequest\x12\x12\n" + + "\x04mode\x18\x01 \x01(\tR\x04mode\x12\x16\n" + + "\x06topics\x18\x02 \x03(\tR\x06topics\"\xb2\x01\n" + + "\n" + + "BlockEvent\x12K\n" + + "\x05block\x18\x01 \x01(\v23.getoptimum.optimum_gateway.service.stream.v1.BlockH\x00R\x05block\x12N\n" + + "\x06lagged\x18\x02 \x01(\v24.getoptimum.optimum_gateway.service.stream.v1.LaggedH\x00R\x06laggedB\a\n" + + "\x05frame\"\xe8\x02\n" + + "\x05Block\x12\x12\n" + + "\x04slot\x18\x01 \x01(\x04R\x04slot\x12%\n" + + "\x0eproposer_index\x18\x02 \x01(\x04R\rproposerIndex\x12\x1f\n" + + "\vparent_root\x18\x03 \x01(\fR\n" + + "parentRoot\x12\x1d\n" + + "\n" + + "state_root\x18\x04 \x01(\fR\tstateRoot\x12(\n" + + "\x10block_size_bytes\x18\x05 \x01(\x04R\x0eblockSizeBytes\x12\x14\n" + + "\x05topic\x18\x06 \x01(\tR\x05topic\x12\x16\n" + + "\x06source\x18\a \x01(\tR\x06source\x12$\n" + + "\x0ereceived_at_ms\x18\b \x01(\x03R\freceivedAtMs\x12\x1d\n" + + "\n" + + "gateway_id\x18\t \x01(\tR\tgatewayId\x12\x1f\n" + + "\vfork_digest\x18\n" + + " \x01(\tR\n" + + "forkDigest\x12\x14\n" + + "\x05stale\x18\v \x01(\bR\x05stale\x12\x10\n" + + "\x03raw\x18\f \x01(\fR\x03raw\"\"\n" + + "\x06Lagged\x12\x18\n" + + "\adropped\x18\x01 \x01(\x04R\adropped2\x9e\x01\n" + + "\x12BlockStreamService\x12\x87\x01\n" + + "\tSubscribe\x12>.getoptimum.optimum_gateway.service.stream.v1.SubscribeRequest\x1a8.getoptimum.optimum_gateway.service.stream.v1.BlockEvent0\x01B=Z;github.com/getoptimum/optimum-gateway/pkg/service/stream/v1b\x06proto3" + +var ( + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescOnce sync.Once + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescData []byte +) + +func file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescGZIP() []byte { + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescOnce.Do(func() { + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDesc), len(file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDesc))) + }) + return file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDescData +} + +var file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_goTypes = []any{ + (*SubscribeRequest)(nil), // 0: getoptimum.optimum_gateway.service.stream.v1.SubscribeRequest + (*BlockEvent)(nil), // 1: getoptimum.optimum_gateway.service.stream.v1.BlockEvent + (*Block)(nil), // 2: getoptimum.optimum_gateway.service.stream.v1.Block + (*Lagged)(nil), // 3: getoptimum.optimum_gateway.service.stream.v1.Lagged +} +var file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_depIdxs = []int32{ + 2, // 0: getoptimum.optimum_gateway.service.stream.v1.BlockEvent.block:type_name -> getoptimum.optimum_gateway.service.stream.v1.Block + 3, // 1: getoptimum.optimum_gateway.service.stream.v1.BlockEvent.lagged:type_name -> getoptimum.optimum_gateway.service.stream.v1.Lagged + 0, // 2: getoptimum.optimum_gateway.service.stream.v1.BlockStreamService.Subscribe:input_type -> getoptimum.optimum_gateway.service.stream.v1.SubscribeRequest + 1, // 3: getoptimum.optimum_gateway.service.stream.v1.BlockStreamService.Subscribe:output_type -> getoptimum.optimum_gateway.service.stream.v1.BlockEvent + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_init() } +func file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_init() { + if File_getoptimum_optimum_gateway_service_stream_v1_stream_proto != nil { + return + } + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes[1].OneofWrappers = []any{ + (*BlockEvent_Block)(nil), + (*BlockEvent_Lagged)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDesc), len(file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_rawDesc)), + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_goTypes, + DependencyIndexes: file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_depIdxs, + MessageInfos: file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_msgTypes, + }.Build() + File_getoptimum_optimum_gateway_service_stream_v1_stream_proto = out.File + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_goTypes = nil + file_getoptimum_optimum_gateway_service_stream_v1_stream_proto_depIdxs = nil +} diff --git a/pkg/service/stream/v1/stream_grpc.pb.go b/pkg/service/stream/v1/stream_grpc.pb.go new file mode 100644 index 0000000..c58f9b0 --- /dev/null +++ b/pkg/service/stream/v1/stream_grpc.pb.go @@ -0,0 +1,130 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.2 +// - protoc (unknown) +// source: getoptimum/optimum_gateway/service/stream/v1/stream.proto + +package v1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + BlockStreamService_Subscribe_FullMethodName = "/getoptimum.optimum_gateway.service.stream.v1.BlockStreamService/Subscribe" +) + +// BlockStreamServiceClient is the client API for BlockStreamService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// BlockStreamService streams decoded beacon-block observations to consumers (ADR-0011). +type BlockStreamServiceClient interface { + // Subscribe opens a read-only server stream of block observations. + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[BlockEvent], error) +} + +type blockStreamServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewBlockStreamServiceClient(cc grpc.ClientConnInterface) BlockStreamServiceClient { + return &blockStreamServiceClient{cc} +} + +func (c *blockStreamServiceClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[BlockEvent], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &BlockStreamService_ServiceDesc.Streams[0], BlockStreamService_Subscribe_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[SubscribeRequest, BlockEvent]{ClientStream: stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type BlockStreamService_SubscribeClient = grpc.ServerStreamingClient[BlockEvent] + +// BlockStreamServiceServer is the server API for BlockStreamService service. +// All implementations must embed UnimplementedBlockStreamServiceServer +// for forward compatibility. +// +// BlockStreamService streams decoded beacon-block observations to consumers (ADR-0011). +type BlockStreamServiceServer interface { + // Subscribe opens a read-only server stream of block observations. + Subscribe(*SubscribeRequest, grpc.ServerStreamingServer[BlockEvent]) error + mustEmbedUnimplementedBlockStreamServiceServer() +} + +// UnimplementedBlockStreamServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedBlockStreamServiceServer struct{} + +func (UnimplementedBlockStreamServiceServer) Subscribe(*SubscribeRequest, grpc.ServerStreamingServer[BlockEvent]) error { + return status.Error(codes.Unimplemented, "method Subscribe not implemented") +} +func (UnimplementedBlockStreamServiceServer) mustEmbedUnimplementedBlockStreamServiceServer() {} +func (UnimplementedBlockStreamServiceServer) testEmbeddedByValue() {} + +// UnsafeBlockStreamServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to BlockStreamServiceServer will +// result in compilation errors. +type UnsafeBlockStreamServiceServer interface { + mustEmbedUnimplementedBlockStreamServiceServer() +} + +func RegisterBlockStreamServiceServer(s grpc.ServiceRegistrar, srv BlockStreamServiceServer) { + // If the following call panics, it indicates UnimplementedBlockStreamServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&BlockStreamService_ServiceDesc, srv) +} + +func _BlockStreamService_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(BlockStreamServiceServer).Subscribe(m, &grpc.GenericServerStream[SubscribeRequest, BlockEvent]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type BlockStreamService_SubscribeServer = grpc.ServerStreamingServer[BlockEvent] + +// BlockStreamService_ServiceDesc is the grpc.ServiceDesc for BlockStreamService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BlockStreamService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "getoptimum.optimum_gateway.service.stream.v1.BlockStreamService", + HandlerType: (*BlockStreamServiceServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Subscribe", + Handler: _BlockStreamService_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "getoptimum/optimum_gateway/service/stream/v1/stream.proto", +} diff --git a/pkg/service/stream/ws.go b/pkg/service/stream/ws.go new file mode 100644 index 0000000..ef038e0 --- /dev/null +++ b/pkg/service/stream/ws.go @@ -0,0 +1,237 @@ +package stream + +import ( + "context" + "net/http" + "strings" + "time" + + "github.com/gorilla/websocket" + + "github.com/getoptimum/optimum-common/pkg/logger" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" + "github.com/getoptimum/optimum-gateway/pkg/service/telemetry" +) + +const ( + // streamPath is the single read-only consumer endpoint (ADR-0011). + streamPath = "/api/v1/stream/blocks" + // wsSubprotocol is the marker the server negotiates; the bearer token is + // carried alongside it but never echoed back as the selected subprotocol. + wsSubprotocol = "optimum.stream.v1" + bearerSubproto = "bearer." + defaultTopic = "beacon_block" + modeMetadata = "metadata" + modeRaw = "raw" + frameTypeBlock = "block" + frameTypeLagged = "lagged" + + writeWait = 10 * time.Second + pongWait = 60 * time.Second + pingPeriod = (pongWait * 9) / 10 + maxReadBytes = 1 << 10 // consumers are read-only; cap inbound frames. +) + +// Config carries the transport's static limits, sourced from AppConfig by the +// caller so this package stays independent of pkg/config. +type Config struct { + Addr string + MaxConns int + MaxConnsPerSub int + BufferSize int + // Limiter is shared across transports so caps stay global; withDefaults + // creates one if nil. + Limiter *ConnLimiter +} + +// Server exposes streamhub over WebSocket on its own listener, keeping the +// consumer surface off the gateway's /metrics and /health port (ADR-0011). +type Server struct { + hub *streamhub.Service + auth ConsumerAuthenticator + cfg Config + log logger.AppLogger + limiter *ConnLimiter + upgrader websocket.Upgrader + httpSrv *http.Server +} + +// NewServer builds the consumer WebSocket server. It does not start listening; +// call Run. +func NewServer(hub *streamhub.Service, auth ConsumerAuthenticator, cfg Config, log logger.AppLogger) *Server { + cfg = withDefaults(cfg) + s := &Server{ + hub: hub, + auth: auth, + cfg: cfg, + log: log.With(logger.WithService("stream-ws")), + limiter: cfg.Limiter, + upgrader: websocket.Upgrader{ + // JWT gates access (not Origin; TLS/proxy is the exposure control). + // Offering only the marker means gorilla never selects bearer.. + Subprotocols: []string{wsSubprotocol}, + CheckOrigin: func(*http.Request) bool { return true }, + }, + } + mux := http.NewServeMux() + mux.HandleFunc(streamPath, s.handle) + s.httpSrv = &http.Server{ + Addr: cfg.Addr, + Handler: mux, + ReadHeaderTimeout: writeWait, + } + return s +} + +// Run serves until Stop is called; it returns http.ErrServerClosed on a clean +// shutdown, which the caller treats as normal. +func (s *Server) Run() error { + s.log.Info("starting consumer stream server", logger.WithString("addr", s.cfg.Addr)) + return s.httpSrv.ListenAndServe() +} + +// Stop drains in-flight requests within ctx. +func (s *Server) Stop(ctx context.Context) error { + return s.httpSrv.Shutdown(ctx) +} + +func (s *Server) handle(w http.ResponseWriter, r *http.Request) { + mode, ok := normalizeMode(r.URL.Query().Get("mode")) + if !ok { + http.Error(w, "invalid mode", http.StatusBadRequest) + return + } + if !topicsOK(r.URL.Query().Get("topics")) { + http.Error(w, "unsupported topics", http.StatusBadRequest) + return + } + + // Authenticate before the upgrade: a rejected consumer is never subscribed. + subject, err := s.auth.Authenticate(bearerToken(r)) + if err != nil { + telemetry.RecordStreamAuthFailure() + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + // Enforce caps before the upgrade too, so a rejected connection allocates + // no subscriber. + if !s.limiter.acquire(subject) { + http.Error(w, "too many connections", http.StatusServiceUnavailable) + return + } + + conn, err := s.upgrader.Upgrade(w, r, nil) + if err != nil { + // Upgrade already wrote the error response. + s.limiter.release(subject) + return + } + + sub := s.hub.Subscribe(s.cfg.BufferSize) + go s.serve(conn, sub, subject, mode == modeRaw) +} + +func (s *Server) serve(conn *websocket.Conn, sub *streamhub.Subscription, subject string, raw bool) { + // sub.Close() deletes the per-connection drop counter, so it can't leak; + // release() frees the cap slot. Both run on every exit path. + defer func() { + _ = conn.Close() + sub.Close() + s.limiter.release(subject) + }() + + conn.SetReadLimit(maxReadBytes) + _ = conn.SetReadDeadline(time.Now().Add(pongWait)) + conn.SetPongHandler(func(string) error { + return conn.SetReadDeadline(time.Now().Add(pongWait)) + }) + + // Read pump: consumers are read-only, so this only refreshes the idle + // deadline and closes done on any read error to unblock the writer. + done := make(chan struct{}) + go func() { + defer close(done) + for { + if _, _, err := conn.ReadMessage(); err != nil { + return + } + } + }() + + ping := time.NewTicker(pingPeriod) + defer ping.Stop() + + var lastDropped uint64 + for { + select { + case <-done: + return + case ev, ok := <-sub.Events(): + if !ok { + return + } + // Surface overflow first so the consumer learns it lagged before the + // next event lands. + if d := sub.Dropped(); d != lastDropped { + lastDropped = d + if err := s.writeJSON(conn, laggedFrame{Type: frameTypeLagged, Dropped: d}); err != nil { + return + } + } + if err := s.writeBlock(conn, ev, raw); err != nil { + return + } + telemetry.RecordStreamEventSent() + case <-ping.C: + _ = conn.SetWriteDeadline(time.Now().Add(writeWait)) + if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil { + return + } + } + } +} + +// blockFrame inlines BlockEvent's JSON fields next to the frame type tag. +type blockFrame struct { + Type string `json:"type"` + *streamhub.BlockEvent +} + +// laggedFrame reports the connection's cumulative dropped count after overflow. +type laggedFrame struct { + Type string `json:"type"` + Dropped uint64 `json:"dropped"` +} + +func (s *Server) writeBlock(conn *websocket.Conn, ev *streamhub.BlockEvent, raw bool) error { + f := blockFrame{Type: frameTypeBlock, BlockEvent: ev} + if !raw && ev.Raw != nil { + // ev is shared read-only; copy before dropping Raw for metadata mode. + cp := *ev + cp.Raw = nil + f.BlockEvent = &cp + } + return s.writeJSON(conn, f) +} + +func (s *Server) writeJSON(conn *websocket.Conn, v any) error { + _ = conn.SetWriteDeadline(time.Now().Add(writeWait)) + return conn.WriteJSON(v) +} + +// bearerToken reads the consumer JWT from the Authorization header, or from the +// "bearer." Sec-WebSocket-Protocol offer that browsers must use instead. +func bearerToken(r *http.Request) string { + if h := r.Header.Get("Authorization"); h != "" { + if tok, ok := strings.CutPrefix(h, "Bearer "); ok { + return strings.TrimSpace(tok) + } + } + for _, p := range websocket.Subprotocols(r) { + if tok, ok := strings.CutPrefix(p, bearerSubproto); ok { + return tok + } + } + return "" +} diff --git a/pkg/service/stream/ws_test.go b/pkg/service/stream/ws_test.go new file mode 100644 index 0000000..b1606b1 --- /dev/null +++ b/pkg/service/stream/ws_test.go @@ -0,0 +1,241 @@ +package stream + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/golang-jwt/jwt/v5" + "github.com/gorilla/websocket" + "github.com/stretchr/testify/require" + + "github.com/getoptimum/optimum-common/pkg/logger" + "github.com/getoptimum/optimum-gateway/pkg/entities" + "github.com/getoptimum/optimum-gateway/pkg/service/auth_token" + "github.com/getoptimum/optimum-gateway/pkg/service/jwks_verifier" + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" + "github.com/getoptimum/optimum-gateway/pkg/test_utils" +) + +// testAuth builds the consumer authenticator used by both WS and gRPC tests. +// requireAuth=false uses the allow-all (loopback) backend. +func testAuth(t *testing.T, requireAuth bool) (ConsumerAuthenticator, *test_utils.AuthTestRig) { + t.Helper() + rig := test_utils.NewAuthTestRig(t) + if !requireAuth { + return NewConsumerAuthenticator(nil, false), rig + } + m, err := auth_token.New(t.Context(), logger.NewAppSLogger(logger.Debug), rig.AppCfg(t)) + require.NoError(t, err) + return NewConsumerAuthenticator(m, true), rig +} + +func newWSTestServer(t *testing.T, cfg Config, requireAuth bool) (ts *httptest.Server, s *Server, hub *streamhub.Service, rig *test_utils.AuthTestRig) { + t.Helper() + var authenticator ConsumerAuthenticator + authenticator, rig = testAuth(t, requireAuth) + hub = streamhub.New() + s = NewServer(hub, authenticator, cfg, logger.NewAppSLogger(logger.Debug)) + ts = httptest.NewServer(s.httpSrv.Handler) + t.Cleanup(ts.Close) + return ts, s, hub, rig +} + +func streamToken(t *testing.T, rig *test_utils.AuthTestRig, subject string) string { + t.Helper() + return rig.MustSignToken(t, rig.PrivateKey, func(c *jwks_verifier.Claims) { + c.Audience = jwt.ClaimStrings{jwks_verifier.AudStream} + c.Subject = subject + }) +} + +func wsURL(ts *httptest.Server, query string) string { + return "ws" + strings.TrimPrefix(ts.URL, "http") + streamPath + query +} + +// dial returns the handshake status code (not the response) so callers never +// hold an unclosed body; that code is all the reject-path assertions need. +func dial(ts *httptest.Server, query, token string) (*websocket.Conn, int, error) { + h := http.Header{} + if token != "" { + h.Set("Authorization", "Bearer "+token) + } + conn, resp, err := websocket.DefaultDialer.Dial(wsURL(ts, query), h) + return conn, closeBody(resp), err +} + +// closeBody releases the handshake response body and returns its status code. +func closeBody(resp *http.Response) int { + if resp == nil { + return 0 + } + _ = resp.Body.Close() + return resp.StatusCode +} + +func sampleEvent() *streamhub.BlockEvent { + return &streamhub.BlockEvent{ + Slot: 42, + ProposerIndex: 7, + Topic: defaultTopic, + Source: entities.SourceLibP2P, + Raw: []byte("ssz-snappy-bytes"), + } +} + +func readFrame(t *testing.T, conn *websocket.Conn) map[string]any { + t.Helper() + _ = conn.SetReadDeadline(time.Now().Add(2 * time.Second)) + _, data, err := conn.ReadMessage() + require.NoError(t, err) + var m map[string]any + require.NoError(t, json.Unmarshal(data, &m)) + return m +} + +func waitSubscribed(t *testing.T, hub *streamhub.Service, n int) { + t.Helper() + require.Eventually(t, func() bool { return hub.SubscriberCount() == n }, time.Second, 5*time.Millisecond) +} + +func TestWS_RejectsBeforeUpgrade(t *testing.T) { + ts, _, hub, _ := newWSTestServer(t, Config{}, true) + for _, token := range []string{"not-a-jwt", ""} { + conn, code, err := dial(ts, "", token) + require.Equal(t, websocket.ErrBadHandshake, err) + require.Equal(t, http.StatusUnauthorized, code) + require.Nil(t, conn) + require.Zero(t, hub.SubscriberCount(), "rejected consumer must not create a subscriber") + } +} + +func TestWS_BlockFraming(t *testing.T) { + for _, tc := range []struct { + name string + query string + expectRaw bool + }{ + {"metadata omits raw", "?mode=metadata", false}, + {"raw includes bytes", "?mode=raw", true}, + } { + t.Run(tc.name, func(t *testing.T) { + ts, _, hub, rig := newWSTestServer(t, Config{}, true) + conn, _, err := dial(ts, tc.query, streamToken(t, rig, "sub-1")) + require.NoError(t, err) + defer conn.Close() + + waitSubscribed(t, hub, 1) + hub.Emit(sampleEvent()) + + f := readFrame(t, conn) + require.Equal(t, frameTypeBlock, f["type"]) + require.EqualValues(t, 42, f["slot"]) + raw, hasRaw := f["raw"] + require.Equal(t, tc.expectRaw, hasRaw) + if tc.expectRaw { + require.Equal(t, "c3N6LXNuYXBweS1ieXRlcw==", raw) + } + }) + } +} + +func TestWS_LaggedOnOverflow(t *testing.T) { + ts, _, hub, rig := newWSTestServer(t, Config{BufferSize: 1}, true) + conn, _, err := dial(ts, "", streamToken(t, rig, "sub-1")) + require.NoError(t, err) + defer conn.Close() + + waitSubscribed(t, hub, 1) + // Emit is non-blocking, so this fills the depth-1 buffer and drops the rest. + for range 3000 { + hub.Emit(sampleEvent()) + } + + var sawLagged bool + deadline := time.Now().Add(3 * time.Second) + for time.Now().Before(deadline) && !sawLagged { + f := readFrame(t, conn) + if f["type"] == frameTypeLagged { + require.Positive(t, f["dropped"]) + sawLagged = true + } + } + require.True(t, sawLagged, "a lagged frame must be sent after overflow") +} + +func TestWS_ConnectionCaps(t *testing.T) { + t.Run("global", func(t *testing.T) { + ts, _, _, rig := newWSTestServer(t, Config{MaxConns: 1}, true) + c1, _, err := dial(ts, "", streamToken(t, rig, "sub-a")) + require.NoError(t, err) + defer c1.Close() + + _, code, err := dial(ts, "", streamToken(t, rig, "sub-b")) + require.Error(t, err) + require.Equal(t, http.StatusServiceUnavailable, code) + }) + + t.Run("per subject", func(t *testing.T) { + ts, _, _, rig := newWSTestServer(t, Config{MaxConnsPerSub: 1}, true) + c1, _, err := dial(ts, "", streamToken(t, rig, "same")) + require.NoError(t, err) + defer c1.Close() + + _, code, err := dial(ts, "", streamToken(t, rig, "same")) + require.Error(t, err) + require.Equal(t, http.StatusServiceUnavailable, code) + + // A different subject is still admitted under the global cap. + c2, _, err := dial(ts, "", streamToken(t, rig, "other")) + require.NoError(t, err) + defer c2.Close() + }) +} + +func TestWS_LoopbackNoAuthAccepts(t *testing.T) { + ts, _, hub, _ := newWSTestServer(t, Config{}, false) + conn, _, err := dial(ts, "", "") + require.NoError(t, err) + defer conn.Close() + + waitSubscribed(t, hub, 1) + hub.Emit(sampleEvent()) + require.Equal(t, frameTypeBlock, readFrame(t, conn)["type"]) +} + +func TestWS_SubprotocolTokenNegotiatesMarkerOnly(t *testing.T) { + ts, _, hub, rig := newWSTestServer(t, Config{}, true) + tok := streamToken(t, rig, "sub-1") + + d := websocket.Dialer{Subprotocols: []string{wsSubprotocol, bearerSubproto + tok}} + conn, resp, err := d.Dial(wsURL(ts, ""), nil) + closeBody(resp) + require.NoError(t, err) + defer conn.Close() + + // Server must select only the marker, never echo the token. + require.Equal(t, wsSubprotocol, resp.Header.Get("Sec-WebSocket-Protocol")) + require.Equal(t, wsSubprotocol, conn.Subprotocol()) + waitSubscribed(t, hub, 1) +} + +func TestWS_CleanupOnClose(t *testing.T) { + ts, s, hub, rig := newWSTestServer(t, Config{}, true) + conn, _, err := dial(ts, "", streamToken(t, rig, "sub-1")) + require.NoError(t, err) + + waitSubscribed(t, hub, 1) + require.NoError(t, conn.Close()) + + // Close must unregister the subscriber (drop-counter entry included) and + // release the cap slot, so nothing leaks. + waitSubscribed(t, hub, 0) + require.Eventually(t, func() bool { + s.limiter.mu.Lock() + defer s.limiter.mu.Unlock() + return s.limiter.conns == 0 && len(s.limiter.perSub) == 0 + }, 2*time.Second, 10*time.Millisecond) +} diff --git a/pkg/service/streamhub/event.go b/pkg/service/streamhub/event.go new file mode 100644 index 0000000..ba83adb --- /dev/null +++ b/pkg/service/streamhub/event.go @@ -0,0 +1,22 @@ +// Package streamhub fans decoded beacon-block observations to consumers without backpressure. +// It drops new events when a consumer buffer is full (ADR-0011). +package streamhub + +import "github.com/getoptimum/optimum-gateway/pkg/entities" + +// BlockEvent identifies an observation by Slot, ProposerIndex, and Source (ADR-0011). +// Raw contains verbatim SSZ-Snappy data in raw mode and is omitted in metadata mode. +type BlockEvent struct { + Slot uint64 `json:"slot"` + ProposerIndex uint64 `json:"proposer_index"` + ParentRoot []byte `json:"parent_root"` + StateRoot []byte `json:"state_root"` + BlockSizeBytes uint64 `json:"block_size_bytes"` + Topic string `json:"topic"` + Source entities.Source `json:"source"` + ReceivedAtMs int64 `json:"received_at_ms"` + GatewayID string `json:"gateway_id"` + ForkDigest string `json:"fork_digest"` + Stale bool `json:"stale"` + Raw []byte `json:"raw,omitempty"` +} diff --git a/pkg/service/streamhub/service.go b/pkg/service/streamhub/service.go new file mode 100644 index 0000000..13654d3 --- /dev/null +++ b/pkg/service/streamhub/service.go @@ -0,0 +1,77 @@ +package streamhub + +import ( + "sync/atomic" + + "github.com/google/uuid" + + "github.com/getoptimum/optimum-common/pkg/syncx" + "github.com/getoptimum/optimum-gateway/pkg/service/telemetry" +) + +// DefaultBufferSize is the per-subscriber buffer depth used when Subscribe is +// given a non-positive size. +const DefaultBufferSize = 64 + +// Service broadcasts each BlockEvent to all subscribers. +type Service struct { + bc *syncx.Broadcaster[*BlockEvent] + dropped *syncx.RWMap[string, *atomic.Uint64] // listener key -> subscriber drop counter +} + +func New() *Service { + return &Service{ + bc: syncx.NewBroadcaster[*BlockEvent](), + dropped: syncx.NewRWMap[string, *atomic.Uint64](), + } +} + +// Subscribe registers a consumer with a bounded buffer of bufSize events. The +// caller drains Events() and must Close() when done. +func (s *Service) Subscribe(bufSize int) *Subscription { + if bufSize <= 0 { + bufSize = DefaultBufferSize + } + key := uuid.New().String() + ch := s.bc.RegisterBufferedListener(key, bufSize) + sub := &Subscription{svc: s, key: key, events: ch} + s.dropped.Store(key, &sub.dropped) + return sub +} + +// SubscriberCount is the number of active subscribers; it drops to zero once +// every Subscription is Closed. +func (s *Service) SubscriberCount() int { return s.dropped.Len() } + +// Emit broadcasts ev without blocking; on a full subscriber buffer the event is +// dropped. ev is shared read-only, so callers must not mutate it afterwards. +func (s *Service) Emit(ev *BlockEvent) { + s.bc.BroadcastTry(ev, func(key string, num uint64) { + if d, ok := s.dropped.Load(key); ok { + d.Add(num) + } + for range num { + telemetry.RecordStreamEventDropped() + } + }) +} + +// Subscription is one consumer's bounded view of the stream. +type Subscription struct { + svc *Service + key string + events chan *BlockEvent + dropped atomic.Uint64 +} + +// Events is the read side of the buffer; Close() closes it. +func (s *Subscription) Events() <-chan *BlockEvent { return s.events } + +// Dropped is the cumulative count of events dropped on overflow. +func (s *Subscription) Dropped() uint64 { return s.dropped.Load() } + +// Close unregisters the subscriber and closes its channel. +func (s *Subscription) Close() { + s.svc.bc.UnregisterListener(s.key) + s.svc.dropped.Delete(s.key) +} diff --git a/pkg/service/streamhub/service_test.go b/pkg/service/streamhub/service_test.go new file mode 100644 index 0000000..08986bd --- /dev/null +++ b/pkg/service/streamhub/service_test.go @@ -0,0 +1,52 @@ +package streamhub_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/getoptimum/optimum-gateway/pkg/service/streamhub" +) + +// A full buffer must not block Emit; it drops new events and keeps buffered ones. +func TestServiceDropsWhenFull(t *testing.T) { + s := streamhub.New() + sub := s.Subscribe(2) + + for i := 1; i <= 5; i++ { + s.Emit(&streamhub.BlockEvent{Slot: uint64(i)}) // no consumer draining + } + + require.Equal(t, uint64(3), sub.Dropped()) + require.Equal(t, []uint64{1, 2}, drainSlots(sub)) +} + +// After Close, buffered events stay readable, the channel then reports closed, +// and further Emit is a no-op. +func TestServiceCloseStopsSubscription(t *testing.T) { + s := streamhub.New() + sub := s.Subscribe(2) + s.Emit(&streamhub.BlockEvent{Slot: 1}) + + sub.Close() + + ev, ok := <-sub.Events() + require.True(t, ok) + require.Equal(t, uint64(1), ev.Slot) + _, ok = <-sub.Events() + require.False(t, ok) + + require.NotPanics(t, func() { s.Emit(&streamhub.BlockEvent{Slot: 2}) }) +} + +func drainSlots(sub *streamhub.Subscription) []uint64 { + var out []uint64 + for { + select { + case ev := <-sub.Events(): + out = append(out, ev.Slot) + default: + return out + } + } +} diff --git a/pkg/service/telemetry/metrics.go b/pkg/service/telemetry/metrics.go index 4353eeb..ed17414 100644 --- a/pkg/service/telemetry/metrics.go +++ b/pkg/service/telemetry/metrics.go @@ -168,6 +168,7 @@ func InitMetricsWithRegistry(log logger.AppLogger, pairedWith string) { initConnMetrics() initMumP2PMetrics() initP2PMetrics() + initStreamMetrics() publicIP, _, err := commonnet.GetExternalIPs() if err != nil { log.Error("could not get public IP", err) diff --git a/pkg/service/telemetry/stream.go b/pkg/service/telemetry/stream.go new file mode 100644 index 0000000..4ca238c --- /dev/null +++ b/pkg/service/telemetry/stream.go @@ -0,0 +1,72 @@ +package telemetry + +import ( + "github.com/prometheus/client_golang/prometheus" + + commonmetrics "github.com/getoptimum/optimum-common/pkg/telemetry" +) + +var ( + streamEventsDropped prometheus.Counter + streamEventsSent prometheus.Counter + streamAuthFailures prometheus.Counter + streamConnections prometheus.Gauge +) + +func initStreamMetrics() { + streamEventsDropped = commonmetrics.NewCounter( + "events_dropped_total", + "stream", + "Consumer block-stream events dropped due to a full subscriber buffer", + ) + streamEventsSent = commonmetrics.NewCounter( + "events_sent_total", + "stream", + "Consumer block-stream events written to a subscriber connection", + ) + streamAuthFailures = commonmetrics.NewCounter( + "auth_failures_total", + "stream", + "Consumer stream connections rejected because authentication failed", + ) + streamConnections = commonmetrics.NewGauge( + "connections", + "stream", + "Currently open consumer stream connections", + ) +} + +// RecordStreamEventDropped counts one dropped consumer event. +func RecordStreamEventDropped() { + if enabledMetrics { + streamEventsDropped.Inc() + } +} + +// RecordStreamEventSent counts one consumer event written to a connection. +func RecordStreamEventSent() { + if enabledMetrics { + streamEventsSent.Inc() + } +} + +// RecordStreamAuthFailure counts one rejected consumer connection. +func RecordStreamAuthFailure() { + if enabledMetrics { + streamAuthFailures.Inc() + } +} + +// IncStreamConnections marks a consumer connection as opened. +func IncStreamConnections() { + if enabledMetrics { + streamConnections.Inc() + } +} + +// DecStreamConnections marks a consumer connection as closed. +func DecStreamConnections() { + if enabledMetrics { + streamConnections.Dec() + } +} diff --git a/proto/getoptimum/optimum_gateway/service/stream/v1/stream.proto b/proto/getoptimum/optimum_gateway/service/stream/v1/stream.proto new file mode 100644 index 0000000..17d359b --- /dev/null +++ b/proto/getoptimum/optimum_gateway/service/stream/v1/stream.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package getoptimum.optimum_gateway.service.stream.v1; + +option go_package = "github.com/getoptimum/optimum-gateway/pkg/service/stream/v1"; + +// BlockStreamService streams decoded beacon-block observations to consumers (ADR-0011). +service BlockStreamService { + // Subscribe opens a read-only server stream of block observations. + rpc Subscribe(SubscribeRequest) returns (stream BlockEvent); +} + +// SubscribeRequest selects the payload mode and topics for a subscription. +message SubscribeRequest { + string mode = 1; // "metadata" (default) or "raw" + repeated string topics = 2; // validated only; v1 has one topic, so nothing is filtered +} + +// BlockEvent is one frame: a block observation or a lag signal (ADR-0011). +message BlockEvent { + // frame tells an observation apart from a control signal. + oneof frame { + Block block = 1; + Lagged lagged = 2; + } +} + +// Block is one block observation (fields mirror the streamhub hub type). +message Block { + uint64 slot = 1; + uint64 proposer_index = 2; + bytes parent_root = 3; + bytes state_root = 4; + uint64 block_size_bytes = 5; + string topic = 6; + string source = 7; + int64 received_at_ms = 8; + string gateway_id = 9; + string fork_digest = 10; + bool stale = 11; + bytes raw = 12; // present only in raw mode +} + +// Lagged reports the cumulative drop count after a buffer overflow. +message Lagged { + uint64 dropped = 1; +}