indexeddb-keyvalue 1.0.7 → 1.0.9
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 +103 -102
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/index.d.ts +58 -37
- package/package.json +1 -1
- package/src/{IndexedDBCachedFetch.js → CachedFetch.js} +7 -7
- package/src/{SimpleIndexDBStorage.js → CachedStorage.js} +5 -5
- package/src/{IndexDBStorage.js → IndexedDbStorage.js} +5 -5
- package/src/{IndexDBStorageFactory.js → StorageFactory.js} +12 -20
- package/src/TinyIndexDB.js +19 -0
- package/src/index.js +9 -9
package/README.md
CHANGED
|
@@ -1,212 +1,213 @@
|
|
|
1
1
|
# indexeddb-keyvalue
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A lightweight IndexedDB wrapper with dual-layer caching (Memory + IndexedDB), table management, CRUD operations, and HTTP request caching.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Features
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
7
|
+
- **Ultra Small** - Only **~1KB** gzipped, zero dependencies, extremely lightweight
|
|
8
|
+
- **Dual-Layer Caching** - **Memory + IndexedDB**, subsequent reads return directly from memory, 100-500x performance boost
|
|
9
|
+
- Automatic Version Management - No manual database upgrades needed
|
|
10
|
+
- Automatic Table Creation - Tables are created automatically when used
|
|
11
|
+
- Factory Pattern - Global instance caching, avoids duplicate connections
|
|
12
|
+
- Promise API - Fully asynchronous, supports async/await
|
|
13
|
+
- HTTP Caching - Automatically cache fetch request results
|
|
14
|
+
- TypeScript Support - Complete type definitions
|
|
15
|
+
- Zero Dependencies - No external dependencies
|
|
15
16
|
|
|
16
|
-
##
|
|
17
|
+
## Performance Comparison
|
|
17
18
|
|
|
18
|
-
|
|
|
19
|
-
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
19
|
+
| Operation | Pure IndexedDB | indexeddb-keyvalue (Memory Cache) | Performance Boost |
|
|
20
|
+
|-----------|---------------|----------------------------------|-------------------|
|
|
21
|
+
| First Read | ~1-5ms | ~1-5ms | Same |
|
|
22
|
+
| Subsequent Reads | ~1-5ms | **~0.01ms** | **100-500x** |
|
|
23
|
+
| Write | ~2-8ms | ~2-8ms (Memory + Persistence) | Reliable persistence |
|
|
23
24
|
|
|
24
|
-
>
|
|
25
|
+
> Based on Chrome/Edge browser testing, actual performance varies by data size and device. SimpleIndexDBStorage automatically caches read data to memory, making subsequent access nearly instant.
|
|
25
26
|
|
|
26
|
-
##
|
|
27
|
+
## Installation
|
|
27
28
|
|
|
28
29
|
```bash
|
|
29
30
|
npm install indexeddb-keyvalue
|
|
30
31
|
```
|
|
31
32
|
|
|
32
|
-
##
|
|
33
|
+
## Usage
|
|
33
34
|
|
|
34
|
-
###
|
|
35
|
+
### Option 1: CachedStorage (Recommended)
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
The simplest way to use it, with **built-in memory caching**, one line for high-performance data storage:
|
|
37
38
|
|
|
38
39
|
```javascript
|
|
39
|
-
import {
|
|
40
|
+
import { CachedStorage } from 'indexeddb-keyvalue';
|
|
40
41
|
|
|
41
|
-
//
|
|
42
|
-
const storage = new
|
|
42
|
+
// Create storage instance (with dual-layer Memory + IndexedDB caching)
|
|
43
|
+
const storage = new CachedStorage('myDB', 'myTable');
|
|
43
44
|
|
|
44
|
-
//
|
|
45
|
-
await storage.saveItem('user1', { name: '
|
|
45
|
+
// Save data (writes to both memory and IndexedDB)
|
|
46
|
+
await storage.saveItem('user1', { name: 'John', age: 25 });
|
|
46
47
|
|
|
47
|
-
//
|
|
48
|
+
// First read - loads from IndexedDB and caches to memory
|
|
48
49
|
const user1 = await storage.getItem('user1');
|
|
49
50
|
|
|
50
|
-
//
|
|
51
|
-
const user2 = await storage.getItem('user1'); // ⚡
|
|
51
|
+
// Second read - returns directly from memory, 100x+ faster!
|
|
52
|
+
const user2 = await storage.getItem('user1'); // ⚡ Lightning fast, almost no delay
|
|
52
53
|
|
|
53
|
-
//
|
|
54
|
-
console.log('
|
|
54
|
+
// Check memory cache status
|
|
55
|
+
console.log('Memory cache entries:', storage.getMemoryCacheSize());
|
|
55
56
|
|
|
56
|
-
//
|
|
57
|
+
// Delete data (removes from both memory and IndexedDB)
|
|
57
58
|
await storage.deleteItem('user1');
|
|
58
59
|
|
|
59
|
-
//
|
|
60
|
+
// Clear table (clears both memory and IndexedDB)
|
|
60
61
|
await storage.clear();
|
|
61
62
|
|
|
62
|
-
//
|
|
63
|
+
// Clear only memory cache (keeps IndexedDB data)
|
|
63
64
|
storage.clearMemoryCache();
|
|
64
65
|
```
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
67
|
+
**Performance Benefits:**
|
|
68
|
+
- First read: Load from IndexedDB → ~1-5ms
|
|
69
|
+
- Subsequent reads: Return from memory → **~0.01ms, 100-500x faster**
|
|
69
70
|
|
|
70
|
-
###
|
|
71
|
+
### Option 2: IndexedDBCachedFetch (HTTP Request Caching)
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
Automatically cache network request results:
|
|
73
74
|
|
|
74
75
|
```javascript
|
|
75
76
|
import { IndexedDBCachedFetch } from 'indexeddb-keyvalue';
|
|
76
77
|
|
|
77
|
-
const cachedFetch = new
|
|
78
|
+
const cachedFetch = new CachedFetch('cacheDB', 'apiCache');
|
|
78
79
|
|
|
79
|
-
//
|
|
80
|
+
// First request hits the network and caches the result
|
|
80
81
|
const data = await cachedFetch.fetchJson('https://api.example.com/data');
|
|
81
82
|
|
|
82
|
-
//
|
|
83
|
+
// Subsequent requests read directly from IndexedDB, no network access
|
|
83
84
|
const cachedData = await cachedFetch.fetchJson('https://api.example.com/data');
|
|
84
85
|
|
|
85
|
-
//
|
|
86
|
+
// Support for other response types
|
|
86
87
|
const text = await cachedFetch.fetchText('https://api.example.com/text');
|
|
87
88
|
const blob = await cachedFetch.fetchBlob('https://api.example.com/image.png');
|
|
88
89
|
const buffer = await cachedFetch.fetchArrayBuffer('https://api.example.com/binary');
|
|
89
90
|
|
|
90
|
-
//
|
|
91
|
+
// Use converter function to process data
|
|
91
92
|
const users = await cachedFetch.fetchJson('https://api.example.com/users', (data) => {
|
|
92
93
|
return data.map(user => ({ ...user, fullName: `${user.firstName} ${user.lastName}` }));
|
|
93
94
|
});
|
|
94
95
|
```
|
|
95
96
|
|
|
96
|
-
###
|
|
97
|
+
### Option 3: Factory Pattern (Multi-Table Shared Connection)
|
|
97
98
|
|
|
98
|
-
|
|
99
|
+
Share database connections in multi-table scenarios for better resource efficiency:
|
|
99
100
|
|
|
100
101
|
```javascript
|
|
101
|
-
import {
|
|
102
|
+
import { StorageFactory } from 'indexeddb-keyvalue';
|
|
102
103
|
|
|
103
|
-
//
|
|
104
|
-
const userStorage =
|
|
105
|
-
const orderStorage =
|
|
106
|
-
const productStorage =
|
|
104
|
+
// Get storage instances (global caching)
|
|
105
|
+
const userStorage = StorageFactory.getStorage('appDB', 'users');
|
|
106
|
+
const orderStorage = StorageFactory.getStorage('appDB', 'orders');
|
|
107
|
+
const productStorage = StorageFactory.getStorage('appDB', 'products');
|
|
107
108
|
|
|
108
|
-
//
|
|
109
|
-
await userStorage.saveItem('user1', { name: '
|
|
109
|
+
// Usage same as SimpleIndexDBStorage
|
|
110
|
+
await userStorage.saveItem('user1', { name: 'John' });
|
|
110
111
|
await orderStorage.saveItem('order1', { total: 100 });
|
|
111
|
-
await productStorage.saveItem('product1', { name: '
|
|
112
|
+
await productStorage.saveItem('product1', { name: 'Product A' });
|
|
112
113
|
|
|
113
|
-
//
|
|
114
|
+
// Retrieve data
|
|
114
115
|
const user = await userStorage.getItem('user1');
|
|
115
116
|
const order = await orderStorage.getItem('order1');
|
|
116
117
|
const product = await productStorage.getItem('product1');
|
|
117
118
|
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
// Clear cache (when recreating instances is needed)
|
|
120
|
+
StorageFactory.clearCache('appDB', 'users'); // Clear specific table
|
|
121
|
+
StorageFactory.clearCache('appDB'); // Clear entire database
|
|
122
|
+
StorageFactory.clearAllCache(); // Clear all caches
|
|
122
123
|
```
|
|
123
124
|
|
|
124
|
-
###
|
|
125
|
+
### Option 4: Low-Level API (TinyIndexDB)
|
|
125
126
|
|
|
126
|
-
|
|
127
|
+
Use when more control is needed:
|
|
127
128
|
|
|
128
129
|
```javascript
|
|
129
130
|
import { TinyIndexDB } from 'indexeddb-keyvalue';
|
|
130
131
|
|
|
131
|
-
//
|
|
132
|
+
// Create instance
|
|
132
133
|
const db = new TinyIndexDB('myDatabase', 'id');
|
|
133
134
|
|
|
134
|
-
//
|
|
135
|
+
// Initialize database (create multiple tables)
|
|
135
136
|
await db.initDB({
|
|
136
|
-
users: [['name', true], ['email', false]], // [
|
|
137
|
+
users: [['name', true], ['email', false]], // [indexName, unique]
|
|
137
138
|
orders: [['userId', false], ['status', false]]
|
|
138
139
|
});
|
|
139
140
|
|
|
140
|
-
//
|
|
141
|
+
// Batch save data
|
|
141
142
|
await db.saveOrUpdate('users', [
|
|
142
|
-
{ id: 'user1', name: '
|
|
143
|
-
{ id: 'user2', name: '
|
|
143
|
+
{ id: 'user1', name: 'John', email: 'john@example.com' },
|
|
144
|
+
{ id: 'user2', name: 'Jane', email: 'jane@example.com' }
|
|
144
145
|
]);
|
|
145
146
|
|
|
146
|
-
//
|
|
147
|
+
// Batch read data
|
|
147
148
|
const users = await db.readData('users', ['user1', 'user2']);
|
|
148
149
|
|
|
149
|
-
//
|
|
150
|
+
// Batch delete
|
|
150
151
|
await db.delData('users', ['user1']);
|
|
151
152
|
|
|
152
|
-
//
|
|
153
|
+
// Clear table
|
|
153
154
|
await db.clearTable('users');
|
|
154
155
|
|
|
155
|
-
//
|
|
156
|
+
// Custom transactions
|
|
156
157
|
await db.withTable('users', async (database) => {
|
|
157
158
|
const tx = database.transaction('users', 'readwrite');
|
|
158
159
|
const store = tx.objectStore('users');
|
|
159
|
-
//
|
|
160
|
+
// Execute custom operations...
|
|
160
161
|
});
|
|
161
162
|
```
|
|
162
163
|
|
|
163
|
-
## API
|
|
164
|
+
## API Reference
|
|
164
165
|
|
|
165
|
-
###
|
|
166
|
+
### CachedStorage
|
|
166
167
|
|
|
167
|
-
|
|
|
168
|
-
|
|
169
|
-
| `saveItem(name, data)` | `name: string`, `data: any` | `Promise<void>` |
|
|
170
|
-
| `getItem(name)` | `name: string` | `Promise<any>` |
|
|
171
|
-
| `deleteItem(name)` | `name: string` | `Promise<void>` |
|
|
172
|
-
| `clear()` | - | `Promise<void>` |
|
|
173
|
-
| `clearMemoryCache()` | - | `void` |
|
|
174
|
-
| `getMemoryCacheSize()` | - | `number` |
|
|
168
|
+
| Method | Parameters | Return | Description |
|
|
169
|
+
|--------|-----------|--------|-------------|
|
|
170
|
+
| `saveItem(name, data)` | `name: string`, `data: any` | `Promise<void>` | Save or update data (Memory + IndexedDB) |
|
|
171
|
+
| `getItem(name)` | `name: string` | `Promise<any>` | Get data (priority from memory cache) |
|
|
172
|
+
| `deleteItem(name)` | `name: string` | `Promise<void>` | Delete data (Memory + IndexedDB) |
|
|
173
|
+
| `clear()` | - | `Promise<void>` | Clear table (Memory + IndexedDB) |
|
|
174
|
+
| `clearMemoryCache()` | - | `void` | Clear only memory cache |
|
|
175
|
+
| `getMemoryCacheSize()` | - | `number` | Get memory cache entry count |
|
|
175
176
|
|
|
176
|
-
###
|
|
177
|
+
### CachedFetch
|
|
177
178
|
|
|
178
|
-
|
|
|
179
|
-
|
|
180
|
-
| `fetchJson(url, converter?)` | `url: string`, `converter?: (data) => any` | `Promise<T>` |
|
|
181
|
-
| `fetchText(url, converter?)` | `url: string`, `converter?: (data) => string` | `Promise<string>` |
|
|
182
|
-
| `fetchBlob(url, converter?)` | `url: string`, `converter?: (data) => Blob` | `Promise<Blob>` |
|
|
183
|
-
| `fetchArrayBuffer(url, converter?)` | `url: string`, `converter?: (data) => ArrayBuffer` | `Promise<ArrayBuffer>` |
|
|
179
|
+
| Method | Parameters | Return | Description |
|
|
180
|
+
|--------|-----------|--------|-------------|
|
|
181
|
+
| `fetchJson(url, converter?)` | `url: string`, `converter?: (data) => any` | `Promise<T>` | Get JSON data |
|
|
182
|
+
| `fetchText(url, converter?)` | `url: string`, `converter?: (data) => string` | `Promise<string>` | Get text data |
|
|
183
|
+
| `fetchBlob(url, converter?)` | `url: string`, `converter?: (data) => Blob` | `Promise<Blob>` | Get Blob data |
|
|
184
|
+
| `fetchArrayBuffer(url, converter?)` | `url: string`, `converter?: (data) => ArrayBuffer` | `Promise<ArrayBuffer>` | Get binary data |
|
|
184
185
|
|
|
185
|
-
###
|
|
186
|
+
### StorageFactory
|
|
186
187
|
|
|
187
|
-
|
|
|
188
|
-
|
|
189
|
-
| `getStorage(dbName, tableName)` | `dbName: string`, `tableName: string` | `
|
|
190
|
-
| `clearCache(dbName, tableName?)` | `dbName: string`, `tableName?: string` | `void` |
|
|
191
|
-
| `clearAllCache()` | - | `void` |
|
|
188
|
+
| Method | Parameters | Return | Description |
|
|
189
|
+
|--------|-----------|--------|-------------|
|
|
190
|
+
| `getStorage(dbName, tableName)` | `dbName: string`, `tableName: string` | `IndexedDbStorage` | Get/create storage instance |
|
|
191
|
+
| `clearCache(dbName, tableName?)` | `dbName: string`, `tableName?: string` | `void` | Clear specific cache |
|
|
192
|
+
| `clearAllCache()` | - | `void` | Clear all caches |
|
|
192
193
|
|
|
193
|
-
##
|
|
194
|
+
## Development
|
|
194
195
|
|
|
195
196
|
```bash
|
|
196
|
-
#
|
|
197
|
+
# Install dependencies
|
|
197
198
|
npm install
|
|
198
199
|
|
|
199
|
-
#
|
|
200
|
+
# Development mode (start local server)
|
|
200
201
|
npm run dev
|
|
201
202
|
|
|
202
|
-
#
|
|
203
|
+
# Build production version
|
|
203
204
|
npm run build
|
|
204
205
|
|
|
205
|
-
#
|
|
206
|
+
# Build development version
|
|
206
207
|
npm run build:dev
|
|
207
208
|
```
|
|
208
209
|
|
|
209
|
-
##
|
|
210
|
+
## Browser Compatibility
|
|
210
211
|
|
|
211
212
|
- Chrome/Edge 24+
|
|
212
213
|
- Firefox 16+
|
|
@@ -214,6 +215,6 @@ npm run build:dev
|
|
|
214
215
|
- iOS Safari 10+
|
|
215
216
|
- Android Chrome 25+
|
|
216
217
|
|
|
217
|
-
##
|
|
218
|
+
## License
|
|
218
219
|
|
|
219
220
|
MIT
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{"use strict";var e={d:(t,a)=>{for(var n in a)e.o(a,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:a[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function a(e,t){return function(...a){return new Promise(function(n,r){let
|
|
1
|
+
(()=>{"use strict";var e={d:(t,a)=>{for(var n in a)e.o(a,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:a[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function a(e,t){return function(...a){return new Promise(function(n,r){let s=e[t];s=s.bind(e);let i=s(...a);i.onsuccess=function(){n(i)},i.onerror=function(e){r(e)}})}}e.r(t),e.d(t,{CachedFetch:()=>o,CachedStorage:()=>i,IndexedDbStorage:()=>r,StorageFactory:()=>s,TinyIndexDB:()=>n,default:()=>i});class n{constructor(e,t){const a=window.indexedDB||window.webkitIndexedDB||window.msIndexedDB||window.mozIndexedDB;this.dbName=e,this.dbV=null,this.indexDbApi=a,this.keyPath=t,this.tablesConfig=null,this._db=null}async _ensureDbVersion(){void 0!==this.dbV&&null!==this.dbV||(this.dbV=await this._getCurrentVersion())}async initDB(e){this.tablesConfig={...this.tablesConfig,...e};let t=Object.keys(e);await this._ensureDbVersion();let a=await this._openDBInternal(),n=t.filter(e=>!a.objectStoreNames.contains(e));if(n.length>0){console.log("Missing tables:",n.join(", ")),a.close(),this._db&&this._db.close(),this._db=null,this.dbV+=1;try{a=await this._openDBAndCreateTables(e)}catch(n){if(!n||"VersionError"!==n.name)throw n;{console.log("Version conflict during table creation, retrying...");const n=await this._getCurrentVersion();this.dbV=n,a=await this._openDBInternal(),t.filter(e=>!a.objectStoreNames.contains(e)).length>0&&(this.dbV+=1,a.close(),a=await this._openDBAndCreateTables(e))}}}return this._db=a,a}async _openDBInternal(){let e=this;try{return await this._doOpenRaw()}catch(t){if(t&&"VersionError"===t.name){console.log(`VersionError: requested ${e.dbV}, getting actual version...`);const t=await e._getCurrentVersion();return e.dbV=t,this._doOpenRaw()}throw t}}_doOpenRaw(){let e=this;return new Promise((t,a)=>{let n=e.indexDbApi.open(e.dbName,e.dbV);n.onerror=function(e){a(e.target.error)},n.onsuccess=function(e){t(e.target.result)},n.onblocked=function(e){console.warn("Database open blocked, waiting for other connections to close...")}})}_getCurrentVersion(){let e=this;return new Promise((t,a)=>{let n=e.indexDbApi.open(e.dbName);n.onsuccess=function(e){let a=e.target.result,n=a.version;a.close(),console.log(`Current database version: ${n}`),t(n)},n.onerror=function(e){a(n.error)}})}async _openDBAndCreateTables(e){let t=this;try{return await this._doOpenAndCreate(e)}catch(a){if(a&&"VersionError"===a.name){console.log(`VersionError in _openDBAndCreateTables: requested ${t.dbV}, getting actual version...`);const a=await t._getCurrentVersion();return t.dbV=a,this._doOpenAndCreate(e)}throw a}}_doOpenAndCreate(e){let t=this,a=Object.keys(e),n=Object.values(e);return new Promise((e,r)=>{let s=t.indexDbApi.open(t.dbName,t.dbV);s.onerror=function(e){r(e.target.error)},s.onsuccess=function(t){e(t.target.result)},s.onupgradeneeded=function(e){let r,s=e.target.result;for(let e=0;e<a.length;e++)if(!s.objectStoreNames.contains(a[e])){r=s.createObjectStore(a[e],{keyPath:t.keyPath,autoIncrement:!1}),console.log("TABLE "+a[e]+" created Success");for(let t=0;t<n[e].length;t++)r.createIndex(n[e][t][0],n[e][t][0],{unique:n[e][t][1]})}}})}async openDB(){let e=this;if(this._db&&!this._db.closed)return this._db;await this._ensureDbVersion();try{return await this._doOpenDB()}catch(t){if("VersionError"===t.name){console.log(`VersionError in openDB: requested ${e.dbV}, getting actual version...`);const t=await e._getCurrentVersion();return e.dbV=t,this._doOpenDB()}throw t}}_doOpenDB(){let e=this;return new Promise((t,a)=>{let n=e.indexDbApi.open(e.dbName,e.dbV);n.onerror=function(e){a(e.target.error)},n.onsuccess=function(a){let n=a.target.result;n.onclose=function(){e._db=null},n.onversionchange=function(t){console.log("Database version changed, closing connection..."),n.close(),e._db=null},e._db=n,t(n)}})}async withTable(e,t){let a=await this.openDB();return await t(a)}async delData(e,t){return this.withTable(e,async n=>{const r=a(n.transaction(e,"readwrite").objectStore(e),"delete");for(let e=0;e<t.length;e++)await r(t[e])})}async readData(e,t){return this.withTable(e,async n=>{let r=a(n.transaction(e).objectStore(e),"get"),s=[];for(let e=0;e<t.length;e++){let a=await r(t[e]);s.push(a.result)}return s})}async saveOrUpdate(e,t){return this.withTable(e,async n=>{const r=a(n.transaction(e,"readwrite").objectStore(e),"put");for(let e=0;e<t.length;e++)await r(t[e])})}async addData(e,t){return this.withTable(e,async n=>{const r=a(n.transaction(e,"readwrite").objectStore(e),"add");for(let e=0;e<t.length;e++)await r(t[e])})}async updateData(e,t){return this.withTable(e,async n=>{const r=a(n.transaction(e,"readwrite").objectStore(e),"put");for(let e=0;e<t.length;e++)await r(t[e])})}async clearTable(e){return this.withTable(e,async t=>{const n=a(t.transaction(e,"readwrite").objectStore(e),"clear");await n()})}static _cache=new Map;static getInstance(e){if(n._cache.has(e))return n._cache.get(e);const t=new n(e,"name");return n._cache.set(e,t),t}}class r{constructor(e,t){this.dbName=e,this.tableName=t,this.isInited=!1,this.tinyIndexDB=n.getInstance(e)}async init(){if(this.isInited)return;const e={[this.tableName]:[["name",!0],["data",!1]]};await this.tinyIndexDB.initDB(e),this.isInited=!0}async saveItem(e,t){await this.init(),await this.tinyIndexDB.saveOrUpdate(this.tableName,[{name:e,data:t}])}async addItem(e,t){await this.init(),await this.tinyIndexDB.addData(this.tableName,[{name:e,data:t}])}async updateItem(e,t){await this.init(),await this.tinyIndexDB.updateData(this.tableName,[{name:e,data:t}])}async deleteItem(e){await this.init(),await this.tinyIndexDB.delData(this.tableName,[e])}async clear(){await this.init(),await this.tinyIndexDB.clearTable(this.tableName)}async getItem(e){await this.init();try{let t=(await this.tinyIndexDB.readData(this.tableName,[e]))[0];return t&&t.data}catch(e){return console.log(e),null}}}class s{static _storageCache=new Map;static getStorage(e,t){const a=`${e}:${t}`;if(this._storageCache.has(a))return this._storageCache.get(a);const n=new r(e,t);return this._storageCache.set(a,n),n}static getTinyIndexDB(e){return n.getInstance(e)}static clearCache(e,t){if(t)this._storageCache.delete(`${e}:${t}`);else{for(const t of this._storageCache.keys())t.startsWith(`${e}:`)&&this._storageCache.delete(t);n._cache.delete(e)}}static clearAllCache(){this._storageCache.clear(),n._cache.clear()}}class i{constructor(e,t){this.dbName=e||"linushp_default",this.tableName=t||"linushp_t",this._memoryCache=new Map,this._storage=null}_getStorage(){return this._storage||(this._storage=s.getStorage(this.dbName,this.tableName)),this._storage}async saveItem(e,t){return this._memoryCache.set(e,t),this._getStorage().saveItem(e,t)}async getItem(e){if(this._memoryCache.has(e))return this._memoryCache.get(e);const t=await this._getStorage().getItem(e);return null!=t&&this._memoryCache.set(e,t),t}async deleteItem(e){return this._memoryCache.delete(e),this._getStorage().deleteItem(e)}async clear(){return this._memoryCache.clear(),this._getStorage().clear()}getMemoryCacheSize(){return this._memoryCache.size}clearMemoryCache(){this._memoryCache.clear()}}class o{constructor(e,t){this.cachedStorage=new i(e,t)}fetchJson(e,t){return this.fetch(e,"json",t)}fetchArrayBuffer(e,t){return this.fetch(e,"arrayBuffer",t)}fetchBlob(e,t){return this.fetch(e,"blob",t)}fetchText(e,t){return this.fetch(e,"text",t)}async fetch(e,t,a){let n=await this.cachedStorage.getItem(e);if(!n){let r=await fetch(e);"arrayBuffer"===t?n=await r.arrayBuffer():"json"===t?n=await r.json():"blob"===t?n=await r.blob():"text"===t?n=await r.text():(n=null,console.error("responseType error")),a&&(n=await a(n)),await this.cachedStorage.saveItem(e,n)}return n}}module.exports=t})();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://indexdb-cached-xhr/webpack/bootstrap","webpack://indexdb-cached-xhr/webpack/runtime/define property getters","webpack://indexdb-cached-xhr/webpack/runtime/hasOwnProperty shorthand","webpack://indexdb-cached-xhr/webpack/runtime/make namespace object","webpack://indexdb-cached-xhr/./src/utils/promisifyStore.js","webpack://indexdb-cached-xhr/./src/TinyIndexDB.js","webpack://indexdb-cached-xhr/./src/IndexDBStorage.js","webpack://indexdb-cached-xhr/./src/IndexDBStorageFactory.js","webpack://indexdb-cached-xhr/./src/SimpleIndexDBStorage.js","webpack://indexdb-cached-xhr/./src/IndexedDBCachedFetch.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * 将 IndexedDB object store 方法 Promise 化\n * @param {IDBObjectStore} store - IndexedDB object store\n * @param {string} method - 方法名 (get, put, add, delete, clear 等)\n * @returns {Function} 返回一个 Promise 化的函数\n */\nfunction promisifyStore(store, method) {\n return function (...args) {\n return new Promise(function (resolve, reject) {\n let func = store[method];\n func = func.bind(store);\n let req = func(...args);\n req.onsuccess = function () {\n resolve(req);\n };\n req.onerror = function (e) {\n reject(e);\n };\n });\n };\n}\n\nexport { promisifyStore };\n","import { promisifyStore } from './utils/promisifyStore.js';\n\n/**\n * TinyIndexDB - IndexedDB 的轻量级封装\n * 提供数据库初始化、连接缓存、CRUD 操作\n */\nclass TinyIndexDB {\n\n constructor(dbName, keyPath) {\n const indexDbApi = window.indexedDB || window.webkitIndexedDB || window.msIndexedDB || window.mozIndexedDB;\n this.dbName = dbName;\n this.dbV = null; // dbV不需要外面传,内部自动获取\n this.indexDbApi = indexDbApi;\n this.keyPath = keyPath;\n this.tablesConfig = null;\n this._db = null; // 缓存的数据库连接\n }\n\n /**\n * 确保 dbV 已设置,未设置时自动获取当前版本\n */\n async _ensureDbVersion() {\n if (this.dbV === undefined || this.dbV === null) {\n this.dbV = await this._getCurrentVersion();\n }\n }\n\n /**\n * 初始化数据库,创建缺失的表\n * @param {Object} tables - 表配置 { tableName: [['indexName', unique], ...] }\n */\n async initDB(tables) {\n this.tablesConfig = { ...this.tablesConfig, ...tables };\n let tableNames = Object.keys(tables);\n\n // 确保版本号已设置\n await this._ensureDbVersion();\n\n // 先打开数据库检查表是否存在\n let db = await this._openDBInternal();\n\n // 检查是否所有表都存在\n let missingTables = tableNames.filter(name => !db.objectStoreNames.contains(name));\n\n if (missingTables.length > 0) {\n // 有表不存在,需要升级版本号创建\n console.log('Missing tables:', missingTables.join(', '));\n db.close();\n\n // 关闭缓存的连接,否则升级版本时会被阻塞\n if (this._db) {\n this._db.close();\n }\n this._db = null;\n\n // 升级版本号并重新打开\n this.dbV += 1;\n try {\n db = await this._openDBAndCreateTables(tables);\n } catch (err) {\n // 如果版本已被其他实例升级,重新获取当前版本\n if (err && err.name === 'VersionError') {\n console.log('Version conflict during table creation, retrying...');\n const actualVersion = await this._getCurrentVersion();\n this.dbV = actualVersion;\n // 重新检查表是否存在\n db = await this._openDBInternal();\n let stillMissing = tableNames.filter(name => !db.objectStoreNames.contains(name));\n if (stillMissing.length > 0) {\n // 还是需要创建表,再升级一次版本\n this.dbV += 1;\n db.close();\n db = await this._openDBAndCreateTables(tables);\n }\n } else {\n throw err;\n }\n }\n }\n\n this._db = db;\n return db;\n }\n\n async _openDBInternal() {\n let self = this;\n\n try {\n return await this._doOpenRaw();\n } catch (err) {\n // 如果版本号过低,获取当前版本并重试\n if (err && err.name === 'VersionError') {\n console.log(`VersionError: requested ${self.dbV}, getting actual version...`);\n const actualVersion = await self._getCurrentVersion();\n self.dbV = actualVersion;\n return this._doOpenRaw();\n }\n throw err;\n }\n }\n\n _doOpenRaw() {\n let self = this;\n return new Promise((resolve, reject) => {\n let req = self.indexDbApi.open(self.dbName, self.dbV);\n req.onerror = function (e) {\n reject(e.target.error);\n };\n req.onsuccess = function (e) {\n resolve(e.target.result);\n };\n req.onblocked = function (e) {\n console.warn('Database open blocked, waiting for other connections to close...');\n };\n });\n }\n\n /**\n * 获取数据库当前版本(不传版本号打开)\n */\n _getCurrentVersion() {\n let self = this;\n return new Promise((resolve, reject) => {\n // 不传版本号,获取当前版本\n let req = self.indexDbApi.open(self.dbName);\n req.onsuccess = function (e) {\n let db = e.target.result;\n let version = db.version;\n db.close();\n console.log(`Current database version: ${version}`);\n resolve(version);\n };\n req.onerror = function (e) {\n reject(req.error);\n };\n });\n }\n\n async _openDBAndCreateTables(tables) {\n let self = this;\n\n try {\n return await this._doOpenAndCreate(tables);\n } catch (err) {\n // 如果版本号过低,获取当前版本并更新后再试\n if (err && err.name === 'VersionError') {\n console.log(`VersionError in _openDBAndCreateTables: requested ${self.dbV}, getting actual version...`);\n const actualVersion = await self._getCurrentVersion();\n self.dbV = actualVersion;\n return this._doOpenAndCreate(tables);\n }\n throw err;\n }\n }\n\n _doOpenAndCreate(tables) {\n let self = this;\n let tableNames = Object.keys(tables);\n let tableIndexes = Object.values(tables);\n\n return new Promise((resolve, reject) => {\n let req = self.indexDbApi.open(self.dbName, self.dbV);\n req.onerror = function (e) {\n reject(e.target.error);\n };\n req.onsuccess = function (e) {\n resolve(e.target.result);\n };\n req.onupgradeneeded = function (e) {\n let db = e.target.result;\n let store;\n for (let i = 0; i < tableNames.length; i++) {\n if (!db.objectStoreNames.contains(tableNames[i])) {\n store = db.createObjectStore(tableNames[i], {keyPath: self.keyPath, autoIncrement: false});\n console.log('TABLE ' + tableNames[i] + ' created Success');\n for (let j = 0; j < tableIndexes[i].length; j++) {\n store.createIndex(tableIndexes[i][j][0], tableIndexes[i][j][0], {unique: tableIndexes[i][j][1]});\n }\n }\n }\n };\n });\n }\n\n /**\n * 打开数据库连接(带缓存)\n */\n async openDB() {\n let self = this;\n\n // 如果已有连接且未关闭,直接返回\n if (this._db && !this._db.closed) {\n return this._db;\n }\n\n // 确保版本号已设置\n await this._ensureDbVersion();\n\n try {\n return await this._doOpenDB();\n } catch (err) {\n // 如果版本号过低,获取当前版本并重试\n if (err.name === 'VersionError') {\n console.log(`VersionError in openDB: requested ${self.dbV}, getting actual version...`);\n const actualVersion = await self._getCurrentVersion();\n self.dbV = actualVersion;\n return this._doOpenDB();\n }\n throw err;\n }\n }\n\n _doOpenDB() {\n let self = this;\n return new Promise((resolve, reject) => {\n let req = self.indexDbApi.open(self.dbName, self.dbV);\n req.onerror = function (e) {\n reject(e.target.error);\n };\n req.onsuccess = function (e) {\n let db = e.target.result;\n // 监听连接意外关闭事件\n db.onclose = function() {\n self._db = null;\n };\n // 监听版本变化事件(其他标签页升级了数据库)\n db.onversionchange = function(event) {\n console.log('Database version changed, closing connection...');\n db.close();\n self._db = null;\n };\n self._db = db;\n resolve(db);\n };\n });\n }\n\n /**\n * 统一的 withTable 包装器 - 打开数据库执行操作\n */\n async withTable(tableName, callback) {\n let db = await this.openDB();\n return await callback(db);\n }\n\n async delData(tableName, keys) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_delete = promisifyStore(store, 'delete');\n\n for (let i = 0; i < keys.length; i++) {\n await store_delete(keys[i]);\n }\n });\n }\n\n async readData(tableName, keys) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName);\n let store = tx.objectStore(tableName);\n let store_get = promisifyStore(store, 'get');\n\n let result = [];\n for (let i = 0; i < keys.length; i++) {\n let d = await store_get(keys[i]);\n result.push(d.result);\n }\n return result;\n });\n }\n\n async saveOrUpdate(tableName, dataList) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_put = promisifyStore(store, 'put');\n for (let i = 0; i < dataList.length; i++) {\n await store_put(dataList[i]);\n }\n });\n }\n\n async addData(tableName, dataList) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_add = promisifyStore(store, 'add');\n for (let i = 0; i < dataList.length; i++) {\n await store_add(dataList[i]);\n }\n });\n }\n\n async updateData(tableName, dataList) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_put = promisifyStore(store, 'put');\n for (let i = 0; i < dataList.length; i++) {\n await store_put(dataList[i]);\n }\n });\n }\n\n async clearTable(tableName) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_clear = promisifyStore(store, 'clear');\n await store_clear();\n });\n }\n\n}\n\nexport { TinyIndexDB };\n","import { TinyIndexDB } from './TinyIndexDB.js';\n\n/**\n * IndexDBStorage - 单表存储封装\n * 自动初始化表,提供 CRUD 操作\n */\nclass IndexDBStorage {\n\n constructor(dbName, tableName) {\n this.dbName = dbName;\n this.tableName = tableName;\n this.isInited = false;\n\n // 直接使用 TinyIndexDB,版本号自动获取\n this.tinyIndexDB = new TinyIndexDB(dbName, 'name');\n }\n\n /**\n * 初始化表(如果不存在会自动创建)\n */\n async init() {\n if (this.isInited) {\n return;\n }\n\n // 初始化表配置\n const tablesConfig = {\n [this.tableName]: [\n ['name', true],\n ['data', false]\n ]\n };\n\n await this.tinyIndexDB.initDB(tablesConfig);\n this.isInited = true;\n }\n\n async saveItem(name, data) {\n await this.init();\n await this.tinyIndexDB.saveOrUpdate(this.tableName, [{name: name, data: data}]);\n }\n\n async addItem(name, data) {\n await this.init();\n await this.tinyIndexDB.addData(this.tableName, [{name: name, data: data}]);\n }\n\n async updateItem(name, data) {\n await this.init();\n await this.tinyIndexDB.updateData(this.tableName, [{name: name, data: data}]);\n }\n\n async deleteItem(name) {\n await this.init();\n await this.tinyIndexDB.delData(this.tableName, [name]);\n }\n\n async clear() {\n await this.init();\n await this.tinyIndexDB.clearTable(this.tableName);\n }\n\n async getItem(name) {\n await this.init();\n try {\n let values = await this.tinyIndexDB.readData(this.tableName, [name]);\n let value0 = values[0];\n return value0 && value0.data;\n } catch (e) {\n console.log(e);\n return null;\n }\n }\n}\n\nexport { IndexDBStorage };\n","import { TinyIndexDB } from './TinyIndexDB.js';\nimport { IndexDBStorage } from './IndexDBStorage.js';\n\n/**\n * IndexDBStorageFactory - IndexedDB 存储工厂\n * 全局缓存 storage 实例,以 dbName + tableName 为维度\n */\nclass IndexDBStorageFactory {\n\n // 全局缓存:{ 'dbName:tableName': IndexDBStorage }\n static _storageCache = new Map();\n\n // 全局缓存:{ 'dbName': TinyIndexDB }\n static _tinyIndexDBCache = new Map();\n\n /**\n * 获取或创建 storage 实例\n * @param {string} dbName - 数据库名\n * @param {string} tableName - 表名\n * @returns {IndexDBStorage}\n */\n static getStorage(dbName, tableName) {\n const cacheKey = `${dbName}:${tableName}`;\n\n // 从缓存获取\n if (this._storageCache.has(cacheKey)) {\n return this._storageCache.get(cacheKey);\n }\n\n // 创建新实例\n const storage = new IndexDBStorage(dbName, tableName);\n this._storageCache.set(cacheKey, storage);\n\n return storage;\n }\n\n /**\n * 获取或创建 TinyIndexDB 实例\n * @param {string} dbName - 数据库名\n * @returns {TinyIndexDB}\n */\n static getTinyIndexDB(dbName) {\n if (this._tinyIndexDBCache.has(dbName)) {\n return this._tinyIndexDBCache.get(dbName);\n }\n\n const tinyIndexDB = new TinyIndexDB(dbName, 'name');\n this._tinyIndexDBCache.set(dbName, tinyIndexDB);\n\n return tinyIndexDB;\n }\n\n /**\n * 清除指定缓存\n * @param {string} dbName - 数据库名\n * @param {string} tableName - 表名(可选,不传则清除整个数据库缓存)\n */\n static clearCache(dbName, tableName) {\n if (tableName) {\n this._storageCache.delete(`${dbName}:${tableName}`);\n } else {\n // 清除该数据库的所有表缓存\n for (const key of this._storageCache.keys()) {\n if (key.startsWith(`${dbName}:`)) {\n this._storageCache.delete(key);\n }\n }\n this._tinyIndexDBCache.delete(dbName);\n }\n }\n\n /**\n * 清除所有缓存\n */\n static clearAllCache() {\n this._storageCache.clear();\n this._tinyIndexDBCache.clear();\n }\n\n}\n\nexport { IndexDBStorageFactory };\n","import { IndexDBStorageFactory } from './IndexDBStorageFactory.js';\n\n/**\n * SimpleIndexDBStorage - 带内存缓存的单表存储封装\n * 读取优先从内存获取,写入同时更新内存和 IndexedDB\n */\nclass SimpleIndexDBStorage {\n\n constructor(dbName, tableName) {\n this.dbName = dbName || 'linushp_default';\n this.tableName = tableName || 'linushp_t';\n // 内存缓存\n this._memoryCache = new Map();\n // 使用工厂获取缓存的 storage 实例\n this._storage = null;\n }\n\n // 延迟获取 storage 实例\n _getStorage() {\n if (!this._storage) {\n this._storage = IndexDBStorageFactory.getStorage(this.dbName, this.tableName);\n }\n return this._storage;\n }\n\n async saveItem(name, data) {\n // 先更新内存\n this._memoryCache.set(name, data);\n // 再持久化到 IndexedDB\n return this._getStorage().saveItem(name, data);\n }\n\n async getItem(name) {\n // 先查内存缓存\n if (this._memoryCache.has(name)) {\n return this._memoryCache.get(name);\n }\n // 内存没有,查 IndexedDB\n const data = await this._getStorage().getItem(name);\n // 写入内存缓存\n if (data !== null && data !== undefined) {\n this._memoryCache.set(name, data);\n }\n return data;\n }\n\n async deleteItem(name) {\n // 先删除内存\n this._memoryCache.delete(name);\n // 再删除 IndexedDB\n return this._getStorage().deleteItem(name);\n }\n\n async clear() {\n // 清空内存\n this._memoryCache.clear();\n // 清空 IndexedDB\n return this._getStorage().clear();\n }\n\n /**\n * 获取内存缓存统计\n */\n getMemoryCacheSize() {\n return this._memoryCache.size;\n }\n\n /**\n * 清空内存缓存(不影响 IndexedDB)\n */\n clearMemoryCache() {\n this._memoryCache.clear();\n }\n\n}\n\nexport { SimpleIndexDBStorage };\n","import { SimpleIndexDBStorage } from './SimpleIndexDBStorage.js';\n\n/**\n * IndexedDBCachedFetch - 基于 IndexedDB 的缓存 Fetch\n * 将网络请求结果缓存到 IndexedDB 中\n */\nclass IndexedDBCachedFetch {\n\n constructor(dbName, tableName) {\n this.indexDbStorage = new SimpleIndexDBStorage(dbName, tableName);\n }\n\n fetchJson(url, converter) {\n return this.fetch(url, 'json', converter);\n }\n\n fetchArrayBuffer(url, converter) {\n return this.fetch(url, 'arrayBuffer', converter);\n }\n\n fetchBlob(url, converter) {\n return this.fetch(url, 'blob', converter);\n }\n\n fetchText(url, converter) {\n return this.fetch(url, 'text', converter);\n }\n\n async fetch(url, responseType, converter) {\n let cached = await this.indexDbStorage.getItem(url);\n if (!cached) {\n let fetchd = await fetch(url);\n if (responseType === 'arrayBuffer') {\n cached = await fetchd.arrayBuffer();\n } else if (responseType === 'json') {\n cached = await fetchd.json();\n } else if (responseType === 'blob') {\n cached = await fetchd.blob();\n } else if (responseType === 'text') {\n cached = await fetchd.text();\n } else {\n cached = null;\n console.error(\"responseType error\");\n }\n\n if (converter) {\n cached = await converter(cached);\n }\n\n await this.indexDbStorage.saveItem(url, cached);\n }\n return cached;\n }\n}\n\nexport { IndexedDBCachedFetch };\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","promisifyStore","store","method","args","Promise","resolve","reject","func","bind","req","onsuccess","onerror","e","TinyIndexDB","constructor","dbName","keyPath","indexDbApi","window","indexedDB","webkitIndexedDB","msIndexedDB","mozIndexedDB","this","dbV","tablesConfig","_db","_ensureDbVersion","undefined","_getCurrentVersion","initDB","tables","tableNames","keys","db","_openDBInternal","missingTables","filter","name","objectStoreNames","contains","length","console","log","join","close","_openDBAndCreateTables","err","actualVersion","self","_doOpenRaw","open","target","error","result","onblocked","warn","version","_doOpenAndCreate","tableIndexes","values","onupgradeneeded","i","createObjectStore","autoIncrement","j","createIndex","unique","openDB","closed","_doOpenDB","onclose","onversionchange","event","withTable","tableName","callback","delData","async","store_delete","transaction","objectStore","readData","store_get","d","push","saveOrUpdate","dataList","store_put","addData","store_add","updateData","clearTable","store_clear","IndexDBStorage","isInited","tinyIndexDB","init","saveItem","data","addItem","updateItem","deleteItem","clear","getItem","value0","IndexDBStorageFactory","static","Map","getStorage","cacheKey","_storageCache","has","storage","set","getTinyIndexDB","_tinyIndexDBCache","clearCache","delete","startsWith","clearAllCache","SimpleIndexDBStorage","_memoryCache","_storage","_getStorage","getMemoryCacheSize","size","clearMemoryCache","IndexedDBCachedFetch","indexDbStorage","fetchJson","url","converter","fetch","fetchArrayBuffer","fetchBlob","fetchText","responseType","cached","fetchd","arrayBuffer","json","blob","text"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://indexeddb-keyvalue/webpack/bootstrap","webpack://indexeddb-keyvalue/webpack/runtime/define property getters","webpack://indexeddb-keyvalue/webpack/runtime/hasOwnProperty shorthand","webpack://indexeddb-keyvalue/webpack/runtime/make namespace object","webpack://indexeddb-keyvalue/./src/utils/promisifyStore.js","webpack://indexeddb-keyvalue/./src/TinyIndexDB.js","webpack://indexeddb-keyvalue/./src/IndexedDbStorage.js","webpack://indexeddb-keyvalue/./src/StorageFactory.js","webpack://indexeddb-keyvalue/./src/CachedStorage.js","webpack://indexeddb-keyvalue/./src/CachedFetch.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * 将 IndexedDB object store 方法 Promise 化\n * @param {IDBObjectStore} store - IndexedDB object store\n * @param {string} method - 方法名 (get, put, add, delete, clear 等)\n * @returns {Function} 返回一个 Promise 化的函数\n */\nfunction promisifyStore(store, method) {\n return function (...args) {\n return new Promise(function (resolve, reject) {\n let func = store[method];\n func = func.bind(store);\n let req = func(...args);\n req.onsuccess = function () {\n resolve(req);\n };\n req.onerror = function (e) {\n reject(e);\n };\n });\n };\n}\n\nexport { promisifyStore };\n","import { promisifyStore } from './utils/promisifyStore.js';\n\n/**\n * TinyIndexDB - IndexedDB 的轻量级封装\n * 提供数据库初始化、连接缓存、CRUD 操作\n */\nclass TinyIndexDB {\n\n constructor(dbName, keyPath) {\n const indexDbApi = window.indexedDB || window.webkitIndexedDB || window.msIndexedDB || window.mozIndexedDB;\n this.dbName = dbName;\n this.dbV = null; // dbV不需要外面传,内部自动获取\n this.indexDbApi = indexDbApi;\n this.keyPath = keyPath;\n this.tablesConfig = null;\n this._db = null; // 缓存的数据库连接\n }\n\n /**\n * 确保 dbV 已设置,未设置时自动获取当前版本\n */\n async _ensureDbVersion() {\n if (this.dbV === undefined || this.dbV === null) {\n this.dbV = await this._getCurrentVersion();\n }\n }\n\n /**\n * 初始化数据库,创建缺失的表\n * @param {Object} tables - 表配置 { tableName: [['indexName', unique], ...] }\n */\n async initDB(tables) {\n this.tablesConfig = { ...this.tablesConfig, ...tables };\n let tableNames = Object.keys(tables);\n\n // 确保版本号已设置\n await this._ensureDbVersion();\n\n // 先打开数据库检查表是否存在\n let db = await this._openDBInternal();\n\n // 检查是否所有表都存在\n let missingTables = tableNames.filter(name => !db.objectStoreNames.contains(name));\n\n if (missingTables.length > 0) {\n // 有表不存在,需要升级版本号创建\n console.log('Missing tables:', missingTables.join(', '));\n db.close();\n\n // 关闭缓存的连接,否则升级版本时会被阻塞\n if (this._db) {\n this._db.close();\n }\n this._db = null;\n\n // 升级版本号并重新打开\n this.dbV += 1;\n try {\n db = await this._openDBAndCreateTables(tables);\n } catch (err) {\n // 如果版本已被其他实例升级,重新获取当前版本\n if (err && err.name === 'VersionError') {\n console.log('Version conflict during table creation, retrying...');\n const actualVersion = await this._getCurrentVersion();\n this.dbV = actualVersion;\n // 重新检查表是否存在\n db = await this._openDBInternal();\n let stillMissing = tableNames.filter(name => !db.objectStoreNames.contains(name));\n if (stillMissing.length > 0) {\n // 还是需要创建表,再升级一次版本\n this.dbV += 1;\n db.close();\n db = await this._openDBAndCreateTables(tables);\n }\n } else {\n throw err;\n }\n }\n }\n\n this._db = db;\n return db;\n }\n\n async _openDBInternal() {\n let self = this;\n\n try {\n return await this._doOpenRaw();\n } catch (err) {\n // 如果版本号过低,获取当前版本并重试\n if (err && err.name === 'VersionError') {\n console.log(`VersionError: requested ${self.dbV}, getting actual version...`);\n const actualVersion = await self._getCurrentVersion();\n self.dbV = actualVersion;\n return this._doOpenRaw();\n }\n throw err;\n }\n }\n\n _doOpenRaw() {\n let self = this;\n return new Promise((resolve, reject) => {\n let req = self.indexDbApi.open(self.dbName, self.dbV);\n req.onerror = function (e) {\n reject(e.target.error);\n };\n req.onsuccess = function (e) {\n resolve(e.target.result);\n };\n req.onblocked = function (e) {\n console.warn('Database open blocked, waiting for other connections to close...');\n };\n });\n }\n\n /**\n * 获取数据库当前版本(不传版本号打开)\n */\n _getCurrentVersion() {\n let self = this;\n return new Promise((resolve, reject) => {\n // 不传版本号,获取当前版本\n let req = self.indexDbApi.open(self.dbName);\n req.onsuccess = function (e) {\n let db = e.target.result;\n let version = db.version;\n db.close();\n console.log(`Current database version: ${version}`);\n resolve(version);\n };\n req.onerror = function (e) {\n reject(req.error);\n };\n });\n }\n\n async _openDBAndCreateTables(tables) {\n let self = this;\n\n try {\n return await this._doOpenAndCreate(tables);\n } catch (err) {\n // 如果版本号过低,获取当前版本并更新后再试\n if (err && err.name === 'VersionError') {\n console.log(`VersionError in _openDBAndCreateTables: requested ${self.dbV}, getting actual version...`);\n const actualVersion = await self._getCurrentVersion();\n self.dbV = actualVersion;\n return this._doOpenAndCreate(tables);\n }\n throw err;\n }\n }\n\n _doOpenAndCreate(tables) {\n let self = this;\n let tableNames = Object.keys(tables);\n let tableIndexes = Object.values(tables);\n\n return new Promise((resolve, reject) => {\n let req = self.indexDbApi.open(self.dbName, self.dbV);\n req.onerror = function (e) {\n reject(e.target.error);\n };\n req.onsuccess = function (e) {\n resolve(e.target.result);\n };\n req.onupgradeneeded = function (e) {\n let db = e.target.result;\n let store;\n for (let i = 0; i < tableNames.length; i++) {\n if (!db.objectStoreNames.contains(tableNames[i])) {\n store = db.createObjectStore(tableNames[i], {keyPath: self.keyPath, autoIncrement: false});\n console.log('TABLE ' + tableNames[i] + ' created Success');\n for (let j = 0; j < tableIndexes[i].length; j++) {\n store.createIndex(tableIndexes[i][j][0], tableIndexes[i][j][0], {unique: tableIndexes[i][j][1]});\n }\n }\n }\n };\n });\n }\n\n /**\n * 打开数据库连接(带缓存)\n */\n async openDB() {\n let self = this;\n\n // 如果已有连接且未关闭,直接返回\n if (this._db && !this._db.closed) {\n return this._db;\n }\n\n // 确保版本号已设置\n await this._ensureDbVersion();\n\n try {\n return await this._doOpenDB();\n } catch (err) {\n // 如果版本号过低,获取当前版本并重试\n if (err.name === 'VersionError') {\n console.log(`VersionError in openDB: requested ${self.dbV}, getting actual version...`);\n const actualVersion = await self._getCurrentVersion();\n self.dbV = actualVersion;\n return this._doOpenDB();\n }\n throw err;\n }\n }\n\n _doOpenDB() {\n let self = this;\n return new Promise((resolve, reject) => {\n let req = self.indexDbApi.open(self.dbName, self.dbV);\n req.onerror = function (e) {\n reject(e.target.error);\n };\n req.onsuccess = function (e) {\n let db = e.target.result;\n // 监听连接意外关闭事件\n db.onclose = function() {\n self._db = null;\n };\n // 监听版本变化事件(其他标签页升级了数据库)\n db.onversionchange = function(event) {\n console.log('Database version changed, closing connection...');\n db.close();\n self._db = null;\n };\n self._db = db;\n resolve(db);\n };\n });\n }\n\n /**\n * 统一的 withTable 包装器 - 打开数据库执行操作\n */\n async withTable(tableName, callback) {\n let db = await this.openDB();\n return await callback(db);\n }\n\n async delData(tableName, keys) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_delete = promisifyStore(store, 'delete');\n\n for (let i = 0; i < keys.length; i++) {\n await store_delete(keys[i]);\n }\n });\n }\n\n async readData(tableName, keys) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName);\n let store = tx.objectStore(tableName);\n let store_get = promisifyStore(store, 'get');\n\n let result = [];\n for (let i = 0; i < keys.length; i++) {\n let d = await store_get(keys[i]);\n result.push(d.result);\n }\n return result;\n });\n }\n\n async saveOrUpdate(tableName, dataList) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_put = promisifyStore(store, 'put');\n for (let i = 0; i < dataList.length; i++) {\n await store_put(dataList[i]);\n }\n });\n }\n\n async addData(tableName, dataList) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_add = promisifyStore(store, 'add');\n for (let i = 0; i < dataList.length; i++) {\n await store_add(dataList[i]);\n }\n });\n }\n\n async updateData(tableName, dataList) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_put = promisifyStore(store, 'put');\n for (let i = 0; i < dataList.length; i++) {\n await store_put(dataList[i]);\n }\n });\n }\n\n async clearTable(tableName) {\n return this.withTable(tableName, async (db) => {\n let tx = db.transaction(tableName, 'readwrite');\n let store = tx.objectStore(tableName);\n const store_clear = promisifyStore(store, 'clear');\n await store_clear();\n });\n }\n\n /**\n * 全局缓存:{ 'dbName': TinyIndexDB }\n */\n static _cache = new Map();\n\n /**\n * 获取或创建 TinyIndexDB 实例(全局缓存)\n * @param {string} dbName - 数据库名\n * @returns {TinyIndexDB}\n */\n static getInstance(dbName) {\n if (TinyIndexDB._cache.has(dbName)) {\n return TinyIndexDB._cache.get(dbName);\n }\n const instance = new TinyIndexDB(dbName, 'name');\n TinyIndexDB._cache.set(dbName, instance);\n return instance;\n }\n\n}\n\nexport { TinyIndexDB };\n","import { TinyIndexDB } from './TinyIndexDB.js';\n\n/**\n * IndexedDbStorage - 单表存储封装\n * 自动初始化表,提供 CRUD 操作\n */\nclass IndexedDbStorage {\n\n constructor(dbName, tableName) {\n this.dbName = dbName;\n this.tableName = tableName;\n this.isInited = false;\n\n // 使用全局缓存获取共享的 TinyIndexDB 实例,确保同一个数据库共享版本管理\n this.tinyIndexDB = TinyIndexDB.getInstance(dbName);\n }\n\n /**\n * 初始化表(如果不存在会自动创建)\n */\n async init() {\n if (this.isInited) {\n return;\n }\n\n // 初始化表配置\n const tablesConfig = {\n [this.tableName]: [\n ['name', true],\n ['data', false]\n ]\n };\n\n await this.tinyIndexDB.initDB(tablesConfig);\n this.isInited = true;\n }\n\n async saveItem(name, data) {\n await this.init();\n await this.tinyIndexDB.saveOrUpdate(this.tableName, [{name: name, data: data}]);\n }\n\n async addItem(name, data) {\n await this.init();\n await this.tinyIndexDB.addData(this.tableName, [{name: name, data: data}]);\n }\n\n async updateItem(name, data) {\n await this.init();\n await this.tinyIndexDB.updateData(this.tableName, [{name: name, data: data}]);\n }\n\n async deleteItem(name) {\n await this.init();\n await this.tinyIndexDB.delData(this.tableName, [name]);\n }\n\n async clear() {\n await this.init();\n await this.tinyIndexDB.clearTable(this.tableName);\n }\n\n async getItem(name) {\n await this.init();\n try {\n let values = await this.tinyIndexDB.readData(this.tableName, [name]);\n let value0 = values[0];\n return value0 && value0.data;\n } catch (e) {\n console.log(e);\n return null;\n }\n }\n}\n\nexport { IndexedDbStorage };\n","import { TinyIndexDB } from './TinyIndexDB.js';\nimport { IndexedDbStorage } from './IndexedDbStorage.js';\n\n/**\n * StorageFactory - IndexedDB 存储工厂\n * 全局缓存 storage 实例,以 dbName + tableName 为维度\n */\nclass StorageFactory {\n\n // 全局缓存:{ 'dbName:tableName': IndexedDbStorage }\n static _storageCache = new Map();\n\n /**\n * 获取或创建 storage 实例\n * @param {string} dbName - 数据库名\n * @param {string} tableName - 表名\n * @returns {IndexedDbStorage}\n */\n static getStorage(dbName, tableName) {\n const cacheKey = `${dbName}:${tableName}`;\n\n // 从缓存获取\n if (this._storageCache.has(cacheKey)) {\n return this._storageCache.get(cacheKey);\n }\n\n // 创建新实例\n const storage = new IndexedDbStorage(dbName, tableName);\n this._storageCache.set(cacheKey, storage);\n\n return storage;\n }\n\n /**\n * 获取或创建 TinyIndexDB 实例\n * @param {string} dbName - 数据库名\n * @returns {TinyIndexDB}\n */\n static getTinyIndexDB(dbName) {\n // 使用 TinyIndexDB 的全局缓存\n return TinyIndexDB.getInstance(dbName);\n }\n\n /**\n * 清除指定缓存\n * @param {string} dbName - 数据库名\n * @param {string} tableName - 表名(可选,不传则清除整个数据库缓存)\n */\n static clearCache(dbName, tableName) {\n if (tableName) {\n this._storageCache.delete(`${dbName}:${tableName}`);\n } else {\n // 清除该数据库的所有表缓存\n for (const key of this._storageCache.keys()) {\n if (key.startsWith(`${dbName}:`)) {\n this._storageCache.delete(key);\n }\n }\n // 清除 TinyIndexDB 的全局缓存\n TinyIndexDB._cache.delete(dbName);\n }\n }\n\n /**\n * 清除所有缓存\n */\n static clearAllCache() {\n this._storageCache.clear();\n TinyIndexDB._cache.clear();\n }\n\n}\n\nexport { StorageFactory };\n","import { StorageFactory } from './StorageFactory.js';\n\n/**\n * CachedStorage - 带内存缓存的单表存储封装\n * 读取优先从内存获取,写入同时更新内存和 IndexedDB\n */\nclass CachedStorage {\n\n constructor(dbName, tableName) {\n this.dbName = dbName || 'linushp_default';\n this.tableName = tableName || 'linushp_t';\n // 内存缓存\n this._memoryCache = new Map();\n // 使用工厂获取缓存的 storage 实例\n this._storage = null;\n }\n\n // 延迟获取 storage 实例\n _getStorage() {\n if (!this._storage) {\n this._storage = StorageFactory.getStorage(this.dbName, this.tableName);\n }\n return this._storage;\n }\n\n async saveItem(name, data) {\n // 先更新内存\n this._memoryCache.set(name, data);\n // 再持久化到 IndexedDB\n return this._getStorage().saveItem(name, data);\n }\n\n async getItem(name) {\n // 先查内存缓存\n if (this._memoryCache.has(name)) {\n return this._memoryCache.get(name);\n }\n // 内存没有,查 IndexedDB\n const data = await this._getStorage().getItem(name);\n // 写入内存缓存\n if (data !== null && data !== undefined) {\n this._memoryCache.set(name, data);\n }\n return data;\n }\n\n async deleteItem(name) {\n // 先删除内存\n this._memoryCache.delete(name);\n // 再删除 IndexedDB\n return this._getStorage().deleteItem(name);\n }\n\n async clear() {\n // 清空内存\n this._memoryCache.clear();\n // 清空 IndexedDB\n return this._getStorage().clear();\n }\n\n /**\n * 获取内存缓存统计\n */\n getMemoryCacheSize() {\n return this._memoryCache.size;\n }\n\n /**\n * 清空内存缓存(不影响 IndexedDB)\n */\n clearMemoryCache() {\n this._memoryCache.clear();\n }\n\n}\n\nexport { CachedStorage };\n","import { CachedStorage } from './CachedStorage.js';\n\n/**\n * CachedFetch - 基于 IndexedDB 的缓存 Fetch\n * 将网络请求结果缓存到 IndexedDB 中\n */\nclass CachedFetch {\n\n constructor(dbName, tableName) {\n this.cachedStorage = new CachedStorage(dbName, tableName);\n }\n\n fetchJson(url, converter) {\n return this.fetch(url, 'json', converter);\n }\n\n fetchArrayBuffer(url, converter) {\n return this.fetch(url, 'arrayBuffer', converter);\n }\n\n fetchBlob(url, converter) {\n return this.fetch(url, 'blob', converter);\n }\n\n fetchText(url, converter) {\n return this.fetch(url, 'text', converter);\n }\n\n async fetch(url, responseType, converter) {\n let cached = await this.cachedStorage.getItem(url);\n if (!cached) {\n let fetchd = await fetch(url);\n if (responseType === 'arrayBuffer') {\n cached = await fetchd.arrayBuffer();\n } else if (responseType === 'json') {\n cached = await fetchd.json();\n } else if (responseType === 'blob') {\n cached = await fetchd.blob();\n } else if (responseType === 'text') {\n cached = await fetchd.text();\n } else {\n cached = null;\n console.error(\"responseType error\");\n }\n\n if (converter) {\n cached = await converter(cached);\n }\n\n await this.cachedStorage.saveItem(url, cached);\n }\n return cached;\n }\n}\n\nexport { CachedFetch };\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","promisifyStore","store","method","args","Promise","resolve","reject","func","bind","req","onsuccess","onerror","e","TinyIndexDB","constructor","dbName","keyPath","indexDbApi","window","indexedDB","webkitIndexedDB","msIndexedDB","mozIndexedDB","this","dbV","tablesConfig","_db","_ensureDbVersion","undefined","_getCurrentVersion","initDB","tables","tableNames","keys","db","_openDBInternal","missingTables","filter","name","objectStoreNames","contains","length","console","log","join","close","_openDBAndCreateTables","err","actualVersion","self","_doOpenRaw","open","target","error","result","onblocked","warn","version","_doOpenAndCreate","tableIndexes","values","onupgradeneeded","i","createObjectStore","autoIncrement","j","createIndex","unique","openDB","closed","_doOpenDB","onclose","onversionchange","event","withTable","tableName","callback","delData","async","store_delete","transaction","objectStore","readData","store_get","d","push","saveOrUpdate","dataList","store_put","addData","store_add","updateData","clearTable","store_clear","static","Map","getInstance","_cache","has","instance","set","IndexedDbStorage","isInited","tinyIndexDB","init","saveItem","data","addItem","updateItem","deleteItem","clear","getItem","value0","StorageFactory","getStorage","cacheKey","_storageCache","storage","getTinyIndexDB","clearCache","delete","startsWith","clearAllCache","CachedStorage","_memoryCache","_storage","_getStorage","getMemoryCacheSize","size","clearMemoryCache","CachedFetch","cachedStorage","fetchJson","url","converter","fetch","fetchArrayBuffer","fetchBlob","fetchText","responseType","cached","fetchd","arrayBuffer","json","blob","text"],"sourceRoot":""}
|
package/index.d.ts
CHANGED
|
@@ -17,11 +17,11 @@ export interface TableCallback<T> {
|
|
|
17
17
|
|
|
18
18
|
export declare class TinyIndexDB {
|
|
19
19
|
dbName: string;
|
|
20
|
-
dbV: number
|
|
20
|
+
dbV: number;
|
|
21
21
|
keyPath: string;
|
|
22
22
|
tablesConfig: TableConfig | null;
|
|
23
23
|
|
|
24
|
-
constructor(dbName: string, keyPath: string
|
|
24
|
+
constructor(dbName: string, keyPath: string);
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* 初始化数据库,自动创建缺失的表
|
|
@@ -68,44 +68,24 @@ export declare class TinyIndexDB {
|
|
|
68
68
|
* 清空表
|
|
69
69
|
*/
|
|
70
70
|
clearTable(tableName: string): Promise<void>;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ============================================
|
|
74
|
-
// IndexDBStorageFactory - 工厂模式
|
|
75
|
-
// ============================================
|
|
76
71
|
|
|
77
|
-
export declare class IndexDBStorageFactory {
|
|
78
72
|
/**
|
|
79
|
-
*
|
|
80
|
-
* @param dbName - 数据库名
|
|
81
|
-
* @param tableName - 表名
|
|
73
|
+
* 全局缓存:{ 'dbName': TinyIndexDB }
|
|
82
74
|
*/
|
|
83
|
-
static
|
|
75
|
+
static _cache: Map<string, TinyIndexDB>;
|
|
84
76
|
|
|
85
77
|
/**
|
|
86
78
|
* 获取或创建 TinyIndexDB 实例(全局缓存)
|
|
87
79
|
* @param dbName - 数据库名
|
|
88
80
|
*/
|
|
89
|
-
static
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* 清除指定缓存
|
|
93
|
-
* @param dbName - 数据库名
|
|
94
|
-
* @param tableName - 表名(可选,不传则清除整个数据库缓存)
|
|
95
|
-
*/
|
|
96
|
-
static clearCache(dbName: string, tableName?: string): void;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* 清除所有缓存
|
|
100
|
-
*/
|
|
101
|
-
static clearAllCache(): void;
|
|
81
|
+
static getInstance(dbName: string): TinyIndexDB;
|
|
102
82
|
}
|
|
103
83
|
|
|
104
84
|
// ============================================
|
|
105
|
-
//
|
|
85
|
+
// IndexedDbStorage - 单表存储封装
|
|
106
86
|
// ============================================
|
|
107
87
|
|
|
108
|
-
export declare class
|
|
88
|
+
export declare class IndexedDbStorage {
|
|
109
89
|
dbName: string;
|
|
110
90
|
tableName: string;
|
|
111
91
|
tinyIndexDB: TinyIndexDB;
|
|
@@ -149,46 +129,87 @@ export declare class IndexDBStorage {
|
|
|
149
129
|
}
|
|
150
130
|
|
|
151
131
|
// ============================================
|
|
152
|
-
//
|
|
132
|
+
// StorageFactory - 工厂模式
|
|
153
133
|
// ============================================
|
|
154
134
|
|
|
155
|
-
export declare class
|
|
135
|
+
export declare class StorageFactory {
|
|
136
|
+
/**
|
|
137
|
+
* 获取或创建 storage 实例(全局缓存)
|
|
138
|
+
* @param dbName - 数据库名
|
|
139
|
+
* @param tableName - 表名
|
|
140
|
+
*/
|
|
141
|
+
static getStorage(dbName: string, tableName: string): IndexedDbStorage;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* 获取或创建 TinyIndexDB 实例(全局缓存)
|
|
145
|
+
* @param dbName - 数据库名
|
|
146
|
+
*/
|
|
147
|
+
static getTinyIndexDB(dbName: string): TinyIndexDB;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 清除指定缓存
|
|
151
|
+
* @param dbName - 数据库名
|
|
152
|
+
* @param tableName - 表名(可选,不传则清除整个数据库缓存)
|
|
153
|
+
*/
|
|
154
|
+
static clearCache(dbName: string, tableName?: string): void;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 清除所有缓存
|
|
158
|
+
*/
|
|
159
|
+
static clearAllCache(): void;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ============================================
|
|
163
|
+
// CachedStorage - 带内存缓存的单表存储
|
|
164
|
+
// ============================================
|
|
165
|
+
|
|
166
|
+
export declare class CachedStorage {
|
|
156
167
|
dbName: string;
|
|
157
168
|
tableName: string;
|
|
158
169
|
|
|
159
170
|
constructor(dbName?: string, tableName?: string);
|
|
160
171
|
|
|
161
172
|
/**
|
|
162
|
-
*
|
|
173
|
+
* 保存条目(同时更新内存和 IndexedDB)
|
|
163
174
|
*/
|
|
164
175
|
saveItem(name: string, data: any): Promise<void>;
|
|
165
176
|
|
|
166
177
|
/**
|
|
167
|
-
*
|
|
178
|
+
* 获取条目(优先从内存读取)
|
|
168
179
|
*/
|
|
169
180
|
getItem(name: string): Promise<any>;
|
|
170
181
|
|
|
171
182
|
/**
|
|
172
|
-
*
|
|
183
|
+
* 删除条目(同时删除内存和 IndexedDB)
|
|
173
184
|
*/
|
|
174
185
|
deleteItem(name: string): Promise<void>;
|
|
175
186
|
|
|
176
187
|
/**
|
|
177
|
-
*
|
|
188
|
+
* 清空表(同时清空内存和 IndexedDB)
|
|
178
189
|
*/
|
|
179
190
|
clear(): Promise<void>;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* 清空内存缓存(不影响 IndexedDB)
|
|
194
|
+
*/
|
|
195
|
+
clearMemoryCache(): void;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* 获取内存缓存条目数
|
|
199
|
+
*/
|
|
200
|
+
getMemoryCacheSize(): number;
|
|
180
201
|
}
|
|
181
202
|
|
|
182
203
|
// ============================================
|
|
183
|
-
//
|
|
204
|
+
// CachedFetch - 缓存 Fetch
|
|
184
205
|
// ============================================
|
|
185
206
|
|
|
186
207
|
export type ResponseType = 'json' | 'text' | 'arrayBuffer' | 'blob';
|
|
187
208
|
|
|
188
209
|
export type Converter<T> = (data: any) => T | Promise<T>;
|
|
189
210
|
|
|
190
|
-
export declare class
|
|
191
|
-
|
|
211
|
+
export declare class CachedFetch {
|
|
212
|
+
cachedStorage: CachedStorage;
|
|
192
213
|
|
|
193
214
|
constructor(dbName: string, tableName: string);
|
|
194
215
|
|
|
@@ -233,4 +254,4 @@ export declare class IndexedDBCachedFetch {
|
|
|
233
254
|
// 默认导出
|
|
234
255
|
// ============================================
|
|
235
256
|
|
|
236
|
-
export default
|
|
257
|
+
export default CachedStorage;
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CachedStorage } from './CachedStorage.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* CachedFetch - 基于 IndexedDB 的缓存 Fetch
|
|
5
5
|
* 将网络请求结果缓存到 IndexedDB 中
|
|
6
6
|
*/
|
|
7
|
-
class
|
|
7
|
+
class CachedFetch {
|
|
8
8
|
|
|
9
9
|
constructor(dbName, tableName) {
|
|
10
|
-
this.
|
|
10
|
+
this.cachedStorage = new CachedStorage(dbName, tableName);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
fetchJson(url, converter) {
|
|
@@ -27,7 +27,7 @@ class IndexedDBCachedFetch {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
async fetch(url, responseType, converter) {
|
|
30
|
-
let cached = await this.
|
|
30
|
+
let cached = await this.cachedStorage.getItem(url);
|
|
31
31
|
if (!cached) {
|
|
32
32
|
let fetchd = await fetch(url);
|
|
33
33
|
if (responseType === 'arrayBuffer') {
|
|
@@ -47,10 +47,10 @@ class IndexedDBCachedFetch {
|
|
|
47
47
|
cached = await converter(cached);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
await this.
|
|
50
|
+
await this.cachedStorage.saveItem(url, cached);
|
|
51
51
|
}
|
|
52
52
|
return cached;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
export {
|
|
56
|
+
export { CachedFetch };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StorageFactory } from './StorageFactory.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* CachedStorage - 带内存缓存的单表存储封装
|
|
5
5
|
* 读取优先从内存获取,写入同时更新内存和 IndexedDB
|
|
6
6
|
*/
|
|
7
|
-
class
|
|
7
|
+
class CachedStorage {
|
|
8
8
|
|
|
9
9
|
constructor(dbName, tableName) {
|
|
10
10
|
this.dbName = dbName || 'linushp_default';
|
|
@@ -18,7 +18,7 @@ class SimpleIndexDBStorage {
|
|
|
18
18
|
// 延迟获取 storage 实例
|
|
19
19
|
_getStorage() {
|
|
20
20
|
if (!this._storage) {
|
|
21
|
-
this._storage =
|
|
21
|
+
this._storage = StorageFactory.getStorage(this.dbName, this.tableName);
|
|
22
22
|
}
|
|
23
23
|
return this._storage;
|
|
24
24
|
}
|
|
@@ -74,4 +74,4 @@ class SimpleIndexDBStorage {
|
|
|
74
74
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export {
|
|
77
|
+
export { CachedStorage };
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { TinyIndexDB } from './TinyIndexDB.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* IndexedDbStorage - 单表存储封装
|
|
5
5
|
* 自动初始化表,提供 CRUD 操作
|
|
6
6
|
*/
|
|
7
|
-
class
|
|
7
|
+
class IndexedDbStorage {
|
|
8
8
|
|
|
9
9
|
constructor(dbName, tableName) {
|
|
10
10
|
this.dbName = dbName;
|
|
11
11
|
this.tableName = tableName;
|
|
12
12
|
this.isInited = false;
|
|
13
13
|
|
|
14
|
-
//
|
|
15
|
-
this.tinyIndexDB =
|
|
14
|
+
// 使用全局缓存获取共享的 TinyIndexDB 实例,确保同一个数据库共享版本管理
|
|
15
|
+
this.tinyIndexDB = TinyIndexDB.getInstance(dbName);
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -73,4 +73,4 @@ class IndexDBStorage {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
export {
|
|
76
|
+
export { IndexedDbStorage };
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import { TinyIndexDB } from './TinyIndexDB.js';
|
|
2
|
-
import {
|
|
2
|
+
import { IndexedDbStorage } from './IndexedDbStorage.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* StorageFactory - IndexedDB 存储工厂
|
|
6
6
|
* 全局缓存 storage 实例,以 dbName + tableName 为维度
|
|
7
7
|
*/
|
|
8
|
-
class
|
|
8
|
+
class StorageFactory {
|
|
9
9
|
|
|
10
|
-
// 全局缓存:{ 'dbName:tableName':
|
|
10
|
+
// 全局缓存:{ 'dbName:tableName': IndexedDbStorage }
|
|
11
11
|
static _storageCache = new Map();
|
|
12
12
|
|
|
13
|
-
// 全局缓存:{ 'dbName': TinyIndexDB }
|
|
14
|
-
static _tinyIndexDBCache = new Map();
|
|
15
|
-
|
|
16
13
|
/**
|
|
17
14
|
* 获取或创建 storage 实例
|
|
18
15
|
* @param {string} dbName - 数据库名
|
|
19
16
|
* @param {string} tableName - 表名
|
|
20
|
-
* @returns {
|
|
17
|
+
* @returns {IndexedDbStorage}
|
|
21
18
|
*/
|
|
22
19
|
static getStorage(dbName, tableName) {
|
|
23
20
|
const cacheKey = `${dbName}:${tableName}`;
|
|
@@ -28,7 +25,7 @@ class IndexDBStorageFactory {
|
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
// 创建新实例
|
|
31
|
-
const storage = new
|
|
28
|
+
const storage = new IndexedDbStorage(dbName, tableName);
|
|
32
29
|
this._storageCache.set(cacheKey, storage);
|
|
33
30
|
|
|
34
31
|
return storage;
|
|
@@ -40,14 +37,8 @@ class IndexDBStorageFactory {
|
|
|
40
37
|
* @returns {TinyIndexDB}
|
|
41
38
|
*/
|
|
42
39
|
static getTinyIndexDB(dbName) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const tinyIndexDB = new TinyIndexDB(dbName, 'name');
|
|
48
|
-
this._tinyIndexDBCache.set(dbName, tinyIndexDB);
|
|
49
|
-
|
|
50
|
-
return tinyIndexDB;
|
|
40
|
+
// 使用 TinyIndexDB 的全局缓存
|
|
41
|
+
return TinyIndexDB.getInstance(dbName);
|
|
51
42
|
}
|
|
52
43
|
|
|
53
44
|
/**
|
|
@@ -65,7 +56,8 @@ class IndexDBStorageFactory {
|
|
|
65
56
|
this._storageCache.delete(key);
|
|
66
57
|
}
|
|
67
58
|
}
|
|
68
|
-
|
|
59
|
+
// 清除 TinyIndexDB 的全局缓存
|
|
60
|
+
TinyIndexDB._cache.delete(dbName);
|
|
69
61
|
}
|
|
70
62
|
}
|
|
71
63
|
|
|
@@ -74,9 +66,9 @@ class IndexDBStorageFactory {
|
|
|
74
66
|
*/
|
|
75
67
|
static clearAllCache() {
|
|
76
68
|
this._storageCache.clear();
|
|
77
|
-
|
|
69
|
+
TinyIndexDB._cache.clear();
|
|
78
70
|
}
|
|
79
71
|
|
|
80
72
|
}
|
|
81
73
|
|
|
82
|
-
export {
|
|
74
|
+
export { StorageFactory };
|
package/src/TinyIndexDB.js
CHANGED
|
@@ -312,6 +312,25 @@ class TinyIndexDB {
|
|
|
312
312
|
});
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
+
/**
|
|
316
|
+
* 全局缓存:{ 'dbName': TinyIndexDB }
|
|
317
|
+
*/
|
|
318
|
+
static _cache = new Map();
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* 获取或创建 TinyIndexDB 实例(全局缓存)
|
|
322
|
+
* @param {string} dbName - 数据库名
|
|
323
|
+
* @returns {TinyIndexDB}
|
|
324
|
+
*/
|
|
325
|
+
static getInstance(dbName) {
|
|
326
|
+
if (TinyIndexDB._cache.has(dbName)) {
|
|
327
|
+
return TinyIndexDB._cache.get(dbName);
|
|
328
|
+
}
|
|
329
|
+
const instance = new TinyIndexDB(dbName, 'name');
|
|
330
|
+
TinyIndexDB._cache.set(dbName, instance);
|
|
331
|
+
return instance;
|
|
332
|
+
}
|
|
333
|
+
|
|
315
334
|
}
|
|
316
335
|
|
|
317
336
|
export { TinyIndexDB };
|
package/src/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { TinyIndexDB } from './TinyIndexDB.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { IndexedDbStorage } from './IndexedDbStorage.js';
|
|
3
|
+
import { StorageFactory } from './StorageFactory.js';
|
|
4
|
+
import { CachedStorage } from './CachedStorage.js';
|
|
5
|
+
import { CachedFetch } from './CachedFetch.js';
|
|
6
6
|
|
|
7
7
|
export {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
CachedStorage as default,
|
|
9
|
+
CachedStorage,
|
|
10
|
+
CachedFetch,
|
|
11
|
+
IndexedDbStorage,
|
|
12
|
+
StorageFactory,
|
|
13
13
|
TinyIndexDB
|
|
14
14
|
};
|