{"id":18425737,"url":"https://github.com/faforever/faf-icebreaker","last_synced_at":"2025-12-27T08:38:29.867Z","repository":{"id":204050746,"uuid":"710997592","full_name":"FAForever/faf-icebreaker","owner":"FAForever","description":"The FAF ICE server broker","archived":false,"fork":false,"pushed_at":"2025-04-11T19:12:51.000Z","size":298,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-13T18:18:27.096Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","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/FAForever.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,"zenodo":null}},"created_at":"2023-10-27T23:24:04.000Z","updated_at":"2025-04-11T19:09:02.000Z","dependencies_parsed_at":"2023-12-29T15:27:33.475Z","dependency_job_id":"ec8ff3a4-713f-40c4-b8ff-685d2d483c65","html_url":"https://github.com/FAForever/faf-icebreaker","commit_stats":null,"previous_names":["faforever/faf-icebreaker"],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAForever%2Ffaf-icebreaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAForever%2Ffaf-icebreaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAForever%2Ffaf-icebreaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAForever%2Ffaf-icebreaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FAForever","download_url":"https://codeload.github.com/FAForever/faf-icebreaker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248758423,"owners_count":21156958,"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-11-06T05:05:17.011Z","updated_at":"2025-12-27T08:38:29.861Z","avatar_url":"https://github.com/FAForever.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# faf-icebreaker\n\nThe FAF icebreaker is a fully functional WebRTC signalling server aimed at the needs for the FAForever project.\n\nIt has two main features:\n* It provides a list to TURN and STUN servers with session credentials both static (self-hosted coturn) and dynamically (Xirsys, Cloudflare). \n* It provides a simple signalling mechanism, for sending events via REST POST and receiving events as a stream via SSE.\n\nFor authentication, you first need to acquire a session token for a specific gameId. This is secured via OIDC tokens from the configured OIDC server (by default: hydra.faforever.com aka FAF production). In the response you get a self-signed JWT session token. This session token can be used for all endpoints.\n\nThe available environment variables for configuration can be found in `src/main/resources/application.yaml`. Variables are declared like `${ENV_VARIABLE_NAME:fallback-value}`.\n\nThis application makes use of the [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) database to search for the closest Xirsys server according to the users ip address. The file must be present on startup or all requests will fall back to Frankfurt, Germany.\n\n## Testing without a real OIDC provider\n\nSince all calls can use the self-signed JWT for authentication, we can make use of the default/dev certificates and use pre-generated tokens for test (even for obtaining a new token!).\n\n\n\u003cdetails\u003e\n\n\u003csummary\u003eThe following tokens can be used for testing for game id 100\u003c/summary\u003e\n\n* **User ID 1:** eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIiwiZXh0Ijp7InJvbGVzIjpbIlVTRVIiXSwiZ2FtZUlkIjoxMDB9LCJzY3AiOlsibG9iYnkiXSwiaXNzIjoiaHR0cHM6Ly9pY2UuZmFmb3JldmVyLmNvbSIsImF1ZCI6Imh0dHBzOi8vaWNlLmZhZm9yZXZlci5jb20iLCJleHAiOjIwMDAwMDAwMDAsImlhdCI6MTc0MTAwMDAwMCwianRpIjoiMDE5YjBmMDYtOGJlYi00NzEyLWFiNWUtNGUyNmVjMTM0YjFlIn0.CHEtH0I-BacvjIc_a8ZSKcXMmRZqObGIqScs8BNbZrcje9GVvnTeJEkOxh3Lpo0C1Cm8_x_YQ-zilMTmVu87ZH31_FRYvJuaU9gjo3izmHcncWmSOpjg2n8BtkPXcnggdxM5DW7bPUytkgPGhvFUbeTNRw0Lv1Atb9L2NcW33jhQ-jz-3Ev0fVfgAzJMxrhDCpoCw4QMk6doEIbmJ0Egl1-9AHyr3jd1PXMQAI2K3dX2v0hUmOJ2MxClukUFXkXRp76ZJ9L594YU1gLlIprcuPtRQCIvgJ_gD2Cd6iPQHAUFFvNFmpyLVDU3fgrznWIRkcu2CWSlybhFHCvx5Eldhg \n* **User ID 2:** eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIyIiwiZXh0Ijp7InJvbGVzIjpbIlVTRVIiXSwiZ2FtZUlkIjoxMDB9LCJzY3AiOlsibG9iYnkiXSwiaXNzIjoiaHR0cHM6Ly9pY2UuZmFmb3JldmVyLmNvbSIsImF1ZCI6Imh0dHBzOi8vaWNlLmZhZm9yZXZlci5jb20iLCJleHAiOjIwMDAwMDAwMDAsImlhdCI6MTc0MTAwMDAwMCwianRpIjoiZmNkOTkwZjYtNWU3Mi00MjA4LTg1MzktNmQ1NDU3NDkyOTY4In0.Ef0LJlcziNPaq2OHSUXaHWvDMt6hx42qa9IUDdAUmReluGz0XNPmpJqtbXk2b5uoAZ2s1dS8DQ0axtfjtKRgH9sElnZW1uFahNOYNM8rDYKE9gw2oXUkJQwg-orvOUaSZncX0YNehtJmSzYA7PpbhLiJ9yvroamQ2XqjfcOZ15iz0hsLJ5HM8kB0x09zVDQdncelaqatVLMRRL1xm7PZyavp39yca8kvuk98_IylJtDi0SfkShx-fRoKMBDu9bwqgv8ldpIkN6-x6yuSv_Clo8i7ct7Np8lDhUFDv3mQsbCgEt5FUYTSXplxTO84R7dnwUfFNfVn7qrQqxhpsij9NQ\n* **User ID 3:** eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIzIiwiZXh0Ijp7InJvbGVzIjpbIlVTRVIiXSwiZ2FtZUlkIjoxMDB9LCJzY3AiOlsibG9iYnkiXSwiaXNzIjoiaHR0cHM6Ly9pY2UuZmFmb3JldmVyLmNvbSIsImF1ZCI6Imh0dHBzOi8vaWNlLmZhZm9yZXZlci5jb20iLCJleHAiOjIwMDAwMDAwMDAsImlhdCI6MTc0MTAwMDAwMCwianRpIjoiYmY2MGQwNDQtOTBiNi00NDFkLTkxZTAtMWIyZTI4MzRmMWM2In0.UiIkshBOj-yto1h4ibMkPQU0zHtqF7EIonOFf6mifpJ-KwXGXGDIeWBq1MCNOV7hfDqk1Gd8eQuV0KNayJxlD2Y_CEnm-BlUraUPi_U7_Af1qpMU8ttSP7cMZcauhc1shTVk6bcjL-3CTy80B7f_03GnbYt5jpFeoah82cO38syfJHEpNp1MX390RGiwzLp13nmSxJCC9CNb2iQlXnN5GuyVVJ2hYTB2bjo5idJZx4q649kR347WMwuUDPI6up7EhWDIDivOweniXKb-ZHvRenGORvlBO07OttwuSCjgE2vNbcCV6ioYa7AF1Rc-4k9ND39M2rwnaIDCHfMjrckKaw\n* **User ID 4:** eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI0IiwiZXh0Ijp7InJvbGVzIjpbIlVTRVIiXSwiZ2FtZUlkIjoxMDB9LCJzY3AiOlsibG9iYnkiXSwiaXNzIjoiaHR0cHM6Ly9pY2UuZmFmb3JldmVyLmNvbSIsImF1ZCI6Imh0dHBzOi8vaWNlLmZhZm9yZXZlci5jb20iLCJleHAiOjIwMDAwMDAwMDAsImlhdCI6MTc0MTAwMDAwMCwianRpIjoiZWZiOWQwYjQtODk1Yi00ZjBmLTk5YmYtZjIyOGEzNjQ5NjRmIn0.ge7UpSSq_6m851VzlkyVya8PM2Yoai0euieOO5C_AGht7tAIhIMvsZ8tPCG5X3DTLO9gKZtdokDlQ8QNwrCzzEKce63V2u33NQ_napnvt-g3ucP8FZHyA_h7gNqriCPom0J5sPo6jG_EMdz3YRe8aM2H-CL61lHp32npYuBAeGPGxswPeWprXGgWCp_jenUOYHEWI62hweRo7GP3HO4ksczT0dcrK6VVFoEWpsxHueeTkTD1gJff5Cl0HFSfYkmsTGeURmiC2qgO7dEjSzGT3hTt_mCXUHf21VWOWfnCk0lsYZQ8FSP6uWJQhDj16qiA2sIJwONhauMzNykbSkyKjg\n\u003c/details\u003e\n\n## Running the application in dev mode\n\nThis application needs MariaDB and RabbitMQ to run. You can use our docker-compose file. \nIt will set up default users and passwords, so that no further configuration is required.\n\n```shell script\ndocker-compose up -d\n```\n\n\nYou can run your application in dev mode that enables live coding using:\n```shell script\n./gradlew quarkusDev\n```\n\n\u003e **_NOTE:_**  Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/.\n\n## Running tests\n\nTo run the tests, the backing services must be running and you need to build the quarkus app:\n\n```shell\ndocker-compose up -d\n./gradlew quarkusBuild\n```\n\nYou can then run the tests:\n\n```shell\n./gradlew test\n```\n\nIf the tests fail, look in the gradle output for a link to an HTML file that will contain the test output for each test.\n\n## Packaging and running the application\n\nThe application can be packaged using:\n```shell script\n./gradlew build\n```\nIt produces the `quarkus-run.jar` file in the `build/quarkus-app/` directory.\nBe aware that it’s not an _über-jar_ as the dependencies are copied into the `build/quarkus-app/lib/` directory.\n\nThe application is now runnable using `java -jar build/quarkus-app/quarkus-run.jar`.\n\nIf you want to build an _über-jar_, execute the following command:\n```shell script\n./gradlew build -Dquarkus.package.type=uber-jar\n```\n\nThe application, packaged as an _über-jar_, is now runnable using `java -jar build/*-runner.jar`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffaforever%2Ffaf-icebreaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffaforever%2Ffaf-icebreaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffaforever%2Ffaf-icebreaker/lists"}