npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@iotes/core

v0.2.9

Published

An IOT adaptor for JavaScript

Downloads

51

Readme

iotes

A javascript library for intergrating iot services with modern front end state management tools

npm (scoped) NPM GitHub Workflow Status (master)

Table of Contents

Work in progess

Note that this is very much a work in progress at this stage and not suitable for general use

We the Curious

This is designed to be developed to replace the ifs-brightsignmiddleware-redux

Getting Started

Introduction to iotes

Modern front end libraries lean heavily on a declaritive approach to state management where interfaces which which react to updating state object or objects. This intergrates naturally well with REST or graphql services where new state is delivered on request, but requires some more thought for iot applications where the connection to a service is generally stateful, ie the connection remains open and the data is streamed in as and when it arrives.

One solution is to allow front end component to subscribe to a stream of data from the iot device which remains open for the life time of the application. This 'device stream' only updates when new data is received, unaffected by the underlying connection status of the iot service allowing the front end component to listen to state updates and react in the usual way.

However this means no connection information is provided on that stream. If a connection is never established because the remote iot service is unavaliable for example then no data will appear on the the device stream and the front end will appear unresponsive.

In order to receive updates fromt the iot host (such as an mqtt broker), a host stream can be established in the same manner which is dedicted to connection status allowing components to react to connection status. Keeping the host stream seperate form the device stream allows different treatment of the connection state which can be convienient for analytics or debugging.

The iotes library provides an abstraction to create the host stream and the device stream for different connection strategies, and plugins for extra compatibility with different front end frameworks.

General Design

iotes is deigned to a be a generic middleware to sit between a state management library (via a plugin) and iot api (via a strategy). It can operate without a plugin but must have a strategy in order to function.

Iotes works on an observable pattern, On initialization iotes creates two stores which handle subscribers (functions which are notified of store changes) and dispatchers (functions which update the store).

The two stores are the

  • host store : for system events like connections, disconnections etc
  • device store: which is reserved one for data from the the iot devices.

                ----------                      -----------                      -------------   
                |        |   -- dispatch -->    |         |   -- subscribe -->   |           |
    State <---> | Plugin |                      |  iotes  |                      | Strategy  |  <---> Network
                |        |   <-- subscribe --   |         |   <-- dispatch --    |           |
                ----------                      -----------                      -------------

Installation

iotes is available as an npm package.

itoes strategies and plugins are avaliable as serperate npm packages, their names being with iotes-*

Install iotes locally via npm:

npm install iotes

To form a connection to an iot service you will need a connection strategy. This is to install a basic mqtt strategy.

npm install iotes-strategy-mqtt

~~A full list of strategies is avaliable here~~

There may also be an existing plugin avaliable for your front end framework, or you can write your own

npm install iotes-react-hooks

~~A full list of plugins is avaliable here~~

iotes is written in typescript and comes with full type declarations

Using iotes

a new iotes instances is created by using the createIotes function, with your system topology declared, more information can be found about system topolgy map can be found her here.

Each iotes instance may hande connection to multiple hosts, but only on strategy can be used per instance.

iotes returns for functions for receiving and sending messages using the iotes host and device streams

    {
        hostSubscribe: (selector: (state) => state)
        hostDispatch: (hostDispatacble: HostDispatchable)
        deviceSubscribe: (selector: (state) => state)
        deviceDisptach: (hostDispatcable: HostDispatchable)
    }

The topology map is the main thing would need to supply. The topology map takes two arrays. An array of hosts and the devices

What a host is depends on the strategy, in the case of mqtt for example the host refers to the mqtt broker. In the case of the a phdiget it is a hub.

The devices are connected to the host by the hostName field in the device config. They will be connected to the correct host on iotes initialization.

import { createIotes } from 'iotes'
import { createMqttStrategy } from 'iotes-mqtt-strategy'

const topologyMap = {
    client: {name: 'test app'} 
    hosts: [
        host: 'ws://127.0.0.1', 
        port: '1883', 
        name: 'mqttExample', 
        strategyConfig: {} 
    ],
    devices: [
        hostName: 'mqttExample',
        name 'deviceExample',
    ]
}

const { 
    hostSubscribe,
    hostDispatch,
    deviceSubscribe,
    deviceDisptach   
} = createItoes(topologyMap, createMqttStrategy)

hostSubscribe((state) => console.log(state))
import { createIotes, Iotes, TopologyMap, State } from 'iotes'
import { createMqttStrategy } from 'iotes-mqtt-strategy'

const topologyMap: TopologyMap = {
    hosts: [
        host: 'ws://127.0.0.1', 
        port: '1883', 
        name: 'mqttExample', 
        strategyConfig: {} 
    ],
    devices: [
        hostName: 'mqttExample',
        name 'deviceExample',

    ]
}

const { 
    hostSubscribe,
    hostDispatch,
    deviceSubscribe,
    deviceDisptach   
}: Iotes = createItoes(topologyMap, createMqttStrategy)


hostSubscribe((state: State) => console.log(state))

Contribution

iotes is under constant development, and has several important issues still open. to see where we are in the development, picked an issue of your taste and gave us a hand.

If you would like to see a feature implemented or want to contribute a new feature, you are welcome to open an issue to discuss it and we will be more than happy to help.

If you choose to make a contribution, please fork this repository, work on a feature and submit a pull request.

MIT License

Copyright (c) 2020 Seamus Foley

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.