{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":758680255,"defaultBranch":"main","name":"tcp-proxy","ownerLogin":"joshbranham","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2024-02-16T20:44:40.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/28584079?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1709871175.0","currentOid":""},"activityList":{"items":[{"before":"60ca4bb0053f583c186eccd8aa863783af987419","after":null,"ref":"refs/heads/proxy-wip","pushedAt":"2024-03-08T04:12:55.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"}},{"before":"11423ce23cd4fd06cb164cefb8caa7f9d69b7144","after":"8a5268207ec73d8d8d9ffc54efc605385748f49c","ref":"refs/heads/main","pushedAt":"2024-03-08T04:08:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Fix readme","shortMessageHtmlLink":"Fix readme"}},{"before":"82376bd27875c0f973190620ed21d1dbf77bc045","after":"11423ce23cd4fd06cb164cefb8caa7f9d69b7144","ref":"refs/heads/main","pushedAt":"2024-03-08T04:08:10.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Configre RateLimitManager","shortMessageHtmlLink":"Configre RateLimitManager"}},{"before":"a5c7a4a991a994dc70e09be56aceb5c73517a3f2","after":null,"ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:59:18.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"}},{"before":"3e31fdf190b8495405f048e44d3d39c338312638","after":"82376bd27875c0f973190620ed21d1dbf77bc045","ref":"refs/heads/main","pushedAt":"2024-03-08T03:59:17.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Initial library (#6)\n\n* Initial repo scaffolding and setup\r\n\r\n* Initial implementation of a TCP proxy supporting basic configuration and a least-connection load balancer.\r\n\r\nYet to be implemented: mTLS authn/z and RateLimiting\r\n\r\n* Fix GH action workflow\r\n\r\n* Misc cleanup\r\n\r\n- Comments and consolidation of Config\r\n- Simplify connection handling in proxy with less channels + goroutines\r\n\r\n* Integrate a large chunk of feedback with the exception of the LoadBalancer implementation.\r\n\r\n* Add some more test cases for failure paths\r\n\r\n* Address feedback related to LoadBalancer implementation\r\n\r\n* Rework how IdleTimeout is configured via SetDeadline. Tested this by setting a sleep in the echo server,\r\nand confirmed the tests failed, logging the i/o timeout. It is possible this doesn't work exactly how I think,\r\nin that long-lived connections that don't send some type of heartbeat might expire. Will test that once I have\r\nthe server component.\r\n\r\n```\r\n❯ make test\r\ngo test ./...\r\n2024/02/28 21:27:59 INFO proxy ready listening=127.0.0.1:61459 targets=127.0.0.1:61458\r\n2024/02/28 21:28:01 ERROR idle timeout exceeded error=\"readfrom tcp 127.0.0.1:61459->127.0.0.1:61460: read tcp 127.0.0.1:61461->127.0.0.1:61458: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR copying data error=\"readfrom tcp 127.0.0.1:61459->127.0.0.1:61460: read tcp 127.0.0.1:61461->127.0.0.1:61458: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR idle timeout exceeded error=\"readfrom tcp 127.0.0.1:61461->127.0.0.1:61458: read tcp 127.0.0.1:61459->127.0.0.1:61460: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR copying data error=\"readfrom tcp 127.0.0.1:61461->127.0.0.1:61458: read tcp 127.0.0.1:61459->127.0.0.1:61460: i/o timeout\"\r\n```\r\n\r\n* Add back DialTimeout to ensure we can't hang connecting to an upstream\r\n\r\n* Add some missing public function godoc\r\n\r\n* Address feedback to ensure you can't double close/serve. Added safety on connection closing to prevent\r\na goroutine from getting stuck. Simplify the public API.\r\n\r\n* Simplify locking behavior of Serving with atomic.Bool\r\n\r\n* Close client connection when upstream is down\r\n\r\n* Fix issue with hung connections\r\n\r\n* Implement a Token Bucket rate limiter (#4)\r\n\r\n* Implement a Token Bucket rate limiter\r\n\r\n* Misc cleanup, comments\r\n\r\n* RateLimitManager gracefully handles individual RateLimiters being closed already.\r\n\r\n* Add a Server CLI (#5)\r\n\r\n* Small fixes","shortMessageHtmlLink":"Initial library (#6)"}},{"before":"65197e0e77c1737fd4465f9b56f7e6826cf2810d","after":"a5c7a4a991a994dc70e09be56aceb5c73517a3f2","ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:58:47.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Small fixes","shortMessageHtmlLink":"Small fixes"}},{"before":"3fef6c377f373fb8a338eaafd745f7995f6aaf7c","after":"65197e0e77c1737fd4465f9b56f7e6826cf2810d","ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:57:41.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Merge branch 'main' of https://github.com/joshbranham/tcp-proxy into initial-library","shortMessageHtmlLink":"Merge branch 'main' of https://github.com/joshbranham/tcp-proxy into …"}},{"before":"e9075219653a4b985a0cf5d2bc70194182c5e68b","after":null,"ref":"refs/heads/feature/server-cli","pushedAt":"2024-03-08T03:52:52.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"}},{"before":"f1d7cc681641324c2dc80a59d8ef5bb8f533cce6","after":"3fef6c377f373fb8a338eaafd745f7995f6aaf7c","ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:52:51.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Add a Server CLI (#5)","shortMessageHtmlLink":"Add a Server CLI (#5)"}},{"before":"15c87d8ca435f78a4a4f3b95461ad5118c2fd174","after":null,"ref":"refs/heads/feature/rate-limiting","pushedAt":"2024-03-08T03:52:32.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"}},{"before":"07b0fa1c08493da2330f662bd4000a9c7a92e5d7","after":"f1d7cc681641324c2dc80a59d8ef5bb8f533cce6","ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:52:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Implement a Token Bucket rate limiter (#4)\n\n* Implement a Token Bucket rate limiter\r\n\r\n* Misc cleanup, comments\r\n\r\n* RateLimitManager gracefully handles individual RateLimiters being closed already.","shortMessageHtmlLink":"Implement a Token Bucket rate limiter (#4)"}},{"before":null,"after":"07b0fa1c08493da2330f662bd4000a9c7a92e5d7","ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:52:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Fix issue with hung connections","shortMessageHtmlLink":"Fix issue with hung connections"}},{"before":"1568abb5c24b364c21acbf0e65d704ca839afb72","after":null,"ref":"refs/heads/feature/mtls","pushedAt":"2024-03-08T03:45:56.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"}},{"before":"cc5be987071266aeeddcccaad58b38f39a15bc4a","after":"3e31fdf190b8495405f048e44d3d39c338312638","ref":"refs/heads/main","pushedAt":"2024-03-08T03:45:55.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Add mTLS and `AuthorizedGroups` support (#3)\n\n* Initial repo scaffolding and setup\r\n\r\n* Initial implementation of a TCP proxy supporting basic configuration and a least-connection load balancer.\r\n\r\nYet to be implemented: mTLS authn/z and RateLimiting\r\n\r\n* Fix GH action workflow\r\n\r\n* Misc cleanup\r\n\r\n* @tigrato feedback part 1\r\n\r\n- Comments and consolidation of Config\r\n- Simplify connection handling in proxy with less channels + goroutines\r\n\r\n* Integrate a large chunk of feedback with the exception of the LoadBalancer implementation.\r\n\r\n* Add some more test cases for failure paths\r\n\r\n* Address feedback related to LoadBalancer implementation\r\n\r\n* Rework how IdleTimeout is configured via SetDeadline. Tested this by setting a sleep in the echo server,\r\nand confirmed the tests failed, logging the i/o timeout. It is possible this doesn't work exactly how I think,\r\nin that long-lived connections that don't send some type of heartbeat might expire. Will test that once I have\r\nthe server component.\r\n\r\n```\r\n❯ make test\r\ngo test ./...\r\n2024/02/28 21:27:59 INFO proxy ready listening=127.0.0.1:61459 targets=127.0.0.1:61458\r\n2024/02/28 21:28:01 ERROR idle timeout exceeded error=\"readfrom tcp 127.0.0.1:61459->127.0.0.1:61460: read tcp 127.0.0.1:61461->127.0.0.1:61458: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR copying data error=\"readfrom tcp 127.0.0.1:61459->127.0.0.1:61460: read tcp 127.0.0.1:61461->127.0.0.1:61458: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR idle timeout exceeded error=\"readfrom tcp 127.0.0.1:61461->127.0.0.1:61458: read tcp 127.0.0.1:61459->127.0.0.1:61460: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR copying data error=\"readfrom tcp 127.0.0.1:61461->127.0.0.1:61458: read tcp 127.0.0.1:61459->127.0.0.1:61460: i/o timeout\"\r\n```\r\n\r\n* Add back DialTimeout to ensure we can't hang connecting to an upstream\r\n\r\n* Add some missing public function godoc\r\n\r\n* Address feedback to ensure you can't double close/serve. Added safety on connection closing to prevent\r\na goroutine from getting stuck. Simplify the public API.\r\n\r\n* Add support for mTLS and an authorization layer\r\n\r\nThis configures the proxy to listen with TLS, with mutual TLS between it and the client, and vice versa.\r\n\r\n* Provided certificates with the repo to make it easy to run and connect to the proxy.\r\n\r\n* Two user certificates provided, with two different groups, with tests confirming unauthorized clients have their connection closed.\r\n\r\n* Certificates are generated with SAN that supports `localhost` and `127.0.0.1` for the server name.\r\n\r\n* Cleanup some comments\r\n\r\n* Simplify locking behavior of Serving with atomic.Bool\r\n\r\n* Switch TLS confiugration to be file paths for better UX\r\n\r\n* Handle invalid TLS config","shortMessageHtmlLink":"Add mTLS and AuthorizedGroups support (#3)"}},{"before":"72b26248d01d1d309e2eb93f5a4cff26d7b44cda","after":"1568abb5c24b364c21acbf0e65d704ca839afb72","ref":"refs/heads/feature/mtls","pushedAt":"2024-03-08T03:44:18.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Merge branch 'main' of https://github.com/joshbranham/tcp-proxy into feature/mtls","shortMessageHtmlLink":"Merge branch 'main' of https://github.com/joshbranham/tcp-proxy into …"}},{"before":"07b0fa1c08493da2330f662bd4000a9c7a92e5d7","after":null,"ref":"refs/heads/initial-library","pushedAt":"2024-03-08T03:38:35.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"}},{"before":"db60d450b5ab50fa7de742f6627d37d69618c4df","after":"cc5be987071266aeeddcccaad58b38f39a15bc4a","ref":"refs/heads/main","pushedAt":"2024-03-08T03:38:34.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Initial Library Implementation (#2)\n\n* Initial repo scaffolding and setup\r\n\r\n* Initial implementation of a TCP proxy supporting basic configuration and a least-connection load balancer.\r\n\r\nYet to be implemented: mTLS authn/z and RateLimiting\r\n\r\n* Fix GH action workflow\r\n\r\n* Misc cleanup\r\n\r\n* @tigrato feedback part 1\r\n\r\n- Comments and consolidation of Config\r\n- Simplify connection handling in proxy with less channels + goroutines\r\n\r\n* Integrate a large chunk of feedback with the exception of the LoadBalancer implementation.\r\n\r\n* Add some more test cases for failure paths\r\n\r\n* Address feedback related to LoadBalancer implementation\r\n\r\n* Rework how IdleTimeout is configured via SetDeadline. Tested this by setting a sleep in the echo server,\r\nand confirmed the tests failed, logging the i/o timeout. It is possible this doesn't work exactly how I think,\r\nin that long-lived connections that don't send some type of heartbeat might expire. Will test that once I have\r\nthe server component.\r\n\r\n```\r\n❯ make test\r\ngo test ./...\r\n2024/02/28 21:27:59 INFO proxy ready listening=127.0.0.1:61459 targets=127.0.0.1:61458\r\n2024/02/28 21:28:01 ERROR idle timeout exceeded error=\"readfrom tcp 127.0.0.1:61459->127.0.0.1:61460: read tcp 127.0.0.1:61461->127.0.0.1:61458: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR copying data error=\"readfrom tcp 127.0.0.1:61459->127.0.0.1:61460: read tcp 127.0.0.1:61461->127.0.0.1:61458: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR idle timeout exceeded error=\"readfrom tcp 127.0.0.1:61461->127.0.0.1:61458: read tcp 127.0.0.1:61459->127.0.0.1:61460: i/o timeout\"\r\n2024/02/28 21:28:01 ERROR copying data error=\"readfrom tcp 127.0.0.1:61461->127.0.0.1:61458: read tcp 127.0.0.1:61459->127.0.0.1:61460: i/o timeout\"\r\n```\r\n\r\n* Add back DialTimeout to ensure we can't hang connecting to an upstream\r\n\r\n* Add some missing public function godoc\r\n\r\n* Address feedback to ensure you can't double close/serve. Added safety on connection closing to prevent\r\na goroutine from getting stuck. Simplify the public API.\r\n\r\n* Simplify locking behavior of Serving with atomic.Bool\r\n\r\n* Close client connection when upstream is down\r\n\r\n* Fix issue with hung connections","shortMessageHtmlLink":"Initial Library Implementation (#2)"}},{"before":"9afe8e8bb633e937525f805d8dfd3c8326e9b567","after":"e9075219653a4b985a0cf5d2bc70194182c5e68b","ref":"refs/heads/feature/server-cli","pushedAt":"2024-03-01T23:03:45.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Add a Server CLI","shortMessageHtmlLink":"Add a Server CLI"}},{"before":null,"after":"9afe8e8bb633e937525f805d8dfd3c8326e9b567","ref":"refs/heads/feature/server-cli","pushedAt":"2024-03-01T22:59:05.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Add a Server CLI","shortMessageHtmlLink":"Add a Server CLI"}},{"before":"1e82174c6eef7d8461f24e60622f5ea033aae07a","after":"07b0fa1c08493da2330f662bd4000a9c7a92e5d7","ref":"refs/heads/initial-library","pushedAt":"2024-03-01T22:57:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Fix issue with hung connections","shortMessageHtmlLink":"Fix issue with hung connections"}},{"before":"a9cbf9d9d66550324960cc20a7133cfdf88f49be","after":"1e82174c6eef7d8461f24e60622f5ea033aae07a","ref":"refs/heads/initial-library","pushedAt":"2024-03-01T22:06:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Close client connection when upstream is down","shortMessageHtmlLink":"Close client connection when upstream is down"}},{"before":"0ff69c463d83ff228e4dcc989d718cf07dbbc309","after":"72b26248d01d1d309e2eb93f5a4cff26d7b44cda","ref":"refs/heads/feature/mtls","pushedAt":"2024-03-01T19:38:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Handle invalid TLS config","shortMessageHtmlLink":"Handle invalid TLS config"}},{"before":"d96ff41424d305372f3ab098a6dbacaa9daf9f35","after":"15c87d8ca435f78a4a4f3b95461ad5118c2fd174","ref":"refs/heads/feature/rate-limiting","pushedAt":"2024-03-01T19:28:10.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"RateLimitManager gracefully handles individual RateLimiters being closed already.","shortMessageHtmlLink":"RateLimitManager gracefully handles individual RateLimiters being clo…"}},{"before":"45eff4d0397a4679346b63c2a8de71627ed55df9","after":"0ff69c463d83ff228e4dcc989d718cf07dbbc309","ref":"refs/heads/feature/mtls","pushedAt":"2024-03-01T17:52:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Switch TLS confiugration to be file paths for better UX","shortMessageHtmlLink":"Switch TLS confiugration to be file paths for better UX"}},{"before":"ff03d71bcefffe2514cfea9ffd3e32d5b6fbc633","after":"d96ff41424d305372f3ab098a6dbacaa9daf9f35","ref":"refs/heads/feature/rate-limiting","pushedAt":"2024-03-01T17:46:55.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Misc cleanup, comments","shortMessageHtmlLink":"Misc cleanup, comments"}},{"before":"d45ebfcd4f42ca90ce5b5f5463d34665199a9612","after":"ff03d71bcefffe2514cfea9ffd3e32d5b6fbc633","ref":"refs/heads/feature/rate-limiting","pushedAt":"2024-03-01T17:07:06.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Merge branch 'initial-library' of https://github.com/joshbranham/tcp-proxy into feature/rate-limiting","shortMessageHtmlLink":"Merge branch 'initial-library' of https://github.com/joshbranham/tcp-…"}},{"before":"02da699f7739220695ee1ff24baf52755446fffd","after":"45eff4d0397a4679346b63c2a8de71627ed55df9","ref":"refs/heads/feature/mtls","pushedAt":"2024-03-01T17:06:44.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Merge branch 'initial-library' of https://github.com/joshbranham/tcp-proxy into feature/mtls","shortMessageHtmlLink":"Merge branch 'initial-library' of https://github.com/joshbranham/tcp-…"}},{"before":"f9738948944653f4c593838149b1799e5e1739f7","after":"a9cbf9d9d66550324960cc20a7133cfdf88f49be","ref":"refs/heads/initial-library","pushedAt":"2024-03-01T17:06:25.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Simplify locking behavior of Serving with atomic.Bool","shortMessageHtmlLink":"Simplify locking behavior of Serving with atomic.Bool"}},{"before":"f83ddb0af4ec451b0af66085371bae1c8ca22792","after":"d45ebfcd4f42ca90ce5b5f5463d34665199a9612","ref":"refs/heads/feature/rate-limiting","pushedAt":"2024-03-01T16:08:04.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Implement a Token Bucket rate limiter","shortMessageHtmlLink":"Implement a Token Bucket rate limiter"}},{"before":null,"after":"f83ddb0af4ec451b0af66085371bae1c8ca22792","ref":"refs/heads/feature/rate-limiting","pushedAt":"2024-03-01T16:03:51.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"joshbranham","name":"Josh Branham","path":"/joshbranham","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/28584079?s=80&v=4"},"commit":{"message":"Implement a Token Bucket rate limiter","shortMessageHtmlLink":"Implement a Token Bucket rate limiter"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAED8ekagA","startCursor":null,"endCursor":null}},"title":"Activity · joshbranham/tcp-proxy"}