├── .gitignore ├── yarn.lock ├── package.json ├── README.md └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .vscode 3 | node_modules/ -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@react-native-community/async-storage@^1.6.2": 6 | version "1.6.2" 7 | resolved "https://registry.npm.taobao.org/@react-native-community/async-storage/download/@react-native-community/async-storage-1.6.2.tgz#a19ca7149c4dfe8216f2330e6b1ebfe2d075ef92" 8 | integrity sha1-oZynFJxN/oIW8jMOax6/4tB175I= 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-expire-storage", 3 | "version": "0.0.3", 4 | "description": "Use react-native AsyncStorage storage data by add expiration time", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "react-native", 11 | "AsyncStorage" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/MiRinZhang/react-native-expire-storage.git" 16 | }, 17 | "author": "MiRinZhang ", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/MiRinZhang/react-native-expire-storage/issues" 21 | }, 22 | "homepage": "https://github.com/MiRinZhang/react-native-expire-storage", 23 | "dependencies": { 24 | "@react-native-community/async-storage": "^1.6.2" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-expire-storage 2 | 3 | Use react-native AsyncStorage storage data by add expiration time 4 | 5 | ### Install 6 | 7 | ```bash 8 | npm i -S react-native-expire-storage 9 | ``` 10 | 11 | ### Usage 12 | 13 | ```javascript 14 | import Storage from 'react-native-expire-storage'; 15 | 16 | // setItem 17 | /** 18 | * Set storage 19 | * @param {string} key storage key 20 | * @param {any} value storage data 21 | * @param {number} expire expiration time(second) 22 | */ 23 | Storage.setItem('key1', {data: {name: 'tom', age: 12}, id: 0, str: 'key1 data'}, 60 * 60); 24 | 25 | Storage.getItem('key1'); // {data: {name: 'tom', age: 12}, id: 0, str: 'key1 data'} 26 | 27 | Storage.mergeItem('key1', {{data: {age: 13}, str: 'key1 data changed'}}); 28 | 29 | Storage.getItem('key1'); // {data: {name: 'tom', age: 13}, id: 0, str: 'key1 data changed'} 30 | 31 | Storage.getAllKeys(); // ['key1'] 32 | 33 | Storage.removeItem(); 34 | 35 | // Storage.clear() // clear all storage data 36 | 37 | Storage.getItem('key1'); // null 38 | ``` 39 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @description Storage data with expiration time 3 | */ 4 | import AsyncStorage from '@react-native-community/async-storage'; 5 | 6 | /** 7 | * Set storage 8 | * @param {string} key storage key 9 | * @param {any} value storage data 10 | * @param {number} expire expiration time(second) 11 | */ 12 | const setItem = async (key, value, expire = null) => { 13 | try { 14 | const expireDate = createExpiredDate(expire), 15 | saveData = { 16 | saveTime: new Date(), 17 | expireDate, 18 | value 19 | }; 20 | 21 | return await AsyncStorage.setItem(key, JSON.stringify(saveData)); 22 | } catch (e) { 23 | return e; 24 | } 25 | }; 26 | 27 | /** 28 | * Merge storage 29 | * @param {string} key storage key 30 | * @param {any} value storage data 31 | * @param {number} expire expiration time(second) 32 | */ 33 | const mergeItem = async (key, value, expire = null) => { 34 | try { 35 | const prevCache = await AsyncStorage.getItem(key), 36 | prevData = JSON.parse(prevCache), 37 | expireDate = expire ? createExpiredDate(expire) : prevData.expireDate, 38 | saveData = { 39 | saveTime: new Date(), 40 | expireDate, 41 | value 42 | }; 43 | 44 | return await AsyncStorage.mergeItem(key, JSON.stringify(saveData)); 45 | } catch (e) { 46 | return e; 47 | } 48 | } 49 | 50 | /** 51 | * Get storage 52 | * @param {string} key storage key 53 | */ 54 | const getItem = async (key) => { 55 | try { 56 | const result = await AsyncStorage.getItem(key); 57 | 58 | return checkCacheData(result, key); 59 | } catch (e) { 60 | return e; 61 | } 62 | }; 63 | 64 | /** 65 | * Remove storage 66 | * @param {string} key storage key 67 | */ 68 | const removeItem = async (key) => { 69 | try { 70 | return await AsyncStorage.removeItem(key); 71 | } catch (e) { 72 | return e; 73 | } 74 | }; 75 | 76 | /** 77 | * Clear all storage 78 | */ 79 | const clear = async () => { 80 | try { 81 | return await AsyncStorage.clear(); 82 | } catch (e) { 83 | return e; 84 | } 85 | }; 86 | 87 | /** 88 | * Get all keys of storage 89 | */ 90 | const getAllKeys = async () => { 91 | try { 92 | return AsyncStorage.getAllKeys(); 93 | } catch (e) { 94 | return e; 95 | } 96 | }; 97 | 98 | /** 99 | * Check storage data 100 | * @param {object} result 101 | * @param {string} key 102 | */ 103 | function checkCacheData(result, key) { 104 | if (!result) { 105 | return null; 106 | } 107 | 108 | try { 109 | const data = JSON.parse(result); 110 | 111 | // is expired 112 | if (checkExpireDate(data.expireDate)) { 113 | // remove data 114 | removeItem(key); 115 | return null; 116 | } 117 | 118 | return data.value; 119 | } catch (e) { 120 | return e; 121 | } 122 | } 123 | 124 | /** 125 | * Check expireDate 126 | * @param {string} expireDate 127 | */ 128 | function checkExpireDate(expireDate) { 129 | if (!expireDate) { 130 | return false; 131 | } 132 | 133 | const currentTime = new Date().getTime(), 134 | expiredTime = new Date(expireDate).getTime(); 135 | 136 | return expiredTime < currentTime; 137 | } 138 | 139 | /** 140 | * Create expire time 141 | * @param {numner} expire 142 | */ 143 | function createExpiredDate(expire) { 144 | // if expire is 0 or undefined or null, return null 145 | if (!expire) { 146 | return null; 147 | } 148 | 149 | const seconds = expire * 1000, // transfer second to millisecond 150 | expiredTime = new Date().getTime() + seconds; 151 | 152 | return new Date(expiredTime); 153 | } 154 | 155 | export default { 156 | setItem, 157 | getItem, 158 | mergeItem, 159 | removeItem, 160 | clear, 161 | getAllKeys 162 | }; 163 | --------------------------------------------------------------------------------