-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathindex.js
94 lines (77 loc) · 1.89 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class LocalStorage {
constructor (namespace) {
this._namespace = namespace
this._store = window.localStorage
this._sep = '\x00'
}
static clear () {
window.localStorage.clear()
}
_notFound (k) {
const err = new Error(`Not Found [${k}]`)
err.notFound = true
err.key = k
return err
}
get (key) {
const k = [this._namespace, key].join(this._sep)
if (!this._store[k]) return [this._notFound(k)]
try {
return [null, JSON.parse(this._store[k])]
} catch (err) {
return [err]
}
}
put (key, value) {
if (typeof value === 'undefined') {
return [new Error(`Invalid parameters to put, ('${key}', undefined)`)]
}
try {
const k = [this._namespace, key].join(this._sep)
const v = JSON.stringify(value)
const result = this._store[k] = v
return [null, result]
} catch (err) {
return [err]
}
}
has (key) {
const k = [this._namespace, key].join(this._sep)
if (!this._store[k]) return [this._notFound(k)]
return [null, true]
}
del (key) {
if (key) {
const k = [this._namespace, key].join(this._sep)
if (!this._store[k]) return [this._notFound(k)]
delete this._store[k]
return [null]
}
Object.keys(window.localStorage).forEach(k => {
const ns = k.split(this._sep)[0]
if (ns === this._namespace) {
delete this._store[k]
}
})
}
search (pattern) {
if (!pattern) {
throw new Error('A pattern is required')
}
const matchKeys = key => {
const [, _key] = key.split(this._sep)
if (!_key) return
if (!pattern.test(_key)) return
return key
}
const makePairs = key => ({
key: key.split(this._sep)[1],
value: this._store[key]
})
return [null, Object
.keys(this._store)
.filter(matchKeys)
.map(makePairs)]
}
}
module.exports = LocalStorage