From bfad95dd256cf74f403f0ef2efd735a47b8bcfd0 Mon Sep 17 00:00:00 2001 From: Sosthene00 <674694@protonmail.ch> Date: Mon, 18 Mar 2024 15:46:31 +0100 Subject: [PATCH] Add sp_wallet creation in ts --- src/database.ts | 134 ++++++++++++++++++++++++++++++++++++++++++++++++ src/index.html | 10 ++++ src/index.ts | 15 ++++++ src/services.ts | 49 ++++++++++++++++++ 4 files changed, 208 insertions(+) create mode 100644 src/database.ts create mode 100644 src/index.html create mode 100644 src/index.ts create mode 100644 src/services.ts diff --git a/src/database.ts b/src/database.ts new file mode 100644 index 0000000..3d078c5 --- /dev/null +++ b/src/database.ts @@ -0,0 +1,134 @@ +class Database { + private static instance: Database; + private db: IDBDatabase | null = null; + private dbName: string = '4nk'; + private dbVersion: number = 1; + private storeDefinitions = { + SpClient: { + name: "sp_client", + options: {} + }, + AnkUser: { + name: "4nkUser", + options: {} + }, + AnkSession: { + name: "4nkSession", + options: {} + }, + AnkProcess: { + name: "4nkProcess", + options: {} + } + } + + // Private constructor to prevent direct instantiation from outside + private constructor() {} + + // Method to access the singleton instance of Database + public static async getInstance(): Promise { + if (!Database.instance) { + Database.instance = new Database(); + await Database.instance.init(); + } + return Database.instance; + } + + // Initialize the database + private async init(): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, this.dbVersion); + + request.onupgradeneeded = () => { + const db = request.result; + + Object.values(this.storeDefinitions).forEach(({name, options}) => { + if (!db.objectStoreNames.contains(name)) { + db.createObjectStore(name, options); + } + }); + }; + + request.onsuccess = (event) => { + this.db = request.result; + resolve(); + }; + + request.onerror = (event) => { + console.error("Database error:", request.error); + reject(request.error); + }; + }); + } + + public getDb(): IDBDatabase { + if (!this.db) { + throw new Error("Database not initialized"); + } + return this.db; + } + + public getStoreList(): {[key: string]: string} { + const objectList: {[key: string]: string} = {}; + Object.keys(this.storeDefinitions).forEach(key => { + objectList[key] = this.storeDefinitions[key as keyof typeof this.storeDefinitions].name; + }); + return objectList; + } + + public writeObject(db: IDBDatabase, storeName: string, obj: any, key: string | null): Promise { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, 'readwrite'); + const store = transaction.objectStore(storeName); + let request: IDBRequest; + if (key) { + request = store.add(obj, key); + } else { + request = store.add(obj); + } + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + }); + } + + public getObject(db: IDBDatabase, storeName: string, key: string | number): Promise { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, 'readonly'); + const store = transaction.objectStore(storeName); + const request = store.get(key); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + }); + } + + public setObject(db: IDBDatabase, storeName: string, obj: any, key: string | null): Promise { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, 'readwrite'); + const store = transaction.objectStore(storeName); + let request: IDBRequest; + if (key) { + request = store.put(obj, key); + } else { + request = store.put(obj); + } + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + }); + } + + public getAll(db: IDBDatabase, storeName: string): Promise { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, 'readonly'); + const store = transaction.objectStore(storeName); + const request = store.getAll(); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + }); + } +} + +export default Database; diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..00b59c8 --- /dev/null +++ b/src/index.html @@ -0,0 +1,10 @@ + + + + + + 4NK Client + + + + diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..257166f --- /dev/null +++ b/src/index.ts @@ -0,0 +1,15 @@ +import Services from './services'; +import IndexedDB from './database' + +document.addEventListener('DOMContentLoaded', async () => { + try { + const services = await Services.getInstance(); + const indexedDB = await IndexedDB.getInstance(); + + const db = indexedDB.getDb(); + await indexedDB.writeObject(db, indexedDB.getStoreList().SpClient, services.new_sp_client(), "default"); + } catch (error) { + console.error(error); + } +}); + diff --git a/src/services.ts b/src/services.ts new file mode 100644 index 0000000..ae9eafd --- /dev/null +++ b/src/services.ts @@ -0,0 +1,49 @@ +import IndexedDB from './database' + +class Services { + private static instance: Services; + private sdkClient: any; + + // Private constructor to prevent direct instantiation from outside + private constructor() {} + + // Method to access the singleton instance of Services + public static async getInstance(): Promise { + if (!Services.instance) { + Services.instance = new Services(); + await Services.instance.init(); + } + return Services.instance; + } + + // The init method is now part of the instance, and should only be called once + private async init(): Promise { + this.sdkClient = await import("../dist/pkg/sdk_client"); + this.sdkClient.setup(); + } + + public new_sp_client(): string { + return this.sdkClient.generate_sp_wallet(); + } + + public async getSpAddressDefaultClient(): Promise { + try { + const indexedDB = await IndexedDB.getInstance(); + const db = indexedDB.getDb(); + const spClient = await indexedDB.getObject(db, indexedDB.getStoreList().SpClient, "default"); + + if (spClient) { + return this.sdkClient.get_receiving_address(spClient); + } else { + console.error("SP client not found"); + return null; + } + } catch (error) { + console.error("Failed to retrieve object or get sp address:", error); + return null; + } + + } +} + +export default Services;