ZeroOmega/omega-target/src/browser_storage.coffee

81 lines
2.4 KiB
CoffeeScript
Raw Normal View History

2014-09-20 11:49:04 -04:00
Storage = require('./storage')
Promise = require('bluebird')
2024-02-29 09:14:04 -05:00
_globalLocalStorageCache = null
2014-09-20 11:49:04 -04:00
class BrowserStorage extends Storage
constructor: (@storage, @prefix = '') ->
@proto = Object.getPrototypeOf(@storage)
get: (keys) ->
2024-02-29 09:14:04 -05:00
promiseResult = idbKeyval.get('localStorage').then((initValuesMap) =>
if !_globalLocalStorageCache
@proto.initValuesMap(initValuesMap)
_globalLocalStorageCache = true
map = {}
if typeof keys == 'string'
map[keys] = undefined
else if Array.isArray(keys)
for key in keys
map[key] = undefined
else if typeof keys == 'object'
map = keys
for own key of map
try
value = JSON.parse(@proto.getItem.call(@storage, @prefix + key))
map[key] = value if value?
if typeof map[key] == 'undefined'
delete map[key]
return map
)
Promise.resolve promiseResult
2014-09-20 11:49:04 -04:00
set: (items) ->
2024-02-29 09:14:04 -05:00
promiseResult = idbKeyval.get('localStorage').then((initValuesMap) =>
if !_globalLocalStorageCache
@proto.initValuesMap(initValuesMap)
_globalLocalStorageCache = true
for own key, value of items
value = JSON.stringify(value)
@proto.setItem.call(@storage, @prefix + key, value)
return items
).then((items) =>
initValuesMap = @proto.getValuesMap()
idbKeyval.set('localStorage', initValuesMap).then( ->
return items
)
)
Promise.resolve promiseResult
2014-09-20 11:49:04 -04:00
remove: (keys) ->
2024-02-29 09:14:04 -05:00
promiseResult = idbKeyval.get('localStorage').then((initValuesMap) =>
if !_globalLocalStorageCache
@proto.initValuesMap(initValuesMap)
_globalLocalStorageCache = true
if not keys?
if not @prefix
@proto.clear.call(@storage)
else
index = 0
while true
key = @proto.key.call(index)
break if key == null
if @key.substr(0, @prefix.length) == @prefix
@proto.removeItem.call(@storage, @prefix + keys)
else
index++
if typeof keys == 'string'
@proto.removeItem.call(@storage, @prefix + keys)
for key in keys
@proto.removeItem.call(@storage, @prefix + key)
2014-09-20 11:49:04 -04:00
2024-02-29 09:14:04 -05:00
).then( =>
initValuesMap = @proto.getValuesMap()
idbKeyval.set('localStorage', initValuesMap).then( ->
return
)
)
Promise.resolve promiseResult
2014-09-20 11:49:04 -04:00
module.exports = BrowserStorage