Skip to content

Commit

Permalink
fix: request
Browse files Browse the repository at this point in the history
  • Loading branch information
IsaccoSordo committed Jan 16, 2024
1 parent b8bf7a7 commit dfbdf99
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 4 deletions.
3 changes: 2 additions & 1 deletion packages/beacon-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import { windowRef } from './MockWindow'
import { CommunicationClient } from './transports/clients/CommunicationClient'
import { ClientEvents } from './transports/clients/ClientEvents'
import { WCStorage } from './storage/WCStorage'
import { IndexedDBStorage } from './storage/IndexedDBStorage'
// import { EncryptionType } from './types/EncryptionType'
// import { EncryptionOperation } from './types/EncryptionOperation'

Expand Down Expand Up @@ -68,7 +69,7 @@ export {
export { Transport, MessageBasedClient, CommunicationClient }

// Storage
export { ChromeStorage, LocalStorage, WCStorage, getStorage }
export { ChromeStorage, LocalStorage, WCStorage, IndexedDBStorage, getStorage }

// Managers
export { PeerManager, AccountManager, AppMetadataManager, PermissionManager }
Expand Down
69 changes: 67 additions & 2 deletions packages/beacon-core/src/storage/IndexedDBStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,15 @@ import { Logger } from '@airgap/beacon-core'
const logger = new Logger('IndexedDBStorage')

export class IndexedDBStorage extends Storage {
private readonly dbName: string = 'WALLET_CONNECT_V2_INDEXED_DB'
private readonly storeName: string = 'keyvaluestorage'
private db: IDBDatabase | null = null

constructor(
private readonly dbName: string = 'WALLET_CONNECT_V2_INDEXED_DB',
private readonly storeName: string = 'keyvaluestorage'
) {
super()
}

static async doesDatabaseAndTableExist(): Promise<boolean> {
const targetDatabaseName = 'WALLET_CONNECT_V2_INDEXED_DB'
const targetTableName = 'keyvaluestorage'
Expand Down Expand Up @@ -97,6 +102,66 @@ export class IndexedDBStorage extends Storage {
})
}

getAll(): Promise<string[]> {
return new Promise((resolve, reject) => {
const request = indexedDB.open(this.dbName)

request.onsuccess = (event) => {
const db = (event.target as IDBOpenDBRequest).result

const transaction = db.transaction(this.storeName, 'readonly')
const objectStore = transaction.objectStore(this.storeName)

const getAllRequest = objectStore.getAll()

getAllRequest.onsuccess = () => {
const results = getAllRequest.result
resolve(results)
}

getAllRequest.onerror = (getAllEvent) => {
logger.error(`Error getting all records:`, getAllEvent.target)
reject(getAllEvent.target)
}
}

request.onerror = (event) => {
logger.error('Error opening database:', event.target)
reject(event.target)
}
})
}

getAllKeys(): Promise<IDBValidKey[]> {
return new Promise((resolve, reject) => {
const request = indexedDB.open(this.dbName)

request.onsuccess = (event) => {
const db = (event.target as IDBOpenDBRequest).result

const transaction = db.transaction(this.storeName, 'readonly')
const objectStore = transaction.objectStore(this.storeName)

const getAllRequest = objectStore.getAllKeys()

getAllRequest.onsuccess = () => {
const results = getAllRequest.result
resolve(results)
}

getAllRequest.onerror = (getAllEvent) => {
logger.error(`Error getting all records:`, getAllEvent.target)
reject(getAllEvent.target)
}
}

request.onerror = (event) => {
logger.error('Error opening database:', event.target)
reject(event.target)
}
})
}

set<K extends StorageKey>(key: K, value: StorageKeyReturnType[K]): Promise<void> {
return new Promise((resolve, reject) => {
const request = indexedDB.open(this.dbName)
Expand Down
82 changes: 81 additions & 1 deletion packages/beacon-ui/src/components/bug-report-form/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { IndexedDBStorage } from '@airgap/beacon-core'
import { StorageKey } from '@airgap/beacon-types'
import { createEffect, createSignal } from 'solid-js'

interface StorageObject {
[key: string]: string | null
}

const BugReportForm = () => {
const [title, setTitle] = createSignal('')
const [description, setDescription] = createSignal('')
Expand All @@ -18,6 +24,76 @@ const BugReportForm = () => {
return steps().trim().length >= 30
}

const localStorageToMetadata = () => {
const result: StorageObject = {}

Object.keys(localStorage)
.filter((key) => key.includes('beacon'))
.forEach((key) => (result[key] = localStorage.getItem(key)))

return result
}

const indexDBToMetadata = async () => {
const result: StorageObject = {}
const db = new IndexedDBStorage()

if (!(await IndexedDBStorage.doesDatabaseAndTableExist())) {
return result
}

try {
await db.openDatabase()
const keys = (await db.getAllKeys()).map((key) => key.toString())
keys.forEach(async (key) => (result[key] = (await db.get(key as StorageKey)) as string))
} catch (error: any) {
console.error(error.message)
}

return result
}

const currentOS = () => {
var ua = navigator.userAgent
var osMap = new Map([
['Windows', 'Windows'],
['Macintosh', 'Mac OS'],
['Mac OS X', 'Mac OS X'],
['Linux', 'Linux'],
['Ubuntu', 'Ubuntu'],
['iPhone', 'iOS'],
['iPad', 'iOS'],
['Android', 'Android']
])

for (let [key, value] of osMap) {
if (ua.indexOf(key) !== -1) {
return value
}
}
return ua
}

const currentBrowser = () => {
var ua = navigator.userAgent
var browserMap = new Map([
['Firefox', 'Mozilla Firefox'],
['Opera', 'Opera'],
['OPR', 'Opera'],
['Trident', 'Microsoft Internet Explorer'],
['Edge', 'Microsoft Edge'],
['Chrome', 'Google Chrome'],
['Safari', 'Apple Safari']
])

for (let [key, value] of browserMap) {
if (ua.indexOf(key) !== -1) {
return value
}
}
return ua
}

createEffect(() => {
setFormValid(isTitleValid() && isDescriptionValid() && areStepsValid())
})
Expand All @@ -33,7 +109,11 @@ const BugReportForm = () => {
body: JSON.stringify({
title: title(),
description: description(),
steps: steps()
steps: steps(),
os: currentOS(),
browser: currentBrowser(),
localStorage: JSON.stringify(localStorageToMetadata()),
wcStorage: JSON.stringify(indexDBToMetadata())
}) // Convert the data object to JSON string
}

Expand Down

0 comments on commit dfbdf99

Please sign in to comment.