superstore-sync
Advanced tools
Comparing version
@@ -8,2 +8,4 @@ /** | ||
var escapeRegex = require('escape-regexp-component'); | ||
var keys = {}; | ||
@@ -15,3 +17,3 @@ var store = {}; | ||
window.addEventListener("storage", function(e) { | ||
if(keys[e.key]) { | ||
if (keys[e.key]) { | ||
keys[e.key] = true; | ||
@@ -22,5 +24,20 @@ store[e.key] = JSON.parse(e.newValue); | ||
/** | ||
* get localstorage value for key falling back to in memory for iOS private browsing bug | ||
* <http://stackoverflow.com/questions/9077101/iphone-localstorage-quota-exceeded-err-issue> | ||
* @param {String} key | ||
* @return {*} data for supplied key | ||
* | ||
*/ | ||
exports.get = function(key) { | ||
if (arguments.length !== 1) { | ||
throw Error("get expects 1 argument, " + arguments.length + " given; " + key); | ||
} | ||
if (!keys[key] && persist) { | ||
var data = localStorage[key]; | ||
var data; | ||
try { | ||
data = localStorage[key]; | ||
} catch(e) { | ||
persist = false; // Safari 8 with Cookies set to 'Never' throws on every read | ||
} | ||
@@ -36,18 +53,38 @@ // Slightly weird hack because JSON.parse of an undefined value throws | ||
/** | ||
* set localstorage key,value falling back to in memory for iOS private browsing bug | ||
* <http://stackoverflow.com/questions/9077101/iphone-localstorage-quota-exceeded-err-issue> | ||
* @param {String} key | ||
* @param {*} value which will be passed via JSON.stringify | ||
* @return {*} value | ||
* | ||
*/ | ||
exports.set = function(key, value) { | ||
try { | ||
localStorage[key] = JSON.stringify(value); | ||
} catch(err) { | ||
if (arguments.length !== 2) { | ||
throw Error("set expects 2 arguments, " + arguments.length + " given; " + key); | ||
} | ||
if (persist) { | ||
try { | ||
localStorage[key] = JSON.stringify(value); | ||
} catch(err) { | ||
// Known iOS Private Browsing Bug - fall back to non-persistent storage | ||
if (err.code === 22) { | ||
persist = false; | ||
} else { | ||
throw err; | ||
// Known iOS Private Browsing Bug - fall back to non-persistent storage | ||
if (err.code === 22) { | ||
persist = false; | ||
} else { | ||
throw err; | ||
} | ||
} | ||
} | ||
store[key] = value; | ||
keys[key] = true; | ||
return value; | ||
}; | ||
/** | ||
* unset value in store for key | ||
* @param {String} key | ||
*/ | ||
exports.unset = function(key) { | ||
@@ -66,3 +103,3 @@ delete store[key]; | ||
exports.clear = function(clearPrefix) { | ||
if(!clearPrefix) { | ||
if (!clearPrefix) { | ||
if (persist) { | ||
@@ -76,5 +113,6 @@ localStorage.clear(); | ||
var clearKeyRegex = new RegExp("^"+clearPrefix); | ||
for(key in keys) { | ||
if(key.match(clearKeyRegex)) { | ||
clearPrefix = escapeRegex(clearPrefix); | ||
var clearKeyRegex = new RegExp("^" + clearPrefix); | ||
for (var key in keys) { | ||
if (key.match(clearKeyRegex)) { | ||
this.unset(key); | ||
@@ -81,0 +119,0 @@ } |
{ | ||
"name": "superstore-sync", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"description": "Local storage, without the bugs.", | ||
@@ -35,4 +35,5 @@ "main": "lib/superstore-sync.js", | ||
"dependencies": { | ||
"setimmediate": "~1.0.1" | ||
"setimmediate": "~1.0.1", | ||
"escape-regexp-component": "~1.0" | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
# superstore-sync [](https://travis-ci.org/matthew-andrews/superstore-sync) | ||
# superstore-sync [](https://travis-ci.org/matthew-andrews/superstore-sync) [](http://badge.fury.io/js/superstore-sync) | ||
@@ -3,0 +3,0 @@ Superstore is a simple lightweight synchronous wrapper around localStorage. Its features include: |
6712
23.7%134
35.35%2
100%+ Added
+ Added