Source: widget/help/view2/HotspotScan.js

(function() {
    /** hotspot status scan */
    Help4.widget.help.view2.HotspotScan = class {
        /**
         * @param {Help4.widget.help.Widget} widget
         * @param {Help4.widget.help.ProjectTile[]} projectTiles
         * @returns {Promise<Object>}
         */
        static async scan(widget, projectTiles) {
            // ATTENTION - PRECONDITIONS:
            // a tile that are monitored here
            // 1. has a hotspot
            // 2. is not centered
            // 3. is on this screen (as this is on-screen help)
            if (!projectTiles.length) return {};

            const {
                service: {
                    /** @type {Help4.service.recording.PlaybackService} */ playbackService,
                    /** @type {Help4.service.recording.PlaybackCacheService} */ playbackCacheService
                },
                engine: {
                    /** @type {Help4.engine.DomRefreshEngine} */ domRefreshEngine
                }
            } = widget.getContext();

            const {Core} = Help4.widget.companionCore;
            const hotspotData = projectTiles.map(projectTile => Core.projectTileToHotspotData(projectTile));

            // make sure to receive non-cached results
            // this will update all status entries within hotspotDataList
            domRefreshEngine.sleep(true);  // prevent additional rescans due to our DOM manipulations during scan
            playbackCacheService?.clean();
            await playbackService?.update(hotspotData);
            domRefreshEngine.sleep(false);

            // map the information into an object
            const result = {};
            hotspotData.forEach(hotspot => {
                const {tileId, status} = hotspot;
                result[tileId] = status?.toObject?.() || {visible: false};
            });

            Help4.WM.listeners.onHotspotStatus.onEvent({type: 'hotspot-status', data: result});

            return result;
        }
    }
})();