UNPKG

auth0-lock

Version:
159 lines (130 loc) 4.77 kB
'use strict'; exports.__esModule = true; exports.go = undefined; exports.isSuccess = isSuccess; exports.isDone = isDone; exports.hasError = hasError; var _immutable = require('immutable'); var _data_utils = require('./utils/data_utils'); var _index = require('./core/index'); var l = _interopRequireWildcard(_index); var _index2 = require('./store/index'); function _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; } } var _dataFns = (0, _data_utils.dataFns)(['sync']), get = _dataFns.get, set = _dataFns.set; exports.default = function (m, key, opts) { if (get(m, key) !== undefined) return m; var status = opts.waitFn ? 'waiting' : !opts.conditionFn || opts.conditionFn(m) ? 'pending' : 'no'; return set(m, key, (0, _immutable.Map)({ conditionFn: opts.conditionFn, errorFn: opts.errorFn, recoverResult: opts.recoverResult, syncStatus: status, successFn: opts.successFn, syncFn: opts.syncFn, timeout: opts.timeout || 6000, waitFn: opts.waitFn })); }; var syncStatusKey = function syncStatusKey(key) { return (global.Array.isArray(key) ? key : [key]).concat(['syncStatus']); }; var getStatus = function getStatus(m, key) { return get(m, syncStatusKey(key)); }; var setStatus = function setStatus(m, key, str) { return set(m, syncStatusKey(key), str); }; var getProp = function getProp(m, key, name) { return get(m, key).get(name); }; var findKeys = function findKeys(m) { return m.reduce(function (r, v, k) { var current = _immutable.Map.isMap(v) && v.has('syncStatus') ? [k] : []; var nested = _immutable.Map.isMap(v) ? findKeys(v).map(function (x) { return [k].concat(x); }) : []; return r.concat.apply(r, [current].concat([nested])); }, []); }; function removeKeys(m, keys) { return keys.reduce(function (r, k) { return r.deleteIn(syncStatusKey(k)); }, m); } var process = function process(m, id) { var keys = findKeys(get(m, [], (0, _immutable.Map)())); // TODO timeout return keys.reduce(function (r, k) { if (typeof getProp(r, k, 'syncFn') != 'function') return r; if (getStatus(r, k) === 'pending') { r = setStatus(r, k, 'loading'); var called = false; getProp(r, k, 'syncFn')(r, function (error, result) { if (called) return; called = true; setTimeout(function () { (0, _index2.swap)(_index2.updateEntity, 'lock', id, function (m) { var errorFn = getProp(r, k, 'errorFn'); if (error && typeof errorFn === 'function') { setTimeout(function () { return errorFn(m, error); }, 0); } var recoverResult = getProp(m, k, 'recoverResult'); if (error && recoverResult === undefined) { return handleError(m, k, error); } else { m = setStatus(m, k, 'ok'); return getProp(m, k, 'successFn')(m, error ? recoverResult : result); } }); }, 0); }); } else if (getStatus(r, k) === 'waiting') { if (getProp(r, k, 'waitFn')(r)) { var conditionFn = getProp(r, k, 'conditionFn'); r = setStatus(r, k, !conditionFn || conditionFn(r) ? 'pending' : 'no'); } } return r; }, m); }; var go = exports.go = function go(id) { (0, _index2.observe)('sync', id, function (m) { setTimeout(function () { return (0, _index2.swap)(_index2.updateEntity, 'lock', id, process, id); }, 0); }); }; function isSuccess(m, key) { return getStatus(m, key) === 'ok'; } function isDone(m) { var keys = findKeys(get(m, [], (0, _immutable.Map)())); return keys.length > 0 && keys.reduce(function (r, k) { return r && !isLoading(m, k); }, true); } function hasError(m) { var excludeKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var keys = findKeys(removeKeys(get(m, [], (0, _immutable.Map)()), excludeKeys)); return keys.length > 0 && keys.reduce(function (r, k) { return r || getStatus(m, k) === 'error'; }, false); } function isLoading(m, key) { return ['loading', 'pending', 'waiting'].indexOf(getStatus(m, key)) > -1; } function handleError(m, key, error) { var result = setStatus(m, key, 'error'); // TODO: this should be configurable for each sync if (key !== 'sso') { var stopError = new Error('An error occurred when fetching ' + key + ' data for Lock: ' + error.message); stopError.code = 'sync'; stopError.origin = error; result = l.stop(result, stopError); } return result; }