2645984d169442599b17316feccaad624613d53f28754e1191d0c4914c5f8397.json raw
1 {"ast":null,"code":"import _asyncToGenerator from \"/home/mleku/src/orly.dev/next/signer/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { CryptoHelper } from '@common';\n/**\n * Parse a nostr+walletconnect:// URL into its components\n */\nexport function parseNwcUrl(url) {\n try {\n // Format: nostr+walletconnect://<pubkey>?relay=<url>&secret=<hex>&lud16=<optional>\n const match = url.match(/^nostr\\+walletconnect:\\/\\/([a-f0-9]{64})\\?(.+)$/i);\n if (!match) {\n return null;\n }\n const walletPubkey = match[1].toLowerCase();\n const params = new URLSearchParams(match[2]);\n const relayUrl = params.get('relay');\n const secret = params.get('secret');\n const lud16 = params.get('lud16') || undefined;\n if (!relayUrl || !secret) {\n return null;\n }\n // Validate secret is 64-char hex\n if (!/^[a-f0-9]{64}$/i.test(secret)) {\n return null;\n }\n return {\n walletPubkey,\n relayUrl: decodeURIComponent(relayUrl),\n secret: secret.toLowerCase(),\n lud16\n };\n } catch {\n return null;\n }\n}\nexport const addNwcConnection = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(function* (data) {\n this.assureIsInitialized();\n // Parse the NWC URL\n const parsed = parseNwcUrl(data.connectionUrl);\n if (!parsed) {\n throw new Error('Invalid NWC URL format');\n }\n // Check if a connection with the same wallet pubkey already exists\n const existingConnection = (this.getBrowserSessionHandler().browserSessionData?.nwcConnections ?? []).find(x => x.walletPubkey === parsed.walletPubkey);\n if (existingConnection) {\n throw new Error(`A connection to this wallet already exists: ${existingConnection.name}`);\n }\n const browserSessionData = this.getBrowserSessionHandler().browserSessionData;\n if (!browserSessionData) {\n throw new Error('Browser session data is undefined.');\n }\n const decryptedConnection = {\n id: CryptoHelper.v4(),\n name: data.name,\n connectionUrl: data.connectionUrl,\n walletPubkey: parsed.walletPubkey,\n relayUrl: parsed.relayUrl,\n secret: parsed.secret,\n lud16: parsed.lud16,\n createdAt: new Date().toISOString()\n };\n // Initialize array if needed\n if (!browserSessionData.nwcConnections) {\n browserSessionData.nwcConnections = [];\n }\n // Add the new connection to the session data\n browserSessionData.nwcConnections.push(decryptedConnection);\n this.getBrowserSessionHandler().saveFullData(browserSessionData);\n // Encrypt the new connection and add it to the sync data\n const encryptedConnection = yield encryptNwcConnection.call(this, decryptedConnection);\n const encryptedConnections = [...(this.getBrowserSyncHandler().browserSyncData?.nwcConnections ?? []), encryptedConnection];\n yield this.getBrowserSyncHandler().saveAndSetPartialData_NwcConnections({\n nwcConnections: encryptedConnections\n });\n });\n return function addNwcConnection(_x) {\n return _ref.apply(this, arguments);\n };\n}();\nexport const deleteNwcConnection = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(function* (connectionId) {\n this.assureIsInitialized();\n if (!connectionId) {\n return;\n }\n const browserSessionData = this.getBrowserSessionHandler().browserSessionData;\n const browserSyncData = this.getBrowserSyncHandler().browserSyncData;\n if (!browserSessionData || !browserSyncData) {\n throw new Error('Browser session or sync data is undefined.');\n }\n // Remove from session data\n browserSessionData.nwcConnections = (browserSessionData.nwcConnections ?? []).filter(x => x.id !== connectionId);\n yield this.getBrowserSessionHandler().saveFullData(browserSessionData);\n // Handle Sync data\n const encryptedConnectionId = yield this.encrypt(connectionId);\n yield this.getBrowserSyncHandler().saveAndSetPartialData_NwcConnections({\n nwcConnections: (browserSyncData.nwcConnections ?? []).filter(x => x.id !== encryptedConnectionId)\n });\n });\n return function deleteNwcConnection(_x2) {\n return _ref2.apply(this, arguments);\n };\n}();\nexport const updateNwcConnectionBalance = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(function* (connectionId, balanceMillisats) {\n this.assureIsInitialized();\n const browserSessionData = this.getBrowserSessionHandler().browserSessionData;\n const browserSyncData = this.getBrowserSyncHandler().browserSyncData;\n if (!browserSessionData || !browserSyncData) {\n throw new Error('Browser session or sync data is undefined.');\n }\n const sessionConnection = (browserSessionData.nwcConnections ?? []).find(x => x.id === connectionId);\n const encryptedConnectionId = yield this.encrypt(connectionId);\n const syncConnection = (browserSyncData.nwcConnections ?? []).find(x => x.id === encryptedConnectionId);\n if (!sessionConnection || !syncConnection) {\n throw new Error('NWC connection not found for balance update.');\n }\n const now = new Date().toISOString();\n // Update session data\n sessionConnection.cachedBalance = balanceMillisats;\n sessionConnection.cachedBalanceAt = now;\n yield this.getBrowserSessionHandler().saveFullData(browserSessionData);\n // Update sync data\n syncConnection.cachedBalance = yield this.encrypt(balanceMillisats.toString());\n syncConnection.cachedBalanceAt = yield this.encrypt(now);\n yield this.getBrowserSyncHandler().saveAndSetPartialData_NwcConnections({\n nwcConnections: browserSyncData.nwcConnections ?? []\n });\n });\n return function updateNwcConnectionBalance(_x3, _x4) {\n return _ref3.apply(this, arguments);\n };\n}();\nexport const encryptNwcConnection = /*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(function* (connection) {\n const encrypted = {\n id: yield this.encrypt(connection.id),\n name: yield this.encrypt(connection.name),\n connectionUrl: yield this.encrypt(connection.connectionUrl),\n walletPubkey: yield this.encrypt(connection.walletPubkey),\n relayUrl: yield this.encrypt(connection.relayUrl),\n secret: yield this.encrypt(connection.secret),\n createdAt: yield this.encrypt(connection.createdAt)\n };\n if (connection.lud16) {\n encrypted.lud16 = yield this.encrypt(connection.lud16);\n }\n if (connection.cachedBalance !== undefined) {\n encrypted.cachedBalance = yield this.encrypt(connection.cachedBalance.toString());\n }\n if (connection.cachedBalanceAt) {\n encrypted.cachedBalanceAt = yield this.encrypt(connection.cachedBalanceAt);\n }\n return encrypted;\n });\n return function encryptNwcConnection(_x5) {\n return _ref4.apply(this, arguments);\n };\n}();\nexport const decryptNwcConnection = /*#__PURE__*/function () {\n var _ref5 = _asyncToGenerator(function* (connection, withLockedVault = undefined) {\n if (typeof withLockedVault === 'undefined') {\n // Normal decryption with unlocked vault\n const decrypted = {\n id: yield this.decrypt(connection.id, 'string'),\n name: yield this.decrypt(connection.name, 'string'),\n connectionUrl: yield this.decrypt(connection.connectionUrl, 'string'),\n walletPubkey: yield this.decrypt(connection.walletPubkey, 'string'),\n relayUrl: yield this.decrypt(connection.relayUrl, 'string'),\n secret: yield this.decrypt(connection.secret, 'string'),\n createdAt: yield this.decrypt(connection.createdAt, 'string')\n };\n if (connection.lud16) {\n decrypted.lud16 = yield this.decrypt(connection.lud16, 'string');\n }\n if (connection.cachedBalance) {\n decrypted.cachedBalance = yield this.decrypt(connection.cachedBalance, 'number');\n }\n if (connection.cachedBalanceAt) {\n decrypted.cachedBalanceAt = yield this.decrypt(connection.cachedBalanceAt, 'string');\n }\n return decrypted;\n }\n // v2: Use pre-derived key\n if (withLockedVault.keyBase64) {\n const decrypted = {\n id: yield this.decryptWithLockedVaultV2(connection.id, 'string', withLockedVault.iv, withLockedVault.keyBase64),\n name: yield this.decryptWithLockedVaultV2(connection.name, 'string', withLockedVault.iv, withLockedVault.keyBase64),\n connectionUrl: yield this.decryptWithLockedVaultV2(connection.connectionUrl, 'string', withLockedVault.iv, withLockedVault.keyBase64),\n walletPubkey: yield this.decryptWithLockedVaultV2(connection.walletPubkey, 'string', withLockedVault.iv, withLockedVault.keyBase64),\n relayUrl: yield this.decryptWithLockedVaultV2(connection.relayUrl, 'string', withLockedVault.iv, withLockedVault.keyBase64),\n secret: yield this.decryptWithLockedVaultV2(connection.secret, 'string', withLockedVault.iv, withLockedVault.keyBase64),\n createdAt: yield this.decryptWithLockedVaultV2(connection.createdAt, 'string', withLockedVault.iv, withLockedVault.keyBase64)\n };\n if (connection.lud16) {\n decrypted.lud16 = yield this.decryptWithLockedVaultV2(connection.lud16, 'string', withLockedVault.iv, withLockedVault.keyBase64);\n }\n if (connection.cachedBalance) {\n decrypted.cachedBalance = yield this.decryptWithLockedVaultV2(connection.cachedBalance, 'number', withLockedVault.iv, withLockedVault.keyBase64);\n }\n if (connection.cachedBalanceAt) {\n decrypted.cachedBalanceAt = yield this.decryptWithLockedVaultV2(connection.cachedBalanceAt, 'string', withLockedVault.iv, withLockedVault.keyBase64);\n }\n return decrypted;\n }\n // v1: Use password (PBKDF2)\n const decrypted = {\n id: yield this.decryptWithLockedVault(connection.id, 'string', withLockedVault.iv, withLockedVault.password),\n name: yield this.decryptWithLockedVault(connection.name, 'string', withLockedVault.iv, withLockedVault.password),\n connectionUrl: yield this.decryptWithLockedVault(connection.connectionUrl, 'string', withLockedVault.iv, withLockedVault.password),\n walletPubkey: yield this.decryptWithLockedVault(connection.walletPubkey, 'string', withLockedVault.iv, withLockedVault.password),\n relayUrl: yield this.decryptWithLockedVault(connection.relayUrl, 'string', withLockedVault.iv, withLockedVault.password),\n secret: yield this.decryptWithLockedVault(connection.secret, 'string', withLockedVault.iv, withLockedVault.password),\n createdAt: yield this.decryptWithLockedVault(connection.createdAt, 'string', withLockedVault.iv, withLockedVault.password)\n };\n if (connection.lud16) {\n decrypted.lud16 = yield this.decryptWithLockedVault(connection.lud16, 'string', withLockedVault.iv, withLockedVault.password);\n }\n if (connection.cachedBalance) {\n decrypted.cachedBalance = yield this.decryptWithLockedVault(connection.cachedBalance, 'number', withLockedVault.iv, withLockedVault.password);\n }\n if (connection.cachedBalanceAt) {\n decrypted.cachedBalanceAt = yield this.decryptWithLockedVault(connection.cachedBalanceAt, 'string', withLockedVault.iv, withLockedVault.password);\n }\n return decrypted;\n });\n return function decryptNwcConnection(_x6) {\n return _ref5.apply(this, arguments);\n };\n}();\nexport const decryptNwcConnections = /*#__PURE__*/function () {\n var _ref6 = _asyncToGenerator(function* (connections, withLockedVault = undefined) {\n const decryptedConnections = [];\n for (const connection of connections) {\n const decryptedConnection = yield decryptNwcConnection.call(this, connection, withLockedVault);\n decryptedConnections.push(decryptedConnection);\n }\n return decryptedConnections;\n });\n return function decryptNwcConnections(_x7) {\n return _ref6.apply(this, arguments);\n };\n}();","map":null,"metadata":{},"sourceType":"module","externalDependencies":[]}