From 33112aa4323bc7d2640c4c2df1464afb8ae1764d Mon Sep 17 00:00:00 2001 From: Ehsan Noureddin Moosa Date: Sat, 25 May 2024 01:03:55 +0300 Subject: [PATCH] rephrase readmes --- README.MD | 37 +++-- example/README.MD | 8 +- kit/README.MD | 224 ++++++++++++---------------- rony/README.MD | 258 ++++++++++++++++----------------- std/clusters/p2pcluster/go.mod | 46 ++++-- std/clusters/p2pcluster/go.sum | 158 ++++++++++++++++---- 6 files changed, 399 insertions(+), 332 deletions(-) diff --git a/README.MD b/README.MD index 4b0be1cc..1c3a1bf3 100644 --- a/README.MD +++ b/README.MD @@ -1,29 +1,26 @@ # RonyKIT -RonyKIT is a set of tools that are designed to be extendable and flexible to write a complete API/Edge server quickly. -When you develop API handlers using RonyKIT framework, you can support RPC and REST style APIs without re-writing the +RonyKIT is a collection of tools designed to be both extendable and flexible, enabling the rapid development of a complete API/Edge server. +With the RonyKIT framework, you can create API handlers that support both RPC and REST style APIs without the need to rewrite the endpoint layer multiple times. -If you are looking for a framework to write your API/Edge server, you can use `rony` package directly, which provides -an easy-to-use framework and with help of Go Generics, it provides a very clean and easy to use API. This is the -recommended way to use RonyKIT framework. However, if you want to have more control over your API server, and are -very concern about performance and memory usage, you can use `kit` package directly, which is the heart of the RonyKIT -framework. +If you are seeking a framework to develop your API/Edge server, you can directly use the `rony` package. This package provides an +intuitive framework, leveraging Go Generics to offer a clean and user-friendly API. This is the recommended approach for using +the RonyKIT framework. However, if you require greater control over your API server and have concerns about performance and +memory usage, you can directly utilize the `kit` package, which forms the core of the RonyKIT framework. -- For more information about `rony` package, please visit [rony](./rony/README.MD) -- For more information about `kit` package, please visit [kit](./kit/README.MD) +- For more information about the `rony` package, please visit [rony](./rony/README.MD). +- For more information about the `kit` package, please visit [kit](./kit/README.MD). # RonyKIT Standard Packages -This repository is holding all the projects related to RonyKIT. The main package which is the heart of -the RonyKIT framework is [kit](./kit) and the standard modules are in the /std folders. - -| Package | BundleType | Version | Description | -|--------------|------------|---------|--------------------------------------------------------------------------------------------------------------------------------------| -| KIT | - | v0.14.0 | the main package of the RonyKIT framework | -| fasthttp | Gateway | v0.14.0 | the Gateway bundle implemented using [fasthttp](https://github.com/valyala/fasthttp) framework | -| fastws | Gateway | v0.14.0 | the Gateway bundle implemented using [gnet](https://github.com/panjf2000/gnet) and [gobwas](https://github.com/gobwas/ws) frameworks | -| silverhttp | Gateway | v0.14.0 | the Gateway bundle implemented using the new kid super-fast http server [silverlining](https://github.com/go-www/silverlining) | -| rediscluster | Cluster | v0.14.0 | the Cluster bundle implemented using [redis](https://github.com/go-redis/redis) | -| p2pcluster | Cluster | v0.14.0 | the Cluster bundle implemented using [p2p](https://github.com/libp2p/go-libp2p) | | +This repository contains all projects related to RonyKIT. The central package, which is the core of the RonyKIT framework, is [kit](./kit), with standard modules located in the /std folders. +| Package | Bundle Type | Version | Description | +|--------------|-------------|---------|--------------------------------------------------------------------------------------------------------------------------------------| +| KIT | - | v0.14.0 | The main package of the RonyKIT framework | +| fasthttp | Gateway | v0.14.0 | The Gateway bundle implemented using the [fasthttp](https://github.com/valyala/fasthttp) framework | +| fastws | Gateway | v0.14.0 | The Gateway bundle implemented using [gnet](https://github.com/panjf2000/gnet) and [gobwas](https://github.com/gobwas/ws) frameworks | +| silverhttp | Gateway | v0.14.0 | The Gateway bundle implemented using the new super-fast HTTP server [silverlining](https://github.com/go-www/silverlining) | +| rediscluster | Cluster | v0.14.0 | The Cluster bundle implemented using [redis](https://github.com/go-redis/redis) | +| p2pcluster | Cluster | v0.14.0 | The Cluster bundle implemented using [p2p](https://github.com/libp2p/go-libp2p) | diff --git a/example/README.MD b/example/README.MD index 6a57b9cd..a177fae4 100644 --- a/example/README.MD +++ b/example/README.MD @@ -1,6 +1,6 @@ # Examples -This directory contains some examples to show how to use the ronykit library. The first four -examples use the `kit` package directly and the rest use the `rony` package. -Examples are short and simple to understand. They are not meant to be used in production, they just -show how to use the library. +This directory houses several examples showcasing the usage of the ronykit library. The initial four examples +utilize the `kit` package directly, while the subsequent ones utilize the `rony` package. These examples are +designed to be concise and straightforward, aimed at illustrating how to utilize the library's functionalities. +They are not intended for production use but rather serve as instructional aids. diff --git a/kit/README.MD b/kit/README.MD index c9b068e6..2704c2c9 100644 --- a/kit/README.MD +++ b/kit/README.MD @@ -1,34 +1,16 @@ -[//]: # () - -[//]: # ( Build Status) - -[//]: # () - - Go Report Card - - - GitHub release (latest by date including pre-releases) - - - Codecov Status - - # Kit -RonyKit is a library written in Go (Golang), provides the abstraction layer for creating an API server. By defining separate -components for each task, you are almost free to develop your API server using RPC (Proto/JSON/...), REST, GraphQL or even with your -in-house defined protocol. However, some components are implemented in the 'std' which make it easy to use RonyKit out of the box. -In RonyKIT, I wanted to make it more flexible but still very performant. I will maintain two bundles one based on -[fasthttp](https://github.com/valyala/fasthttp) and the other provides only rpc over websocket based on two very fast -libraries [gobwas](https://github.com/gobwas/ws) and [gnet](https://github.com/panjf2000/gnet), however you are not limited to use those, -and -can build your own Bundles. To have a better understanding of how it is going to work please check examples folder. -in [simple-rest-server](../example/ex-02-rest) it shows a very simple hello world app. -in [mixed-jsonrpc-rest](../example/ex-01-rpc) it shows how you can write your services once but use them with multiple formats like -REST or RPC. +RonyKit is a Go (Golang) library that provides an abstraction layer for creating API servers. By defining separate components +for each task, you can develop your API server using RPC (Proto/JSON/...), REST, GraphQL, or even custom protocols. +Some components are implemented in the 'std' directory, making it easy to use RonyKit out of the box. RonyKit aims to be +both flexible and performant. It includes two bundles: one based on [fasthttp](https://github.com/valyala/fasthttp) and +another providing RPC over WebSocket using [gobwas](https://github.com/gobwas/ws) and [gnet](https://github.com/panjf2000/gnet). +However, you are free to build your own bundles. For examples, check the examples folder, such +as [simple-rest-server](../example/ex-02-rest) for a simple hello world app and [mixed-jsonrpc-rest](../example/ex-01-rpc) for services +using multiple formats like REST and RPC. - [Installation](#installation) -- [Quick start](#quick-start) +- [Quick Start](#quick-start) - [Kit Components](#kit-components) - [1. Handler](#1-handler) - [2. Contract](#2-contract) @@ -36,34 +18,32 @@ REST or RPC. - [4. Gateway](#4-gateway) - [5. Cluster](#5-cluster) - [6. EdgeServer](#6-edgeserver) -- [KIT Storage layers](#kit-storage-layers) - +- [KIT Storage Layers](#kit-storage-layers) ## Installation -To install RonyKIT package, you need to install Go and set your Go workspace first. +To install the RonyKIT package, you need to first install Go and set your Go workspace. -First need to install[Go](https://golang.org/) (**version 1.17+ is required**), then you can use the below Go command to install -RonyKIT. +First, install [Go](https://golang.org/) (version 1.17+ is required). Then use the following command to install RonyKIT: ```sh $ go get -u github.com/clubpay/ronykit/kit/... ``` -## Quick start +## Quick Start -You can find some sample codes in the [Examples](../example) folder. +You can find sample code in the [Examples](../example) folder. ## Define Services and Contracts -In RonyKIT(Kit) you better to define the description of your services and their contracts using `desc` package, -and it provides you many helper methods. Although you can create your concrete implementations of kit.Service -and kit.Contract, but we strongly recommend you to use `desc` package. +In RonyKIT (Kit), it's best to define the description of your services and their contracts using the `desc` package, which +provides many helper methods. While you can create your own concrete implementations of `kit.Service` and `kit.Contract`, +we strongly recommend using the `desc` package. -When you develop a handler with Kit package you need to think about the input and output of your API, and define -these DTOs by defining appropriate structs. +When developing a handler with the Kit package, you need to consider the input and output of your API and define these +DTOs by creating appropriate structs. -For example, if you want to implement an `Echo` handler you can write your handler like this: +For example, to implement an `Echo` handler, you can write your handler like this: ```go package main @@ -89,9 +69,8 @@ func echoHandler(ctx *kit.Context) { } ``` -Then you can write the service descriptor to define how your handler is going to be accessed from the Gateway of -your server. For example if you have an HTTP Gateway and you need your handler to be accessible using REST API, -you can define your service descriptor like this: +Then you can write the service descriptor to define how your handler will be accessed from the Gateway of your server. +For an HTTP Gateway to access your handler using a REST API, define your service descriptor like this: ```go package main @@ -102,141 +81,126 @@ import ( "github.com/clubpay/ronykit/std/gateways/fasthttp" ) - func MyServiceDesc() *desc.Service { - return desc.NewService("MyServiceName"). - SetEncoding(kit.JSON). - AddContract( - desc.NewContract(). - SetInput(&EchoRequest{}). // This tells that we expect the incoming request resolves to EchoRequest struct - SetOutput(&EchoResponse{}). // This tells that we expect the outgoing response resolves to EchoResponse struct - AddSelector(fasthttp.GET("/echo/:Id")). // This tells that we want to use echoHandler for GET requests with /echo/:Id path - AddSelector(fasthttp.POST("/echo")). // This tells that we want to use echoHandler for POST requests with /echo path - SetHandler(echoHandler), // This tells that we want to use echoHandler as the handler of this contract - ) + return desc.NewService("MyServiceName"). + SetEncoding(kit.JSON). + AddContract( + desc.NewContract(). + SetInput(&EchoRequest{}). // Incoming request resolves to EchoRequest struct + SetOutput(&EchoResponse{}). // Outgoing response resolves to EchoResponse struct + AddSelector(fasthttp.GET("/echo/:Id")). // Use echoHandler for GET requests with /echo/:Id path + AddSelector(fasthttp.POST("/echo")). // Use echoHandler for POST requests with /echo path + SetHandler(echoHandler), // Use echoHandler as the handler for this contract + ) } ``` -In the ServiceDescriptor we defined two REST endpoints which our Handler would be served. -RonyKIT's EdgeServer tries its best to fill the input struct (i.e., EchoRequest) from the parameters: urlParam, queryParam or request's -body. -If you have a more complex case, you can also add your own custom decoder when you add your selector to the contract. +In the `ServiceDescriptor`, we defined two REST endpoints which our Handler would serve. RonyKIT's EdgeServer tries its best to fill the +input struct (i.e., EchoRequest) from URL parameters, query parameters, or the request's body. For more complex cases, you can add +your own custom decoder when adding your selector to the contract. -The last step is to set up our EdgeServer and bind our desired Gateway bundle and the `MyServiceDesc`. -The following code shows how we can do that: +The final step is to set up the EdgeServer, bind the desired Gateway bundle, and the `MyServiceDesc`. The following code shows +how to do this: ```go package main import ( - "github.com/clubpay/ronykit/kit" - "github.com/clubpay/ronykit/kit/desc" - "github.com/clubpay/ronykit/std/gateways/fasthttp" + "context" + "os" + + "github.com/clubpay/ronykit/kit" + "github.com/clubpay/ronykit/kit/desc" + "github.com/clubpay/ronykit/std/gateways/fasthttp" ) type EchoRequest struct { - ID string `json:"Id"` - Timestamp int64 `json:"timestamp"` + ID string `json:"Id"` + Timestamp int64 `json:"timestamp"` } type EchoResponse struct { - ID string `json:"Id"` + ID string `json:"Id"` } func echoHandler(ctx *kit.Context) { - req := ctx.In().GetMsg().(*EchoRequest) + req := ctx.In().GetMsg().(*EchoRequest) - ctx.In(). - Reply(). - SetMsg(&EchoResponse{ID: req.ID}). - Send() + ctx.In(). + Reply(). + SetMsg(&EchoResponse{ID: req.ID}). + Send() } - var MyServiceDesc desc.ServiceDescFunc = func() *desc.Service { - return desc.NewService("MyServiceName"). - SetEncoding(kit.JSON). - AddContract( - desc.NewContract(). - SetInput(&EchoRequest{}). - SetOutput(&EchoResponse{}). - AddSelector(fasthttp.GET("/echo/:Id")). - AddSelector(fasthttp.POST("/echo")). - SetHandler(echoHandler), - ) + return desc.NewService("MyServiceName"). + SetEncoding(kit.JSON). + AddContract( + desc.NewContract(). + SetInput(&EchoRequest{}). + SetOutput(&EchoResponse{}). + AddSelector(fasthttp.GET("/echo/:Id")). + AddSelector(fasthttp.POST("/echo")). + SetHandler(echoHandler), + ) } func main() { - defer kit.NewServer( - kit.WithGateway( - fasthttp.MustNew( - fasthttp.Listen(":80"), - ), - ), - kit.WithServiceDesc(MyServiceDesc()), - ). - Start(context.TODO()). - PrintRoutes(os.Stdout). - Shutdown(context.TODO(), os.Kill, os.Interrupt) + defer kit.NewServer( + kit.WithGateway( + fasthttp.MustNew( + fasthttp.Listen(":80"), + ), + ), + kit.WithServiceDesc(MyServiceDesc()), + ). + Start(context.TODO()). + PrintRoutes(os.Stdout). + Shutdown(context.TODO(), os.Kill, os.Interrupt) } ``` ---- - # KIT Components ## 1. Handler -Handler is the function/method that accepts `kit.Context` as argument, and it will be called based on the -selector that is defined in the `desc.Service`. +A Handler is a function/method that accepts `kit.Context` as an argument. It is called based on the +selector defined in the `desc.Service`. ## 2. Contract -Contract defines a business use-case that is very similar to what a function does, just it will be triggered -based on the selectors that we define the ServiceDescriptor. +A Contract defines a business use case similar to a function, triggered based on the selectors defined +in the `ServiceDescriptor`. ## 3. Service -One or more Contracts that are doing some operations in a similar domain could be grouped in one Service. Each -EdgeServer can have one or more service attached. +One or more Contracts performing operations in a similar domain can be grouped into one Service. Each +EdgeServer can have multiple services attached. ## 4. Gateway -Gateways handle the endpoints of the service. For example, if you need to provide REST apis you can use one of the -standard gateway bundles : fasthttp or silverhttp -For advanced cases you can develop your own Gateway, but it is not necessary for most cases. +Gateways handle the service endpoints. For REST APIs, you can use standard gateway bundles +like `fasthttp` or `silverhttp`. For advanced cases, you can develop your own Gateway, but it is +unnecessary for most cases. ## 5. Cluster -Cluster defines the relation between different instances of the EdgeServer. This bundle is optional but if attached -to EdgeServer then in multi instance cases it can help and provides some facilities to share data between different -instances of your EdgeServer. +A Cluster defines the relationship between different instances of the EdgeServer. This bundle is optional but, +if attached to the EdgeServer, it provides facilities to share data between different instances +of your EdgeServer. ## 6. EdgeServer -EdgeServer is the main component of the RonyKIT which glues different components together to make it a working -server. - ---- - ---- - ---- - -# KIT Storage layers - -When we develop API server usually we need to store data with different lifecycles. Sometimes we need to store data -that lives between different handlers, in some cases, we need to keep the data between different requests of a connection. -(i.e. for websocket connection we want to keep some data for next request from this connection). -Basically in RonyKIT we provide 4 layers of storage: - -| Layer | Lifecycle | -|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Context | in the request, but available in all the handlers | -| Connection | in the connection, for REST apis usually the lifecycle of Connection storage and Context are same, but for websocket data will be available until websocket connection is active | -| Local | this is shared between different contracts, services and is in the local memory of the server | -| Cluster | this is shared between different instances of the EdgeServer. This is enabled ONLY if a Cluster bundle is attached | +EdgeServer is the main component of RonyKIT, gluing different components together to create a working server. ---- +# KIT Storage Layers +When developing an API server, you often need to store data with different lifecycles. +RonyKIT provides four storage layers: +| Layer | Lifecycle | +|------------|------------------------------------------------------------------------------------------------------------------------| +| Context | Per request, available in all handlers | +| Connection | Per connection, useful for WebSocket data that persists until the connection is active | +| Local | Shared between different contracts and services, stored in the server's local memory | +| Cluster | Shared between different instances of the EdgeServer, enabled ONLY if a Cluster bundle is attached |ß diff --git a/rony/README.MD b/rony/README.MD index f9280e3b..830f19f0 100644 --- a/rony/README.MD +++ b/rony/README.MD @@ -1,218 +1,202 @@ # Rony -Rony is a framework for developing high-performance API servers. -It is designed to be simple and flexible. -It uses the power of Go generics to provide an easy and robust code and helps you to detect -a good few of the common mistakes at compile time. -If you need to have more control over your code, such as selecting your own Gateway and Cluster, -you can use [Kit Package](../kit/README.MD) however for most use cases we recommend to use `rony` package instead. +Rony is a framework for developing high-performance API servers. It is designed to be simple and flexible, +leveraging the power of Go generics to provide an easy-to-use and robust codebase that helps detect common +mistakes at compile time. If you need more control over your code, such as selecting your own Gateway and +Cluster, you can use the [Kit Package](../kit/README.MD). However, for most use cases, we recommend using +the `rony` package. - [Installation](#installation) -- [Quick start](#quick-start) +- [Quick Start](#quick-start) - [State](#state) - [Counter Program with State](#counter-program-with-state) ## Installation -To install Rony package, you need to install Go and set your Go workspace first. +To install the Rony package, you need to install Go and set up your Go workspace first. -First need to install[Go](https://golang.org/) (**version 1.19+ is required**), then you can use the below Go command to install -RonyKIT. +First, install [Go](https://golang.org/) (version 1.19+ is required). Then use the following command to install RonyKIT: ```sh $ go get -u github.com/clubpay/ronykit/rony/... ``` -## Quick start +## Quick Start ### State -When you develop API servers, you usually have a common state which could be shared between a few of your endpoints (i.e., Contracts). -For example, you may have a database connection or a cache connection which you want to share between your endpoints. -Moreover, you may want to have a shared state like a counter of the requests you received or in a simple chat application -to keep the list of the connected users. Rony lets you define your own state and provides it to your handlers, so you can -access it from your handlers without relying on global variables or defining your handler functions as methods of a common -structs. The later two approaches can be problematic as your project grows. +When developing API servers, you often have a common state that can be shared between several of your +endpoints (i.e., Contracts). For example, you might have a database or cache connection that you want to +share between your endpoints. Additionally, you might want a shared state like a counter for the requests +received or, in a simple chat application, to keep a list of connected users. Rony allows you to define +your own state and provide it to your handlers, enabling access without relying on global variables or +defining handler functions as methods of common structs. These approaches can be problematic as your project grows. -The following code shows the type parameter of the State that your need to implement for your server. +The following code shows the type parameter of the State that you need to implement for your server. ```go package rony // State related types type ( - Action comparable - State[A Action] interface { - Name() string - Reduce(action A) - } + Action comparable + State[A Action] interface { + Name() string + Reduce(action A) + } ) - ``` -As you can see, the State is a generic type which has a type parameter named `Action` which is a comparable type. This is -defined to let you define your state in a `Reducer pattern`. Also we recommend that your state also implements sync.Locker interface -to be thread-safe. +The State is a generic type with a type parameter named `Action`, which is a comparable type. This design allows you to +define your state in a `Reducer pattern`. We also recommend that your state implements the sync.Locker interface to +be thread-safe. ### Counter Program with State -Lets first implement our State. We want to have a simple counter which counts the number of requests we received. Our `EchoCounter` state -has action type of `string` and it supports two actions: `up` and `down`. The `up` action increases the counter and the `down` action -decreases the counter. The following code shows the implementation of the `EchoCounter` state. +Let's first implement our State. We want a simple counter that counts the number of requests received. Our `EchoCounter` state +has an action type of `string` and supports two actions: `up` and `down`. The `up` action increases the counter, +and the `down` action decreases it. The following code shows the implementation of the `EchoCounter` state. ```go package main import ( - "fmt" - "strings" - "sync" + "fmt" + "strings" + "sync" - "github.com/clubpay/ronykit/rony" + "github.com/clubpay/ronykit/rony" ) type EchoCounter struct { - sync.Mutex - - Count int + sync.Mutex + Count int } func (e *EchoCounter) Name() string { - return "EchoCounter" + return "EchoCounter" } func (e *EchoCounter) Reduce(action string) error { - switch strings.ToLower(action) { - case "up": - e.Count++ - case "down": - if e.Count <= 0 { - return fmt.Errorf("count cannot be negative") - } - e.Count-- - default: - return fmt.Errorf("unknown action: %s", action) - } - - return nil + switch strings.ToLower(action) { + case "up": + e.Count++ + case "down": + if e.Count <= 0 { + return fmt.Errorf("count cannot be negative") + } + e.Count-- + default: + return fmt.Errorf("unknown action: %s", action) + } + return nil } - - ``` -Now We want to implement our handlers to handle UP and DOWN functionality. We need to first define DTOs (Data Transfer Objects) of our -handlers. However instead of defining two separate DTOs, we going to define one DTO and use the `Action` field of the DTO to determine -the action we want to perform. Although, this is just in our example, in your case you may come up with a better design. +Next, we need to implement our handlers to handle UP and DOWN functionality. We'll define DTOs (Data Transfer Objects) for +our handlers. Instead of defining two separate DTOs, we'll define one DTO and use the `Action` field to determine the +action to perform. ```go package main -import ( - "github.com/clubpay/ronykit/rony" -) - type CounterRequestDTO struct { - Action string `json:"action"` - Count int `json:"count"` + Action string `json:"action"` + Count int `json:"count"` } type CounterResponseDTO struct { - Count int `json:"count"` + Count int `json:"count"` } ``` -Now we need to define our handler. Let's first define our handler struct. +Now we define our handler. ```go package main +import ( + "github.com/clubpay/ronykit/rony" +) + func count(ctx *rony.UnaryCtx[*EchoCounter, string], req *CounterRequestDTO) (*CounterResponseDTO, error) { - res := &CounterResponseDTO{} - err := ctx.ReduceState( - req.Action, - func(s *EchoCounter, err error) error { - if err != nil { - return rony.NewError(err).SetCode(http.StatusBadRequest) - } - - res.Count = s.Count - - return nil - }, - ) - if err != nil { - return nil, err - } - - return res, nil + res := &CounterResponseDTO{} + err := ctx.ReduceState( + req.Action, + func(s *EchoCounter, err error) error { + if err != nil { + return rony.NewError(err).SetCode(http.StatusBadRequest) + } + res.Count = s.Count + return nil + }, + ) + if err != nil { + return nil, err + } + return res, nil } - ``` -As you can see, we have a function named `count` which has two parameters. The first parameter is a `UnaryCtx` which is a generic type -and provides the state to the handler. It also has many more helper methods which we will discuss later. The second parameter is the -request DTO. The return value of the handler is the response DTO and an error. The handler function is a normal function and it is not -a method of a struct. -Inside the handler code, you see we have `ReduceState` method which is a helper method that let us to mutate the state in an atomic -fashion. The code in the callback function of the `ReduceState` method is executed in a thread-safe manner and it is guaranteed that -no other goroutine is mutating the state while the callback function is running. +Our handler function, `count`, has two parameters. The first is a `UnaryCtx`, a generic type that provides the state +to the handler, along with many helper methods. The second parameter is the request DTO. The handler returns the +response DTO and an error. The `ReduceState` method in the handler allows us to mutate the state in an atomic fashion. +The code in the `ReduceState` callback function executes in a thread-safe manner, ensuring no other goroutine mutates +the state simultaneously. -Now let's wrap up the code and define our server. +Finally, let's wrap up the code and define our server. ```go package main import ( - "context" - "os" + "context" + "os" - "github.com/clubpay/ronykit/rony" + "github.com/clubpay/ronykit/rony" ) func main() { - srv := rony.NewServer( - rony.Listen(":80"), - rony.WithServerName("CounterServer"), - ) - - // Set up the server with the initial state, which is a pointer to EchoCounter - // We can have as many states as we want. But each handler can only work with - // one state. In other words, we cannot register one handler with two different - // setup contexts. - rony.Setup( - srv, - "CounterService", - rony.ToInitiateState[*EchoCounter, string]( - &EchoCounter{ - Count: 0, - }, - ), - // Register the count handler for both GET /count and GET /count/{action} - // This way all the following requests are valid: - // 1. GET /count/up&count=1 - // 2. GET /count/down&count=2 - // 3. GET /count?action=up&count=1 - // 4. GET /count?action=down&count=2 - rony.WithUnary( - count, - rony.GET("/count/{action}"), - rony.GET("/count"), - ), - ) - - // Run the server in blocking mode - err := srv.Run( - context.Background(), - os.Kill, os.Interrupt, - ) - if err != nil { - panic(err) - } + srv := rony.NewServer( + rony.Listen(":80"), + rony.WithServerName("CounterServer"), + ) + + // Set up the server with the initial state, a pointer to EchoCounter + // We can have multiple states, but each handler works with only one state. + // In other words, we cannot register one handler with two different states. + rony.Setup( + srv, + "CounterService", + rony.ToInitiateState[*EchoCounter, string]( + &EchoCounter{ + Count: 0, + }, + ), + // Register the count handler for both GET /count and GET /count/{action} + // This way, the following requests are valid: + // 1. GET /count/up&count=1 + // 2. GET /count/down&count=2 + // 3. GET /count?action=up&count=1 + // 4. GET /count?action=down&count=2 + rony.WithUnary( + count, + rony.GET("/count/{action}"), + rony.GET("/count"), + ), + ) + + // Run the server in blocking mode + err := srv.Run( + context.Background(), + os.Kill, os.Interrupt, + ) + if err != nil { + panic(err) + } } - ``` -We first create a new server and then we set up the server with the initial state. We can have as many states as we want. -Then we register our handler with the server. We can register as many handlers as we want. Finally we run the server in blocking mode. -You can also check examples to see [more examples](./examples). - +We first create a new server and then set up the server with the initial state. Multiple states can be set up, but each +handler works with only one state. Then we register our handler with the server, allowing multiple handlers to be registered. +Finally, we run the server in blocking mode. For more examples, check the [examples](./examples) directory. diff --git a/std/clusters/p2pcluster/go.mod b/std/clusters/p2pcluster/go.mod index eb21278d..f92efaae 100644 --- a/std/clusters/p2pcluster/go.mod +++ b/std/clusters/p2pcluster/go.mod @@ -4,8 +4,8 @@ go 1.21 require ( github.com/clubpay/ronykit/kit v0.14.5 - github.com/libp2p/go-libp2p v0.33.2 - github.com/libp2p/go-libp2p-pubsub v0.10.1 + github.com/libp2p/go-libp2p v0.34.1 + github.com/libp2p/go-libp2p-pubsub v0.11.0 ) require ( @@ -14,8 +14,9 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect github.com/flynn/noise v1.1.0 // indirect @@ -27,8 +28,9 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect @@ -57,7 +59,7 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.12.3 // indirect + github.com/multiformats/go-multiaddr v0.12.4 // indirect github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect @@ -68,31 +70,49 @@ require ( github.com/onsi/ginkgo/v2 v2.18.0 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/pion/datachannel v1.5.6 // indirect + github.com/pion/dtls/v2 v2.2.11 // indirect + github.com/pion/ice/v2 v2.3.24 // indirect + github.com/pion/interceptor v0.1.29 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.14 // indirect + github.com/pion/rtp v1.8.6 // indirect + github.com/pion/sctp v1.8.16 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.18 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.5 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.2.40 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.18.0 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.47.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/quic-go v0.42.0 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/quic-go v0.44.0 // indirect + github.com/quic-go/webtransport-go v0.8.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/stretchr/testify v1.9.0 // indirect go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.20.1 // indirect + go.uber.org/fx v1.21.1 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.15.0 // indirect golang.org/x/tools v0.21.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/std/clusters/p2pcluster/go.sum b/std/clusters/p2pcluster/go.sum index 5d1c5fa2..d34c0eb5 100644 --- a/std/clusters/p2pcluster/go.sum +++ b/std/clusters/p2pcluster/go.sum @@ -40,8 +40,8 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -93,6 +93,9 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -100,8 +103,8 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/ github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= @@ -139,12 +142,12 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.33.2 h1:vCdwnFxoGOXMKmaGHlDSnL4bM3fQeW8pgIa9DECnb40= -github.com/libp2p/go-libp2p v0.33.2/go.mod h1:zTeppLuCvUIkT118pFVzA8xzP/p2dJYOMApCkFh0Yww= +github.com/libp2p/go-libp2p v0.34.1 h1:fxn9vyLo7vJcXQRNvdRbyPjbzuQgi2UiqC8hEbn8a18= +github.com/libp2p/go-libp2p v0.34.1/go.mod h1:snyJQix4ET6Tj+LeI0VPjjxTtdWpeOhYt5lEY0KirkQ= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-pubsub v0.10.1 h1:/RqOZpEtAolsr8/9CC8KqROJSOZeu7lK7fPftn4MwNg= -github.com/libp2p/go-libp2p-pubsub v0.10.1/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-pubsub v0.11.0 h1:+JvS8Kty0OiyUiN0i8H5JbaCgjnJTRnTHe4rU88dLFc= +github.com/libp2p/go-libp2p-pubsub v0.11.0/go.mod h1:QEb+hEV9WL9wCiUAnpY29FZR6W3zK8qYlaml8R4q6gQ= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= @@ -195,8 +198,8 @@ github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.12.3 h1:hVBXvPRcKG0w80VinQ23P5t7czWgg65BmIvQKjDydU8= -github.com/multiformats/go-multiaddr v0.12.3/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= +github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= +github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= @@ -225,29 +228,73 @@ github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= +github.com/pion/datachannel v1.5.6 h1:1IxKJntfSlYkpUj8LlYRSWpYiTTC02nUrOE8T3DqGeg= +github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNIVb/NfGW4= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= +github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= +github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= +github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= +github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= +github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.6 h1:MTmn/b0aWWsAzux2AmP8WGllusBVw4NPYPVFFd7jUPw= +github.com/pion/rtp v1.8.6/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/sctp v1.8.13/go.mod h1:YKSgO/bO/6aOMP9LCie1DuD7m+GamiK2yIiPM6vH+GA= +github.com/pion/sctp v1.8.16 h1:PKrMs+o9EMLRvFfXq59WFsC+V8mN1wnKzqrv+3D/gYY= +github.com/pion/sctp v1.8.16/go.mod h1:P6PbDVA++OJMrVNg2AL3XtYHV4uD6dvfyOovCgMs0PE= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= +github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.5 h1:iyi25i/21gQck4hfRhomF6SktmUQjRsRW4WJdhfc3Kc= +github.com/pion/transport/v2 v2.2.5/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.2 h1:r+40RJR25S9w3jbA6/5uEPTzcdn7ncyU44RWCbHkLg4= +github.com/pion/transport/v3 v3.0.2/go.mod h1:nIToODoOlb5If2jF9y2Igfx3PFYWfuXi37m0IlWa/D0= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.2.40 h1:Wtfi6AZMQg+624cvCXUuSmrKWepSB7zfgYDOYqsSOVU= +github.com/pion/webrtc/v3 v3.2.40/go.mod h1:M1RAe3TNTD1tzyvqHrbVODfwdPGSXOUo/OgpoGGJqFY= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= -github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/quic-go v0.42.0 h1:uSfdap0eveIl8KXnipv9K7nlwZ5IqLlYOpJ58u5utpM= -github.com/quic-go/quic-go v0.42.0/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= +github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= +github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= +github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -287,10 +334,17 @@ github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -300,14 +354,13 @@ github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMI github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/fx v1.21.1 h1:RqBh3cYdzZS0uqwVeEjOX2p73dddLpym315myy/Bpb0= +go.uber.org/fx v1.21.1/go.mod h1:HT2M7d7RHo+ebKGh9NRcrsrHHfpZ60nW3QRubMRfv48= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/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= @@ -329,11 +382,18 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= -golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -343,6 +403,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -362,6 +424,15 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -377,6 +448,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -396,16 +469,42 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -424,6 +523,8 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -446,10 +547,11 @@ google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmE google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=