Skip to content

Commit 532a4c9

Browse files
committed
ci: Add a pre-build step to copy the avm2_report asset
1 parent f8dcb10 commit 532a4c9

File tree

5 files changed

+75
-27
lines changed

5 files changed

+75
-27
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"private": true,
55
"scripts": {
66
"dev": "next dev",
7+
"prebuild": "node scripts/fetch-ruffle-report.js",
78
"build": "next build",
89
"start": "next start",
910
"lint": "next lint"

scripts/fetch-ruffle-report.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
const fs = require("fs");
2+
const path = require("path");
3+
const { Readable } = require("stream");
4+
const { Octokit } = require("octokit");
5+
const { createTokenAuth } = require("@octokit/auth-token");
6+
7+
const owner = "ruffle-rs";
8+
const repo = "ruffle";
9+
const assetName = "avm2_report.json";
10+
const outputDir = path.resolve(__dirname, "..", "public");
11+
const outputFile = path.join(outputDir, assetName);
12+
13+
function createOctokit() {
14+
if (process.env.GITHUB_TOKEN) {
15+
const auth = createTokenAuth(process.env.GITHUB_TOKEN);
16+
return new Octokit({ authStrategy: () => auth });
17+
} else {
18+
console.warn("⚠️ No GITHUB_TOKEN set. Using unauthenticated GitHub API access.");
19+
return new Octokit();
20+
}
21+
}
22+
23+
async function downloadAsset(url, outputPath) {
24+
const res = await fetch(url);
25+
if (!res.ok) throw new Error(`Failed to download asset: ${res.statusText}`);
26+
27+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
28+
29+
const nodeStream = Readable.from(res.body);
30+
const fileStream = fs.createWriteStream(outputPath);
31+
32+
await new Promise((resolve, reject) => {
33+
nodeStream.pipe(fileStream);
34+
nodeStream.on("error", reject);
35+
fileStream.on("finish", resolve);
36+
});
37+
}
38+
39+
async function downloadAVM2Report() {
40+
try {
41+
const octokit = createOctokit();
42+
43+
// Get recent releases
44+
const { data: releases } = await octokit.rest.repos.listReleases({
45+
owner,
46+
repo,
47+
request: { next: { revalidate: 1800 } },
48+
per_page: 7,
49+
});
50+
51+
// Find first release with the desired asset
52+
const latest = releases.find((release) =>
53+
release.assets.some((a) => a.name === assetName)
54+
);
55+
56+
if (!latest) throw new Error(`No release contains asset "${assetName}"`);
57+
58+
const asset = latest.assets.find((a) => a.name === assetName);
59+
if (!asset) throw new Error("Unexpected: asset missing");
60+
61+
await downloadAsset(asset.browser_download_url, outputFile);
62+
63+
console.log(`✅ Downloaded ${assetName} from release "${latest.name}" to ${outputFile}`);
64+
} catch (err) {
65+
console.error("❌ Error:", err.message);
66+
process.exit(1);
67+
}
68+
}
69+
70+
(async () => {
71+
await downloadAVM2Report();
72+
})();

src/app/compatibility/avm2/report_utils.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export async function getReportByNamespace(): Promise<
2727
{ [name: string]: NamespaceStatus } | undefined
2828
> {
2929
let byNamespace: { [name: string]: NamespaceStatus } = {};
30-
const reportReq = await fetch("/compatibility/fetch-report");
30+
const reportReq = await fetch("/avm2_report.json");
3131
const report: AVM2Report = await reportReq.json();
3232
if (!report) {
3333
return;

src/app/compatibility/fetch-report/route.tsx

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/app/compatibility/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default function Downloads() {
3939
setAvm1ApiDone(avm1ApiRes);
4040

4141
// Fetch report
42-
const reportReq = await fetch("/compatibility/fetch-report");
42+
const reportReq = await fetch("/avm2_report.json");
4343
const reportRes = await reportReq.json();
4444
if (reportRes) {
4545
const { summary } = reportRes;

0 commit comments

Comments
 (0)