import type { ChunkDropDetail, ChunkDropReason } from "./chunk-uploader.js"; export interface DurableSegment { sequence: number; blob: Blob; timingHeaders?: Record; } export interface SegmentDurability { list(): Promise; listSequences?(): Promise; get?(sequence: number): Promise; put(record: DurableSegment): Promise; remove(sequence: number): Promise; nextSequence?(preferred: number): Promise; } export interface SegmentDurabilityPutResult { evicted: number[]; } export interface SegmentUploaderConfig { sessionId: string; kind: "screen" | "webcam" | "replay"; ingestUrl: string; appId?: string; fingerprintId?: string; maxRetries?: number; maxConcurrency?: number; retryBaseMs?: number; durability: SegmentDurability; fetchImpl?: typeof fetch; onUploaded?: (sequence: number, byteSize: number) => void; onDropped?: (sequence: number, reason: ChunkDropReason, detail?: ChunkDropDetail) => void; } /** * Direct-to-S3 uploader for independently durable MediaRecorder segments. * Capture never waits on this class: every blob is persisted first, then a * bounded worker uploads it. Failed items re-enter at the tail after backoff, * allowing later evidence to reach S3 instead of being held behind one gap. */ export declare class SegmentUploader { private readonly config; private readonly baseUrl; private readonly queue; private readonly queued; private readonly activeControllers; private readonly attempts; private readonly retryTimers; private active; private stopped; private persistChain; private readonly restorePromise; constructor(config: SegmentUploaderConfig); upload(sequence: number, blob: Blob, timingHeaders?: Record): void; drain(timeoutMs?: number): Promise; stop(): void; private restore; private enqueue; private pump; private sendOnce; private queueRecord; private postJson; } //# sourceMappingURL=segment-uploader.d.ts.map