Example #1
0
module.exports = function(options) {
  var validOptions = {};

  if (options.hasOwnProperty('value')) {
    validOptions.value = parseInt(options.value, 10);
    if (isNaN(validOptions.value) || validOptions.value < 0 || validOptions.value > 100) {
      return utils.promise.reject(new Error('Volume value must be integer percentage 0 - 100'));
    }
  }

  if (options.hasOwnProperty('diff')) {
    validOptions.diff = parseInt(options.diff, 10);
    if (isNaN(validOptions.diff)) {
      return utils.promise.reject(new Error('Volume diff must be integer'));
    }
  }

  if (!options.hasOwnProperty('value') && !options.hasOwnProperty('diff')) {
    return utils.promise.reject(new Error('Volume requires value or diff property'));
  }

  if (validOptions.diff && validOptions.value) {
    return utils.promise.reject(new Error('Diff and value provided - must have only 1'));
  }

  return utils.promise.resolve(validOptions);
};
    .then(null, function(err) {
      logger.warn(err);

      // resolving ready promise so we can work with offline services
      ready.resolve();
      return utils.promise.reject(new Error('BBC Services offline?'));
    });
Example #3
0
  function build() {
    var deferred = utils.promise.defer(),
        text = renderTemplate(options, ports);

    deferred.resolve(text);

    return deferred.promise;
  }
Example #4
0
        .then(function(data) {
          var settings = data || defaults;

          delete settings['type'];
          delete settings['_id'];

          return utils.promise.resolve(settings);
        })
Example #5
0
module.exports = function(options) {
  var validOptions = {};

  validOptions.force = options.force || false;

  if (validOptions.force !== true && validOptions.force !== false) {
    return utils.promise.reject(new Error('Force must be a boolean'));
  }

  if (options.hasOwnProperty('path') ) {
    if (typeof options.path === 'string') {
      validOptions.path = options.path;
    } else {
      return utils.promise.reject(new Error('Path must be a string'));
    }
  }

  return utils.promise.resolve(validOptions);
};
Example #6
0
function writeConfigToDisk(content) {
  var generateFileName = utils.promise.nfcall(tmp.tmpName);

  return generateFileName.then(function(tmpFilePath) {
    logger.debug("Writing mpd config to file " + tmpFilePath);

    return utils.promise.nfcall(fs.writeFile, tmpFilePath, content)
      .then(function() { return tmpFilePath; });
  });
}
Example #7
0
ServicesRegister.prototype.stations = function() {
  var providers = this._providers, promises;

  promises = Object.keys(providers).map(function(k) {
    return providers[k].stations();
  });

  return utils.promise.all(promises)
    .then(function(allStations) {
      return allStations.reduce(function(a,b) {
        return a.concat(b);
      });
  });
};
Example #8
0
ServicesRegister.prototype.register = function(serviceprovider) {
  var self       = this,
      providerId = serviceprovider.id,
      exists     = Object.keys(self._providers).indexOf(providerId) > -1;

  if(exists) {
    return utils.promise.reject('Provider ' + providerId + ' already registered');
  } else {
    return self._registerProvider(providerId, serviceprovider)
      .then(function() {
        self._bindToEvents(providerId, serviceprovider);
      });
  }
};
Example #9
0
    function validate(input) {
      var validated = utils.promise.defer(),
          inputKeys, defaultKeys;

      input       = input || {};
      inputKeys   = Object.keys(input).sort();
      defaultKeys = Object.keys(defaults).sort();

      if(deepEqual(inputKeys, defaultKeys)) {
        validated.resolve(input);
      } else {
        var err = new Error('Required settings keys not found: '+defaultKeys);
        validated.reject(err);
      }

      return validated.promise;
    }
Example #10
0
module.exports = function(options) {
  var validOptions = {};

  if(options.hasOwnProperty('to')) {
    validOptions.to = parseInt(options.to, 10);
  } else {
    return utils.promise.reject(new Error('Destination not set'));
  }

  if(options.hasOwnProperty('from')) {
    options.position = options.from;
  }

  return position(options)
    .then(function(position) {
      validOptions.from = position.value;
      return utils.promise.resolve(validOptions);
    });
};
Example #11
0
ServicesRegister.prototype._registerProvider = function(providerId, serviceprovider) {
  var that = this,
      dfd  = utils.promise.defer();

  this._providers[providerId] = serviceprovider;

  serviceprovider.fetchServices()
    .then(function(services) {
      services.forEach(function(serviceId) {
        try {
          that._registerService(providerId, serviceId);
        } catch(err) {
          dfd.reject(err);
        }
      });

      dfd.resolve();
    });

  return dfd.promise;
}
Example #12
0
    function get() {
      var getPromise = utils.promise.defer();

      db.findOne(query, function(err, settings) {
        if(err) {
          getPromise.reject(err);
        } else {
          getPromise.resolve(settings);
        }
      });

      return getPromise.promise
        .then(function(data) {
          var settings = data || defaults;

          delete settings['type'];
          delete settings['_id'];

          return utils.promise.resolve(settings);
        })
        .then(null, utils.failedPromiseHandler(logger));
    }
Example #13
0
    function set(data) {
      var setPromise = utils.promise.defer(),
          options    = { upsert: true },
          validData,
          dataToStore;

      return validate(data).then(function(validated) {
        validData = validated;
        dataToStore = utils.mergeObjects(query, validData);

        db.update(query, dataToStore, options, function(err, numReplaced) {
          if(err) {
            setPromise.reject(err);
          } else {
            setPromise.resolve(numReplaced);
          }
        })

        emitUpdate(validData);

        return setPromise.promise;
      });
    }
Example #14
0
 instance.fetchServices = function() {
   return utils.promise.resolve([id]);
 };
Example #15
0
 .then(function(filePath) {
   return utils.promise.resolve([filePath, ports[0]]);
 })
Example #16
0
function empty() {
  return utils.promise.resolve({});
}
Example #17
0
function formatResponse(radio, playlistInfo) {
  var playlistArray = radio.formatResponse(playlistInfo, true),
      playlist      = formatPlaylist(playlistArray);

  return utils.promise.resolve(playlist);
}
function create(myLogger) {
  var instance   = new EventEmitter({wildcard: true}),
      serviceIds = [],
      ready      = utils.promise.defer(),
      stationsPromise;

  logger = myLogger || logger;

  instance.id              = 'bbc-services';
  instance.ready           = ready.promise;
  instance.cache           = {};
  instance.metadata        = metadata;
  instance.fetchServices   = fetchServices;
  instance.stations        = stations;
  instance.playlist        = playlist;
  instance.connect         = connect;
  instance.listenForEvents = listenForEvents;
  instance.cacheStore      = cacheStore;

  return instance;

  function playlist(serviceId) {
    var service = cacheFor(serviceId),
        playlist;

    if (service && service.playlist) {
      return {
        type: 'playlist',
        value: service.playlist
      };
    }
  }

  function fetchServices() {
    instance.connect();

    return instance.ready.then(function() {
      return serviceIds;
    });
  }

  function metadata(serviceId) {
    if(typeof serviceId === 'undefined') {
      return serviceIds.map(function(serviceId) {
        var data = cacheFor(serviceId);
        data.id = serviceId;

        return data;
      });
    } else if(serviceIds.indexOf(serviceId) > -1) {
      return cacheFor(serviceId);
    } else {
      return null;
    }
  }

  function stations() {
    var url = bbcServicesURL+'/stations.json';

    if (!stationsPromise) {
      stationsPromise = http.get(url)
                            .then(function (data) {
                              var list = [],
                                  json = JSON.parse(data);
                              if (json.stations) {
                                list = json.stations;
                              }
                              return list;
                            })
                            .then(null, function(err) {
                              logger.warn(err);
                              return [];
                            });
    }

    return stationsPromise;
  }

  function connect() {
    if(typeof bbcServicesURL === 'undefined') {
      logger.error('BBC_SERVICES_URL not found in ENV');
    }

    seedCache().then(connectToEventSource);

    return instance;
  }

  function seedCache() {
    var url = bbcServicesURL+'/services.json';

    return http.get(url).then(function(data) {
      var services;

      try {
        services = JSON.parse(data).services;
      } catch(err) {
        logger.warn(err);
        services = [];
      }

      services.forEach(function(service) {
        var serviceId = service.id;
        Object.keys(service).forEach(function(key) {
          cacheStore(serviceId, key, service[key]);
        });
      });

      return ready.resolve();
    })
    .then(null, function(err) {
      logger.warn(err);

      // resolving ready promise so we can work with offline services
      ready.resolve();
      return utils.promise.reject(new Error('BBC Services offline?'));
    });
  }

  function connectToEventSource() {
    var url = bbcServicesURL+'/stream',
        es;

    es = new EventSource(url);

    logger.debug('Connecting to', url);

    listenForEvents(es);
  }

  function listenForEvents(es) {
    var firstError = true;

    es.addEventListener('message', function(data) {
      handleMessage(data);
    });

    es.addEventListener('error', function(error) {
      // always fails on startup
      if(firstError) {
        firstError = false;
      } else {
        logger.warn('EventSource error', error.stack);
      }
    });
  }

  function handleMessage(msg) {
    var data = parseMessage(msg.data),
        isNewData;

    if(!data) {
      logger.warn('Invalid JSON recieved', msg);
      return false;
    }

    isNewData = cacheStore(data.service, data.topic, data.data);

    if(isNewData) {
      // this is for the avoider
      instance.emit(data.service + '.' + data.topic, data.data);
      logger.debug('new data', data.service, data.topic, data.data);
    } else {
      logger.debug('data is the same', data.service, data.topic);
    }
  }

  function cacheStore(serviceId, topic, data) {
    var cache = cacheFor(serviceId);

    data = data || {};
    // delete timestamp to check for data difference
    delete data.received;

    if(JSON.stringify(data) === JSON.stringify(cache[topic])) {
      return false;
    } else {
      cache[topic] = data;
      return true;
    }
  }

  function cacheFor(serviceId) {
    if(typeof instance.cache[serviceId] == 'undefined') {
      serviceIds.push(serviceId);
      instance.cache[serviceId] = {};
    }

    return instance.cache[serviceId];
  }

  function parseMessage(data) {
    try {
      return JSON.parse(data);
    } catch(err) {
      logger.warn('Cannot parse', err);
      return false;
    }
  }
}
Example #19
0
 .then(function(position) {
   validOptions.from = position.value;
   return utils.promise.resolve(validOptions);
 });
Example #20
0
  instance.stations = function() {
    var stations = [instance.station()];

    return utils.promise.resolve(stations);
  }