Files
IdP/apps/frontend/lib/authenticated-media.ts
2026-06-29 22:51:25 +03:00

38 lines
1.2 KiB
TypeScript

import { fetchMediaBlobWithRetry } from '@/lib/resilient-media-fetch';
export async function fetchAuthenticatedMediaBlob(accessUrl: string, token: string, mimeType?: string) {
return fetchMediaBlobWithRetry(accessUrl, token, { mimeType, label: 'файл чата' });
}
export function createBlobObjectUrl(blob: Blob) {
return URL.createObjectURL(blob);
}
export function revokeBlobObjectUrl(url?: string) {
if (url?.startsWith('blob:')) {
URL.revokeObjectURL(url);
}
}
export function triggerBlobDownload(blob: Blob, fileName: string) {
const objectUrl = URL.createObjectURL(blob);
const anchor = document.createElement('a');
anchor.href = objectUrl;
anchor.download = fileName;
anchor.rel = 'noopener';
document.body.appendChild(anchor);
anchor.click();
anchor.remove();
URL.revokeObjectURL(objectUrl);
}
export function mediaExpiresAtMs(expiresAt?: string) {
if (!expiresAt) return Date.now() + 14 * 60_000;
const parsed = Date.parse(expiresAt);
return Number.isFinite(parsed) ? parsed : Date.now() + 14 * 60_000;
}
export function shouldRefreshMedia(expiresAtMs: number, bufferMs = 60_000) {
return expiresAtMs - Date.now() <= bufferMs;
}