+12








fcd7c979df
Co-authored-by: Artur <145776561+arturict@users.noreply.github.com> Co-authored-by: arturict <arturict@users.noreply.github.com> Co-authored-by: Thomas <thomas@ajnart.fr> Co-authored-by: Afonso Jorge Ramos <afonsojorgeramos@gmail.com> Co-authored-by: Danura30082 <danura30082+github@gmail.com> Co-authored-by: Kushie <122986913+kushiemoon-dev@users.noreply.github.com> Co-authored-by: ajnart <thomas@ajnart.fr> Co-authored-by: ajnart <thomas@ajnart.dev> Co-authored-by: chenjun <chenjun@foxmail.com> Co-authored-by: Wikibear <wikibear@users.noreply.github.com> Co-authored-by: Bergasha <bergasha@gmail.com> Co-authored-by: leafyelin <43306196+leafyelin@users.noreply.github.com> Co-authored-by: Lucas Araujo <lucas.lra@gmail.com> Co-authored-by: GreenMonito <86085570+GreenMonito@users.noreply.github.com> Co-authored-by: Nerdy-Technician <roffo@nerdy-technician.social> Co-authored-by: Jun <34545896+jcstrong@users.noreply.github.com> Co-authored-by: Edmond Abraham <54119952+gitedmond@users.noreply.github.com> Co-authored-by: thrawnx <tight.bulb9384@fastmail.com> Co-authored-by: Chris <58918656+nordada@users.noreply.github.com> Co-authored-by: yi111 <153097222+Yi-111-a@users.noreply.github.com> Co-authored-by: Yanis <naamaneyanis@gmail.com> Co-authored-by: Wikibear <me@sej.de> Co-authored-by: alessiottavo <93441886+alessiottavo@users.noreply.github.com>
104 lines
3.3 KiB
TypeScript
104 lines
3.3 KiB
TypeScript
import { ResponseError } from "@homarr/common/server";
|
|
import { fetchWithTrustedCertificatesAsync } from "@homarr/core/infrastructure/http";
|
|
|
|
import type { IntegrationHttpAuthentication } from "../http-auth";
|
|
import type { IntegrationTestingInput } from "../base/integration";
|
|
import { Integration } from "../base/integration";
|
|
import { TestConnectionError } from "../base/test-connection/test-connection-error";
|
|
import type { TestingResult } from "../base/test-connection/test-connection-service";
|
|
import {
|
|
speedtestTrackerLatestResultEnvelopeSchema,
|
|
speedtestTrackerResultsCollectionSchema,
|
|
speedtestTrackerStatsEnvelopeSchema,
|
|
} from "./speedtest-tracker-types";
|
|
import type {
|
|
SpeedtestTrackerDashboardData,
|
|
SpeedtestTrackerResult,
|
|
SpeedtestTrackerResultsCollection,
|
|
SpeedtestTrackerStats,
|
|
} from "./speedtest-tracker-types";
|
|
|
|
export class SpeedtestTrackerIntegration extends Integration {
|
|
public async getHttpAuthenticationAsync(): Promise<IntegrationHttpAuthentication> {
|
|
return { headers: this.getAuthHeaders(), redactValues: [] };
|
|
}
|
|
|
|
protected async testingAsync(input: IntegrationTestingInput): Promise<TestingResult> {
|
|
const url = this.url("/api/v1/results/latest");
|
|
const response = await input.fetchAsync(url, {
|
|
headers: this.getAuthHeaders(),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
return TestConnectionError.StatusResult(response);
|
|
}
|
|
|
|
return { success: true };
|
|
}
|
|
|
|
public async getLatestResultAsync(): Promise<SpeedtestTrackerResult | null> {
|
|
const response = await this.getAsync("/api/v1/results/latest");
|
|
|
|
// Speedtest Tracker returns 404 when no tests have been run yet (fresh install)
|
|
if (response.status === 404) {
|
|
return null;
|
|
}
|
|
|
|
if (!response.ok) {
|
|
throw new ResponseError(response);
|
|
}
|
|
|
|
return speedtestTrackerLatestResultEnvelopeSchema.parse(await response.json()).data;
|
|
}
|
|
|
|
public async getStatsAsync(): Promise<SpeedtestTrackerStats | null> {
|
|
const response = await this.getAsync("/api/v1/stats");
|
|
|
|
if (!response.ok) {
|
|
throw new ResponseError(response);
|
|
}
|
|
|
|
return speedtestTrackerStatsEnvelopeSchema.parse(await response.json()).data;
|
|
}
|
|
|
|
public async getRecentResultsAsync(perPage = 10): Promise<SpeedtestTrackerResultsCollection> {
|
|
const response = await this.getAsync("/api/v1/results", {
|
|
result_count: String(perPage),
|
|
sort: "-created_at",
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new ResponseError(response);
|
|
}
|
|
|
|
return speedtestTrackerResultsCollectionSchema.parse(await response.json());
|
|
}
|
|
|
|
public async getDashboardDataAsync(): Promise<SpeedtestTrackerDashboardData> {
|
|
const [latestResult, stats, recentCollection] = await Promise.all([
|
|
this.getLatestResultAsync(),
|
|
this.getStatsAsync(),
|
|
this.getRecentResultsAsync(30),
|
|
]);
|
|
|
|
return {
|
|
latestResult,
|
|
stats,
|
|
recentResults: recentCollection.data,
|
|
};
|
|
}
|
|
|
|
private async getAsync(path: `/api/v1/${string}`, queryParams?: Record<string, string>) {
|
|
return await fetchWithTrustedCertificatesAsync(this.url(path, queryParams), {
|
|
headers: this.getAuthHeaders(),
|
|
});
|
|
}
|
|
|
|
private getAuthHeaders(): Record<string, string> {
|
|
return {
|
|
Authorization: `Bearer ${this.getSecretValue("apiKey")}`,
|
|
Accept: "application/json",
|
|
};
|
|
}
|
|
}
|