{"id":15043327,"url":"https://github.com/azure/toketi-iothubreact","last_synced_at":"2025-10-04T05:31:33.898Z","repository":{"id":57726653,"uuid":"69405388","full_name":"Azure/toketi-iothubreact","owner":"Azure","description":"Akka Stream library for Azure IoT Hub","archived":true,"fork":false,"pushed_at":"2020-06-30T21:18:33.000Z","size":1623,"stargazers_count":39,"open_issues_count":2,"forks_count":21,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-07-12T14:25:10.752Z","etag":null,"topics":["akka","akka-streams","alpakka","azure-iot","cassandra","iot","java","reactive-streams","scala"],"latest_commit_sha":null,"homepage":"https://azure.github.io/toketi-iothubreact","language":"Scala","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/Azure.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-27T22:55:59.000Z","updated_at":"2024-01-13T21:10:35.000Z","dependencies_parsed_at":"2022-09-26T21:50:58.227Z","dependency_job_id":null,"html_url":"https://github.com/Azure/toketi-iothubreact","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Azure/toketi-iothubreact","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Ftoketi-iothubreact","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Ftoketi-iothubreact/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Ftoketi-iothubreact/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Ftoketi-iothubreact/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Azure","download_url":"https://codeload.github.com/Azure/toketi-iothubreact/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Ftoketi-iothubreact/sbom","scorecard":{"id":19005,"data":{"date":"2025-08-11","repo":{"name":"github.com/Azure/toketi-iothubreact","commit":"769c2ef1fd336b6e371da327f9129872c11d2427"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE: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/Azure/.github/SECURITY.md:1","Info: Found linked content: github.com/Azure/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/Azure/.github/SECURITY.md:1","Info: Found text in security policy: github.com/Azure/.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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 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-14T16:23:50.233Z","repository_id":57726653,"created_at":"2025-08-14T16:23:50.233Z","updated_at":"2025-08-14T16:23:50.233Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278267478,"owners_count":25958872,"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","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"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":["akka","akka-streams","alpakka","azure-iot","cassandra","iot","java","reactive-streams","scala"],"created_at":"2024-09-24T20:48:51.836Z","updated_at":"2025-10-04T05:31:33.262Z","avatar_url":"https://github.com/Azure.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven Central][maven-badge]][maven-url]\n[![Bintray][bintray-badge]][bintray-url]\n[![Build][build-badge]][build-url]\n[![Issues][issues-badge]][issues-url]\n[![Gitter][gitter-badge]][gitter-url]\n\nIoTHubReact\n===========\n\nIoTHub React is an Akka Stream library that can be used **to read events** from\n[Azure IoT Hub](https://azure.microsoft.com/en-us/services/iot-hub/), via a **reactive stream** with\n**asynchronous back pressure**, and **to send commands** to connected devices.\nAzure IoT Hub is a service used to connect thousands to millions of devices to the Azure cloud.\n\nThe library can be used both in Java and Scala, providing a fluent DSL for both programming\nlanguages, similarly to the approach used by Akka.\n\nThe following is a simple example showing how to use the library in Scala. A stream of incoming\ntelemetry data is read, parsed and converted to a `Temperature` object, and then filtered based on\nthe temperature value:\n\n```scala\nIoTHub().source()\n    .map(m ⇒ parse(m.contentAsString).extract[Temperature])\n    .filter(_.value \u003e 100)\n    .to(console)\n    .run()\n```\n\nand the equivalent code in Java:\n\n```java\nTypeReference\u003cTemperature\u003e type = new TypeReference\u003cTemperature\u003e() {};\n\nnew IoTHub().source()\n    .map(m -\u003e (Temperature) jsonParser.readValue(m.contentAsString(), type))\n    .filter(x -\u003e x.value \u003e 100)\n    .to(console())\n    .run(streamMaterializer);\n```\n\nThe following shows how to send a command to devices connected to Azure IoT Hub, for instance when\nthe device is measuring a high temperature, this sends a command to \"turn fan ON\":\n\n```scala\nval turnFanOn  = MessageToDevice(\"Turn fan ON\")\n\nIoTHub()\n    .source()\n    .filter(MessageSchema(\"temperature\"))\n    .map(m ⇒ parse(m.contentAsString).extract[Temperature])\n    .filter(_.value \u003e 85)\n    .map(t ⇒ turnFanOn.to(t.deviceId))\n    .to(hub.sink())\n```\n\n#### Streaming from IoT hub to _any_\n\nAn interesting example is reading telemetry data from Azure IoT Hub, and sending it to a Kafka\ntopic, so that it can be consumed by other services downstream:\n\n```scala\n...\nimport org.apache.kafka.common.serialization.StringSerializer\nimport org.apache.kafka.common.serialization.ByteArraySerializer\nimport org.apache.kafka.clients.producer.ProducerRecord\nimport akka.kafka.ProducerSettings\nimport akka.kafka.scaladsl.Producer\n\ncase class KafkaProducer(bootstrapServer: String)(implicit val system: ActorSystem) {\n\n  protected val producerSettings = ProducerSettings(system, new ByteArraySerializer, new StringSerializer)\n    .withBootstrapServers(bootstrapServer)\n\n  def getSink() = Producer.plainSink(producerSettings)\n\n  def packageMessage(elem: String, topic: String): ProducerRecord[Array[Byte], String] = {\n    new ProducerRecord[Array[Byte], String](topic, elem)\n  }\n}\n```\n\n```scala\nval kafkaProducer = KafkaProducer(bootstrapServer)\n\nIoTHub().source()\n    .map(m ⇒ parse(m.contentAsString).extract[Temperature])\n    .filter(_.value \u003e 100)\n    .runWith(kafkaProducer.getSink())\n```\n\n## Source options\n\n### IoT hub partitions\n\nThe library supports reading from a subset of\n[partitions](https://azure.microsoft.com/en-us/documentation/articles/event-hubs-overview),\nto enable the development of distributed applications. Consider for instance the scenario of a\nclient application deployed to multiple nodes, where each node processes independently a subset of\nthe incoming telemetry.\n\n```scala\nval p1 = 0\nval p2 = 3\n\nIoTHub().source(Seq(p1, p2))\n    .map(m ⇒ parse(m.contentAsString).extract[Temperature])\n    .filter(_.value \u003e 100)\n    .to(console)\n    .run()\n```\n\n### Starting point\n\nUnless specified, the stream starts from the beginning of the data present in each partition.\nIt's possible to start the stream from a given date and time too:\n\n```scala\nval start = java.time.Instant.now()\n\nIoTHub().source(start)\n    .map(m ⇒ parse(m.contentAsString).extract[Temperature])\n    .filter(_.value \u003e 100)\n    .to(console)\n    .run()\n```\n\n### Multiple options\n\n`IoTHub().source()` provides a quick API to specify the start time or the partitions. To specify\nmore options, you can use the `SourceOptions` class, combining multiple settings:\n\n```scala\nval options = SourceOptions()\n  .partitions(0,2,3)\n  .fromTime(java.time.Instant.now())\n  .withRuntimeInfo()\n  .saveOffsets()\n\nIoTHub().source(options)\n    .map(m ⇒ parse(m.contentAsString).extract[Temperature])\n    .filter(_.value \u003e 100)\n    .to(console)\n    .run()\n```\n\n### Stream processing restart - saving the current position\n\nThe library provides a mechanism to restart the stream from a recent *checkpoint*, to be resilient\nto restarts and crashes.\n*Checkpoints* are saved automatically, with a configured frequency, on a storage provided.\nFor instance, the stream position can be saved every 30 seconds and/or every 500 messages\n(the values are configurable), in a table in Cassandra or using Azure blobs.\n\nCurrently the position may be saved in two different ways. The first, simpler method is accomplished by saving\nin a concurrent thread, delayed by time and/or count, depending\non the configuration settings. The second requires slightly more coding but allows the developer to implement\n[at-least-once delivery semantics](http://www.cloudcomputingpatterns.org/at_least_once_delivery/), due to the\nfact the offset saves can be included downstream of processing in your graph.\n\nFor more information about the checkpointing feature, [please read here](CHECKPOINTING.md).\n\n## Build configuration\n\nIoTHubReact is available in Maven Central for Scala 2.11 and 2.12. To import the library into your\nproject, add the following reference in your `build.sbt` file:\n\n```libraryDependencies += \"com.microsoft.azure.iot\" %% \"iothub-react\" % \"0.9.1\"```\n\nor this dependency in `pom.xml` file when working with Maven:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.microsoft.azure.iot\u003c/groupId\u003e\n    \u003cartifactId\u003eiothub-react_2.12\u003c/artifactId\u003e\n    \u003cversion\u003e0.9.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nIoTHubReact internally uses some libraries like Azure IoT SDK, Azure Storage SDK, Akka etc.\nIf your project depends on these libraries too, your can override the versions, explicitly importing\nthe packages in your `build.sbt` and `pom.xml` files. If you encounter some incompatibility with\nfuture versions of these, please let us know opening an issue, or sending a PR.\n\n### IoTHub configuration\n\nBy default IoTHubReact uses an `application.conf` configuration file to fetch the parameters\nrequired to connect to Azure IoT Hub. The connection and authentication values to use, can be found\nin the [Azure Portal](https://portal.azure.com):\n\nProperties required to receive Device-to-Cloud (D2C) messages:\n\n* **hubName**: see `Endpoints` ⇒ `Messaging` ⇒ `Events` ⇒ `Event Hub-compatible name`\n* **hubEndpoint**: see `Endpoints` ⇒ `Messaging` ⇒ `Events` ⇒ `Event Hub-compatible endpoint`\n* **hubPartitions**: see `Endpoints` ⇒ `Messaging` ⇒ `Events` ⇒ `Partitions`\n* **accessPolicy**: usually `service`, see `Shared access policies`\n* **accessKey**: see `Shared access policies` ⇒ `key name` ⇒ `Primary key` (it's a base64 encoded string)\n\nProperties required to send Cloud-to-Device (C2D) commands:\n\n* **accessHostName**: see `Shared access policies` ⇒ `key name` ⇒ `Connection string` ⇒ `HostName`\n\nThe values should be stored in your `application.conf` resource (or equivalent). Optionally you can\nreference environment settings if you prefer, for example to hide sensitive data.\n\n```\niothub-react {\n\n  connection {\n    hubName        = \"\u003cEvent Hub compatible name\u003e\"\n    hubEndpoint    = \"\u003cEvent Hub compatible endpoint\u003e\"\n    hubPartitions  = \u003cthe number of partitions in your IoT Hub\u003e\n    accessPolicy   = \"\u003caccess policy name\u003e\"\n    accessKey      = \"\u003caccess policy key\u003e\"\n    accessHostName = \"\u003caccess host name\u003e\"\n  }\n\n  [... other settings...]\n}\n````\n\nExample using environment settings:\n\n```\niothub-react {\n\n  connection {\n    hubName        = ${?IOTHUB_EVENTHUB_NAME}\n    hubEndpoint    = ${?IOTHUB_EVENTHUB_ENDPOINT}\n    hubPartitions  = ${?IOTHUB_EVENTHUB_PARTITIONS}\n    accessPolicy   = ${?IOTHUB_ACCESS_POLICY}\n    accessKey      = ${?IOTHUB_ACCESS_KEY}\n    accessHostName = ${?IOTHUB_ACCESS_HOSTNAME}\n  }\n\n  [... other settings...]\n}\n````\n\nNote that the library will automatically use these exact environment variables, unless overridden\nin your configuration file (all the default settings are stored in\n[reference.conf](src/main/resources/reference.conf)).\n\nAlthough using a configuration file is the preferred approach, it's also possible to inject a\ndifferent configuration at runtime, providing an object implementing the `IConfiguration` interface.\n\nThe logging level can be managed overriding Akka configuration, for example:\n\n```\nakka {\n  # Options: OFF, ERROR, WARNING, INFO, DEBUG\n  loglevel = \"WARNING\"\n}\n```\n\nThere are other settings, to tune performance and connection details:\n\n* **streaming.consumerGroup**: the\n  [consumer group](https://azure.microsoft.com/en-us/documentation/articles/event-hubs-overview)\n  used during the connection\n* **streaming.receiverBatchSize**: the number of messages retrieved on each call to Azure IoT hub.\n  The default (and maximum) value is 999.\n* **streaming.receiverTimeout**: timeout applied to calls while retrieving messages. The default\n  value is 3 seconds.\n* **streaming.retrieveRuntimeInfo**: when enabled, the messages returned by `IoTHub.Source` will\n  contain some runtime information about the last message in each partition. You can use this\n  information to calculate how many telemetry events remain to process.\n\nThe complete configuration reference (and default values) is available in\n[reference.conf](src/main/resources/reference.conf).\n\nSamples\n========\n\nThe project includes several demos in Java and Scala, showing some of the use cases and how IoThub\nReact API works. All the demos require an instance of Azure IoT hub, with some devices and messages.\n\n1. **DisplayMessages** [Java]: how to stream Azure IoT hub withing a Java application, filtering\n   temperature values greater than 60C\n1. **SendMessageToDevice** [Java]: how to turn on a fan when a device reports a temperature higher\n   than 22C\n1. **AllMessagesFromBeginning** [Scala]: simple example streaming all the events in the hub.\n1. **OnlyRecentMessages** [Scala]: stream all the events, starting from the current time.\n1. **OnlyTwoPartitions** [Scala]: shows how to stream events from a subset of partitions.\n1. **MultipleDestinations** [Scala]: shows how to read once and deliver events to multiple destinations.\n1. **FilterByMessageSchema** [Scala]: how to filter events by message schema. Note: the name of the\n   schema must be set by the device using the `$$MessageSchema` message property. In future this\n   will be a system property, explicitly supported by Azure IoT SDK.\n1. **FilterByDeviceID** [Scala]: how to filter events by device ID. The device ID is automatically\n   set by Azure IoT SDK.\n1. **CloseStream** [Scala]: show how to close the stream\n1. **SendMessageToDevice** [Scala]: shows the API to send messages to connected devices.\n1. **PrintTemperature** [Scala]: stream all Temperature events and print data to the console.\n1. **Throughput** [Scala]: stream all events and display statistics about the throughput.\n1. **Throttling** [Scala]: throttle the incoming stream to a defined speed of events/second.\n1. **StoreOffsets_While_Processing** [Scala]: demonstrates how the stream can be restarted without\n    losing its position, using an optimistic approach (the position is stored in parallel, with some\n    configurable delay fomr the moment of processing). The current position is stored in a Cassandra\n    table (we suggest to run a docker container for the purpose of the demo,\n    e.g. `docker run -ip 9042:9042 --rm cassandra`).\n1. **StoreOffsets_After_Processing** [Scala]: demonstrates how the stream can be restarted without\n    losing its position, using At Least Once Delivery semantic (this guarantees that every event\n    is delivered at least once, regardless of frequency and crashes).The current position is stored\n    in a Cassandra table (we suggest to run a docker container for\n    the purpose of the demo, e.g. `docker run -ip 9042:9042 --rm cassandra`).\n1. **StartFromStoredOffsetsButDontWriteNewOffsets** [Scala]: shows how to use the saved checkpoints\n    to start streaming from a known position, without changing the value in the storage. If the\n    storage doesn't contain checkpoints, the stream starts from the beginning.\n1. **StartFromStoredOffsetsIfAvailableOrByTimeOtherwise** [Scala]: similar to the previous\n    demo, with a fallback datetime when the storage doesn't contain checkpoints.\n1. **StreamIncludingRuntimeInformation** [Scala]: shows how runtime information works.\n1. **SendMessageToDevice** [Scala]: another example showing how to send 2 different messages to\n    connected devices.\n\nWe provide a [device simulator](tools/devices-simulator/README.md) in the tools section,\nwhich will help simulating some devices sending sample telemetry events.\n\nWhen ready, you should either edit the `application.conf` configuration files\n([scala](samples-scala/src/main/resources/application.conf) and\n[java](samples-java/src/main/resources/application.conf))\nwith your credentials, or set the corresponding environment variables.\nFollow the instructions described in the previous section on how to set the correct values.\n\nThe root folder includes also a script showing how to set the environment variables in\n[Linux/MacOS](setup-env-vars.sh) and [Windows](setup-env-vars.bat).\n\nThe demos can be executed using the scripts included in the root folder (`run_\u003clanguage\u003e_samples.sh`\nand `run_\u003clanguage\u003e_samples.cmd`):\n\n* [`run_scala_samples.sh`](run_scala_samples.sh): execute Scala demos\n* [`run_java_samples.sh`](run_java_samples.sh): execute Java demos\n\n\nRunning the tests\n=================\n\nYou can use the included `build.sh` script to execute all the unit and functional tests in the suite.\n\nThe functional tests require an existing Azure IoT Hub resource, that yous should setup. For the\ntests to connect to your IoT Hub, configure your environment using the `setup-env-vars.*` scripts\nmentioned above in this page.\n\n\nOther docs\n==========\n\n* [Contributing](CONTRIBUTING.md)\n* [Checkpointing](CHECKPOINTING.md)\n* [API specs](https://azure.github.io/toketi-iothubreact)\n\n\n\n\n\n\n[maven-badge]: https://img.shields.io/maven-central/v/com.microsoft.azure.iot/iothub-react_2.11.svg\n[maven-url]: http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22iothub-react_2.11%22\n[bintray-badge]: https://img.shields.io/bintray/v/microsoftazuretoketi/toketi-repo/iothub-react.svg\n[bintray-url]: https://bintray.com/microsoftazuretoketi/toketi-repo/iothub-react\n[build-badge]: https://img.shields.io/travis/Azure/toketi-iothubreact.svg\n[build-url]: https://travis-ci.org/Azure/toketi-iothubreact\n[issues-badge]: https://img.shields.io/github/issues/azure/toketi-iothubreact.svg?style=flat-square\n[issues-url]: https://github.com/azure/toketi-iothubreact/issues\n[gitter-badge]: https://img.shields.io/gitter/room/azure/toketi-repo.js.svg\n[gitter-url]: https://gitter.im/azure-toketi/iothub-react\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fazure%2Ftoketi-iothubreact","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fazure%2Ftoketi-iothubreact","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fazure%2Ftoketi-iothubreact/lists"}