|
30 | 30 | var WebSocket = null; // isBrowser ? window.WebSocket || window.MozWebSocket : {}; |
31 | 31 | var UIState = null; |
32 | 32 |
|
| 33 | + var localStorageName = 'localStorage'; |
| 34 | + |
33 | 35 | var previousBackendless = root.Backendless; |
34 | 36 |
|
35 | 37 | var Backendless = {}, |
|
603 | 605 | } |
604 | 606 |
|
605 | 607 | function setCache() { |
606 | | - var store = {}, |
607 | | - localStorageName = 'localStorage', |
608 | | - storage; |
| 608 | + var store = {}, |
| 609 | + storage = {}; |
609 | 610 |
|
610 | 611 | store.enabled = false; |
| 612 | + |
611 | 613 | store.exists = function(key) { |
| 614 | + return store.get(key) !== undefined; |
612 | 615 | }; |
| 616 | + |
613 | 617 | store.set = function(key, value) { |
| 618 | + return storage[key] = store.serialize(value); |
614 | 619 | }; |
| 620 | + |
615 | 621 | store.get = function(key) { |
| 622 | + var result = storage[key]; |
| 623 | + |
| 624 | + return result && store.deserialize(result); |
616 | 625 | }; |
| 626 | + |
617 | 627 | store.remove = function(key) { |
| 628 | + return delete storage[key]; |
618 | 629 | }; |
| 630 | + |
619 | 631 | store.clear = function() { |
| 632 | + storage = {}; |
620 | 633 | }; |
| 634 | + |
621 | 635 | store.flushExpired = function() { |
622 | 636 | }; |
| 637 | + |
623 | 638 | store.getCachePolicy = function(key) { |
624 | 639 | }; |
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; |
626 | 651 | }; |
| 652 | + |
627 | 653 | store.serialize = function(value) { |
628 | 654 | return JSON.stringify(value); |
629 | 655 | }; |
| 656 | + |
630 | 657 | store.deserialize = function(value) { |
631 | 658 | if (typeof value != 'string') { |
632 | 659 | return undefined; |
|
653 | 680 | } |
654 | 681 |
|
655 | 682 | if (isLocalStorageSupported()) { |
656 | | - storage = window[localStorageName]; |
| 683 | + return extendToLocalStorageCache(store); |
| 684 | + } |
657 | 685 |
|
658 | | - var createBndlsStorage = function() { |
659 | | - if (!('Backendless' in storage)) { |
660 | | - storage.setItem('Backendless', store.serialize({})); |
661 | | - } |
662 | | - }; |
| 686 | + return store; |
| 687 | + } |
663 | 688 |
|
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 (!('Backendless' in storage)) { |
| 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']; |
670 | 703 | } |
| 704 | + } |
671 | 705 |
|
672 | | - return result; |
673 | | - }; |
| 706 | + return result; |
| 707 | + }; |
674 | 708 |
|
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(); |
680 | 713 | } |
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 | + } |
682 | 729 |
|
683 | 730 | createBndlsStorage(); |
684 | | - store.enabled = true; |
685 | 731 |
|
686 | | - store.exists = function(key) { |
687 | | - return store.get(key) !== undefined; |
688 | | - }; |
| 732 | + var backendlessObj = store.deserialize(storage.getItem('Backendless')); |
689 | 733 |
|
690 | | - store.set = function(key, val) { |
691 | | - if (val === undefined) { |
692 | | - return store.remove(key); |
693 | | - } |
| 734 | + addTimestamp(val); |
694 | 735 |
|
695 | | - createBndlsStorage(); |
696 | | - var backendlessObj = store.deserialize(storage.getItem('Backendless')); |
697 | | - addTimestamp(val); |
| 736 | + backendlessObj[key] = val; |
| 737 | + |
| 738 | + try { |
| 739 | + storage.setItem('Backendless', store.serialize(backendlessObj)); |
| 740 | + } catch (e) { |
| 741 | + backendlessObj = {}; |
698 | 742 | backendlessObj[key] = val; |
| 743 | + storage.setItem('Backendless', store.serialize(backendlessObj)); |
| 744 | + } |
699 | 745 |
|
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 | + }; |
707 | 748 |
|
708 | | - return val; |
709 | | - }; |
| 749 | + store.get = function(key) { |
| 750 | + createBndlsStorage(); |
710 | 751 |
|
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; |
716 | 755 |
|
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 | + } |
722 | 761 |
|
723 | | - if (result && result['cachePolicy']) { |
724 | | - delete result['cachePolicy']; |
725 | | - } |
| 762 | + if (result && result['cachePolicy']) { |
| 763 | + delete result['cachePolicy']; |
| 764 | + } |
726 | 765 |
|
727 | | - return result; |
728 | | - }; |
| 766 | + return result; |
| 767 | + }; |
729 | 768 |
|
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; |
735 | 771 |
|
736 | | - if (backendlessObj.hasOwnProperty(key)) { |
737 | | - result = delete backendlessObj[key]; |
738 | | - } |
| 772 | + createBndlsStorage(); |
739 | 773 |
|
740 | | - storage.setItem('Backendless', store.serialize(backendlessObj)); |
| 774 | + key = key.replace(/([^A-Za-z0-9-])/g, ''); |
741 | 775 |
|
742 | | - return result; |
743 | | - }; |
| 776 | + var backendlessObj = store.deserialize(storage.getItem('Backendless')); |
744 | 777 |
|
745 | | - store.clear = function() { |
746 | | - storage.setItem('Backendless', store.serialize({})); |
747 | | - }; |
| 778 | + if (backendlessObj.hasOwnProperty(key)) { |
| 779 | + result = delete backendlessObj[key]; |
| 780 | + } |
748 | 781 |
|
749 | | - store.getAll = function() { |
750 | | - createBndlsStorage(); |
| 782 | + storage.setItem('Backendless', store.serialize(backendlessObj)); |
751 | 783 |
|
752 | | - var backendlessObj = store.deserialize(storage.getItem('Backendless')); |
753 | | - var ret = {}; |
| 784 | + return result; |
| 785 | + }; |
754 | 786 |
|
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 | | - } |
| 787 | + store.clear = function() { |
| 788 | + storage.setItem('Backendless', store.serialize({})); |
| 789 | + }; |
| 790 | + |
| 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']; |
761 | 802 | } |
762 | 803 | } |
| 804 | + } |
763 | 805 |
|
764 | | - return ret; |
765 | | - }; |
| 806 | + return ret; |
| 807 | + }; |
766 | 808 |
|
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)); |
779 | 821 | } |
780 | 822 | } |
781 | | - }; |
| 823 | + } |
| 824 | + }; |
782 | 825 |
|
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(); |
787 | 828 |
|
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 | + }; |
791 | 834 |
|
792 | 835 | return store; |
793 | 836 | } |
|
0 commit comments