feat: added a local cache based on browsers built in indexDB

This commit is contained in:
SwiftHawk 2024-05-30 22:26:57 +05:00
parent 45cb9a2d70
commit 5b1147da5d
7 changed files with 79 additions and 1 deletions

6
package-lock.json generated
View File

@ -21,6 +21,7 @@
"crypto-js": "^4.2.0",
"dnd-core": "16.0.1",
"file-saver": "2.0.5",
"idb": "8.0.0",
"jszip": "3.10.1",
"lodash": "4.17.21",
"mui-file-input": "4.0.4",
@ -3592,6 +3593,11 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/idb": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/idb/-/idb-8.0.0.tgz",
"integrity": "sha512-l//qvlAKGmQO31Qn7xdzagVPPaHTxXx199MhrAFuVBTPqydcPYBWjkrbv4Y0ktB+GmWOiwHl237UUOrLmQxLvw=="
},
"node_modules/ignore": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",

View File

@ -27,6 +27,7 @@
"crypto-js": "^4.2.0",
"dnd-core": "16.0.1",
"file-saver": "2.0.5",
"idb": "8.0.0",
"jszip": "3.10.1",
"lodash": "4.17.21",
"mui-file-input": "4.0.4",

54
src/services/cache/index.ts vendored Normal file
View File

@ -0,0 +1,54 @@
import { IDBPDatabase, openDB } from 'idb'
import { Event } from 'nostr-tools'
import { CachedMetadataEvent } from '../../types'
import { SchemaV1 } from './schema'
class LocalCache {
// Static property to hold the single instance of LocalCache
private static instance: LocalCache | null = null
private db!: IDBPDatabase<SchemaV1>
// Private constructor to prevent direct instantiation
private constructor() {}
// Method to initialize the database
private async init() {
this.db = await openDB<SchemaV1>('sigit-cache', 1, {
upgrade(db) {
db.createObjectStore('userMetadata', { keyPath: 'event.pubkey' })
}
})
}
// Static method to get the single instance of LocalCache
public static async getInstance(): Promise<LocalCache> {
// If the instance doesn't exist, create it
if (!LocalCache.instance) {
LocalCache.instance = new LocalCache()
await LocalCache.instance.init()
}
// Return the single instance of LocalCache
return LocalCache.instance
}
// Method to add user metadata
public async addUserMetadata(event: Event) {
await this.db.put('userMetadata', { event, cachedAt: Date.now() })
}
// Method to get user metadata by key
public async getUserMetadata(
key: string
): Promise<CachedMetadataEvent | null> {
const data = await this.db.get('userMetadata', key)
return data || null
}
// Method to delete user metadata by key
public async deleteUserMetadata(key: string) {
await this.db.delete('userMetadata', key)
}
}
// Export the single instance of LocalCache
export const localCache = await LocalCache.getInstance()

9
src/services/cache/schema.ts vendored Normal file
View File

@ -0,0 +1,9 @@
import { DBSchema } from 'idb'
import { CachedMetadataEvent } from '../../types'
export interface SchemaV1 extends DBSchema {
userMetadata: {
key: string
value: CachedMetadataEvent
}
}

1
src/services/index.ts Normal file
View File

@ -0,0 +1 @@
export * from './cache'

6
src/types/cache.ts Normal file
View File

@ -0,0 +1,6 @@
import { Event } from 'nostr-tools'
export interface CachedMetadataEvent {
event: Event
cachedAt: number
}

View File

@ -1,5 +1,6 @@
export * from './cache'
export * from './core'
export * from './nostr'
export * from './profile'
export * from './zip'
export * from './relay'
export * from './zip'