import { Observable } from 'rxjs'; import { VideoUploadHandlers, VideoUploadProgress } from './types'; import * as i0 from "@angular/core"; /** * Subida directa a S3 vía POST presignado (ADR-087, "el video no puede pasar * por la API" — API Gateway tiene un tope duro de ~10MB de payload y un * timeout de integración de 29s, ninguno de los dos configurable). El * archivo nunca toca nuestro backend. * * Antes de este servicio, `uploadVideoToS3` vivía copiado literal en cada app * consumidora (Eklesee, Okhelia) — mismo texto, mismo comentario, mismo * riesgo de que un fix quede aplicado en una sola copia. Este servicio es al * video lo que `StorageService` es a Firebase Storage: la app nunca ve el * bucket, nunca arma un `FormData`, nunca sabe que el proveedor es S3. * * @example * ```typescript * private videoUpload = inject(VideoUploadService); * * onFileSelected(file: File) { * this.videoUpload.upload(file, { * requestIntent: (f) => firstValueFrom(this.recipeSvc.requestVideoUpload(recipeId, { * filename: f.name, contentType: f.type || 'video/mp4', sizeBytes: f.size, * })), * finalize: () => firstValueFrom(this.recipeSvc.finalizeVideoUpload(recipeId)), * }).subscribe({ * next: (progress) => this.state.set(progress.status), * error: (err) => this.errors.handle(err, { context: 'my-page.uploadVideo', ... }), * complete: () => this.state.set('done'), * }); * } * ``` */ export declare class VideoUploadService { /** * Orquesta el flujo completo: pide el intent al backend del dominio, sube * el archivo a S3, y avisa que terminó. Emite el progreso en dos pasos * (`uploading` mientras sube a S3, `processing` mientras el backend hace * `finalize`) y completa cuando el backend confirma — el estado real del * video (`ready`/`failed`) sigue siendo async del lado del backend * (EventBridge → worker), esto solo cubre la subida. */ upload(file: File, handlers: VideoUploadHandlers): Observable; /** * Arma el `FormData` de la subida POST de S3 y lo envía. **Orden del * FormData**: los campos de la policy PRIMERO, el archivo AL FINAL — es un * requisito del form-based upload de S3 (RFC de multipart/form-data + cómo * S3 procesa la policy), no un detalle de estilo. * * Usa `fetch()` nativo A PROPÓSITO, nunca `HttpClient`: el interceptor de * `provideValtechAuth` agrega `Authorization: Bearer ` a cualquier * request que pase por él, y no corresponde que ese token viaje a un * dominio de S3 que no es nuestro backend. * @internal */ private postToS3; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵprov: i0.ɵɵInjectableDeclaration; }