{"id":17537747,"url":"https://github.com/lthibault/pipewerks","last_synced_at":"2025-09-04T03:33:34.229Z","repository":{"id":87128156,"uuid":"171176719","full_name":"lthibault/pipewerks","owner":"lthibault","description":"A simple library for working with reliable transports.","archived":false,"fork":false,"pushed_at":"2019-08-10T15:05:29.000Z","size":162,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-22T06:04:42.223Z","etag":null,"topics":["multiplexing","network","reliable","transport"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lthibault.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-17T21:51:56.000Z","updated_at":"2020-11-08T11:01:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"24fdd7dc-6e3c-4f26-8c00-c252b4947c94","html_url":"https://github.com/lthibault/pipewerks","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lthibault/pipewerks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lthibault%2Fpipewerks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lthibault%2Fpipewerks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lthibault%2Fpipewerks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lthibault%2Fpipewerks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lthibault","download_url":"https://codeload.github.com/lthibault/pipewerks/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lthibault%2Fpipewerks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273547547,"owners_count":25125087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-04T02:00:08.968Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["multiplexing","network","reliable","transport"],"created_at":"2024-10-20T20:42:40.156Z","updated_at":"2025-09-04T03:33:34.207Z","avatar_url":"https://github.com/lthibault.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pipewerks\n\n[![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/lthibault/pipewerks/pkg) [![Go Report Card](https://goreportcard.com/badge/github.com/lthibault/pipewerks?style=flat-square)](https://goreportcard.com/report/github.com/lthibault/pipewerks)\n\nA simple library for working with reliable transports.\n\n## Installation\n\n```bash\ngo get -u github.com/lthibault/pipewerks\n```\n\n## Motivation\n\nGo's `net` package is too low-level for most applications.  Pipewerks is motivated from\nthe desire to write modular networking code, where transports are trivially interchangeable.\n\nPipewerks assumes you are looking for reliable delivery semantics (no UDP here, sorry), and that your application is best modeled as logical streams multiplexed on top of sessions.  As such, it provides uniform interfaces (`pipe.Conn` and `pipe.Stream`) for all transports.\n\nThat's right! Pipewerks comes with stream mulitplexing out-of-the box for _all_ protocols!\n\n## Ambition\n\nPipewerks' ambition is to be a standard library for reliable, multiplexed transports.\n\nIt aims to compete with the standard library in terms of productivity.  We hope to\nsee developers reaching for pipewerks first, dropping down to Go's `net` package only\nif/when needed.\n\nIn order to achieve this, pipewerks is designed according to the following principles:\n\n1. **Full compatability with Go's standard library**:  pipewerks is built on top of Go's `net` package, and offers unbridled access to the underlying standard library objects.\n\n2. **Transport Modularity**:  pipewerks makes it easy to swap out transports.  You can prototype your application using `inproc`, and then deploy it using `tcp` or `quic`.\n\n3. **Transport Uniformity**:  pipewerks believes application developers shouldn't care whether their bytes are delivered by TCP, QUIC, µTP, or carrier pigeons.  Pipewerks lets you code your application with generic interfaces like `Conn` and `Stream`.\n\n4. **Speed**:  pipewerks is written with performance in mind and aims to be competitive with the standard library in terms of speed and memory usage.\n\n## Example\n\n```go\nimport (\n    \"context\"\n\n    pipe \"github.com/lthibault/pipewerks/pkg/\"\n    \"github.com/lthibault/pipewerks/pkg/transport/inproc\"\n)\n\n\nfunc startServer(c context.Context, l pipe.Listener) {\n    for {\n        conn, _ := l.Accept()\n\n        go func() {\n            for {\n                stream, _ := conn.AcceptStream()\n\n                // stream is a standard library net.Conn\n                // do something with stream ...\n            }\n        }()\n    }\n}\n\nfunc startClient(c context.Context, t pipe.Transport, a net.Addr) {\n    conn, _ := t.Dial(c, a)\n    stream, _ := conn.OpenStream()\n\n    // do something with stream ...\n}\n\nfunc main() {\n\n    // Create a new in-process transport.\n    // Using a different wire protocol is as simple as replacing this with\n    // e.g. tcp.New().\n    t := inproc.New()\n\n    // inproc.Addr is a net.Addr ...\n    addr := inproc.Addr(\"/foo\")\n\n    // ... which is nice because all pipewerks transports accept net.Addr.\n    l, _ := t.Listen(c, a)\n\n    // Business logic ...\n    go startServer(context.Background(), l)\n    startClient(context.Background(), t, addr)\n}\n```\n\n## Supported Transports\n\nThe following wire protocols are implemented or planned.\n\n- [x] In-Process\n- [x] [TCP](https://en.wikipedia.org/wiki/Transmission_Control_Protocol)\n- [x] [Unix domain socket](https://en.wikipedia.org/wiki/Unix_domain_socket)\n- [x] [QUIC](https://en.wikipedia.org/wiki/QUIC)\n- [ ] [µTP](https://en.wikipedia.org/wiki/Micro_Transport_Protocol)\n- [ ] [KCP](https://github.com/xtaci/kcp-go)\n\nIn addition, a `generic` transport is provided to facilitate the writing of new transport types.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flthibault%2Fpipewerks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flthibault%2Fpipewerks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flthibault%2Fpipewerks/lists"}