# Подключение Synapse-клиента в Laravel-сервис

PSR-18 транспорт — тот, что уже есть в сервисе (в Laravel обычно Guzzle
через `guzzlehttp/guzzle`). Таймаут берётся из конфига клиента.

`app/Providers/AppServiceProvider.php`:

```php
use GNexus\Synapse\Config\SynapseConfig;
use GNexus\Synapse\SynapseClient;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\HttpFactory;

public function register(): void
{
    $this->app->singleton(SynapseConfig::class, fn () => SynapseConfig::fromGlobals());

    $this->app->singleton(SynapseClient::class, function ($app) {
        $config = $app->make(SynapseConfig::class);
        return new SynapseClient(
            $config,
            new Client(['timeout' => $config->timeoutSeconds]),
            new HttpFactory(), // RequestFactoryInterface
            new HttpFactory(), // StreamFactoryInterface
        );
    });
}
```

`.env` (значения — в vault/env сервиса, ключ печатается при выдаче один раз):

```
SYNAPSE_URL=http://synapse.gnexus.space:8013
SYNAPSE_API_KEY=syn_...
SYNAPSE_DEFAULT_SOURCE=gnexus-auth
```

Использование (в job/event listener):

```php
$synapse = app(SynapseClient::class);
$synapse->emit(source: null, subject: 'user', action: 'password_changed',
    payload: ['user_id' => $user->uuid], dedupKey: "pw-{$user->uuid}");
```

`emit` не бросает исключения: упавший Synapse не должен ломать выход
пользователя. Для критичных событий — `send` с `try/catch SynapseException`.