From 5b1147da5db4f04eb622633ad5397d6a6c8056b0 Mon Sep 17 00:00:00 2001 From: SwiftHawk Date: Thu, 30 May 2024 22:26:57 +0500 Subject: [PATCH] feat: added a local cache based on browsers built in indexDB --- package-lock.json | 6 ++++ package.json | 1 + src/services/cache/index.ts | 54 ++++++++++++++++++++++++++++++++++++ src/services/cache/schema.ts | 9 ++++++ src/services/index.ts | 1 + src/types/cache.ts | 6 ++++ src/types/index.ts | 3 +- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/services/cache/index.ts create mode 100644 src/services/cache/schema.ts create mode 100644 src/services/index.ts create mode 100644 src/types/cache.ts diff --git a/package-lock.json b/package-lock.json index ac416f3..90f0319 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index da3e20a..c7449ba 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/services/cache/index.ts b/src/services/cache/index.ts new file mode 100644 index 0000000..694c593 --- /dev/null +++ b/src/services/cache/index.ts @@ -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 + + // Private constructor to prevent direct instantiation + private constructor() {} + + // Method to initialize the database + private async init() { + this.db = await openDB('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 { + // 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 { + 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() diff --git a/src/services/cache/schema.ts b/src/services/cache/schema.ts new file mode 100644 index 0000000..869aabf --- /dev/null +++ b/src/services/cache/schema.ts @@ -0,0 +1,9 @@ +import { DBSchema } from 'idb' +import { CachedMetadataEvent } from '../../types' + +export interface SchemaV1 extends DBSchema { + userMetadata: { + key: string + value: CachedMetadataEvent + } +} diff --git a/src/services/index.ts b/src/services/index.ts new file mode 100644 index 0000000..79b5128 --- /dev/null +++ b/src/services/index.ts @@ -0,0 +1 @@ +export * from './cache' diff --git a/src/types/cache.ts b/src/types/cache.ts new file mode 100644 index 0000000..2a0edcd --- /dev/null +++ b/src/types/cache.ts @@ -0,0 +1,6 @@ +import { Event } from 'nostr-tools' + +export interface CachedMetadataEvent { + event: Event + cachedAt: number +} diff --git a/src/types/index.ts b/src/types/index.ts index 9397745..6c9f259 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -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'