| 
<?phpdeclare(strict_types=1);
 
 namespace frdlweb\Api\Rpc;
 
 use Opis\JsonSchema\Loaders\File;
 use Opis\JsonSchema\Schema;
 
 class SchemaLoader extends File
 {
 /** @var string[] */
 protected $dirs;
 /** @var string */
 protected $prefix;
 /** @var int */
 protected $prefixLength;
 
 protected $cacheDir;
 /**
 * File constructor.
 * @param string $prefix
 * @param string[] $dirs
 */
 public function __construct(string $prefix = '', array $dirs,string $cacheDir = null)
 {
 
 
 $this->dirs = $dirs;
 $this->prefix = $prefix;
 $this->prefixLength = strlen($prefix);
 if(!$cacheDir){
 $cacheDir = sys_get_temp_dir() . \DIRECTORY_SEPARATOR . get_current_user(). \DIRECTORY_SEPARATOR . 'json-schema-store' . \DIRECTORY_SEPARATOR;
 }
 $this->cacheDir = $cacheDir;
 
 }
 
 
 public function prueCache(int $limit = 86400, $removeDir = false, $skipDotFiles = true){
 return \webfan\hps\patch\Fs::pruneDir($this->cacheDir, $limit, $skipDotFiles, $removeDir);
 }
 
 public function filepath($uri){
 $path = str_replace(['http://', 'https://', '/'], ['','',\DIRECTORY_SEPARATOR], $uri);
 return rtrim($this->cacheDir, \DIRECTORY_SEPARATOR.'/ ').\DIRECTORY_SEPARATOR.$path;
 }
 /**
 * @inheritDoc
 */
 public function loadSchema(string $uri)
 {
 if (isset($this->schemas[$uri])) {
 return $this->schemas[$uri];
 }
 if ($this->prefixLength !== 0 && strpos($uri, $this->prefix) !== 0) {
 return null;
 }
 $path = substr($uri, $this->prefixLength);
 
 
 $schema = null;
 
 
 $cacheFile = $this->filepath($uri);
 
 
 if(file_exists($cacheFile) && is_file($cacheFile)){
 $schema = json_decode(file_get_contents($cacheFile), false);
 $schema = new Schema($schema, $uri);
 }
 
 if(null === $schema){
 foreach ($this->dirs as $dir) {
 if (file_exists($dir . $path)) {
 $schema = json_decode(file_get_contents($dir . $path), false);
 $schema = new Schema($schema, $uri);
 break;
 }
 }
 }
 
 
 if(null === $schema){
 
 $c = file_get_contents($uri);
 if(false!==$c){
 if(!is_dir(dirname($cacheFile))){
 mkdir($cacheFile, 0755, true);
 }
 file_put_contents($cacheFile, $c);
 $schema = json_decode($c, false);
 $schema = new Schema($schema, $uri);
 }
 }
 
 
 
 
 $this->schemas[$uri] = $schema;
 return $schema;
 }
 }
 
 
 |