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 CHANGED
@@ -1,212 +1,213 @@
1
1
  # indexeddb-keyvalue
2
2
 
3
- 轻量级 IndexedDB 封装库,提供表管理、CRUD 操作和 HTTP 请求缓存功能。
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
- - **双层缓存架构** - **内存 + IndexedDB**,重复读取直接从内存返回,性能提升 100-500
8
- - 自动版本管理 - 无需手动处理数据库升级
9
- - 自动表创建 - 使用不存在的表时自动创建
10
- - 工厂模式 - 全局缓存实例,避免重复创建连接
11
- - Promise API - 全异步操作,支持 async/await
12
- - HTTP 缓存 - 自动缓存 fetch 请求结果
13
- - TypeScript 支持 - 完整的类型定义文件
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
- | 操作 | IndexedDB | indexeddb-keyvalue (内存缓存) | 性能提升 |
19
- |------|-------------|------------------------------|---------|
20
- | 首次读取 | ~1-5ms | ~1-5ms | 持平 |
21
- | 重复读取 | ~1-5ms | **~0.01ms** | **100-500 倍** |
22
- | 写入 | ~2-8ms | ~2-8ms (内存+持久化) | 可靠持久化 |
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
- > 基于 Chrome/Edge 浏览器测试,实际性能因数据大小和设备而异。SimpleIndexDBStorage 会自动将读取过的数据缓存到内存,后续访问几乎无延迟。
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
- ### 方式一:SimpleIndexDBStorage(推荐)
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 { SimpleIndexDBStorage } from 'indexeddb-keyvalue';
40
+ import { CachedStorage } from 'indexeddb-keyvalue';
40
41
 
41
- // 创建存储实例(自带内存缓存 + IndexedDB 双层存储)
42
- const storage = new SimpleIndexDBStorage('myDB', 'myTable');
42
+ // Create storage instance (with dual-layer Memory + IndexedDB caching)
43
+ const storage = new CachedStorage('myDB', 'myTable');
43
44
 
44
- // 保存数据(同时写入内存和 IndexedDB
45
- await storage.saveItem('user1', { name: '张三', age: 25 });
45
+ // Save data (writes to both memory and IndexedDB)
46
+ await storage.saveItem('user1', { name: 'John', age: 25 });
46
47
 
47
- // 第一次读取 - IndexedDB 加载并缓存到内存
48
+ // First read - loads from IndexedDB and caches to memory
48
49
  const user1 = await storage.getItem('user1');
49
50
 
50
- // 第二次读取 - 直接从内存返回,性能提升 10 倍以上!
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('内存缓存条目数:', storage.getMemoryCacheSize());
54
+ // Check memory cache status
55
+ console.log('Memory cache entries:', storage.getMemoryCacheSize());
55
56
 
56
- // 删除数据(同时删除内存和 IndexedDB
57
+ // Delete data (removes from both memory and IndexedDB)
57
58
  await storage.deleteItem('user1');
58
59
 
59
- // 清空表(同时清空内存和 IndexedDB
60
+ // Clear table (clears both memory and IndexedDB)
60
61
  await storage.clear();
61
62
 
62
- // 仅清空内存缓存(保留 IndexedDB 数据)
63
+ // Clear only memory cache (keeps IndexedDB data)
63
64
  storage.clearMemoryCache();
64
65
  ```
65
66
 
66
- **性能优势:**
67
- - 首次读取:从 IndexedDB 加载 1-5ms
68
- - 后续读取:直接从内存返回**约 0.01ms,快 100-500 倍**
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
- ### 方式二:IndexedDBCachedFetchHTTP 请求缓存)
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 IndexedDBCachedFetch('cacheDB', 'apiCache'); // 版本号不传则自动获取
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
- // 后续请求直接从 IndexedDB 读取,不访问网络
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 { IndexDBStorageFactory } from 'indexeddb-keyvalue';
102
+ import { StorageFactory } from 'indexeddb-keyvalue';
102
103
 
103
- // 获取存储实例(全局缓存,版本号不传则自动获取)
104
- const userStorage = IndexDBStorageFactory.getStorage('appDB', 'users');
105
- const orderStorage = IndexDBStorageFactory.getStorage('appDB', 'orders');
106
- const productStorage = IndexDBStorageFactory.getStorage('appDB', 'products');
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
- // 使用方式与 SimpleIndexDBStorage 相同
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: '商品A' });
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
- IndexDBStorageFactory.clearCache('appDB', 'users'); // 清除指定表
120
- IndexDBStorageFactory.clearCache('appDB'); // 清除整个数据库
121
- IndexDBStorageFactory.clearAllCache(); // 清除所有缓存
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
- ### 方式四:底层 APITinyIndexDB
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: '张三', email: 'zhangsan@example.com' },
143
- { id: 'user2', name: '李四', email: 'lisi@example.com' }
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
- ### SimpleIndexDBStorage
166
+ ### CachedStorage
166
167
 
167
- | 方法 | 参数 | 返回值 | 说明 |
168
- |------|------|--------|------|
169
- | `saveItem(name, data)` | `name: string`, `data: any` | `Promise<void>` | 保存或更新数据(内存+IndexedDB |
170
- | `getItem(name)` | `name: string` | `Promise<any>` | 获取数据(优先从内存读取) |
171
- | `deleteItem(name)` | `name: string` | `Promise<void>` | 删除数据(内存+IndexedDB |
172
- | `clear()` | - | `Promise<void>` | 清空表(内存+IndexedDB |
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
- ### IndexedDBCachedFetch
177
+ ### CachedFetch
177
178
 
178
- | 方法 | 参数 | 返回值 | 说明 |
179
- |------|------|--------|------|
180
- | `fetchJson(url, converter?)` | `url: string`, `converter?: (data) => any` | `Promise<T>` | 获取 JSON 数据 |
181
- | `fetchText(url, converter?)` | `url: string`, `converter?: (data) => string` | `Promise<string>` | 获取文本数据 |
182
- | `fetchBlob(url, converter?)` | `url: string`, `converter?: (data) => Blob` | `Promise<Blob>` | 获取 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
- ### IndexDBStorageFactory
186
+ ### StorageFactory
186
187
 
187
- | 方法 | 参数 | 返回值 | 说明 |
188
- |------|------|--------|------|
189
- | `getStorage(dbName, tableName)` | `dbName: string`, `tableName: string` | `IndexDBStorage` | 获取/创建存储实例 |
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 i=e[t];i=i.bind(e);let s=i(...a);s.onsuccess=function(){n(s)},s.onerror=function(e){r(e)}})}}e.r(t),e.d(t,{IndexDBStorage:()=>r,IndexDBStorageFactory:()=>i,IndexedDBCachedFetch:()=>o,SimpleIndexDBStorage:()=>s,TinyIndexDB:()=>n,default:()=>s});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 i=t.indexDbApi.open(t.dbName,t.dbV);i.onerror=function(e){r(e.target.error)},i.onsuccess=function(t){e(t.target.result)},i.onupgradeneeded=function(e){let r,i=e.target.result;for(let e=0;e<a.length;e++)if(!i.objectStoreNames.contains(a[e])){r=i.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"),i=[];for(let e=0;e<t.length;e++){let a=await r(t[e]);i.push(a.result)}return i})}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()})}}class r{constructor(e,t){this.dbName=e,this.tableName=t,this.isInited=!1,this.tinyIndexDB=new n(e,"name")}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 i{static _storageCache=new Map;static _tinyIndexDBCache=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){if(this._tinyIndexDBCache.has(e))return this._tinyIndexDBCache.get(e);const t=new n(e,"name");return this._tinyIndexDBCache.set(e,t),t}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);this._tinyIndexDBCache.delete(e)}}static clearAllCache(){this._storageCache.clear(),this._tinyIndexDBCache.clear()}}class s{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=i.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.indexDbStorage=new s(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.indexDbStorage.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.indexDbStorage.saveItem(e,n)}return n}}module.exports=t})();
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 | undefined;
20
+ dbV: number;
21
21
  keyPath: string;
22
22
  tablesConfig: TableConfig | null;
23
23
 
24
- constructor(dbName: string, keyPath: string, dbV?: number);
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
- * 获取或创建 storage 实例(全局缓存)
80
- * @param dbName - 数据库名
81
- * @param tableName - 表名
73
+ * 全局缓存:{ 'dbName': TinyIndexDB }
82
74
  */
83
- static getStorage(dbName: string, tableName: string): IndexDBStorage;
75
+ static _cache: Map<string, TinyIndexDB>;
84
76
 
85
77
  /**
86
78
  * 获取或创建 TinyIndexDB 实例(全局缓存)
87
79
  * @param dbName - 数据库名
88
80
  */
89
- static getTinyIndexDB(dbName: string): TinyIndexDB;
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
- // IndexDBStorage - 单表存储封装
85
+ // IndexedDbStorage - 单表存储封装
106
86
  // ============================================
107
87
 
108
- export declare class IndexDBStorage {
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
- // SimpleIndexDBStorage - 简化版单表存储
132
+ // StorageFactory - 工厂模式
153
133
  // ============================================
154
134
 
155
- export declare class SimpleIndexDBStorage {
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
- // IndexedDBCachedFetch - 缓存 Fetch
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 IndexedDBCachedFetch {
191
- indexDbStorage: SimpleIndexDBStorage;
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 SimpleIndexDBStorage;
257
+ export default CachedStorage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "indexeddb-keyvalue",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Lightweight IndexedDB wrapper with table management, CRUD operations, and HTTP request caching",
5
5
  "main": "dist/index.js",
6
6
  "types": "index.d.ts",
@@ -1,13 +1,13 @@
1
- import { SimpleIndexDBStorage } from './SimpleIndexDBStorage.js';
1
+ import { CachedStorage } from './CachedStorage.js';
2
2
 
3
3
  /**
4
- * IndexedDBCachedFetch - 基于 IndexedDB 的缓存 Fetch
4
+ * CachedFetch - 基于 IndexedDB 的缓存 Fetch
5
5
  * 将网络请求结果缓存到 IndexedDB 中
6
6
  */
7
- class IndexedDBCachedFetch {
7
+ class CachedFetch {
8
8
 
9
9
  constructor(dbName, tableName) {
10
- this.indexDbStorage = new SimpleIndexDBStorage(dbName, tableName);
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.indexDbStorage.getItem(url);
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.indexDbStorage.saveItem(url, cached);
50
+ await this.cachedStorage.saveItem(url, cached);
51
51
  }
52
52
  return cached;
53
53
  }
54
54
  }
55
55
 
56
- export { IndexedDBCachedFetch };
56
+ export { CachedFetch };
@@ -1,10 +1,10 @@
1
- import { IndexDBStorageFactory } from './IndexDBStorageFactory.js';
1
+ import { StorageFactory } from './StorageFactory.js';
2
2
 
3
3
  /**
4
- * SimpleIndexDBStorage - 带内存缓存的单表存储封装
4
+ * CachedStorage - 带内存缓存的单表存储封装
5
5
  * 读取优先从内存获取,写入同时更新内存和 IndexedDB
6
6
  */
7
- class SimpleIndexDBStorage {
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 = IndexDBStorageFactory.getStorage(this.dbName, this.tableName);
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 { SimpleIndexDBStorage };
77
+ export { CachedStorage };
@@ -1,18 +1,18 @@
1
1
  import { TinyIndexDB } from './TinyIndexDB.js';
2
2
 
3
3
  /**
4
- * IndexDBStorage - 单表存储封装
4
+ * IndexedDbStorage - 单表存储封装
5
5
  * 自动初始化表,提供 CRUD 操作
6
6
  */
7
- class IndexDBStorage {
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
- // 直接使用 TinyIndexDB,版本号自动获取
15
- this.tinyIndexDB = new TinyIndexDB(dbName, 'name');
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 { IndexDBStorage };
76
+ export { IndexedDbStorage };
@@ -1,23 +1,20 @@
1
1
  import { TinyIndexDB } from './TinyIndexDB.js';
2
- import { IndexDBStorage } from './IndexDBStorage.js';
2
+ import { IndexedDbStorage } from './IndexedDbStorage.js';
3
3
 
4
4
  /**
5
- * IndexDBStorageFactory - IndexedDB 存储工厂
5
+ * StorageFactory - IndexedDB 存储工厂
6
6
  * 全局缓存 storage 实例,以 dbName + tableName 为维度
7
7
  */
8
- class IndexDBStorageFactory {
8
+ class StorageFactory {
9
9
 
10
- // 全局缓存:{ 'dbName:tableName': IndexDBStorage }
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 {IndexDBStorage}
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 IndexDBStorage(dbName, tableName);
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
- if (this._tinyIndexDBCache.has(dbName)) {
44
- return this._tinyIndexDBCache.get(dbName);
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
- this._tinyIndexDBCache.delete(dbName);
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
- this._tinyIndexDBCache.clear();
69
+ TinyIndexDB._cache.clear();
78
70
  }
79
71
 
80
72
  }
81
73
 
82
- export { IndexDBStorageFactory };
74
+ export { StorageFactory };
@@ -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 { IndexDBStorage } from './IndexDBStorage.js';
3
- import { IndexDBStorageFactory } from './IndexDBStorageFactory.js';
4
- import { SimpleIndexDBStorage } from './SimpleIndexDBStorage.js';
5
- import { IndexedDBCachedFetch } from './IndexedDBCachedFetch.js';
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
- SimpleIndexDBStorage as default,
9
- IndexedDBCachedFetch,
10
- SimpleIndexDBStorage,
11
- IndexDBStorage,
12
- IndexDBStorageFactory,
8
+ CachedStorage as default,
9
+ CachedStorage,
10
+ CachedFetch,
11
+ IndexedDbStorage,
12
+ StorageFactory,
13
13
  TinyIndexDB
14
14
  };