UNPKG

1.26 kBJavaScriptView Raw
1import { Observable } from 'rxjs/Observable';
2import createDebug from 'debug';
3
4import 'rxjs/add/observable/merge';
5import 'rxjs/add/observable/from';
6import 'rxjs/add/observable/timer';
7import 'rxjs/add/operator/map';
8import 'rxjs/add/operator/publishReplay';
9import 'rxjs/add/operator/retryWhen';
10import 'rxjs/add/operator/do';
11import 'rxjs/add/operator/delay';
12import 'rxjs/add/operator/switchMap';
13
14const debug = createDebug('cyboard.server');
15
16const handleRetry = id => (errors) => {
17 let timer = 1;
18 return errors.switchMap(() => {
19 const delay = 2 * timer;
20 timer += 1;
21 debug(`widget backend ${id} failed. Retry in ${delay} seconds.`);
22 return Observable.timer(delay * 1000);
23 });
24};
25
26const wrapWidgetData = id => data => ({ id, data });
27
28const wrapWidgetBackend = widget => Observable.from(widget.backend)
29 .map(wrapWidgetData(widget.id))
30 .retryWhen(handleRetry(widget.id))
31 .publishReplay(1)
32 .refCount();
33
34export function mergeWidgetBackends(config) {
35 const backends = Object.values(config)
36 .reduce((widgets, board) => widgets.concat(board.widgets), [])
37 .filter(widget => !!widget)
38 .map(widget => wrapWidgetBackend(widget));
39
40 return Observable.merge(...backends);
41}