]> git.codecow.com Git - libnemo.git/commitdiff
Migrate wallet lock method to separate module and call it synchronously.
authorChris Duncan <chris@zoso.dev>
Mon, 18 Aug 2025 16:56:12 +0000 (09:56 -0700)
committerChris Duncan <chris@zoso.dev>
Mon, 18 Aug 2025 16:56:12 +0000 (09:56 -0700)
src/lib/vault/vault.ts
src/lib/wallet/index.ts
src/lib/wallet/ledger.ts
src/lib/wallet/lock.ts [new file with mode: 0644]
test/test.lock-unlock.mjs

index 5d299ff31ff1dfba63a6c810244cb862409d016f..73248c86ad870719fe0c00b2e82b7cc1e8462aea 100644 (file)
@@ -56,7 +56,7 @@ export class Vault {
                                                break
                                        }
                                        case 'lock': {
-                                               result = await this.lock()
+                                               result = this.lock()
                                                break
                                        }
                                        case 'sign': {
index 1f9873ab0ce1e4576dd850893e27d5febd08d766..f1390568770664cf9127057f2e7738b9bb621e56 100644 (file)
@@ -11,6 +11,7 @@ import { _create } from './create'
 import { Database } from '../database'\r
 import { _get } from './get'\r
 import { _load } from './load'\r
+import { _lock } from './lock'\r
 import { _restore } from './restore'\r
 import { Rpc } from '../rpc'\r
 import { _sign } from './sign'\r
@@ -272,24 +273,11 @@ export class Wallet {
        }\r
 \r
        /**\r
-       * Locks the wallet and all currently derived accounts with a password that\r
-       * will be needed to unlock it later.\r
-       *\r
-       * @returns True if successfully locked\r
+       * Clears the seed and mnemonic from the vault.\r
        */\r
-       async lock (): Promise<boolean> {\r
-               try {\r
-                       const { isLocked } = await this.#vault.request<boolean>({\r
-                               action: 'lock'\r
-                       })\r
-                       if (!isLocked) {\r
-                               throw new Error('Lock request to Vault failed')\r
-                       }\r
-                       clearTimeout(this.#lockTimer)\r
-                       return isLocked\r
-               } catch (err) {\r
-                       throw new Error('Failed to lock wallet', { cause: err })\r
-               }\r
+       lock (): void {\r
+               _lock(this.#vault)\r
+               clearTimeout(this.#lockTimer)\r
        }\r
 \r
        /**\r
@@ -337,7 +325,6 @@ export class Wallet {
        * Unlocks the wallet using the same password as used prior to lock it.\r
        *\r
        * @param {string} password Used previously to lock the wallet\r
-       * @returns True if successfully unlocked\r
        */\r
        async unlock (password: string): Promise<void> {\r
                await _unlock(this, this.#vault, password)\r
index bcc5683903b7b7d46b7c439f570c37c91c740297..54767e971220a9d88f0be91b2f7d0cc11ed47376 100644 (file)
@@ -226,9 +226,7 @@ export class Ledger extends Wallet {
        */\r
        async destroy (): Promise<void> {\r
                await super.destroy()\r
-               if (!(await this.lock())) {\r
-                       throw new Error('Failed to lock Ledger wallet')\r
-               }\r
+               this.lock()\r
        }\r
 \r
        /**\r
@@ -240,22 +238,16 @@ export class Ledger extends Wallet {
        *\r
        * Overrides the default wallet `lock()` method since as a hardware wallet it\r
        * does not need to be encrypted by software.\r
-       *\r
-       * @returns True if successfully locked\r
        */\r
-       async lock (): Promise<boolean> {\r
-               try {\r
+       lock (): void {\r
+               setTimeout(async () => {\r
                        const devices = await globalThis.navigator.usb.getDevices()\r
                        for (const device of devices) {\r
                                if (device.vendorId === ledgerUSBVendorId) {\r
-                                       await device.forget()\r
+                                       device.forget()\r
                                }\r
                        }\r
-                       return new Promise(r => setTimeout(r, 0, true))\r
-               } catch (err) {\r
-                       console.log(err)\r
-                       return new Promise(r => setTimeout(r, 0, false))\r
-               }\r
+               })\r
        }\r
 \r
        /**\r
diff --git a/src/lib/wallet/lock.ts b/src/lib/wallet/lock.ts
new file mode 100644 (file)
index 0000000..ed58d86
--- /dev/null
@@ -0,0 +1,18 @@
+//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+//! SPDX-License-Identifier: GPL-3.0-or-later
+
+import { WorkerQueue } from '../vault/worker-queue'
+
+export async function _lock (vault: WorkerQueue): Promise<void>
+export async function _lock (vault: WorkerQueue): Promise<void> {
+       try {
+               const { isLocked } = await vault.request<boolean>({
+                       action: 'lock'
+               })
+               if (!isLocked) {
+                       throw new Error('Lock request to Vault failed')
+               }
+       } catch (err) {
+               throw new Error('Failed to lock wallet', { cause: err })
+       }
+}
index 58a7bc26de0f8552c0def4c74752a1ffadd1bcc5..f806ea6f510ca6cab94e564035052158c0635740 100644 (file)
@@ -42,10 +42,16 @@ await Promise.all([
                await test('fail to unlock a Bip44Wallet with different passwords', async () => {\r
                        const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
                        await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
-                       const lockResult = await wallet.lock()\r
+                       wallet.lock()\r
+\r
+                       await assert.rejects(wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+                       await assert.rejects(wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+                       assert.ok('mnemonic' in wallet)\r
+                       assert.ok('seed' in wallet)\r
+                       assert.ok(wallet.mnemonic === undefined)\r
+                       assert.ok(wallet.seed === undefined)\r
 \r
                        await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.PASSWORD), { message: 'Failed to unlock wallet' })\r
-                       assert.equal(lockResult, true)\r
                        assert.ok('mnemonic' in wallet)\r
                        assert.ok('seed' in wallet)\r
                        assert.ok(wallet.mnemonic === undefined)\r