The loading screen advances on real sync signals only under the smoldot-direct backend. In smoldot-shared-worker mode the light client lives in the SharedWorker, whose presync does the whole cold sync before the first resolve request, and nothing forwards chain-sync events out of it. The host guard in apps/host/src/main.ts is narrowed to smoldot-direct to say so honestly, so shared-worker users get the old timer-paced bar with no peer count.
Two pieces of work. The SharedWorker needs to call enableSyncReporting and relay onChainSync events over its port, and the iframe relay needs to pass them up to the host. Once events cross that boundary, the natural follow-up is to make the subscription itself the enablement (onChainSync with the chains the caller cares about) so the allowlist and the exported enableSyncReporting can both go away.
The loading screen advances on real sync signals only under the smoldot-direct backend. In smoldot-shared-worker mode the light client lives in the SharedWorker, whose presync does the whole cold sync before the first resolve request, and nothing forwards chain-sync events out of it. The host guard in apps/host/src/main.ts is narrowed to smoldot-direct to say so honestly, so shared-worker users get the old timer-paced bar with no peer count.
Two pieces of work. The SharedWorker needs to call enableSyncReporting and relay onChainSync events over its port, and the iframe relay needs to pass them up to the host. Once events cross that boundary, the natural follow-up is to make the subscription itself the enablement (onChainSync with the chains the caller cares about) so the allowlist and the exported enableSyncReporting can both go away.