@esportsplus/web-storage 0.1.44 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/dependabot.yml +2 -0
- package/.github/workflows/bump.yml +2 -0
- package/.github/workflows/dependabot.yml +12 -0
- package/.github/workflows/publish.yml +4 -2
- package/build/constants.d.ts +5 -0
- package/build/constants.js +6 -0
- package/build/drivers/indexeddb.d.ts +17 -0
- package/build/drivers/indexeddb.js +115 -0
- package/build/drivers/localstorage.d.ts +19 -0
- package/build/drivers/localstorage.js +94 -0
- package/build/index.d.ts +21 -1
- package/build/index.js +134 -1
- package/build/types.d.ts +15 -11
- package/build/types.js +1 -7
- package/package.json +6 -3
- package/src/constants.ts +6 -0
- package/src/drivers/indexeddb.ts +183 -0
- package/src/drivers/localstorage.ts +131 -0
- package/src/index.ts +192 -1
- package/src/types.ts +17 -14
- package/build/local.d.ts +0 -19
- package/build/local.js +0 -119
- package/src/local.ts +0 -177
package/src/local.ts
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { Driver, Filter, LocalForage, Options } from '~/types';
|
|
2
|
-
import { decrypt, encrypt } from '@esportsplus/crypto';
|
|
3
|
-
import localforage from 'localforage';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
async function deserialize(value: unknown, secret: null | string = null) {
|
|
7
|
-
if (secret && typeof value === 'string') {
|
|
8
|
-
value = await decrypt(value, secret);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
if (typeof value === 'string') {
|
|
12
|
-
value = JSON.parse(value);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return value;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async function serialize(value: unknown, secret: null | string = null) {
|
|
19
|
-
if (value === null || value === undefined) {
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
value = JSON.stringify(value);
|
|
24
|
-
|
|
25
|
-
if (secret) {
|
|
26
|
-
value = await encrypt(value as string, secret);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return value as string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class Local<T> {
|
|
34
|
-
instance: LocalForage;
|
|
35
|
-
iterate: LocalForage['iterate'];
|
|
36
|
-
keys: LocalForage['keys'];
|
|
37
|
-
length: LocalForage['length'];
|
|
38
|
-
secret: null | string = null;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
constructor(options: Options, secret?: string) {
|
|
42
|
-
switch ((options.driver || Driver.IndexedDB) as Driver) {
|
|
43
|
-
case Driver.LocalStorage:
|
|
44
|
-
options.driver = localforage.LOCALSTORAGE;
|
|
45
|
-
break;
|
|
46
|
-
default:
|
|
47
|
-
options.driver = localforage.INDEXEDDB;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
this.instance = localforage.createInstance(
|
|
52
|
-
Object.assign(options, { storeName: options.name })
|
|
53
|
-
);
|
|
54
|
-
this.iterate = this.instance.iterate;
|
|
55
|
-
this.keys = this.instance.keys;
|
|
56
|
-
this.length = this.instance.length;
|
|
57
|
-
|
|
58
|
-
if (secret) {
|
|
59
|
-
this.secret = secret;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
async all(): Promise<T> {
|
|
65
|
-
let stack: Promise<void>[] = [],
|
|
66
|
-
values: T = {} as T;
|
|
67
|
-
|
|
68
|
-
await this.instance.iterate((v: unknown, k: string) => {
|
|
69
|
-
stack.push(
|
|
70
|
-
deserialize(v, this.secret)
|
|
71
|
-
.then((value) => {
|
|
72
|
-
if (value === undefined) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
values[k as keyof T] = value as T[keyof T];
|
|
77
|
-
})
|
|
78
|
-
.catch(() => {})
|
|
79
|
-
)
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
await Promise.allSettled(stack);
|
|
83
|
-
|
|
84
|
-
return values;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async clear() {
|
|
88
|
-
await this.instance.clear();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async delete(...keys: (keyof T)[]) {
|
|
92
|
-
let stack: Promise<void>[] = [];
|
|
93
|
-
|
|
94
|
-
for (let i = 0, n = keys.length; i < n; i++) {
|
|
95
|
-
stack.push( this.instance.removeItem(keys[i] as string) );
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
await Promise.allSettled(stack);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async filter(fn: Filter<T>): Promise<T> {
|
|
102
|
-
let stop: VoidFunction = () => {
|
|
103
|
-
stopped = true;
|
|
104
|
-
},
|
|
105
|
-
stopped: boolean = false,
|
|
106
|
-
values: T = {} as T;
|
|
107
|
-
|
|
108
|
-
await this.instance.iterate(async (v, k, i) => {
|
|
109
|
-
let key = k as keyof T,
|
|
110
|
-
value = await deserialize(v, this.secret).catch(() => undefined) as T[keyof T];
|
|
111
|
-
|
|
112
|
-
if (value === undefined) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (await fn({ i, key, stop, value })) {
|
|
117
|
-
values[key] = value;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// LocalForage iterate will stop once a non
|
|
121
|
-
// undefined value is returned
|
|
122
|
-
if (stopped) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
return values;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
async get(key: keyof T) {
|
|
131
|
-
return await deserialize( await this.instance.getItem(key as string), this.secret ).catch(() => undefined);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async only(...keys: (keyof T)[]) {
|
|
135
|
-
return await this.filter( ({ key }) => keys.includes(key) );
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async replace(values: T) {
|
|
139
|
-
let failed: string[] = [],
|
|
140
|
-
stack: Promise<void>[] = [];
|
|
141
|
-
|
|
142
|
-
for (let key in values) {
|
|
143
|
-
stack.push(
|
|
144
|
-
this.set(key, values[key])
|
|
145
|
-
.then((ok) => {
|
|
146
|
-
if (ok) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
failed.push(key);
|
|
151
|
-
})
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
await Promise.allSettled(stack);
|
|
156
|
-
|
|
157
|
-
return failed;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async set(key: keyof T, value: T[keyof T]) {
|
|
161
|
-
let ok = true;
|
|
162
|
-
|
|
163
|
-
await this.instance.setItem(
|
|
164
|
-
key as string,
|
|
165
|
-
await serialize(value, this.secret)
|
|
166
|
-
.catch(() => {
|
|
167
|
-
ok = false;
|
|
168
|
-
return undefined;
|
|
169
|
-
})
|
|
170
|
-
);
|
|
171
|
-
|
|
172
|
-
return ok;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
export default <T>(options: Options, secret?: string) => new Local<T>(options, secret);
|