Skip to content

Commit

Permalink
use named connections and single change event
Browse files Browse the repository at this point in the history
  • Loading branch information
pemrouz committed Jun 26, 2016
1 parent ad55fb7 commit d75d413
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 84 deletions.
51 changes: 23 additions & 28 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ var _header = require('utilise/header');

var _header2 = _interopRequireDefault(_header);

var _client = require('utilise/client');

var _client2 = _interopRequireDefault(_client);

var _values = require('utilise/values');

var _values2 = _interopRequireDefault(_values);
Expand All @@ -21,9 +17,9 @@ var _noop = require('utilise/noop');

var _noop2 = _interopRequireDefault(_noop);

var _key = require('utilise/key');
var _keys = require('utilise/keys');

var _key2 = _interopRequireDefault(_key);
var _keys2 = _interopRequireDefault(_keys);

var _not = require('utilise/not');

Expand All @@ -33,6 +29,10 @@ var _is = require('utilise/is');

var _is2 = _interopRequireDefault(_is);

var _to = require('utilise/to');

var _to2 = _interopRequireDefault(_to);

/* istanbul ignore next */
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

Expand All @@ -43,21 +43,22 @@ function db(ripple) {
/* istanbul ignore next */
var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];

var db = _ref.db;
var _ref$db = _ref.db;
var db = _ref$db === undefined ? {} : _ref$db;

log('creating');
ripple.adaptors = ripple.adaptors || {};
ripple.connections = [];
ripple.on('change.db', crud(ripple));
connection(ripple)(db);
ripple.adaptors = ripple.adaptors || {};
ripple.connections = (0, _keys2.default)(db).map(function (k) {
return connect(ripple)(k, db[k]);
}).reduce(_to2.default.obj, {});
return ripple;
}

var connection = function connection(ripple) {
return function (config) {
if (!config) return ripple;
var connect = function connect(ripple) {
return function (id, config) {
if (!config) return { id: id, invalid: err('no connection string', id) };

// TODO Use built-in url parse
_is2.default.str(config) && (config = {
type: (config = config.split('://')).shift(),
user: (config = config.join('://').split(':')).shift(),
Expand All @@ -67,13 +68,11 @@ var connection = function connection(ripple) {
password: config.join('@')
});

if ((0, _values2.default)(config).some((0, _not2.default)(Boolean))) return err('incorrect connection string', config), ripple;

var con = (ripple.adaptors[config.type] || _noop2.default)(config);
if ((0, _values2.default)(config).some((0, _not2.default)(Boolean))) return { id: id, invalid: err('incorrect connection string', id, config) };

con && ripple.connections.push(con);
var connection = (ripple.adaptors[config.type] || _noop2.default)(config);

return ripple;
return connection ? (connection.id = id, connection) : { id: id, invalid: err('invalid connection', id) };
};
};

Expand All @@ -89,17 +88,13 @@ var crud = function crud(ripple) {
if (!(0, _header2.default)('content-type', 'application/data')(res)) return;
if ((0, _header2.default)('silentdb')(res)) return delete res.headers.silentdb;
if (!type) return;
log('crud', name, type);

ripple.connections.forEach(function (con) {
return con[type](silent(ripple))(res, key, value);
var updated = (0, _values2.default)(ripple.connections).filter(function (con) {
return con.change && con.change(type)(res, change);
}).map(function (d) {
return d.id;
});
};
};

var silent = function silent(ripple) {
return function (res) {
return (0, _key2.default)('headers.silentdb', true)(res), ripple(res);
if (updated.length) log('crud', type, name, updated.join(',').grey);
};
};

Expand Down
40 changes: 18 additions & 22 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
// -------------------------------------------
// Pipe resources to/from another source
// -------------------------------------------
export default function db(ripple, { db } = {}){
export default function db(ripple, { db = {} } = {}){
log('creating')
ripple.adaptors = ripple.adaptors || {}
ripple.connections = []
ripple.on('change.db', crud(ripple))
connection(ripple)(db)
ripple.adaptors = ripple.adaptors || {}
ripple.connections = keys(db)
.map(k => connect(ripple)(k, db[k]))
.reduce(to.obj, {})
return ripple
}

const connection = ripple => config => {
if (!config) return ripple
const connect = ripple => (id, config) => {
if (!config) return { id, invalid: err('no connection string', id) }

// TODO Use built-in url parse
is.str(config) && (config = {
type : (config = config.split('://')).shift()
, user : (config = config.join('://').split(':')).shift()
Expand All @@ -24,15 +24,13 @@ const connection = ripple => config => {
})

if (values(config).some(not(Boolean)))
return err('incorrect connection string', config), ripple

const con = (ripple.adaptors[config.type] || noop)(config)
return { id, invalid: err('incorrect connection string', id, config) }

con && ripple
.connections
.push(con)
const connection = (ripple.adaptors[config.type] || noop)(config)

return ripple
return connection
? (connection.id = id, connection)
: ({ id, invalid: err('invalid connection', id) })
}

const crud = ripple => (name, change) => {
Expand All @@ -42,21 +40,19 @@ const crud = ripple => (name, change) => {
if (!header('content-type', 'application/data')(res)) return
if (header('silentdb')(res)) return delete res.headers.silentdb
if (!type) return
log('crud', name, type)
const updated = values(ripple.connections)
.filter(con => con.change && con.change(type)(res, change))
.map(d => d.id)

ripple
.connections
.forEach(con => con[type](silent(ripple))(res, key, value))
if (updated.length) log('crud', type, name, updated.join(',').grey)
}

const silent = ripple => res => (key('headers.silentdb', true)(res), ripple(res))

import header from 'utilise/header'
import client from 'utilise/client'
import values from 'utilise/values'
import noop from 'utilise/noop'
import key from 'utilise/key'
import keys from 'utilise/keys'
import not from 'utilise/not'
import is from 'utilise/is'
import to from 'utilise/to'
const err = require('utilise/err')('[ri/db]')
, log = require('utilise/log')('[ri/db]')
Loading

0 comments on commit d75d413

Please sign in to comment.