Skip to content

Commit

Permalink
chore: Storage wrapper (#111)
Browse files Browse the repository at this point in the history
Storage wrapper

Co-authored-by: Diana Fulga <[email protected]>
  • Loading branch information
dianafulga and Diana Fulga authored Feb 28, 2024
1 parent 3553336 commit 40c4c7d
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 37 deletions.
43 changes: 7 additions & 36 deletions src/background/Background.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { bytesToHex } from '@noble/hashes/utils'
import { Runtime, runtime, tabs } from 'webextension-polyfill'

import { type PaymentFlowService } from '@/background/paymentFlow'
import { exportJWK, generateEd25519KeyPair } from '@/utils/crypto'
import { defaultData, storageApi } from '@/utils/storage'
import { setStorageDefaultData } from '@/utils/storage'

import {
getSendingPaymentPointerHandler,
Expand All @@ -16,6 +14,7 @@ import {
setStorageKey,
} from '../messageHandlers'
import { tabChangeHandler, tabUpdateHandler } from './tabHandlers'
import { generateKeysHandler } from './installHandlers'

class Background {
private messageHandlers: any = [
Expand All @@ -35,16 +34,7 @@ class Background {
paymentStarted = false

constructor() {
this.setStorageDefaultData()
}

// TODO: to be moved to a service
async setStorageDefaultData() {
try {
await storageApi.set({ data: { ...defaultData } })
} catch (error) {
console.error('Error storing data:', error)
}
setStorageDefaultData()
}

subscribeToMessages() {
Expand Down Expand Up @@ -85,31 +75,12 @@ class Background {
tabs.onActivated.addListener(tabChangeHandler)
}

unsubscribeFromMessages() {
this.subscriptions.forEach((sub: any) => sub())
}
private async keyExists(): Promise<boolean> {
const data = await storageApi.get(['privateKey', 'publicKey', 'keyId'])
if (data.privateKey && data.publicKey && data.keyId) {
return true
}

return false
subscribeToInstall() {
runtime.onInstalled.addListener(generateKeysHandler)
}

async onInstalled() {
runtime.onInstalled.addListener(async () => {
if (await this.keyExists()) return
const { privateKey, publicKey } = generateEd25519KeyPair()
const keyId = crypto.randomUUID()
const jwk = exportJWK(publicKey, keyId)

await storageApi.set({
privateKey: bytesToHex(privateKey),
publicKey: btoa(JSON.stringify(jwk)),
keyId,
})
})
unsubscribeFromMessages() {
this.subscriptions.forEach((sub: any) => sub())
}
}
export default Background
2 changes: 1 addition & 1 deletion src/background/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const initialize = () => {

const background = container.resolve('background')

background.onInstalled()
background.subscribeToInstall()
background.subscribeToMessages()
background.subscribeToTabChanges()

Expand Down
14 changes: 14 additions & 0 deletions src/background/installHandlers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { bytesToHex } from '@noble/hashes/utils'

import { exportJWK, generateEd25519KeyPair } from '@/utils/crypto'
import { getKeys, setKeys } from '@/utils/storage'

export const generateKeysHandler = async () => {
if (await getKeys()) return

const { privateKey, publicKey } = generateEd25519KeyPair()
const keyId = crypto.randomUUID()
const jwk = exportJWK(publicKey, keyId)

await setKeys(bytesToHex(privateKey), btoa(JSON.stringify(jwk)), keyId)
}
21 changes: 21 additions & 0 deletions src/utils/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,24 @@ export const getStorageKey = async (key: string) => {
}

export const storageApi = browser.storage?.sync || browser.storage?.local

export const setStorageDefaultData = async () => {
try {
await storageApi.set({ data: { ...defaultData } })
} catch (error) {
console.error('Error storing data:', error)
}
}

export const getKeys = async (): Promise<boolean> => {
const data = await storageApi.get(['privateKey', 'publicKey', 'keyId'])
return data.privateKey && data.publicKey && data.keyId
}

export const setKeys = async(privateKey: string, publicKey: string, keyId: string): Promise<void> => {
await storageApi.set({
privateKey,
publicKey,
keyId,
})
}

0 comments on commit 40c4c7d

Please sign in to comment.