{"id":13624740,"url":"https://github.com/socketry/async","last_synced_at":"2026-03-08T11:03:11.176Z","repository":{"id":37774067,"uuid":"87380483","full_name":"socketry/async","owner":"socketry","description":"An awesome asynchronous event-driven reactor for Ruby.","archived":false,"fork":false,"pushed_at":"2026-02-19T07:05:00.000Z","size":11095,"stargazers_count":2420,"open_issues_count":23,"forks_count":105,"subscribers_count":34,"default_branch":"main","last_synced_at":"2026-02-27T14:39:29.564Z","etag":null,"topics":["async","asynchronous","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","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/socketry.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":"https://github.com/socketry/community/#funding","github":"ioquatix"}},"created_at":"2017-04-06T03:04:33.000Z","updated_at":"2026-02-25T03:33:59.000Z","dependencies_parsed_at":"2023-02-08T10:01:01.341Z","dependency_job_id":"66f8664b-3d97-453d-9030-4c6eacd5019b","html_url":"https://github.com/socketry/async","commit_stats":{"total_commits":715,"total_committers":28,"mean_commits":"25.535714285714285","dds":0.05594405594405594,"last_synced_commit":"975d4d5bdbff5d652f229d4cc28bc2cdcc62661d"},"previous_names":[],"tags_count":157,"template":false,"template_full_name":null,"purl":"pkg:github/socketry/async","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fasync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fasync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fasync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fasync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/socketry","download_url":"https://codeload.github.com/socketry/async/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fasync/sbom","scorecard":{"id":564575,"data":{"date":"2025-08-11","repo":{"name":"github.com/socketry/async","commit":"e6d6f94164f7bc6d9baba395e201127c4c3851f2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 2/30 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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 7 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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"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/documentation-coverage.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/documentation-coverage.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/documentation-coverage.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/documentation-coverage.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/documentation.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/documentation.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/documentation.yaml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/documentation.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/documentation.yaml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/documentation.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/documentation.yaml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/documentation.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rubocop.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/rubocop.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rubocop.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/rubocop.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-agent-context.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-agent-context.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-agent-context.yaml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-agent-context.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-coverage.yaml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-coverage.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-coverage.yaml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-coverage.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-coverage.yaml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-coverage.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-coverage.yaml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-coverage.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-coverage.yaml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-coverage.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-coverage.yaml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-coverage.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-external.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-external.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-external.yaml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-external.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-io_uring.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-io_uring.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-io_uring.yaml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-io_uring.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-select.yaml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-select.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-select.yaml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-select.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-worker-pool.yaml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-worker-pool.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-worker-pool.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test-worker-pool.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yaml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yaml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/socketry/async/test.yaml/main?enable=pin","Info:   0 out of  15 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  11 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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/documentation-coverage.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/documentation.yaml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/rubocop.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-agent-context.yaml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-coverage.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-external.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-io_uring.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-select.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-worker-pool.yaml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/test.yaml:6","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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: license.md:0","Info: FSF or OSI recognized license: MIT License: license.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/socketry/.github/security.md:1","Info: Found linked content: github.com/socketry/.github/security.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/socketry/.github/security.md:1","Info: Found text in security policy: github.com/socketry/.github/security.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":5,"reason":"SAST tool is not run on all commits -- score normalized to 5","details":["Warn: 2 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T14:37:55.404Z","repository_id":37774067,"created_at":"2025-08-20T14:37:55.404Z","updated_at":"2025-08-20T14:37:55.404Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29999614,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T11:09:27.951Z","status":"ssl_error","status_checked_at":"2026-03-02T11:08:53.255Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["async","asynchronous","ruby"],"created_at":"2024-08-01T21:01:45.821Z","updated_at":"2026-03-08T11:03:11.170Z","avatar_url":"https://github.com/socketry.png","language":"Ruby","readme":"# ![Async](assets/logo.webp)\n\nAsync is a composable asynchronous I/O framework for Ruby based on [io-event](https://github.com/socketry/io-event).\n\n\u003e \"Lately I've been looking into `async`, as one of my projects –\n\u003e [tus-ruby-server](https://github.com/janko/tus-ruby-server) – would really benefit from non-blocking I/O. It's really\n\u003e beautifully designed.\" *– [janko](https://github.com/janko)*\n\n[![Development Status](https://github.com/socketry/async/workflows/Test/badge.svg)](https://github.com/socketry/async/actions?workflow=Test)\n\n## Features\n\n  - Scalable event-driven I/O for Ruby. Thousands of clients per process\\!\n  - Light weight fiber-based concurrency. No need for callbacks\\!\n  - Multi-thread/process containers for parallelism.\n  - Growing eco-system of event-driven components.\n\n## Usage\n\nPlease see the [project documentation](https://socketry.github.io/async/) for more details.\n\n  - [Getting Started](https://socketry.github.io/async/guides/getting-started/index) - This guide shows how to add async to your project and run code asynchronously.\n\n  - [Scheduler](https://socketry.github.io/async/guides/scheduler/index) - This guide gives an overview of how the scheduler is implemented.\n\n  - [Tasks](https://socketry.github.io/async/guides/tasks/index) - This guide explains how asynchronous tasks work and how to use them.\n\n  - [Best Practices](https://socketry.github.io/async/guides/best-practices/index) - This guide gives an overview of best practices for using Async.\n\n  - [Debugging](https://socketry.github.io/async/guides/debugging/index) - This guide explains how to debug issues with programs that use Async.\n\n  - [Thread safety](https://socketry.github.io/async/guides/thread-safety/index) - This guide explains thread safety in Ruby, focusing on fibers and threads, common pitfalls, and best practices to avoid problems like data corruption, race conditions, and deadlocks.\n\n## Releases\n\nPlease see the [project releases](https://socketry.github.io/async/releases/index) for all releases.\n\n### v2.38.0\n\n  - Rename `Task#stop` to `Task#cancel` for better clarity and consistency with common concurrency terminology. The old `stop` method is still available as an alias for backward compatibility, but it is recommended to use `cancel` going forward.\n  - Forward arguments from `Task#wait` -\\\u003e `Promise#wait`, so `task.wait(timeout: N)` is supported.\n\n### v2.37.0\n\n  - Introduce `Async::Loop` for robust, time-aligned loops.\n  - Add support for `Async::Promise#wait(timeout: N)`.\n\n### v2.36.0\n\n  - Introduce `Task#wait_all` which recursively waits for all children and self, excepting the current task.\n  - Introduce `Task#join` as an alias for `Task#wait` for compatibility with `Thread#join` and similar interfaces.\n\n### v2.35.3\n\n  - `Async::Clock` now implements `#as_json` and `#to_json` for nicer log formatting.\n\n### v2.35.2\n\n  - Improved handling of `Process.fork` on Ruby 4+.\n  - Improve `@promise` state handling in `Task#initialize`, preventing incomplete instances being visible to the scheduler.\n\n### v2.35.1\n\n  - Fix incorrect handling of spurious wakeups in `Async::Promise#wait`, which could lead to premature (incorrect) resolution of the promise.\n\n### v2.35.0\n\n  - `Process.fork` is now properly handled by the Async fiber scheduler, ensuring that the scheduler state is correctly reset in the child process after a fork. This prevents issues where the child process inherits the scheduler state from the parent, which could lead to unexpected behavior.\n\n### v2.34.0\n\n  - [`Kernel::Barrier` Convenience Interface](https://socketry.github.io/async/releases/index#kernel::barrier-convenience-interface)\n\n### v2.33.0\n\n  - Introduce `Async::Promise.fulfill` for optional promise resolution.\n\n### v2.32.1\n\n  - Fix typo in documentation.\n\n## See Also\n\n  - [async-http](https://github.com/socketry/async-http) — Asynchronous HTTP client/server.\n  - [falcon](https://github.com/socketry/falcon) — A rack compatible server built on top of `async-http`.\n  - [async-websocket](https://github.com/socketry/async-websocket) — Asynchronous client and server websockets.\n  - [async-dns](https://github.com/socketry/async-dns) — Asynchronous DNS resolver and server.\n  - [toolbox](https://github.com/socketry/toolbox) — GDB \u0026 LLDB extensions for debugging Ruby applications with Fibers.\n\n## Contributing\n\nWe welcome contributions to this project.\n\n1.  Fork it.\n2.  Create your feature branch (`git checkout -b my-new-feature`).\n3.  Commit your changes (`git commit -am 'Add some feature'`).\n4.  Push to the branch (`git push origin my-new-feature`).\n5.  Create new Pull Request.\n\n### Developer Certificate of Origin\n\nIn order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed.\n\n### Community Guidelines\n\nThis project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers.\n","funding_links":["https://github.com/socketry/community/#funding","https://github.com/sponsors/ioquatix"],"categories":["Ruby","Advanced Ruby and Rails"],"sub_categories":["Advanced Ruby"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsocketry%2Fasync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsocketry%2Fasync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsocketry%2Fasync/lists"}