arbiter-servant-0.1.0.0
arbiter-servant
Safe HaskellNone
LanguageGHC2024

Arbiter.Servant

Description

Servant REST API for Arbiter job queue administration. See ArbiterAPI for the route tree.

Quick Start

import Arbiter.Servant
import Data.Proxy (Proxy(..))

main :: IO ()
main = do
  -- Run migrations with event streaming enabled before starting the server.
  -- The server config creates its own connection pool.
  config <- initArbiterServer (Proxy @MyRegistry) connStr "public"

  -- Start API server on port 8080
  runArbiterAPI 8080 config
Synopsis

Registry

#data QueueSpec

A queue's table name, payload type, and handler result type. A type data constructor. It takes no promotion tick.

Instances

Instances details
(RegistryAdmissionPolicies registry, RegistryTables registry) => BuildServer registry ('[] :: [QueueSpec]) Source # 
Instance details

Defined in Arbiter.Servant.Server

(BuildServer registry rest, EncodeJobResult (SpecResult spec), JobPayload (SpecPayload spec), KnownSymbol (SpecName spec)) => BuildServer registry (spec ': rest) Source # 
Instance details

Defined in Arbiter.Servant.Server

Methods

Source #buildServer :: ArbiterServerConfig registry -> ServerT (RegistryToAPI (spec ': rest)) Handler

RegistryTables ('[] :: [QueueSpec]) # 
Instance details

Defined in Arbiter.Core.QueueRegistry

Methods

#registryTableNames :: Proxy ('[] :: [QueueSpec]) -> [Text]

#registryQueueKinds :: Proxy ('[] :: [QueueSpec]) -> [(Text, [Text])]

RegistryPolicies ('[] :: [QueueSpec]) p # 
Instance details

Defined in Arbiter.Core.Admission

(HasKind (SpecPayload spec), KnownSymbol (SpecName spec), NotInPayloads (SpecPayload spec) rest, NotInTables (SpecName spec) rest, RegistryTables rest) => RegistryTables (spec ': rest) # 
Instance details

Defined in Arbiter.Core.QueueRegistry

Methods

#registryTableNames :: Proxy (spec ': rest) -> [Text]

#registryQueueKinds :: Proxy (spec ': rest) -> [(Text, [Text])]

(CollectFor (SpecPayload spec) p, KnownSymbol (SpecName spec), RegistryPolicies rest p) => RegistryPolicies (spec ': rest) p # 
Instance details

Defined in Arbiter.Core.Admission

#type Queue (table :: Symbol) payload = 'QueueWithResult table payload ()

A queue whose handlers store no result. A module with its own Queue type needs import Arbiter.Core hiding (Queue) or a qualified import.

Server

Source #arbiterServer :: forall (registry :: JobPayloadRegistry). BuildServer registry registry => ArbiterServerConfig registry -> ServerT (ArbiterAPI registry) Handler

Complete Arbiter server at /api/v1/...

Source #arbiterApp :: forall (registry :: JobPayloadRegistry). (BuildServer registry registry, HasServer (ArbiterAPI registry) ('[] :: [Type])) => ArbiterServerConfig registry -> Application

Convert to WAI Application. Each QueueWithResult result type needs FromJSON and ToJSON.

Source #runArbiterAPI :: forall (registry :: JobPayloadRegistry). (BuildServer registry registry, HasServer (ArbiterAPI registry) ('[] :: [Type])) => Port -> ArbiterServerConfig registry -> IO ()

Run the API server on a port.

Source #data ArbiterServerConfig (registry :: JobPayloadRegistry)

Configuration for the API server.

Constructors

ArbiterServerConfig 

Fields

Source #initArbiterServer :: forall (registry :: JobPayloadRegistry). Proxy registry -> ByteString -> Text -> IO (ArbiterServerConfig registry)

Create an ArbiterServerConfig with a connection pool of its own. SSE needs the event-streaming triggers, which runMigrationsForRegistry installs when enableEventStreaming is set.

Source #defaultQueueStatsCacheTtl :: NominalDiffTime

Default floor between per-queue stats scans.

Source #defaultMaintenanceInterval :: NominalDiffTime

No minimum gap. An explicit maintenance call runs every operation. Concurrent callers exclude each other on the gate.

Source #defaultMaintenanceBucketIdle :: NominalDiffTime

Bucket idle age, matching a worker pool's reaper.

Source #defaultMaintenanceSparseInterval :: NominalDiffTime

Gap the whole-schema operations keep, matching a worker pool's reaper.

Source #defaultMaintenanceTimeout :: NominalDiffTime

Statement timeout for one maintenance operation.

Source #class BuildServer (registry :: JobPayloadRegistry) (reg :: JobPayloadRegistry) where

Builds a registry's per-queue server implementations.

Instances

Instances details
(RegistryAdmissionPolicies registry, RegistryTables registry) => BuildServer registry ('[] :: [QueueSpec]) Source # 
Instance details

Defined in Arbiter.Servant.Server

(BuildServer registry rest, EncodeJobResult (SpecResult spec), JobPayload (SpecPayload spec), KnownSymbol (SpecName spec)) => BuildServer registry (spec ': rest) Source # 
Instance details

Defined in Arbiter.Servant.Server

Methods

Source #buildServer :: ArbiterServerConfig registry -> ServerT (RegistryToAPI (spec ': rest)) Handler

API Types

Source #type ArbiterAPI (registry :: JobPayloadRegistry) = "api" :> ("v1" :> RegistryToAPI registry)

Top-level Arbiter API, mounted at /api/v1. The route tree under that prefix is generated from the registry. See RegistryToAPI for the shape.

Source #type family RegistryToAPI (registry :: JobPayloadRegistry) where ...

A TableAPI route per registry entry, followed by the shared top-level routes.

Equations

RegistryToAPI ('[] :: [QueueSpec]) = SharedAPI 
RegistryToAPI (spec ': rest) = (SpecName spec :> NamedRoutes (TableAPI (SpecPayload spec) (SpecResult spec) :: Type -> Type)) :<|> RegistryToAPI rest 

Source #data TableAPI payload result (mode :: k)

One queue's routes.

Constructors

TableAPI 

Fields

Instances

Instances details
Generic (TableAPI payload result mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (TableAPI payload result mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (TableAPI payload result mode) = D1 ('MetaData "TableAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "TableAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "jobs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("jobs" :> NamedRoutes (JobsAPI payload result :: Type -> Type)))) :*: (S1 ('MetaSel ('Just "claimJobs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("claim" :> (ReqBody '[JSON] ClaimRequest :> Post '[JSON] (ClaimResponse payload))))) :*: S1 ('MetaSel ('Just "dlq") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("dlq" :> NamedRoutes (DLQAPI payload :: Type -> Type)))))) :*: (S1 ('MetaSel ('Just "archive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("archive" :> NamedRoutes (ArchiveAPI payload :: Type -> Type)))) :*: (S1 ('MetaSel ('Just "stats") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("stats" :> NamedRoutes (StatsAPI :: Type -> Type)))) :*: S1 ('MetaSel ('Just "listKinds") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("kinds" :> Get '[JSON] [Text])))))))

Methods

#from :: TableAPI payload result mode -> Rep (TableAPI payload result mode) x

#to :: Rep (TableAPI payload result mode) x -> TableAPI payload result mode

type Rep (TableAPI payload result mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (TableAPI payload result mode) = D1 ('MetaData "TableAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "TableAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "jobs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("jobs" :> NamedRoutes (JobsAPI payload result :: Type -> Type)))) :*: (S1 ('MetaSel ('Just "claimJobs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("claim" :> (ReqBody '[JSON] ClaimRequest :> Post '[JSON] (ClaimResponse payload))))) :*: S1 ('MetaSel ('Just "dlq") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("dlq" :> NamedRoutes (DLQAPI payload :: Type -> Type)))))) :*: (S1 ('MetaSel ('Just "archive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("archive" :> NamedRoutes (ArchiveAPI payload :: Type -> Type)))) :*: (S1 ('MetaSel ('Just "stats") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("stats" :> NamedRoutes (StatsAPI :: Type -> Type)))) :*: S1 ('MetaSel ('Just "listKinds") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("kinds" :> Get '[JSON] [Text])))))))

Source #type SharedAPI = ("queues" :> NamedRoutes (QueuesAPI :: Type -> Type)) :<|> (("maintenance" :> NamedRoutes (MaintenanceAPI :: Type -> Type)) :<|> (("events" :> EventsAPI) :<|> (("cron" :> NamedRoutes (CronAPI :: Type -> Type)) :<|> (("workers" :> NamedRoutes (WorkersAPI :: Type -> Type)) :<|> (("rate-limits" :> NamedRoutes (RateLimitsAPI :: Type -> Type)) :<|> (("concurrency" :> NamedRoutes (ConcurrencyAPI :: Type -> Type)) :<|> ("health" :> NamedRoutes (HealthAPI :: Type -> Type))))))))

Shared top-level routes appended after the per-table routes.

Source #type EventsAPI = "stream" :> Raw

The SSE stream, served by a raw WAI handler.

Source #data QueuesAPI (mode :: k)

The queue registry routes.

Constructors

QueuesAPI 

Fields

Instances

Instances details
Generic (QueuesAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (QueuesAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (QueuesAPI mode) = D1 ('MetaData "QueuesAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "QueuesAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listQueues") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] QueuesResponse)) :*: S1 ('MetaSel ('Just "getAllStats") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("stats" :> Get '[JSON] AllStatsResponse)))) :*: (S1 ('MetaSel ('Just "getDetails") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "queue" Text :> ("details" :> Get '[JSON] (Maybe QueueRow))))) :*: (S1 ('MetaSel ('Just "pauseQueue") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "queue" Text :> ("pause" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeQueue") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "queue" Text :> ("resume" :> PostNoContent))))))))

Methods

#from :: QueuesAPI mode -> Rep (QueuesAPI mode) x

#to :: Rep (QueuesAPI mode) x -> QueuesAPI mode

type Rep (QueuesAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (QueuesAPI mode) = D1 ('MetaData "QueuesAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "QueuesAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listQueues") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] QueuesResponse)) :*: S1 ('MetaSel ('Just "getAllStats") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("stats" :> Get '[JSON] AllStatsResponse)))) :*: (S1 ('MetaSel ('Just "getDetails") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "queue" Text :> ("details" :> Get '[JSON] (Maybe QueueRow))))) :*: (S1 ('MetaSel ('Just "pauseQueue") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "queue" Text :> ("pause" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeQueue") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "queue" Text :> ("resume" :> PostNoContent))))))))

Source #data JobsAPI payload result (mode :: k)

One queue's job routes.

Constructors

JobsAPI 

Fields

Instances

Instances details
Generic (JobsAPI payload result mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (JobsAPI payload result mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (JobsAPI payload result mode) = D1 ('MetaData "JobsAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JobsAPI" 'PrefixI 'True) (((S1 ('MetaSel ('Just "listJobs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "limit" Int :> (QueryParam "offset" Int :> (QueryParam "group_key" Text :> (QueryParam "parent_id" Int64 :> (QueryParam "job_id" Int64 :> (QueryFlag "roots_only" :> (QueryParam "status" JobStatus :> (QueryParam "claimed_by" UUID :> (QueryParam "kind" Text :> (QueryParam "payload" Text :> (QueryParam "rate_limit_prefix" Text :> (QueryParam "concurrency_prefix" Text :> (QueryParam "sort_by" JobSortColumn :> (QueryParam "sort_dir" SortDir :> Get '[JSON] (JobsResponse payload))))))))))))))))) :*: (S1 ('MetaSel ('Just "insertJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (ReqBody '[JSON] (ApiJobWrite payload) :> Post '[JSON] (JobResponse (ApiJob payload))))) :*: S1 ('MetaSel ('Just "insertJobsBatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("batch" :> (ReqBody '[JSON] (BatchInsertRequest payload) :> Post '[JSON] (BatchInsertResponse payload))))))) :*: ((S1 ('MetaSel ('Just "getJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> Get '[JSON] (JobResponse (ApiJobWithStatus payload))))) :*: S1 ('MetaSel ('Just "cancelJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> DeleteNoContent)))) :*: (S1 ('MetaSel ('Just "forceCancelJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("force-cancel" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "ackClaimedJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("ack" :> (ReqBody '[JSON] (AckRequest result) :> PostNoContent)))))))) :*: (((S1 ('MetaSel ('Just "nackClaimedJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("nack" :> (ReqBody '[JSON] JobLease :> PostNoContent))))) :*: S1 ('MetaSel ('Just "extendClaimedJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("extend" :> (ReqBody '[JSON] ExtendRequest :> PostNoContent)))))) :*: (S1 ('MetaSel ('Just "promoteJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("promote" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "moveToDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("move-to-dlq" :> PostNoContent)))))) :*: ((S1 ('MetaSel ('Just "pauseChildren") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("pause-children" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeChildren") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("resume-children" :> PostNoContent))))) :*: (S1 ('MetaSel ('Just "suspendJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("suspend" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("resume" :> PostNoContent)))))))))

Methods

#from :: JobsAPI payload result mode -> Rep (JobsAPI payload result mode) x

#to :: Rep (JobsAPI payload result mode) x -> JobsAPI payload result mode

type Rep (JobsAPI payload result mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (JobsAPI payload result mode) = D1 ('MetaData "JobsAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JobsAPI" 'PrefixI 'True) (((S1 ('MetaSel ('Just "listJobs") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "limit" Int :> (QueryParam "offset" Int :> (QueryParam "group_key" Text :> (QueryParam "parent_id" Int64 :> (QueryParam "job_id" Int64 :> (QueryFlag "roots_only" :> (QueryParam "status" JobStatus :> (QueryParam "claimed_by" UUID :> (QueryParam "kind" Text :> (QueryParam "payload" Text :> (QueryParam "rate_limit_prefix" Text :> (QueryParam "concurrency_prefix" Text :> (QueryParam "sort_by" JobSortColumn :> (QueryParam "sort_dir" SortDir :> Get '[JSON] (JobsResponse payload))))))))))))))))) :*: (S1 ('MetaSel ('Just "insertJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (ReqBody '[JSON] (ApiJobWrite payload) :> Post '[JSON] (JobResponse (ApiJob payload))))) :*: S1 ('MetaSel ('Just "insertJobsBatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("batch" :> (ReqBody '[JSON] (BatchInsertRequest payload) :> Post '[JSON] (BatchInsertResponse payload))))))) :*: ((S1 ('MetaSel ('Just "getJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> Get '[JSON] (JobResponse (ApiJobWithStatus payload))))) :*: S1 ('MetaSel ('Just "cancelJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> DeleteNoContent)))) :*: (S1 ('MetaSel ('Just "forceCancelJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("force-cancel" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "ackClaimedJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("ack" :> (ReqBody '[JSON] (AckRequest result) :> PostNoContent)))))))) :*: (((S1 ('MetaSel ('Just "nackClaimedJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("nack" :> (ReqBody '[JSON] JobLease :> PostNoContent))))) :*: S1 ('MetaSel ('Just "extendClaimedJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("extend" :> (ReqBody '[JSON] ExtendRequest :> PostNoContent)))))) :*: (S1 ('MetaSel ('Just "promoteJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("promote" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "moveToDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("move-to-dlq" :> PostNoContent)))))) :*: ((S1 ('MetaSel ('Just "pauseChildren") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("pause-children" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeChildren") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("resume-children" :> PostNoContent))))) :*: (S1 ('MetaSel ('Just "suspendJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("suspend" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeJob") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("resume" :> PostNoContent)))))))))

Source #data DLQAPI payload (mode :: k)

One queue's DLQ routes.

Constructors

DLQAPI 

Fields

Instances

Instances details
Generic (DLQAPI payload mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (DLQAPI payload mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (DLQAPI payload mode) = D1 ('MetaData "DLQAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "DLQAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "limit" Int :> (QueryParam "offset" Int :> (QueryParam "parent_id" Int64 :> (QueryParam "job_id" Int64 :> (QueryParam "group_key" Text :> (QueryParam "kind" Text :> (QueryParam "sort_by" DLQSortColumn :> (QueryParam "sort_dir" SortDir :> Get '[JSON] (DLQResponse payload))))))))))) :*: S1 ('MetaSel ('Just "retryFromDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("retry" :> PostNoContent))))) :*: (S1 ('MetaSel ('Just "deleteDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> DeleteNoContent))) :*: S1 ('MetaSel ('Just "deleteDLQBatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("batch-delete" :> (ReqBody '[JSON] BatchDeleteRequest :> Post '[JSON] BatchDeleteResponse)))))))

Methods

#from :: DLQAPI payload mode -> Rep (DLQAPI payload mode) x

#to :: Rep (DLQAPI payload mode) x -> DLQAPI payload mode

type Rep (DLQAPI payload mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (DLQAPI payload mode) = D1 ('MetaData "DLQAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "DLQAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "limit" Int :> (QueryParam "offset" Int :> (QueryParam "parent_id" Int64 :> (QueryParam "job_id" Int64 :> (QueryParam "group_key" Text :> (QueryParam "kind" Text :> (QueryParam "sort_by" DLQSortColumn :> (QueryParam "sort_dir" SortDir :> Get '[JSON] (DLQResponse payload))))))))))) :*: S1 ('MetaSel ('Just "retryFromDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("retry" :> PostNoContent))))) :*: (S1 ('MetaSel ('Just "deleteDLQ") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> DeleteNoContent))) :*: S1 ('MetaSel ('Just "deleteDLQBatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("batch-delete" :> (ReqBody '[JSON] BatchDeleteRequest :> Post '[JSON] BatchDeleteResponse)))))))

Source #data ArchiveAPI payload (mode :: k)

One queue's archive routes.

Constructors

ArchiveAPI 

Fields

Instances

Instances details
Generic (ArchiveAPI payload mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (ArchiveAPI payload mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (ArchiveAPI payload mode) = D1 ('MetaData "ArchiveAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ArchiveAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listArchive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "limit" Int :> (QueryParam "offset" Int :> (QueryParam "parent_id" Int64 :> (QueryParam "job_id" Int64 :> (QueryParam "group_key" Text :> (QueryParam "kind" Text :> (QueryParam "completed_after" UTCTime :> (QueryParam "completed_before" UTCTime :> (QueryParam "sort_by" ArchiveSortColumn :> (QueryParam "sort_dir" SortDir :> Get '[JSON] (ArchiveResponse payload))))))))))))) :*: S1 ('MetaSel ('Just "reEnqueueArchive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("reenqueue" :> PostNoContent))))) :*: (S1 ('MetaSel ('Just "deleteArchive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> DeleteNoContent))) :*: S1 ('MetaSel ('Just "deleteArchiveBatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("batch-delete" :> (ReqBody '[JSON] BatchDeleteRequest :> Post '[JSON] BatchDeleteResponse)))))))

Methods

#from :: ArchiveAPI payload mode -> Rep (ArchiveAPI payload mode) x

#to :: Rep (ArchiveAPI payload mode) x -> ArchiveAPI payload mode

type Rep (ArchiveAPI payload mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (ArchiveAPI payload mode) = D1 ('MetaData "ArchiveAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ArchiveAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listArchive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "limit" Int :> (QueryParam "offset" Int :> (QueryParam "parent_id" Int64 :> (QueryParam "job_id" Int64 :> (QueryParam "group_key" Text :> (QueryParam "kind" Text :> (QueryParam "completed_after" UTCTime :> (QueryParam "completed_before" UTCTime :> (QueryParam "sort_by" ArchiveSortColumn :> (QueryParam "sort_dir" SortDir :> Get '[JSON] (ArchiveResponse payload))))))))))))) :*: S1 ('MetaSel ('Just "reEnqueueArchive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> ("reenqueue" :> PostNoContent))))) :*: (S1 ('MetaSel ('Just "deleteArchive") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" Int64 :> DeleteNoContent))) :*: S1 ('MetaSel ('Just "deleteArchiveBatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("batch-delete" :> (ReqBody '[JSON] BatchDeleteRequest :> Post '[JSON] BatchDeleteResponse)))))))

Source #data StatsAPI (mode :: k)

One queue's stats route.

Constructors

StatsAPI 

Fields

Instances

Instances details
Generic (StatsAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (StatsAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (StatsAPI mode) = D1 ('MetaData "StatsAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "StatsAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "getStats") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] StatsResponse))))

Methods

#from :: StatsAPI mode -> Rep (StatsAPI mode) x

#to :: Rep (StatsAPI mode) x -> StatsAPI mode

type Rep (StatsAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (StatsAPI mode) = D1 ('MetaData "StatsAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "StatsAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "getStats") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] StatsResponse))))

Source #newtype MaintenanceAPI (mode :: k)

Schema-wide maintenance. A running worker pool does the same work.

Instances

Instances details
Generic (MaintenanceAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (MaintenanceAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (MaintenanceAPI mode) = D1 ('MetaData "MaintenanceAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'True) (C1 ('MetaCons "MaintenanceAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "runMaintenance") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Post '[JSON] MaintenanceResponse))))

Methods

#from :: MaintenanceAPI mode -> Rep (MaintenanceAPI mode) x

#to :: Rep (MaintenanceAPI mode) x -> MaintenanceAPI mode

type Rep (MaintenanceAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (MaintenanceAPI mode) = D1 ('MetaData "MaintenanceAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'True) (C1 ('MetaCons "MaintenanceAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "runMaintenance") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Post '[JSON] MaintenanceResponse))))

Source #data CronAPI (mode :: k)

The cron schedule routes.

Constructors

CronAPI 

Fields

Instances

Instances details
Generic (CronAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (CronAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (CronAPI mode) = D1 ('MetaData "CronAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CronAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "listSchedules") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("schedules" :> (QueryParam "queue" Text :> Get '[JSON] CronSchedulesResponse)))) :*: (S1 ('MetaSel ('Just "updateSchedule") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("schedules" :> (Capture "name" Text :> (ReqBody '[JSON] CronScheduleUpdate :> Patch '[JSON] CronScheduleView))))) :*: S1 ('MetaSel ('Just "runSchedule") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("schedules" :> (Capture "name" Text :> ("run" :> PostNoContent))))))))

Methods

#from :: CronAPI mode -> Rep (CronAPI mode) x

#to :: Rep (CronAPI mode) x -> CronAPI mode

type Rep (CronAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (CronAPI mode) = D1 ('MetaData "CronAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CronAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "listSchedules") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("schedules" :> (QueryParam "queue" Text :> Get '[JSON] CronSchedulesResponse)))) :*: (S1 ('MetaSel ('Just "updateSchedule") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("schedules" :> (Capture "name" Text :> (ReqBody '[JSON] CronScheduleUpdate :> Patch '[JSON] CronScheduleView))))) :*: S1 ('MetaSel ('Just "runSchedule") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("schedules" :> (Capture "name" Text :> ("run" :> PostNoContent))))))))

Source #data WorkersAPI (mode :: k)

The worker registry routes.

Constructors

WorkersAPI 

Fields

Instances

Instances details
Generic (WorkersAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (WorkersAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (WorkersAPI mode) = D1 ('MetaData "WorkersAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "WorkersAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "listWorkers") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "queue" Text :> (QueryParam "live" Double :> Get '[JSON] WorkersResponse)))) :*: (S1 ('MetaSel ('Just "pauseWorker") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" UUID :> ("pause" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeWorker") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" UUID :> ("resume" :> PostNoContent)))))))

Methods

#from :: WorkersAPI mode -> Rep (WorkersAPI mode) x

#to :: Rep (WorkersAPI mode) x -> WorkersAPI mode

type Rep (WorkersAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (WorkersAPI mode) = D1 ('MetaData "WorkersAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "WorkersAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "listWorkers") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (QueryParam "queue" Text :> (QueryParam "live" Double :> Get '[JSON] WorkersResponse)))) :*: (S1 ('MetaSel ('Just "pauseWorker") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" UUID :> ("pause" :> PostNoContent)))) :*: S1 ('MetaSel ('Just "resumeWorker") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "id" UUID :> ("resume" :> PostNoContent)))))))

Source #data HealthAPI (mode :: k)

Liveness and readiness.

Constructors

HealthAPI 

Fields

Instances

Instances details
Generic (HealthAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (HealthAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (HealthAPI mode) = D1 ('MetaData "HealthAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "HealthAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "getHealth") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] HealthResponse)) :*: S1 ('MetaSel ('Just "getLiveness") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("live" :> Get '[JSON] LivenessResponse)))))

Methods

#from :: HealthAPI mode -> Rep (HealthAPI mode) x

#to :: Rep (HealthAPI mode) x -> HealthAPI mode

type Rep (HealthAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (HealthAPI mode) = D1 ('MetaData "HealthAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "HealthAPI" 'PrefixI 'True) (S1 ('MetaSel ('Just "getHealth") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] HealthResponse)) :*: S1 ('MetaSel ('Just "getLiveness") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("live" :> Get '[JSON] LivenessResponse)))))

Source #data RateLimitsAPI (mode :: k)

Rate limits API routes, schema-wide.

Instances

Instances details
Generic (RateLimitsAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (RateLimitsAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (RateLimitsAPI mode) = D1 ('MetaData "RateLimitsAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "RateLimitsAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listRateLimits") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] RateLimitPoliciesResponse)) :*: S1 ('MetaSel ('Just "listRateLimitBuckets") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> ("buckets" :> (QueryParam "limit" Int :> (QueryParam "offset" Int :> Get '[JSON] RateLimitBucketsResponse))))))) :*: (S1 ('MetaSel ('Just "updateRateLimitPolicy") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> (ReqBody '[JSON] RateLimitPolicyUpdate :> Patch '[JSON] RateLimitPolicyView)))) :*: S1 ('MetaSel ('Just "resetRateLimitBuckets") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> ("reset" :> Post '[JSON] RateLimitResetResponse)))))))

Methods

#from :: RateLimitsAPI mode -> Rep (RateLimitsAPI mode) x

#to :: Rep (RateLimitsAPI mode) x -> RateLimitsAPI mode

type Rep (RateLimitsAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (RateLimitsAPI mode) = D1 ('MetaData "RateLimitsAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "RateLimitsAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listRateLimits") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] RateLimitPoliciesResponse)) :*: S1 ('MetaSel ('Just "listRateLimitBuckets") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> ("buckets" :> (QueryParam "limit" Int :> (QueryParam "offset" Int :> Get '[JSON] RateLimitBucketsResponse))))))) :*: (S1 ('MetaSel ('Just "updateRateLimitPolicy") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> (ReqBody '[JSON] RateLimitPolicyUpdate :> Patch '[JSON] RateLimitPolicyView)))) :*: S1 ('MetaSel ('Just "resetRateLimitBuckets") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> ("reset" :> Post '[JSON] RateLimitResetResponse)))))))

Source #data ConcurrencyAPI (mode :: k)

Concurrency API routes, schema-wide.

Instances

Instances details
Generic (ConcurrencyAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

Associated Types

type Rep (ConcurrencyAPI mode) 
Instance details

Defined in Arbiter.Servant.API

type Rep (ConcurrencyAPI mode) = D1 ('MetaData "ConcurrencyAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ConcurrencyAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listConcurrency") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] ConcurrencyPoliciesResponse)) :*: S1 ('MetaSel ('Just "listConcurrencyKeys") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> ("keys" :> (QueryParam "limit" Int :> (QueryParam "offset" Int :> Get '[JSON] ConcurrencyKeysResponse))))))) :*: (S1 ('MetaSel ('Just "updateConcurrencyPolicy") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> (ReqBody '[JSON] ConcurrencyPolicyUpdate :> Patch '[JSON] ConcurrencyPolicyView)))) :*: S1 ('MetaSel ('Just "reconcileConcurrency") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("reconcile" :> Post '[JSON] ConcurrencyReconcileResponse))))))

Methods

#from :: ConcurrencyAPI mode -> Rep (ConcurrencyAPI mode) x

#to :: Rep (ConcurrencyAPI mode) x -> ConcurrencyAPI mode

type Rep (ConcurrencyAPI mode) Source # 
Instance details

Defined in Arbiter.Servant.API

type Rep (ConcurrencyAPI mode) = D1 ('MetaData "ConcurrencyAPI" "Arbiter.Servant.API" "arbiter-servant-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ConcurrencyAPI" 'PrefixI 'True) ((S1 ('MetaSel ('Just "listConcurrency") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- Get '[JSON] ConcurrencyPoliciesResponse)) :*: S1 ('MetaSel ('Just "listConcurrencyKeys") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> ("keys" :> (QueryParam "limit" Int :> (QueryParam "offset" Int :> Get '[JSON] ConcurrencyKeysResponse))))))) :*: (S1 ('MetaSel ('Just "updateConcurrencyPolicy") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- (Capture "prefix" Text :> (ReqBody '[JSON] ConcurrencyPolicyUpdate :> Patch '[JSON] ConcurrencyPolicyView)))) :*: S1 ('MetaSel ('Just "reconcileConcurrency") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (mode :- ("reconcile" :> Post '[JSON] ConcurrencyReconcileResponse))))))

Request and response types