diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 271595b..8a0d9d4 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -29,7 +29,7 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: '1.22.x' + go-version: '1.23.x' - name: Log in to the Container registry uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 diff --git a/.gitignore b/.gitignore index c6d0140..4e8fbbe 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ .envrc .env .DS_Store -firehose-data* \ No newline at end of file +firehose-data* +/.fleet/settings.json diff --git a/Dockerfile b/Dockerfile index 3f03af0..7685ad6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22-alpine as build +FROM golang:1.23.4-alpine as build WORKDIR /app COPY go.mod go.sum ./ diff --git a/cmd/apps/substreams_tier1.go b/cmd/apps/substreams_tier1.go index 98a3de2..00a6677 100644 --- a/cmd/apps/substreams_tier1.go +++ b/cmd/apps/substreams_tier1.go @@ -24,12 +24,16 @@ import ( "github.com/spf13/viper" "github.com/streamingfast/cli" "github.com/streamingfast/dauth" + "github.com/streamingfast/dgrpc" discoveryservice "github.com/streamingfast/dgrpc/server/discovery-service" firecore "github.com/streamingfast/firehose-core" "github.com/streamingfast/firehose-core/launcher" "github.com/streamingfast/logging" app "github.com/streamingfast/substreams/app" + "github.com/streamingfast/substreams/client" + "github.com/streamingfast/substreams/orchestrator/work" "github.com/streamingfast/substreams/wasm" + pbworker "github.com/streamingfast/worker-pool-protocol/pb/sf/worker/v1" "go.uber.org/zap" ) @@ -68,6 +72,8 @@ func RegisterSubstreamsTier1App[B firecore.Block](chain *firecore.Chain[B], root This is useful to prevent the tier1 from being overwhelmed by too many requests, most client auto-reconnects on 'Unavailable' code so they should end up on another tier1 instance, assuming you have proper auto-scaling of the number of instances available. `)) + cmd.Flags().String("substreams-tier1-global-worker-pool-address", "", "Address of the global worker pool to use for the substreams tier1. (disabled if empty)") + cmd.Flags().Duration("substreams-tier1-global-worker-pool-keep-alive-delay", 25*time.Second, "Delay between two keep alive call to the global worker pool. Default is 25s") // all substreams registerCommonSubstreamsFlags(cmd) return nil @@ -127,6 +133,8 @@ func RegisterSubstreamsTier1App[B firecore.Block](chain *firecore.Chain[B], root if err != nil { return nil, fmt.Errorf("getting temporary directory: %w", err) } + substreamsGlobalWorkerPoolAddress := viper.GetString("substreams-tier1-global-worker-pool-address") + substreamsGlobalWorkerPoolKeepAliveDelay := viper.GetDuration("substreams-tier1-global-worker-pool-keep-alive-delay") config := app.NewDefaultTier1Config() config.MeteringConfig = GetCommonMeteringPluginValue() @@ -153,6 +161,31 @@ func RegisterSubstreamsTier1App[B firecore.Block](chain *firecore.Chain[B], root config.GRPCShutdownGracePeriod = time.Second config.ServiceDiscoveryURL = serviceDiscoveryURL + subRequestsClientConfig := client.NewSubstreamsClientConfig( + config.SubrequestsEndpoint, + "", + client.None, + config.SubrequestsInsecure, + config.SubrequestsPlaintext, + "substreams_tier1", + ) + + clientFactory := client.NewInternalClientFactory(subRequestsClientConfig) + workerPoolFactory := work.NewSimpleWorkerPoolFactory(clientFactory).WorkerPool + + if substreamsGlobalWorkerPoolAddress != "" { + grpcClientConnection, err := dgrpc.NewInternalNoWaitClientConn(substreamsGlobalWorkerPoolAddress) + if err != nil { + return nil, fmt.Errorf("unable to create grpc client connection to global worker pool: %w", err) + } + workerPoolClient := pbworker.NewWorkerPoolClient(grpcClientConnection) + workerPoolFactory = work.NewGlobalWorkerPoolFactory( + workerPoolClient, + clientFactory, + substreamsGlobalWorkerPoolKeepAliveDelay, + ).WorkerPool + } + return app.NewTier1(appLogger, config, &app.Tier1Modules{ Authenticator: authenticator, @@ -160,6 +193,7 @@ func RegisterSubstreamsTier1App[B firecore.Block](chain *firecore.Chain[B], root HeadBlockNumberMetric: ss1HeadBlockNumMetric, CheckPendingShutDown: runtime.IsPendingShutdown, InfoServer: runtime.InfoServer, + WorkerPoolFactory: workerPoolFactory, }), nil }, }) diff --git a/cmd/apps/substreams_tier2.go b/cmd/apps/substreams_tier2.go index 7d4003a..a1d675d 100644 --- a/cmd/apps/substreams_tier2.go +++ b/cmd/apps/substreams_tier2.go @@ -21,12 +21,14 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/streamingfast/dgrpc" discoveryservice "github.com/streamingfast/dgrpc/server/discovery-service" firecore "github.com/streamingfast/firehose-core" "github.com/streamingfast/firehose-core/launcher" "github.com/streamingfast/logging" "github.com/streamingfast/substreams/app" "github.com/streamingfast/substreams/wasm" + pbworker "github.com/streamingfast/worker-pool-protocol/pb/sf/worker/v1" "go.uber.org/zap" ) @@ -44,7 +46,7 @@ func RegisterSubstreamsTier2App[B firecore.Block](chain *firecore.Chain[B], root cmd.Flags().String("substreams-tier2-grpc-listen-addr", firecore.SubstreamsTier2GRPCServingAddr, "Address on which the substreams tier2 will listen. Default is plain-text, appending a '*' to the end to jkkkj") cmd.Flags().String("substreams-tier2-discovery-service-url", "", "URL to advertise presence to the grpc discovery service") //traffic-director://xds?vpc_network=vpc-global&use_xds_reds=true cmd.Flags().Uint64("substreams-tier2-max-concurrent-requests", 0, "Maximum number of concurrent requests allowed on the server. When the tier2 service hits this limit, it will set itself as 'Not Ready' until requests are processed. Default 0 (no limit)") - + cmd.Flags().String("substreams-tier2-global-worker-pool-address", "", "Address of the global worker pool to use for the substreams tier1. (disabled if empty)") // all substreams registerCommonSubstreamsFlags(cmd) return nil @@ -56,6 +58,7 @@ func RegisterSubstreamsTier2App[B firecore.Block](chain *firecore.Chain[B], root maximumConcurrentRequests := viper.GetUint64("substreams-tier2-max-concurrent-requests") executionTimeout := viper.GetDuration("substreams-block-execution-timeout") + substreamsGlobalWorkerPoolAddress := viper.GetString("substreams-tier2-global-worker-pool-address") tracing := os.Getenv("SUBSTREAMS_TRACING") == "modules_exec" @@ -87,6 +90,16 @@ func RegisterSubstreamsTier2App[B firecore.Block](chain *firecore.Chain[B], root return nil, fmt.Errorf("getting temporary directory: %w", err) } + var remoteWorkerPoolClient pbworker.WorkerPoolClient + if substreamsGlobalWorkerPoolAddress != "" { + grpcClientConnection, err := dgrpc.NewInternalClientConn(substreamsGlobalWorkerPoolAddress) + if err != nil { + return nil, fmt.Errorf("unable to create grpc client connection to global worker pool: %w", err) + } + remoteWorkerPoolClient = pbworker.NewWorkerPoolClient(grpcClientConnection) + + } + return app.NewTier2(appLogger, &app.Tier2Config{ Tracing: tracing, @@ -100,6 +113,7 @@ func RegisterSubstreamsTier2App[B firecore.Block](chain *firecore.Chain[B], root MaximumConcurrentRequests: maximumConcurrentRequests, }, &app.Tier2Modules{ CheckPendingShutDown: runtime.IsPendingShutdown, + RemoteWorkerClient: remoteWorkerPoolClient, }), nil }, }) diff --git a/devel/substreams/substreams.yaml b/devel/substreams/substreams.yaml index 0cb3ea9..971d364 100644 --- a/devel/substreams/substreams.yaml +++ b/devel/substreams/substreams.yaml @@ -4,11 +4,18 @@ start: - substreams-tier2 flags: common-live-blocks-addr: + common-auth-plugin: trust:// common-merged-blocks-store-url: "$COMMON_MERGED_BLOCKS_STORE_URL" + substreams-tier1-block-type: "sf.ethereum.type.v2.Block" # Also set FIRECORE_COMMON_FIRST_STREAMABLE_BLOCK to your local value, if not starting at 0 ignore-advertise-validation: true - substreams-tier1-grpc-listen-addr: :9000 + substreams-tier1-grpc-listen-addr: :9000* substreams-tier1-subrequests-insecure: false substreams-tier1-subrequests-plaintext: true substreams-tier1-subrequests-endpoint: :9001 + + substreams-tier1-global-worker-pool-address: :9002 + substreams-tier1-global-worker-pool-keep-alive-delay: 25s + substreams-tier2-grpc-listen-addr: :9001 + substreams-tier2-global-worker-pool-address: :9002 diff --git a/go.mod b/go.mod index f791b99..03abb2d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/streamingfast/firehose-core -go 1.22.7 +go 1.23.4 require ( buf.build/gen/go/bufbuild/reflect/connectrpc/go v1.16.1-20240117202343-bf8f65e8876c.1 @@ -31,7 +31,8 @@ require ( github.com/streamingfast/payment-gateway v0.0.0-20240426151444-581e930c76e2 github.com/streamingfast/pbgo v0.0.6-0.20250114182320-0b43084f4000 github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 - github.com/streamingfast/substreams v1.12.5-0.20250206200955-a523a786b3ef + github.com/streamingfast/substreams v1.12.5-0.20250218151206-f976e8686cfe + github.com/streamingfast/worker-pool-protocol v0.0.0-20250211140743-fb8ffbc05fbc github.com/stretchr/testify v1.10.0 github.com/test-go/testify v1.1.4 go.uber.org/multierr v1.10.0 @@ -51,7 +52,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 // indirect github.com/alecthomas/participle v0.7.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/bobg/go-generics/v3 v3.4.0 // indirect + github.com/bobg/go-generics/v3 v3.5.0 // indirect github.com/bufbuild/protocompile v0.4.0 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect github.com/charmbracelet/x/ansi v0.4.2 // indirect @@ -69,6 +70,7 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.uber.org/mock v0.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect ) @@ -87,14 +89,14 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.26.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221018185641-36f91511cfd7 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.39.0 // indirect github.com/KimMachineGun/automemlimit v0.2.4 github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/RoaringBitmap/roaring v1.9.1 // indirect github.com/ShinyTrinkets/meta-logger v0.2.0 // indirect github.com/abourget/llerrgroup v0.2.0 - github.com/aws/aws-sdk-go v1.44.325 // indirect + github.com/aws/aws-sdk-go v1.49.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.12.0 // indirect github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d // indirect @@ -186,7 +188,7 @@ require ( go.uber.org/atomic v1.10.0 go.uber.org/automaxprocs v1.5.1 golang.org/x/crypto v0.32.0 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.18.0 // indirect golang.org/x/net v0.34.0 golang.org/x/oauth2 v0.25.0 golang.org/x/sync v0.10.0 // indirect @@ -194,8 +196,8 @@ require ( golang.org/x/term v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.9.0 // indirect - google.golang.org/api v0.218.0 // indirect - google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/api v0.219.0 // indirect + google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/olivere/elastic.v3 v3.0.75 diff --git a/go.sum b/go.sum index 07e4e29..1eb15e7 100644 --- a/go.sum +++ b/go.sum @@ -1573,8 +1573,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221018185641-36f91511cfd7 h1:4cXY9jZO7UoRYKyD+CssnBlwn2HTeUzCQ1b44PJijzc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221018185641-36f91511cfd7/go.mod h1:FwtSi1M0P8cuMlHxVso1vcivukprUr1bBwf15CRypOI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.39.0 h1:sFZRLgbxhstmHGT+fqg88T4SpwCQQuQ/KnsSDDM2g60= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.39.0/go.mod h1:ML9pY4SjdBE/fTBnIwTaJu+5ZahLW3e/snaUPuOdcck= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/KimMachineGun/automemlimit v0.2.4 h1:GBty8TK8k0aJer1Pq5/3Vdt2ef+YpLhcqNo+PSD5CoI= github.com/KimMachineGun/automemlimit v0.2.4/go.mod h1:38QAnnnNhnFuAIW3+aPlaVUHqzE9buJYZK3m/jsra8E= @@ -1617,8 +1617,8 @@ github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2 github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.325 h1:jF/L99fJSq/BfiLmUOflO/aM+LwcqBm0Fe/qTK5xxuI= -github.com/aws/aws-sdk-go v1.44.325/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA= +github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/azer/is-terminal v1.0.0 h1:COvj8jmg2xMz0CqHn4Uu8X1m7Dmzmu0CpciBaLtJQBg= @@ -1633,8 +1633,8 @@ github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6 github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d h1:fSlGu5ePbkjBidXuj2O5j9EcYrVB5Cr6/wdkYyDgxZk= github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d/go.mod h1:yCBkgASmKHgUOFjK9h1sOytUVgA+JkQjqj3xYP4AdWY= -github.com/bobg/go-generics/v3 v3.4.0 h1:XxTJxH843OknMgw//HGQXklJCZ0eacdt5EABfNcKFr8= -github.com/bobg/go-generics/v3 v3.4.0/go.mod h1:gCsHnnRz88zpXpdsWPyDmjg1tYQPmpbUQbM4MW8z9Jc= +github.com/bobg/go-generics/v3 v3.5.0 h1:OdBXzCRCO4e3Z7FQz1maEN2Q5LFYHc7vIK8EXcS4xQQ= +github.com/bobg/go-generics/v3 v3.5.0/go.mod h1:wGlMLQER92clsh3cJoQjbUtUEJ03FoxnGhZjaWhf4fM= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= @@ -2026,8 +2026,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= -github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= @@ -2195,10 +2195,12 @@ github.com/streamingfast/shutter v1.5.0 h1:NpzDYzj0HVpSiDJVO/FFSL6QIK/YKOxY0gJAt github.com/streamingfast/shutter v1.5.0/go.mod h1:B/T6efqdeMGbGwjzPS1ToXzYZI4kDzI5/u4I+7qbjY8= github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 h1:Y15G1Z4fpEdm2b+/70owI7TLuXadlqBtGM7rk4Hxrzk= github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0/go.mod h1:/Rnz2TJvaShjUct0scZ9kKV2Jr9/+KBAoWy4UMYxgv4= -github.com/streamingfast/substreams v1.12.5-0.20250206200955-a523a786b3ef h1:9G/uaVUHAZxC3ZCNqk2eRfeS5Ybvr4owhzprgGVgAbU= -github.com/streamingfast/substreams v1.12.5-0.20250206200955-a523a786b3ef/go.mod h1:UTAuVG93xbfHQ5cmbWHJWGR1ayg8F0k2c1CrA2sQmAk= +github.com/streamingfast/substreams v1.12.5-0.20250218151206-f976e8686cfe h1:N3OAZ/rQHSMP+IiAlEc+93DDfZJRNNHK1mYHFkMkdgs= +github.com/streamingfast/substreams v1.12.5-0.20250218151206-f976e8686cfe/go.mod h1:B/AgcrIiNVxEyMNrTsSNwIJ3m4b1/FYUEuB0tgw0GvI= github.com/streamingfast/wazero v0.0.0-20241202185309-91287c3640ed h1:LU6/c376zP1cMAo9L6rFLyjo0W7RU+hIh7BegH8Zo5M= github.com/streamingfast/wazero v0.0.0-20241202185309-91287c3640ed/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/streamingfast/worker-pool-protocol v0.0.0-20250211140743-fb8ffbc05fbc h1:WrgK+ECYQpYd5n+IG7rDR88lkaXw3wef1UKlEBvZ6Bs= +github.com/streamingfast/worker-pool-protocol v0.0.0-20250211140743-fb8ffbc05fbc/go.mod h1:fq44dFx8K9S3/9QOoIVk0s+ptEscfpQmftLog/9WYU4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -2314,6 +2316,8 @@ go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -2407,8 +2411,9 @@ golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2707,8 +2712,9 @@ golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2788,8 +2794,8 @@ google.golang.org/api v0.182.0/go.mod h1:cGhjy4caqA5yXRzEhkHI8Y9mfyC2VLTlER2l08x google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= google.golang.org/api v0.184.0/go.mod h1:CeDTtUEiYENAf8PPG5VZW2yNp2VM3VWbCeTioAZBTBA= google.golang.org/api v0.187.0/go.mod h1:KIHlTc4x7N7gKKuVsdmfBXN13yEEWXWFURWY6SBp2gk= -google.golang.org/api v0.218.0 h1:x6JCjEWeZ9PFCRe9z0FBrNwj7pB7DOAqT35N+IPnAUA= -google.golang.org/api v0.218.0/go.mod h1:5VGHBAkxrA/8EFjLVEYmMUJ8/8+gWWQ3s4cFH0FxG2M= +google.golang.org/api v0.219.0 h1:nnKIvxKs/06jWawp2liznTBnMRQBEPpGo7I+oEypTX0= +google.golang.org/api v0.219.0/go.mod h1:K6OmjGm+NtLrIkHxv1U3a0qIf/0JOvAHd5O/6AoyKYE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2923,8 +2929,8 @@ google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCe google.golang.org/genproto v0.0.0-20240528184218-531527333157/go.mod h1:ubQlAQnzejB8uZzszhrTCU2Fyp6Vi7ZE5nn0c3W8+qQ= google.golang.org/genproto v0.0.0-20240604185151-ef581f913117/go.mod h1:lesfX/+9iA+3OdqeCpoDddJaNxVB1AB6tD7EfqMmprc= google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:s7iA721uChleev562UJO2OYB0PPT9CMFjV+Ce7VJH5M= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422 h1:6GUHKGv2huWOHKmDXLMNE94q3fBDlEHI+oTRIZSebK0= +google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422/go.mod h1:1NPAxoesyw/SgLPqaUp9u1f9PWCLAk/jVmhx7gJZStg= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=