| 
									
										
										
										
											2016-04-05 14:45:09 -07:00
										 |  |  | import Rx, { AsyncSubject, Observable } from 'rx'; | 
					
						
							|  |  |  | import moment from 'moment'; | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | import debugFactory from 'debug'; | 
					
						
							| 
									
										
										
										
											2015-06-20 19:55:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  | const debug = debugFactory('fcc:rxUtils'); | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function saveInstance(instance) { | 
					
						
							| 
									
										
										
										
											2015-06-20 19:55:22 -07:00
										 |  |  |   return new Rx.Observable.create(function(observer) { | 
					
						
							| 
									
										
										
										
											2015-06-25 15:03:46 -07:00
										 |  |  |     if (!instance || typeof instance.save !== 'function') { | 
					
						
							|  |  |  |       debug('no instance or save method'); | 
					
						
							| 
									
										
										
										
											2015-06-20 19:55:22 -07:00
										 |  |  |       observer.onNext(); | 
					
						
							|  |  |  |       return observer.onCompleted(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-03-02 20:54:14 -08:00
										 |  |  |     return instance.save(function(err, savedInstance) { | 
					
						
							| 
									
										
										
										
											2015-06-20 19:55:22 -07:00
										 |  |  |       if (err) { | 
					
						
							|  |  |  |         return observer.onError(err); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-06-25 15:03:46 -07:00
										 |  |  |       debug('instance saved'); | 
					
						
							|  |  |  |       observer.onNext(savedInstance); | 
					
						
							| 
									
										
										
										
											2016-03-02 20:54:14 -08:00
										 |  |  |       return observer.onCompleted(); | 
					
						
							| 
									
										
										
										
											2015-06-20 19:55:22 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-20 19:55:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-25 15:03:46 -07:00
										 |  |  | // alias saveInstance
 | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | export const saveUser = saveInstance; | 
					
						
							| 
									
										
										
										
											2015-06-25 15:03:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-07 13:00:51 -07:00
										 |  |  | // observeQuery(Model: Object, methodName: String, query: Any) => Observable
 | 
					
						
							|  |  |  | export function observeQuery(Model, methodName, query) { | 
					
						
							|  |  |  |   return Rx.Observable.fromNodeCallback(Model[methodName], Model)(query); | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-22 19:23:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-07 13:00:51 -07:00
										 |  |  | // observeMethod(
 | 
					
						
							|  |  |  | //   context: Object, methodName: String
 | 
					
						
							|  |  |  | // ) => (query: Any) => Observable
 | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | export function observeMethod(context, methodName) { | 
					
						
							| 
									
										
										
										
											2015-06-29 09:31:42 -07:00
										 |  |  |   return Rx.Observable.fromNodeCallback(context[methodName], context); | 
					
						
							| 
									
										
										
										
											2015-10-02 11:47:36 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-04-05 14:45:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-07 13:00:51 -07:00
										 |  |  | // must be bound to an observable instance
 | 
					
						
							|  |  |  | // timeCache(amount: Number, unit: String) => Observable
 | 
					
						
							| 
									
										
										
										
											2016-04-05 14:45:09 -07:00
										 |  |  | export function timeCache(time, unit) { | 
					
						
							|  |  |  |   const source = this; | 
					
						
							|  |  |  |   let cache; | 
					
						
							|  |  |  |   let expireCacheAt; | 
					
						
							|  |  |  |   return Observable.create(observable => { | 
					
						
							|  |  |  |     // if there is no expire time set
 | 
					
						
							|  |  |  |     // or if expireCacheAt is smaller than now,
 | 
					
						
							|  |  |  |     // set new expire time in MS and create new subscription to source
 | 
					
						
							|  |  |  |     if (!expireCacheAt || expireCacheAt < Date.now()) { | 
					
						
							|  |  |  |       // set expire in ms;
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |       expireCacheAt = moment() | 
					
						
							|  |  |  |         .add(time, unit) | 
					
						
							|  |  |  |         .valueOf(); | 
					
						
							| 
									
										
										
										
											2016-04-05 14:45:09 -07:00
										 |  |  |       cache = new AsyncSubject(); | 
					
						
							|  |  |  |       source.subscribe(cache); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return cache.subscribe(observable); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |