lthn.io/app/Mod/Chain/Boot.php
Claude 2ac5fc1e3d
feat: idempotency key middleware + sitemap.xml
IdempotencyKey middleware caches POST responses by Idempotency-Key
header for 24h. Prevents duplicate registrations from network retries.
Returns X-Idempotency-Replayed: true on cached responses.

Commit #102.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:00:41 +01:00

51 lines
1.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Mod\Chain;
use Core\Events\ConsoleBooting;
use Core\Events\FrameworkBooted;
use Mod\Chain\Contracts\ChainDaemon;
use Mod\Chain\Contracts\ChainWallet;
use Mod\Chain\Services\DaemonRpc;
use Mod\Chain\Services\WalletRpc;
class Boot
{
public static array $listens = [
FrameworkBooted::class => 'onFrameworkBooted',
ConsoleBooting::class => 'onConsole',
];
public function onFrameworkBooted(FrameworkBooted $event): void
{
app('config')->set('chain', require __DIR__ . '/config.php');
// Bind interfaces to implementations — swap for testing/Go wrapper
app()->singleton(ChainDaemon::class, DaemonRpc::class);
app()->singleton(ChainWallet::class, WalletRpc::class);
// Keep concrete bindings for backwards compatibility
app()->singleton(DaemonRpc::class);
app()->singleton(WalletRpc::class);
app('router')->aliasMiddleware('auth.api', \App\Http\Middleware\ApiTokenAuth::class);
app('router')->aliasMiddleware('domain', \App\Http\Middleware\DomainScope::class);
app('router')->aliasMiddleware('json.validate', \App\Http\Middleware\ValidateJsonRequest::class);
// Define API rate limiter (used by api middleware group)
\Illuminate\Support\Facades\RateLimiter::for('api', function (\Illuminate\Http\Request $request) {
return \Illuminate\Cache\RateLimiting\Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
app('router')->aliasMiddleware('idempotent', \App\Http\Middleware\IdempotencyKey::class);
}
public function onConsole(ConsoleBooting $event): void
{
$event->command(Commands\ChainStart::class);
$event->command(Commands\ChainStop::class);
$event->command(Commands\ChainStatus::class);
}
}