<?php
/**
* Интеграционный смок против живого Synapse (токен выдаёт create-key, печатается один раз):
*
* SYNAPSE_URL=http://localhost:8013 SYNAPSE_API_KEY=syn_...
* SYNAPSE_DEFAULT_SOURCE=libtest php examples/plain-php/smoke.php
*
* Источник и тип (libtest ping/done) должны быть зарегистрированы на сервере.
*/
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use GNexus\Synapse\Config\SynapseConfig;
use GNexus\Synapse\Exception\NotFoundException;
use GNexus\Synapse\Exception\SynapseException;
use GNexus\Synapse\SynapseClient;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\HttpFactory;
// уникальный на прогон: дедуп-окно сервера 24 ч
$dedup = 'client-smoke-' . time();
$config = SynapseConfig::fromGlobals();
// Guzzle с таймаутом из конфига (PSR-18 инжектный — таймаут задаёт потребитель)
$client = new SynapseClient(
$config,
new Client(['timeout' => $config->timeoutSeconds]),
new HttpFactory(),
new HttpFactory(),
);
printf(" health: %s\n", json_encode($client->health(), JSON_UNESCAPED_UNICODE));
$event = $client->send('libtest', 'ping', 'done', payload: ['user_id' => 'mcp'], dedupKey: $dedup);
printf(" send: id=%s status=%s\n", $event->id, $event->status);
assert($event->status === 'queued' && !$event->deduplicated);
$repeat = $client->send('libtest', 'ping', 'done', payload: ['user_id' => 'mcp'], dedupKey: $dedup);
printf(" repeat: id=%s deduplicated=%s\n", $repeat->id, $repeat->deduplicated ? 'true' : 'false');
assert($repeat->deduplicated && $repeat->id === $event->id); // дедуп вернул первое событие
$status = $client->status($event->id);
printf(" status: %s; доставки:\n", $status->status);
foreach ($status->deliveries as $d) {
printf(
" %s%s: %s ×%d%s\n",
$d->channel,
$d->target !== null ? ' → ' . $d->target : '',
$d->status,
$d->attempts,
$d->error !== null ? ' (' . $d->error . ')' : '',
);
}
try {
$client->send('wrong-source', 'ping', 'done'); // анти-спуфинг сервера
fwrite(STDERR, " ОШИБКА: 403 не получен\n");
exit(1);
} catch (SynapseException $ex) {
printf(" %d пойман (анти-спуфинг): %s\n", $ex->statusCode, $ex->detail);
}
try {
$client->status('00000000-0000-0000-0000-000000000000');
} catch (NotFoundException) {
echo " 404 пойман (чужой/несуществующий id)\n";
}
// fire-and-forget: даже на лежащем Synapse не бросает
$downConfig = new SynapseConfig('http://127.0.0.1:9', $config->apiKey, 1.0);
$emitClient = new SynapseClient(
$downConfig,
new Client(['timeout' => 1.0]),
new HttpFactory(),
new HttpFactory(),
);
printf(" emit к неподнятому хосту вернул: %s (null — ок)\n", json_encode($emitClient->emit('libtest', 'a', 'b')));
echo " ALL OK\n";