From 1ac5fdde91ffbd38c0a309194c41b75c28ae6aa8 Mon Sep 17 00:00:00 2001 From: David Luecke Date: Wed, 27 Apr 2016 20:11:43 -0700 Subject: [PATCH] Revert "Added Strategy support" --- src/index.js | 8 +- src/list.js | 83 +++++---------- test/list.test.js | 257 +++++++++++++++++++++------------------------- 3 files changed, 142 insertions(+), 206 deletions(-) diff --git a/src/index.js b/src/index.js index ae17274..d98241e 100644 --- a/src/index.js +++ b/src/index.js @@ -5,11 +5,9 @@ import reactiveList from './list'; const debug = require('debug')('feathers-rx'); -function FeathersRx(options) { +export default function(options) { options = Object.assign({ id: 'id', - // Whether to requery service when a change is detected - strategy: reactiveList.strategy.never, // The merging strategy merge(current, eventData) { return Object.assign({}, current, eventData); @@ -48,7 +46,3 @@ function FeathersRx(options) { app.mixins.push(mixin); }; } - -FeathersRx.strategy = reactiveList.strategy; - -export default FeathersRx; diff --git a/src/list.js b/src/list.js index 77afaca..3066d2b 100644 --- a/src/list.js +++ b/src/list.js @@ -4,12 +4,10 @@ import 'rxjs/add/operator/exhaustMap'; import { promisify } from './utils'; import { sorter as createSorter, matcher } from 'feathers-commons/lib/utils'; -function List (events, options) { - - return function (params) { +export default function(events, options) { + return function(params) { const query = Object.assign({}, params.query); const result = this._super.apply(this, arguments); - const inputArgs = arguments; if(typeof result.then !== 'function') { return result; @@ -23,61 +21,30 @@ function List (events, options) { // The sort function (if $sort is set) const sorter = query.$sort ? createSorter(query.$sort) : null; - let stream; - - if (options.strategy === List.strategy.never) { - stream = source.concat(source.exhaustMap(data => - Rx.Observable.merge( - events.created.filter(matches).map(eventData => - items => items.concat(eventData) - ), - events.removed.map(eventData => - items => items.filter(current => eventData[options.id] !== current[options.id]) - ), - updaters.map(eventData => - items => items.map(current => { - if(eventData[options.id] === current[options.id]) { - return options.merge(current, eventData); - } - - return current; - }).filter(matches) - ) - ).scan((current, callback) => { - const result = callback(current); - return sorter ? result.sort(sorter) : result; - }, data) - )); - } else if (options.strategy === List.strategy.always) { - stream = source.concat(source.exhaustMap(() => - Rx.Observable.merge( - events.created.filter(matches), - events.removed, - updaters - ).flatMap(() => { - const result = this.find.apply(this, inputArgs); - const source = Rx.Observable.fromPromise(result); - if(typeof result.then !== 'function') { - return Rx.Observable.of(result); - } - return source.map((result) => { - return sorter ? result.sort(sorter) : result; - }); - }) - )); - } else { - throw 'Unsupported feathers-rx strategy type.'; - } + const stream = source.concat(source.exhaustMap(data => + Rx.Observable.merge( + events.created.filter(matches).map(eventData => + items => items.concat(eventData) + ), + events.removed.map(eventData => + items => items.filter(current => eventData[options.id] !== current[options.id]) + ), + updaters.map(eventData => + items => items.map(current => { + if(eventData[options.id] === current[options.id]) { + return options.merge(current, eventData); + } + + return current; + }).filter(matches) + ) + ).scan((current, callback) => { + const result = callback(current); + + return sorter ? result.sort(sorter) : result; + }, data) + )); return promisify(stream, result); }; } - -List.strategy = { - always: {}, - never: {}, - // TODO: Jack - // smart: {} -}; - -export default List; diff --git a/test/list.test.js b/test/list.test.js index fb72f25..9e1775d 100644 --- a/test/list.test.js +++ b/test/list.test.js @@ -7,184 +7,159 @@ import rx from '../src'; describe('reactive lists', () => { let app, service; - describe('strategy.never', function () { - beforeEach(done => { - app = feathers() - .configure(rx({ strategy: rx.strategy.never })) - .use('/messages', memory()); + beforeEach(done => { + app = feathers() + .configure(rx()) + .use('/messages', memory()); - service = app.service('messages'); + service = app.service('messages'); - service.create({ - text: 'A test message' - }).then(() => done()); + service.create({ + text: 'A test message' + }).then(() => done()); + }); + + it('.find is promise compatible', done => { + service.find().then(messages => { + assert.deepEqual(messages, [ { text: 'A test message', id: 0 } ]); + done(); }); + }); - baseTests(); + it('.find as an observable', done => { + service.find().first().subscribe(messages => { + assert.deepEqual(messages, [ { text: 'A test message', id: 0 } ]); + done(); + }); }); - describe('strategy.always', function () { - beforeEach(done => { - app = feathers() - .configure(rx({ strategy: rx.strategy.always })) - .use('/messages', memory()); + it('.create and .find', done => { + service.find().skip(1).subscribe(messages => { + assert.deepEqual(messages, [ + { text: 'A test message', id: 0 }, + { text: 'Another message', id: 1 } + ]); + done(); + }); - service = app.service('messages'); + setTimeout(() => service.create({ text: 'Another message' }), 20); + }); - service.create({ - text: 'A test message' - }).then(() => done()); + it('.update and .find', done => { + service.find().skip(1).subscribe(messages => { + assert.deepEqual(messages, [ + { text: 'An updated test message', id: 0 } + ]); + done(); }); - baseTests(); + setTimeout(() => service.update(0, { text: 'An updated test message' }), 20); }); - function baseTests () { - - it('.find is promise compatible', done => { - service.find().then(messages => { - assert.deepEqual(messages, [ { text: 'A test message', id: 0 } ]); - done(); - }); + it('.patch and .find', done => { + service.find().skip(1).subscribe(messages => { + assert.deepEqual(messages, [ + { text: 'A patched test message', id: 0 } + ]); + done(); }); - it('.find as an observable', done => { - service.find().first().subscribe(messages => { - assert.deepEqual(messages, [ { text: 'A test message', id: 0 } ]); - done(); - }); + setTimeout(() => service.patch(0, { text: 'A patched test message' }), 20); + }); + + it('.remove and .find', done => { + service.find().skip(1).subscribe(messages => { + assert.deepEqual(messages, []); + done(); }); - it('.create and .find', done => { - service.find().skip(1).subscribe(messages => { - assert.deepEqual(messages, [ - { text: 'A test message', id: 0 }, - { text: 'Another message', id: 1 } - ]); - done(); - }); + setTimeout(() => service.remove(0), 20); + }); - setTimeout(() => service.create({ text: 'Another message' }), 20); - }); + it('.find with .create that matches', done => { + const result = service.find({ query: { counter: 1 } }); - it('.update and .find', done => { - service.find().skip(1).subscribe(messages => { - assert.deepEqual(messages, [ - { text: 'An updated test message', id: 0 } - ]); - done(); - }); + result.first().subscribe(messages => assert.deepEqual(messages, [])); - setTimeout(() => service.update(0, { text: 'An updated test message' }), 20); + result.skip(1).subscribe(messages => { + assert.deepEqual(messages, [{ + id: 1, + text: 'New message', + counter: 1 + }]); + done(); }); - it('.patch and .find', done => { - service.find().skip(1).subscribe(messages => { - assert.deepEqual(messages, [ - { text: 'A patched test message', id: 0 } - ]); - done(); - }); + setTimeout(() => { + service.create([{ + text: 'New message', + counter: 1 + }, { + text: 'Other message', + counter: 2 + }]); + }, 20); + }); - setTimeout(() => service.patch(0, { text: 'A patched test message' }), 20); + it('.find with $sort, .create and .patch', done => { + const result = service.find({ query: { $sort: { text: -1 } } }); + + result.skip(1).first().subscribe(messages => { + assert.deepEqual(messages, [{ + id: 1, + text: 'B test message' + }, { + id: 0, + text: 'A test message' + }]); }); - it('.remove and .find', done => { - service.find().skip(1).subscribe(messages => { - assert.deepEqual(messages, []); - done(); - }); + result.skip(2).first().subscribe(messages => { + assert.deepEqual(messages, [{ + id: 0, + text: 'Updated test message' + }, { + id: 1, + text: 'B test message' + }]); - setTimeout(() => service.remove(0), 20); + done(); }); - it('.find with .create that matches', done => { + setTimeout(() => { + service.create({ + text: 'B test message' + }).then(() => + service.patch(0, { + text: 'Updated test message' + }) + ); + }, 20); + }); + + it('removes item after .update/.patch if it does not match', done => { + Promise.all([ + service.create({ text: 'first', counter: 1 }), + service.create({ text: 'second', counter: 1 }) + ]).then(createdMessages => { const result = service.find({ query: { counter: 1 } }); - result.first().subscribe(messages => assert.deepEqual(messages, [])); + result.first().subscribe(messages => + assert.deepEqual(messages, createdMessages) + ); result.skip(1).subscribe(messages => { assert.deepEqual(messages, [{ - id: 1, - text: 'New message', - counter: 1 - }]); - done(); - }); - - setTimeout(() => { - service.create([{ - text: 'New message', - counter: 1 - }, { - text: 'Other message', - counter: 2 - }]); - }, 20); - }); - - it('.find with $sort, .create and .patch', done => { - const result = service.find({ query: { $sort: { text: -1 } } }); - - result.skip(1).first().subscribe(messages => { - assert.deepEqual(messages, [{ - id: 1, - text: 'B test message' - }, { - id: 0, - text: 'A test message' - }]); - }); - - result.skip(2).first().subscribe(messages => { - assert.deepEqual(messages, [{ - id: 0, - text: 'Updated test message' - }, { - id: 1, - text: 'B test message' + text: 'second', + counter: 1, + id: 2 }]); - done(); }); setTimeout(() => { - service.create({ - text: 'B test message' - }).then(() => - service.patch(0, { - text: 'Updated test message' - }) - ); + service.patch(1, { counter: 2 }); }, 20); }); - - it('removes item after .update/.patch if it does not match', done => { - Promise.all([ - service.create({ text: 'first', counter: 1 }), - service.create({ text: 'second', counter: 1 }) - ]).then(createdMessages => { - const result = service.find({ query: { counter: 1 } }); - - result.first().subscribe(messages => - assert.deepEqual(messages, createdMessages) - ); - - result.skip(1).subscribe(messages => { - assert.deepEqual(messages, [{ - text: 'second', - counter: 1, - id: 2 - }]); - done(); - }); - - setTimeout(() => { - service.patch(1, { counter: 2 }); - }, 20); - }); - }); - - } - + }); });