Passed
Push — master ( 2f2538...82f602 )
by Joas
14:31 queued 12s
created

RegistrationContext::getWellKnownHandlers()

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
nc 1
nop 0
dl 0
loc 2
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * @copyright 2020 Christoph Wurst <[email protected]>
7
 *
8
 * @author Christoph Wurst <[email protected]>
9
 * @author Joas Schilling <[email protected]>
10
 * @author Julius Härtl <[email protected]>
11
 * @author Roeland Jago Douma <[email protected]>
12
 *
13
 * @license GNU AGPL version 3 or any later version
14
 *
15
 * This program is free software: you can redistribute it and/or modify
16
 * it under the terms of the GNU Affero General Public License as
17
 * published by the Free Software Foundation, either version 3 of the
18
 * License, or (at your option) any later version.
19
 *
20
 * This program is distributed in the hope that it will be useful,
21
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
 * GNU Affero General Public License for more details.
24
 *
25
 * You should have received a copy of the GNU Affero General Public License
26
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
27
 *
28
 */
29
30
namespace OC\AppFramework\Bootstrap;
31
32
use Closure;
33
use OCP\Talk\ITalkBackend;
34
use RuntimeException;
35
use function array_shift;
36
use OC\Support\CrashReport\Registry;
37
use OCP\AppFramework\App;
38
use OCP\AppFramework\Bootstrap\IRegistrationContext;
39
use OCP\AppFramework\Middleware;
40
use OCP\AppFramework\Services\InitialStateProvider;
41
use OCP\Authentication\IAlternativeLogin;
42
use OCP\Calendar\ICalendarProvider;
43
use OCP\Capabilities\ICapability;
44
use OCP\Dashboard\IManager;
45
use OCP\Dashboard\IWidget;
46
use OCP\EventDispatcher\IEventDispatcher;
47
use OCP\Files\Template\ICustomTemplateProvider;
48
use OCP\Http\WellKnown\IHandler;
49
use OCP\Notification\INotifier;
50
use OCP\Profile\ILinkAction;
51
use OCP\Search\IProvider;
52
use OCP\Support\CrashReport\IReporter;
53
use Psr\Log\LoggerInterface;
54
use Throwable;
55
56
class RegistrationContext {
57
58
	/** @var ServiceRegistration<ICapability>[] */
59
	private $capabilities = [];
60
61
	/** @var ServiceRegistration<IReporter>[] */
62
	private $crashReporters = [];
63
64
	/** @var ServiceRegistration<IWidget>[] */
65
	private $dashboardPanels = [];
66
67
	/** @var ServiceRegistration<ILinkAction>[] */
68
	private $profileLinkActions = [];
69
70
	/** @var null|ServiceRegistration<ITalkBackend> */
71
	private $talkBackendRegistration = null;
72
73
	/** @var ServiceFactoryRegistration[] */
74
	private $services = [];
75
76
	/** @var ServiceAliasRegistration[] */
77
	private $aliases = [];
78
79
	/** @var ParameterRegistration[] */
80
	private $parameters = [];
81
82
	/** @var EventListenerRegistration[] */
83
	private $eventListeners = [];
84
85
	/** @var ServiceRegistration<Middleware>[] */
86
	private $middlewares = [];
87
88
	/** @var ServiceRegistration<IProvider>[] */
89
	private $searchProviders = [];
90
91
	/** @var ServiceRegistration<IAlternativeLogin>[] */
92
	private $alternativeLogins = [];
93
94
	/** @var ServiceRegistration<InitialStateProvider>[] */
95
	private $initialStates = [];
96
97
	/** @var ServiceRegistration<IHandler>[] */
98
	private $wellKnownHandlers = [];
99
100
	/** @var ServiceRegistration<ICustomTemplateProvider>[] */
101
	private $templateProviders = [];
102
103
	/** @var ServiceRegistration<INotifier>[] */
104
	private $notifierServices = [];
105
106
	/** @var ServiceRegistration<\OCP\Authentication\TwoFactorAuth\IProvider>[] */
107
	private $twoFactorProviders = [];
108
109
	/** @var ServiceRegistration<ICalendarProvider>[] */
110
	private $calendarProviders = [];
111
112
	/** @var LoggerInterface */
113
	private $logger;
114
115
	/** @var PreviewProviderRegistration[] */
116
	private $previewProviders = [];
117
118
	public function __construct(LoggerInterface $logger) {
119
		$this->logger = $logger;
120
	}
121
122
	public function for(string $appId): IRegistrationContext {
123
		return new class($appId, $this) implements IRegistrationContext {
124
			/** @var string */
125
			private $appId;
126
127
			/** @var RegistrationContext */
128
			private $context;
129
130
			public function __construct(string $appId, RegistrationContext $context) {
131
				$this->appId = $appId;
132
				$this->context = $context;
133
			}
134
135
			public function registerCapability(string $capability): void {
136
				$this->context->registerCapability(
137
					$this->appId,
138
					$capability
139
				);
140
			}
141
142
			public function registerCrashReporter(string $reporterClass): void {
143
				$this->context->registerCrashReporter(
144
					$this->appId,
145
					$reporterClass
146
				);
147
			}
148
149
			public function registerDashboardWidget(string $widgetClass): void {
150
				$this->context->registerDashboardPanel(
151
					$this->appId,
152
					$widgetClass
153
				);
154
			}
155
156
			public function registerService(string $name, callable $factory, bool $shared = true): void {
157
				$this->context->registerService(
158
					$this->appId,
159
					$name,
160
					$factory,
161
					$shared
162
				);
163
			}
164
165
			public function registerServiceAlias(string $alias, string $target): void {
166
				$this->context->registerServiceAlias(
167
					$this->appId,
168
					$alias,
169
					$target
170
				);
171
			}
172
173
			public function registerParameter(string $name, $value): void {
174
				$this->context->registerParameter(
175
					$this->appId,
176
					$name,
177
					$value
178
				);
179
			}
180
181
			public function registerEventListener(string $event, string $listener, int $priority = 0): void {
182
				$this->context->registerEventListener(
183
					$this->appId,
184
					$event,
185
					$listener,
186
					$priority
187
				);
188
			}
189
190
			public function registerMiddleware(string $class): void {
191
				$this->context->registerMiddleware(
192
					$this->appId,
193
					$class
194
				);
195
			}
196
197
			public function registerSearchProvider(string $class): void {
198
				$this->context->registerSearchProvider(
199
					$this->appId,
200
					$class
201
				);
202
			}
203
204
			public function registerAlternativeLogin(string $class): void {
205
				$this->context->registerAlternativeLogin(
206
					$this->appId,
207
					$class
208
				);
209
			}
210
211
			public function registerInitialStateProvider(string $class): void {
212
				$this->context->registerInitialState(
213
					$this->appId,
214
					$class
215
				);
216
			}
217
218
			public function registerWellKnownHandler(string $class): void {
219
				$this->context->registerWellKnown(
220
					$this->appId,
221
					$class
222
				);
223
			}
224
225
			public function registerTemplateProvider(string $providerClass): void {
226
				$this->context->registerTemplateProvider(
227
					$this->appId,
228
					$providerClass
229
				);
230
			}
231
232
			public function registerNotifierService(string $notifierClass): void {
233
				$this->context->registerNotifierService(
234
					$this->appId,
235
					$notifierClass
236
				);
237
			}
238
239
			public function registerTwoFactorProvider(string $twoFactorProviderClass): void {
240
				$this->context->registerTwoFactorProvider(
241
					$this->appId,
242
					$twoFactorProviderClass
243
				);
244
			}
245
246
			public function registerPreviewProvider(string $previewProviderClass, string $mimeTypeRegex): void {
247
				$this->context->registerPreviewProvider(
248
					$this->appId,
249
					$previewProviderClass,
250
					$mimeTypeRegex
251
				);
252
			}
253
254
			public function registerCalendarProvider(string $class): void {
255
				$this->context->registerCalendarProvider(
256
					$this->appId,
257
					$class
258
				);
259
			}
260
261
			public function registerProfileLinkAction(string $actionClass): void {
262
				$this->context->registerProfileLinkAction(
263
					$this->appId,
264
					$actionClass
265
				);
266
			}
267
268
			public function registerTalkBackend(string $backend): void {
269
				$this->context->registerTalkBackend(
270
					$this->appId,
271
					$backend
272
				);
273
			}
274
		};
275
	}
276
277
	/**
278
	 * @psalm-param class-string<ICapability> $capability
279
	 */
280
	public function registerCapability(string $appId, string $capability): void {
281
		$this->capabilities[] = new ServiceRegistration($appId, $capability);
282
	}
283
284
	/**
285
	 * @psalm-param class-string<IReporter> $capability
286
	 */
287
	public function registerCrashReporter(string $appId, string $reporterClass): void {
288
		$this->crashReporters[] = new ServiceRegistration($appId, $reporterClass);
289
	}
290
291
	/**
292
	 * @psalm-param class-string<IWidget> $capability
293
	 */
294
	public function registerDashboardPanel(string $appId, string $panelClass): void {
295
		$this->dashboardPanels[] = new ServiceRegistration($appId, $panelClass);
296
	}
297
298
	public function registerService(string $appId, string $name, callable $factory, bool $shared = true): void {
299
		$this->services[] = new ServiceFactoryRegistration($appId, $name, $factory, $shared);
300
	}
301
302
	public function registerServiceAlias(string $appId, string $alias, string $target): void {
303
		$this->aliases[] = new ServiceAliasRegistration($appId, $alias, $target);
304
	}
305
306
	public function registerParameter(string $appId, string $name, $value): void {
307
		$this->parameters[] = new ParameterRegistration($appId, $name, $value);
308
	}
309
310
	public function registerEventListener(string $appId, string $event, string $listener, int $priority = 0): void {
311
		$this->eventListeners[] = new EventListenerRegistration($appId, $event, $listener, $priority);
312
	}
313
314
	/**
315
	 * @psalm-param class-string<Middleware> $class
316
	 */
317
	public function registerMiddleware(string $appId, string $class): void {
318
		$this->middlewares[] = new ServiceRegistration($appId, $class);
319
	}
320
321
	public function registerSearchProvider(string $appId, string $class) {
322
		$this->searchProviders[] = new ServiceRegistration($appId, $class);
323
	}
324
325
	public function registerAlternativeLogin(string $appId, string $class): void {
326
		$this->alternativeLogins[] = new ServiceRegistration($appId, $class);
327
	}
328
329
	public function registerInitialState(string $appId, string $class): void {
330
		$this->initialStates[] = new ServiceRegistration($appId, $class);
331
	}
332
333
	public function registerWellKnown(string $appId, string $class): void {
334
		$this->wellKnownHandlers[] = new ServiceRegistration($appId, $class);
335
	}
336
337
	public function registerTemplateProvider(string $appId, string $class): void {
338
		$this->templateProviders[] = new ServiceRegistration($appId, $class);
339
	}
340
341
	public function registerNotifierService(string $appId, string $class): void {
342
		$this->notifierServices[] = new ServiceRegistration($appId, $class);
343
	}
344
345
	public function registerTwoFactorProvider(string $appId, string $class): void {
346
		$this->twoFactorProviders[] = new ServiceRegistration($appId, $class);
347
	}
348
349
	public function registerPreviewProvider(string $appId, string $class, string $mimeTypeRegex): void {
350
		$this->previewProviders[] = new PreviewProviderRegistration($appId, $class, $mimeTypeRegex);
351
	}
352
353
	public function registerCalendarProvider(string $appId, string $class): void {
354
		$this->calendarProviders[] = new ServiceRegistration($appId, $class);
355
	}
356
357
	/**
358
	 * @psalm-param class-string<ILinkAction> $actionClass
359
	 */
360
	public function registerProfileLinkAction(string $appId, string $actionClass): void {
361
		$this->profileLinkActions[] = new ServiceRegistration($appId, $actionClass);
362
	}
363
364
	/**
365
	 * @psalm-param class-string<ITalkBackend> $backend
366
	 */
367
	public function registerTalkBackend(string $appId, string $backend) {
368
		// Some safeguards for invalid registrations
369
		if ($appId !== 'spreed') {
370
			throw new RuntimeException("Only the Talk app is allowed to register a Talk backend");
371
		}
372
		if ($this->talkBackendRegistration !== null) {
373
			throw new RuntimeException("There can only be one Talk backend");
374
		}
375
376
		$this->talkBackendRegistration = new ServiceRegistration($appId, $backend);
377
	}
378
379
	/**
380
	 * @param App[] $apps
381
	 */
382
	public function delegateCapabilityRegistrations(array $apps): void {
383
		while (($registration = array_shift($this->capabilities)) !== null) {
0 ignored issues
show
Bug introduced by
$this->capabilities of type OC\AppFramework\Bootstrap\ServiceRegistration is incompatible with the type array expected by parameter $array of array_shift(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

383
		while (($registration = array_shift(/** @scrutinizer ignore-type */ $this->capabilities)) !== null) {
Loading history...
384
			$appId = $registration->getAppId();
385
			if (!isset($apps[$appId])) {
386
				// If we land here something really isn't right. But at least we caught the
387
				// notice that is otherwise emitted for the undefined index
388
				$this->logger->error("App $appId not loaded for the capability registration");
389
390
				continue;
391
			}
392
393
			try {
394
				$apps[$appId]
395
					->getContainer()
396
					->registerCapability($registration->getService());
397
			} catch (Throwable $e) {
398
				$this->logger->error("Error during capability registration of $appId: " . $e->getMessage(), [
399
					'exception' => $e,
400
				]);
401
			}
402
		}
403
	}
404
405
	/**
406
	 * @param App[] $apps
407
	 */
408
	public function delegateCrashReporterRegistrations(array $apps, Registry $registry): void {
0 ignored issues
show
Unused Code introduced by
The parameter $apps is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

408
	public function delegateCrashReporterRegistrations(/** @scrutinizer ignore-unused */ array $apps, Registry $registry): void {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
409
		while (($registration = array_shift($this->crashReporters)) !== null) {
0 ignored issues
show
Bug introduced by
$this->crashReporters of type OC\AppFramework\Bootstrap\ServiceRegistration is incompatible with the type array expected by parameter $array of array_shift(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

409
		while (($registration = array_shift(/** @scrutinizer ignore-type */ $this->crashReporters)) !== null) {
Loading history...
410
			try {
411
				$registry->registerLazy($registration->getService());
412
			} catch (Throwable $e) {
413
				$appId = $registration->getAppId();
414
				$this->logger->error("Error during crash reporter registration of $appId: " . $e->getMessage(), [
415
					'exception' => $e,
416
				]);
417
			}
418
		}
419
	}
420
421
	/**
422
	 * @param App[] $apps
423
	 */
424
	public function delegateDashboardPanelRegistrations(array $apps, IManager $dashboardManager): void {
0 ignored issues
show
Unused Code introduced by
The parameter $apps is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

424
	public function delegateDashboardPanelRegistrations(/** @scrutinizer ignore-unused */ array $apps, IManager $dashboardManager): void {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
425
		while (($panel = array_shift($this->dashboardPanels)) !== null) {
0 ignored issues
show
Bug introduced by
$this->dashboardPanels of type OC\AppFramework\Bootstrap\ServiceRegistration is incompatible with the type array expected by parameter $array of array_shift(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

425
		while (($panel = array_shift(/** @scrutinizer ignore-type */ $this->dashboardPanels)) !== null) {
Loading history...
426
			try {
427
				$dashboardManager->lazyRegisterWidget($panel->getService());
428
			} catch (Throwable $e) {
429
				$appId = $panel->getAppId();
430
				$this->logger->error("Error during dashboard registration of $appId: " . $e->getMessage(), [
431
					'exception' => $e,
432
				]);
433
			}
434
		}
435
	}
436
437
	public function delegateEventListenerRegistrations(IEventDispatcher $eventDispatcher): void {
438
		while (($registration = array_shift($this->eventListeners)) !== null) {
439
			try {
440
				$eventDispatcher->addServiceListener(
441
					$registration->getEvent(),
442
					$registration->getService(),
443
					$registration->getPriority()
444
				);
445
			} catch (Throwable $e) {
446
				$appId = $registration->getAppId();
447
				$this->logger->error("Error during event listener registration of $appId: " . $e->getMessage(), [
448
					'exception' => $e,
449
				]);
450
			}
451
		}
452
	}
453
454
	/**
455
	 * @param App[] $apps
456
	 */
457
	public function delegateContainerRegistrations(array $apps): void {
458
		while (($registration = array_shift($this->services)) !== null) {
459
			$appId = $registration->getAppId();
460
			if (!isset($apps[$appId])) {
461
				// If we land here something really isn't right. But at least we caught the
462
				// notice that is otherwise emitted for the undefined index
463
				$this->logger->error("App $appId not loaded for the container service registration");
464
465
				continue;
466
			}
467
468
			try {
469
				/**
470
				 * Register the service and convert the callable into a \Closure if necessary
471
				 */
472
				$apps[$appId]
473
					->getContainer()
474
					->registerService(
475
						$registration->getName(),
476
						Closure::fromCallable($registration->getFactory()),
477
						$registration->isShared()
478
					);
479
			} catch (Throwable $e) {
480
				$this->logger->error("Error during service registration of $appId: " . $e->getMessage(), [
481
					'exception' => $e,
482
				]);
483
			}
484
		}
485
486
		while (($registration = array_shift($this->aliases)) !== null) {
487
			$appId = $registration->getAppId();
488
			if (!isset($apps[$appId])) {
489
				// If we land here something really isn't right. But at least we caught the
490
				// notice that is otherwise emitted for the undefined index
491
				$this->logger->error("App $appId not loaded for the container alias registration");
492
493
				continue;
494
			}
495
496
			try {
497
				$apps[$appId]
498
					->getContainer()
499
					->registerAlias(
500
						$registration->getAlias(),
501
						$registration->getTarget()
502
					);
503
			} catch (Throwable $e) {
504
				$this->logger->error("Error during service alias registration of $appId: " . $e->getMessage(), [
505
					'exception' => $e,
506
				]);
507
			}
508
		}
509
510
		while (($registration = array_shift($this->parameters)) !== null) {
511
			$appId = $registration->getAppId();
512
			if (!isset($apps[$appId])) {
513
				// If we land here something really isn't right. But at least we caught the
514
				// notice that is otherwise emitted for the undefined index
515
				$this->logger->error("App $appId not loaded for the container parameter registration");
516
517
				continue;
518
			}
519
520
			try {
521
				$apps[$appId]
522
					->getContainer()
523
					->registerParameter(
524
						$registration->getName(),
525
						$registration->getValue()
526
					);
527
			} catch (Throwable $e) {
528
				$this->logger->error("Error during service parameter registration of $appId: " . $e->getMessage(), [
529
					'exception' => $e,
530
				]);
531
			}
532
		}
533
	}
534
535
	/**
536
	 * @param App[] $apps
537
	 */
538
	public function delegateMiddlewareRegistrations(array $apps): void {
539
		while (($middleware = array_shift($this->middlewares)) !== null) {
0 ignored issues
show
Bug introduced by
$this->middlewares of type OC\AppFramework\Bootstrap\ServiceRegistration is incompatible with the type array expected by parameter $array of array_shift(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

539
		while (($middleware = array_shift(/** @scrutinizer ignore-type */ $this->middlewares)) !== null) {
Loading history...
540
			$appId = $middleware->getAppId();
541
			if (!isset($apps[$appId])) {
542
				// If we land here something really isn't right. But at least we caught the
543
				// notice that is otherwise emitted for the undefined index
544
				$this->logger->error("App $appId not loaded for the container middleware registration");
545
546
				continue;
547
			}
548
549
			try {
550
				$apps[$appId]
551
					->getContainer()
552
					->registerMiddleWare($middleware->getService());
553
			} catch (Throwable $e) {
554
				$this->logger->error("Error during capability registration of $appId: " . $e->getMessage(), [
555
					'exception' => $e,
556
				]);
557
			}
558
		}
559
	}
560
561
	/**
562
	 * @return ServiceRegistration<IProvider>[]
563
	 */
564
	public function getSearchProviders(): array {
565
		return $this->searchProviders;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->searchProviders returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
566
	}
567
568
	/**
569
	 * @return ServiceRegistration<IAlternativeLogin>[]
570
	 */
571
	public function getAlternativeLogins(): array {
572
		return $this->alternativeLogins;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->alternativeLogins returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
573
	}
574
575
	/**
576
	 * @return ServiceRegistration<InitialStateProvider>[]
577
	 */
578
	public function getInitialStates(): array {
579
		return $this->initialStates;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->initialStates returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
580
	}
581
582
	/**
583
	 * @return ServiceRegistration<IHandler>[]
584
	 */
585
	public function getWellKnownHandlers(): array {
586
		return $this->wellKnownHandlers;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->wellKnownHandlers returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
587
	}
588
589
	/**
590
	 * @return ServiceRegistration<ICustomTemplateProvider>[]
591
	 */
592
	public function getTemplateProviders(): array {
593
		return $this->templateProviders;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->templateProviders returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
594
	}
595
596
	/**
597
	 * @return ServiceRegistration<INotifier>[]
598
	 */
599
	public function getNotifierServices(): array {
600
		return $this->notifierServices;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->notifierServices returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
601
	}
602
603
	/**
604
	 * @return ServiceRegistration<\OCP\Authentication\TwoFactorAuth\IProvider>[]
605
	 */
606
	public function getTwoFactorProviders(): array {
607
		return $this->twoFactorProviders;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->twoFactorProviders returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
608
	}
609
610
	/**
611
	 * @return PreviewProviderRegistration[]
612
	 */
613
	public function getPreviewProviders(): array {
614
		return $this->previewProviders;
615
	}
616
617
	/**
618
	 * @return ServiceRegistration<ICalendarProvider>[]
619
	 */
620
	public function getCalendarProviders(): array {
621
		return $this->calendarProviders;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->calendarProviders returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
622
	}
623
624
	/**
625
	 * @return ServiceRegistration<ILinkAction>[]
626
	 */
627
	public function getProfileLinkActions(): array {
628
		return $this->profileLinkActions;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->profileLinkActions returns the type OC\AppFramework\Bootstrap\ServiceRegistration which is incompatible with the type-hinted return array.
Loading history...
629
	}
630
631
	/**
632
	 * @return ServiceRegistration|null
633
	 * @psalm-return ServiceRegistration<ITalkBackend>|null
634
	 */
635
	public function getTalkBackendRegistration(): ?ServiceRegistration {
636
		return $this->talkBackendRegistration;
637
	}
638
}
639