Translates browser events into liveness signals for the framework-agnostic
ConversationLiveness supervisor in @memberjunction/conversations-runtime (MJ #4222).
WHY THE SPLIT. The supervisor lives at L0 because that package already depends on
@memberjunction/graphql-dataprovider and has no Angular dependency — and because the
obvious alternative is closed to us: Explorer's ServerConnectivityService does almost
exactly this, but @memberjunction/ng-conversations declares "mjUILayer": "widgets", and
packages/Standards/src/checks/ui-layers.ts forbids that layer from importing any
ng-explorer* package at severity error. L0 cannot own the DOM half either: the runtime is
documented as Node-consumable, so document and window may not exist there. Hence this thin
Angular-side adapter, which is the only piece that touches the DOM.
WHAT THE SIGNALS MEAN. Neither event proves anything is reachable — navigator.onLine reads
true behind a captive portal or a dead VPN, and a tab regaining focus says nothing about the
server. They are prompts to re-check, and the supervisor coalesces them with the transport-level
signals before anyone acts.
Root-provided so one instance serves every chat area; several open conversations must not each
raise their own reconciliation for the same lid-open.
Translates browser events into liveness signals for the framework-agnostic
ConversationLivenesssupervisor in@memberjunction/conversations-runtime(MJ #4222).WHY THE SPLIT. The supervisor lives at L0 because that package already depends on
@memberjunction/graphql-dataproviderand has no Angular dependency — and because the obvious alternative is closed to us: Explorer'sServerConnectivityServicedoes almost exactly this, but@memberjunction/ng-conversationsdeclares"mjUILayer": "widgets", andpackages/Standards/src/checks/ui-layers.tsforbids that layer from importing anyng-explorer*package at severityerror. L0 cannot own the DOM half either: the runtime is documented as Node-consumable, sodocumentandwindowmay not exist there. Hence this thin Angular-side adapter, which is the only piece that touches the DOM.WHAT THE SIGNALS MEAN. Neither event proves anything is reachable —
navigator.onLinereads true behind a captive portal or a dead VPN, and a tab regaining focus says nothing about the server. They are prompts to re-check, and the supervisor coalesces them with the transport-level signals before anyone acts.Root-provided so one instance serves every chat area; several open conversations must not each raise their own reconciliation for the same lid-open.