# Migrazio-gida: 9.9.1 → 9.10.0

Osumi Framework **9.10.0** bertsioak HTTP erantzunak streaming bidez bidaltzeko euskarri natiboa gehitzen du.

9.9.1 bertsiotik eguneratzea atzerantz bateragarria da eta ez du lehendik dagoen aplikazio-kodean aldaketarik behar.

Bertsio honek ez du migrazio automatikoko urratsik, ez baita aplikazioaren fitxategirik edo konfiguraziorik eraldatu behar.

---

## Streaming erantzunak

Osagaiek `OStreamResponse` bat zuzenean itzul dezakete orain `run()` metodotik.

```php
<?php

declare(strict_types=1);

namespace Osumi\OsumiFramework\App\Module\Download;

use Osumi\OsumiFramework\Core\OComponent;
use Osumi\OsumiFramework\Web\OStreamResponse;

class DownloadComponent extends OComponent {
    /**
     * Stream a file to the client.
     *
     * @return OStreamResponse Streamed HTTP response.
     */
    public function run(): OStreamResponse {
        $stream = fopen(
            '/path/to/file.zip',
            'rb'
        );

        if ($stream === false) {
            throw new \RuntimeException(
                'Could not open file.'
            );
        }

        return new OStreamResponse(
            $stream,
            [
                'Content-Type' => 'application/zip',
                'Content-Length' => strval(
                    filesize('/path/to/file.zip')
                ),
                'Content-Disposition' => 'attachment; filename="file.zip"'
            ]
        );
    }
}
```

`run()` metodoak `OStreamResponse` itzulera-mota esplizituki deklaratzen duen osagai batek ez du txantiloi-fitxategirik behar.

---

## Bizi-zikloa

Streaming erantzun batek fluxu hau erabiltzen du:

```text
before Middleware
↓
Osagaia
↓
OStreamResponse
↓
afterRender Middleware
↓
afterResponse Middleware
↓
Datu-baseko konexioak itxi
↓
HTTP goiburuak
↓
Stream-a blokeka bidali
```

Streaming erantzunei ez zaie layout-ik aplikatzen.

Framework-ak ez du stream-eko byterik bidaltzen `afterRender` eta `afterResponse` amaitu arte.

Horri esker Middleware batek eskaera gelditu dezake deskarga hasi aurretik.

---

## Middleware-ak

Streaming erantzun batean:

```php
$data['is_streaming_response'] === true
```

Middleware-ek honako hauek alda ditzakete:

- `context`
- `headers`
- `status_code`
- `stop`
- `message`

Ezin dute `body` itzuli, streaming erantzun batek ez baitu memoria barruan materializatutako gorputz osorik.

Middleware batek `stop => true` itzultzen badu emisioa hasi aurretik:

- stream-a baztertzen da;
- erantzun normalaren goiburuak berrezartzen dira;
- ohiko errore-erantzuna sortzen da;
- ez da stream-eko byterik bidaltzen.

---

## Baliabidearen kudeaketa

Lehenespenez, `OStreamResponse` objektuak stream-aren jabetza framework-arena dela jotzen du eta automatikoki ixten du.

Blokearen tamaina lehenetsia 1 MiB da; horri esker fitxategi handiak bidal daitezke eduki osoa memorian kargatu gabe.

```php
new OStreamResponse(
    $stream,
    $headers,
    200,
    1048576,
    true
);
```

Parametroak hauek dira:

1. stream irakurgarria;
2. HTTP goiburuak;
3. HTTP egoera-kodea;
4. blokearen tamaina;
5. stream-a amaitzean automatikoki itxi behar den.

---

## Bateragarritasuna

Txantiloietan oinarritutako ohiko erantzunek aldaketarik gabe funtzionatzen jarraitzen dute.

Lehendik dauden osagaiek honako sinadura hauek erabiltzen jarrai dezakete:

```php
public function run(): void
```

```php
public function run(ORequest $req): void
```

```php
public function run(MyDTO $dto): void
```

`OStreamResponse` berriak aukera horiek zabaltzen ditu eta ez du ohiko renderizazio-sistema ordezkatzen.
