This repository has been archived on 2022-08-19. You can view files and clone it, but cannot push or open issues or pull requests.
hydrogen-web/doc/impl-thoughts/RECONNECTING.md

73 lines
3.2 KiB
Markdown
Raw Normal View History

# Reconnecting
2020-04-05 18:41:15 +05:30
`HomeServerApi` notifies `Reconnector` of network call failure
2020-04-05 18:41:15 +05:30
`Reconnector` listens for online/offline event
2020-04-05 18:41:15 +05:30
`Reconnector` polls `/versions` with a `RetryDelay` (implemented as ExponentialRetryDelay, also used by SendScheduler if no retry_after_ms is given)
2020-04-05 18:41:15 +05:30
`Reconnector` emits an event when sync and message sending should retry
2020-04-05 18:41:15 +05:30
`Sync` listen to `Reconnector`
`Sync` notifies when the catchup sync has happened
2020-04-05 18:41:15 +05:30
`Reconnector` has state:
- disconnected (and retrying at x seconds from timestamp)
- reconnecting (call /versions, and if successful /sync)
- connected
2020-04-05 18:41:15 +05:30
`Reconnector` has a method to try to connect now
`SessionStatus` can be:
- disconnected (and retrying at x seconds from timestamp)
- reconnecting
- connected (and syncing)
- doing catchup sync
- sending x / y messages
rooms should report how many messages they have queued up, and each time they sent one?
`SendReporter` (passed from `Session` to `Room`, passed down to `SendQueue`), with:
2020-04-18 22:46:16 +05:30
- setPendingEventCount(roomId, count). This should probably use the generic Room updating mechanism, e.g. a pendingMessageCount on Room that is updated. Then session listens for this in `_roomUpdateCallback`.
2020-04-05 18:41:15 +05:30
`Session` listens to `Reconnector` to update it's status, but perhaps we wait to send messages until catchup sync is done
2020-04-18 22:46:16 +05:30
# TODO
2020-04-19 22:32:10 +05:30
- DONE: finish (Base)ObservableValue
2020-04-18 22:46:16 +05:30
- put in own file
2020-04-19 22:32:10 +05:30
- add waitFor (won't this leak if the promise never resolves?)
2020-04-18 22:46:16 +05:30
- decide whether we want to inherit (no?)
- DONE: cleanup Reconnector with recent changes, move generic code, make imports work
- DONE: add SyncStatus as ObservableValue of enum in Sync
- DONE: cleanup SessionContainer
2020-04-21 01:13:02 +05:30
- DONE: move all imports to non-default
- DONE: remove #ifdef
- DONE: move EventEmitter to utils
- DONE: move all lower-cased files
2020-04-21 02:40:54 +05:30
- DONE: change main.js to pass in a creation function of a SessionContainer instead of everything it is replacing
- DONE: adjust BrawlViewModel, SessionPickViewModel and LoginViewModel to use a SessionContainer
- show load progress in LoginView/SessionPickView and do away with loading screen
- DONE: rename SessionsStore to SessionInfoStorage
2020-04-18 22:46:16 +05:30
- make sure we've renamed all \*State enums and fields to \*Status
- add pendingMessageCount prop to SendQueue and Room, aggregate this in Session
- add completedFirstSync to Sync, so we can check if the catchup or initial sync is still in progress
- update SyncStatusViewModel to use reconnector.connectionStatus, sync.completedFirstSync, session.syncToken (is initial sync?) and session.pendingMessageCount to show these messages:
- disconnected, retrying in x seconds. [try now].
- reconnecting...
- doing catchup sync
- syncing, sending x messages
- syncing
perhaps we will want to put this as an ObservableValue on the SessionContainer ?
NO: When connected, syncing and not sending anything, just hide the thing for now? although when you send messages it will just pop in and out all the time.
- see if it makes sense for SendScheduler to use the same RetryDelay as Reconnector
- finally adjust all file names to their class names? e.g. camel case
- see if we want more dependency injection
- for classes from outside sdk
- for internal sdk classes? probably not yet