function () use ($install) { return $install ? Akkedli_V2_Outbox_Schema::maybe_install() : Akkedli_V2_Outbox_Schema::ready(); }, 'database' => function () { return (new Akkedli_V2_Outbox_Repository())->is_usable(); }, 'encryption' => array(__CLASS__, 'crypto_ready'), 'scheduler' => array(__CLASS__, 'scheduler_ready'), 'worker' => array(__CLASS__, 'worker_ready'), 'recurring_action' => array(__CLASS__, 'recurring_ready'), ); if (is_callable($probes)) { return array('ready' => true === call_user_func($probes), 'reason' => 'override'); } $checks = is_array($probes) ? array_merge($defaults, $probes) : $defaults; foreach ($checks as $reason => $probe) { try { if (!is_callable($probe) || true !== call_user_func($probe)) { return array('ready' => false, 'reason' => $reason); } } catch (Throwable $error) { unset($error); return array('ready' => false, 'reason' => $reason); } } return array('ready' => true, 'reason' => 'ready'); } public static function crypto_ready() { $event = hash('sha256', 'akkedli-outbox-readiness'); $value = array('probe' => true); $sealed = Akkedli_V2_Outbox_Crypto::seal($value, $event, 'order'); $opened = Akkedli_V2_Outbox_Crypto::open($sealed, $event, 'order'); unset($sealed); return $opened === $value; } public static function scheduler_ready() { return class_exists('ActionScheduler') && method_exists('ActionScheduler', 'is_initialized') && ActionScheduler::is_initialized() && function_exists('as_next_scheduled_action') && function_exists('as_schedule_recurring_action'); } public static function worker_ready() { if (!function_exists('has_action')) return false; foreach (array(Akkedli_V2_Outbox_Worker::CAPTURE_HOOK, Akkedli_V2_Outbox_Worker::DELIVERY_HOOK, Akkedli_V2_Outbox_Worker::RECOVERY_HOOK) as $hook) { if (false === has_action($hook)) return false; } return true; } public static function recurring_ready() { return self::scheduler_ready() && Akkedli_V2_Outbox_Worker::initialize() && false !== as_next_scheduled_action( Akkedli_V2_Outbox_Worker::RECOVERY_HOOK, array(), Akkedli_V2_Outbox_Worker::GROUP ); } }