definitions = $definitions; } public function get(string $name): mixed { if (!isset($this->definitions[$name])) { throw new \RuntimeException("Could not find a dependency named $name"); } $ret = $this->definitions[$name]; if (is_callable($ret) && !is_string($ret) && !is_array($ret)) { $ret = $ret($this); $this->definitions[$name] = $ret; } return $ret; } } function build_context(array $config): Context { return new Context([ 'config' => $config, LogDriver::class => function($c) { $config = $c->get('config'); $name = $config['log_system']['name']; $level = $config['debug'] ? LogDriver::DEBUG : LogDriver::NOTICE; $backend = $config['log_system']['type']; $legacy_syslog = isset($config['syslog']) && $config['syslog']; // Check 'syslog' for backwards compatibility. if ($legacy_syslog || $backend === 'syslog') { $log_driver = new SyslogLogDriver($name, $level, $config['log_system']['syslog_stderr']); if ($legacy_syslog) { $log_driver->log(LogDriver::NOTICE, 'The configuration setting \'syslog\' is deprecated. Please use \'log_system\' instead'); } return $log_driver; } elseif ($backend === 'file') { return new FileLogDriver($name, $level, $config['log_system']['file_path']); } elseif ($backend === 'stderr') { return new StderrLogDriver($name, $level); } elseif ($backend === 'error_log') { return new ErrorLogLogDriver($name, $level); } else { $log_driver = new ErrorLogLogDriver($name, $level); $log_driver->log(LogDriver::ERROR, "Unknown 'log_system' value '$backend', using 'error_log' default"); return $log_driver; } }, CacheDriver::class => function($c) { // Use the global for backwards compatibility. return \cache::getCache(); }, HttpDriver::class => function($c) { $config = $c->get('config'); return new HttpDriver($config['upload_by_url_timeout'], $config['max_filesize']); }, \PDO::class => function($c) { global $pdo; // Ensure the PDO is initialized. sql_open(); return $pdo; }, ReportQueries::class => function($c) { $auto_maintenance = (bool)$c->get('config')['auto_maintenance']; $pdo = $c->get(\PDO::class); return new ReportQueries($pdo, $auto_maintenance); }, UserPostQueries::class => function($c) { return new UserPostQueries($c->get(\PDO::class)); }, IpNoteQueries::class => fn($c) => new IpNoteQueries($c->get(\PDO::class), $c->get(CacheDriver::class)), OembedExtractor::class => fn($c) => new OembedExtractor( $c->get(CacheDriver::class), $c->get(HttpDriver::class), $c->get('config')['embed_thumb_timeout'] ), EmbedService::class => function($c) { $config = $c->get('config'); return new EmbedService( $c->get(LogDriver::class), $c->get(OembedExtractor::class), $config['embedding_2'], $config['embed_thumb_timeout'] ); } ]); }