Skip to content

Commit 504737d

Browse files
authored
Merge pull request #36 from Backendless/ilya/fixLocalCache
Fix local cache without localStorage
2 parents cf1d0e7 + d0ddec0 commit 504737d

File tree

1 file changed

+150
-107
lines changed

1 file changed

+150
-107
lines changed

libs/backendless.js

Lines changed: 150 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
var WebSocket = null; // isBrowser ? window.WebSocket || window.MozWebSocket : {};
3131
var UIState = null;
3232

33+
var localStorageName = 'localStorage';
34+
3335
var previousBackendless = root.Backendless;
3436

3537
var Backendless = {},
@@ -603,30 +605,55 @@
603605
}
604606

605607
function setCache() {
606-
var store = {},
607-
localStorageName = 'localStorage',
608-
storage;
608+
var store = {},
609+
storage = {};
609610

610611
store.enabled = false;
612+
611613
store.exists = function(key) {
614+
return store.get(key) !== undefined;
612615
};
616+
613617
store.set = function(key, value) {
618+
return storage[key] = store.serialize(value);
614619
};
620+
615621
store.get = function(key) {
622+
var result = storage[key];
623+
624+
return result && store.deserialize(result);
616625
};
626+
617627
store.remove = function(key) {
628+
return delete storage[key];
618629
};
630+
619631
store.clear = function() {
632+
storage = {};
620633
};
634+
621635
store.flushExpired = function() {
622636
};
637+
623638
store.getCachePolicy = function(key) {
624639
};
625-
store.getAll = function() {
640+
641+
store.getAll = function () {
642+
var result = {};
643+
644+
for (var prop in storage) {
645+
if (storage.hasOwnProperty(prop)) {
646+
result[prop] = storage[prop];
647+
}
648+
}
649+
650+
return result;
626651
};
652+
627653
store.serialize = function(value) {
628654
return JSON.stringify(value);
629655
};
656+
630657
store.deserialize = function(value) {
631658
if (typeof value != 'string') {
632659
return undefined;
@@ -653,141 +680,157 @@
653680
}
654681

655682
if (isLocalStorageSupported()) {
656-
storage = window[localStorageName];
683+
return extendToLocalStorageCache(store);
684+
}
657685

658-
var createBndlsStorage = function() {
659-
if (!(storage.getItem('Backendless'))) {
660-
storage.setItem('Backendless', store.serialize({}));
661-
}
662-
};
686+
return store;
687+
}
663688

664-
var expired = function(obj) {
665-
var result = false;
666-
if (obj && Object.prototype.toString.call(obj).slice(8, -1) == "Object") {
667-
if ('cachePolicy' in obj && 'timeToLive' in obj['cachePolicy'] && obj['cachePolicy']['timeToLive'] != -1 && 'created' in obj['cachePolicy']) {
668-
result = (new Date().getTime() - obj['cachePolicy']['created']) > obj['cachePolicy']['timeToLive'];
669-
}
689+
function extendToLocalStorageCache(store) {
690+
var storage = window[localStorageName];
691+
692+
var createBndlsStorage = function() {
693+
if (!(storage.getItem('Backendless'))) {
694+
storage.setItem('Backendless', store.serialize({}));
695+
}
696+
};
697+
698+
var expired = function(obj) {
699+
var result = false;
700+
if (obj && Object.prototype.toString.call(obj).slice(8, -1) == "Object") {
701+
if ('cachePolicy' in obj && 'timeToLive' in obj['cachePolicy'] && obj['cachePolicy']['timeToLive'] != -1 && 'created' in obj['cachePolicy']) {
702+
result = (new Date().getTime() - obj['cachePolicy']['created']) > obj['cachePolicy']['timeToLive'];
670703
}
704+
}
671705

672-
return result;
673-
};
706+
return result;
707+
};
674708

675-
var addTimestamp = function(obj) {
676-
if (obj && Object.prototype.toString.call(obj).slice(8, -1) == "Object") {
677-
if ('cachePolicy' in obj && 'timeToLive' in obj['cachePolicy']) {
678-
obj['cachePolicy']['created'] = new Date().getTime();
679-
}
709+
var addTimestamp = function(obj) {
710+
if (obj && Object.prototype.toString.call(obj).slice(8, -1) == "Object") {
711+
if ('cachePolicy' in obj && 'timeToLive' in obj['cachePolicy']) {
712+
obj['cachePolicy']['created'] = new Date().getTime();
680713
}
681-
};
714+
}
715+
};
716+
717+
createBndlsStorage();
718+
719+
store.enabled = true;
720+
721+
store.exists = function(key) {
722+
return store.get(key) !== undefined;
723+
};
724+
725+
store.set = function(key, val) {
726+
if (val === undefined) {
727+
return store.remove(key);
728+
}
682729

683730
createBndlsStorage();
684-
store.enabled = true;
685731

686-
store.exists = function(key) {
687-
return store.get(key) !== undefined;
688-
};
732+
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
689733

690-
store.set = function(key, val) {
691-
if (val === undefined) {
692-
return store.remove(key);
693-
}
734+
addTimestamp(val);
735+
736+
backendlessObj[key] = val;
694737

695-
createBndlsStorage();
696-
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
697-
addTimestamp(val);
738+
try {
739+
storage.setItem('Backendless', store.serialize(backendlessObj));
740+
} catch (e) {
741+
backendlessObj = {};
698742
backendlessObj[key] = val;
743+
storage.setItem('Backendless', store.serialize(backendlessObj));
744+
}
699745

700-
try {
701-
storage.setItem('Backendless', store.serialize(backendlessObj));
702-
} catch (e) {
703-
backendlessObj = {};
704-
backendlessObj[key] = val;
705-
storage.setItem('Backendless', store.serialize(backendlessObj));
706-
}
746+
return val;
747+
};
707748

708-
return val;
709-
};
749+
store.get = function(key) {
750+
createBndlsStorage();
710751

711-
store.get = function(key) {
712-
createBndlsStorage();
713-
var backendlessObj = store.deserialize(storage.getItem('Backendless')),
714-
obj = backendlessObj[key],
715-
result = obj;
752+
var backendlessObj = store.deserialize(storage.getItem('Backendless')),
753+
obj = backendlessObj[key],
754+
result = obj;
716755

717-
if (expired(obj)) {
718-
delete backendlessObj[key];
719-
storage.setItem('Backendless', store.serialize(backendlessObj));
720-
result = undefined;
721-
}
756+
if (expired(obj)) {
757+
delete backendlessObj[key];
758+
storage.setItem('Backendless', store.serialize(backendlessObj));
759+
result = undefined;
760+
}
722761

723-
if (result && result['cachePolicy']) {
724-
delete result['cachePolicy'];
725-
}
762+
if (result && result['cachePolicy']) {
763+
delete result['cachePolicy'];
764+
}
726765

727-
return result;
728-
};
766+
return result;
767+
};
729768

730-
store.remove = function(key) {
731-
var result;
732-
createBndlsStorage();
733-
key = key.replace(/([^A-Za-z0-9-])/g, '');
734-
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
769+
store.remove = function(key) {
770+
var result;
735771

736-
if (backendlessObj.hasOwnProperty(key)) {
737-
result = delete backendlessObj[key];
738-
}
772+
createBndlsStorage();
739773

740-
storage.setItem('Backendless', store.serialize(backendlessObj));
774+
key = key.replace(/([^A-Za-z0-9-])/g, '');
741775

742-
return result;
743-
};
776+
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
744777

745-
store.clear = function() {
746-
storage.setItem('Backendless', store.serialize({}));
747-
};
778+
if (backendlessObj.hasOwnProperty(key)) {
779+
result = delete backendlessObj[key];
780+
}
781+
782+
storage.setItem('Backendless', store.serialize(backendlessObj));
748783

749-
store.getAll = function() {
750-
createBndlsStorage();
784+
return result;
785+
};
751786

752-
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
753-
var ret = {};
787+
store.clear = function() {
788+
storage.setItem('Backendless', store.serialize({}));
789+
};
754790

755-
for (var prop in backendlessObj) {
756-
if (backendlessObj.hasOwnProperty(prop)) {
757-
ret[prop] = backendlessObj[prop];
758-
if (ret[prop] !== null && ret[prop].hasOwnProperty('cachePolicy')) {
759-
delete ret[prop]['cachePolicy'];
760-
}
791+
store.getAll = function() {
792+
createBndlsStorage();
793+
794+
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
795+
var ret = {};
796+
797+
for (var prop in backendlessObj) {
798+
if (backendlessObj.hasOwnProperty(prop)) {
799+
ret[prop] = backendlessObj[prop];
800+
if (ret[prop] !== null && ret[prop].hasOwnProperty('cachePolicy')) {
801+
delete ret[prop]['cachePolicy'];
761802
}
762803
}
804+
}
763805

764-
return ret;
765-
};
806+
return ret;
807+
};
766808

767-
store.flushExpired = function() {
768-
createBndlsStorage();
769-
var backendlessObj = store.deserialize(storage.getItem('Backendless')),
770-
obj;
771-
772-
for (var prop in backendlessObj) {
773-
if (backendlessObj.hasOwnProperty(prop)) {
774-
obj = backendlessObj[prop];
775-
if (expired(obj)) {
776-
delete backendlessObj[prop];
777-
storage.setItem('Backendless', store.serialize(backendlessObj));
778-
}
809+
store.flushExpired = function() {
810+
createBndlsStorage();
811+
812+
var backendlessObj = store.deserialize(storage.getItem('Backendless')),
813+
obj;
814+
815+
for (var prop in backendlessObj) {
816+
if (backendlessObj.hasOwnProperty(prop)) {
817+
obj = backendlessObj[prop];
818+
if (expired(obj)) {
819+
delete backendlessObj[prop];
820+
storage.setItem('Backendless', store.serialize(backendlessObj));
779821
}
780822
}
781-
};
823+
}
824+
};
782825

783-
store.getCachePolicy = function(key) {
784-
createBndlsStorage();
785-
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
786-
var obj = backendlessObj[key];
826+
store.getCachePolicy = function(key) {
827+
createBndlsStorage();
787828

788-
return obj ? obj['cachePolicy'] : undefined;
789-
};
790-
}
829+
var backendlessObj = store.deserialize(storage.getItem('Backendless'));
830+
var obj = backendlessObj[key];
831+
832+
return obj ? obj['cachePolicy'] : undefined;
833+
};
791834

792835
return store;
793836
}
@@ -2083,7 +2126,7 @@
20832126
asyncHandler: responder
20842127
});
20852128
},
2086-
2129+
20872130
/** @deprecated */
20882131
addPoint: function(geopoint, async) {
20892132
return this.savePoint.apply(this, arguments);
@@ -4616,4 +4659,4 @@
46164659
}
46174660

46184661
return Backendless;
4619-
});
4662+
});

0 commit comments

Comments
 (0)