Skip to content

perf(router): start the route chunks during the identity wait - #586

Open
yhabib wants to merge 2 commits into
mainfrom
perf/route-chunks-during-identity-wait
Open

yhabib wants to merge 2 commits into
mainfrom
perf/route-chunks-during-identity-wait

Conversation

@yhabib

@yhabib yhabib commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

Motivation

The _auth and dashboard chunks (25 files) start only after requireIdentity resolves. A visitor with a stored session now downloads them during that wait. This is item F4 of the September audit.

Median of 15 runs, in ms. Local production build over HTTP/2 with a throwaway session, because no signed-in Chrome was available. The 2 s wait is a simulated Internet Identity mint.

Load Chunks start Dashboard mounted
Empty cache, 100 ms, 40 Mbps 446 → 409 710 → 666
Empty cache, from / 459 → 414 804 → 687
Empty cache, 150 ms, 10 Mbps, 4x CPU 1248 → 1092 2525 → 1975
Warm cache 195 → 157 353 → 351
Warm cache, 4x CPU 574 → 389 1434 → 1399
Empty cache, 2 s mint 2448 → 412 2786 → 2581

The audit gap of 669 ms did not reproduce. Here the gap is about 75 ms, so a warm desktop load gains nothing.

Changes

  • Added hasStoredSession, a synchronous hint from the auth client.
  • Added preloadSessionRouteChunks, which main.tsx calls at boot. / preloads its redirect target, or the dashboard.
  • Added tests for the hint, the matched chunks, no guard or loader run, and a retry after a failed chunk.

The `_auth` and dashboard chunks only start after `requireIdentity`
resolves. Start them at boot for a visitor whose local record names a
live session. Guards and loaders run as before, so the auth result and
the data order do not change.
@yhabib
yhabib requested a review from a team as a code owner November 6, 2026 11:01
Copilot AI balanced review requested due to automatic review settings November 6, 2026 11:01
@zeropath-ai

zeropath-ai Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

✅ No security or compliance issues detected. Reviewed everything up to 8c69e16.

Security Overview
Detected Code Changes
Change Type Relevant files
Enhancement ► src/governance-app-frontend/src/common/auth/internetIdentity.ts
    Add hasStoredSession utility to check stored session state
Enhancement ► src/governance-app-frontend/src/common/utils/router.ts
    Import hasStoredSession; implement preloadSessionRouteChunks to preload route chunks for stored sessions
► src/governance-app-frontend/src/common/utils/router.ts
    Add sessionDestination logic for redirecting visitors to appropriate routes
Enhancement ► src/governance-app-frontend/src/common/utils/router.test.ts
    Update tests to mock hasStoredSession and extend test coverage for preloadSessionRouteChunks and related behaviors
Enhancement ► src/governance-app-frontend/src/governance-app-frontend/src/main.tsx
    Invoke preloadSessionRouteChunks during app initialization
Enhancement ► src/governance-app-frontend/src/common/auth/internetIdentity.test.ts
    Add tests for hasStoredSession and session initialization scenarios

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

📊 Build Bundle Stats

The latest build generated the following assets:

dist/index.html                                           5.71 kB │ gzip:   1.63 kB
dist/assets/index-DHR8rj0Y.css                          150.06 kB │ gzip:  24.02 kB
dist/assets/icpLedger-SofM309J.js                         0.23 kB │ gzip:   0.21 kB
dist/assets/Skeleton-Cq_K8DHA.js                          0.44 kB │ gzip:   0.32 kB
dist/assets/webhid-D0yio6wG.js                            0.53 kB │ gzip:   0.32 kB
dist/assets/useTvlValue-Dgrr1AgX.js                       0.60 kB │ gzip:   0.41 kB
dist/assets/nnsDapp-DXajM9hR.js                           0.67 kB │ gzip:   0.25 kB
dist/assets/SkeletonPageHeader-Tyjwsmvk.js                0.76 kB │ gzip:   0.47 kB
dist/assets/PageHeader-AvJeSwTP.js                        0.77 kB │ gzip:   0.45 kB
dist/assets/CertifiedBadge-JOGzPi2p.js                    0.81 kB │ gzip:   0.48 kB
dist/assets/Separator-DAzuhE0B.js                         0.83 kB │ gzip:   0.49 kB
dist/assets/stakingRewardsContext-BlWZFGvO.js             0.91 kB │ gzip:   0.56 kB
dist/assets/useForecastPeriod-CFXLNtUQ.js                 1.00 kB │ gzip:   0.61 kB
dist/assets/utils-C_rW_f6L.js                             1.02 kB │ gzip:   0.59 kB
dist/assets/useIcpIndex-BX6ybOf9.js                       1.09 kB │ gzip:   0.64 kB
dist/assets/numbers-BE_aKUsV.js                           1.15 kB │ gzip:   0.57 kB
dist/assets/routeLoaders-Ci9d9N9I.js                      1.20 kB │ gzip:   0.55 kB
dist/assets/rolldown-runtime-DAXXjFlN.js                  1.26 kB │ gzip:   0.70 kB
dist/assets/useSubaccountsMetadata-BtePd1Sl.js            1.50 kB │ gzip:   0.74 kB
dist/assets/events-B-NH7Why.js                            1.66 kB │ gzip:   0.85 kB
dist/assets/SkeletonListRows-BhhGsxzz.js                  1.69 kB │ gzip:   0.53 kB
dist/assets/useLedgerNeuronCall-3eC2ZB3d.js               1.90 kB │ gzip:   1.04 kB
dist/assets/errors-C_oENL0S.js                            1.95 kB │ gzip:   0.97 kB
dist/assets/AnimatedNumber-K0kuOgtU.js                    1.98 kB │ gzip:   1.13 kB
dist/assets/useCommandPaletteSettings-BpApLzXk.js         2.14 kB │ gzip:   1.07 kB
dist/assets/addressBook-Cwj2EiWM.js                       2.14 kB │ gzip:   1.19 kB
dist/assets/useIcpIndexTransactionsPolling-C5bjPyC9.js    2.17 kB │ gzip:   1.15 kB
dist/assets/useGovernanceAppCanister-DEiaK04S.js          2.41 kB │ gzip:   1.06 kB
dist/assets/useAddHotkey-BUs18poC.js                      2.61 kB │ gzip:   1.34 kB
dist/assets/governance-10DsCEkA.js                        2.98 kB │ gzip:   1.15 kB
dist/assets/ToggleGroup-BErYwasd.js                       3.09 kB │ gzip:   1.41 kB
dist/assets/useClaimPendingDeviceStakes-Kfpehkpd.js       3.12 kB │ gzip:   1.42 kB
dist/assets/SkeletonText-CtA55Ty-.js                      3.71 kB │ gzip:   1.29 kB
dist/assets/useAccounts-cgmOjkT1.js                       4.97 kB │ gzip:   2.21 kB
dist/assets/tickers-BXbT60G2.js                           6.55 kB │ gzip:   2.67 kB
dist/assets/DeviceActionDetail-8A6Gvn9K.js                8.46 kB │ gzip:   3.04 kB
dist/assets/TopicFollowingAccordion-BWQUcUHZ.js           8.55 kB │ gzip:   3.40 kB
dist/assets/routes-DU39sz5f.js                            8.96 kB │ gzip:   3.07 kB
dist/assets/useHardwareWalletsMetadata-C-VgxcH-.js        8.98 kB │ gzip:   3.14 kB
dist/assets/ledgerIdentity-BBnAOuAE.js                   10.17 kB │ gzip:   3.70 kB
dist/assets/MutationDialog-C4LWOPt4.js                   11.56 kB │ gzip:   4.04 kB
dist/assets/spamFilter-o0EmDE95.js                       11.77 kB │ gzip:   5.02 kB
dist/assets/ResponsiveDialog-B-notF0J.js                 14.58 kB │ gzip:   4.05 kB
dist/assets/_id-BW8eljgY.js                              16.62 kB │ gzip:   5.33 kB
dist/assets/AmountInput-CYssd0jm.js                      16.87 kB │ gzip:   6.73 kB
dist/assets/_auth-5_wpt24C.js                            22.47 kB │ gzip:   8.29 kB
dist/assets/HideBalancesToggle-ec_s_jeY.js               22.98 kB │ gzip:   8.58 kB
dist/assets/vendor-buffer-EX-AqChq.js                    26.95 kB │ gzip:   8.18 kB
dist/assets/accounts-BGcHYBDX.js                         32.05 kB │ gzip:  10.89 kB
dist/assets/SendICPButton-DVaAXuYf.js                    37.05 kB │ gzip:  13.52 kB
dist/assets/settings-DdLVVGF9.js                         54.38 kB │ gzip:  15.44 kB
dist/assets/dashboard-CjhEist4.js                        57.77 kB │ gzip:  19.08 kB
dist/assets/voting-RjGfnrNO.js                           69.26 kB │ gzip:  21.74 kB
dist/assets/index-nPd8wxoz.js                            71.97 kB │ gzip:  21.61 kB
dist/assets/vendor-md-DLWWuF6X.js                        73.28 kB │ gzip:  19.98 kB
dist/assets/candid-D9fb4mi3.js                           84.97 kB │ gzip:  28.67 kB
dist/assets/neurons-D43r2KTP.js                          90.40 kB │ gzip:  27.07 kB
dist/assets/DisburseModal-Dhu_Y3I5.js                   101.43 kB │ gzip:  29.57 kB
dist/assets/vendor-tanstack-CV055q98.js                 120.01 kB │ gzip:  39.21 kB
dist/assets/vendor-jsqr-CjiBYtfG.js                     129.98 kB │ gzip:  47.50 kB
dist/assets/vendor-core-react-BVwfugT6.js               189.81 kB │ gzip:  59.76 kB
dist/assets/vendor-recharts-By8UI51S.js                 280.26 kB │ gzip:  76.81 kB
dist/assets/vendor-ledger-DSID-EZY.js                   403.26 kB │ gzip:  98.84 kB
dist/assets/vendor-icp-BkPiAYr9.js                      468.32 kB │ gzip: 118.09 kB
dist/assets/vendor-libs-Dsp9sJ-8.js                     581.24 kB │ gzip: 186.75 kB

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Stored-session redirects to /voting download unused dashboard chunks while the voting chunk waits for identity restoration, defeating the optimization and adding competing downloads.

1 open issue
What changed in this PR

This PR reduces startup delays for visitors with stored sessions by downloading matched route chunks while identity restoration is pending.

Changes:

  • Adds a synchronous stored-session hint from the auth client.
  • Starts route-chunk preloading at boot without running guards or data loaders.
  • Adds tests for session hints, route matching, and failed-chunk retries.
File Description
src/​governance-app-frontend/​src/​main.tsx Starts route-chunk preloading before mounting the app.
src/​governance-app-frontend/​src/​common/​utils/​router.ts Preloads matched route chunks for stored sessions.
src/​governance-app-frontend/​src/​common/​utils/​router.test.ts Tests chunk selection, guard isolation, and retries.
src/​governance-app-frontend/​src/​common/​auth/​internetIdentity.ts Exposes the synchronous stored-session hint.
src/​governance-app-frontend/​src/​common/​auth/​internetIdentity.test.ts Tests session hints during initialization and client creation failure.

Review effort: Balanced

Copilot AI balanced review requested due to automatic review settings November 6, 2026 11:06

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approved

No active review issues are reported for the session-aware route-chunk preloading change.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants