From f03fc2da777637ae939ca2664aa7573a9bcb04c2 Mon Sep 17 00:00:00 2001 From: Thodoris Greasidis Date: Tue, 24 Oct 2017 10:38:02 +0300 Subject: [PATCH] Do not fail when localstorage isn't available Fixes #1 This is what we do in https://github.com/localForage/localForage/blob/master/src/utils/isLocalStorageValid.js --- src/index.js | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 33dc053..65bbabe 100644 --- a/src/index.js +++ b/src/index.js @@ -2,10 +2,41 @@ function rejectWithMessage(error) { return Promise.reject(error.message); } +const store = (() => { + function isLocalStorageValid() { + try { + return typeof localStorage !== 'undefined' && + ('setItem' in localStorage) && + typeof localStorage.setItem === 'function'; + } catch (e) { + return false; + } + } + + if (isLocalStorageValid()) { + return localStorage; + } + + return { + db: {}, + setItem(key, value) { + this.db[key] = value; + }, + getItem(key, value) { + const value = this.db[key]; + if (value === undefined) { + // emulate localStorage + return null; + } + return value + } + }; +})(); + export default (key, replacer, reviver) => ({ load() { return new Promise((resolve) => { - const jsonState = localStorage.getItem(key); + const jsonState = store.getItem(key); resolve(JSON.parse(jsonState, reviver) || {}); }).catch(rejectWithMessage); }, @@ -13,7 +44,7 @@ export default (key, replacer, reviver) => ({ save(state) { return new Promise((resolve) => { const jsonState = JSON.stringify(state, replacer); - localStorage.setItem(key, jsonState); + store.setItem(key, jsonState); resolve(); }).catch(rejectWithMessage); }