コード例 #1
0
ファイル: mock.js プロジェクト: manuelstofer/repo
module.exports = function (options) {
    options = options || {};

    var emitter = require('emitter'),
        client  = require('./client'),
        backend = require('../backends/memory'),
        storage = require('../storage'),
        map     = require('mapr').map,
        socket = emitter({}),
        docs;

    if (options.docs) {
        docs = map(options.docs, function (obj, id) {
            obj._id = id;
            return obj;
        });
    }

    storage({
        backend: backend({docs: docs})
    }).addClient(socket);
    return client({socket: socket});
};
コード例 #2
0
ファイル: client.js プロジェクト: manuelstofer/repo
module.exports = function (options) {

    var em = emitter({}),

        socket = options.socket,

        /**
         * Wraps function with setTimeout
         */
        async = function (fn) {
            return function () {
                var args = arguments;
                return setTimeout(function () {
                    fn.apply(null, args);
                }, 0);
            }
        },

        /**
         * Unsubscribe an from Object / Query
         *
         * @param _id object or query id
         * @param fn event handler
         */
        unsubscribe = async(function (_id, fn) {
            if (typeof _id === 'undefined') { throw new Error('_id is not defined'); }
            if (fn) { em.off(_id, fn); }

            socket.emit('unsub', _id);
        }),

        /**
         * Wraps callback function
         *
         * @param _id object or query id
         * @param fn callback
         * @return function
         */
        createCallback = function (_id, fn) {
            return function (notification) {

                _id = _id;
                if (notification.doc) {
                    _id = notification.doc._id;
                }

                var handler,
                    isSubscribed = true,
                    unsub = _.once(function () {
                        isSubscribed = false;
                        unsubscribe(_id, handleNotification);
                    }),

                    handleNotification = function (notification) {
                        if (isSubscribed) {
                            if (typeof handler === 'function') {
                                handler(notification);
                            } else {
                                var fn = handler[notification.event];
                                if (fn) {
                                    fn(notification);
                                }
                            }
                        }
                    };

                if (fn) {
                    handler = fn(notification, unsub);
                    if (handler && notification.event !== 'error') {
                        em.on(_id, handleNotification);
                    }
                }
                if (!handler) {
                    unsub();
                }
            };
        },

        api = map({

            /**
             * Get an object
             *
             * @param _id
             * @param fn
             */
            get: function (_id, fn) {
                socket.emit('get', _id, createCallback(_id, fn));
            },

            /**
             * Update / Insert an object
             *
             * @param obj
             * @param fn
             */
            put: function (obj, fn) {
                socket.emit('put', obj, createCallback(obj._id, fn));
            },

            /**
             * Delete an object
             *
             * @param _id
             * @param fn
             */
            del: function (_id, fn) {
                socket.emit('del', _id, fn);
            },

            /**
             * Query
             *
             * @param query MongoDB query object
             * @param callback
             */
            query: function (query, callback) {
                socket.emit('query', query, createCallback(getQueryId(query), callback));
            }

        }, async);

    socket.on('notify', function (_id, notification) {
        em.emit(_id, notification);
    });

    return api;
};
コード例 #3
0
ファイル: mongo.js プロジェクト: manuelstofer/repo
 collection.find(query).toArray(function (err, docs) {
     fn(err, map(docs, strId));
 });