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) {
    super();

    // Identifier is required to be set
    this.id = '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) {
    builder.event('timer')
      .description('A timer has been fired')
      .type('string')
      .done();

    builder.action('addTimer')
      .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')
      .done();
  }

  constructor() {
    super();

    this.id = '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);
    }, delay.ms)
  }
}