Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
76.92% |
20 / 26 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 1 |
EventBusBridge | |
76.92% |
20 / 26 |
|
0.00% |
0 / 3 |
8.79 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
2 | |||
factory | |
87.50% |
7 / 8 |
|
0.00% |
0 / 1 |
3.02 | |||
onLinksUpdateComplete | |
92.86% |
13 / 14 |
|
0.00% |
0 / 1 |
4.01 |
1 | <?php |
2 | |
3 | namespace CirrusSearch\Event; |
4 | |
5 | use CirrusSearch\PageChangeTracker; |
6 | use MediaWiki\Config\Config; |
7 | use MediaWiki\Config\ConfigFactory; |
8 | use MediaWiki\Deferred\DeferredUpdates; |
9 | use MediaWiki\Extension\EventBus\EventBusFactory; |
10 | use MediaWiki\Page\PageLookup; |
11 | use MediaWiki\Request\WebRequest; |
12 | use MediaWiki\Title\TitleFormatter; |
13 | use Wikimedia\UUID\GlobalIdGenerator; |
14 | |
15 | /** |
16 | * Hook handler responsible for bridging internal MW events to dedicated event streams. |
17 | */ |
18 | class 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 | } |