Files
IdP/apps/frontend/app/download/android/route.ts
2026-06-26 13:56:54 +03:00

45 lines
1.8 KiB
TypeScript

import { createReadStream, existsSync, statSync } from 'node:fs';
import path from 'node:path';
import { Readable } from 'node:stream';
import { NextResponse } from 'next/server';
export const runtime = 'nodejs';
const APK_CANDIDATES = [
process.env.TAURI_ANDROID_APK_PATH,
path.resolve(process.cwd(), 'public/downloads/lendry-id.apk'),
path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk'),
path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk'),
path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/arm64/release/app-arm64-release.apk'),
path.resolve(process.cwd(), '../../tauri_app/src-tauri/gen/android/app/build/outputs/apk/arm64/debug/app-arm64-debug.apk')
].filter((candidate): candidate is string => Boolean(candidate));
function resolveApkPath() {
return APK_CANDIDATES.find((candidate) => existsSync(candidate) && statSync(candidate).isFile());
}
export async function GET() {
const apkPath = resolveApkPath();
if (!apkPath) {
return NextResponse.json(
{
message:
'APK ещё не собран. Соберите tauri_app для Android или укажите TAURI_ANDROID_APK_PATH/public/downloads/lendry-id.apk.'
},
{ status: 404 }
);
}
const stat = statSync(apkPath);
const stream = Readable.toWeb(createReadStream(apkPath)) as ReadableStream;
return new Response(stream, {
headers: {
'Content-Type': 'application/vnd.android.package-archive',
'Content-Length': String(stat.size),
'Content-Disposition': 'attachment; filename="lendry-id.apk"',
'Cache-Control': 'no-store'
}
});
}