Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
76.92% covered (warning)
76.92%
20 / 26
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
EventBusBridge
76.92% covered (warning)
76.92%
20 / 26
0.00% covered (danger)
0.00%
0 / 3
8.79
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 factory
87.50% covered (warning)
87.50%
7 / 8
0.00% covered (danger)
0.00%
0 / 1
3.02
 onLinksUpdateComplete
92.86% covered (success)
92.86%
13 / 14
0.00% covered (danger)
0.00%
0 / 1
4.01
1<?php
2
3namespace CirrusSearch\Event;
4
5use CirrusSearch\PageChangeTracker;
6use MediaWiki\Config\Config;
7use MediaWiki\Config\ConfigFactory;
8use MediaWiki\Deferred\DeferredUpdates;
9use MediaWiki\Extension\EventBus\EventBusFactory;
10use MediaWiki\Page\PageLookup;
11use MediaWiki\Request\WebRequest;
12use MediaWiki\Title\TitleFormatter;
13use Wikimedia\UUID\GlobalIdGenerator;
14
15/**
16 * Hook handler responsible for bridging internal MW events to dedicated event streams.
17 */
18class EventBusBridge extends PageChangeTracker implements EventBridge {
19    private EventBusFactory $eventBusFactory;
20    private PageLookup $pageLookup;
21    private PageRerenderSerializer $pageRerenderSerializer;
22
23    /**
24     * @param EventBusFactory $eventBusFactory
25     * @param PageLookup $pageLookup
26     * @param PageRerenderSerializer $pageRerenderSerializer
27     */
28    public function __construct(
29        EventBusFactory $eventBusFactory,
30        PageLookup $pageLookup,
31        PageRerenderSerializer $pageRerenderSerializer,
32        int $maxStateSize = 512
33    ) {
34        parent::__construct( $maxStateSize );
35        $this->eventBusFactory = $eventBusFactory;
36        $this->pageLookup = $pageLookup;
37        $this->pageRerenderSerializer = $pageRerenderSerializer;
38    }
39
40    /**
41     * @param ConfigFactory $configFactory
42     * @param Config $mainConfig
43     * @param GlobalIdGenerator $globalIdGenerator
44     * @param TitleFormatter $titleFormatter
45     * @param PageLookup $pageLookup
46     * @param EventBusFactory|null $eventBusFactory
47     * @return EventBridge
48     */
49    public static function factory(
50        ConfigFactory $configFactory,
51        Config $mainConfig,
52        GlobalIdGenerator $globalIdGenerator,
53        TitleFormatter $titleFormatter,
54        PageLookup $pageLookup,
55        $eventBusFactory = null
56    ): EventBridge {
57        $config = $configFactory->makeConfig( "CirrusSearch" );
58        '@phan-var \CirrusSearch\SearchConfig $config';
59        if ( $eventBusFactory !== null && $config->get( 'CirrusSearchUseEventBusBridge' ) ) {
60            $pageRerenderSerializer = new PageRerenderSerializer( $mainConfig, $titleFormatter,
61                $config, $globalIdGenerator );
62            return new self( $eventBusFactory, $pageLookup, $pageRerenderSerializer );
63        }
64        return new class() implements EventBridge {
65            /**
66             * @inheritDoc
67             */
68            public function onLinksUpdateComplete( $linksUpdate, $ticket ) {
69            }
70        };
71    }
72
73    /**
74     * @inheritDoc
75     */
76    public function onLinksUpdateComplete( $linksUpdate, $ticket ) {
77        DeferredUpdates::addCallableUpdate( function () use ( $linksUpdate ) {
78            if ( $this->isPageChange( $linksUpdate->getPageId() ) ) {
79                // Page changes are handled via the page-change stream
80                return;
81            }
82            $page = $this->pageLookup->getPageById( $linksUpdate->getPageId() );
83            if ( $page === null ) {
84                // the page no longer exists
85                return;
86            }
87            if ( $page->isRedirect() ) {
88                // We are not really interested in redirects at this point
89                // since we would ultimately refresh the target of this redirect we assume
90                // that a LinksUpdate for the redirect does not imply that the target page has
91                // to re-render as well.
92                return;
93            }
94            $event = $this->pageRerenderSerializer->eventDataForPage( $page,
95                PageRerenderSerializer::LINKS_UPDATE_REASON, WebRequest::getRequestId() );
96            // Fire and forget, we do not check the return value, problems should be already logged by
97            // EventBus
98            $this->eventBusFactory
99                ->getInstanceForStream( $event['meta']['stream'] )
100                ->send( [ $event ] );
101        } );
102    }
103}