, 'task'=>, 'data'=>] public static array $statusById = []; // id => ['id'=>, 'statusCode'=>..., 'data'=>[]] private static int $nextId = 1; public static function reset(): void { self::$submissions = []; self::$statusById = []; self::$nextId = 1; } /** * Stubbed submit compatible with production signature. * @return array{id: string, statusCode: string, data: array}|bool */ public static function submit(string $task, ?array $data = null, ?bool $async = false) { $id = (string)self::$nextId++; $record = ['id' => $id, 'task' => $task, 'data' => $data ?? []]; self::$submissions[] = $record; // Default initial status: waiting self::$statusById[$id] = ['id' => $id, 'statusCode' => self::TASK_WAITING, 'data' => $record['data']]; if ($async) return true; return self::$statusById[$id]; } /** * @param string|array $task */ public static function status($task) { if (is_array($task) && isset($task['id'])) { $task = $task['id']; } if (!is_string($task)) return false; return self::$statusById[$task] ?? ['id' => $task, 'statusCode' => self::NO_SUCH_TASK]; } public static function isFailed($task): bool { if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id'])) return true; // Consider failed if statusCode is none of waiting/processing/finished return !in_array($task['statusCode'], [self::TASK_WAITING, self::TASK_PROCESSING, self::TASK_FINISHED], true); } public static function isFinished($task): bool { if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id'])) return false; return !in_array($task['statusCode'], [self::TASK_WAITING, self::TASK_PROCESSING], true); } public static function isRunning($task): bool { if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id'])) return false; return in_array($task['statusCode'], [self::TASK_WAITING, self::TASK_PROCESSING], true); } public static function isTask($task): bool { if ($task === false) return false; if (is_string($task)) { $task = self::status($task); } return isset($task['statusCode']) && $task['statusCode'] !== self::NO_SUCH_INSTANCE && $task['statusCode'] !== self::NO_SUCH_TASK; } public static function addErrorMessage($task): void { if (!class_exists('Message')) return; if ($task === false) { Message::addError('main.taskmanager-error'); return; } if (!isset($task['statusCode'])) { Message::addError('main.taskmanager-format'); return; } if (isset($task['data']['error'])) { Message::addError('main.task-error', $task['statusCode'] . ' (' . $task['data']['error'] . ')'); return; } Message::addError('main.task-error', $task['statusCode']); } /** * Release a task: mark as NO_SUCH_TASK from now on */ public static function release($task): void { if (is_array($task) && isset($task['id'])) { $task = $task['id']; } if (!is_string($task)) return; self::$statusById[$task] = ['id' => $task, 'statusCode' => self::NO_SUCH_TASK]; } }