From af61906bff5aace06fca9ffe85f5949179ba6fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=E2=80=99Aquino?= Date: Wed, 23 Apr 2025 16:39:20 -0700 Subject: [PATCH 1/2] Use SimplePool instead of direct relay connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit changes web_auth.js to use `SimplePool` instead of direct relay objects, as recommended by the `nostr-tools` documentation, to handle relay connections more automatically and prevent issues such as errors due to the connection getting closed, or other such relay pool management responsibilities. Closes: https://github.com/damus-io/website/issues/42 Signed-off-by: Daniel D’Aquino --- package-lock.json | 19 ++++++++++--------- package.json | 2 +- src/index.js | 4 +++- src/web_auth.js | 21 ++++++++++----------- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index c76715e..ea90f65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "lmdb": "^2.9.1", "lnsocket": "^0.3.3", "nostr": "^0.2.8", - "nostr-tools": "^2.3.1", + "nostr-tools": "^2.12.0", "uuid": "^9.0.1", "ws": "^8.16.0" }, @@ -3855,9 +3855,10 @@ } }, "node_modules/nostr-tools": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.3.2.tgz", - "integrity": "sha512-8ceZ2ItkAGjR5b9+QOkkV9KWBOK0WPlpFrPPXmbWnNMcnlj9zB7rjdYPK2sV/OK4Ty9J3xL6+bvYKY77gup5EQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.12.0.tgz", + "integrity": "sha512-pUWEb020gTvt1XZvTa8AKNIHWFapjsv2NKyk43Ez2nnvz6WSXsrTFE0XtkNLSRBjPn6EpxumKeNiVzLz74jNSA==", + "license": "Unlicense", "dependencies": { "@noble/ciphers": "^0.5.1", "@noble/curves": "1.2.0", @@ -3867,7 +3868,7 @@ "@scure/bip39": "1.2.1" }, "optionalDependencies": { - "nostr-wasm": "v0.1.0" + "nostr-wasm": "0.1.0" }, "peerDependencies": { "typescript": ">=5.0.0" @@ -8617,9 +8618,9 @@ } }, "nostr-tools": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.3.2.tgz", - "integrity": "sha512-8ceZ2ItkAGjR5b9+QOkkV9KWBOK0WPlpFrPPXmbWnNMcnlj9zB7rjdYPK2sV/OK4Ty9J3xL6+bvYKY77gup5EQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.12.0.tgz", + "integrity": "sha512-pUWEb020gTvt1XZvTa8AKNIHWFapjsv2NKyk43Ez2nnvz6WSXsrTFE0XtkNLSRBjPn6EpxumKeNiVzLz74jNSA==", "requires": { "@noble/ciphers": "^0.5.1", "@noble/curves": "1.2.0", @@ -8627,7 +8628,7 @@ "@scure/base": "1.1.1", "@scure/bip32": "1.3.1", "@scure/bip39": "1.2.1", - "nostr-wasm": "v0.1.0" + "nostr-wasm": "0.1.0" } }, "nostr-wasm": { diff --git a/package.json b/package.json index d528c3f..62cff14 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "lmdb": "^2.9.1", "lnsocket": "^0.3.3", "nostr": "^0.2.8", - "nostr-tools": "^2.3.1", + "nostr-tools": "^2.12.0", "uuid": "^9.0.1", "ws": "^8.16.0" }, diff --git a/src/index.js b/src/index.js index f932abe..c9c0c8a 100755 --- a/src/index.js +++ b/src/index.js @@ -9,6 +9,7 @@ const express = require('express') const debug = require('debug')('api') const { PurpleInvoiceManager } = require('./invoicing') const { WebAuthManager } = require('./web_auth') +const { SimplePool } = require('nostr-tools/pool') const ENV_VARS = ["LN_NODE_ID", "LN_NODE_ADDRESS", "LN_RUNE", "LN_WS_PROXY", "DEEPL_KEY", "DB_PATH", "NOTEDECK_INSTALL_MD"] @@ -53,7 +54,8 @@ function PurpleApi(opts = {}) { this.invoice_manager = new PurpleInvoiceManager(this, process.env.LN_NODE_ID, process.env.LN_NODE_ADDRESS, process.env.LN_RUNE, process.env.LN_WS_PROXY) debug("loaded invoice-manager node_id:%s node_addr:%s rune:%s proxy:%s", process.env.LN_NODE_ID, process.env.LN_NODE_ADDRESS, process.env.LN_RUNE, process.env.LN_WS_PROXY) this.invoice_manager.connect_and_init() - this.web_auth_manager = new WebAuthManager(dbs) + this.pool = new SimplePool() + this.web_auth_manager = new WebAuthManager(dbs, this.pool) return this } diff --git a/src/web_auth.js b/src/web_auth.js index 552c554..8d0c0ed 100644 --- a/src/web_auth.js +++ b/src/web_auth.js @@ -5,9 +5,10 @@ const { nip04 } = require('nostr-tools') const { v4: uuidv4 } = require('uuid') const { current_time } = require('./utils') const { finalizeEvent } = require('nostr-tools/pure') -const { Relay, useWebSocketImplementation } = require('nostr-tools/relay') const { unauthorized_response } = require('./server_helpers') +const { useWebSocketImplementation } = require('nostr-tools/pool') useWebSocketImplementation(require('ws')) +const { SimplePool } = require('nostr-tools/pool') const DEFAULT_SESSION_EXPIRY = 60 * 60 * 24 * 7 // 1 week const DEFAULT_OTP_MAX_TRIES = 10 // 10 tries before an OTP is invalidated @@ -19,9 +20,11 @@ const DEFAULT_OTP_EXPIRY = 60 * 5 // 5 minutes class WebAuthManager { /** Initializes the WebAuthManager * @param {object} dbs - The PurpleApi dbs object + * @param {SimplePool} pool - The relay pool to use for sending events */ - constructor(dbs) { + constructor(dbs, pool) { this.dbs = dbs + this.pool = pool this.otp_max_tries = process.env.OTP_MAX_TRIES || DEFAULT_OTP_MAX_TRIES this.session_expiry = process.env.SESSION_EXPIRY || DEFAULT_SESSION_EXPIRY this.otp_expiry = process.env.OTP_EXPIRY || DEFAULT_OTP_EXPIRY @@ -63,14 +66,10 @@ class WebAuthManager { const signed_event = finalizeEvent(event, secret_key); - for (let relay_url of relays) { - try { - const relay = await Relay.connect(relay_url); - await relay.publish(signed_event); - relay.close(); - } catch (error) { - console.error(`Error sending OTP via relay ${relay_url}:`, error); - } + try { + await this.pool.publish(relays, signed_event) + } catch (error) { + console.error(`Error sending OTP:`, error); } } @@ -106,7 +105,7 @@ class WebAuthManager { // MARK: Utils /** - * Generates a random 6-digit OTP code + * Generates a random 6-digit OTP code * @returns {string} The generated OTP code */ random_otp() { From 38b30006a8c321dd49ac2cbf4b2b3ff1f220bd31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=E2=80=99Aquino?= Date: Wed, 23 Apr 2025 16:46:25 -0700 Subject: [PATCH 2/2] Fix missing env variable on tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel D’Aquino --- test/controllers/purple_test_controller.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/controllers/purple_test_controller.js b/test/controllers/purple_test_controller.js index 470cdce..1571de8 100644 --- a/test/controllers/purple_test_controller.js +++ b/test/controllers/purple_test_controller.js @@ -56,6 +56,7 @@ class PurpleTestController { process.env.SESSION_EXPIRY = 60*60*24*7 process.env.OTP_EXPIRY = 60*5 process.env.TESTFLIGHT_URL = "https://testflight.apple.com/join/abc123" + process.env.NOTEDECK_INSTALL_MD = "./notedeck-install-instructions.md" } setup_stubs() {