{"id":19522288,"url":"https://github.com/anycable/action-cable-next-playground","last_synced_at":"2026-06-11T02:31:28.954Z","repository":{"id":256995872,"uuid":"857040130","full_name":"anycable/action-cable-next-playground","owner":"anycable","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-03T19:20:26.000Z","size":28,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-02-06T10:47:55.522Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anycable.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-09-13T17:22:29.000Z","updated_at":"2025-02-03T19:20:29.000Z","dependencies_parsed_at":"2024-09-14T08:26:48.838Z","dependency_job_id":"e4f43c87-8f4d-45cf-995d-0f85620ad9b0","html_url":"https://github.com/anycable/action-cable-next-playground","commit_stats":null,"previous_names":["anycable/action-cable-next-playground"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/anycable/action-cable-next-playground","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anycable%2Faction-cable-next-playground","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anycable%2Faction-cable-next-playground/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anycable%2Faction-cable-next-playground/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anycable%2Faction-cable-next-playground/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anycable","download_url":"https://codeload.github.com/anycable/action-cable-next-playground/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anycable%2Faction-cable-next-playground/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34180147,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"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":[],"created_at":"2024-11-11T00:38:08.426Z","updated_at":"2026-06-11T02:31:28.931Z","avatar_url":"https://github.com/anycable.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Action Cable Next playground\n\nThis is a support project for the Action Server adapterization happening here: [rails/rails#50979][the-pr].\n\nThis project contains examples, tests and benchmarks aiming to ensure that the refactoring goes well and brings the promised benefits.\n\n## Requirements\n\n- Ruby 3.1+\n- Redis (we test all implementations with Redis pub/sub adapters)\n\n## Usage\n\nInstall the dependencies:\n\n```sh\nbundle install\n```\n\nNOTE: You can use local dependencies (Rails, AnyCable) either by following path conventions or by providing `.xxx-path` files (see the Gemfile).\n\nNow you should be able to run a minimal Action Cable application via one of the supported web servers. By default, Puma is used:\n\n```sh\n$ bundle exec bento\n\n⚡️ Running Action Cable via puma\n\n[18378] Puma starting in cluster mode...\n\n...\n```\n\nOther servers:\n\n```sh\n# AnyCable\n\n$ bundle exec bento --anycable\n\n⚡️ Running Action Cable via anycable\n\n2024-09-13 10:07:54.272 INF Starting AnyCable 1.5.3-56288f0 (pid: 37818, open file limit: 122880, gomaxprocs: 8) nodeid=NFoelH\n\n...\n\n# Falcon\n$ bundle exec bento --falcon\n\n⚡️ Running Action Cable via falcon\n\n...\n\n# Iodine\n$ bundle exec bento --iodine\n\n⚡️ Running Action Cable via iodine\n\n...\n```\n\n## Tests\n\n### Smoke tests\n\nYou can run basic smoke tests via [wsdirector][] as follows (NOTE: the server must be running):\n\n```sh\n# The default scenario is echo\n$ make wsdirector\n\n10 clients, 0 failures\n\n# Run broadcast scenario\n$ SCENARIO=broadcast make wsdirector\n\nGroup publisher: 10 clients, 0 failures\nGroup listener: 20 clients, 0 failures\n\n# You can specify the scale factor, too (default: 10)\n$ SCALE=20 SCENARIO=broadcast make wsdirector\n\nGroup publisher: 20 clients, 0 failures\nGroup listener: 40 clients, 0 failures\n\n```\n\n### Conformance tests\n\nWe use [AnyT][] to run Action Cable conformance tests. We use make files to encapsulate difference between different server configurations, for example:\n\n```sh\n$ make anyt-puma\n\nStarting AnyT v1.4.0 (pid: 21243)\n\nSubscription aknowledgement\n  Client receives subscription confirmation                       PASS (0.52s)\n\nSubscription aknowledgement\n  Client receives subscription rejection                          PASS (0.51s)\n\n...\n\n32 tests, 80 assertions, 0 failures, 0 errors, 1 skips\n```\n\nYou can run specific tests by name via the `ANYT_FILTER_TESTS=\u003cquery\u003e` env var. To see all scenarios, run `bundle exec anyt -l`.\n\n## Benchmarks\n\nThe primary purpose of running benchmarks within this repo is to ensure there is no degradation (and no hidden problems occur at higher loads). We use two benchmarking tools: [websocket-bench][] and [k6][] (with the [xk6-cable][] plugin).\n\nExample runs:\n\n```sh\n# First, start a server\nbundle exec bento --puma\n\n# Then, from another terminal session\nmake websocket-bench\n\n# or\nmake k6\n```\n\nTo run a Rails server using a stable Rails version (7.2), use the following command:\n\n```sh\nRAILS_VERSION=7 bundle exec bento --puma\n```\n\nExample results:\n\n```sh\n================= websocket-bench ====================\n\n# bundle exec bento --puma\nclients:   200    95per-rtt:  65ms    min-rtt:   2ms    median-rtt:  26ms    max-rtt:  89ms\nclients:   400    95per-rtt: 151ms    min-rtt:   1ms    median-rtt:  43ms    max-rtt: 247ms\nclients:   600    95per-rtt: 211ms    min-rtt:   1ms    median-rtt:  66ms    max-rtt: 267ms\nclients:   800    95per-rtt: 243ms    min-rtt:   1ms    median-rtt:  94ms    max-rtt: 458ms\nclients:  1000    95per-rtt: 683ms    min-rtt:   0ms    median-rtt:  88ms    max-rtt: 977ms\nclients:  1200    95per-rtt: 726ms    min-rtt:   1ms    median-rtt: 119ms    max-rtt: 1460ms\nclients:  1400    95per-rtt: 657ms    min-rtt:   1ms    median-rtt: 172ms    max-rtt: 1129ms\nclients:  1600    95per-rtt: 628ms    min-rtt:   0ms    median-rtt: 181ms    max-rtt: 1195ms\nclients:  1800    95per-rtt: 657ms    min-rtt:   1ms    median-rtt: 198ms    max-rtt: 1338ms\nclients:  2000    95per-rtt: 879ms    min-rtt:   0ms    median-rtt: 236ms    max-rtt: 1552ms\n\n\n# RAILS_VERSION=7 bundle exec bento --puma\nclients:   200    95per-rtt:  71ms    min-rtt:   2ms    median-rtt:  23ms    max-rtt:  95ms\nclients:   400    95per-rtt: 124ms    min-rtt:   1ms    median-rtt:  50ms    max-rtt: 195ms\nclients:   600    95per-rtt: 211ms    min-rtt:   1ms    median-rtt:  66ms    max-rtt: 279ms\nclients:   800    95per-rtt: 301ms    min-rtt:   1ms    median-rtt: 103ms    max-rtt: 530ms\nclients:  1000    95per-rtt: 313ms    min-rtt:   2ms    median-rtt: 113ms    max-rtt: 499ms\nclients:  1200    95per-rtt: 540ms    min-rtt:   0ms    median-rtt: 121ms    max-rtt: 756ms\nclients:  1400    95per-rtt: 565ms    min-rtt:   2ms    median-rtt: 121ms    max-rtt: 1917ms\nclients:  1600    95per-rtt: 848ms    min-rtt:   1ms    median-rtt: 182ms    max-rtt: 1101ms\nclients:  1800    95per-rtt: 734ms    min-rtt:   1ms    median-rtt: 212ms    max-rtt: 940ms\nclients:  2000    95per-rtt: 625ms    min-rtt:   1ms    median-rtt: 226ms    max-rtt: 927ms\n\n================= k6 ====================\n\n# bundle exec bento --puma\n\n  ✓ successful connection\n  ✓ successful subscription\n\n  acks_rcvd............: 7869    19.019325/s\n  broadcast_duration...: avg=38.79ms min=1ms      med=19ms  max=1.76s    p(90)=85ms    p(95)=124ms\n  broadcasts_rcvd......: 9058969 21895.472898/s\n  broadcasts_sent......: 7869    19.019325/s\n  data_received........: 1.3 GB  3.2 MB/s\n  data_sent............: 2.1 MB  5.0 kB/s\n  rtt..................: avg=21.52ms min=0s       med=2ms   max=1.72s    p(90)=56ms    p(95)=89ms\n  ws_connecting........: avg=17.09ms min=621.91µs med=1.8ms max=683.41ms p(90)=43.15ms p(95)=97.4ms\n  ws_msgs_received.....: 9127832 22061.914349/s\n  ws_msgs_sent.........: 9804    23.696208/s\n  ws_sessions..........: 1935    4.676883/s\n\n\n# RAILS_VERSION=7 bundle exec bento --puma\n\n  ✓ successful connection\n  ✓ successful subscription\n\n  acks_rcvd............: 7908    19.056033/s\n  broadcast_duration...: avg=27.09ms min=1ms      med=16ms   max=368ms    p(90)=63ms    p(95)=86ms\n  broadcasts_rcvd......: 9063601 21840.70347/s\n  broadcasts_sent......: 7908    19.056033/s\n  data_received........: 1.3 GB  3.2 MB/s\n  data_sent............: 2.1 MB  5.0 kB/s\n  rtt..................: avg=13.93ms min=0s       med=2ms    max=340ms    p(90)=42ms    p(95)=63ms\n  ws_connecting........: avg=12.86ms min=720.45µs med=2.04ms max=361.15ms p(90)=25.64ms p(95)=74.02ms\n  ws_msgs_received.....: 9131981 22005.479843/s\n  ws_msgs_sent.........: 9855    23.74775/s\n  ws_sessions..........: 1947    4.691717/s\n```\n\n[the-pr]: https://github.com/rails/rails/pull/50979\n[wsdirector]: https://github.com/palkan/wsdirector\n[AnyT]: https://github.com/anycable/anyt\n[websocket-bench]: https://github.com/anycable/websocket-bench\n[k6]: https://k6.io\n[xk6-cable]: https://github.com/anycable/xk6-cable\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanycable%2Faction-cable-next-playground","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanycable%2Faction-cable-next-playground","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanycable%2Faction-cable-next-playground/lists"}