<?php
|
namespace JVBase\managers\queue;
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
use JVBase\managers\queue\mergers\DefaultMerger;
|
|
final class TypeRegistry
|
{
|
private array $configs = [];
|
|
public function register(string $type, TypeConfig $config): void
|
{
|
$this->validateRegistration($type, $config);
|
$this->configs[$type] = $config;
|
}
|
|
public function has(string $type): bool
|
{
|
return isset($this->configs[$type]);
|
}
|
|
public function getExecutor(string $type): ?Executor
|
{
|
return array_key_exists($type, $this->configs) ? $this->configs[$type]->executor : JVB()->queue()->executor;
|
}
|
|
public function getMergeable(string $type): ?Mergeable
|
{
|
$config = $this->configs[$type] ?? null;
|
if (!$config) {
|
return null;
|
}
|
|
// Explicit mergeable always wins
|
if ($config->mergeable) {
|
return $config->mergeable;
|
}
|
|
// Default merge based on chunkKey
|
if ($config->chunkKey) {
|
return new DefaultMerger($config->chunkKey);
|
}
|
|
return null;
|
}
|
|
public function getConfig(string $type): ?TypeConfig
|
{
|
return $this->configs[$type] ?? null;
|
}
|
|
public function getChunkConfig(string $type): ?array
|
{
|
$config = $this->configs[$type] ?? null;
|
if (!$config || empty($config->chunkKey)) {
|
return null;
|
}
|
return [
|
'key' => $config->chunkKey,
|
'size' => $config->chunkSize,
|
];
|
}
|
|
public function getMaxRetries(string $type): int
|
{
|
return $this->configs[$type]?->maxRetries ?? 3;
|
}
|
|
public function validateRegistration(string $type, TypeConfig $config): void
|
{
|
if ($config->executor && $config->chunkKey) {
|
// Verify executor can handle chunked operations
|
if (!method_exists($config->executor, 'execute')) {
|
throw new \InvalidArgumentException(
|
"Executor for '{$type}' must implement execute() method"
|
);
|
}
|
}
|
}
|
}
|