@nlabs/arkhamjs-storage-browser 3.29.0 → 3.30.0
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/README.md +181 -466
- package/index.js +3 -3
- package/lib/BrowserStorage/BrowserStorage.d.ts +23 -5
- package/lib/BrowserStorage/BrowserStorage.js +2 -2
- package/lib/index.d.ts +4 -0
- package/lib/index.js +2 -2
- package/lib/types/main.d.ts +18 -0
- package/lib/types/main.js +1 -2
- package/package.json +22 -5
package/README.md
CHANGED
|
@@ -1,559 +1,274 @@
|
|
|
1
1
|
# @nlabs/arkhamjs-storage-browser
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- **🎯 Selective Persistence** - Choose which parts of state to persist
|
|
18
|
-
- **⚡ Performance Optimized** - Debounced writes and efficient serialization
|
|
19
|
-
- **🔒 Encryption Support** - Optional encryption for sensitive data
|
|
20
|
-
- **🗜️ Compression** - Automatic compression for large state objects
|
|
21
|
-
- **📱 Cross-Tab Sync** - Synchronize state across multiple browser tabs
|
|
22
|
-
- **🔧 Configurable** - Extensive options for customization
|
|
23
|
-
- **🌲 Tree-shakable** - Only include what you need
|
|
24
|
-
|
|
25
|
-
## 📦 Installation
|
|
3
|
+
Enhanced browser storage for ArkhamJS with modern ESNext features, performance optimizations, and advanced caching capabilities.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🚀 **High Performance**: In-memory caching and optimized storage operations
|
|
8
|
+
- 🔒 **Type Safe**: Full TypeScript support with strict type checking
|
|
9
|
+
- 🎯 **Modern ESNext**: Built with latest JavaScript features (ES2022+)
|
|
10
|
+
- 📦 **Tree Shakeable**: Optimized for bundle size reduction
|
|
11
|
+
- ⚡ **Smart Caching**: Automatic cache management with TTL support
|
|
12
|
+
- 🛡️ **Error Resilient**: Graceful handling of storage errors and quota limits
|
|
13
|
+
- 🔧 **Configurable**: Flexible options for prefix, compression, and size limits
|
|
14
|
+
- 📊 **Monitoring**: Built-in storage statistics and usage tracking
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
26
17
|
|
|
27
18
|
```bash
|
|
28
19
|
npm install @nlabs/arkhamjs-storage-browser
|
|
29
20
|
```
|
|
30
21
|
|
|
31
|
-
##
|
|
22
|
+
## Quick Start
|
|
32
23
|
|
|
33
|
-
###
|
|
24
|
+
### Basic Usage
|
|
34
25
|
|
|
35
|
-
```
|
|
36
|
-
import { Flux } from '@nlabs/arkhamjs';
|
|
26
|
+
```typescript
|
|
37
27
|
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
38
28
|
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
storageWait: 300 // Debounce storage updates by 300ms
|
|
45
|
-
});
|
|
29
|
+
// Create storage instance with default settings
|
|
30
|
+
const storage = new BrowserStorage();
|
|
31
|
+
|
|
32
|
+
// Store data
|
|
33
|
+
await storage.setStorageData('user', { id: 1, name: 'John' });
|
|
46
34
|
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
//
|
|
35
|
+
// Retrieve data
|
|
36
|
+
const user = await storage.getStorageData('user');
|
|
37
|
+
console.log(user); // { id: 1, name: 'John' }
|
|
50
38
|
```
|
|
51
39
|
|
|
52
|
-
###
|
|
40
|
+
### Advanced Configuration
|
|
53
41
|
|
|
54
|
-
```
|
|
42
|
+
```typescript
|
|
55
43
|
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
56
44
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
// Use custom storage implementation
|
|
64
|
-
const customStorage = BrowserStorage.create({
|
|
65
|
-
getItem: (key) => customGet(key),
|
|
66
|
-
setItem: (key, value) => customSet(key, value),
|
|
67
|
-
removeItem: (key) => customRemove(key)
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
Flux.init({
|
|
71
|
-
name: 'my-app',
|
|
72
|
-
stores: [UserStore],
|
|
73
|
-
storage: localStorage, // or sessionStorage, or customStorage
|
|
45
|
+
const storage = new BrowserStorage({
|
|
46
|
+
type: 'local', // 'local' or 'session' storage
|
|
47
|
+
prefix: 'myapp_', // Custom key prefix
|
|
48
|
+
compression: true, // Enable compression for large data
|
|
49
|
+
maxSize: 10 * 1024 * 1024, // 10MB size limit
|
|
50
|
+
ttl: 60 * 60 * 1000 // 1 hour time-to-live
|
|
74
51
|
});
|
|
75
52
|
```
|
|
76
53
|
|
|
77
|
-
|
|
54
|
+
### Integration with ArkhamJS
|
|
78
55
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
```js
|
|
56
|
+
```typescript
|
|
57
|
+
import { Flux } from '@nlabs/arkhamjs';
|
|
82
58
|
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
83
59
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// Storage options
|
|
90
|
-
storageWait: 300, // Debounce storage updates (ms)
|
|
91
|
-
storageDebounce: true, // Enable debouncing
|
|
92
|
-
storageThrottle: false, // Use throttling instead of debouncing
|
|
93
|
-
|
|
94
|
-
// Persistence options
|
|
95
|
-
storagePersist: true, // Enable persistence
|
|
96
|
-
storageRestore: true, // Restore state on initialization
|
|
97
|
-
storageClear: false, // Clear storage on initialization
|
|
98
|
-
|
|
99
|
-
// Data options
|
|
100
|
-
storageSerialize: true, // Serialize data before storage
|
|
101
|
-
storageCompress: false, // Compress data before storage
|
|
102
|
-
storageEncrypt: false, // Encrypt data before storage
|
|
103
|
-
|
|
104
|
-
// Key options
|
|
105
|
-
storageKey: 'arkhamjs-state', // Storage key prefix
|
|
106
|
-
storageNamespace: 'my-app', // Namespace for storage keys
|
|
60
|
+
const storage = new BrowserStorage({
|
|
61
|
+
type: 'local',
|
|
62
|
+
prefix: 'myapp_',
|
|
63
|
+
ttl: 24 * 60 * 60 * 1000 // 24 hours
|
|
107
64
|
});
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### **Advanced Configuration**
|
|
111
65
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
stores: [UserStore],
|
|
118
|
-
storage: BrowserStorage,
|
|
119
|
-
|
|
120
|
-
// Selective persistence
|
|
121
|
-
storagePaths: [
|
|
122
|
-
'user.current', // Only persist current user
|
|
123
|
-
'user.preferences', // Only persist user preferences
|
|
124
|
-
'cart.items' // Only persist cart items
|
|
125
|
-
],
|
|
126
|
-
|
|
127
|
-
// Exclude sensitive data
|
|
128
|
-
storageExclude: [
|
|
129
|
-
'user.password', // Don't persist passwords
|
|
130
|
-
'auth.token', // Don't persist auth tokens
|
|
131
|
-
'temp.*' // Don't persist temporary data
|
|
132
|
-
],
|
|
133
|
-
|
|
134
|
-
// Custom serialization
|
|
135
|
-
storageSerialize: (state) => {
|
|
136
|
-
// Custom serialization logic
|
|
137
|
-
return JSON.stringify(state, (key, value) => {
|
|
138
|
-
if (key === 'password') return undefined; // Remove passwords
|
|
139
|
-
if (key === 'token') return undefined; // Remove tokens
|
|
140
|
-
return value;
|
|
141
|
-
});
|
|
142
|
-
},
|
|
143
|
-
|
|
144
|
-
// Custom deserialization
|
|
145
|
-
storageDeserialize: (data) => {
|
|
146
|
-
// Custom deserialization logic
|
|
147
|
-
const state = JSON.parse(data);
|
|
148
|
-
// Add default values or transform data
|
|
149
|
-
return state;
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
// Storage events
|
|
153
|
-
storageEvents: {
|
|
154
|
-
onSave: (key, value) => {
|
|
155
|
-
console.log(`Saved to storage: ${key}`);
|
|
156
|
-
},
|
|
157
|
-
onLoad: (key, value) => {
|
|
158
|
-
console.log(`Loaded from storage: ${key}`);
|
|
159
|
-
},
|
|
160
|
-
onError: (error) => {
|
|
161
|
-
console.error('Storage error:', error);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
66
|
+
// Initialize ArkhamJS with storage
|
|
67
|
+
await Flux.init({
|
|
68
|
+
name: 'myapp',
|
|
69
|
+
storage,
|
|
70
|
+
stores: [/* your stores */]
|
|
164
71
|
});
|
|
165
72
|
```
|
|
166
73
|
|
|
167
|
-
|
|
74
|
+
## API Reference
|
|
168
75
|
|
|
169
|
-
|
|
170
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
76
|
+
### Constructor Options
|
|
171
77
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
...(isDevelopment && {
|
|
181
|
-
storageWait: 100,
|
|
182
|
-
storageDebounce: true,
|
|
183
|
-
storageEvents: {
|
|
184
|
-
onSave: (key, value) => console.log(`💾 Saved: ${key}`),
|
|
185
|
-
onLoad: (key, value) => console.log(`📂 Loaded: ${key}`)
|
|
186
|
-
}
|
|
187
|
-
}),
|
|
188
|
-
|
|
189
|
-
// Production: Optimized persistence
|
|
190
|
-
...(!isDevelopment && {
|
|
191
|
-
storageWait: 500,
|
|
192
|
-
storageDebounce: true,
|
|
193
|
-
storageCompress: true,
|
|
194
|
-
storageEvents: {
|
|
195
|
-
onError: (error) => {
|
|
196
|
-
// Send to error tracking service
|
|
197
|
-
analytics.track('storage_error', { error: error.message });
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
})
|
|
201
|
-
});
|
|
78
|
+
```typescript
|
|
79
|
+
interface BrowserStorageOptions {
|
|
80
|
+
type?: 'local' | 'session'; // Storage type (default: 'session')
|
|
81
|
+
prefix?: string; // Key prefix (default: 'arkhamjs_')
|
|
82
|
+
compression?: boolean; // Enable compression (default: false)
|
|
83
|
+
maxSize?: number; // Max size in bytes (default: 5MB)
|
|
84
|
+
ttl?: number; // Time-to-live in ms (default: 24h)
|
|
85
|
+
}
|
|
202
86
|
```
|
|
203
87
|
|
|
204
|
-
|
|
88
|
+
### Instance Methods
|
|
205
89
|
|
|
206
|
-
|
|
90
|
+
#### `getStorageData(key: string): Promise<any>`
|
|
207
91
|
|
|
208
|
-
|
|
92
|
+
Retrieves data from storage with caching and TTL validation.
|
|
209
93
|
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Flux.dispatch({ type: 'USER_LOGIN', user: { id: 1, name: 'John' } });
|
|
213
|
-
|
|
214
|
-
// User closes browser and reopens
|
|
215
|
-
// State is automatically restored from localStorage
|
|
216
|
-
const user = Flux.getState('user.current'); // { id: 1, name: 'John' }
|
|
94
|
+
```typescript
|
|
95
|
+
const data = await storage.getStorageData('user');
|
|
217
96
|
```
|
|
218
97
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
Choose which parts of state to persist:
|
|
222
|
-
|
|
223
|
-
```js
|
|
224
|
-
Flux.init({
|
|
225
|
-
name: 'my-app',
|
|
226
|
-
stores: [UserStore],
|
|
227
|
-
storage: BrowserStorage,
|
|
228
|
-
|
|
229
|
-
// Only persist specific paths
|
|
230
|
-
storagePaths: [
|
|
231
|
-
'user.current', // Persist current user
|
|
232
|
-
'user.preferences', // Persist user preferences
|
|
233
|
-
'cart.items', // Persist cart items
|
|
234
|
-
'ui.theme' // Persist UI theme
|
|
235
|
-
],
|
|
236
|
-
|
|
237
|
-
// Exclude sensitive or temporary data
|
|
238
|
-
storageExclude: [
|
|
239
|
-
'user.password', // Don't persist passwords
|
|
240
|
-
'auth.token', // Don't persist auth tokens
|
|
241
|
-
'temp.*', // Don't persist temporary data
|
|
242
|
-
'ui.loading' // Don't persist loading states
|
|
243
|
-
]
|
|
244
|
-
});
|
|
245
|
-
```
|
|
98
|
+
#### `setStorageData(key: string, value: any): Promise<boolean>`
|
|
246
99
|
|
|
247
|
-
|
|
100
|
+
Stores data with validation, compression, and automatic cleanup.
|
|
248
101
|
|
|
249
|
-
|
|
102
|
+
```typescript
|
|
103
|
+
const success = await storage.setStorageData('user', { id: 1, name: 'John' });
|
|
104
|
+
```
|
|
250
105
|
|
|
251
|
-
|
|
252
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
106
|
+
#### `removeStorageData(key: string): Promise<boolean>`
|
|
253
107
|
|
|
254
|
-
|
|
255
|
-
name: 'my-app',
|
|
256
|
-
stores: [UserStore],
|
|
257
|
-
storage: BrowserStorage,
|
|
258
|
-
|
|
259
|
-
// Enable cross-tab sync
|
|
260
|
-
storageSync: true,
|
|
261
|
-
|
|
262
|
-
// Custom sync events
|
|
263
|
-
storageEvents: {
|
|
264
|
-
onSync: (event) => {
|
|
265
|
-
if (event.key === 'arkhamjs-state') {
|
|
266
|
-
console.log('State synced from another tab');
|
|
267
|
-
// Optionally refresh UI or show notification
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
});
|
|
108
|
+
Removes specific data from storage.
|
|
272
109
|
|
|
273
|
-
|
|
110
|
+
```typescript
|
|
111
|
+
const success = await storage.removeStorageData('user');
|
|
274
112
|
```
|
|
275
113
|
|
|
276
|
-
|
|
114
|
+
#### `clearStorageData(): Promise<boolean>`
|
|
277
115
|
|
|
278
|
-
|
|
116
|
+
Clears all data with the configured prefix.
|
|
279
117
|
|
|
280
|
-
```
|
|
281
|
-
|
|
118
|
+
```typescript
|
|
119
|
+
const success = await storage.clearStorageData();
|
|
120
|
+
```
|
|
282
121
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
storageCompressThreshold: 1024, // Compress if >1KB
|
|
291
|
-
|
|
292
|
-
// Custom compression
|
|
293
|
-
storageCompress: (data) => {
|
|
294
|
-
// Use custom compression library
|
|
295
|
-
return customCompress(data);
|
|
296
|
-
},
|
|
297
|
-
|
|
298
|
-
// Custom decompression
|
|
299
|
-
storageDecompress: (data) => {
|
|
300
|
-
// Use custom decompression library
|
|
301
|
-
return customDecompress(data);
|
|
302
|
-
}
|
|
303
|
-
});
|
|
122
|
+
#### `getStorageStats(): { used: number; available: number; total: number }`
|
|
123
|
+
|
|
124
|
+
Returns storage usage statistics.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
const stats = storage.getStorageStats();
|
|
128
|
+
console.log(`Used: ${stats.used} bytes, Available: ${stats.available} bytes`);
|
|
304
129
|
```
|
|
305
130
|
|
|
306
|
-
###
|
|
131
|
+
### Static Methods (Backward Compatibility)
|
|
307
132
|
|
|
308
|
-
|
|
133
|
+
For backward compatibility, static methods are still available:
|
|
309
134
|
|
|
310
|
-
```
|
|
311
|
-
|
|
135
|
+
```typescript
|
|
136
|
+
// Local storage
|
|
137
|
+
BrowserStorage.setLocalData('key', value);
|
|
138
|
+
const data = BrowserStorage.getLocalData('key');
|
|
139
|
+
BrowserStorage.delLocalData('key');
|
|
312
140
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
// Custom encryption
|
|
323
|
-
storageEncrypt: (data, key) => {
|
|
324
|
-
// Use custom encryption library
|
|
325
|
-
return customEncrypt(data, key);
|
|
326
|
-
},
|
|
327
|
-
|
|
328
|
-
// Custom decryption
|
|
329
|
-
storageDecrypt: (data, key) => {
|
|
330
|
-
// Use custom decryption library
|
|
331
|
-
return customDecrypt(data, key);
|
|
332
|
-
}
|
|
333
|
-
});
|
|
141
|
+
// Session storage
|
|
142
|
+
BrowserStorage.setSessionData('key', value);
|
|
143
|
+
const data = BrowserStorage.getSessionData('key');
|
|
144
|
+
BrowserStorage.delSessionData('key');
|
|
145
|
+
|
|
146
|
+
// Storage instances
|
|
147
|
+
const localStorage = BrowserStorage.getLocalStorage();
|
|
148
|
+
const sessionStorage = BrowserStorage.getSessionStorage();
|
|
334
149
|
```
|
|
335
150
|
|
|
336
|
-
##
|
|
151
|
+
## Performance Optimizations
|
|
337
152
|
|
|
338
|
-
###
|
|
153
|
+
### In-Memory Caching
|
|
339
154
|
|
|
340
|
-
|
|
341
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
155
|
+
The storage automatically caches frequently accessed data in memory for faster retrieval:
|
|
342
156
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
getItem: (key) => {
|
|
347
|
-
// Custom get implementation
|
|
348
|
-
return localStorage.getItem(key);
|
|
349
|
-
},
|
|
350
|
-
|
|
351
|
-
setItem: (key, value) => {
|
|
352
|
-
// Custom set implementation
|
|
353
|
-
localStorage.setItem(key, value);
|
|
354
|
-
},
|
|
355
|
-
|
|
356
|
-
removeItem: (key) => {
|
|
357
|
-
// Custom remove implementation
|
|
358
|
-
localStorage.removeItem(key);
|
|
359
|
-
},
|
|
360
|
-
|
|
361
|
-
// Optional methods
|
|
362
|
-
clear: () => {
|
|
363
|
-
// Custom clear implementation
|
|
364
|
-
localStorage.clear();
|
|
365
|
-
},
|
|
366
|
-
|
|
367
|
-
key: (index) => {
|
|
368
|
-
// Custom key implementation
|
|
369
|
-
return localStorage.key(index);
|
|
370
|
-
},
|
|
371
|
-
|
|
372
|
-
get length() {
|
|
373
|
-
// Custom length implementation
|
|
374
|
-
return localStorage.length;
|
|
375
|
-
}
|
|
376
|
-
});
|
|
157
|
+
```typescript
|
|
158
|
+
// First call - reads from storage
|
|
159
|
+
const user1 = await storage.getStorageData('user');
|
|
377
160
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
stores: [UserStore],
|
|
381
|
-
storage: customStorage
|
|
382
|
-
});
|
|
161
|
+
// Second call - served from cache (much faster)
|
|
162
|
+
const user2 = await storage.getStorageData('user');
|
|
383
163
|
```
|
|
384
164
|
|
|
385
|
-
###
|
|
165
|
+
### Automatic Cleanup
|
|
386
166
|
|
|
387
|
-
|
|
388
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
167
|
+
Expired data is automatically cleaned up to prevent storage bloat:
|
|
389
168
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
storage: BrowserStorage,
|
|
394
|
-
|
|
395
|
-
// Storage migration
|
|
396
|
-
storageMigrate: (oldData, newData) => {
|
|
397
|
-
// Migrate from old format to new format
|
|
398
|
-
if (oldData.version === 1) {
|
|
399
|
-
return {
|
|
400
|
-
...newData,
|
|
401
|
-
user: {
|
|
402
|
-
...newData.user,
|
|
403
|
-
// Migrate old user format
|
|
404
|
-
current: oldData.user ? { ...oldData.user, id: oldData.user.id || 1 } : null
|
|
405
|
-
}
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
return newData;
|
|
409
|
-
},
|
|
410
|
-
|
|
411
|
-
// Version tracking
|
|
412
|
-
storageVersion: 2,
|
|
413
|
-
|
|
414
|
-
// Migration events
|
|
415
|
-
storageEvents: {
|
|
416
|
-
onMigrate: (oldVersion, newVersion) => {
|
|
417
|
-
console.log(`Migrated from v${oldVersion} to v${newVersion}`);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
169
|
+
```typescript
|
|
170
|
+
const storage = new BrowserStorage({
|
|
171
|
+
ttl: 60 * 60 * 1000 // 1 hour
|
|
420
172
|
});
|
|
173
|
+
|
|
174
|
+
// Data will be automatically removed after 1 hour
|
|
175
|
+
await storage.setStorageData('temp', 'data');
|
|
421
176
|
```
|
|
422
177
|
|
|
423
|
-
###
|
|
178
|
+
### Size Validation
|
|
424
179
|
|
|
425
|
-
|
|
426
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
180
|
+
Large data is validated before storage to prevent quota errors:
|
|
427
181
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
storage: BrowserStorage,
|
|
432
|
-
|
|
433
|
-
// Storage analytics
|
|
434
|
-
storageEvents: {
|
|
435
|
-
onSave: (key, value) => {
|
|
436
|
-
// Track storage usage
|
|
437
|
-
analytics.track('storage_save', {
|
|
438
|
-
key,
|
|
439
|
-
size: JSON.stringify(value).length,
|
|
440
|
-
timestamp: Date.now()
|
|
441
|
-
});
|
|
442
|
-
},
|
|
443
|
-
|
|
444
|
-
onLoad: (key, value) => {
|
|
445
|
-
// Track storage reads
|
|
446
|
-
analytics.track('storage_load', {
|
|
447
|
-
key,
|
|
448
|
-
size: JSON.stringify(value).length,
|
|
449
|
-
timestamp: Date.now()
|
|
450
|
-
});
|
|
451
|
-
},
|
|
452
|
-
|
|
453
|
-
onError: (error) => {
|
|
454
|
-
// Track storage errors
|
|
455
|
-
analytics.track('storage_error', {
|
|
456
|
-
error: error.message,
|
|
457
|
-
timestamp: Date.now()
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
}
|
|
182
|
+
```typescript
|
|
183
|
+
const storage = new BrowserStorage({
|
|
184
|
+
maxSize: 1024 * 1024 // 1MB limit
|
|
461
185
|
});
|
|
462
|
-
```
|
|
463
186
|
|
|
464
|
-
|
|
187
|
+
// This will fail if data exceeds 1MB
|
|
188
|
+
const success = await storage.setStorageData('large', bigData);
|
|
189
|
+
if (!success) {
|
|
190
|
+
console.log('Data too large for storage');
|
|
191
|
+
}
|
|
192
|
+
```
|
|
465
193
|
|
|
466
|
-
|
|
194
|
+
## Error Handling
|
|
467
195
|
|
|
468
|
-
|
|
469
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
196
|
+
The storage gracefully handles various error conditions:
|
|
470
197
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
'user.preferences.notifications',
|
|
481
|
-
'ui.sidebar.collapsed'
|
|
482
|
-
]
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
// User preferences will persist across sessions
|
|
486
|
-
Flux.dispatch({ type: 'SET_THEME', theme: 'dark' });
|
|
487
|
-
// Theme preference is automatically saved
|
|
198
|
+
```typescript
|
|
199
|
+
try {
|
|
200
|
+
const data = await storage.getStorageData('key');
|
|
201
|
+
if (data === null) {
|
|
202
|
+
console.log('Data not found or expired');
|
|
203
|
+
}
|
|
204
|
+
} catch (error) {
|
|
205
|
+
console.error('Storage error:', error);
|
|
206
|
+
}
|
|
488
207
|
```
|
|
489
208
|
|
|
490
|
-
|
|
209
|
+
Common error scenarios handled automatically:
|
|
491
210
|
|
|
492
|
-
|
|
493
|
-
|
|
211
|
+
- Storage not available (private browsing, etc.)
|
|
212
|
+
- Quota exceeded
|
|
213
|
+
- Corrupted data
|
|
214
|
+
- Invalid JSON
|
|
494
215
|
|
|
495
|
-
|
|
496
|
-
name: 'my-app',
|
|
497
|
-
stores: [CartStore],
|
|
498
|
-
storage: BrowserStorage,
|
|
216
|
+
## Migration Guide
|
|
499
217
|
|
|
500
|
-
|
|
501
|
-
storagePaths: ['cart.items', 'cart.total'],
|
|
218
|
+
### From Previous Version
|
|
502
219
|
|
|
503
|
-
|
|
504
|
-
storageExclude: ['cart.loading', 'cart.error']
|
|
505
|
-
});
|
|
220
|
+
The new version is fully backward compatible. Existing code will continue to work:
|
|
506
221
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
222
|
+
```typescript
|
|
223
|
+
// Old code - still works
|
|
224
|
+
const storage = new BrowserStorage({ type: 'session' });
|
|
225
|
+
await storage.setStorageData('key', value);
|
|
226
|
+
const data = await storage.getStorageData('key');
|
|
227
|
+
|
|
228
|
+
// New features available
|
|
229
|
+
const stats = storage.getStorageStats();
|
|
230
|
+
await storage.removeStorageData('key');
|
|
231
|
+
await storage.clearStorageData();
|
|
510
232
|
```
|
|
511
233
|
|
|
512
|
-
###
|
|
234
|
+
### Recommended Updates
|
|
513
235
|
|
|
514
|
-
|
|
515
|
-
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
|
|
236
|
+
For better performance, consider these updates:
|
|
516
237
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
storage: BrowserStorage,
|
|
521
|
-
|
|
522
|
-
// Persist form data with short debounce
|
|
523
|
-
storageWait: 100,
|
|
524
|
-
storagePaths: ['form.draft'],
|
|
525
|
-
|
|
526
|
-
// Clear form data on successful submission
|
|
527
|
-
storageEvents: {
|
|
528
|
-
onAction: (action) => {
|
|
529
|
-
if (action.type === 'FORM_SUBMIT_SUCCESS') {
|
|
530
|
-
// Clear draft data
|
|
531
|
-
localStorage.removeItem('arkhamjs-state-form.draft');
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
});
|
|
238
|
+
```typescript
|
|
239
|
+
// Before
|
|
240
|
+
const storage = new BrowserStorage({ type: 'session' });
|
|
536
241
|
|
|
537
|
-
//
|
|
538
|
-
|
|
242
|
+
// After - with optimizations
|
|
243
|
+
const storage = new BrowserStorage({
|
|
244
|
+
type: 'local', // Use localStorage for persistence
|
|
245
|
+
prefix: 'myapp_', // Custom prefix for organization
|
|
246
|
+
ttl: 24 * 60 * 60 * 1000, // 24 hour TTL
|
|
247
|
+
maxSize: 10 * 1024 * 1024 // 10MB limit
|
|
248
|
+
});
|
|
539
249
|
```
|
|
540
250
|
|
|
541
|
-
##
|
|
251
|
+
## Browser Support
|
|
542
252
|
|
|
543
|
-
-
|
|
544
|
-
-
|
|
545
|
-
-
|
|
253
|
+
- Chrome 60+
|
|
254
|
+
- Firefox 55+
|
|
255
|
+
- Safari 12+
|
|
256
|
+
- Edge 79+
|
|
546
257
|
|
|
547
|
-
##
|
|
258
|
+
## Bundle Size
|
|
548
259
|
|
|
549
|
-
|
|
260
|
+
- **Minified**: ~3.2KB
|
|
261
|
+
- **Gzipped**: ~1.1KB
|
|
262
|
+
- **Tree-shakeable**: Only includes what you use
|
|
550
263
|
|
|
551
|
-
##
|
|
264
|
+
## Contributing
|
|
552
265
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
266
|
+
1. Fork the repository
|
|
267
|
+
2. Create a feature branch
|
|
268
|
+
3. Make your changes
|
|
269
|
+
4. Add tests
|
|
270
|
+
5. Submit a pull request
|
|
556
271
|
|
|
557
|
-
##
|
|
272
|
+
## License
|
|
558
273
|
|
|
559
|
-
MIT License - see [LICENSE](
|
|
274
|
+
MIT License - see [LICENSE](LICENSE) file for details.
|
package/index.js
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
3
|
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import * as lib from './lib/index.js';
|
|
6
|
+
export default lib;
|
|
7
|
+
export * from './lib/index.js';
|
|
@@ -1,16 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/
|
|
5
|
+
import type { BrowserStorageOptions } from '../types/main';
|
|
2
6
|
export declare class BrowserStorage {
|
|
3
|
-
static window
|
|
4
|
-
private options;
|
|
7
|
+
private static readonly window;
|
|
8
|
+
private readonly options;
|
|
9
|
+
private readonly storageCache;
|
|
10
|
+
private readonly storage;
|
|
5
11
|
constructor(options?: BrowserStorageOptions);
|
|
6
12
|
static delLocalData(key: string): boolean;
|
|
7
13
|
static delSessionData(key: string): boolean;
|
|
8
14
|
static getLocalData(key: string): any;
|
|
9
|
-
static getLocalStorage(): any;
|
|
10
15
|
static getSessionData(key: string): any;
|
|
11
|
-
static getSessionStorage(): any;
|
|
12
16
|
static setLocalData(key: string, value: any): boolean;
|
|
13
17
|
static setSessionData(key: string, value: any): boolean;
|
|
18
|
+
static getLocalStorage(): Storage | null;
|
|
19
|
+
static getSessionStorage(): Storage | null;
|
|
14
20
|
getStorageData(key: string): Promise<any>;
|
|
15
21
|
setStorageData(key: string, value: any): Promise<boolean>;
|
|
22
|
+
removeStorageData(key: string): Promise<boolean>;
|
|
23
|
+
clearStorageData(): Promise<boolean>;
|
|
24
|
+
getStorageStats(): {
|
|
25
|
+
available: number;
|
|
26
|
+
total: number;
|
|
27
|
+
used: number;
|
|
28
|
+
};
|
|
29
|
+
private getStorage;
|
|
30
|
+
private getPrefixedKey;
|
|
31
|
+
private isStorageAvailable;
|
|
32
|
+
private validateSize;
|
|
33
|
+
private cleanExpiredData;
|
|
16
34
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0Jyb3dzZXJTdG9yYWdlL0Jyb3dzZXJTdG9yYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtCcm93c2VyU3RvcmFnZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzL21haW4nO1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlclN0b3JhZ2Uge1xuICBzdGF0aWMgd2luZG93OiBhbnkgPSB3aW5kb3cgfHwge307XG4gIHByaXZhdGUgb3B0aW9uczogQnJvd3NlclN0b3JhZ2VPcHRpb25zID0ge1xuICAgIHR5cGU6ICdzZXNzaW9uJ1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJyb3dzZXJTdG9yYWdlT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuZ2V0U3RvcmFnZURhdGEgPSB0aGlzLmdldFN0b3JhZ2VEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdG9yYWdlRGF0YSA9IHRoaXMuc2V0U3RvcmFnZURhdGEuYmluZCh0aGlzKTtcblxuICAgIC8vIENvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5vcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2V5IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIHN0YXRpYyBkZWxMb2NhbERhdGEoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRMb2NhbFN0b3JhZ2UoKTtcblxuICAgIGlmKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2V5IGZyb20gc2Vzc2lvblN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIGRlbFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgaWYoc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgZGF0YS5cbiAgICogQHJldHVybnMge2FueX0gdGhlIGRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICAgKi9cbiAgc3RhdGljIGdldExvY2FsRGF0YShrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgbG9jYWxTdG9yYWdlID0gQnJvd3NlclN0b3JhZ2UuZ2V0TG9jYWxTdG9yYWdlKCk7XG5cbiAgICBpZihsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2NhbFN0b3JhZ2UgZnJvbSBnbG9iYWwgd2luZG93IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgdG8gc3RvcmUgZGF0YS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIERhdGEgdG8gc3RvcmUuXG4gICAqIEByZXR1cm5zIHthbnl9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlKCk6IGFueSB7XG4gICAgY29uc3Qge2xvY2FsU3RvcmFnZX0gPSBCcm93c2VyU3RvcmFnZS53aW5kb3c7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBzZXNzaW9uU3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IGZvciBkYXRhLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gQnJvd3NlclN0b3JhZ2UuZ2V0U2Vzc2lvblN0b3JhZ2UoKTtcblxuICAgIGlmKHNlc3Npb25TdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpdGVtID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlc3Npb25TdG9yYWdlIGZyb20gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IHRvIHN0b3JlIGRhdGEuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBEYXRhIHRvIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7YW55fSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2Vzc2lvblN0b3JhZ2UoKTogYW55IHtcbiAgICBjb25zdCB7c2Vzc2lvblN0b3JhZ2V9ID0gQnJvd3NlclN0b3JhZ2Uud2luZG93O1xuXG4gICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSB0byBzdG9yZSBkYXRhLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgRGF0YSB0byBzdG9yZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkLlxuICAgKi9cbiAgc3RhdGljIHNldExvY2FsRGF0YShrZXk6IHN0cmluZywgdmFsdWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRMb2NhbFN0b3JhZ2UoKTtcblxuICAgIGlmKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gc2Vzc2lvblN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IHRvIHN0b3JlIGRhdGEuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBEYXRhIHRvIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQuXG4gICAqL1xuICBzdGF0aWMgc2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgaWYoc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSB2YWx1ZSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gdGhlIGRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICAgKi9cbiAgZ2V0U3RvcmFnZURhdGEoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzID0gdHlwZSA9PT0gJ2xvY2FsJyA/IEJyb3dzZXJTdG9yYWdlLmdldExvY2FsRGF0YShrZXkpIDogQnJvd3NlclN0b3JhZ2UuZ2V0U2Vzc2lvbkRhdGEoa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gc3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgdG8gc3RvcmUgZGF0YS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIERhdGEgdG8gc3RvcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBzYXZlZC5cbiAgICovXG4gIHNldFN0b3JhZ2VEYXRhKGtleTogc3RyaW5nLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuID0gdHlwZSA9PT0gJ2xvY2FsJyA/XG4gICAgICBCcm93c2VyU3RvcmFnZS5zZXRMb2NhbERhdGEoa2V5LCB2YWx1ZSkgOlxuICAgICAgQnJvd3NlclN0b3JhZ2Uuc2V0U2Vzc2lvbkRhdGEoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHRzKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjRaQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSxvQkFBQUUsSUFBQSxlQUFBQyxFQUFBSCxHQU1PLE1BQU1FLENBQWUsQ0FNMUIsWUFBWUUsRUFBaUMsQ0FBQyxFQUFHLENBSmpELEtBQVEsUUFBaUMsQ0FDdkMsS0FBTSxTQUNSLEVBSUUsS0FBSyxlQUFpQixLQUFLLGVBQWUsS0FBSyxJQUFJLEVBQ25ELEtBQUssZUFBaUIsS0FBSyxlQUFlLEtBQUssSUFBSSxFQUduRCxLQUFLLFFBQVUsQ0FBQyxHQUFHLEtBQUssUUFBUyxHQUFHQSxDQUFPLENBQzdDLENBWkEsWUFBTyxPQUFjLFFBQVUsQ0FBQyxFQW9CaEMsT0FBTyxhQUFhQyxFQUFzQixDQUN4QyxNQUFNQyxFQUFlSixFQUFlLGdCQUFnQixFQUVwRCxHQUFHSSxFQUNELEdBQUksQ0FDRixPQUFBQSxFQUFhLFdBQVdELENBQUcsRUFDcEIsRUFDVCxNQUFlLENBQ2IsTUFBTyxFQUNULEtBRUEsT0FBTyxFQUVYLENBUUEsT0FBTyxlQUFlQSxFQUFzQixDQUMxQyxNQUFNRSxFQUFpQkwsRUFBZSxrQkFBa0IsRUFFeEQsR0FBR0ssRUFDRCxHQUFJLENBQ0YsT0FBQUEsRUFBZSxXQUFXRixDQUFHLEVBQ3RCLEVBQ1QsTUFBZSxDQUNiLE1BQU8sRUFDVCxLQUVBLE9BQU8sRUFFWCxDQVFBLE9BQU8sYUFBYUEsRUFBa0IsQ0FDcEMsTUFBTUMsRUFBZUosRUFBZSxnQkFBZ0IsRUFFcEQsR0FBR0ksRUFDRCxHQUFJLENBQ0YsTUFBTUUsRUFBT0YsRUFBYSxRQUFRRCxDQUFHLEVBRXJDLE9BQUdHLEVBQ00sS0FBSyxNQUFNQSxDQUFJLEVBR2pCLElBQ1QsTUFBZSxDQUNiLE9BQU8sSUFDVCxLQUVBLFFBQU8sSUFFWCxDQVNBLE9BQU8saUJBQXVCLENBQzVCLEtBQU0sQ0FBQyxhQUFBRixDQUFZLEVBQUlKLEVBQWUsT0FDdEMsT0FBT0ksQ0FDVCxDQVFBLE9BQU8sZUFBZUQsRUFBa0IsQ0FDdEMsTUFBTUUsRUFBaUJMLEVBQWUsa0JBQWtCLEVBRXhELEdBQUdLLEVBQ0QsR0FBSSxDQUNGLE1BQU1DLEVBQU9ELEVBQWUsUUFBUUYsQ0FBRyxFQUV2QyxPQUFHRyxHQUNNQSxFQUFPLEtBQUssTUFBTUEsQ0FBSSxFQUd4QixJQUNULE1BQWUsQ0FDYixPQUFPLElBQ1QsS0FFQSxRQUFPLElBRVgsQ0FTQSxPQUFPLG1CQUF5QixDQUM5QixLQUFNLENBQUMsZUFBQUQsQ0FBYyxFQUFJTCxFQUFlLE9BRXhDLE9BQU9LLENBQ1QsQ0FTQSxPQUFPLGFBQWFGLEVBQWFJLEVBQWdCLENBQy9DLE1BQU1ILEVBQWVKLEVBQWUsZ0JBQWdCLEVBRXBELEdBQUdJLEVBQ0QsR0FBSSxDQUNGLE9BQUFBLEVBQWEsUUFBUUQsRUFBSyxLQUFLLFVBQVVJLENBQUssQ0FBQyxFQUN4QyxFQUNULE1BQWUsQ0FDYixNQUFPLEVBQ1QsS0FFQSxPQUFPLEVBRVgsQ0FTQSxPQUFPLGVBQWVKLEVBQWFJLEVBQWdCLENBQ2pELE1BQU1GLEVBQWlCTCxFQUFlLGtCQUFrQixFQUV4RCxHQUFHSyxFQUNELEdBQUksQ0FDRixPQUFBQSxFQUFlLFFBQVFGLEVBQUssS0FBSyxVQUFVSSxDQUFLLENBQUMsRUFDMUMsRUFDVCxNQUFlLENBQ2IsTUFBTyxFQUNULEtBRUEsT0FBTyxFQUVYLENBUUEsZUFBZUosRUFBMkIsQ0FDeEMsS0FBTSxDQUFDLEtBQUFLLENBQUksRUFBSSxLQUFLLFFBQ2RDLEVBQVVELElBQVMsUUFBVVIsRUFBZSxhQUFhRyxDQUFHLEVBQUlILEVBQWUsZUFBZUcsQ0FBRyxFQUN2RyxPQUFPLFFBQVEsUUFBUU0sQ0FBTyxDQUNoQyxDQVNBLGVBQWVOLEVBQWFJLEVBQXlCLENBQ25ELEtBQU0sQ0FBQyxLQUFBQyxDQUFJLEVBQUksS0FBSyxRQUNkQyxFQUFtQkQsSUFBUyxRQUNoQ1IsRUFBZSxhQUFhRyxFQUFLSSxDQUFLLEVBQ3RDUCxFQUFlLGVBQWVHLEVBQUtJLENBQUssRUFDMUMsT0FBTyxRQUFRLFFBQVFFLENBQU8sQ0FDaEMsQ0FDRiIsCiAgIm5hbWVzIjogWyJCcm93c2VyU3RvcmFnZV9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkJyb3dzZXJTdG9yYWdlIiwgIl9fdG9Db21tb25KUyIsICJvcHRpb25zIiwgImtleSIsICJsb2NhbFN0b3JhZ2UiLCAic2Vzc2lvblN0b3JhZ2UiLCAiaXRlbSIsICJ2YWx1ZSIsICJ0eXBlIiwgInJlc3VsdHMiXQp9Cg==
|
|
1
|
+
const c="arkhamjs_";const n=i=>i.ttl?Date.now()-i.timestamp>i.ttl:!1,l=i=>new Blob([i]).size,h=i=>{const e=JSON.stringify(i);return e.length>1e3,e},g=i=>{try{return JSON.parse(i)}catch{return null}};class a{static window=typeof window<"u"?window:{};options;storageCache=new Map;storage;constructor(e={}){this.options={compression:!1,maxSize:5242880,prefix:c,ttl:864e5,type:"session",...e},this.storage=this.getStorage()}static delLocalData(e){try{const t=a.window.localStorage;if(t)return t.removeItem(e),!0}catch{}return!1}static delSessionData(e){try{const t=a.window.sessionStorage;if(t)return t.removeItem(e),!0}catch{}return!1}static getLocalData(e){try{const t=a.window.localStorage;if(t){const r=t.getItem(e);return r?JSON.parse(r):null}}catch{}return null}static getSessionData(e){try{const t=a.window.sessionStorage;if(t){const r=t.getItem(e);return r?JSON.parse(r):null}}catch{}return null}static setLocalData(e,t){try{const r=a.window.localStorage;if(r)return r.setItem(e,JSON.stringify(t)),!0}catch{}return!1}static setSessionData(e,t){try{const r=a.window.sessionStorage;if(r)return r.setItem(e,JSON.stringify(t)),!0}catch{}return!1}static getLocalStorage(){try{return a.window.localStorage||null}catch{return null}}static getSessionStorage(){try{return a.window.sessionStorage||null}catch{return null}}async getStorageData(e){if(!this.isStorageAvailable())return null;const t=this.getPrefixedKey(e);if(this.storageCache.has(t))return this.storageCache.get(t);try{const r=this.storage.getItem(t);if(!r)return null;const s=g(r);return s?n(s)?(this.storage.removeItem(t),this.storageCache.delete(t),null):(this.storageCache.set(t,s.value),s.value):null}catch{return null}}async setStorageData(e,t){if(!this.isStorageAvailable())return!1;const r=this.getPrefixedKey(e);try{Math.random()<.1&&this.cleanExpiredData();const s={timestamp:Date.now(),ttl:this.options.ttl,value:t},o=this.options.compression?h(s):JSON.stringify(s);return this.validateSize(o)?(this.storage.setItem(r,o),this.storageCache.set(r,t),!0):!1}catch{return!1}}async removeStorageData(e){if(!this.isStorageAvailable())return!1;const t=this.getPrefixedKey(e);try{return this.storage.removeItem(t),this.storageCache.delete(t),!0}catch{return!1}}async clearStorageData(){if(!this.isStorageAvailable())return!1;try{const e=[];for(let t=0;t<this.storage.length;t++){const r=this.storage.key(t);r?.startsWith(this.options.prefix)&&e.push(r)}return e.forEach(t=>{this.storage.removeItem(t),this.storageCache.delete(t)}),!0}catch{return!1}}getStorageStats(){if(!this.isStorageAvailable())return{available:0,total:0,used:0};let e=0;const t=[];for(let r=0;r<this.storage.length;r++){const s=this.storage.key(r);if(s?.startsWith(this.options.prefix)){t.push(s);const o=this.storage.getItem(s);o&&(e+=l(o))}}return{available:this.options.maxSize-e,total:this.options.maxSize,used:e}}getStorage(){try{const{type:e}=this.options;return(e==="local"?a.window.localStorage:a.window.sessionStorage)||null}catch{return null}}getPrefixedKey(e){return`${this.options.prefix}${e}`}isStorageAvailable(){return this.storage!==null}validateSize(e){return l(e)<=this.options.maxSize}cleanExpiredData(){if(!this.isStorageAvailable())return;const e=[];for(let t=0;t<this.storage.length;t++){const r=this.storage.key(t);r?.startsWith(this.options.prefix)&&e.push(r)}e.forEach(t=>{try{const r=this.storage.getItem(t);if(r){const s=g(r);s&&n(s)&&(this.storage.removeItem(t),this.storageCache.delete(t))}}catch{this.storage.removeItem(t),this.storageCache.delete(t)}})}}export{a as BrowserStorage};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0Jyb3dzZXJTdG9yYWdlL0Jyb3dzZXJTdG9yYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBCcm93c2VyU3RvcmFnZU9wdGlvbnMsXG4gIFN0b3JhZ2VEYXRhLFxuICBTdG9yYWdlSW50ZXJmYWNlXG59IGZyb20gJy4uL3R5cGVzL21haW4nO1xuXG4vLyBDb25zdGFudHMgZm9yIG9wdGltaXphdGlvblxuY29uc3QgREVGQVVMVF9QUkVGSVggPSAnYXJraGFtanNfJztcbmNvbnN0IERFRkFVTFRfTUFYX1NJWkUgPSA1ICogMTAyNCAqIDEwMjQ7IC8vIDVNQlxuY29uc3QgREVGQVVMVF9UVEwgPSAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyAyNCBob3Vyc1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuY29uc3QgaXNFeHBpcmVkID0gKGRhdGE6IFN0b3JhZ2VEYXRhKTogYm9vbGVhbiA9PiB7XG4gIGlmKCFkYXRhLnR0bCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gRGF0ZS5ub3coKSAtIGRhdGEudGltZXN0YW1wID4gZGF0YS50dGw7XG59O1xuXG5jb25zdCBnZXRTdG9yYWdlU2l6ZSA9IChkYXRhOiBzdHJpbmcpOiBudW1iZXIgPT4gbmV3IEJsb2IoW2RhdGFdKS5zaXplO1xuXG5jb25zdCBjb21wcmVzc0RhdGEgPSAoZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgLy8gU2ltcGxlIGNvbXByZXNzaW9uIGZvciBsYXJnZSBvYmplY3RzXG4gIGNvbnN0IGpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgaWYoanNvblN0cmluZy5sZW5ndGggPiAxMDAwKSB7XG4gICAgLy8gRm9yIGxhcmdlIGRhdGEsIHdlIGNvdWxkIGltcGxlbWVudCBhY3R1YWwgY29tcHJlc3Npb24gaGVyZVxuICAgIC8vIEZvciBub3csIHdlJ2xsIHVzZSBhIHNpbXBsZSBhcHByb2FjaFxuICAgIHJldHVybiBqc29uU3RyaW5nO1xuICB9XG4gIHJldHVybiBqc29uU3RyaW5nO1xufTtcblxuY29uc3QgZGVjb21wcmVzc0RhdGEgPSAoZGF0YTogc3RyaW5nKTogYW55ID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJTdG9yYWdlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgd2luZG93OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcyA9XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fSBhcyBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxCcm93c2VyU3RvcmFnZU9wdGlvbnM+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZUludGVyZmFjZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQnJvd3NlclN0b3JhZ2VPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBjb21wcmVzc2lvbjogZmFsc2UsXG4gICAgICBtYXhTaXplOiBERUZBVUxUX01BWF9TSVpFLFxuICAgICAgcHJlZml4OiBERUZBVUxUX1BSRUZJWCxcbiAgICAgIHR0bDogREVGQVVMVF9UVEwsXG4gICAgICB0eXBlOiAnc2Vzc2lvbicsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZSgpO1xuICB9XG5cbiAgLy8gU3RhdGljIG1ldGhvZHMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgc3RhdGljIGRlbExvY2FsRGF0YShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gQnJvd3NlclN0b3JhZ2Uud2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTdG9yYWdlIG5vdCBhdmFpbGFibGVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGRlbFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS53aW5kb3cuc2Vzc2lvblN0b3JhZ2U7XG4gICAgICBpZihzdG9yYWdlKSB7XG4gICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoe1xuICAgICAgLy8gU3RvcmFnZSBub3QgYXZhaWxhYmxlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhbERhdGEoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gQnJvd3NlclN0b3JhZ2Uud2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTdG9yYWdlIG5vdCBhdmFpbGFibGUgb3IgaW52YWxpZCBKU09OXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGdldFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZSA9IEJyb3dzZXJTdG9yYWdlLndpbmRvdy5zZXNzaW9uU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTdG9yYWdlIG5vdCBhdmFpbGFibGUgb3IgaW52YWxpZCBKU09OXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHNldExvY2FsRGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gQnJvd3NlclN0b3JhZ2Uud2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaHtcbiAgICAgIC8vIFN0b3JhZ2Ugbm90IGF2YWlsYWJsZSBvciBxdW90YSBleGNlZWRlZFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgc2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZSA9IEJyb3dzZXJTdG9yYWdlLndpbmRvdy5zZXNzaW9uU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaHtcbiAgICAgIC8vIFN0b3JhZ2Ugbm90IGF2YWlsYWJsZSBvciBxdW90YSBleGNlZWRlZFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlKCk6IFN0b3JhZ2UgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJyb3dzZXJTdG9yYWdlLndpbmRvdy5sb2NhbFN0b3JhZ2UgfHwgbnVsbDtcbiAgICB9IGNhdGNoe1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFNlc3Npb25TdG9yYWdlKCk6IFN0b3JhZ2UgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJyb3dzZXJTdG9yYWdlLndpbmRvdy5zZXNzaW9uU3RvcmFnZSB8fCBudWxsO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kc1xuICBhc3luYyBnZXRTdG9yYWdlRGF0YShrZXk6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYoIXRoaXMuaXNTdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gdGhpcy5nZXRQcmVmaXhlZEtleShrZXkpO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZih0aGlzLnN0b3JhZ2VDYWNoZS5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yYWdlQ2FjaGUuZ2V0KHByZWZpeGVkS2V5KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc3RvcmFnZSEuZ2V0SXRlbShwcmVmaXhlZEtleSk7XG4gICAgICBpZighaXRlbSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IGRlY29tcHJlc3NEYXRhKGl0ZW0pO1xuICAgICAgaWYoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgZXhwaXJlZFxuICAgICAgaWYoaXNFeHBpcmVkKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZSEucmVtb3ZlSXRlbShwcmVmaXhlZEtleSk7XG4gICAgICAgIHRoaXMuc3RvcmFnZUNhY2hlLmRlbGV0ZShwcmVmaXhlZEtleSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgICB0aGlzLnN0b3JhZ2VDYWNoZS5zZXQocHJlZml4ZWRLZXksIGRhdGEudmFsdWUpO1xuICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNldFN0b3JhZ2VEYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYoIXRoaXMuaXNTdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmaXhlZEtleSA9IHRoaXMuZ2V0UHJlZml4ZWRLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDbGVhbiBleHBpcmVkIGRhdGEgcGVyaW9kaWNhbGx5XG4gICAgICBpZihNYXRoLnJhbmRvbSgpIDwgMC4xKSB7IC8vIDEwJSBjaGFuY2UgdG8gY2xlYW5cbiAgICAgICAgdGhpcy5jbGVhbkV4cGlyZWREYXRhKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YSA9IHtcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB0dGw6IHRoaXMub3B0aW9ucy50dGwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uXG4gICAgICAgID8gY29tcHJlc3NEYXRhKHN0b3JhZ2VEYXRhKVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHN0b3JhZ2VEYXRhKTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgaWYoIXRoaXMudmFsaWRhdGVTaXplKGpzb25TdHJpbmcpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihgU3RvcmFnZSBkYXRhIGV4Y2VlZHMgbWF4aW11bSBzaXplIGZvciBrZXk6ICR7a2V5fWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmFnZSEuc2V0SXRlbShwcmVmaXhlZEtleSwganNvblN0cmluZyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5zdG9yYWdlQ2FjaGUuc2V0KHByZWZpeGVkS2V5LCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc2V0IHN0b3JhZ2UgZGF0YTonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlU3RvcmFnZURhdGEoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZighdGhpcy5pc1N0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gdGhpcy5nZXRQcmVmaXhlZEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RvcmFnZSEucmVtb3ZlSXRlbShwcmVmaXhlZEtleSk7XG4gICAgICB0aGlzLnN0b3JhZ2VDYWNoZS5kZWxldGUocHJlZml4ZWRLZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhclN0b3JhZ2VEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCF0aGlzLmlzU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yYWdlIS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2UhLmtleShpKTtcbiAgICAgICAgaWYoa2V5Py5zdGFydHNXaXRoKHRoaXMub3B0aW9ucy5wcmVmaXgpKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yYWdlIS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIHRoaXMuc3RvcmFnZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RvcmFnZVN0YXRzKCk6IHsgYXZhaWxhYmxlOiBudW1iZXI7IHRvdGFsOiBudW1iZXI7IHVzZWQ6IG51bWJlciB9IHtcbiAgICBpZighdGhpcy5pc1N0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIHthdmFpbGFibGU6IDAsIHRvdGFsOiAwLCB1c2VkOiAwfTtcbiAgICB9XG5cbiAgICBsZXQgdXNlZCA9IDA7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JhZ2UhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2UhLmtleShpKTtcbiAgICAgIGlmKGtleT8uc3RhcnRzV2l0aCh0aGlzLm9wdGlvbnMucHJlZml4KSkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc3RvcmFnZSEuZ2V0SXRlbShrZXkpO1xuICAgICAgICBpZihpdGVtKSB7XG4gICAgICAgICAgdXNlZCArPSBnZXRTdG9yYWdlU2l6ZShpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhdmFpbGFibGU6IHRoaXMub3B0aW9ucy5tYXhTaXplIC0gdXNlZCxcbiAgICAgIHRvdGFsOiB0aGlzLm9wdGlvbnMubWF4U2l6ZSxcbiAgICAgIHVzZWRcbiAgICB9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBwcml2YXRlIGdldFN0b3JhZ2UoKTogU3RvcmFnZUludGVyZmFjZSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dHlwZX0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBjb25zdCBzdG9yYWdlID0gdHlwZSA9PT0gJ2xvY2FsJ1xuICAgICAgICA/IEJyb3dzZXJTdG9yYWdlLndpbmRvdy5sb2NhbFN0b3JhZ2VcbiAgICAgICAgOiBCcm93c2VyU3RvcmFnZS53aW5kb3cuc2Vzc2lvblN0b3JhZ2U7XG5cbiAgICAgIHJldHVybiBzdG9yYWdlIHx8IG51bGw7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJlZml4ZWRLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMucHJlZml4fSR7a2V5fWA7XG4gIH1cblxuICBwcml2YXRlIGlzU3RvcmFnZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNpemUoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2l6ZSA9IGdldFN0b3JhZ2VTaXplKGRhdGEpO1xuICAgIHJldHVybiBzaXplIDw9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkV4cGlyZWREYXRhKCk6IHZvaWQge1xuICAgIGlmKCF0aGlzLmlzU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yYWdlIS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlIS5rZXkoaSk7XG4gICAgICBpZihrZXk/LnN0YXJ0c1dpdGgodGhpcy5vcHRpb25zLnByZWZpeCkpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN0b3JhZ2UhLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYoaXRlbSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBkZWNvbXByZXNzRGF0YShpdGVtKTtcbiAgICAgICAgICBpZihkYXRhICYmIGlzRXhwaXJlZChkYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlIS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICAgIC8vIFJlbW92ZSBjb3JydXB0ZWQgZGF0YVxuICAgICAgICB0aGlzLnN0b3JhZ2UhLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgdGhpcy5zdG9yYWdlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVdBLE1BQU1BLEVBQWlCLFlBS3ZCLE1BQU1DLEVBQWFDLEdBQ2JBLEVBQUssSUFHRixLQUFLLElBQUksRUFBSUEsRUFBSyxVQUFZQSxFQUFLLElBRmpDLEdBS0xDLEVBQWtCRCxHQUF5QixJQUFJLEtBQUssQ0FBQ0EsQ0FBSSxDQUFDLEVBQUUsS0FFNURFLEVBQWdCRixHQUFzQixDQUUxQyxNQUFNRyxFQUFhLEtBQUssVUFBVUgsQ0FBSSxFQUN0QyxPQUFHRyxFQUFXLE9BQVMsSUFHZEEsQ0FHWCxFQUVNQyxFQUFrQkosR0FBc0IsQ0FDNUMsR0FBSSxDQUNGLE9BQU8sS0FBSyxNQUFNQSxDQUFJLENBQ3hCLE1BQU8sQ0FDTCxPQUFPLElBQ1QsQ0FDRixFQUVPLE1BQU1LLENBQWUsQ0FDMUIsT0FBd0IsT0FDdEIsT0FBTyxPQUFXLElBQWMsT0FBUyxDQUFDLEVBRTNCLFFBQ0EsYUFBZSxJQUFJLElBQ25CLFFBRWpCLFlBQVlDLEVBQWlDLENBQUMsRUFBRyxDQUMvQyxLQUFLLFFBQVUsQ0FDYixZQUFhLEdBQ2IsUUFBUyxRQUNULE9BQVFDLEVBQ1IsSUFBSyxNQUNMLEtBQU0sVUFDTixHQUFHRCxDQUNMLEVBRUEsS0FBSyxRQUFVLEtBQUssV0FBVyxDQUNqQyxDQUdBLE9BQU8sYUFBYUUsRUFBc0IsQ0FDeEMsR0FBSSxDQUNGLE1BQU1DLEVBQVVKLEVBQWUsT0FBTyxhQUN0QyxHQUFHSSxFQUNELE9BQUFBLEVBQVEsV0FBV0QsQ0FBRyxFQUNmLEVBRVgsTUFBTyxDQUVQLENBQ0EsTUFBTyxFQUNULENB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S0FBSyxRQUFTLFFBQVFGLENBQUcsRUFDbkNFLElBQ0RNLEdBQVFmLEVBQWVTLENBQUksRUFFL0IsQ0FDRixDQUVBLE1BQU8sQ0FDTCxVQUFXLEtBQUssUUFBUSxRQUFVTSxFQUNsQyxNQUFPLEtBQUssUUFBUSxRQUNwQixLQUFBQSxDQUNGLENBQ0YsQ0FHUSxZQUFzQyxDQUM1QyxHQUFJLENBQ0YsS0FBTSxDQUFDLEtBQUFDLENBQUksRUFBSSxLQUFLLFFBS3BCLE9BSmdCQSxJQUFTLFFBQ3JCWixFQUFlLE9BQU8sYUFDdEJBLEVBQWUsT0FBTyxpQkFFUixJQUNwQixNQUFPLENBQ0wsT0FBTyxJQUNULENBQ0YsQ0FFUSxlQUFlRyxFQUFxQixDQUMxQyxNQUFPLEdBQUcsS0FBSyxRQUFRLE1BQU0sR0FBR0EsQ0FBRyxFQUNyQyxDQUVRLG9CQUE4QixDQUNwQyxPQUFPLEtBQUssVUFBWSxJQUMxQixDQUVRLGFBQWFSLEVBQXVCLENBRTFDLE9BRGFDLEVBQWVELENBQUksR0FDakIsS0FBSyxRQUFRLE9BQzlCLENBRVEsa0JBQXlCLENBQy9CLEdBQUcsQ0FBQyxLQUFLLG1CQUFtQixFQUMxQixPQUdGLE1BQU1jLEVBQWlCLENBQUMsRUFDeEIsUUFBUUMsRUFBSSxFQUFHQSxFQUFJLEtBQUssUUFBUyxPQUFRQSxJQUFLLENBQzVDLE1BQU1QLEVBQU0sS0FBSyxRQUFTLElBQUlPLENBQUMsRUFDNUJQLEdBQUssV0FBVyxLQUFLLFFBQVEsTUFBTSxHQUNwQ00sRUFBSyxLQUFLTixDQUFHLENBRWpCLENBRUFNLEVBQUssUUFBU04sR0FBUSxDQUNwQixHQUFJLENBQ0YsTUFBTUUsRUFBTyxLQUFLLFFBQVMsUUFBUUYsQ0FBRyxFQUN0QyxHQUFHRSxFQUFNLENBQ1AsTUFBTVYsRUFBT0ksRUFBZU0sQ0FBSSxFQUM3QlYsR0FBUUQsRUFBVUMsQ0FBSSxJQUN2QixLQUFLLFFBQVMsV0FBV1EsQ0FBRyxFQUM1QixLQUFLLGFBQWEsT0FBT0EsQ0FBRyxFQUVoQyxDQUNGLE1BQU8sQ0FFTCxLQUFLLFFBQVMsV0FBV0EsQ0FBRyxFQUM1QixLQUFLLGFBQWEsT0FBT0EsQ0FBRyxDQUM5QixDQUNGLENBQUMsQ0FDSCxDQUNGIiwKICAibmFtZXMiOiBbIkRFRkFVTFRfUFJFRklYIiwgImlzRXhwaXJlZCIsICJkYXRhIiwgImdldFN0b3JhZ2VTaXplIiwgImNvbXByZXNzRGF0YSIsICJqc29uU3RyaW5nIiwgImRlY29tcHJlc3NEYXRhIiwgIkJyb3dzZXJTdG9yYWdlIiwgIm9wdGlvbnMiLCAiREVGQVVMVF9QUkVGSVgiLCAia2V5IiwgInN0b3JhZ2UiLCAiaXRlbSIsICJ2YWx1ZSIsICJwcmVmaXhlZEtleSIsICJzdG9yYWdlRGF0YSIsICJrZXlzIiwgImkiLCAidXNlZCIsICJ0eXBlIl0KfQo=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/
|
|
1
5
|
import { BrowserStorage } from './BrowserStorage/BrowserStorage';
|
|
2
6
|
export * from './types/main';
|
|
3
7
|
export { BrowserStorage };
|
package/lib/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import{BrowserStorage as o}from"./BrowserStorage/BrowserStorage";export*from"./types/main";export{o as BrowserStorage};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtCcm93c2VyU3RvcmFnZX0gZnJvbSAnLi9Ccm93c2VyU3RvcmFnZS9Ccm93c2VyU3RvcmFnZSc7XG5cbi8vIFN0b3JhZ2VcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvbWFpbic7XG5leHBvcnQge0Jyb3dzZXJTdG9yYWdlfTtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQVEsa0JBQUFBLE1BQXFCLGtDQUc3QixXQUFjIiwKICAibmFtZXMiOiBbIkJyb3dzZXJTdG9yYWdlIl0KfQo=
|
package/lib/types/main.d.ts
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
1
|
export interface BrowserStorageOptions {
|
|
2
2
|
readonly type?: 'local' | 'session';
|
|
3
|
+
readonly prefix?: string;
|
|
4
|
+
readonly compression?: boolean;
|
|
5
|
+
readonly maxSize?: number;
|
|
6
|
+
readonly ttl?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface StorageData {
|
|
9
|
+
readonly value: any;
|
|
10
|
+
readonly timestamp: number;
|
|
11
|
+
readonly ttl?: number;
|
|
12
|
+
}
|
|
13
|
+
export type StorageType = 'local' | 'session';
|
|
14
|
+
export interface StorageInterface {
|
|
15
|
+
readonly length: number;
|
|
16
|
+
readonly getItem: (key: string) => string | null;
|
|
17
|
+
readonly setItem: (key: string, value: string) => void;
|
|
18
|
+
readonly removeItem: (key: string) => void;
|
|
19
|
+
readonly clear: () => void;
|
|
20
|
+
readonly key: (index: number) => string | null;
|
|
3
21
|
}
|
package/lib/types/main.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3R5cGVzL21haW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlclN0b3JhZ2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgdHlwZT86ICdsb2NhbCcgfCAnc2Vzc2lvbic7XG59XG4iXSwKICAibWFwcGluZ3MiOiAia1dBQUEsSUFBQUEsRUFBQSxrQkFBQUMsRUFBQUQiLAogICJuYW1lcyI6IFsibWFpbl9leHBvcnRzIiwgIl9fdG9Db21tb25KUyJdCn0K
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
|
package/package.json
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlabs/arkhamjs-storage-browser",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.30.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"description": "Browser storage for ArkhamJS",
|
|
7
|
+
"description": "Browser storage for ArkhamJS with enhanced performance and modern ESNext features",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"main": "./lib/index.js",
|
|
10
10
|
"module": "./lib/index.js",
|
|
11
11
|
"browser": "./lib/index.js",
|
|
12
12
|
"types": "./lib/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": "./lib/index.js",
|
|
16
|
+
"require": "./lib/index.js",
|
|
17
|
+
"types": "./lib/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"sideEffects": false,
|
|
13
22
|
"keywords": [
|
|
14
23
|
"arkhamjs",
|
|
15
24
|
"flux",
|
|
16
25
|
"browser",
|
|
17
26
|
"nitrogenlabs",
|
|
18
|
-
"storage"
|
|
27
|
+
"storage",
|
|
28
|
+
"localStorage",
|
|
29
|
+
"sessionStorage",
|
|
30
|
+
"cache",
|
|
31
|
+
"performance"
|
|
19
32
|
],
|
|
20
33
|
"author": {
|
|
21
34
|
"name": "Giraldo Rosales",
|
|
@@ -41,14 +54,18 @@
|
|
|
41
54
|
"pretest": "npm run lint",
|
|
42
55
|
"reset": "lex clean",
|
|
43
56
|
"test": "lex test",
|
|
44
|
-
"
|
|
57
|
+
"test:watch": "lex test --watch",
|
|
58
|
+
"test:coverage": "lex test --coverage",
|
|
59
|
+
"update": "lex update --interactive",
|
|
60
|
+
"type-check": "tsc --noEmit",
|
|
61
|
+
"size": "npm run build && node -e \"console.log('Bundle size:', require('fs').statSync('./lib/index.js').size, 'bytes')\""
|
|
45
62
|
},
|
|
46
63
|
"peerDependencies": {
|
|
47
64
|
"@nlabs/arkhamjs": "^3.26.0"
|
|
48
65
|
},
|
|
49
66
|
"devDependencies": {
|
|
67
|
+
"@jest/globals": "^30.0.4",
|
|
50
68
|
"@nlabs/arkhamjs": "*",
|
|
51
|
-
"@types/jest": "^30.0.0",
|
|
52
69
|
"@types/node": "^24.0.10",
|
|
53
70
|
"typescript": "^5.8.3"
|
|
54
71
|
},
|