Skip to content

Commit e21a55c

Browse files
committed
fix: normalize single manifest response for platform list
1 parent 65b2363 commit e21a55c

File tree

1 file changed

+48
-3
lines changed

1 file changed

+48
-3
lines changed

server/api/docker/manifest.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,21 @@ type ManifestResponse = {
3131
schemaVersion: number;
3232
};
3333

34+
type SingleManifestResponse = {
35+
config: {
36+
digest: string;
37+
mediaType: string;
38+
size: number;
39+
};
40+
layers: Array<{
41+
digest: string;
42+
mediaType: string;
43+
size: number;
44+
}>;
45+
mediaType: string;
46+
schemaVersion: number;
47+
};
48+
3449
export default defineEventHandler(async (event): Promise<ManifestResponse> => {
3550
const query = getQuery(event) as QueryParams;
3651
const rawImageName = query.imageName || "";
@@ -40,7 +55,9 @@ export default defineEventHandler(async (event): Promise<ManifestResponse> => {
4055
logger.info("manifest request", { imageName, tag });
4156

4257
const fetchManifest = async () => {
43-
const response = await axiosInstance.get<ManifestResponse>(
58+
const response = await axiosInstance.get<
59+
ManifestResponse | SingleManifestResponse
60+
>(
4461
`https://registry-1.docker.io/v2/${imageName}/manifests/${tag}`,
4562
{
4663
headers: {
@@ -55,8 +72,36 @@ export default defineEventHandler(async (event): Promise<ManifestResponse> => {
5572

5673
try {
5774
const result = await fetchManifest();
58-
logger.info("manifest success", { imageName, tag, count: result.manifests?.length || 0 });
59-
return result;
75+
if ("manifests" in result && Array.isArray(result.manifests)) {
76+
logger.info("manifest success", {
77+
imageName,
78+
tag,
79+
count: result.manifests.length,
80+
});
81+
return result;
82+
}
83+
84+
const normalized: ManifestResponse = {
85+
manifests: [
86+
{
87+
digest: tag,
88+
mediaType: result.mediaType,
89+
platform: {
90+
architecture: "unknown",
91+
os: "unknown",
92+
},
93+
size: 0,
94+
},
95+
],
96+
mediaType: result.mediaType,
97+
schemaVersion: result.schemaVersion ?? 2,
98+
};
99+
logger.info("manifest success (single)", {
100+
imageName,
101+
tag,
102+
count: normalized.manifests.length,
103+
});
104+
return normalized;
60105
} catch (error: any) {
61106
logger.error("manifest failed", { imageName, tag, message: error.message });
62107
throw createError({

0 commit comments

Comments
 (0)