Skip to content

Commit 7f32c6c

Browse files
committed
Change caching code to handle out-of-storage errors. Move localStorage detection
1 parent cd7f7af commit 7f32c6c

2 files changed

Lines changed: 53 additions & 19 deletions

File tree

src-ui/js/ui/Boot.js

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,16 @@
1515
pzpr.on("load", function boot() {
1616
var pzl;
1717
// Get URL search hash and check localStorage to see if a board state is saved
18-
if (!localStorageAvailable()) {
18+
if (!pzpr.env.localStorageAvailable) {
1919
pzl = importData();
2020
} else {
2121
var key = "pzpr_" + getPuzzleString();
22-
var puzzleStr = localStorage.getItem(key);
23-
if (!puzzleStr) {
22+
var valStr = localStorage.getItem(key);
23+
if (!valStr) {
2424
pzl = importData();
2525
} else {
26-
pzl = importData(puzzleStr); // Local storage was available and key was found
26+
var valObject = JSON.parse(valStr)
27+
pzl = importData(valObject.pzl); // Local storage was available and key was found
2728
}
2829
}
2930
if (!pzl) {
@@ -145,18 +146,6 @@
145146
// Functionality to support browser caching
146147
//---------------------------------------------------------------------------
147148

148-
//Taken directly from stackoverflow. Apparently this is the most broadly compatible version. https://stackoverflow.com/questions/16427636/check-if-localstorage-is-available
149-
function localStorageAvailable() {
150-
var test = "test";
151-
try {
152-
localStorage.setItem(test, test);
153-
localStorage.removeItem(test);
154-
return true;
155-
} catch (e) {
156-
return false;
157-
}
158-
}
159-
160149
//Save board state. Creates an entry in localStorage whose key is a 'pzpr_' identifier plus the current board state puzzle string.
161150
//Board state puzzle string is the same thing you get from duplicating the board state
162151
function saveBoardState() {
@@ -170,10 +159,43 @@
170159
while (url.match(/^(\w+)\=(\w+)\&(.*)/)) {
171160
url = RegExp.$3;
172161
}
162+
//Add a time signifier so that we can sort and delete oldest if setting fails
163+
var valObject = {
164+
t: Date.now(),
165+
pzl: url
166+
// bufferToForceStorageLimitErrors: "0".repeat(1700000) //Include for testing to force out-of-storage errors
167+
}
173168
try {
174-
localStorage.setItem(key, url);
169+
localStorage.setItem(key, JSON.stringify(valObject));
175170
} catch (e) {
176-
console.log(e);
171+
if (e.name === "QuotaExceededError") {
172+
//If storage was full: load all of the puzzles in localStorage, sort by least recent, and delete until saving is successful
173+
var saveSuccess = false
174+
var pairs = []
175+
for (var i = 0; i < localStorage.length; i++) {
176+
var lsKey = localStorage.key(i)
177+
var lsValue = localStorage.getItem(lsKey)
178+
pairs.push({key: lsKey, value: lsValue})
179+
}
180+
pairs = pairs.filter(function(item) {
181+
return item.key.indexOf("pzpr_") === 0
182+
})
183+
pairs = pairs.sort(function(a,b) {
184+
var ta = JSON.parse(a.value).t
185+
var tb = JSON.parse(b.value).t
186+
return ta > tb
187+
})
188+
while (!saveSuccess && pairs.length > 0) {
189+
console.log(pairs)
190+
try {
191+
localStorage.setItem(key, JSON.stringify(valObject));
192+
saveSuccess = true
193+
} catch (e) {
194+
localStorage.removeItem(pairs[0].key)
195+
pairs = pairs.slice(1)
196+
}
197+
}
198+
}
177199
}
178200
}
179201

src/pzpr/env.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,25 @@ pzpr.env = (function() {
6464
anchor_download:
6565
isbrowser && document.createElement("a").download !== void 0
6666
};
67+
//Taken directly from stackoverflow. Apparently this is the most broadly compatible version. https://stackoverflow.com/questions/16427636/check-if-localstorage-is-available
68+
var localStorageAvailable = (function() {
69+
var test = "test";
70+
try {
71+
localStorage.setItem(test, test);
72+
localStorage.removeItem(test);
73+
return true;
74+
} catch (e) {
75+
return false;
76+
}
77+
})();
6778

6879
return {
6980
bz: bz,
7081
OS: os,
7182
API: api,
7283
browser: isbrowser,
73-
node: pzpr.Candle.env.node
84+
node: pzpr.Candle.env.node,
85+
localStorageAvailable: localStorageAvailable
7486
};
7587
})();
7688

0 commit comments

Comments
 (0)