. */ namespace SP\Services\Task; use RuntimeException; use SP\Core\Messages\TaskMessage; use SP\Storage\File\FileException; /** * Class TaskFactory * * @package SP\Core */ final class TaskFactory { /** * @var Task[] */ private static $tasks = []; /** * Crear una tarea para la actualización de estado de la actualización * * @param string $name * @param string $id * * @param bool $hasSession * * @return Task * @throws FileException */ public static function create($name, $id, $hasSession = true) { $task = self::add((new Task($name, $id))); if ($hasSession) { return $task->registerSession(); } return $task->register(); } /** * @param Task $task * * @return Task */ private static function add(Task $task) { if (!isset(self::$tasks[$task->getUid()])) { self::$tasks[$task->getUid()] = $task; return $task; } throw new RuntimeException('Task already registered'); } /** * Finalizar la tarea * * @param Task $task */ public static function end(Task $task) { self::get($task->getUid()) ->end(); self::delete($task->getUid()); } /** * @param $id * * @return Task */ private static function get($id) { if (isset(self::$tasks[$id])) { return self::$tasks[$id]; } throw new RuntimeException('Task not registered'); } /** * @param $id */ private static function delete($id) { if (isset(self::$tasks[$id])) { unset(self::$tasks[$id]); } } /** * @param string $taskId * @param string $task * * @return TaskMessage */ public static function createMessage($taskId, $task) { return new TaskMessage($taskId, $task); } /** * Enviar un mensaje de actualización a la tarea * * @param Task $task * @param TaskMessage $taskMessage */ public static function update(Task $task, TaskMessage $taskMessage) { self::get($task->getUid()) ->writeJsonStatusAndFlush($taskMessage); } }