diff --git a/demo.html b/demo.html index 867b790..af950ba 100644 --- a/demo.html +++ b/demo.html @@ -8,7 +8,23 @@ diff --git a/package.json b/package.json index 55d085d..097d044 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "express": "^4.18.2", "express-ws": "^5.0.2", - "idb": "^7.1.1", + "idb-keyval": "^6.2.1", "node-turn": "^0.0.6" } } diff --git a/src/store.js b/src/store.js index 4b7d06d..48656e4 100644 --- a/src/store.js +++ b/src/store.js @@ -1,53 +1,70 @@ -// 使用封装为支持异步的 IndexedDB -import { openDB, deleteDB, wrap, unwrap } from 'idb' -const storenames = ['music', 'chat', 'user'] -const database = await openDB('database', 1, { - upgrade(db) { - storenames.forEach(name => db.createObjectStore(name, { keyPath: 'id' })) - console.log('store created:', storenames) - } -}) +import { get, set, del, update, createStore } from 'idb-keyval' export class Store { constructor(data) { this.name = data.name - this.info = data.info + this.store = data.store + + // 检查过期的数据 + this.checkExpired() } - create(data) { + async checkExpired() { + const keys = await this.store.keys() + const now = Date.now() + for (const key of keys) { + const item = await get(key, this.store) + if (item && item.expiresAt && item.expiresAt < now) { + await this.store.delete(key) + } + } + } + + async create(data) { const id = window.crypto.randomUUID() - return { id, ...data } + const createdAt = Date.now() + const updatedAt = createdAt + const lastUsedAt = createdAt + const item = { id, createdAt, updatedAt, lastUsedAt, ...data } + await set(id, item, this.store) + return item } - delete(id) {} + async delete(id) { + return await this.store.delete(id) + } - query() {} + async query(query) { + } + + async get(id) { + return await get(id, this.store) + } + + async update(id, data) { + const item = await this.get(id) + if (!item) { + return null + } + const updatedAt = Date.now() + const lastUsedAt = updatedAt + const item2 = { ...item, updatedAt, lastUsedAt, ...data } + await set(id, item2, this.store) + return item2 + } } export const musicStore = new Store({ name: '音乐(资源类型)', - info: '音乐(类型说明)', - 存储时间: 1000 * 60 * 60 * 24 * 7, // 7天不使用的资源将被删除 - list: [{ - id: 'uuid', - name: 'Dear big sisterremix ver.mp3', - arrayBuffer: 'ArrayBuffer', - createdAt: 1580000000000, // 创建时间 - updatedAt: 1580000000000, // 更新时间 - lastUsedAt: 1580000000000, // 最后使用时间 - }] + store: createStore('db-music', 'store-music') }) export const chatStore = new Store({ name: '聊天(资源类型)', - info: '聊天(类型说明)', - 存储时间: 1000 * 60 * 60 * 24 * 7, // 7天不使用的资源将被删除 - list: [{ - id: 'uuid', - name: 'Dear big sisterremix ver.mp3', - arrayBuffer: 'ArrayBuffer', - createdAt: 1580000000000, // 创建时间 - updatedAt: 1580000000000, // 更新时间 - lastUsedAt: 1580000000000, // 最后使用时间 - }] + store: createStore('db-chat', 'store-chat') +}) + +export const userStore = new Store({ + name: '用户(资源类型)', + store: createStore('db-user', 'store-user') })