{"id":47605293,"url":"https://github.com/ystreet/librice","last_synced_at":"2026-04-01T19:10:51.124Z","repository":{"id":43194647,"uuid":"309368918","full_name":"ystreet/librice","owner":"ystreet","description":"sans-IO implementation of ICE (RFC8445) in Rust","archived":false,"fork":false,"pushed_at":"2026-03-30T06:38:22.000Z","size":1142,"stargazers_count":64,"open_issues_count":5,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-30T07:48:46.238Z","etag":null,"topics":["ice","rust","sans-io","stun"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ystreet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-11-02T12:52:32.000Z","updated_at":"2026-03-30T05:42:07.000Z","dependencies_parsed_at":"2024-06-19T11:40:59.527Z","dependency_job_id":"920290d8-d77d-49fd-84d1-dc97ab17e1c7","html_url":"https://github.com/ystreet/librice","commit_stats":{"total_commits":124,"total_committers":2,"mean_commits":62.0,"dds":0.008064516129032251,"last_synced_commit":"15774fad4b13aee638ea53babffb50d0a9447720"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/ystreet/librice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ystreet%2Flibrice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ystreet%2Flibrice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ystreet%2Flibrice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ystreet%2Flibrice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ystreet","download_url":"https://codeload.github.com/ystreet/librice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ystreet%2Flibrice/sbom","scorecard":{"id":923194,"data":{"date":"2025-07-07","repo":{"name":"github.com/ystreet/librice","commit":"0b67cb3a96aba5df443fcd535a982ea63b514b04"},"scorecard":{"version":"v5.2.1-18-gbb9c347d","commit":"bb9c347dff6349d986baab6578a46d68a5524c62"},"score":5.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/22 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"24 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/cbuild.yml:1","Warn: no topLevel permission defined: .github/workflows/rust-coverage.yml:1","Warn: no topLevel permission defined: .github/workflows/rust-doc.yml:1","Warn: no topLevel permission defined: .github/workflows/rust-fmt.yml:1","Warn: no topLevel permission defined: .github/workflows/rust-fuzz.yml:1","Warn: no topLevel permission defined: .github/workflows/rust.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cbuild.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/cbuild.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cbuild.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/cbuild.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cbuild.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/cbuild.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cbuild.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/cbuild.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-coverage.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-coverage.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-coverage.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-coverage.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-coverage.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-coverage.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-doc.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-doc.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-doc.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-doc.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-doc.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-doc.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-fmt.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fmt.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-fmt.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fmt.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-fmt.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fmt.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-fuzz.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fuzz.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-fuzz.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fuzz.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-fuzz.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fuzz.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust-fuzz.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust-fuzz.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/ystreet/librice/rust.yml/main?enable=pin","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  13 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: RustCargoFuzzer integration found: fuzz/fuzz_targets/parse_candidate.rs:2"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE-APACHE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE-APACHE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-25T06:43:34.825Z","repository_id":43194647,"created_at":"2025-08-25T06:43:34.845Z","updated_at":"2025-08-25T06:43:34.845Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291092,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ice","rust","sans-io","stun"],"created_at":"2026-04-01T19:10:49.723Z","updated_at":"2026-04-01T19:10:51.119Z","avatar_url":"https://github.com/ystreet.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Chat](https://img.shields.io/matrix/librice-general:matrix.org?logo=matrix)](https://matrix.to/#/#librice-general:matrix.org)\n[![Build status](https://github.com/ystreet/librice/actions/workflows/rust.yml/badge.svg?branch=main)](https://github.com/ystreet/librice/actions)\n[![codecov](https://codecov.io/gh/ystreet/librice/branch/main/graph/badge.svg)](https://codecov.io/gh/ystreet/librice)\n[![Dependencies](https://deps.rs/repo/github/ystreet/librice/status.svg)](https://deps.rs/repo/github/ystreet/librice)\n[![crates.io](https://img.shields.io/crates/v/librice.svg)](https://crates.io/crates/librice)\n[![docs.rs](https://docs.rs/librice/badge.svg)](https://docs.rs/librice)\n\n# librice\n\nRepository containing an (sans-IO) implementation of ICE (RFC8445) protocol written in\nthe [Rust programming language](https://www.rust-lang.org/). A C API interface is\ncurrently also provided for `rice-proto` and `rice-io`. The C interface can\nalso be accessed from Rust using `rice-c`.\n\n## Current status\n\nThe current status is that there is enough of the implementation to sucessfully\ncommunicate with STUN/TURN servers and/or a browser (Chrome or Firefox) in a WebRTC\nscenario. The STUN implementation is relatively mature. More work is needed on\nthe ICE layer for efficiency and API experience. Initial TURN support has been\nimplemented and some TURN-related RFCs are currently in progress. Supporting\nmore scenarios is part of the near and long term future roadmap.\n\n## Why sans-io?\n\nA few reasons: reusability, testability, and composability.\n\nWithout being bogged down in the details of how IO happens, the same sans-IO\nimplementation can be used without prescribing the IO pattern that an application\nmust follow. Instead, the application (or parent library) has much more freedom\nin how bytes are transferred between peers. It is possible to use a sans-IO\nlibrary in either a synchronous environment or within an asynchronous runtime.\n\nA sans-IO design also allows easy testing of any specific state the sans-IO\nimplementation might find itself in. Combined with a comprehensive test-suite,\nthis provides assurance that the implementation behaves as expected under all\ncircumstances.\n\nFor other examples of sans-IO implementations, take a look at:\n- [stun-proto](https://github.com/ystreet/stun-proto): A sans-IO implementation\n  of a STUN agent (client or server).\n- [turn-proto](https://github.com/ystreet/turn-proto): A sans-IO implementation\n  of a TURN client or server.\n- [Quinn](https://github.com/quinn-rs/quinn/): A pure Rust async-compatible\n  implementation of QUIC.\n- https://sans-io.readthedocs.io/\n\n## Relevant standards\n\n - [x] [RFC5245](https://tools.ietf.org/html/rfc5245):\n   Interactive Connectivity Establishment (ICE): A Protocol for Network Address\n   Translator (NAT) Traversal for Offer/Answer Protocols\n - [x] [RFC5389](https://tools.ietf.org/html/rfc5389):\n   Session Traversal Utilities for NAT (STUN)\n - [x] [RFC5766](https://tools.ietf.org/html/rfc5766):\n   Traversal Using Relays around NAT (TURN): Relay Extensions to Session\n   Traversal Utilities for NAT (STUN)\n - [x] [RFC5769](https://tools.ietf.org/html/rfc5769):\n   Test Vectors for Session Traversal Utilities for NAT (STUN)\n - [x] [RFC6062](https://tools.ietf.org/html/rfc6062):\n   Traversal Using Relays around NAT (TURN) Extensions for TCP Allocations\n - [x] [RFC6156](https://tools.ietf.org/html/rfc6156):\n   Traversal Using Relays around NAT (TURN) Extension for IPv6\n - [x] [RFC6544](https://tools.ietf.org/html/rfc6544):\n   TCP Candidates with Interactive Connectivity Establishment (ICE)\n - [ ] [RFC7675](https://tools.ietf.org/html/rfc7675):\n   Session Traversal Utilities for NAT (STUN) Usage for Consent Freshness\n - [x] [RFC8445](https://tools.ietf.org/html/rfc8445):\n   Interactive Connectivity Establishment (ICE): A Protocol for Network Address\n   Translator (NAT) Traversal\n - [x] [RFC8489](https://tools.ietf.org/html/rfc8489):\n   Session Traversal Utilities for NAT (STUN)\n - [x] [RFC8656](https://tools.ietf.org/html/rfc8656):\n   Traversal Using Relays around NAT (TURN): Relay Extensions to Session\n   Traversal Utilities for NAT (STUN)\n - [x] [RFC8838](https://tools.ietf.org/html/rfc8838):\n   Trickle ICE: Incremental Provisioning of Candidates for the Interactive\n   Connectivity Establishment (ICE) Protocol\n\n## Structure\n\n### [rice-stun-types](https://github.com/ystreet/librice/tree/main/rice-stun-types)\n\nImplementation of STUN attributes relevant for ICE (RFC8445).\n\n### [rice-proto](https://github.com/ystreet/librice/tree/main/rice-proto)\n\nThe sans-IO implementation of the ICE (RFC8445) protocol. Contains no IO code\nwhatsover.\n\n### [rice-c](https://github.com/ystreet/librice/tree/main/rice-c)\n\nA library for accessing `rice-proto` using a C API interface.\nTypically useful when exposing the ICE agent across library/application\nboundaries for accessing the same ICE agent. If your application does not have\nsuch a requirement (e.g. entirely in Rust), then `rice-c` is not needed.\n\n### [librice](https://github.com/ystreet/librice/tree/main/librice)\n\nAn async implementation of ICE (RFC8445) built using `rice-proto` using the C\nAPI through the `rice-c` crate. The async runtime used can be provided by the\napplication for `librice` to use or the provided `tokio` and `smol`\nimplementations can be used.\n\n### [rice-io](https://github.com/ystreet/librice/tree/main/rice-io)\n\nAn optional library exposing a C interface for handling IO using Rust's network\nprimitives `UdpSocket`, and `TcpStream`. Uses a single dedicated thread for\nhandling IO wakeups. It is not required for implementation.\n\n## TODO\n\n- RFC7675\n\n## Building\n\nAll crates in the workspace can be built using a standard `cargo build`\ninvocation. However in order to successfully build the `rice-c` crate (and any\ndependant crates, like `librice`), `cargo-c` must be installed and in the\nenvironment.  The [rice-c README](https://github.com/ystreet/librice/tree/main/rice-c#building)\ncontains more details.\n\n## Use Cases\n\nBoth client and server side use cases are supported.\n\n## Examples and Getting Started\n\n[icegather](https://github.com/ystreet/librice/blob/main/librice/examples/icegather.rs)\nis a self-contained client example of how to use the API to gather ICE\ncandidates using tokio as a runtime.\n\nFor a server side example, check out the [TURN server written for unit testing purposes][turn-server-example].\n\n[turn-server-example]: https://github.com/ystreet/librice/blob/main/librice/tests/turn_server/mod.rs\n\n## Talks and Presentations\n\n- [librice: the TURNing point][librice-gst-conf-2025] by Matthew Waters,\n  GStreamer Conference 2025\n\n- [librice: a sans-IO ICE networking library][librice-gst-conf-2024] by\n  Matthew Waters, GStreamer Conference 2024\n\n- [ICE: How to find your way through the internet][ice-gst-conf-2023] by\n  Matthew Waters, GStreamer Conference 2023\n\n[librice-gst-conf-2025]: https://gstconf.ubicast.tv/videos/librice-the-turning-point/\n[librice-gst-conf-2024]: https://gstconf.ubicast.tv/videos/librice-a-sans-io-ice-networking-library/\n[ice-gst-conf-2023]: https://gstconf.ubicast.tv/videos/ice-how-to-find-your-way-through-the-internet_22161/\n\n## Users\n\n- The [WebKit](https://github.com/WebKit/WebKit/) browser engine recently added\n  [support][librice-in-webkit] for WebRTC ICE candidate gathering using librice\n  sans-io style.\n\n- [GStreamer][gstreamer] WebRTC support for librice is work-in-progress\n  (see Matthew's talks above)\n\n[librice-in-webkit]: https://gstconf.ubicast.tv/permalink/v126b0f1942324duzet3/iframe/#start=1093\n[gstreamer]: https://gstreamer.freedesktop.org\n\n## Funding\n\n[Support for TURN](https://nlnet.nl/project/librice/) has been funded in part through the\n[NGI0 Commons Fund](https://nlnet.nl/commonsfund) a fund established by\n[NLnet](https://nlnet.nl) with financial support from the European Commission's\n[Next Generation Internet](https://ngi.eu) programme.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fystreet%2Flibrice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fystreet%2Flibrice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fystreet%2Flibrice/lists"}