{"id":20691896,"url":"https://github.com/andsmedeiros/iara","last_synced_at":"2025-09-27T06:30:44.578Z","repository":{"id":176555729,"uuid":"656742694","full_name":"andsmedeiros/iara","owner":"andsmedeiros","description":"The asynchronous framework for modern C++","archived":false,"fork":false,"pushed_at":"2023-08-12T17:01:33.000Z","size":150,"stargazers_count":13,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-16T23:18:33.238Z","etag":null,"topics":["async","asynchronous","cmake","cooperative-multitasking","embedded","embedded-systems","event-driven","event-loop","events","framework","modern-cpp","modular","portable","promises","signals"],"latest_commit_sha":null,"homepage":"","language":"C++","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/andsmedeiros.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}},"created_at":"2023-06-21T14:43:57.000Z","updated_at":"2023-12-25T08:46:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"9a27a92c-380c-440b-920b-1a00213f8b14","html_url":"https://github.com/andsmedeiros/iara","commit_stats":null,"previous_names":["andsmedeiros/iara"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andsmedeiros%2Fiara","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andsmedeiros%2Fiara/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andsmedeiros%2Fiara/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andsmedeiros%2Fiara/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andsmedeiros","download_url":"https://codeload.github.com/andsmedeiros/iara/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234400193,"owners_count":18826229,"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":["async","asynchronous","cmake","cooperative-multitasking","embedded","embedded-systems","event-driven","event-loop","events","framework","modern-cpp","modular","portable","promises","signals"],"created_at":"2024-11-16T23:18:24.257Z","updated_at":"2025-09-27T06:30:39.268Z","avatar_url":"https://github.com/andsmedeiros.png","language":"C++","readme":"# Iara\n\n![cmake build status](https://github.com/andsmedeiros/iara/actions/workflows/cmake.yml/badge.svg)\n\nIara is a modular framework for composing asynchronous systems in C++17. It is distributed in \nform of several core libraries and some top-level glue code to stitch all together.\n\nIara is portable, unopinionated, light, memory safe and flexible. It can be made to run in\nwhatever gets a decent enough compiler support.\n\n## Disclaimer from the creator\n\nIara is a very WIP. It is born out of need for formalisation of some libraries I developed for\ninternal use and that, even though had been successfully integrated into production environments\nfor years, lacked proper testing, documentation and refactoring needed.\n\nAs such, most of the available libraries are fully functional, very well tested and many of them\nare extremely well documented, both with source annotations and usage guides. However, there is\nstill some work to be done in the libraries, as well as there are other custom libraries I would\nlike to create or integrate to this project.\n\nFurthermore, I still envision a bunch of functionality to be implemented by a top-level \napplication container under the `iara` namespace; this is still to be developed.\n\n## Project libraries\n\n### Fugax\n\n[Fugax](https://github.com/andsmedeiros/iara/tree/main/fugax) implements a sleek event loop\nthat can be employed on various platforms. It provides time-based scheduling functionality and\nwith a very enjoyable API and is used to orchestrate asynchronous task execution from a single, \ncentral control point.\n\nFugax has an extensive test suite and excellent documentation. It has also been successfully\nused in commercial projects out in the wild.\n\n### FUSS\n\n[FUSS](https://github.com/andsmedeiros/iara/tree/main/fuss) is an in-process pub/sub system. It\nallows for objects to subscribe to specific messages broadcast by other objects, even if all \nthese objects are completely unrelated and know nothing more about each other, only by adhering \nto a type-based contract.\n\nFUSS is well tested and its code is well annotated; its usage guide is still lacking, however.\nNonetheless, it has also been used successfully in commercial projects.\n\n### Juro\n\n[Juro](https://github.com/andsmedeiros/iara/tree/main/juro) implements Javascript promises with\na very strong typing assurance. It is light, efficient, cleverly implemented, and closely follows \nthe original Javascript API.\n\nJuro's documentation is outstanding and its test suite is very comprehensive. It is the latest\naddition to my asynchrony-related libraries and the utter motivation for Iara to exist, but is\nalready being employed on a commercial project that is about to be released.\n\n### Plumbing\n\n[Plumbing](https://github.com/andsmedeiros/iara/tree/main/plumbing) is a legacy library with\nsubpar functionality. It implements object pull streams, so that producers can yield their\nproducts to a pipeline of transformations, which will eventually lead to a consumer.\n\nAlthough the idea behind plumbing is excellent, its implementation is lacking and its API is not\nwell thought. Also, there are no tests and no documentation, along a lot of dead and \nmisfunctioning code. Even though I have used it in commercial projects, I do not feel its\nimplementation complies to my standards nowadays, so I strongly discourage using it.\n\n**THEN WHY IS THIS S\\*\\*\\* HERE???**\n\nIt is here as a placeholder for the upcoming revamp this idea will get. The concept is good,\nback then I was not.\n\n### Utils\n\nThere are some [generic utils](https://github.com/andsmedeiros/iara/tree/main/utils) that\nare used through the framework, along with some legacy, unused, sometimes misfunctioning -- but \nstill interesting, though -- code. This will eventually deserve a cleanup and some well care, \nhowever, it currently sits at the bottom of the list.\n\n## Building\n\nThe project builds by default with CMake and, besides Catch2 as the test library, there are no\ndependencies, so all the needed stuff is likely installed already.\n\n```\n~$ git clone https://github.com/andsmedeiros/iara\n~$ cd iara\n\n~/iara$ mkdir build\n~/iara$ cd build\n\n~/iara/build$ cmake --preset=default ..\n~/iara/build$ cmake --build .\n```\n\nThis will create:\n```\niara/\n    dist/\n        bin/\n            iara-test\n        lib/\n            libfugax.[so/a]\n            libjuro.[so/a]\n            libiara.[so/a]\n```\n\n`iara-test` is the test suite; all `lib*` files are the library files that, in addition to \ninclude headers, are necessary to use each library. `libiara` is just the other libraries\namalgamated, for now, and can be used along each library's include directory to provide all\nlibraries at once.\n\n### Build configuration\n\nSome build-time configuration is available. They can be customised by either providing a preset\nfile \n\n```\n~/iara/build$ cmake --preset=MY_PRESET_NAME ..\n```\n\nor passing environment variables during configuration phase\n\n```\n~/iara/build$ OPTION_1=value1 OPTION_2=value2 cmake ..\n```\n\nAt the moment, only Fugax employs this mechanism. These are the available build options:\n\n- `FUGAX_TIME_INCLUDE` if defined, will be directly appended to a `#include` directive and\n    can be used to determine a header file that contains the definitions for Fugax's time\n    type.\n- `FUGAX_MUTEX_INCLUDE` likewise, if defined, is expected to alias the path to a header file\n    that contains Fugax's mutex type.\n- `FUGAX_TIME_TYPE` **[required]** must alias an integral, unsigned type to hold Fugax's \n    internal counter. The choice of this type can interfere with the maximum delay an event \n    can have.\n- `FUGAX_MUTEX_TYPE` the `BasicLockable` type that will be used to declare Fugax's event loop\n    internal mutex. Even though name mutex, this can be any structure that can ensure a \n    critical section does not get preempted, such as by disabling and re-enabling exceptions \n    in embedded systems.\n\n### Building without CMake\n\nBuilding without CMake is fairly easy:\n\n- Manually edit any files under `config/` tree with your desired configuration -- the files\n    should be easy to understand and edit anyway --, then rename them from `*.hpp.in` to \n    `*.hpp`.\n\nTo target `libfugax`, compile everything under `fugax/src`, while including `fugax/include`,\n`config/include`, `juro/include` and `utils/include`.\n\nTo target `libjuro`, compile everything under `juro/src`, while including `juro/include` and \n`utils/include`.\n\nFUSS is header-only and Plumbing is not a currently supported target.\n\nEach library has a test directory under `test/src` and `test/include`. Their test suites can be\nbuild using Catch2 and linking against their respective libraries, but this is unsupported out\nof CMake.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandsmedeiros%2Fiara","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandsmedeiros%2Fiara","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandsmedeiros%2Fiara/lists"}