UNPKG

4.77 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4exports.go = undefined;
5exports.isSuccess = isSuccess;
6exports.isDone = isDone;
7exports.hasError = hasError;
8
9var _immutable = require('immutable');
10
11var _data_utils = require('./utils/data_utils');
12
13var _index = require('./core/index');
14
15var l = _interopRequireWildcard(_index);
16
17var _index2 = require('./store/index');
18
19function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
20
21var _dataFns = (0, _data_utils.dataFns)(['sync']),
22 get = _dataFns.get,
23 set = _dataFns.set;
24
25exports.default = function (m, key, opts) {
26 if (get(m, key) !== undefined) return m;
27
28 var status = opts.waitFn ? 'waiting' : !opts.conditionFn || opts.conditionFn(m) ? 'pending' : 'no';
29
30 return set(m, key, (0, _immutable.Map)({
31 conditionFn: opts.conditionFn,
32 errorFn: opts.errorFn,
33 recoverResult: opts.recoverResult,
34 syncStatus: status,
35 successFn: opts.successFn,
36 syncFn: opts.syncFn,
37 timeout: opts.timeout || 6000,
38 waitFn: opts.waitFn
39 }));
40};
41
42var syncStatusKey = function syncStatusKey(key) {
43 return (global.Array.isArray(key) ? key : [key]).concat(['syncStatus']);
44};
45var getStatus = function getStatus(m, key) {
46 return get(m, syncStatusKey(key));
47};
48var setStatus = function setStatus(m, key, str) {
49 return set(m, syncStatusKey(key), str);
50};
51var getProp = function getProp(m, key, name) {
52 return get(m, key).get(name);
53};
54
55var findKeys = function findKeys(m) {
56 return m.reduce(function (r, v, k) {
57 var current = _immutable.Map.isMap(v) && v.has('syncStatus') ? [k] : [];
58 var nested = _immutable.Map.isMap(v) ? findKeys(v).map(function (x) {
59 return [k].concat(x);
60 }) : [];
61 return r.concat.apply(r, [current].concat([nested]));
62 }, []);
63};
64
65function removeKeys(m, keys) {
66 return keys.reduce(function (r, k) {
67 return r.deleteIn(syncStatusKey(k));
68 }, m);
69}
70
71var process = function process(m, id) {
72 var keys = findKeys(get(m, [], (0, _immutable.Map)()));
73 // TODO timeout
74 return keys.reduce(function (r, k) {
75 if (typeof getProp(r, k, 'syncFn') != 'function') return r;
76 if (getStatus(r, k) === 'pending') {
77 r = setStatus(r, k, 'loading');
78 var called = false;
79 getProp(r, k, 'syncFn')(r, function (error, result) {
80 if (called) return;
81 called = true;
82 setTimeout(function () {
83 (0, _index2.swap)(_index2.updateEntity, 'lock', id, function (m) {
84 var errorFn = getProp(r, k, 'errorFn');
85
86 if (error && typeof errorFn === 'function') {
87 setTimeout(function () {
88 return errorFn(m, error);
89 }, 0);
90 }
91
92 var recoverResult = getProp(m, k, 'recoverResult');
93
94 if (error && recoverResult === undefined) {
95 return handleError(m, k, error);
96 } else {
97 m = setStatus(m, k, 'ok');
98 return getProp(m, k, 'successFn')(m, error ? recoverResult : result);
99 }
100 });
101 }, 0);
102 });
103 } else if (getStatus(r, k) === 'waiting') {
104 if (getProp(r, k, 'waitFn')(r)) {
105 var conditionFn = getProp(r, k, 'conditionFn');
106 r = setStatus(r, k, !conditionFn || conditionFn(r) ? 'pending' : 'no');
107 }
108 }
109
110 return r;
111 }, m);
112};
113
114var go = exports.go = function go(id) {
115 (0, _index2.observe)('sync', id, function (m) {
116 setTimeout(function () {
117 return (0, _index2.swap)(_index2.updateEntity, 'lock', id, process, id);
118 }, 0);
119 });
120};
121
122function isSuccess(m, key) {
123 return getStatus(m, key) === 'ok';
124}
125
126function isDone(m) {
127 var keys = findKeys(get(m, [], (0, _immutable.Map)()));
128 return keys.length > 0 && keys.reduce(function (r, k) {
129 return r && !isLoading(m, k);
130 }, true);
131}
132
133function hasError(m) {
134 var excludeKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
135
136 var keys = findKeys(removeKeys(get(m, [], (0, _immutable.Map)()), excludeKeys));
137 return keys.length > 0 && keys.reduce(function (r, k) {
138 return r || getStatus(m, k) === 'error';
139 }, false);
140}
141
142function isLoading(m, key) {
143 return ['loading', 'pending', 'waiting'].indexOf(getStatus(m, key)) > -1;
144}
145
146function handleError(m, key, error) {
147 var result = setStatus(m, key, 'error');
148
149 // TODO: this should be configurable for each sync
150 if (key !== 'sso') {
151 var stopError = new Error('An error occurred when fetching ' + key + ' data for Lock: ' + error.message);
152 stopError.code = 'sync';
153 stopError.origin = error;
154 result = l.stop(result, stopError);
155 }
156
157 return result;
158}