Skip to content

Instantly share code, notes, and snippets.

@mdobson
Created July 8, 2014 13:42
Show Gist options
  • Save mdobson/e38662d088eead744c46 to your computer and use it in GitHub Desktop.
Save mdobson/e38662d088eead744c46 to your computer and use it in GitHub Desktop.
var EventEmitter = require('events').EventEmitter;
var util = require('util');
var Rx = require('rx');
var RxWrap = require('./observable_rx_wrap');
var Logger = require('./logger')();
var Query = require('./query');
var Registry = require('./registry');
var DeviceResource = require('./device_resource');
var Runtime = module.exports = function(opts) {
EventEmitter.call(this);
//There are locking issues in the unit tests. This is a brief work around.
if(opts && opts.registry) {
this.registry = opts.registry;
} else {
this.registry = new Registry();
}
this.exposed = {};
this.path = '/devices';
this.exposeQuery = null;
this._jsDevices = [];
this._observable = Rx.Observable.fromEvent(this, 'deviceready');
};
util.inherits(Runtime, EventEmitter);
//
Runtime.prototype.log = function(message, data) {
Logger.emit('user-log', message, data);
};
// query related
Runtime.prototype.ql = function() {};
//for now we'll just return the JavaScript object.
Runtime.prototype.where = function(params) {
return new Query(params);
};
Runtime.prototype.expose = function(query) {
if(typeof query === 'string' && query === '*') {
query = new Query(query);
}
var self = this;
this.on('deviceready', function(device) {
if(query.match(device)) {
self._exposeDevice(device);
}
});
};
Runtime.prototype._exposeDevice = function(device) {
this.exposed[this.path + '/' + device.id] = device;
};
Runtime.prototype.createDeviceResource = function() {
return DeviceResource.create(this);
};
//This is the new observe syntax. It will take an array of queries, and a callback.
Runtime.prototype.observe = function(queries, cb) {
var self = this;
var filters = [];
queries.forEach(function(query){
var filter = this._observable.filter(function(device){
return query.match(device);
});
filters.push(filter);
});
filters.push(function(){
return arguments;
});
var observable = Rx.Observable.zip.apply(null, filters);
observable
.subscribe(function(args){
if (Array.isArray(args)) {
cb.apply(null, Array.prototype.slice.call(args));
} else {
cb.apply(null, [args]);
}
});
};
// raw db -
Runtime.prototype.find = function() {
return this.registry.find.apply(this.registry, arguments);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment