1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace Antidot\Queue\Container\Config; |
6
|
|
|
|
7
|
|
|
use Antidot\Queue\Cli\StartQueueConsumer; |
8
|
|
|
use Antidot\Queue\Container\ActionContainerFactory; |
9
|
|
|
use Antidot\Queue\Container\ContextFactory; |
10
|
|
|
use Antidot\Queue\Container\LoggerExtensionFactory; |
11
|
|
|
use Antidot\Queue\Container\MessageProcessorFactory; |
12
|
|
|
use Antidot\Queue\Container\ProducerFactory; |
13
|
|
|
use Antidot\Queue\Container\QueueConsumerFactory; |
14
|
|
|
use Antidot\Queue\Container\StartQueueConsumerFactory; |
15
|
|
|
use Antidot\Queue\Producer; |
16
|
|
|
use Assert\Assertion; |
17
|
|
|
use Assert\AssertionFailedException; |
18
|
|
|
use Enqueue\Consumption\Extension\LogExtension; |
19
|
|
|
use Enqueue\Consumption\Extension\LoggerExtension; |
20
|
|
|
use Enqueue\Consumption\Extension\SignalExtension; |
21
|
|
|
use Enqueue\Consumption\QueueConsumerInterface; |
22
|
|
|
use Enqueue\Null\NullContext; |
23
|
|
|
use Interop\Queue\Context; |
24
|
|
|
use Interop\Queue\Processor; |
25
|
|
|
use InvalidArgumentException; |
26
|
|
|
|
27
|
|
|
use function sprintf; |
28
|
|
|
|
29
|
|
|
class ConfigProvider |
30
|
|
|
{ |
31
|
|
|
public const CONFIG_KEY = 'config'; |
32
|
|
|
public const QUEUES_KEY = 'queues'; |
33
|
|
|
public const CONTAINER_KEY = 'container'; |
34
|
|
|
public const CONTEXTS_KEY = 'contexts'; |
35
|
|
|
public const CONTEXT_SERVICE_KEY = 'context_service'; |
36
|
|
|
public const CONTEXTS_TYPE_KEY = 'context_type'; |
37
|
|
|
public const DEFAULT_CONTEXT_TYPE = 'null'; |
38
|
|
|
public const DEFAULT_CONTEXT_KEY = 'default_context'; |
39
|
|
|
public const EXTENSIONS_KEY = 'extensions'; |
40
|
|
|
public const DEFAULT_CONTEXT = 'default'; |
41
|
|
|
public const DEFAULT_CONTEXT_SERVICE = 'queue.context.default'; |
42
|
|
|
public const DEFAULT_CONTAINER_SERVICE = 'queue.container.default'; |
43
|
|
|
public const DEFAULT_EXTENSIONS = [ |
44
|
|
|
LoggerExtension::class, |
45
|
|
|
SignalExtension::class, |
46
|
|
|
LogExtension::class, |
47
|
|
|
]; |
48
|
|
|
public const MESSAGE_TYPES_KEY = 'message_types'; |
49
|
|
|
public const INVALID_CONFIG_ARRAY_MESSAGE = 'Value for key "%s" must be of type array.'; |
50
|
|
|
public const MISSING_CONFIG_MESSAGE = 'Missing config required key "%s", see the docs for complete config.'; |
51
|
|
|
public const INVALID_CONTEXT_MESSAGE = 'Given context "%s" is not properly defined in the config.'; |
52
|
|
|
public const DEFAULT_CONFIG = [ |
53
|
|
|
self::QUEUES_KEY => [ |
54
|
|
|
self::DEFAULT_CONTEXT_KEY => self::DEFAULT_CONTEXT, |
55
|
|
|
self::CONTEXTS_KEY => [ |
56
|
|
|
self::DEFAULT_CONTEXT => [ |
57
|
|
|
self::CONTEXTS_TYPE_KEY => self::DEFAULT_CONTEXT_TYPE, |
58
|
|
|
self::CONTEXT_SERVICE_KEY => self::DEFAULT_CONTEXT_SERVICE, |
59
|
|
|
self::CONTAINER_KEY => self::DEFAULT_CONTAINER_SERVICE, |
60
|
|
|
self::EXTENSIONS_KEY => self::DEFAULT_EXTENSIONS, |
61
|
|
|
], |
62
|
|
|
], |
63
|
|
|
], |
64
|
|
|
'factories' => [ |
65
|
|
|
self::DEFAULT_CONTAINER_SERVICE => ActionContainerFactory::class, |
66
|
|
|
self::DEFAULT_CONTEXT_SERVICE => ContextFactory::class, |
67
|
|
|
Processor::class => MessageProcessorFactory::class, |
68
|
|
|
Producer::class => ProducerFactory::class, |
69
|
|
|
LoggerExtension::class => LoggerExtensionFactory::class, |
70
|
|
|
], |
71
|
|
|
'services' => [ |
72
|
|
|
Context::class => self::DEFAULT_CONTEXT_SERVICE, |
73
|
|
|
SignalExtension::class => SignalExtension::class, |
74
|
|
|
LogExtension::class => LogExtension::class, |
75
|
|
|
], |
76
|
|
|
'console' => [ |
77
|
|
|
'commands' => [ |
78
|
|
|
StartQueueConsumer::NAME => StartQueueConsumer::class, |
79
|
|
|
], |
80
|
|
|
'factories' => [ |
81
|
|
|
StartQueueConsumer::class => StartQueueConsumerFactory::class, |
82
|
|
|
QueueConsumerInterface::class => QueueConsumerFactory::class, |
83
|
|
|
], |
84
|
|
|
], |
85
|
|
|
]; |
86
|
|
|
|
87
|
|
|
/** |
88
|
|
|
* @return array<mixed> |
89
|
|
|
*/ |
90
|
1 |
|
public function __invoke(): array |
91
|
|
|
{ |
92
|
1 |
|
return self::DEFAULT_CONFIG; |
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
/** |
96
|
|
|
* @param array<mixed> $config |
97
|
|
|
* @return array<mixed> |
98
|
|
|
* @throws AssertionFailedException |
99
|
|
|
*/ |
100
|
13 |
|
public static function getContextConfig(string $contextName, array $config): array |
101
|
|
|
{ |
102
|
13 |
|
ConfigProvider::validate($config); |
103
|
|
|
|
104
|
13 |
|
$contextsConfig = $config[ConfigProvider::QUEUES_KEY][ConfigProvider::CONTEXTS_KEY]; |
105
|
13 |
|
if (false === array_key_exists($contextName, $contextsConfig)) { |
106
|
1 |
|
throw new InvalidArgumentException(sprintf(ConfigProvider::INVALID_CONTEXT_MESSAGE, $contextName)); |
107
|
|
|
} |
108
|
|
|
|
109
|
12 |
|
return $contextsConfig[$contextName]; |
110
|
|
|
} |
111
|
|
|
|
112
|
|
|
|
113
|
|
|
/** |
114
|
|
|
* @param array<mixed> $config |
115
|
|
|
* @throws AssertionFailedException |
116
|
|
|
*/ |
117
|
13 |
|
public static function validate(array $config): void |
118
|
|
|
{ |
119
|
13 |
|
Assertion::keyExists($config, self::QUEUES_KEY, sprintf(self::MISSING_CONFIG_MESSAGE, self::QUEUES_KEY)); |
120
|
13 |
|
Assertion::isArray($config[self::QUEUES_KEY], sprintf(self::INVALID_CONFIG_ARRAY_MESSAGE, self::QUEUES_KEY)); |
121
|
13 |
|
Assertion::keyExists( |
122
|
13 |
|
$config[self::QUEUES_KEY], |
123
|
13 |
|
self::CONTEXTS_KEY, |
124
|
13 |
|
sprintf(self::MISSING_CONFIG_MESSAGE, self::CONTEXTS_KEY) |
125
|
|
|
); |
126
|
13 |
|
} |
127
|
|
|
} |
128
|
|
|
|