{"id":16116967,"url":"https://github.com/ralith/metaserve","last_synced_at":"2025-08-22T23:07:37.683Z","repository":{"id":66918877,"uuid":"153043002","full_name":"Ralith/metaserve","owner":"Ralith","description":"Toolkit for building meta servers for multiplayer games","archived":false,"fork":false,"pushed_at":"2022-02-20T02:35:33.000Z","size":62,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-01-12T06:40:34.264Z","etag":null,"topics":[],"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/Ralith.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":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-15T02:38:12.000Z","updated_at":"2022-06-01T09:56:45.000Z","dependencies_parsed_at":"2023-05-14T01:30:18.499Z","dependency_job_id":null,"html_url":"https://github.com/Ralith/metaserve","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ralith%2Fmetaserve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ralith%2Fmetaserve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ralith%2Fmetaserve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ralith%2Fmetaserve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ralith","download_url":"https://codeload.github.com/Ralith/metaserve/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234444607,"owners_count":18833658,"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","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-10-09T20:27:37.582Z","updated_at":"2025-01-18T00:07:08.628Z","avatar_url":"https://github.com/Ralith.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE-MIT)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE-APACHE)\n\n# metaserve\n\nMultiplayer games often want to present players with a list of servers to choose from, with\ninformation about each server's current state such as server name, selected map, and player\ncount. To support this, metaserve provides a toolkit for aggregating small \"heartbeat\" blobs of\ninformation from game servers and distributing the aggregated data to clients on demand, labeling\neach blob with the address of the originating game server. Metaserve does not enforce any structure\nwithin an individual heartbeat blob; it's up to calling code to decide what information game servers\nwill publish and how it is encoded.\n\nA system built using this toolkit consists of three types of logical entities: meta servers, game\nservers, and game clients.\n\nEvery **game server** maintains a connection to a meta server, sending a heartbeat blob at regular\nintervals. To implement a game server, connect to a meta server, then use that connection to\nconstruct a `metaserve_heartbeat::Heartbeat` and `send` new heartbeat data at regular intervals.\n\n**Game clients** may connect to a meta server to receive the set of currently-connected game servers\nand the latest heartbeat from each, updated at regular intervals. Game servers are identified to\nclients by the IP address and port they contacted the meta server from. To implement a game client,\nconnect to a meta server, then use that connection to construct a `metaserve_client::Client` and\n`recv` lists of server updates as they occur.\n\nThe **meta server** stores the latest heartbeat from every currently-connected server and broadcasts\nchanged heartbeat data to clients. A complete implementation is provided in `daemon`.\n\nAll communications are performed over QUIC, using `quinn` connections. Downstream code is\nresponsible for establishing connections and recovering from connection loss if necessary; this\nensures that arbitrary connection configurations can be used.\n\n## License\n\nLicensed under either of\n\n * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the\nwork by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any\nadditional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fralith%2Fmetaserve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fralith%2Fmetaserve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fralith%2Fmetaserve/lists"}