Add ADB management and live car telemetry

This commit is contained in:
2026-07-31 22:23:12 +02:00
parent 34b31c4caf
commit 0e4ce931ec
12 changed files with 911 additions and 23 deletions
+66
View File
@@ -100,6 +100,30 @@ export type NetworkActivity = {
messages: string[];
};
export type InstalledAdbPackage = {
packageName: string;
apkPath: string;
system: boolean;
};
export type AdbTarget = { type: "component" | "package"; value: string };
export type AdbShortcut = AdbTarget & {
id: number;
name: string;
createdAt: string;
};
export type CarTelemetry = {
available: true;
collectedAt: string;
speedKph: Availability<number>;
gear: Availability<string>;
wheelAngleDegrees: Availability<number>;
batteryPercent: Availability<number>;
rangeKm: Availability<number>;
};
type ErrorResponse = { error?: { code?: string; message?: string } };
export class ApiError extends Error {
@@ -150,3 +174,45 @@ export async function getNetworkStatus(): Promise<NetworkStatus> {
export async function getNetworkActivity(): Promise<NetworkActivity> {
return parseResponse<NetworkActivity>(await fetch("/api/network/activity", { credentials: "same-origin" }));
}
export async function getAdbPackages(): Promise<InstalledAdbPackage[]> {
const response = await parseResponse<{ packages: InstalledAdbPackage[] }>(
await fetch("/api/adb/packages", { credentials: "same-origin" })
);
return response.packages;
}
export async function getAdbShortcuts(): Promise<AdbShortcut[]> {
const response = await parseResponse<{ shortcuts: AdbShortcut[] }>(
await fetch("/api/adb/shortcuts", { credentials: "same-origin" })
);
return response.shortcuts;
}
export async function uploadApk(file: File, csrfToken: string): Promise<void> {
await parseResponse(
await fetch("/api/adb/install", {
method: "POST",
credentials: "same-origin",
headers: {
"Content-Type": "application/vnd.android.package-archive",
"X-CSRF-Token": csrfToken
},
body: file
})
);
}
export async function deleteAdbShortcut(id: number, csrfToken: string): Promise<void> {
await parseResponse(
await fetch(`/api/adb/shortcuts/${id}`, {
method: "DELETE",
credentials: "same-origin",
headers: { "X-CSRF-Token": csrfToken }
})
);
}
export async function getCarTelemetry(): Promise<CarTelemetry> {
return parseResponse<CarTelemetry>(await fetch("/api/car/telemetry", { credentials: "same-origin" }));
}