Building thingsΒΆ

Things are built by extending Thing with a combination of types and capabilities. The first step is to make sure that the project has acccess to abstract-things:

$ npm install abstract-things

It is recommended to target at least Node 8 to make use of async and await. It will make handling the asynchronous nature of API calls easier.

The smallest possible thing simply extends Thing:

const { Thing } = require('abstract-things');

class ExampleThing extends Thing {
        constructor(id) {

                // Identifier is required to be set
       = 'example:' + id;

The following example provides a class named Timer that declares its type and available API. It will emit the timer event when an added timer is fired.

const { Thing } = require('abstract-things');
const { duration } = require('abstract-things/values');

* Timer that calls itself `timer:global` and that allows timers to be set
* and listened for in the network.
class Timer extends Thing {
        static get type() {
                return 'timer';

        static availableAPI(builder) {
                        .description('A timer has been fired')

                        .description('Add a timer to be fired')
                        .argument('string', false, 'Name of timer')
                        .argument('duration', false, 'Amount of time to delay the firing of the timer')

        constructor() {

       = 'timer:global';

        addTimer(name, delay) {
                if(! name) throw new Error('Timer needs a name');
                if(! delay) throw new Error('Timer needs a delay');

                delay = duration(delay);

                setTimeout(() => {
                        this.emitEvent('timer', name);