使用 idb-keyval

This commit is contained in:
2023-10-21 02:26:42 +08:00
parent 6f267109a4
commit 5c00514610
3 changed files with 69 additions and 36 deletions

View File

@ -8,7 +8,23 @@
</head> </head>
<body> <body>
<script type="module"> <script type="module">
import './src/store.js' import { musicStore, chatStore } from './src/store.js'
console.log(musicStore.name)
console.log(chatStore.name)
// 检查过期的消息自动销毁
// 查询消息列表
const element = document.createElement('div')
element.innerHTML = `
<h1>DEMO</h1>
<h2>音乐</h2>
<div id="music">${musicStore.name}</div>
<h2>聊天</h2>
<div id="chat">${chatStore.name}</div>
`
document.body.appendChild(element)
</script> </script>
</body> </body>
</html> </html>

View File

@ -22,7 +22,7 @@
"dependencies": { "dependencies": {
"express": "^4.18.2", "express": "^4.18.2",
"express-ws": "^5.0.2", "express-ws": "^5.0.2",
"idb": "^7.1.1", "idb-keyval": "^6.2.1",
"node-turn": "^0.0.6" "node-turn": "^0.0.6"
} }
} }

View File

@ -1,53 +1,70 @@
// 使用封装为支持异步的 IndexedDB import { get, set, del, update, createStore } from 'idb-keyval'
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)
}
})
export class Store { export class Store {
constructor(data) { constructor(data) {
this.name = data.name 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() 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({ export const musicStore = new Store({
name: '音乐(资源类型)', name: '音乐(资源类型)',
info: '音乐(类型说明)', store: createStore('db-music', 'store-music')
存储时间: 1000 * 60 * 60 * 24 * 7, // 7天不使用的资源将被删除
list: [{
id: 'uuid',
name: 'Dear big sisterremix ver.mp3',
arrayBuffer: 'ArrayBuffer',
createdAt: 1580000000000, // 创建时间
updatedAt: 1580000000000, // 更新时间
lastUsedAt: 1580000000000, // 最后使用时间
}]
}) })
export const chatStore = new Store({ export const chatStore = new Store({
name: '聊天(资源类型)', name: '聊天(资源类型)',
info: '聊天(类型说明)', store: createStore('db-chat', 'store-chat')
存储时间: 1000 * 60 * 60 * 24 * 7, // 7天不使用的资源将被删除 })
list: [{
id: 'uuid', export const userStore = new Store({
name: 'Dear big sisterremix ver.mp3', name: '用户(资源类型)',
arrayBuffer: 'ArrayBuffer', store: createStore('db-user', 'store-user')
createdAt: 1580000000000, // 创建时间
updatedAt: 1580000000000, // 更新时间
lastUsedAt: 1580000000000, // 最后使用时间
}]
}) })