<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <defaults public="false" />

        <service id="Sentry\ClientInterface" alias="sentry.client" />

        <service id="Sentry\Transport\TransportFactoryInterface" class="Sentry\SentryBundle\Transport\TransportFactory">
            <argument type="service" id="Psr\Http\Message\UriFactoryInterface" on-invalid="ignore" />
            <argument type="service" id="Psr\Http\Message\RequestFactoryInterface" on-invalid="ignore" />
            <argument type="service" id="Psr\Http\Message\ResponseFactoryInterface" on-invalid="ignore" />
            <argument type="service" id="Psr\Http\Message\StreamFactoryInterface" on-invalid="ignore" />
            <argument>null</argument>
            <argument /> <!-- $logger -->
        </service>

        <service id="Sentry\State\HubInterface">
            <factory class="Sentry\State\HubAdapter" method="getInstance" />
            <call method="bindClient">
                <argument type="service" id="Sentry\ClientInterface" />
            </call>
        </service>

        <service id="Sentry\SentryBundle\EventListener\ConsoleCommandListener" alias="Sentry\SentryBundle\EventListener\ConsoleListener" />

        <service id="Sentry\SentryBundle\EventListener\ConsoleListener" class="Sentry\SentryBundle\EventListener\ConsoleListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="console.command" method="handleConsoleCommandEvent" priority="128" />
            <tag name="kernel.event_listener" event="console.terminate" method="handleConsoleTerminateEvent" priority="-64" />
            <tag name="kernel.event_listener" event="console.error" method="handleConsoleErrorEvent" priority="-64" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\ErrorListener" class="Sentry\SentryBundle\EventListener\ErrorListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="kernel.exception" method="handleExceptionEvent" priority="128" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\RequestListener" class="Sentry\SentryBundle\EventListener\RequestListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="kernel.request" method="handleKernelRequestEvent" priority="5" />
            <tag name="kernel.event_listener" event="kernel.controller" method="handleKernelControllerEvent" priority="10" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\SubRequestListener" class="Sentry\SentryBundle\EventListener\SubRequestListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="kernel.request" method="handleKernelRequestEvent" priority="3" />
            <tag name="kernel.event_listener" event="kernel.finish_request" method="handleKernelFinishRequestEvent" priority="5" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\TracingRequestListener" class="Sentry\SentryBundle\EventListener\TracingRequestListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="kernel.request" method="handleKernelRequestEvent" priority="4" />
            <tag name="kernel.event_listener" event="kernel.response" method="handleKernelResponseEvent" priority="15" />
            <tag name="kernel.event_listener" event="kernel.terminate" method="handleKernelTerminateEvent" priority="5" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\TracingSubRequestListener" class="Sentry\SentryBundle\EventListener\TracingSubRequestListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="kernel.request" method="handleKernelRequestEvent" priority="2" />
            <tag name="kernel.event_listener" event="kernel.finish_request" method="handleKernelFinishRequestEvent" priority="10" />
            <tag name="kernel.event_listener" event="kernel.response" method="handleKernelResponseEvent" priority="15" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\TracingConsoleListener" class="Sentry\SentryBundle\EventListener\TracingConsoleListener">
            <argument type="service" id="Sentry\State\HubInterface" />
            <argument /> <!-- $excludedCommands -->

            <tag name="kernel.event_listener" event="console.command" method="handleConsoleCommandEvent" priority="118" />
            <tag name="kernel.event_listener" event="console.terminate" method="handleConsoleTerminateEvent" priority="-54" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\MessengerListener" class="Sentry\SentryBundle\EventListener\MessengerListener">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="kernel.event_listener" event="Symfony\Component\Messenger\Event\WorkerMessageFailedEvent" method="handleWorkerMessageFailedEvent" priority="50" />
            <tag name="kernel.event_listener" event="Symfony\Component\Messenger\Event\WorkerMessageHandledEvent" method="handleWorkerMessageHandledEvent" priority="50" />
        </service>

        <service id="Sentry\SentryBundle\EventListener\LoginListener" class="Sentry\SentryBundle\EventListener\LoginListener">
            <argument type="service" id="Sentry\State\HubInterface" />
            <argument type="service" id="security.token_storage" on-invalid="ignore" />

            <tag name="kernel.event_listener" event="kernel.request" method="handleKernelRequestEvent" />
            <tag name="kernel.event_listener" event="Symfony\Component\Security\Http\Event\LoginSuccessEvent" method="handleLoginSuccessEvent" />
        </service>

        <service id="Sentry\SentryBundle\Command\SentryTestCommand" class="Sentry\SentryBundle\Command\SentryTestCommand">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="console.command" command="sentry:test" />
        </service>

        <service id="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface" alias="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory" />

        <service id="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory" class="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory">
            <argument type="service" id="Sentry\State\HubInterface" />
        </service>

        <!-- TODO: make this service abstract (see DoctrineBundle MiddlewarePass) when DBAL 2.x support is dropped -->
        <service id="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware" class="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware">
            <argument type="service" id="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface" />
        </service>

        <service id="Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator" class="Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator">
            <argument type="service" id="Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware" />
        </service>

        <service id="Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension" class="Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension">
            <argument type="service" id="Sentry\State\HubInterface" />

            <tag name="twig.extension" />
        </service>

        <service id="sentry.tracing.traceable_cache_adapter" class="Sentry\SentryBundle\Tracing\Cache\TraceableCacheAdapter" abstract="true">
            <argument type="service" id="Sentry\State\HubInterface" />
            <argument /> <!-- $decoratedAdapter -->
        </service>

        <service id="sentry.tracing.traceable_tag_aware_cache_adapter" class="Sentry\SentryBundle\Tracing\Cache\TraceableTagAwareCacheAdapter" abstract="true">
            <argument type="service" id="Sentry\State\HubInterface" />
            <argument /> <!-- $decoratedAdapter -->
        </service>

        <service id="Sentry\SentryBundle\Integration\IntegrationConfigurator" class="Sentry\SentryBundle\Integration\IntegrationConfigurator">
            <argument type="collection" /> <!-- $userIntegrations -->
            <argument /> <!-- $registerErrorHandler -->
        </service>

        <service id="Sentry\Integration\RequestFetcherInterface" class="Sentry\SentryBundle\Integration\RequestFetcher">
            <argument type="service" id="Symfony\Component\HttpFoundation\RequestStack" />
            <argument type="service" id="Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface" on-invalid="null" />
        </service>

        <service id="Sentry\SentryBundle\Twig\SentryExtension" class="Sentry\SentryBundle\Twig\SentryExtension">
            <tag name="twig.extension" />
        </service>
    </services>
</container>
