> ## Documentation Index
> Fetch the complete documentation index at: https://docs.markpdf.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Streaming y trabajos asincrónicos

> Cargue el progreso con useConvertFile, transmita con useMarkpdf y 202 (auto-async).

# Streaming y trabajos asincrónicos

`@markpdf/react` combina dos cosas diferentes: **progreso de carga** (heredado del gancho `useConvertFile`, a través de `XMLHttpRequest`) y **transmisión/jobs de API** (heredado del cliente base `@markpdf/sdk`, a través de `useMarkpdf()`).

## Subir progreso con `useConvertFile`

```tsx theme={null}
const { convert, status, progress } = useConvertFile();

<input type="file" onChange={(e) => convert(e.target.files![0])} />
{status === "uploading" && <progress value={progress} max={100} />}
```

* `status` pasa por `"idle" → "uploading" → "converting" → "success"|"error"`.
* `progress` solo tiene sentido durante `"uploading"` (porcentaje de bytes cargados). Durante `"converting"` el servidor ya recibió el archivo completo y lo está procesando; no hay ningún progreso granular desde esa fase.

Esto cubre `POST /convert` (varias partes). No se aplica a `convertFromUrl`, donde no hay bytes para cargar desde el navegador.

## Streaming Markdown con `useMarkpdf()`

Para consumir `/convert/stream` fragmento a fragmento, utilice el cliente sin formato:

```tsx theme={null}
import { useMarkpdf } from "@markpdf/react";
import { useState } from "react";

function StreamedPreview({ url }: { url: string }) {
  const client = useMarkpdf();
  const [text, setText] = useState("");

  const start = async () => {
    setText("");
    for await (const chunk of client.convertStream({ url }, { slim: true })) {
      setText((prev) => prev + chunk);
    }
  };

  return (
    <>
      <button onClick={start}>Convertir en streaming</button>
      <pre>{text}</pre>
    </>
  );
}
```

## Empleos por saturación (202)

`useConvertFile().convert()` no sondea automáticamente los trabajos en cola; si API responde `202`, el `error` del enlace será `MarkpdfError` con el detalle del trabajo. Para manejarlo, use el cliente sin formato con `autoPoll` (el valor predeterminado):

```tsx theme={null}
import { useMarkpdf } from "@markpdf/react";

function ConvertWithAutoPoll({ file }: { file: File }) {
  const client = useMarkpdf();

  const run = async () => {
    // base client's convertFile DOES do auto poll of 202
    const markdown = await client.convertFile(file, { filename: file.name, autoPoll: true });
    console.log(markdown);
  };

  return <button onClick={run}>Convertir</button>;
}
```

<Tip>
  `useConvertFile()` está destinado al caso común de "carga con barra de progreso". Si necesita un manejo explícito de `202`/reintentos de trabajo, combine `useMarkpdf()` (cliente base con `autoPoll`) en lugar de `useConvertFile()`.
</Tip>

<Warning>
  Los resultados de los trabajos completados caducan en aproximadamente 1 hora. Si guarda un `jobId` y consulta `client.getJob(jobId)` más tarde y recibe `404`, reenvíe la conversión original.
</Warning>
