calibre/src/pyj/session.pyj

97 lines
2.7 KiB
Plaintext

# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
def storage_available(which):
which = which or 'localStorage'
try:
storage = window[which]
x = '__storage__test__'
storage.setItem(x, x)
storage.removeItem(x)
return True
except:
return False
session_storage = None
class FakeStorage:
def __init__(self):
self.data = {}
def getItem(self, key):
return self.data[key]
def setItem(self, key, value):
if type(value) != 'string':
value = JSON.stringify(value)
self.data[key] = value
def clear(self):
self.data = {}
def get_session_storage():
nonlocal session_storage
if session_storage is None:
if storage_available('localStorage'):
session_storage = window.localStorage
elif storage_available('sessionStorage'):
session_storage = window.sessionStorage
console.error('localStorage not available using sessionStorage instead')
else:
session_storage = FakeStorage()
console.error('sessionStorage and localStorage not available using a temp cache instead')
return session_storage
class SessionData:
def __init__(self):
self.storage = get_session_storage()
self.overflow_storage = {}
self.has_overflow = False
def get(self, key, defval):
if defval is undefined:
defval = None
if self.has_overflow:
ans = self.overflow_storage[key]
if ans is undefined:
ans = self.storage.getItem(key)
else:
ans = self.storage.getItem(key)
if ans is undefined:
return defval
return JSON.parse(ans)
def set(self, key, value):
value = JSON.stringify(value)
try:
self.storage.setItem(key, value)
v'delete self.overflow_storage[key]'
return True
except:
self.overflow_storage[key] = value
self.has_overflow = True
console.error('session storage has overflowed, using a temp cache instead')
return False
def clear(self):
self.storage.clear()
self.overflow_storage = {}
self.has_overflow = False
class UserSessionData(SessionData):
def __init__(self, username):
self.prefix = (username or '') + ':'
self.has_user = bool(username)
self.username = username
SessionData.__init__(self)
def get(self, key, defval):
return SessionData.get(self, (self.prefix + key), defval)
def set(self, key, value):
return SessionData.set(self, (self.prefix + key), value)