使用 idb-keyval
This commit is contained in:
		
							
								
								
									
										18
									
								
								demo.html
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								demo.html
									
									
									
									
									
								
							@@ -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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										85
									
								
								src/store.js
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								src/store.js
									
									
									
									
									
								
							@@ -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, // 最后使用时间
 | 
					 | 
				
			||||||
    }]
 | 
					 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user