Commit Graph
279 Commits
Author SHA1 Message Date
google-labs-jules[bot]andPR0M3TH3AN fac5e00297 feat(perf): offload explore data computation to web worker
- Moved heavy tag counting and IDF calculation to `js/workers/exploreData.worker.js`.
- Extracted `collectVideoTags` to `js/utils/videoTags.js` (preserved original behavior).
- Extracted pointer normalization logic to `js/utils/pointerNormalization.js`.
- Refactored `js/services/exploreDataService.js` to use the worker.
- Added benchmark test `tests/benchmark-explore-data.spec.mjs`.

Measured Improvement:
- `buildTagIdf` execution time on main thread reduced from ~130ms blocking to ~0ms blocking (141ms total async time).
- Unblocks UI during periodic data refreshes.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 17:00:13 +00:00
google-labs-jules[bot]andPR0M3TH3AN 736ed3cbb1 Optimize collectVideoTags in ExploreDataService with WeakMap cache
- Implemented a module-level `WeakMap` to cache the results of `collectVideoTags` keyed by video object.
- This avoids repetitive tag parsing and normalization for the same video objects during `buildTagIdf` and `buildWatchHistoryTagCounts` cycles.
- Measured ~20% performance improvement on repeated calls in benchmark.
- Verified correctness with unit test covering cache hits and object mutations (simulated).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-03 16:49:49 +00:00
google-labs-jules[bot]andPR0M3TH3AN f77c89baf6 fix: ensure active feed refreshes when hashtag preferences change
* Update `refreshAllVideoGrids` in `js/app.js` to detect the currently active feed (For You, Kids, Explore, or Recent) and invoke the corresponding loader, preventing staleness when interacting with the UI.
* Refactor `HashtagPreferencesService` mutation methods (`addInterest`, etc.) to be `async` and await the `publish()` call, ensuring state is persisted before returning.
* Remove redundant `persistPreferencesFromMenu` call in `TagPreferenceMenuController`, relying on the service's internal persistence logic.
* Update unit tests for `HashtagPreferencesService` and `TagPreferenceMenuController` to align with the async behavior.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-03 01:55:21 +00:00
google-labs-jules[bot]andPR0M3TH3AN 1954739624 Fix NIP-07 decryption fallback and storage unlock issues
- Updated `StorageService` to check `signer.capabilities` before calling encryption methods, ensuring graceful fallback from NIP-44 to NIP-04.
- Updated `UserBlockList` to check `signer.capabilities` before registering decryptors, preventing "Decryption timed out" errors caused by queueing unsupported method calls.
- Fixed flakiness in `tests/user-blocks.test.mjs` by adding delays to allow background promises to settle between tests.
- Verified changes with reproduction test case and existing test suite.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-02 19:59:24 +00:00
google-labs-jules[bot]andPR0M3TH3AN 8383a4f18b Migrate user blocks to standard NIP-51 Mute List
- Updates `js/userBlocks.js` to treat Kind 10000 (standard Mute List) as the primary write target.
- Public mutes are stored in `p` tags, and private blocks are stored in encrypted content within the same event.
- Legacy `d=user-blocks` lists are still read for backward compatibility (preferring the newest event), but no longer written.
- Updates `js/nostrEventSchemas.js` to mark `USER_BLOCK_LIST` as legacy and standardise `MUTE_LIST`.
- Updates UI controllers (`MoreMenuController`, `ProfileModalController`) to use "Mute/Block List" terminology and delegate all mute/block actions to `userBlocks`.
- Updates `ModerationService` to delegate viewer mute operations to `userBlocks` and disable direct Kind 10000 publishing to prevent overwrites.
- Documentation updated in `docs/nostr-event-schemas.md`.
- Fixes regressions in `more-menu-controller.test.mjs`, `moderation-service.test.mjs`, `trusted-mute-lists.test.mjs`, and `user-blocks.test.mjs`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-01 21:47:29 +00:00
google-labs-jules[bot]andPR0M3TH3AN 32395e16a0 fix(playback): disable timeout for webtorrent-only sources
When a video has no fallback URL (CDN), the playback service now waits indefinitely for peers instead of timing out after 3 seconds. This prevents premature failures for WebTorrent-only content.

Ref: `js/services/playbackService.js`

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-01 20:08:42 +00:00
thePR0M3TH3AN 83dd3a9738 Add magnet webseeds to torrent fallback 2026-02-01 12:23:02 -05:00
google-labs-jules[bot]andPR0M3TH3AN 77cd03b2f7 Refactor DM loading to be opportunistic and serialize notification updates
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-01 15:47:54 +00:00
thePR0M3TH3AN daa9161f96 Merge branch 'unstable' into agent/automated-pr-review-fixes-3637557005884121646 2026-01-31 13:48:46 -05:00
thePR0M3TH3AN f58b9f709e Merge branch 'unstable' into ai/deps-safe-upgrades-3374834892089585189 2026-01-31 13:46:34 -05:00
google-labs-jules[bot]andPR0M3TH3AN f0606065c9 fix(ai): resolve test failures and permission regressions (agent)
- Fix flaky mock in `tests/hashtag-preferences.test.mjs` (limit mock responses to avoid timeouts)
- Fix timeout leak in `js/services/hashtagPreferencesService.js` (clear timeout on success)
- Update `nostrClient.loginWithExtension` to request full permissions (fixing `nostr-login-permissions.test.mjs`)
- Ensure `jsdom` is available for `channel-profile-moderation.test.mjs`

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 15:53:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 76a90a1a62 chore(ai): safe dependency upgrades and test fixes
- Upgrade playwright to 1.58.1 and autoprefixer to 10.4.24
- Fix permission caching in client.js
- Improve test robustness for hashtag preferences
- Add dependency scan artifacts
- Document deferred upgrades

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 15:46:06 +00:00
google-labs-jules[bot]andPR0M3TH3AN 2c87b94b62 fix(tests): resolve hashtag preferences unit test failure
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 09:50:04 +00:00
google-labs-jules[bot]andPR0M3TH3AN e027e6bba3 chore(ai): CI health fixes (flaky tests)
- Fix flaky `tests/hashtag-preferences.test.mjs` by correcting mock implementation for `fetchListIncrementally`.
- Fix `tests/nostr-login-permissions.test.mjs` failure by requesting correct permissions in `js/nostr/client.js`.
- Fix 90s timeout in `HashtagPreferencesService` by clearing the timeout timer upon successful decryption.
- `npm install` was run to ensure dependencies like `jsdom` are present for `tests/app/channel-profile-moderation.test.mjs`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-31 03:08:33 +00:00
thePR0M3TH3AN 7ef420e1e2 Defer block list permission prompts during login 2026-01-30 15:53:57 -05:00
thePR0M3TH3AN acf73bc5a3 Add permission CTA for subscriptions and hashtags 2026-01-30 15:39:52 -05:00
google-labs-jules[bot]andPR0M3TH3AN fdc070479b Optimize post-login sequence to load relays before other data
Prioritizes fetching the user's relay list (NIP-65) immediately after login, ensuring that subsequent data fetches (profile, contact list, DMs, feed) utilize the user's preferred relays instead of default ones. This prevents "slow" or incomplete data loading issues caused by relying on defaults.

- Refactored `authService.applyPostLoginState` to sequence relay loading before profile/block loading.
- Refactored `app.handleAuthLogin` to await relay loading before initiating dependent fetches (Hashtags, Moderation, DMs, NWC, Lists, Feed).
- Updated unit tests in `tests/auth-service.test.mjs` to verify sequential execution and correct return values.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-30 16:34:12 +00:00
thePR0M3TH3AN 09c0ac8127 Add relay health summary banner 2026-01-30 11:08:02 -05:00
thePR0M3TH3AN 5a5fd50641 Improve relay sanitization and health checks 2026-01-30 10:48:28 -05:00
thePR0M3TH3AN 035291bfa6 Merge pull request #1977 from PR0M3TH3AN/perf/optimize-critical-paths-3892933543654891645
Optimize critical performance paths to prevent high CPU/GPU usage
2026-01-30 10:29:47 -05:00
thePR0M3TH3AN abdfa4b68b Defer NIP-07 encryption permissions 2026-01-30 10:29:00 -05:00
google-labs-jules[bot]andPR0M3TH3AN a0f893ace6 perf: optimize critical rendering and data processing paths
- Refactor `AmbientBackground` to use `ResizeObserver` instead of polling layout in animation loop.
- Implement async chunking for `ExploreDataService` to prevent main thread blocking during heavy calculations.
- Throttle `UrlHealthController` video probes to a maximum of 3 concurrent requests to prevent resource exhaustion.
- Document optimization tasks in `OPTIMIZATION_TASKS.md`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-30 15:27:25 +00:00
thePR0M3TH3AN 2007e53b39 Add probe caching and dedupe for playback 2026-01-30 10:11:31 -05:00
thePR0M3TH3AN f0f36e7c7b Merge cached profile and DM data safely 2026-01-29 19:01:11 -05:00
thePR0M3TH3AN a196e95127 Centralize relay list subscriptions 2026-01-29 16:32:11 -05:00
thePR0M3TH3AN 1642b787ec Reset caches on logout 2026-01-29 15:54:44 -05:00
thePR0M3TH3AN aad2fe465a Tier login hydration and trim DM fetch 2026-01-29 15:43:34 -05:00
thePR0M3TH3AN 57d68846d1 Merge paged DM results into cache 2026-01-29 15:33:03 -05:00
thePR0M3TH3AN 89b8d124fa Consolidate profile metadata fetches 2026-01-29 15:25:08 -05:00
thePR0M3TH3AN 379287c87c Defer subscription and hashtag decrypt prompts 2026-01-29 13:08:35 -05:00
thePR0M3TH3AN 95dc380f54 Emit post-login hydration events 2026-01-29 12:40:50 -05:00
thePR0M3TH3AN fc95cd30ee Add DM relay fallback on discovery errors 2026-01-29 11:07:09 -05:00
thePR0M3TH3AN 1c51b29702 Improve media failure messaging and fallbacks 2026-01-29 10:40:01 -05:00
thePR0M3TH3AN c3e986c9d3 Improve relay hygiene and count status 2026-01-29 09:58:35 -05: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 e4ad07b2cf Add fast relay fallback for list fetches 2026-01-28 15:28:58 -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
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 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 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 39d1eda058 feat(services): add window.nostr fallback for hashtag preference decryption
This commit updates `HashtagPreferencesService.decryptEvent` to register and utilize decryption methods from `window.nostr` (NIP-04 and NIP-44) as a fallback mechanism. This ensures that users without an active internal signer (e.g., read-only or extension-only users) can still decrypt their preferences if they have granted permission to the extension.

- Mirrors the decryption logic from `UserBlockListManager` (`js/userBlocks.js`).
- Adds logging for fallback attempts and failures.
- Preserves existing scheme selection logic (`determineDecryptionOrder`).
- Adds new test cases to `tests/hashtag-preferences.test.mjs` verifying fallback behavior when the active signer is missing or incapable.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-27 23:46:23 +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 73f8be6c15 Adjust decrypt timeout retries 2026-01-27 17:05:18 -05:00
thePR0M3TH3AN 19115c558c Adjust list fetch timeouts 2026-01-27 16:51:08 -05:00
thePR0M3TH3AN 405aca03cb Adjust relay fallback for hashtag preferences 2026-01-27 16:34:04 -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
thePR0M3TH3AN 419a3f419c Add storage pointer tags to video posts 2026-01-26 22:07:32 -05:00
thePR0M3TH3AN ee31e4318a Compute upload identifiers before building R2 keys 2026-01-26 21:43:39 -05:00