Files
Gregor Zeitlinger a53aaf4141 refactor(java-version): extract adoptium HTTP logic from datasource class (#42604)
* refactor(java-version): extract adoptium HTTP logic from datasource class

Move getPageReleases and the Adoptium fetch logic out of the
JavaVersionDatasource class into a standalone adoptium.ts module.
This makes the code easier to test in isolation and decouples
Adoptium-specific logic from the datasource class.

No behavior change — customRegistrySupport remains false, and the
hardcoded adoptiumRegistryUrl replaces the previously injected
defaultRegistryUrl (which was always the same value).

* fix(java-version): remove unused adoptiumRegistryUrl import from test

* test(java-version): use partial helper in spec

* refactor(java-version): extract adoptium HTTP logic from datasource class

* fix(java-version): pass Adoptium schema to HTTP client

* test(java-version): move Adoptium test to module spec

* chore(ci): retrigger failed checks
2026-08-18 08:13:54 +00:00

82 lines
2.2 KiB
TypeScript

import { logger } from '../../../logger/index.ts';
import { ExternalHostError } from '../../../types/errors/external-host-error.ts';
import { type Http, HttpError } from '../../../util/http/index.ts';
import type { Release, ReleaseResult } from '../types.ts';
import { pageSize } from './common.ts';
import { AdoptiumJavaResponse } from './schema.ts';
import type { PackageConfig } from './types.ts';
export const adoptiumRegistryUrl = 'https://api.adoptium.net/';
async function getPageReleases(
http: Http,
url: string,
page: number,
): Promise<Release[] | null> {
const pgUrl = `${url}&page=${page}`;
try {
const pgRes = await http.getJson(pgUrl, AdoptiumJavaResponse);
return (
pgRes?.body?.versions?.map(({ semver }) => ({
version: semver,
})) ?? null
);
} catch (err) {
if (
page !== 0 &&
err instanceof HttpError &&
err.response?.statusCode === 404
) {
// No more pages
return null;
}
throw err;
}
}
export async function getAdoptiumReleases(
http: Http,
pkgConfig: PackageConfig,
): Promise<ReleaseResult | null> {
logger.trace({ pkgConfig }, 'fetching Adoptium releases');
let url = `${adoptiumRegistryUrl}v3/info/release_versions?page_size=${pageSize}&image_type=${pkgConfig.imageType}&project=jdk&release_type=ga&sort_method=DATE&sort_order=DESC`;
if (pkgConfig.architecture) {
url += `&architecture=${pkgConfig.architecture}`;
}
if (pkgConfig.os) {
url += `&os=${pkgConfig.os}`;
}
const result: ReleaseResult = {
homepage: 'https://adoptium.net',
releases: [],
};
try {
let page = 0;
let releases = await getPageReleases(http, url, page);
while (releases) {
result.releases.push(...releases);
if (releases.length !== pageSize || page >= 50) {
break;
}
page += 1;
releases = await getPageReleases(http, url, page);
}
} catch (err) {
if (err instanceof HttpError) {
if (err.response?.statusCode !== 404) {
throw new ExternalHostError(err);
}
// 404 is handled by getPageReleases, so if we get here it's an unexpected 404
return null;
}
throw err;
}
return result.releases.length ? result : null;
}