@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/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);