feat: added a local cache based on browsers built in indexDB
This commit is contained in:
parent
45cb9a2d70
commit
5b1147da5d
6
package-lock.json
generated
6
package-lock.json
generated
@ -21,6 +21,7 @@
|
|||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"dnd-core": "16.0.1",
|
"dnd-core": "16.0.1",
|
||||||
"file-saver": "2.0.5",
|
"file-saver": "2.0.5",
|
||||||
|
"idb": "8.0.0",
|
||||||
"jszip": "3.10.1",
|
"jszip": "3.10.1",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"mui-file-input": "4.0.4",
|
"mui-file-input": "4.0.4",
|
||||||
@ -3592,6 +3593,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
"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": {
|
"node_modules/ignore": {
|
||||||
"version": "5.3.1",
|
"version": "5.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"dnd-core": "16.0.1",
|
"dnd-core": "16.0.1",
|
||||||
"file-saver": "2.0.5",
|
"file-saver": "2.0.5",
|
||||||
|
"idb": "8.0.0",
|
||||||
"jszip": "3.10.1",
|
"jszip": "3.10.1",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"mui-file-input": "4.0.4",
|
"mui-file-input": "4.0.4",
|
||||||
|
54
src/services/cache/index.ts
vendored
Normal file
54
src/services/cache/index.ts
vendored
Normal 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
9
src/services/cache/schema.ts
vendored
Normal 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
1
src/services/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './cache'
|
6
src/types/cache.ts
Normal file
6
src/types/cache.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { Event } from 'nostr-tools'
|
||||||
|
|
||||||
|
export interface CachedMetadataEvent {
|
||||||
|
event: Event
|
||||||
|
cachedAt: number
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
|
export * from './cache'
|
||||||
export * from './core'
|
export * from './core'
|
||||||
export * from './nostr'
|
export * from './nostr'
|
||||||
export * from './profile'
|
export * from './profile'
|
||||||
export * from './zip'
|
|
||||||
export * from './relay'
|
export * from './relay'
|
||||||
|
export * from './zip'
|
||||||
|
Loading…
Reference in New Issue
Block a user