Newer
Older
gn-synapse-client-php / examples / plain-php / smoke.php
@Eugene Sukhodolskiy Eugene Sukhodolskiy 1 day ago 3 KB Initial client library skeleton (v0.1.0)
<?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";