PHPackages                             ometra/proteus-client - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. ometra/proteus-client

Abandoned → [ometra/apollo-sdk](/?search=ometra%2Fapollo-sdk)Library[API Development](/categories/api)

ometra/proteus-client
=====================

Proteus API adapter

2.1.1(2mo ago)0550↓69.4%MITPHPPHP ^8.2

Since May 8Pushed 1mo agoCompare

[ Source](https://github.com/Ometra-Apollo/mx.ometra.apollo.proteus-sdk)[ Packagist](https://packagist.org/packages/ometra/proteus-client)[ RSS](/packages/ometra-proteus-client/feed)WikiDiscussions main Synced 4w ago

READMEChangelog (10)Dependencies (16)Versions (5)Used By (0)

Apollo SDK
==========

[](#apollo-sdk)

Cliente Laravel/PHP modular para consumir Proteus, Pulse, Flare e Ignis con autenticacion compartida de Caronte.

Instalacion
-----------

[](#instalacion)

```
composer require ometra/apollo-sdk
```

Publica la configuracion si necesitas sobrescribir las URLs de modulos:

```
php artisan vendor:publish --tag=apollo-config
```

El archivo publicado es `config/apollo.php`.

Paginas de error
----------------

[](#paginas-de-error)

Apollo registra automaticamente paginas HTML para los errores HTTP comunes de Laravel (`401`, `403`, `404`, `419`, `429`, `500`, `503`). El SDK agrega sus vistas como fallback, por lo que cualquier archivo local en `resources/views/errors` mantiene prioridad.

Para deshabilitar este fallback:

```
APOLLO_ERROR_PAGES_ENABLED=false
```

Si necesitas personalizar las vistas dentro de la app host, publicalas con:

```
php artisan vendor:publish --tag=apollo-error-pages
```

Tambien puedes publicar configuracion y paginas de error juntas:

```
php artisan vendor:publish --tag=apollo
```

Configuracion
-------------

[](#configuracion)

Apollo solo configura URLs por modulo; la autenticacion sigue viviendo en el SDK de Caronte.

```
PROTEUS_BASE_URL=https://proteus.example.com/api
PULSE_BASE_URL=https://pulse.example.com/api
FLARE_BASE_URL=https://flare.example.com/api
IGNIS_BASE_URL=https://ignis.example.com/api
```

Las llamadas HTTP usan el contrato de Caronte y agregan, segun el tipo de request:

- `X-Application-Token`
- `X-Group-Token` cuando existe
- `X-User-Token` en llamadas de usuario
- `X-Tenant-Id` desde `TenantContext` cuando existe

Uso modular
-----------

[](#uso-modular)

```
use Ometra\Apollo\Sdk\Facades\Apollo;

$directories = Apollo::proteus()->directories()->index();

$media = Apollo::proteus()->media()->upload([
    'type' => 'image',
    'directory_id' => $directoryId,
    'media' => [$request->file('image')],
    'metadata' => [
        'source' => 'apollo',
    ],
]);

Apollo::proteus()->media()->setMetadata($mediaId, [
    'metadata' => [
        'title' => 'Hero image',
    ],
]);

$images = Apollo::proteus()->media()->index(['type' => 'image']);

$lightPath = Apollo::proteus()->media()->lightPathUrl($mediaId, [
    'ext' => 'mp4',
    'url_ttl_seconds' => 3600,
]);

$stations = Apollo::flare()->stations()->index(['country' => 'mx']);

$campaigns = Apollo::ignis()->campaigns()->byGroup('group-1');

Apollo::ignis()->contentHits()->report([
    ['content_id' => 'content-1', 'hits' => 10],
]);

$groups = Apollo::pulse()->groups()->index();
```

### URLs LightPath para media

[](#urls-lightpath-para-media)

LightPath se integra desde el recurso de media de Proteus porque Proteus es la autoridad de permisos y formatos. El SDK solo solicita una URL temporal; no valida tokens ni habla con nodos LightPath.

```
$response = Apollo::proteus()->media()->lightPathUrl($mediaId, [
    'ext' => 'mp4',
    'url_ttl_seconds' => 3600,
]);

$url = $response['data']['url'];
```

Opciones:

- `ext`: formato a entregar. Si se omite, Proteus usa el formato default.
- `url_ttl_seconds`: vigencia de la URL. Proteus aplica su maximo configurado.

La URL generada tiene forma `https://lightpath.example.com/m/{token}`. El token opaco es la unica credencial y quien tenga la URL puede consumirla hasta `url_expires_at`.

### Uso en jobs y contextos sin usuario

[](#uso-en-jobs-y-contextos-sin-usuario)

Cuando necesites hacer llamadas desde un job, un comando o cualquier contexto donde no haya sesion de usuario activa, usa `asApplication()`. Esto fuerza a todas las operaciones del modulo a usar autenticacion de aplicacion (sin `X-User-Token`) en lugar de autenticacion de usuario:

```
// En un job — sin sesion HTTP, sin token de usuario
$proteus = Apollo::proteus()->asApplication();

$proteus->media()->index(['type' => 'audio']);
$proteus->directories()->show($directoryId);
```

Tambien puedes inyectar el entrypoint principal:

```
use Ometra\Apollo\Sdk\Apollo;

public function __invoke(Apollo $apollo): array
{
    return $apollo->proteus()->media()->index(['type' => 'image']);
}
```

Pulse expone `groups()->index()` sobre el endpoint `ignis/groups`.

Exposicion de grupos Ignis (inbound, opt-in)
--------------------------------------------

[](#exposicion-de-grupos-ignis-inbound-opt-in)

Apollo es solo outbound por defecto. Cuando lo habilitas, el SDK registra una ruta inbound `GET /{prefix}/groups` en la app host para que clientes externos (incluido Pulse) puedan descubrir los grupos de la app. No agrega llamadas HTTP hacia Ignis.

### Habilitar la ruta

[](#habilitar-la-ruta)

La ruta esta deshabilitada por defecto. Habilitala con una variable de entorno:

```
APOLLO_IGNIS_GROUPS_ENABLED=true
```

O publica la configuracion y edita `config/apollo.php`:

```
'ignis_groups' => [
    'enabled' => true,
    'implementation' => \Ometra\Apollo\Sdk\Test\DummyGroup::class,
    'route_prefix' => 'api/ignis',
    'middleware' => ['caronte.application:tenant_required'],
],
```

Con `enabled=false` (por defecto) no se registra ninguna ruta y `GET /api/ignis/groups` devuelve `404`.

### Proveer la implementacion del contrato

[](#proveer-la-implementacion-del-contrato)

El SDK trae `Ometra\Apollo\Sdk\Test\DummyGroup` como implementacion runnable que devuelve un grupo de prueba. Para exponer grupos reales, crea una clase que implemente `Ometra\Apollo\Sdk\Contracts\IgnisGroupContract`:

```
namespace App\Services;

use Ometra\Apollo\Sdk\Contracts\IgnisGroupContract;
use Ometra\Apollo\Sdk\DTO\ExternalGroupDTO;

final class HostGroupProvider implements IgnisGroupContract
{
    public function getGroups(): array
    {
        return [
            ExternalGroupDTO::fromArray([
                'name' => 'Mi grupo',
                'external_id' => 'grupo-1',
                'media_type' => ['video', 'audio'],
                'play_modifiers' => ['frequency' => 2],
            ]),
        ];
    }
}
```

Apunta `implementation` a tu clase via variable de entorno (sin necesidad de publicar la config):

```
APOLLO_IGNIS_GROUPS_IMPLEMENTATION=\App\Services\HostGroupProvider
```

O publica la configuracion y edita `config/apollo.php`:

```
// config/apollo.php (override del host)
'ignis_groups' => [
    'enabled' => true,
    'implementation' => \App\Services\HostGroupProvider::class,
],
```

Si `implementation` queda vacio o la clase no implementa el contrato, el provider lanza `RuntimeException` al arrancar.

### Prefijo de ruta y middleware

[](#prefijo-de-ruta-y-middleware)

El prefijo por defecto es `api/ignis` (la ruta queda en `GET /api/ignis/groups`). Cambialo con `route_prefix`:

```
'ignis_groups' => [
    'enabled' => true,
    'route_prefix' => 'api/custom/ignis', // GET /api/custom/ignis/groups
],
```

La ruta esta protegida por el middleware `caronte.application:tenant_required`. Las peticiones sin contexto de tenant valido son rechazadas por Caronte (401/403) antes de llegar al controlador. Puedes overridear la pila de middleware con la clave `middleware`.

API
---

[](#api)

El contrato completo esta en [docs/api-contract.md](docs/api-contract.md).

Pruebas
-------

[](#pruebas)

```
composer test
```

La suite valida identidad Apollo, configuracion modular, autenticacion Caronte, rutas Proteus, ausencia de API flat y limpieza legacy.

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance90

Actively maintained with recent releases

Popularity13

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

4

Last Release

74d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/984800?v=4)[gruelas](/maintainers/gruelas)[@gruelas](https://github.com/gruelas)

---

Top Contributors

[![karlyoz](https://avatars.githubusercontent.com/u/54610989?v=4)](https://github.com/karlyoz "karlyoz (24 commits)")[![LauraRivera1607](https://avatars.githubusercontent.com/u/147354444?v=4)](https://github.com/LauraRivera1607 "LauraRivera1607 (14 commits)")[![gruelasjr](https://avatars.githubusercontent.com/u/40619710?v=4)](https://github.com/gruelasjr "gruelasjr (11 commits)")[![vicario00](https://avatars.githubusercontent.com/u/101902535?v=4)](https://github.com/vicario00 "vicario00 (11 commits)")[![JuanPablo14001](https://avatars.githubusercontent.com/u/202692718?v=4)](https://github.com/JuanPablo14001 "JuanPablo14001 (5 commits)")[![memoola49](https://avatars.githubusercontent.com/u/55213964?v=4)](https://github.com/memoola49 "memoola49 (3 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/ometra-proteus-client/health.svg)

```
[![Health](https://phpackages.com/badges/ometra-proteus-client/health.svg)](https://phpackages.com/packages/ometra-proteus-client)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.4M354](/packages/psalm-plugin-laravel)[fleetbase/core-api

Core Framework and Resources for Fleetbase API

1239.7k25](/packages/fleetbase-core-api)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9922.4M142](/packages/roots-acorn)[api-platform/laravel

API Platform support for Laravel

58174.6k19](/packages/api-platform-laravel)[flat3/lodata

OData v4.01 Producer for Laravel

99357.6k](/packages/flat3-lodata)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5222.6k](/packages/simplestats-io-laravel-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
