declare global { type MonochromeProgress = { stage: string; } & T; type MonochromeProgressMessage = { message: string; }; type MonochromeProgressListener = (progress: T) => void; } export class DownloadProgress implements MonochromeProgress { public readonly stage = 'downloading'; constructor( public readonly receivedBytes: number, public readonly totalBytes: number | undefined ) {} } export class SegmentedDownloadProgress extends DownloadProgress { public readonly stage = 'downloading'; constructor( public readonly receivedBytes: number, public readonly totalBytes: number | undefined, public readonly currentSegment: number, public readonly totalSegments: number ) { super(receivedBytes, totalBytes); } } export class ProgressMessage implements MonochromeProgressMessage { constructor(public readonly message: string) {} } export class DownloadProgressMessage extends ProgressMessage { constructor(message: string) { super(message); } }