Commit Graph
1808 Commits
Author SHA1 Message Date
thePR0M3TH3AN 9caef9f63b Merge pull request #2101 from PR0M3TH3AN/perf-profile-cache-optimization-1904566817068160104
⚡ Optimize ProfileCache memory clearing to O(1)
2026-02-05 14:25:02 -05:00
google-labs-jules[bot]andPR0M3TH3AN ecc9041cbd perf: optimize ProfileCache.clearMemoryCache to O(1)
Refactor ProfileCache memoryCache from a flat Map to a nested Map (Pubkey -> Section -> Data).
This allows clearing a user's cache in O(1) time instead of O(N) by deleting the user's entry directly, avoiding a full scan of all cache keys.

Benchmark showed improvement from ~58ms to ~0.0014ms for clearing a user in a cache with 20,000 users (100,000 entries).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:18:36 +00:00
google-labs-jules[bot]andPR0M3TH3AN 981e0e5835 perf: optimize MMR sort complexity from O(N^3) to O(N^2)
- Introduce incremental similarity updates in `createExploreDiversitySorter`.
- Cache max similarity for each candidate to avoid redundant calculations.
- Reduces sort time for 1000 items from ~33s to ~170ms.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 19:17:16 +00:00
thePR0M3TH3AN a432d3d4c0 Merge pull request #2025 from PR0M3TH3AN/perf-batch-delete-parallel-publish-14322040273726865832
⚡ Parallelize publishing in batch delete
2026-01-31 15:03:02 -05: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 e3af6e140d Merge pull request #2024 from PR0M3TH3AN/perf/parallel-zap-retries-1778136069971316397
⚡ Parallelize Zap Retry Execution
2026-01-31 14:40:51 -05:00
google-labs-jules[bot]andPR0M3TH3AN 36ddbe7df2 fix: remove npx from build script
Use `tailwindcss` directly in the `build:css` script instead of `npx tailwindcss`. This ensures the local binary (installed in `node_modules/.bin`) is used, avoiding potential `npx` path resolution failures or network requests in restricted CI environments (like Netlify).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 19:28:27 +00:00
thePR0M3TH3AN a512f94023 Merge branch 'main' into perf/concurrent-feed-stages-16005048847337964150 2026-01-31 14:27:23 -05: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 c4b5f98bd7 perf: parallelize timestamp resolution in feed stages
Refactor `createResolvePostedAtStage` to execute timestamp resolution tasks concurrently using `Promise.allSettled` instead of a serial loop. This significantly reduces execution time when multiple items require resolution (e.g., waiting for network or async processing).

Benchmarks showed a reduction from ~1000ms to ~23ms for 50 items with a simulated 20ms delay each.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 19:18:54 +00:00
google-labs-jules[bot]andPR0M3TH3AN d3bdcc8011 fix(test): resolve ReferenceError in nostr login permissions test
Correctly destructure the `plainCall` variable in `tests/nostr-login-permissions.test.mjs` to prevent a ReferenceError during test execution. This ensures the test properly validates that the plain enable() fallback is not invoked when structured payloads fail.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 19:16:04 +00: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 19345e535e feat: parallelize zap retry execution
Optimize `executePendingRetry` in `js/channelProfile.js` to run zap attempts in parallel using `Promise.allSettled`, improving performance when retrying multiple shares.

Refactor `splitAndZap` in `js/payments/zapSplit.js` to accept `overrideFee` as an argument, eliminating reliance on a global variable and ensuring thread safety during parallel execution.

Update `js/ui/zapController.js` to use the new `splitAndZap` API.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 19:10:00 +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 10d628fe35 Fix ensureLoaded pubkey guard 2026-01-28 16:57:24 -05:00
thePR0M3TH3AN c14b29031c Handle empty block list when signed out 2026-01-28 16:49:31 -05: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
thePR0M3TH3AN b9f01e3f74 Merge pull request #1903 from PR0M3TH3AN/codex/add-fast-relays-for-initial-fetch
Fast-relay fast-path for subscription/hashtag/block list fetches with background full-relay fallback
2026-01-28 15:29:10 -05:00
thePR0M3TH3AN e4ad07b2cf Add fast relay fallback for list fetches 2026-01-28 15:28: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
thePR0M3TH3AN 5eb8ce9799 Merge pull request #1900 from PR0M3TH3AN/fix-nip07-permissions-17914553616063457773
fix(auth): request NIP-07 permissions during login and fix retry order
2026-01-28 15:16:48 -05:00
thePR0M3TH3AN dd9b9f1968 Defer login hydration loads 2026-01-28 15:15:52 -05: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 4fcb785f58 Adjust NIP-07 enable timeouts 2026-01-28 15:05:38 -05:00
thePR0M3TH3AN f0e27d175d Adjust NIP-07 timeouts and document overrides 2026-01-28 15:00:20 -05:00
thePR0M3TH3AN 7c47208255 Adjust NIP-07 permissions for decrypt flows 2026-01-28 14:47:06 -05:00
thePR0M3TH3AN c67bf61c50 Preload DM decryptor after NIP-07 login 2026-01-28 14:06:20 -05:00
thePR0M3TH3AN 596e2f472b Preserve NIP-07 permissions on logout 2026-01-28 14:03:43 -05:00
thePR0M3TH3AN 377564c53b Merge pull request #1893 from PR0M3TH3AN/codex/add-centralized-permission-gate
Add shared NIP-07 permission gate with memoized in-flight promise
2026-01-28 13:59:41 -05:00
thePR0M3TH3AN cf9082b83f Add shared NIP-07 permission gate 2026-01-28 13:57:40 -05:00
thePR0M3TH3AN e24207c12d Merge pull request #1892 from PR0M3TH3AN/ai/debug-frontend-20260128-16915912596521663527
fix(ai): frontend console error — ignore .torrent urls in probeUrl (agent)
2026-01-28 13:51:43 -05:00
google-labs-jules[bot]andPR0M3TH3AN 9f60eeaaf2 fix(ai): frontend console error — ignore .torrent urls in probeUrl (agent)
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 18:50:36 +00:00
thePR0M3TH3AN b48dd4a28e Adjust NIP-07 enable permission fallback 2026-01-28 13:47:19 -05:00
thePR0M3TH3AN 57e9dfff2c Adjust NIP-07 login permission flow 2026-01-28 13:44:21 -05:00
google-labs-jules[bot]andPR0M3TH3AN 90a74e7721 fix(perf): parallelize user data loading during NIP-07 login
Optimizes `handleAuthLogin` in `js/app.js` to run user data fetching (blocks, subscriptions, hashtag preferences) in the background instead of blocking the main UI render. This significantly improves perceived login speed, especially for users with large lists or slow NIP-07 extensions.

- Moves `userBlocks.seedWithNpubs` (which involves publishing) to background.
- Moves `subscriptions.ensureLoaded` and `hashtagPreferences.load` (which involve decryption) to background.
- Adds a race condition for `userBlocks.ensureLoaded` (read-only) with a short timeout to attempt early hydration without blocking indefinitely.
- Ensures the UI updates reactively when background data arrives via existing event listeners.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 18:02:37 +00: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
thePR0M3TH3AN a4c5afe699 Merge pull request #1887 from PR0M3TH3AN/ai/fuzz-robustness-20260128-5464314293176064392
Fuzz Testing Implementation and Robustness Fixes
2026-01-28 11:46:40 -05:00
google-labs-jules[bot]andPR0M3TH3AN 9f67b9e06b feat: add fuzz testing harnesses and fix crash in nostrEventSchemas
- Expand fuzzing coverage for `js/nostrEventSchemas.js` to include all builder functions.
- Fix a crash in `buildAdminListEvent` where non-array `hexPubkeys` caused a TypeError.
- Update `scripts/agent/fuzz-dmDecryptor.mjs` and `scripts/agent/fuzz-magnetUtils.mjs` iterations.
- Add reproducer for the `buildAdminListEvent` crash.
- Generate fuzz reports in `artifacts/`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 16:27:36 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5ae693acbd Prioritize user lists syncing during login
Prioritize fetching of block lists, subscriptions, and other user data before loading the main video feed during login.
- In `handleAuthLogin`, stop the existing video feed subscription immediately to free up bandwidth.
- Explicitly await `subscriptions.ensureLoaded(activePubkey)` alongside `userBlocks.seedWithNpubs` before triggering `refreshAllVideoGrids`.
This ensures user context is fully loaded before the heavy feed sync starts, addressing slow sync issues especially with NIP-07.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 16:20:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN e92c95995f feat: prioritize profile and feed data sync
- Implements a priority queue for NIP-07 (browser extension) requests to allow critical tasks (blocklist/prefs decryption) to jump the line.
- Updates NIP-46 client and adapters to support priority overrides for encryption/decryption.
- Updates UserBlockListManager, SubscriptionsManager, and HashtagPreferencesService to request HIGH priority when decrypting data.
- Ensures strict serialization for NIP-07 to prevent extension errors while optimizing latency for critical data.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 15:00:15 +00:00
google-labs-jules[bot]andPR0M3TH3AN 498909d60e fix(nostr): serialize nip-07 requests to prevent extension timeouts and crashes
Introduced a request queue in `js/nostr/nip07Permissions.js` to serialize all interactions with the NIP-07 extension (`window.nostr`).
Updated `js/userBlocks.js`, `js/services/hashtagPreferencesService.js`, and `js/auth/signingAdapter.js` to wrap direct extension calls with `runNip07WithRetry`, ensuring they participate in the queue.
This resolves "message channel closed" errors and timeouts caused by concurrent requests flooding the extension during sync operations.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 14:35:56 +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
thePR0M3TH3AN 9a88ab6a0a Merge pull request #1864 from PR0M3TH3AN/fix/nip46-cancel-handshake-5965467881028112501
Fix NIP-46 login cancellation hanging
2026-01-27 21:05:41 -05:00
google-labs-jules[bot]andPR0M3TH3AN 33a5f64c9f fix(nostr): ensure NIP-07 operations are retried on timeout
Previously, `runNip07WithRetry` cached the initial promise of a NIP-07 operation. If a request timed out (e.g., due to a dropped extension popup), the retry logic would re-await the same stale promise, causing the application to hang indefinitely instead of sending a new request.

This commit modifies `runNip07WithRetry` to invoke the operation factory function on every attempt, ensuring that retries generate fresh requests to the extension.

Fixes slow/stalled list syncing (hashtags, subscriptions) for users with NIP-07 extensions.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-28 00:50:00 +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 018fd6d599 refactor: update user block fetch logic to prioritize kind 10000 with d-tag
Changes `loadBlocks` to fetch `kind: 10000` with `d=user-blocks` instead of `kind: 30002` for block lists, while keeping the generic `kind: 10000` fetch for mute lists.
Updates `applyEvents` to separate block lists (tagged or legacy 30002) from mute lists (untagged 10000) and merge them instead of prioritizing one over the other.
Updates tests to reflect the merged behavior.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-27 23:59:58 +00:00