diff --git a/.vscode/settings.json b/.vscode/settings.json index 0ae8d411..435e4bdb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,4 +12,5 @@ "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, + "typescript.tsdk": "./src/node_modules/typescript/lib" } \ No newline at end of file diff --git a/src/components/Client/Charts.vue b/src/components/Client/Charts.vue index e8ed2c68..4dbf0f72 100644 --- a/src/components/Client/Charts.vue +++ b/src/components/Client/Charts.vue @@ -32,8 +32,8 @@ const chartOptionsTX = computed(() => { ...chartOptions, colors: [CHART_COLORS.tx[theme.value]], }; - opts.chart.type = UI_CHART_TYPES[globalStore.uiChartType].type || undefined; - opts.stroke.width = UI_CHART_TYPES[globalStore.uiChartType].strokeWidth; + opts.chart.type = UI_CHART_TYPES[globalStore.uiChartType]?.type || undefined; + opts.stroke.width = UI_CHART_TYPES[globalStore.uiChartType]?.strokeWidth ?? 0; return opts; }); @@ -42,8 +42,8 @@ const chartOptionsRX = computed(() => { ...chartOptions, colors: [CHART_COLORS.rx[theme.value]], }; - opts.chart.type = UI_CHART_TYPES[globalStore.uiChartType].type || undefined; - opts.stroke.width = UI_CHART_TYPES[globalStore.uiChartType].strokeWidth; + opts.chart.type = UI_CHART_TYPES[globalStore.uiChartType]?.type || undefined; + opts.stroke.width = UI_CHART_TYPES[globalStore.uiChartType]?.strokeWidth ?? 0; return opts; }); diff --git a/src/server/api/release.get.ts b/src/server/api/release.get.ts index 9734f984..7d6beaf8 100644 --- a/src/server/api/release.get.ts +++ b/src/server/api/release.get.ts @@ -1,9 +1,8 @@ -export default defineEventHandler((event) => { - setHeader(event, 'Content-Type', 'application/json'); +export default defineEventHandler(async () => { const release = Number.parseInt(RELEASE, 10); - if (isNaN(release)) { - return 0; - } - // TODO: move changelog logic here - return release; + const latestRelease = await fetchLatestRelease(); + return { + currentRelease: release, + latestRelease: latestRelease, + }; }); diff --git a/src/server/middleware/auth.ts b/src/server/middleware/auth.ts index a3721206..f6076544 100644 --- a/src/server/middleware/auth.ts +++ b/src/server/middleware/auth.ts @@ -7,7 +7,7 @@ export default defineEventHandler(async (event) => { } } if (url.pathname === '/') { - if (!session.data.authenticated) { + if (!session.data.authenticated && REQUIRES_PASSWORD) { return sendRedirect(event, '/login', 302); } } diff --git a/src/server/plugins/shutdown.ts b/src/server/plugins/manager.ts similarity index 100% rename from src/server/plugins/shutdown.ts rename to src/server/plugins/manager.ts diff --git a/src/server/utils/WireGuard.ts b/src/server/utils/WireGuard.ts index 0306828a..c8c1e426 100644 --- a/src/server/utils/WireGuard.ts +++ b/src/server/utils/WireGuard.ts @@ -206,7 +206,7 @@ ${ : new Date(Number(`${latestHandshakeAt}000`)); client.transferRx = Number(transferRx); client.transferTx = Number(transferTx); - client.persistentKeepalive = persistentKeepalive; + client.persistentKeepalive = persistentKeepalive ?? null; }); return clients; diff --git a/src/server/utils/release.ts b/src/server/utils/release.ts new file mode 100644 index 00000000..118048d0 --- /dev/null +++ b/src/server/utils/release.ts @@ -0,0 +1,26 @@ +export async function fetchLatestRelease() { + try { + const response = await $fetch>( + 'https://wg-easy.github.io/wg-easy/changelog.json', + { method: 'get' } + ); + const releasesArray = Object.entries(response).map( + ([version, changelog]) => ({ + version: parseInt(version, 10), + changelog: changelog, + }) + ); + releasesArray.sort((a, b) => { + return b.version - a.version; + }); + + if (releasesArray.length === 0) { + throw new Error('Changelog is empty'); + } + + return releasesArray[0]!; + } catch (e) { + SERVER_DEBUG('Failed to fetch latest releases: ', e); + return { version: 0, changelog: '' }; + } +} diff --git a/src/stores/clients.ts b/src/stores/clients.ts index 70bcd2c5..2faccf35 100644 --- a/src/stores/clients.ts +++ b/src/stores/clients.ts @@ -44,7 +44,8 @@ export const useClientsStore = defineStore('Clients', () => { }; } - const clientPersist = clientsPersist.value[client.id]; + // We know that this can't be undefined + const clientPersist = clientsPersist.value[client.id]!; // Debug // client.transferRx = this.clientsPersist[client.id].transferRxPrevious + Math.random() * 1000; diff --git a/src/stores/global.ts b/src/stores/global.ts index d3851fa6..bff14b05 100644 --- a/src/stores/global.ts +++ b/src/stores/global.ts @@ -18,29 +18,12 @@ export const useGlobalStore = defineStore('Global', () => { locale.value = lang; } - const _currentRelease = await api.getRelease(); - const _latestRelease = await fetch( - 'https://wg-easy.github.io/wg-easy/changelog.json' - ) - .then((res) => res.json()) - .then((releases) => { - const releasesArray = Object.entries(releases).map( - ([version, changelog]) => ({ - version: parseInt(version, 10), - changelog: changelog as string, - }) - ); - releasesArray.sort((a, b) => { - return b.version - a.version; - }); + const release = await api.getRelease(); - return releasesArray[0]; - }); - - if (_currentRelease >= _latestRelease.version) return; + if (release.currentRelease >= release.latestRelease.version) return; - currentRelease.value = _currentRelease; - latestRelease.value = _latestRelease; + currentRelease.value = release.currentRelease; + latestRelease.value = release.latestRelease; } async function fetchChartType() {