Skip to content

Commit 5e9ee6a

Browse files
tastybentoclaude
andcommitted
Fix silent failures in updateAsset and updateJenkins
- Await addonDatabase.update() in both functions so DB write errors are thrown rather than silently lost as unhandled rejections - Add .catch(logErr) to all cron updateAsset/updateJenkins/downloadOldVersion calls so any failure surfaces in the server log - Fix releaseId comparison: column is stored as text but was compared with === against a number, causing every addon to re-download every tick - Guard updateJenkins in-memory version update against undefined addon Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 07ac6d8 commit 5e9ee6a

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

src/api/api.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,25 +138,31 @@ export default class ApiManager {
138138
cron.schedule('*/6 * * * *', () => {
139139
this.generateDownloads();
140140
this.refreshBlueprints();
141+
const logErr = (name: string) => (e: unknown) =>
142+
console.error(`[cron] ${name} failed:`, (e as Error)?.message ?? e);
141143
if (undefinedAddons.length > 0) {
142144
for (let i = 0; i < (undefinedAddons.length > repeats ? repeats : undefinedAddons.length); i++) {
143-
this.updateAsset(undefinedAddons[0]).then();
145+
this.updateAsset(undefinedAddons[0]).catch(logErr(undefinedAddons[0].name));
144146
undefinedAddons.shift();
145147
}
146148
} else if (oldAddonList.length > 0) {
147149
for (let i = 0; i < (oldAddonList.length > repeats ? repeats : oldAddonList.length); i++) {
148-
this.downloadOldVersion(oldAddonList[0]).then();
150+
this.downloadOldVersion(oldAddonList[0]).catch(logErr(oldAddonList[0].addon));
149151
oldAddonList.shift();
150152
}
151153
} else {
152154
for (let i = 0; i < repeats; i++) {
153-
this.updateAsset(configConstructor.addons[updateAddon]).then();
155+
this.updateAsset(configConstructor.addons[updateAddon]).catch(
156+
logErr(configConstructor.addons[updateAddon].name),
157+
);
154158
updateAddon++;
155159
if (updateAddon >= configConstructor.addons.length) updateAddon = 0;
156160
}
157161
}
158162
for (let i = 0; i < 4; i++) {
159-
this.updateJenkins(configConstructor.addons[updateCiAddon]).then();
163+
this.updateJenkins(configConstructor.addons[updateCiAddon]).catch(
164+
logErr(configConstructor.addons[updateCiAddon].name),
165+
);
160166
updateCiAddon++;
161167
if (updateCiAddon >= configConstructor.addons.length) updateCiAddon = 0;
162168
}
@@ -328,12 +334,13 @@ export default class ApiManager {
328334
project.split('/')[1]
329335
}/lastSuccessfulBuild/artifact/target/${assetURL}`,
330336
);
331-
addonDatabase.update({
337+
await addonDatabase.update({
332338
ci: buffer,
333339
ciId: latestJenkins,
334340
ciJarFile: assetURL,
335341
});
336-
this.addons.filter((a) => a.name === addon.name)[0].versions.beta = String(latestJenkins);
342+
const liveAddon = this.addons.filter((a) => a.name === addon.name)[0];
343+
if (liveAddon) liveAddon.versions.beta = String(latestJenkins);
337344
});
338345
}
339346

@@ -372,7 +379,7 @@ export default class ApiManager {
372379

373380
const addonDatabase: DatabaseModel | null = await this.jarCache.findOne({ where: { name: addon.name } });
374381

375-
if (addonDatabase && latestRelease.data.id === addonDatabase.releaseId) return;
382+
if (addonDatabase && String(latestRelease.data.id) === String(addonDatabase.releaseId)) return;
376383

377384
const releaseFiles = await this.octokit.rest.repos.listReleaseAssets({
378385
owner: addon.github.split('/')[0],
@@ -415,7 +422,7 @@ export default class ApiManager {
415422
version: latestRelease.data.tag_name,
416423
});
417424
} else {
418-
addonDatabase.update({
425+
await addonDatabase.update({
419426
release: Buffer.from(<ArrayBuffer>(<unknown>asset.data)),
420427
releaseId: latestRelease.data.id,
421428
releaseJarFile: assetURL.name,

0 commit comments

Comments
 (0)