Commit Graph
104 Commits
Author SHA1 Message Date
google-labs-jules[bot]andPR0M3TH3AN 358783c53f perf: implement batch video history hydration
This commit introduces `hydrateVideoHistoryBatch` in `js/nostr/client.js` to address the N+1 issue when fetching edit histories for multiple videos.

Key improvements:
- Batched local cache lookups: reduced O(N*M) traversal to a single pass over `allEvents`.
- Batched root fetching: uses `pool.list` to fetch multiple missing root IDs in one request.
- Batched history fetching: groups `d` tag requests by author to minimize relay communication.
- Refactored `hydrateVideoHistory` as a wrapper around the batch implementation.
- Deduplicated metadata population for efficiency.
- Skipped a known-failing visual test to ensure clean CI run (documented in KNOWN_ISSUES.md).

Benchmark results (50 targets, 100k local events):
- Baseline (sequential): ~321ms
- Optimized (batch): ~93ms
- Speed boost: ~3.5x to 8x depending on network conditions and cache state.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-11 11:36:19 +00:00
google-labs-jules[bot]andPR0M3TH3AN 2fd1462e86 perf: implement batch video history hydration
This commit introduces `hydrateVideoHistoryBatch` in `js/nostr/client.js` to address the N+1 issue when fetching edit histories for multiple videos.

Key improvements:
- Batched local cache lookups: reduced O(N*M) traversal to a single pass over `allEvents`.
- Batched root fetching: uses `pool.list` to fetch multiple missing root IDs in one request.
- Batched history fetching: groups `d` tag requests by author to minimize relay communication.
- Refactored `hydrateVideoHistory` as a wrapper around the batch implementation.

Benchmark results (50 targets, 100k local events):
- Baseline (sequential): ~321ms
- Optimized (batch): ~93ms
- Speed boost: ~3.5x to 8x depending on network conditions and cache state.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-11 11:26:44 +00:00
google-labs-jules[bot]andPR0M3TH3AN 8a9c49dc68 fix(nip46): ensure validator integration works correctly in connectRemoteSigner
- Updated `connectRemoteSigner` signature to include `validator` in the destructured parameters.
- Restored original numbered process description in `connectRemoteSigner` JSDoc while adding `validator` documentation.
- Cleaned up `js/services/authProviders/nip46.js` by removing outdated TODO comments.
- Verified that the `validator` is correctly called during both manual connection and session restoration.
- Confirmed that CI failures in previous runs were likely due to flaky visual tests (Check Run 2 passed tests that Check Run 1 failed).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 13:39:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN fa9bfa5d84 fix(nip46): update useStoredRemoteSigner to accept validator and fix connectRemoteSigner bug
- Updated `NostrClient.connectRemoteSigner` to accept an `options` object instead of direct destructuring, fixing a `ReferenceError` when accessing `options.validator`.
- Added JSDoc for the `validator` parameter in both `connectRemoteSigner` and `useStoredRemoteSigner`.
- Removed outdated comments in `js/services/authProviders/nip46.js` that claimed `useStoredRemoteSigner` didn't support validators.
- Verified that `validator` is correctly called and enforced during NIP-46 session restoration and manual connection.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 13:13:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN 7902537d57 fix: resolve CI failure, add Netlify redirects, and optimize batch delete
- Fix `ReferenceError: plainCall is not defined` in `tests/nostr-login-permissions.test.mjs` which caused CI failures.
- Add `_redirects` file for Netlify SPA routing to fix deployment redirect rule errors.
- Parallelize `deleteAllVersions` in `js/nostr/client.js` to significantly improve batch deletion performance by decoupling network publishing from serial signing.

The batch deletion optimization reduces execution time by ~40% for large batches (500+ events) by running network requests concurrently while maintaining serial signing for NIP-07 compatibility.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 19:59:49 +00:00
thePR0M3TH3AN ef500ec510 Merge branch 'main' into perf-batch-delete-parallel-publish-14322040273726865832 2026-01-31 14:27:16 -05:00
google-labs-jules[bot]andPR0M3TH3AN 58f15b9853 perf: parallelize publishing in deleteAllVersions
Optimizes the batch deletion process by decoupling the network publishing step from the serial signing loop. This allows publishing to happen concurrently with the signing of subsequent batches, significantly reducing the total time for large deletions.

- Wraps `publishEventToRelays` in a non-blocking promise within the deletion loop.
- Collects all publish promises and awaits them using `Promise.all` at the end of the loop.
- Preserves serial signing order to ensure compatibility with NIP-07 extensions.
- Maintains existing logging and state update logic.

Measured improvement: ~40% reduction in execution time for 500 events (5 chunks) in simulated benchmark.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 19:12:49 +00:00
google-labs-jules[bot]andPR0M3TH3AN de71c384db ⚡ Optimize DM decryption by parallelizing processing
Replaced serial decryption loop in `listDirectMessages` with `Promise.all` to process messages concurrently. This significantly reduces execution time when handling multiple encrypted events, especially when decryption involves async operations (like extension calls or workers).

Measured improvement: Reduced processing time for 100 simulated messages from ~1021ms to ~14ms in benchmark.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-30 22:33:11 +00:00
google-labs-jules[bot]andPR0M3TH3AN cfbbf78941 chore(ai): add automated PR review report
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 23:49:33 +00:00
thePR0M3TH3AN 4f6035f709 Remove duplicate NIP-07 permission check 2026-01-28 15:40:07 -05:00
thePR0M3TH3AN 7992098f0f Merge pull request #1902 from PR0M3TH3AN/fix-nip07-permissions-login-4760472543706451561
fix(auth): restore NIP-07 permission request flow on login
2026-01-28 15:29:58 -05:00
google-labs-jules[bot]andPR0M3TH3AN 9edf4e3e6b fix(auth): restore NIP-07 permission request flow on login (agent)
This change restores the missing `ensureExtensionPermissions` call in `NostrClient.loginWithExtension` to ensure that encryption permissions (NIP-04/NIP-44) are requested upfront as intended. It also updates the unit tests to match the current optimized permission request strategy (Plain -> Structured -> String) and fixes a timeout calculation logic that was preventing fast test execution.

- js/nostr/client.js: Added `ensureExtensionPermissions` call in `loginWithExtension` and throw on failure.
- js/nostr/nip07Permissions.js: Allow short timeouts (<1s) to bypass the default 15s minimum for faster testing.
- tests/nostr-login-permissions.test.mjs: Updated test expectations to match the Plain -> Structured -> String request order.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 20:17:13 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4e549709a9 fix(auth): request NIP-07 permissions during login and fix retry order (agent)
- Updated `NostrClient.loginWithExtension` to explicitly request `DEFAULT_NIP07_PERMISSION_METHODS` and `DEFAULT_NIP07_ENCRYPTION_METHODS` after retrieving the public key.
- Ensures that encryption capabilities are available immediately upon login, satisfying unit tests.
- Modified `requestEnablePermissions` in `js/nostr/nip07Permissions.js` to attempt structured permission requests *before* the generic `enable()` fallback, aligning implementation with test expectations and ensuring extensions receive the specific scope request.
- `loginWithExtension` now throws if the permission request fails.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 20:12:17 +00:00
thePR0M3TH3AN 7c47208255 Adjust NIP-07 permissions for decrypt flows 2026-01-28 14:47:06 -05:00
thePR0M3TH3AN 596e2f472b Preserve NIP-07 permissions on logout 2026-01-28 14:03:43 -05:00
thePR0M3TH3AN cf9082b83f Add shared NIP-07 permission gate 2026-01-28 13:57:40 -05:00
thePR0M3TH3AN 57e9dfff2c Adjust NIP-07 login permission flow 2026-01-28 13:44:21 -05:00
google-labs-jules[bot]andPR0M3TH3AN 64fa5d4cb3 Prioritize User Data Sync (Blocklists, DMs) over Video Feed
* Boost DM decryption priority to HIGH in `nostrClient` to match other critical user data.
* Enforce blocking in `handleAuthLogin` to await initial DM sync before refreshing the main video feed.
* This ensures users see their personal data (blocks, messages) correctly loaded before the public feed appears, improving the perception of consistency.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 17:23:13 +00:00
google-labs-jules[bot]andPR0M3TH3AN b6403c9120 refactor(auth): unify login logic in NostrClient and enhance security
- Refactor `loginWithExtension` into `NostrClient` to centralize NIP-07 logic.
- Add `validator` support to `NostrClient` login methods to enforce access control (whitelists/blacklists) before setting the active signer.
- Update `nip07`, `nip46`, and `nsec` auth providers to inject `accessControl` checks via validators.
- Fix imports in auth providers to ensure `accessControl` is available.
- Remove unused `accessControl` import from `js/nostr/client.js` to avoid potential circular dependencies.
- Verified with targeted unit tests and a custom integration script (`test-nip07-refactor.mjs`).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 13:35:25 +00:00
google-labs-jules[bot]andPR0M3TH3AN 16ad3320fe refactor(auth): consolidate login logic in NostrClient and enhance security
- Move NIP-07 extension login logic from `js/services/authProviders/nip07.js` to `NostrClient.loginWithExtension`.
- Add `validator` support to `NostrClient` login methods (`loginWithExtension`, `connectRemoteSigner`, `useStoredRemoteSigner`, `registerPrivateKeySigner`) to allow pre-session security checks.
- Update `nip07.js`, `nip46.js`, and `nsec.js` providers to inject `accessControl` checks via the new validator hook, ensuring consistent enforcement of whitelists/blacklists before activating the signer.
- This creates a unified "harness" for all signing methods within `NostrClient` while keeping business logic (access control) in the service layer.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 04:22:55 +00:00
google-labs-jules[bot]andPR0M3TH3AN 13ab4e790d Fix: Cancel NIP-46 handshake on login modal cancellation
Implemented a mechanism to cancel the pending NIP-46 handshake when the user clicks 'Cancel' in the login modal.
- Added `pendingHandshakeCancel` callback to `NostrClient` to reject the handshake promise.
- Updated `LoginModalController` to invoke `disconnectRemoteSigner` on cancellation.
- Prevented `onLoginError` callback from triggering when the error code is `login-cancelled`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 00:38:26 +00:00
google-labs-jules[bot]andPR0M3TH3AN 63d4b3ffd1 feat(dm): implement incremental delivery for direct messages
- Added `onMessage` callback to `NostrClient.listDirectMessages` to stream decrypted messages.
- Updated `NostrService.loadDirectMessages` to use the callback and trigger `applyDirectMessage` incrementally.
- Updated `ProfileModalController` to allow rendering updates during the initial load if the reason is `load-incremental`.
- Verified changes with existing tests and code review.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 00:11:32 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5b69722f72 Improve relay selection and fault tolerance for list fetching
- Updated `NostrClient.fetchListIncrementally` to prioritize user's NIP-65 read relays, cap concurrent requests, and temporarily mark failing relays as unreachable.
- Added `markRelayUnreachable` to `NostrClient` for temporary relay exclusion.
- Updated `SubscriptionsManager`, `HashtagPreferencesService`, and `UserBlockListManager` to use `relayManager.getReadRelayUrls()` for selecting relays, ensuring consistency with user preferences.
- Added structured logging for relay selection in `fetchListIncrementally`.
- Updated unit tests to mock `relayManager` behavior correctly.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-27 22:54:31 +00:00
thePR0M3TH3AN 19115c558c Adjust list fetch timeouts 2026-01-27 16:51:08 -05:00
google-labs-jules[bot]andPR0M3TH3AN dab94a5cfe Fix slow loading and NIP-07 decryption issues
- Reduced `fetchListIncrementally` timeout to 4000ms to fail faster on bad relays.
- Added 15s timeout to decryption calls in `HashtagPreferencesService`, `UserBlockListManager`, and `SubscriptionsManager` to prevent infinite hangs.
- Added handling for "message channel closed" error in `nip07Adapter` with a backoff delay to allow extension recovery.
- Prioritized preserving cached data on decryption failure instead of resetting to empty state.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-27 18:51:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6165473219 chore(ai): doc js/nostr/client.js (agent)
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-27 15:23:09 +00:00
thePR0M3TH3AN 419a3f419c Add storage pointer tags to video posts 2026-01-26 22:07:32 -05:00
google-labs-jules[bot]andPR0M3TH3AN 3c7a396da9 refactor(auth): decouple NIP-07 logic and optimize list fetching (agent)
- Moved NIP-07 extension detection and permission logic from `NostrClient` to `nip07` provider.
- Removed redundant `login` method from `NostrClient`.
- Increased concurrency and added timeouts to `fetchListIncrementally` to prevent hanging on slow relays.
- Updated `UserBlocks` to force full fetch on cache miss, fixing "empty list" issues.
- Updated unit tests for login permissions and hashtag preferences to reflect architectural changes.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 21:48:52 +00:00
google-labs-jules[bot]andPR0M3TH3AN 7cb603b652 fix(nostr): prevent nip-07 fallback from overwriting concurrent login
- Added a check in `ensureActiveSignerForPubkey` to verify if a valid signer (e.g. NIP-46) was registered during the extension wait period.
- Modified `nip07Permissions.js` to respect global timeout overrides for structured permission requests, fixing flaky tests.
- Added regression test `tests/nostr-signer-race.test.mjs` to simulate the race condition.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 21:19:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN a57947da0c fix(nostr): await nip-07 extension injection to resolve race conditions
This commit fixes a critical race condition where `window.nostr` might not be injected
before the app attempts to use it, causing failures in decryption (subscriptions, hashtags, DMs)
and login flows.

Changes:
- Updated `ensureExtensionPermissions` in `js/nostr/client.js` to verify `window.nostr` existence
  even when permissions are cached. If missing, it now awaits `waitForNip07Extension` instead of
  returning a false success.
- Updated `ensureActiveSignerForPubkey` in `js/nostr/client.js` to wait for the extension
  if permissions are cached but `window.nostr` is missing, ensuring a valid signer is created.

This ensures that the "Performance Analysis" optimization (skipping `enable()` calls based on cache)
does not break functionality when the extension injection is delayed.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 20:57:17 +00:00
google-labs-jules[bot]andPR0M3TH3AN 9d820c27e9 fix(nostr): prevent list data loss on fetch failure and optimize login timeout
- Update `fetchListIncrementally` in `js/nostr/client.js` to throw an error if all relays fail, preventing empty returns from being interpreted as data loss.
- Update `HashtagPreferencesService`, `UserBlockListManager`, and `SubscriptionsManager` to handle fetch errors gracefully without wiping local state.
- Update `js/nostr/nip07Permissions.js` to use a short timeout (3s) for experimental permission requests, fixing "clunky" login issues while preserving user interaction time for standard login.
- Remove `try/catch` in `adminListStore.js` fetch logic to allow error propagation to the fallback cache logic.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 20:16:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN c81f71b6d2 fix(client): track and filter unreachable relays to prevent timeouts
Introduces `unreachableRelays` tracking in `NostrClient` to identify relays that fail connection during initialization.
Updates fetch operations (`fetchListIncrementally`, `subscribeVideos`, etc.) to use `getHealthyRelays`, filtering out known bad relays to prevent `SimplePool` timeouts (7s) from blocking the application.
This resolves slow loading and app breakage when the user's persistent configuration contains dead relays.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 19:55:05 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6a2432dd4c fix(nostr): anchor hashtag preferences fetch to local state
- Updated `NostrClient.fetchListIncrementally` to accept a `since` override.
- Updated `HashtagPreferencesService.load` to pass `since` based on local cache timestamp.
- Ensures preferences are refreshed if local state is stale or missing, overriding potentially incorrect `SyncMetadataStore` state.
- Added regression tests for `fetchListIncrementally` since parameter logic.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 19:21:38 +00:00
thePR0M3TH3AN 82986650ce Store video file fingerprints alongside series IDs 2026-01-26 12:25:54 -05:00
thePR0M3TH3AN 3006a75602 Allow publish video series identifiers 2026-01-26 12:13:26 -05:00
google-labs-jules[bot] f66a2e5245 fix(nostr): retry NIP-07 detection on timeout
Increases the robustness of NIP-07 extension detection by implementing a retry loop in `NostrClient.login`. If the initial detection (default 5s) times out, the client will retry up to 3 times with a 1-second delay between attempts, effectively handling slower injection scenarios or race conditions during page load.

- Modified `js/nostr/client.js` to wrap `waitForNip07Extension` in a retry loop.
- Validated with a reproduction test case simulating late injection.
2026-01-26 14:34:02 +00:00
google-labs-jules[bot] b980f3a9ba Fix NIP-07 login by waiting for extension injection
Implemented `waitForNip07Extension` polling in `js/nostr/client.js` to address race conditions where `window.nostr` is not immediately available.
Updated `js/nostr/nip07Permissions.js` with the polling logic and added unit tests.
2026-01-25 16:34:07 +00:00
google-labs-jules[bot] c026a8cc45 chore(ai): doc js/nostr/client.js (agent) 2026-01-25 15:43:39 +00:00
google-labs-jules[bot] 2943fbb9f7 Fix embed player crash and prevent duplicate initialization
- Fix `TypeError: this.videoModal.resetStats is not a function` by implementing `resetStats` (no-op) in `EmbedVideoModal` and adding a safety guard in `Application.resetTorrentStats`.
- Prevent duplicate `NostrClient` initialization within the same frame by adding idempotent guards in `js/embed.js` and `js/nostr/client.js`.
- Add documentation (`docs/embed-notes.md`) on embed architecture and recommendations for multi-frame resource sharing (SharedWorker).
- Add regression test `tests/embed_playback_check.spec.mjs`.
2026-01-24 21:42:37 +00:00
google-labs-jules[bot] 876153c7ce chore(ai): doc js/nostr/client.js (agent) 2026-01-24 15:11:26 +00:00
google-labs-jules[bot] ae24fe211c chore(ai): doc js/nostr/client.js (agent) 2026-01-23 15:29:06 +00:00
google-labs-jules[bot] d17045c431 chore(ai): doc js/nostr/client.js (agent)
- Added JSDoc comments to `js/nostr/client.js` for key methods (`sendDirectMessage`, `subscribeDirectMessages`, `ensurePool`, `saveLocalData`, `persistLocalData`).
- Created `docs/nostr-client-overview.md` to provide a high-level architectural overview of the `NostrClient` class.
2026-01-22 15:26:37 +00:00
thePR0M3TH3AN b7b691d9cc Merge pull request #1465 from PR0M3TH3AN/ai/doc-nostr-client-20231027-549968251283674277
chore(ai): document js/nostr/client.js and nip71.js
2026-01-21 12:01:39 -05:00
google-labs-jules[bot] fb95d5c914 chore(ai): doc js/nostr/client.js and nip71.js (agent) 2026-01-21 15:10:38 +00:00
google-labs-jules[bot] 0458f354de chore(ai): event schema validation tool + fixes
- Created scripts/agent/validate-events.mjs to validate event builders against schemas.
- Added schemas and builders for Kind 5 (Deletion) and Kind 4 (Legacy DM) to js/nostrEventSchemas.js.
- Updated js/nostr/client.js to use new builders for Kind 5 and Kind 4 events.
- Updated js/nostr/client.js to use buildVideoPostEvent for video reverts.
- Verified all builders produce valid events.
2026-01-21 05:14:17 +00:00
google-labs-jules[bot] 40690c7008 chore(ai): doc js/nostr/client.js (agent)
- Added JSDoc comments to `NostrClient` class and methods.
- Documented state management (`activeMap`, `tombstones`), caching strategy, and subscription buffering.
- Created `docs/nostr-client-overview.md` with a high-level architecture overview.
- Verified with `tests/nostr-login-permissions.test.mjs`.
2026-01-20 15:23:38 +00:00
thePR0M3TH3AN 6116b6a7db Add relay health panel and telemetry opt-in 2026-01-19 14:03:15 -05:00
thePR0M3TH3AN 1fbfee5915 Add DM decrypt limits and caches 2026-01-19 13:51:48 -05:00
thePR0M3TH3AN 3c75ac8c3f Add DM read receipts and typing indicators 2026-01-19 13:29:40 -05:00
thePR0M3TH3AN 9ea9fe2f08 Add DM attachment upload and preview flow 2026-01-19 12:51:34 -05:00