Skip to content
Snippets Groups Projects
Select Git revision
  • 1a477cde98f427d6fd436c932f46c3e4868634af
  • master default protected
  • gh-pages
  • dependabot/npm_and_yarn/nock-14.0.9
  • dependabot/npm_and_yarn/react-19.1.1
  • dependabot/npm_and_yarn/react-dom-19.1.1
  • server-2025-08-01-57ada99c
  • server-2025-02-01-6100669a
  • server-2024-11-01-87cba042
  • server-2024-10-01-6875b7c8
  • dependabot/npm_and_yarn/path-to-regexp-8.2.0
  • server-2024-09-01-3d52575c
  • daily-tests-gha2
  • daily-tests-gha
  • server-2023-12-01-92d8fb8e
  • server-2023-11-01-a80c93fd
  • server-2023-10-01-31096085
  • coc-v2
  • server-2023-09-01-8edc3810
  • server-2023-08-01-75858a03
  • server-2023-07-01-02183d8d
  • server-2025-08-03
  • server-2025-07-01
  • 5.0.2
  • 5.0.1
  • 5.0.0
  • server-2025-06-01
  • server-2025-05-01
  • server-2025-04-03
  • server-2025-03-02
  • server-2025-03-01
  • server-2025-02-02
  • server-2025-01-01
  • server-2024-12-01
  • server-2024-11-02
  • 4.1.0
  • server-2024-09-25
  • server-2024-09-02
  • server-2024-08-01
  • server-2024-07-01
  • 4.0.0
41 results

module-services_dynamic_json-path.html

Blame
  • dockerhub-cache.ts 2.57 KiB
    import { dequal } from 'dequal';
    import { DateTime } from 'luxon';
    import * as packageCache from '../../../util/cache/package';
    import type { DockerHubTag } from './schema';
    
    export interface DockerHubCacheData {
      items: Record<number, DockerHubTag>;
      updatedAt: string | null;
    }
    
    const cacheNamespace = 'datasource-docker-hub-cache';
    
    export class DockerHubCache {
      private isChanged = false;
      private reconciledIds = new Set<number>();
    
      private constructor(
        private dockerRepository: string,
        private cache: DockerHubCacheData,
      ) {}
    
      static async init(dockerRepository: string): Promise<DockerHubCache> {
        let repoCache = await packageCache.get<DockerHubCacheData>(
          cacheNamespace,
          dockerRepository,
        );
    
        repoCache ??= {
          items: {},
          updatedAt: null,
        };
    
        return new DockerHubCache(dockerRepository, repoCache);
      }
    
      reconcile(items: DockerHubTag[], expectedCount: number): boolean {
        let needNextPage = true;
    
        let earliestDate = null;
    
        let { updatedAt } = this.cache;
        let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;
    
        for (const newItem of items) {
          const id = newItem.id;
          this.reconciledIds.add(id);
    
          const oldItem = this.cache.items[id];
    
          const itemDate = DateTime.fromISO(newItem.last_updated);
    
          if (!earliestDate || earliestDate > itemDate) {
            earliestDate = itemDate;
          }
    
          if (!latestDate || latestDate < itemDate) {
            latestDate = itemDate;
            updatedAt = newItem.last_updated;
          }
    
          if (dequal(oldItem, newItem)) {
            needNextPage = false;
            continue;
          }
    
          this.cache.items[newItem.id] = newItem;
          this.isChanged = true;
        }
    
        this.cache.updatedAt = updatedAt;
    
        if (earliestDate && latestDate) {
          for (const [key, item] of Object.entries(this.cache.items)) {
            const id = parseInt(key, 10);
    
            const itemDate = DateTime.fromISO(item.last_updated);
    
            if (
              itemDate < earliestDate ||
              itemDate > latestDate ||
              this.reconciledIds.has(id)
            ) {
              continue;
            }
    
            delete this.cache.items[id];
            this.isChanged = true;
          }
    
          if (Object.keys(this.cache.items).length > expectedCount) {
            return true;
          }
        }
    
        return needNextPage;
      }
    
      async save(): Promise<void> {
        if (this.isChanged) {
          await packageCache.set(
            cacheNamespace,
            this.dockerRepository,
            this.cache,
            3 * 60 * 24 * 30,
          );
        }
      }
    
      getItems(): DockerHubTag[] {
        return Object.values(this.cache.items);
      }
    }