From 4d75a4fd6748ac517b9dd401e6864bea09ba93aa Mon Sep 17 00:00:00 2001 From: Jack Works Date: Thu, 16 Dec 2021 14:42:05 +0800 Subject: [PATCH] chore: pick some small changes from #5208 --- .../src/encryption/DecryptionTypes.ts | 1 + .../mask/background/database/persona/db.ts | 4 +++ .../mask/background/database/post/helper.ts | 26 ++++++++++++++ .../mask/background/database/post/index.ts | 35 ++++++++----------- .../WelcomeServices/restoreBackup.ts | 11 ++++-- packages/mask/utils-pure/crypto/index.ts | 11 +++--- 6 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 packages/mask/background/database/post/helper.ts diff --git a/packages/encryption/src/encryption/DecryptionTypes.ts b/packages/encryption/src/encryption/DecryptionTypes.ts index 73cc19811b82..763a06227f8d 100644 --- a/packages/encryption/src/encryption/DecryptionTypes.ts +++ b/packages/encryption/src/encryption/DecryptionTypes.ts @@ -92,6 +92,7 @@ export enum DecryptProgressKind { Started = 'started', Success = 'success', Error = 'error', + Info = 'info', } export type DecryptProgress = { type: DecryptProgressKind.Started } | DecryptSuccess | DecryptError export interface DecryptSuccess { diff --git a/packages/mask/background/database/persona/db.ts b/packages/mask/background/database/persona/db.ts index 323d36f52504..7a3c8c3b2db8 100644 --- a/packages/mask/background/database/persona/db.ts +++ b/packages/mask/background/database/persona/db.ts @@ -193,6 +193,10 @@ export async function consistentPersonaDBWriteAccess( } } +export async function createReadonlyPersonaTransaction() { + return createTransaction(await db(), 'readonly') +} + //#region Plain methods /** Create a new Persona. */ export async function createPersonaDB(record: PersonaRecord, t: PersonasTransaction<'readwrite'>): Promise { diff --git a/packages/mask/background/database/post/helper.ts b/packages/mask/background/database/post/helper.ts new file mode 100644 index 000000000000..eed92ca6fbd4 --- /dev/null +++ b/packages/mask/background/database/post/helper.ts @@ -0,0 +1,26 @@ +import type { AESCryptoKey, PostIVIdentifier } from '@masknet/shared-base' +import { CryptoKeyToJsonWebKey } from '../../../utils-pure' +import { createTransaction } from '../utils/openDB' +import { PostDBAccess, queryPostDB, createPostDB, updatePostDB, PostRecord } from './index' + +export async function savePostKeyToDB( + id: PostIVIdentifier, + key: AESCryptoKey, + extraInfo: Omit, +): Promise { + const jwk = await CryptoKeyToJsonWebKey(key) + { + const t = createTransaction(await PostDBAccess(), 'readwrite')('post') + const post = await queryPostDB(id, t) + if (!post) { + await createPostDB({ + identifier: id, + postCryptoKey: jwk, + foundAt: new Date(), + ...extraInfo, + }) + } else { + await updatePostDB({ ...post, postCryptoKey: jwk }, 'override', t) + } + } +} diff --git a/packages/mask/background/database/post/index.ts b/packages/mask/background/database/post/index.ts index 2a0ac4e26421..30a0807e10ab 100644 --- a/packages/mask/background/database/post/index.ts +++ b/packages/mask/background/database/post/index.ts @@ -10,9 +10,9 @@ import { PostIVIdentifier, ProfileIdentifier, } from '@masknet/shared-base' -import { DBSchema, IDBPTransaction, openDB } from 'idb/with-async-ittr' +import { DBSchema, openDB } from 'idb/with-async-ittr' import { CryptoKeyToJsonWebKey, PrototypeLess, restorePrototype, restorePrototypeArray } from '../../../utils-pure' -import { createDBAccessWithAsyncUpgrade, createTransaction } from '../utils/openDB' +import { createDBAccessWithAsyncUpgrade, createTransaction, IDBPSafeTransaction } from '../utils/openDB' type UpgradeKnowledge = { version: 4; data: Map } | undefined const db = createDBAccessWithAsyncUpgrade( @@ -188,19 +188,20 @@ const db = createDBAccessWithAsyncUpgrade( ) export const PostDBAccess = db -type PostTransaction = IDBPTransaction +type PostReadOnlyTransaction = IDBPSafeTransaction +type PostReadWriteTransaction = IDBPSafeTransaction -export async function createPostDB(record: PostRecord, t?: PostTransaction) { - t = t || (await db()).transaction('post', 'readwrite') +export async function createPostDB(record: PostRecord, t?: PostReadWriteTransaction) { + t ||= createTransaction(await db(), 'readwrite')('post') const toSave = postToDB(record) await t.objectStore('post').add(toSave) } export async function updatePostDB( updateRecord: Partial & Pick, mode: 'append' | 'override', - t?: PostTransaction, + t?: PostReadWriteTransaction, ): Promise { - t = t || (await db()).transaction('post', 'readwrite') + t ||= createTransaction(await db(), 'readwrite')('post') const emptyRecord: PostRecord = { identifier: updateRecord.identifier, recipients: new IdentifierMap(new Map()), @@ -233,24 +234,20 @@ export async function updatePostDB( const nextRecordInDBType = postToDB(nextRecord) await t.objectStore('post').put(nextRecordInDBType) } -export async function createOrUpdatePostDB(record: PostRecord, mode: 'append' | 'override', t?: PostTransaction) { - t = t || (await db()).transaction('post', 'readwrite') - if (await t.objectStore('post').get(record.identifier.toText())) return updatePostDB(record, mode, t) - else return createPostDB(record, t) -} -export async function queryPostDB(record: PostIVIdentifier, t?: PostTransaction): Promise { - t = t || (await db()).transaction('post') + +export async function queryPostDB(record: PostIVIdentifier, t?: PostReadOnlyTransaction): Promise { + t ||= createTransaction(await db(), 'readonly')('post') const result = await t.objectStore('post').get(record.toText()) if (result) return postOutDB(result) return null } export async function queryPostsDB( query: string | ((data: PostRecord, id: PostIVIdentifier) => boolean), - t?: PostTransaction, + t?: PostReadOnlyTransaction, ): Promise { - t = t || (await db()).transaction('post') + t ||= createTransaction(await db(), 'readonly')('post') const selected: PostRecord[] = [] - for await (const { value } of t.store) { + for await (const { value } of t.objectStore('post')) { const idResult = Identifier.fromString(value.identifier, PostIVIdentifier) if (idResult.err) { console.warn(idResult.val.message) @@ -266,10 +263,6 @@ export async function queryPostsDB( } return selected } -export async function deletePostCryptoKeyDB(record: PostIVIdentifier, t?: PostTransaction) { - t = t || (await db()).transaction('post', 'readwrite') - await t.objectStore('post').delete(record.toText()) -} /** * Query posts by paged diff --git a/packages/mask/src/extension/background-script/WelcomeServices/restoreBackup.ts b/packages/mask/src/extension/background-script/WelcomeServices/restoreBackup.ts index f7e6f20f003a..a65d02c986ba 100644 --- a/packages/mask/src/extension/background-script/WelcomeServices/restoreBackup.ts +++ b/packages/mask/src/extension/background-script/WelcomeServices/restoreBackup.ts @@ -12,7 +12,7 @@ import { currySameAddress } from '@masknet/web3-shared-evm' import { PersonaRecordFromJSONFormat } from '../../../utils/type-transform/BackupFormat/JSON/DBRecord-JSON/PersonaRecord' import { ProfileRecordFromJSONFormat } from '../../../utils/type-transform/BackupFormat/JSON/DBRecord-JSON/ProfileRecord' import { PostRecordFromJSONFormat } from '../../../utils/type-transform/BackupFormat/JSON/DBRecord-JSON/PostRecord' -import { createOrUpdatePostDB, PostDBAccess } from '../../../database' +import { createPostDB, PostDBAccess, updatePostDB } from '../../../database' import { WalletRecordFromJSONFormat } from '../../../utils/type-transform/BackupFormat/JSON/DBRecord-JSON/WalletRecord' import { getDerivableAccounts, @@ -25,6 +25,7 @@ import { addWallet } from '../../../plugins/Wallet/services/wallet/database' import { patchCreateNewRelation, patchCreateOrUpdateRelation } from '../IdentityService' import { RelationRecordFromJSONFormat } from '../../../utils/type-transform/BackupFormat/JSON/DBRecord-JSON/RelationRecord' import { HD_PATH_WITHOUT_INDEX_ETHEREUM } from '@masknet/plugin-wallet' +import { createTransaction } from '../../../../background/database/utils/openDB' /** * Restore the backup @@ -75,9 +76,13 @@ export async function restoreBackup(json: object, whoAmI?: ProfileIdentifier) { } } { - const postDBTransaction = (await PostDBAccess()).transaction('post', 'readwrite') + const t = createTransaction(await PostDBAccess(), 'readwrite')('post') for (const x of data.posts) { - await createOrUpdatePostDB(PostRecordFromJSONFormat(x), 'append', postDBTransaction) + const { val, err } = Result.wrap(() => PostRecordFromJSONFormat(x)) + if (err) continue + if (await t.objectStore('post').get(val.identifier.toText())) { + await updatePostDB(val, 'append', t) + } else await createPostDB(val, t) } } diff --git a/packages/mask/utils-pure/crypto/index.ts b/packages/mask/utils-pure/crypto/index.ts index 832c110720d4..d5fa57b145a9 100644 --- a/packages/mask/utils-pure/crypto/index.ts +++ b/packages/mask/utils-pure/crypto/index.ts @@ -8,11 +8,10 @@ import type { EC_Private_JsonWebKey, EC_Public_JsonWebKey, } from '@masknet/shared-base' - -export async function CryptoKeyToJsonWebKey(key: EC_Public_CryptoKey): Promise -export async function CryptoKeyToJsonWebKey(key: EC_Private_CryptoKey): Promise -export async function CryptoKeyToJsonWebKey(key: AESCryptoKey): Promise -export async function CryptoKeyToJsonWebKey(key: EC_CryptoKey): Promise -export async function CryptoKeyToJsonWebKey(key: CryptoKey): Promise { +export function CryptoKeyToJsonWebKey(key: EC_Public_CryptoKey): Promise +export function CryptoKeyToJsonWebKey(key: EC_Private_CryptoKey): Promise +export function CryptoKeyToJsonWebKey(key: AESCryptoKey): Promise +export function CryptoKeyToJsonWebKey(key: EC_CryptoKey): Promise +export function CryptoKeyToJsonWebKey(key: CryptoKey): Promise { return crypto.subtle.exportKey('jwk', key) }