Every mount of the Network, People, Home, Statistics or Graph pages
redid Data.refreshGpgDetails(): getFriendList, then for every location
getPeerDetails, isOnline, getCustomStateString and getStatus -- four
requests per location, fired together through Promise.all. With two
thousand locations that is eight thousand requests filling the browser's
six sockets, and on a phone behind a slow link every interactive request
-- opening a distant chat, the tunnel status poll, a chat message --
queued for minutes behind them. The Debug page showed it as a scroll of
getPeerDetails.
Now: one getOnlineList replaces the per-location isOnline; the status
string and status value are asked only for peers that are online; the
getPeerDetails sweep runs three at a time, the list filling as answers
land on a first load; the result is kept for five minutes, later mounts
only refreshing the online flags with that one request, and concurrent
callers share the sweep in flight. Adding or removing a friend forces a
full sweep.
refreshGpgDetails() re-injects every remembered friend the core does not return,
and nothing ever removed one: a short-invite peer that never validates, or one
the user deletes, came back on the next refresh and survived a browser restart,
with no way to get rid of it from the web UI.
A remembered friend is a placeholder for the seconds the core needs to catch up
with an add that has just returned, so it now carries the time it was made and
is dropped once that window has passed. Removing a friend drops it immediately,
before the refresh that would have restored it -- and that refresh now waits for
removeFriend to answer instead of racing it.
The store is also keyed per node: it lives in localStorage, which is shared by
every RetroShare profile reached from the same browser, and their friend lists
have nothing to do with each other.
- Correct full-certificate friends being incorrectly marked “Pending validation.”
- Refresh identity lists immediately after creating an identity.
Update open chat-room and distant-chat identity selectors automatically.
- Replace the broken signed-identity password popup with a responsive mobile form.
- Allow creation of the first signed identity without requiring an existing signed identity.
Filter temporary all-zero GXS IDs.
- Wait for RetroShare to expose the real generated identity ID.
- Retry identity-detail loading when RetroShare temporarily returns empty data.
- Display the fetched nickname instead of “Unknown.”
master gained an eslint config in 35c5c17 and the code added here predates
it, so `npm run lint` fails on this branch. This commit is the mechanical
part only, produced by `eslint app --fix` with no hand editing:
object-shorthand, quote style, trailing whitespace, prefer-const.
Twenty-two problems are left because they need a decision rather than a
rewrite rule, the two worth looking at first being real:
boards/board_view.js:499,503 'forumId' is not defined (no-undef)
`renderComment` calls `util.voteForPost(forumId, ...)` for the up and down
vote buttons, but no `forumId` exists in that scope - it looks like it came
over from the forums code. Voting on a board comment therefore throws
ReferenceError and silently does nothing.
The other twenty are unused bindings left behind by the refactors
(`get64Num`, `loadLobbyDetails`, `Message`, `SubscribedLobbies`,
`PublicLobbies`, `LayoutSingle` in chat.js, `closePopup` in
board_kanban.js, `bsubscribed`/`bposts`/`createDate`/`lastActivity` in
boards_util.js, `displaycomment` in channel_view.js) plus a few dead
assignments. `npm run lint` lists them all.
Drop this commit if you would rather keep the diff to your own changes.