Commit Graph
2011 Commits
Author SHA1 Message Date
google-labs-jules[bot]andPR0M3TH3AN 12ba9f07e6 chore: remove dead code and unused promises in Application.init
Removes commented-out `await Promise.all` and refactors the associated
`accessControlPromise` and `adminPanePromise` variables in `js/app.js`.

The promises were only assigned for use in the commented-out line.
This change:
- Converts `accessControl.refresh()` to a direct expression statement.
- Simplifies `adminPanePromise` logic into a direct `if` block, removing
  the unnecessary `else { Promise.resolve(null) }` branch.
- Preserves the existing fire-and-forget behavior for these initialization tasks.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 23:56:45 +00:00
thePR0M3TH3AN c539fef553 Merge pull request #2183 from PR0M3TH3AN/jules-fix-unused-import-appjs-3659969045676148831
chore(js): remove unused splitAndZap import in app.js
2026-02-07 17:40:17 -05:00
google-labs-jules[bot]andPR0M3TH3AN 31dc297991 chore(js): remove unused splitAndZap import in app.js
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 22:14:19 +00:00
thePR0M3TH3AN 2c5fb67985 Merge pull request #2182 from PR0M3TH3AN/refactor/feed-types-constants-7142050680573542479
🧹 Refactor hardcoded feed identifiers to constants
2026-02-07 17:03:10 -05:00
google-labs-jules[bot]andPR0M3TH3AN a829cd95ca Refactor hardcoded feed identifiers to use constants
Introduced FEED_TYPES constants in js/constants.js and updated js/app/authSessionCoordinator.js, js/hashChangeHandler.js, js/viewManager.js, and js/app/feedCoordinator.js to use them. This improves maintainability and reduces the risk of typos in feed view names.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 21:59:37 +00:00
thePR0M3TH3AN 38f63e5851 Merge pull request #2181 from PR0M3TH3AN/refactor/deduplicate-hex64-regex-4819369490365472168
🧹 Refactor: Deduplicate HEX64_REGEX constant
2026-02-07 16:57:49 -05:00
google-labs-jules[bot]andPR0M3TH3AN a084bb59de refactor: deduplicate HEX64_REGEX to js/utils/hex.js
Moves the repeatedly defined HEX64_REGEX constant to a shared utility
module to improve maintainability and consistency. Updates all consumers
to import from the new location.

Signed-off-by: Jules <[email protected]>

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 21:52:51 +00:00
thePR0M3TH3AN 4c30228fad Merge pull request #2180 from PR0M3TH3AN/chore-remove-unused-nip46-constants-17069818061582667621
🧹 Remove unused NIP-46 constants exports
2026-02-07 16:49:29 -05:00
google-labs-jules[bot]andPR0M3TH3AN 314cf01ac1 chore: remove unused NIP-46 constants exports
Removed `export` from `NIP46_SESSION_STORAGE_KEY`, `NIP46_PUBLISH_TIMEOUT_MS`, `NIP46_RESPONSE_TIMEOUT_MS`, `NIP46_SIGN_EVENT_TIMEOUT_MS`, and `NIP46_MAX_RETRIES` in `js/nostr/nip46Client.js` as they are only used internally.
Updated `js/nostr/client.js` to remove unused imports of these constants.
Verified that `NIP46_HANDSHAKE_TIMEOUT_MS` and `NIP46_AUTH_CHALLENGE_MAX_ATTEMPTS` are used in `js/nostr/client.js` and thus remain exported.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 21:45:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5f12eadd4d chore: remove unused MAX_WALLET_DEFAULT_ZAP import from app.js
Removes the unused `MAX_WALLET_DEFAULT_ZAP` import from `js/app.js` to improve code health and reduce confusion. This variable was imported from `config.js` but never used within `app.js`.

Verification:
- Confirmed `MAX_WALLET_DEFAULT_ZAP` is not present in `js/app.js`.
- Ran `tests/app/is-user-logged-in.test.mjs` to ensure `js/app.js` still loads and functions correctly.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 21:42:58 +00:00
thePR0M3TH3AN 6c57794aa2 Merge pull request #2172 from PR0M3TH3AN/fix-known-issues-20260207-9290030417190436591
fix(tests): remediate known issues in LoginModal and VideoCard tests
2026-02-07 16:34:07 -05:00
google-labs-jules[bot]andPR0M3TH3AN cc9064617e fix(tests): remediate known issues in LoginModal and VideoCard tests
- Fix `LoginModalController` async activity leak by binding `setTimeout` to `this.window`.
- Fix `VideoCard` moderation test by explicitly updating `ModerationDecorator` settings.
- Verify `popover.spec.ts` issue persists and update `KNOWN_ISSUES.md`.
- Update `KNOWN_ISSUES.md` to reflect fixes and current status.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 18:36:41 +00:00
google-labs-jules[bot]andPR0M3TH3AN 2320887665 perf: optimize createExploreDiversitySorter with inverted index
- Implements an Inverted Index to reduce redundant similarity checks.
- Replaces O(N) array splice with O(1) Map deletion for candidate tracking.
- Reduces runtime from ~3.5s to ~0.9s for 5000 items (3.9x speedup).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 16:55:05 +00:00
Claude 71c153f68d perf: speed up post-login list sync with shared decryption cache
Three performance bottlenecks were causing slow list loading after NIP-07 login:

1. Each list service (blocks, subscriptions, hashtag preferences) maintained
   its own isolated decryptionSuccessCache. When blocks decrypted with nip44_v2,
   subscriptions and hashtag preferences had no way to know — they each had to
   independently probe all schemes through the NIP-07 extension queue, tripling
   the number of extension calls during the critical login path.

2. List loading was gated on both relaysReadyPromise AND permissionPromise in
   the coordinator. Since the NIP-07 extension already grants decrypt permissions
   during loginWithExtension(), the redundant pre-grant was adding 2-5 seconds
   of unnecessary latency before any list fetching could begin.

3. The DECRYPT_RETRY_DELAY_MS was 10 seconds across all services. When a decrypt
   attempt failed transiently (extension still initializing), the retry waited
   far too long before trying again.

Changes:
- Create shared decryptionSchemeCache module used by all three list services
- Add fast-path: when shared cache knows the correct scheme, try ONLY that
  scheme before falling back to parallel Promise.any() probe
- Remove permissionPromise from the list-loading gate in authSessionCoordinator
- Reduce DECRYPT_RETRY_DELAY_MS from 10s to 3s in all three services
- Clear shared cache on logout

https://claude.ai/code/session_013QrGMnxtMTsGTPqaP35jMj
2026-02-07 13:43:15 +00:00
Claude 1403d2d4cc fix: handle permission-required errors in hashtag preferences background loading
When hashtag preferences decryption fails with "permission-required" during
background loading (allowPermissionPrompt=false), the service silently returned
without setting loaded state, scheduling a retry, or emitting a change event.
This left the UI stuck showing empty hashtag lists. The subscriptions module
already handled this case correctly.

Also fix error scheme mapping in Promise.any() catch blocks for both hashtag
preferences and subscriptions — the index into the original order array was
wrong after filtering out deduplicated scheme families.

https://claude.ai/code/session_016xYxLQ1U2XVVY5rFuCRKfc
2026-02-07 05:42:24 +00:00
Claude 47e900ebef perf: speed up nostr login by parallelizing list sync and decryption
Login with NIP-07 extensions was extremely slow because list loading
(blocks, subscriptions, hashtag preferences) happened sequentially and
each list's decryption tried encryption schemes one at a time.

Changes:
- Load blocks, subscriptions, and hashtags in parallel instead of
  sequentially (blocks no longer blocks other lists from starting)
- Use Promise.any() to try all decryption schemes simultaneously
  instead of trying nip44_v2 → nip44 → nip04 one-by-one
- Deduplicate same-family schemes (nip44/nip44_v2) to avoid redundant
  extension calls
- Increase NIP-07 request queue concurrency from 3 to 5 to support
  parallel decrypt operations during login
- Raise no-prompt decrypt timeout from 3s/5s to 8s since extensions
  that have already granted permission still need time to decrypt
- Increase feed sync timeout from 8s to 12s to give lists more time
  to settle before rendering unfiltered content

https://claude.ai/code/session_01V6m1gTecsppPrBHQnUyPnF
2026-02-06 22:23:46 +00:00
Claude 3a55e1bf03 fix: resolve coordinator refactoring regressions breaking DM, lists, and feed pipeline
- Remove undefined hashtagPreferencesPromise reference in handleAuthLogin
  that caused the feed sync Promise.allSettled to silently fail, preventing
  proper list/profile synchronization before grid refresh
- Add missing getModerationSettings and getActiveProfilePubkey dependency
  injection to authSessionCoordinator, fixing crashes during logout
  moderation reset and profile switch pubkey resolution
- Parallelize NIP-07 permission request with relay readiness instead of
  gating list loading behind it; parallelize subscriptions and hashtag
  preference loading (independent of each other, only blocks must sequence)
- Add native run() alias to feedEngine so callers don't rely solely on
  the applicationBootstrap compatibility shim
- Remove redundant refreshVisibleModerationUi call from renderVideoList
  that re-decorated every video immediately after decoration
- Avoid re-normalizing moderation settings on every getActiveModerationThresholds
  call when settings are already an object

https://claude.ai/code/session_01FCosieUXjEn95KtUeyGemY
2026-02-06 21:42:49 +00:00
Claude 41a12669f6 refactor: extract Application method clusters into coordinator modules
Move cohesive method groups out of the monolithic Application class
(js/app.js, ~10K lines) into five coordinator modules under js/app/:

- feedCoordinator: feed registration, runtime building, refresh,
  video loading, URL-health helpers, and feed telemetry
- playbackCoordinator: URL-first + magnet fallback pipeline, probing,
  torrent status intervals, and video timestamp resolution
- authSessionCoordinator: signer lifecycle, profile switching,
  relay/block/wallet management, and cleanup
- modalCoordinator: modal open/close, view-count subscriptions,
  watch-history metadata, and playback logging
- moderationCoordinator: moderation settings, video decoration,
  override/block/hide action routing

Each coordinator factory receives injected dependencies instead of
importing globals. Application retains thin delegator methods so all
public call-sites remain unchanged. Coordinator initialisation is
idempotent (via _initCoordinators) and supports both constructor-based
and Object.create()-based instantiation used by test harnesses.

All existing unit tests, lint checks, and syntax validation pass.

https://claude.ai/code/session_01C3PKJTCdavsGbk5jjC85EB
2026-02-06 20:47:10 +00:00
Claude 416a809ae4 fix: apply block/mute list filtering to DM messages and conversations
The user's block/mute list (NIP-51) was not being checked when
processing direct messages, allowing blocked users' messages to appear
in conversations, trigger notifications, and increment unseen counts.

This adds block filtering at four layers:
- nostrService.applyDirectMessage: drops incoming DMs from blocked users
  before they enter the in-memory message cache
- nostrService.persistDirectMessageRecord: prevents blocked DM senders
  from being persisted to IndexedDB or triggering notifications
- profileModalController.buildDmConversationData: filters blocked users
  from the conversation list UI (catches pre-block persisted messages)
- applicationBootstrap: excludes blocked-user conversations from the
  unread DM badge count

The block checker is injected via setDmBlockChecker() to keep
nostrService decoupled from userBlocks, wired up in app.js init().

https://claude.ai/code/session_01EAVLtAM14GN99Eik8otLg2
2026-02-06 19:41:50 +00:00
Claude 8a9750002d fix: improve subscription list loading reliability and error recovery
The subscription list was failing to load correctly during login because:

1. Permission-required decryption errors silently returned without setting
   loaded=true or scheduling a retry, leaving subscriptions permanently
   stuck in a loading state.

2. Generic decryption failures (all schemes exhausted) had no retry path,
   unlike timeout errors which already scheduled retries.

3. The ensureLoaded timeout (30s) was too tight for the worst-case
   pipeline of relay fetch (12s) + decryption (20s) = 32s, causing
   premature timeouts that left loaded=false.

4. The loadingPromise was cleared in a finally block even when the loader
   was still in-flight after a timeout, allowing duplicate concurrent
   loads that could race against each other.

Changes:
- Handle permission-required errors like timeout errors: set loaded=true,
  schedule a retry (with allowPermissionPrompt: true), emit change event
- Schedule decrypt retries for all decrypt failure paths
- Increase ensureLoaded timeout from 30s to 45s
- Mark loaded=true on ensureLoaded timeout so the UI can proceed
- Clean up loadingPromise via loader.then() instead of finally block,
  preventing duplicate loads when the first is still in-flight

https://claude.ai/code/session_015MhPiSWNa7dm4UaRuq5x4U
2026-02-06 19:23:36 +00:00
google-labs-jules[bot]andPR0M3TH3AN 16458d1bc2 perf: Optimize explore diversity sorter
- Pre-calculate normalized vector norms to avoid O(N^2) recalculation.
- Pre-calculate normalized scores to avoid redundant property access and normalization.
- Combine selection loops to reduce iteration overhead.
- Modify cosineSimilarity to use dot product on normalized vectors.

Benchmark (1000 items): ~240ms -> ~152ms (~37% improvement).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 16:49:55 +00:00
google-labs-jules[bot]andPR0M3TH3AN 849e00a2ff fix: resolve decryption timeouts and listener warnings
Increases NIP-07 concurrency to 3 and lowers priority for non-critical decryption tasks to prevent blocklist timeouts. Increases relay max listeners to 200 to mitigate warnings.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 02:00:56 +00:00
google-labs-jules[bot]andPR0M3TH3AN a375b8336b Fix slow/failing NIP-07 private-list sync & decryption
- Implemented concurrent queue for NIP-07 requests (max 2)
- Added pre-authorization step at login to prevent redundant prompts
- Sequentialized critical list loading (blocks, subscriptions)
- Optimized decryption with result caching and high priority for critical lists
- Fixed MaxListenersExceededWarning by increasing relay listener limit
- Added concurrency tests

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 01:26:41 +00:00
thePR0M3TH3AN 1dbac77753 update from claude 2026-02-05 19:31:19 -05:00
Claude 8a335c2ec8 Fix slow Nostr list sync by decoupling from profile and awaiting before feed render
The login-to-feed pipeline had several issues causing lists (blocks,
subscriptions, hashtag preferences) to load too slowly or not reflect
in the feed:

1. All list loading was chained after profileStatePromise, adding
   2.5-6s of unnecessary delay. Lists only need relay URLs, not profile
   data. Now they chain off relaysReadyPromise instead, loading in
   parallel with profile fetching.

2. The video grid refreshed immediately without waiting for any lists,
   so the feed briefly displayed unfiltered content. Now the grid refresh
   waits (up to 8s) for critical feed-filtering lists to settle.

3. Hashtag preferences weren't cached into the snapshot before the feed
   rendered, so interests/disinterests were empty on first paint.

4. Subscription ensureLoaded had a 6s timeout that was too aggressive
   for relay fetch (12s) + decryption (3-12s), causing silent failures.
   Increased to 30s.

5. Subscription relay fetches for user and session actor ran sequentially.
   Now they run in parallel via Promise.all.

https://claude.ai/code/session_01UKmTWb83AnQPRVQo3bKZqm
2026-02-05 23:55:50 +00:00
thePR0M3TH3AN c15064c023 Merge pull request #2134 from PR0M3TH3AN/fix-moderation-fixture-click-timeout-16961147370798844238
Fix moderation fixture click timeout and logic
2026-02-05 18:13:08 -05:00
google-labs-jules[bot]andPR0M3TH3AN 54ed48ce35 Fix moderation fixture click timeout and logic
Fixed a click timeout issue in `tests/visual/moderation.spec.ts` for the 'trusted mute hide' fixture by:
1.  Updating `js/ui/components/VideoCard.js` to use `display: flex !important` instead of `block` for the hidden summary container, ensuring consistency with `bv-stack` class and preventing layout issues that made the button unclickable.
2.  Adding `url` to fixture videos in `docs/moderation/fixtures/index.html` to prevent them from being hidden by source visibility logic.
3.  Adding `onModerationHide` handler to the fixture factory to support the "Restore default moderation" action.
4.  Uncommenting the test case logic in `tests/visual/moderation.spec.ts`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 23:08:49 +00:00
google-labs-jules[bot]andPR0M3TH3AN 88cca17de0 perf: Use requestIdleCallback for ProfileCache localStorage writes
Optimizes `setProfileData` to defer blocking `JSON.stringify` and `localStorage.setItem` calls to idle periods, significantly reducing main thread blocking time during profile updates (e.g., watch history).

- Adds `runIdle` helper with `requestIdleCallback` (fallback to `setTimeout`).
- Updates `setProfileData` to use `runIdle`.
- Updates `tests/profile-cache.test.mjs` to handle async persistence.
- Adds `benchmarks/profile_cache_storage_bench.js` to measure blocking time (370x improvement observed).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 22:59:50 +00:00
thePR0M3TH3AN 151e2a70d8 Merge pull request #2131 from PR0M3TH3AN/optimistic-publish-relays-4183170839738909569
⚡ Make relay publishing optimistic (wait for first success)
2026-02-05 16:08:04 -05:00
google-labs-jules[bot]andPR0M3TH3AN 6ef11d6125 perf(nostr): optimistic relay publishing
Implement "race-to-success" in publishEventToRelays to reduce perceived latency.
Default behavior now resolves as soon as one relay accepts the event.
Added `waitForAll: true` option for strict consistency requirements (e.g. watchHistory).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 21:03:44 +00:00
thePR0M3TH3AN 81c329b87d Merge pull request #2128 from PR0M3TH3AN/perf/dm-decrypt-parallel-16182845594481363623
⚡ Parallelize DM Gift Wrap Decryption
2026-02-05 15:57:34 -05:00
thePR0M3TH3AN 8269eaf6e9 Merge pull request #2126 from PR0M3TH3AN/perf/optimize-nip46-normalization-quadratic-5068119382655595013
⚡ Optimize NIP-46 payload normalization to avoid O(N^2) on large inputs
2026-02-05 15:56:17 -05:00
thePR0M3TH3AN 01107fd7dc Merge pull request #2127 from PR0M3TH3AN/optimize-dm-decryptor-race-7712126730371272126
⚡ Optimize decryptLegacyDm with parallel execution
2026-02-05 15:56:09 -05:00
google-labs-jules[bot]andPR0M3TH3AN 201e0d154f Parallelize DM Gift Wrap Decryption for lower latency
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:52:35 +00:00
google-labs-jules[bot]andPR0M3TH3AN c696de37b7 optimize(dmDecryptor): use race pattern for legacy DM decryption
Verified that `decryptLegacyDm` uses `Promise.any` to parallelize decryption attempts, reducing latency significantly compared to serial execution.

Benchmarks showed:
- Serial execution: ~1258ms (worst case 5 decryptors * 5 candidates)
- Parallel execution: ~53ms

Added documentation comments to prevent regression and removed legacy `apply_fix.py` script.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:51:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 8dfc9a78c6 perf(nostr): optimize nip46 normalization loop for large inputs
Limits the O(N^2) pairwise check in `normalizeNip46CiphertextPayload` to small arrays (<= 16 items) to prevent combinatorial explosion. This heuristic is only intended for small split-payload cases, and processing large arrays this way was unnecessary and caused performance issues.

Benchmark results (200 items, 100 iterations):
- Before: ~54.84ms per iteration
- After: ~0.12ms per iteration
- Improvement: ~457x speedup

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:51:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6672be9281 Optimize feed engine normalization loop
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:50:30 +00:00
thePR0M3TH3AN 22350b9189 Merge pull request #2124 from PR0M3TH3AN/perf-dynamic-styles-optimization-11997365381509698926
⚡ Optimize releaseScope to avoid O(N) stylesheet scan
2026-02-05 15:35:56 -05:00
thePR0M3TH3AN 0e7940eb56 Merge branch 'unstable' into optimize-watch-history-publish-13715338775513051648 2026-02-05 15:35:38 -05:00
thePR0M3TH3AN 927cd86d6a Merge pull request #2122 from PR0M3TH3AN/perf/optimize-history-publish-27674355528125486
⚡ Parallelize watch history month publishing
2026-02-05 15:34:17 -05:00
thePR0M3TH3AN 2b81d9524e Merge branch 'unstable' into perf/optimize-profile-cache-clear-12083998581018615887 2026-02-05 15:32:58 -05:00
thePR0M3TH3AN 33650420ec Merge pull request #2120 from PR0M3TH3AN/perf-watch-history-concurrency-10087713430403090504
⚡ Optimize watch history chunk decryption concurrency
2026-02-05 15:31:31 -05:00
google-labs-jules[bot]andPR0M3TH3AN 0f97852eb8 Refactor releaseScope in dynamicStyles.js to avoid O(N) stylesheet scan.
Optimized `releaseScope` to calculate rule indices based on registered scope lengths, changing the complexity from O(N_rules) to O(N_scopes) for finding the deletion range.
Included a robust fallback to linear scan if safety checks detect desynchronization between the virtual registry and the actual stylesheet.
Verified performance (~5ms for 5000 scopes vs baseline 5ms in JSDOM, but structurally superior) and correctness via unit tests.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:31:23 +00:00
google-labs-jules[bot]andPR0M3TH3AN beb093ce76 perf: increase watch history publish concurrency to 5
Verified performance improvement via benchmark:
- Serial (Baseline): 805ms
- Parallel (Concurrency 3): 295ms
- Parallel (Concurrency 5): 216ms

The repository was found to be already using pMap with concurrency 3, contrary to the issue description. This change increases the concurrency limit to 5 for further optimization.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:30:55 +00:00
google-labs-jules[bot]andPR0M3TH3AN ba47ae6963 Optimize watch history publishing concurrency
- Use pMap for parallel publishing of history months
- Increase concurrency limit to 4 for better throughput
- Add benchmark script for measuring publish performance

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:29:58 +00:00
google-labs-jules[bot]andPR0M3TH3AN 0073bf223b Optimize clearMemoryCache to O(1) using nested map structure
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:28:49 +00:00
google-labs-jules[bot]andPR0M3TH3AN c03c7fd0bc perf: parallelize watch history chunk decryption with concurrency limit
Replaces `Promise.all` with `pMap` (concurrency: 5) in `WatchHistoryManager.fetch` to ensure robust parallel decryption without overloading the signer. This addresses the "Serial decryption" optimization task by enforcing bounded parallelism.

Verified with custom benchmark: ~200ms for 10 chunks (100ms latency each) with concurrency 5, confirming parallel execution.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:27:26 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4bd2d4a5d2 feat(perf): optimize clearMemoryCache to O(1) using nested map
- Changed memoryCache from potential flat map usage to nested Map (Pubkey -> Section -> Data)
- Implemented O(1) clearMemoryCache by deleting the pubkey entry instead of linear scan
- Verified with benchmarks/profile_cache_bench.js (217x faster)

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:25:48 +00:00
thePR0M3TH3AN b32c3dc39f Merge pull request #2118 from PR0M3TH3AN/perf/profile-cache-optimization-7635168706697512922
⚡ [ProfileCache] Document and verify O(1) memory cache clearing
2026-02-05 15:18:36 -05:00
google-labs-jules[bot]andPR0M3TH3AN 1296e4a06a Document and verify ProfileCache O(1) clearing optimization
- Add comments to ProfileCache constructor and clearMemoryCache explaining the nested map structure.
- Add benchmarks/profile_cache_bench.js to prove performance against a linear scan baseline.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-05 20:13:44 +00:00