248 lines
10 KiB
JavaScript
248 lines
10 KiB
JavaScript
"use strict";
|
|
|
|
var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
|
|
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
|
|
|
|
(function () {
|
|
|
|
"use strict";
|
|
|
|
angular.module("ng-persist", []);
|
|
|
|
var $persist = function ($q, $localStorage) {
|
|
|
|
var isBrowser = false;
|
|
var isIos = false;
|
|
var isAndroid = false;
|
|
|
|
if (!window.cordova && !window.device && (typeof Keychain === 'undefined')) {
|
|
isBrowser = true;
|
|
} else {
|
|
isAndroid = window.device.platform === "Android";
|
|
isIos = window.device.platform === "iOS";
|
|
}
|
|
|
|
var LocalStorageAdapter = (function () {
|
|
function LocalStorageAdapter() {
|
|
_classCallCheck(this, LocalStorageAdapter);
|
|
}
|
|
|
|
_createClass(LocalStorageAdapter, {
|
|
read: {
|
|
value: function read(namespace, key) {
|
|
var deferred = $q.defer();
|
|
var val = $localStorage["" + namespace + "_" + key];
|
|
deferred.resolve(val);
|
|
return deferred.promise;
|
|
}
|
|
},
|
|
write: {
|
|
value: function write(namespace, key, val) {
|
|
var deferred = $q.defer();
|
|
$localStorage["" + namespace + "_" + key] = val;
|
|
deferred.resolve();
|
|
return deferred.promise;
|
|
}
|
|
},
|
|
remove: {
|
|
value: function remove(namespace, key) {
|
|
var deferred = $q.defer();
|
|
delete $localStorage["" + namespace + "_" + key];
|
|
deferred.resolve();
|
|
return deferred.promise;
|
|
}
|
|
}
|
|
});
|
|
|
|
return LocalStorageAdapter;
|
|
})();
|
|
|
|
var IosKeychainAdapter = (function () {
|
|
function IosKeychainAdapter() {
|
|
_classCallCheck(this, IosKeychainAdapter);
|
|
}
|
|
|
|
_createClass(IosKeychainAdapter, {
|
|
read: {
|
|
value: function read(namespace, key) {
|
|
var deferred = $q.defer();
|
|
Keychain.get(function (val) {
|
|
if (val !== "") {
|
|
val = JSON.parse(val);
|
|
} else {
|
|
val = null;
|
|
}
|
|
deferred.resolve(val);
|
|
}, function (err) {
|
|
deferred.reject(err);
|
|
}, key, '');
|
|
return deferred.promise;
|
|
}
|
|
},
|
|
write: {
|
|
value: function write(namespace, key, val) {
|
|
var deferred = $q.defer();
|
|
val = JSON.stringify(val);
|
|
Keychain.set(function () {
|
|
deferred.resolve();
|
|
}, function (err) {
|
|
deferred.reject(err);
|
|
}, key, val, false);
|
|
return deferred.promise;
|
|
}
|
|
},
|
|
remove: {
|
|
value: function remove(namespace, key) {
|
|
var deferred = $q.defer();
|
|
Keychain.remove(function () {
|
|
deferred.resolve();
|
|
}, function (err) {
|
|
deferred.reject(err);
|
|
}, key);
|
|
return deferred.promise;
|
|
}
|
|
}
|
|
});
|
|
|
|
return IosKeychainAdapter;
|
|
})();
|
|
|
|
var AndroidExternalStorageAdapter = (function () {
|
|
function AndroidExternalStorageAdapter() {
|
|
_classCallCheck(this, AndroidExternalStorageAdapter);
|
|
}
|
|
|
|
_createClass(AndroidExternalStorageAdapter, {
|
|
read: {
|
|
value: function read(namespace, key) {
|
|
var deferred = $q.defer();
|
|
var filename = "" + namespace + "_" + key;
|
|
window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory + filename, function (fileEntry) {
|
|
fileEntry.file(function (file) {
|
|
var reader = new FileReader();
|
|
reader.onloadend = function (evt) {
|
|
var res = evt.target.result;
|
|
if (res !== "") {
|
|
res = JSON.parse(res);
|
|
} else {
|
|
res = null;
|
|
}
|
|
deferred.resolve(res);
|
|
};
|
|
reader.readAsText(file);
|
|
});
|
|
}, function (err) {
|
|
deferred.reject(err);
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
},
|
|
write: {
|
|
value: function write(namespace, key, val) {
|
|
var deferred = $q.defer();
|
|
window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function (dir) {
|
|
var filename = "" + namespace + "_" + key;
|
|
dir.getFile(filename, { create: true }, function (file) {
|
|
if (!file) {
|
|
deferred.reject();
|
|
}
|
|
file.createWriter(function (fileWriter) {
|
|
// fileWriter.seek(fileWriter.length);
|
|
var blob = new Blob([JSON.stringify(val)], { type: "text/plain" });
|
|
fileWriter.write(blob);
|
|
deferred.resolve();
|
|
}, function (err) {
|
|
deferred.reject(err);
|
|
});
|
|
});
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
},
|
|
remove: {
|
|
value: function remove(namespace, key) {
|
|
var deferred = $q.defer();
|
|
window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function (dir) {
|
|
var filename = "" + namespace + "_" + key;
|
|
dir.getFile(filename, { create: true }, function (file) {
|
|
if (!file) {
|
|
deferred.reject();
|
|
}
|
|
file.createWriter(function (fileWriter) {
|
|
// fileWriter.seek(fileWriter.length);
|
|
var blob = new Blob([""], { type: "text/plain" });
|
|
fileWriter.write(blob);
|
|
deferred.resolve();
|
|
}, function (err) {
|
|
deferred.reject(err);
|
|
});
|
|
});
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
}
|
|
});
|
|
|
|
return AndroidExternalStorageAdapter;
|
|
})();
|
|
|
|
var getAdapter = function () {
|
|
if (isBrowser) {
|
|
return new LocalStorageAdapter();
|
|
} else if (isIos) {
|
|
return new IosKeychainAdapter();
|
|
} else if (isAndroid) {
|
|
return new AndroidExternalStorageAdapter();
|
|
}
|
|
};
|
|
|
|
return {
|
|
set: function set() {
|
|
var namespace = arguments[0] === undefined ? "" : arguments[0];
|
|
var key = arguments[1] === undefined ? null : arguments[1];
|
|
var val = arguments[2] === undefined ? "" : arguments[2];
|
|
|
|
var deferred = $q.defer();
|
|
var adapter = getAdapter();
|
|
adapter.write(namespace, key, val).then(function () {
|
|
deferred.resolve(val);
|
|
})["catch"](function (err) {
|
|
// if not browser, write to local storage
|
|
// otherwise reject
|
|
if (!isBrowser) {
|
|
var localStorageAdapter = new LocalStorageAdapter();
|
|
return localStorageAdapter.write(namespace, key, val);
|
|
} else {
|
|
deferred.reject(err);
|
|
}
|
|
});
|
|
return deferred.promise;
|
|
},
|
|
get: function get() {
|
|
var namespace = arguments[0] === undefined ? "" : arguments[0];
|
|
var key = arguments[1] === undefined ? null : arguments[1];
|
|
var fallback = arguments[2] === undefined ? "" : arguments[2];
|
|
|
|
var deferred = $q.defer();
|
|
var adapter = getAdapter();
|
|
adapter.read(namespace, key).then(function (val) {
|
|
if (val) {
|
|
deferred.resolve(val);
|
|
} else {
|
|
deferred.resolve(fallback);
|
|
}
|
|
})["catch"](function () {
|
|
// always resolve with the fallback value
|
|
deferred.resolve(fallback);
|
|
});
|
|
return deferred.promise;
|
|
},
|
|
remove: function remove(namespace, key) {
|
|
var adapter = getAdapter();
|
|
return adapter.remove(namespace, key);
|
|
} };
|
|
};
|
|
$persist.$inject = ["$q", "$localStorage"];
|
|
angular.module("ng-persist").factory("$persist", $persist);
|
|
})(); |