Batch extension version checks
| @@ -586,7 +586,6 @@ function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, | ||
| 586 | 586 | const isUserAdmin = isAdmin(); |
| 587 | 587 | const extensionIcon = getExtensionIcon(); |
| 588 | 588 | const displayName = manifest.display_name; |
| 589 | - let displayVersion = manifest.version ? ` v${manifest.version}` : ''; | |
| 590 | 589 | const externalId = name.replace('third-party', ''); |
| 591 | 590 | let originHtml = ''; |
| 592 | 591 | if (isExternal) { |
| @@ -632,7 +631,7 @@ function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, | ||
| 632 | 631 | ${originHtml} |
| 633 | 632 | <span class="${isActive ? 'extension_enabled' : isDisabled ? 'extension_disabled' : 'extension_missing'}"> |
| 634 | 633 | <span class="extension_name">${DOMPurify.sanitize(displayName)}</span> |
| 635 | 634 | <span class="extension_version">${displayVersion}</span> |
| 636 | 635 | ${modulesInfo} |
| 637 | 636 | </span> |
| 638 | 637 | ${isExternal ? '</a>' : ''} |
| @@ -1032,6 +1031,29 @@ export function doDailyExtensionUpdatesCheck() { | ||
| 1032 | 1031 | }, 1); |
| 1033 | 1032 | } |
| 1034 | 1033 | |
| 1034 | +const concurrencyLimit = 5; | |
| 1035 | +let activeRequestsCount = 0; | |
| 1036 | +const versionCheckQueue = []; | |
| 1037 | + | |
| 1038 | +function enqueueVersionCheck(fn) { | |
| 1039 | + return new Promise((resolve, reject) => { | |
| 1040 | + versionCheckQueue.push(() => fn().then(resolve).catch(reject)); | |
| 1041 | + processVersionCheckQueue(); | |
| 1042 | + }); | |
| 1043 | +} | |
| 1044 | + | |
| 1045 | +function processVersionCheckQueue() { | |
| 1046 | + if (activeRequestsCount >= concurrencyLimit || versionCheckQueue.length === 0) { | |
| 1047 | + return; | |
| 1048 | + } | |
| 1049 | + activeRequestsCount++; | |
| 1050 | + const fn = versionCheckQueue.shift(); | |
| 1051 | + fn().finally(() => { | |
| 1052 | + activeRequestsCount--; | |
| 1053 | + processVersionCheckQueue(); | |
| 1054 | + }); | |
| 1055 | +} | |
| 1056 | + | |
| 1035 | 1057 | /** |
| 1036 | 1058 | * Performs a manual check for updates on all 3rd-party extensions. |
| 1037 | 1059 | * @param {AbortSignal} abortSignal Signal to abort the operation |
| @@ -1041,7 +1063,7 @@ async function checkForUpdatesManual(abortSignal) { | ||
| 1041 | 1063 | const promises = []; |
| 1042 | 1064 | for (const id of Object.keys(manifests).filter(x => x.startsWith('third-party'))) { |
| 1043 | 1065 | const externalId = id.replace('third-party', ''); |
| 1044 | 1066 | const promise = new PromiseenqueueVersionCheck(async (resolve, reject) => { |
| 1045 | 1067 | try { |
| 1046 | 1068 | const data = await getExtensionVersion(externalId, abortSignal); |
| 1047 | 1069 | const extensionBlock = document.querySelector(`.extension_block[data-name="${externalId}"]`); |
| @@ -1072,10 +1094,8 @@ async function checkForUpdatesManual(abortSignal) { | ||
| 1072 | 1094 | versionElement.textContent += ` (${branch}-${commitHash.substring(0, 7)})`; |
| 1073 | 1095 | } |
| 1074 | 1096 | } |
| 1075 | - resolve(); | |
| 1076 | 1097 | } catch (error) { |
| 1077 | 1098 | console.error('Error checking for extension updates', error); |
| 1078 | - reject(); | |
| 1079 | 1099 | } |
| 1080 | 1100 | }); |
| 1081 | 1101 | promises.push(promise); |
| @@ -1111,17 +1131,16 @@ async function checkForExtensionUpdates(force) { | ||
| 1111 | 1131 | console.debug(`Skipping global extension: ${manifest.display_name} (${id}) for non-admin user`); |
| 1112 | 1132 | continue; |
| 1113 | 1133 | } |
| 1134 | + | |
| 1114 | 1135 | if (manifest.auto_update && id.startsWith('third-party')) { |
| 1115 | 1136 | const promise = new PromiseenqueueVersionCheck(async (resolve, reject) => { |
| 1116 | 1137 | try { |
| 1117 | 1138 | const data = await getExtensionVersion(id.replace('third-party', '')); |
| 1118 | 1139 | if (!data.isUpToDate === false) { |
| 1119 | 1140 | updatesAvailable.push(manifest.display_name); |
| 1120 | 1141 | } |
| 1121 | - resolve(); | |
| 1122 | 1142 | } catch (error) { |
| 1123 | 1143 | console.error('Error checking for extension updates', error); |
| 1124 | - reject(); | |
| 1125 | 1144 | } |
| 1126 | 1145 | }); |
| 1127 | 1146 | promises.push(promise); |