Example #1
0
 couch.changes = function (db, query, callback) {
     var feed = couchr.changes(couchURL(db), query);
     feed.on('change', function (change) {
         callback(null, change);
     });
     feed.on('error', callback);
 };
exports.start = function (manager, callback) {
    var am = {};

    var ev = new events.EventEmitter();
    am.emit = function () {
        ev.emit.apply(ev, arguments);
    };
    am.on = function () {
        ev.on.apply(ev, arguments);
    };

    var user_db = manager._resolve('_users');
    var feed = couchr.changes(user_db, {include_docs: true});

    feed.on('change', function (change) {
        am.emit('change', change);
    });

    am.stop = function (callback) {
        feed.once('error', function (err) {
            // ignore connection errors during stopping of feed
            if (err.code !== 'ECONNREFUSED' &&
                err.code !== 'ECONNRESET') {
                throw err;
            }
        });
        feed.once('stop', callback);
        feed.stop();
    };


    // CouchDB 1.4.0 has a introduced the requirement that user fields be explicitly declared public for them to be
    // returned. In the case of admins, this filtering should not be applied, but there's a bug.
    // BUG: https://issues.apache.org/jira/browse/COUCHDB-1888
    var couchRoot = manager._resolve('');

    couchr.get(couchRoot, function(err, result) {
        if (err) {
            return callback(err, null);
        }

        if (result.version === '1.4.0') {
            var config_db = manager._resolve('_config');

            var publicFields = [
                '_id', '_rev', 'name', 'password_sha', 'password_scheme', 'iterations',
                'name', 'roles', 'derived_key', 'salt', 'database', 'hoodieId',
                'updatedAt', 'signedUpAt', 'type'
            ];

            couchr.put(config_db + '/couch_httpd_auth/public_fields', JSON.stringify(publicFields.join(',')), function() {
                callback(null, am);
            });
        } else {
            callback(null, am);
        }
    });

};