defaultmiddlewares

package
v0.4.19 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 23, 2021 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

Package defaultmiddlewares houses the default middleware for amqp.Channel.

These middlewares enable features like continuous delivery tag values across channel disconnects.

Index

Constants

View Source
const ConfirmsMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultConfirms"

ConfirmsMiddlewareID can be used to retrieve the running instance of ConfirmsMiddleware during testing.

View Source
const DeliveryTagsMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultDeliveryTags"

DeliveryTagsMiddlewareID can be used to retrieve the running instance of DeliveryTagsMiddleware during testing.

View Source
const FlowMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultFlow"

FlowMiddlewareID can be used to retrieve the running instance of FlowMiddleware during testing.

View Source
const LoggingMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultLogging"

LoggingMiddlewareID can be used to retrieve the running instance of LoggingMiddlewareConnection or LoggingMiddlewareChannel during testing.

View Source
const MetadataKey = amqpmiddleware.MetadataKey("DefaultLogger")

MetadataKey can be used to fetch the logger provided by LoggingMiddlewareChannel and LoggingMiddlewareConnection from middleware contexts and amqpmiddleware.EventMetadata -- allowing other middlewares to access to logging.

View Source
const PublishTagsMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultPublishTags"

PublishTagsMiddlewareID can be used to retrieve the running instance of PublishTagsMiddleware during testing.

View Source
const QoSMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultQoS"

QoSMiddlewareID can be used to retrieve the running instance of QoSMiddleware during testing.

View Source
const RouteDeclarationMiddlewareID amqpmiddleware.ProviderTypeID = "DefaultRouteDeclaration"

RouteDeclarationMiddlewareID can be used to retrieve the running instance of RouteDeclarationMiddleware during testing.

Variables

This section is empty.

Functions

func NewConfirmMiddleware

func NewConfirmMiddleware() amqpmiddleware.ProvidesMiddleware

NewConfirmMiddleware creates a new *ConfirmsMiddleware to register with a channel.

func NewDeliveryTagsMiddleware

func NewDeliveryTagsMiddleware() amqpmiddleware.ProvidesMiddleware

NewDeliveryTagsMiddleware creates a new DeliveryTagsMiddleware for an amqp.Channel.

func NewErrCantAcknowledgeOrphans

func NewErrCantAcknowledgeOrphans(
	latestAck uint64,
	thisAck uint64,
	offset uint64,
	multiple bool,
) error

NewErrCantAcknowledgeOrphans creates a new error when one or more tags cannot be acknowledged because they have been orphaned. This method assumes that there is an error to report, and will always result in a non-nil error object.

func NewFlowMiddleware

func NewFlowMiddleware() amqpmiddleware.ProvidesMiddleware

NewFlowMiddleware creates a new FlowMiddleware for a channel.

func NewLoggerFactories

func NewLoggerFactories(
	logger zerolog.Logger,
	id string,
	successLogLevel zerolog.Level,
	logArgsResultsLevel zerolog.Level,
) (connectionFactory, channelFactory amqpmiddleware.ProviderFactory)

NewLoggerFactories creates a new factory for making connection and channel logger middleware.

func NewPublishTagsMiddleware

func NewPublishTagsMiddleware() amqpmiddleware.ProvidesMiddleware

NewPublishTagsMiddleware creates a new PublishTagsMiddleware.

func NewQosMiddleware

func NewQosMiddleware() amqpmiddleware.ProvidesMiddleware

NewQosMiddleware creates a new QoSMiddleware.

func NewRouteDeclarationMiddleware

func NewRouteDeclarationMiddleware() amqpmiddleware.ProvidesMiddleware

NewRouteDeclarationMiddleware creates a new RouteDeclarationMiddleware.

Types

type ConfirmsMiddleware

type ConfirmsMiddleware struct {
	// contains filtered or unexported fields
}

ConfirmsMiddleware saves most recent amqp.Channel.Confirm() settings and re-applies them on restart.

func (*ConfirmsMiddleware) ChannelReconnect

ChannelReconnect puts the new, underlying connection into confirmation mode if Confirm() has been called.

func (*ConfirmsMiddleware) Confirm

func (middleware *ConfirmsMiddleware) Confirm(
	next amqpmiddleware.HandlerConfirm,
) (handler amqpmiddleware.HandlerConfirm)

Confirm captures called to amqp.Channel.Confirm() and remembers that all subsequent underlying channels should be put into confirmation mode upon reconnect.

func (*ConfirmsMiddleware) ConfirmsOn

func (middleware *ConfirmsMiddleware) ConfirmsOn() bool

ConfirmsOn returns whether Confirm() has been called on this channel. For testing.

func (*ConfirmsMiddleware) TypeID

func (middleware *ConfirmsMiddleware) TypeID() amqpmiddleware.ProviderTypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns a static type ID for retrieving the active middleware value during testing.

type DeliveryTagsMiddleware

type DeliveryTagsMiddleware struct {
	// contains filtered or unexported fields
}

DeliveryTagsMiddleware creates continuous delivery tags across reconnections.

func (*DeliveryTagsMiddleware) Ack

Ack is invoked when amqp.Channel.Ack() is called, and handles converting the delivery tag back to the original value for the underlying channel, as well as returning errors on an attempt to ACK an orphan.

func (*DeliveryTagsMiddleware) ChannelReconnect

ChannelReconnect establishes our current delivery tag offset based on how many deliveries have been consumed across all of our connections so far.

func (*DeliveryTagsMiddleware) ConsumeEvents

ConsumeEvents is invoked whenever an event is sent to a caller of amqp.Channel.Consume(), and handles applying the delivery tag offset.

func (*DeliveryTagsMiddleware) Get

Get applies our current delivery tag offset and increments our delivery count whenever amqp.Channel.Get() is called.

func (*DeliveryTagsMiddleware) Nack

Nack is invoked when amqp.Channel.Nack() is called, and handles converting the delivery tag back to the original value for the underlying channel, as well as returning errors on an attempt to NACK an orphan.

func (*DeliveryTagsMiddleware) Reject

Reject is invoked when amqp.Channel.Reject() is called, and handles converting the delivery tag back to the original value for the underlying channel, as well as returning errors on an attempt to NACK an orphan.

func (*DeliveryTagsMiddleware) TypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns a static type ID for retrieving the active middleware value during testing.

type ErrCantAcknowledgeOrphans

type ErrCantAcknowledgeOrphans struct {
	// The first tag that could not be acknowledged because it's original channel
	// had been closed
	OrphanTagFirst uint64
	// The last tag that could not be acknowledged because it's original channel had
	// been closed. Inclusive. May be the same value as OrphanTagFirst if only one tag
	// was orphaned
	OrphanTagLast uint64

	// The first tag that was successfully acknowledged. Will be 0 if multiple was set
	// to false or if all tags were orphans.
	SuccessTagFirst uint64
	// The last tag that was successfully acknowledged. Will be 0 if multiple was set
	// to false or if all tags were orphans. May be the same as AckTagFirst if only one
	// tags was successfully acknowledged.
	SuccessTagLast uint64
}

ErrCantAcknowledgeOrphans is returned when an acknowledgement method (ack, nack, reject) cannot be completed because the original channel it was consumed from has been closed and replaced with a new one. When part of a multi-ack, it's possible that SOME tags will be orphaned and some will succeed, this error contains detailed information on both groups

func (ErrCantAcknowledgeOrphans) Error

func (err ErrCantAcknowledgeOrphans) Error() string

Error implements builtins.error

func (ErrCantAcknowledgeOrphans) OrphanCount

func (err ErrCantAcknowledgeOrphans) OrphanCount() uint64

OrphanCount returns number of tags orphaned (will always be 1 or greater or there would be no error).

func (ErrCantAcknowledgeOrphans) SuccessCount

func (err ErrCantAcknowledgeOrphans) SuccessCount() uint64

SuccessCount returns the number of tags successfully acknowledged.

type FlowMiddleware

type FlowMiddleware struct {
	// contains filtered or unexported fields
}

FlowMiddleware tracks the Flow state of the channel, and if it is set to false by the user, re-established channels to flow=false.

func (*FlowMiddleware) Active

func (middleware *FlowMiddleware) Active() bool

Active returns whether flow is currently active. For testing.

func (*FlowMiddleware) ChannelReconnect

ChannelReconnect sets amqp.Channel.Flow(flow=false) on the underlying channel as soon as a reconnection occurs if the user has paused the flow on the channel.

func (*FlowMiddleware) Flow

Flow captures calls to *amqp.Channel.Flow() so channels can be paused on reconnect if the user has paused the channel.

func (*FlowMiddleware) TypeID

func (middleware *FlowMiddleware) TypeID() amqpmiddleware.ProviderTypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns a static type ID for retrieving the active middleware value during testing.

type LoggingMiddlewareChannel

type LoggingMiddlewareChannel struct {
	// contains filtered or unexported fields
}

LoggingMiddlewareChannel provides logging middleware for amqp.Channel.

func (LoggingMiddlewareChannel) Ack

Ack implements amqpmiddleware.ProvidesAck for logging.

func (LoggingMiddlewareChannel) ChannelReconnect

ChannelReconnect implements amqpmiddleware.ProvidesChannelReconnect for logging.

func (LoggingMiddlewareChannel) Close

func (middleware LoggingMiddlewareChannel) Close(next amqpmiddleware.HandlerClose) amqpmiddleware.HandlerClose

Close implements amqpmiddleware.ProvidesClose for logging.

func (LoggingMiddlewareChannel) Confirm

Confirm implements amqpmiddleware.ProvidesConfirm for logging.

func (LoggingMiddlewareChannel) Consume

Consume implements amqpmiddleware.ProvidesConsume for logging.

func (LoggingMiddlewareChannel) ConsumeEvents

ConsumeEvents implements amqpmiddleware.ProvidesConsumeEvents for logging.

func (LoggingMiddlewareChannel) ExchangeBind

ExchangeBind implements amqpmiddleware.ProvidesExchangeBind for logging.

func (LoggingMiddlewareChannel) ExchangeDeclare

ExchangeDeclare implements amqpmiddleware.ProvidesExchangeDeclare for logging.

func (LoggingMiddlewareChannel) ExchangeDeclarePassive

ExchangeDeclarePassive implements amqpmiddleware.ProvidesExchangeDeclarePassive for logging.

func (LoggingMiddlewareChannel) ExchangeDelete

ExchangeDelete implements amqpmiddleware.ProvidesExchangeDelete for logging.

func (LoggingMiddlewareChannel) ExchangeUnbind

ExchangeUnbind implements amqpmiddleware.ProvidesExchangeUnbind for logging.

func (LoggingMiddlewareChannel) Flow

Flow implements amqpmiddleware.ProvidesFlow for logging.

func (LoggingMiddlewareChannel) Get

Get implements amqpmiddleware.ProvidesGet for logging.

func (LoggingMiddlewareChannel) Nack

Nack implements amqpmiddleware.ProvidesNack for logging.

func (LoggingMiddlewareChannel) NotifyCancel

NotifyCancel implements amqpmiddleware.ProvidesNotifyCancel for logging.

func (LoggingMiddlewareChannel) NotifyClose

func (middleware LoggingMiddlewareChannel) NotifyClose(
	next amqpmiddleware.HandlerNotifyClose,
) amqpmiddleware.HandlerNotifyClose

NotifyClose implements amqpmiddleware.ProvidesNotifyClose for logging.

func (LoggingMiddlewareChannel) NotifyCloseEvents

func (middleware LoggingMiddlewareChannel) NotifyCloseEvents(
	next amqpmiddleware.HandlerNotifyCloseEvents,
) amqpmiddleware.HandlerNotifyCloseEvents

NotifyCloseEvents implements amqpmiddleware.ProvidesNotifyCloseEvents for logging.

func (LoggingMiddlewareChannel) NotifyConfirm

NotifyConfirm implements amqpmiddleware.ProvidesNotifyConfirm for logging.

func (LoggingMiddlewareChannel) NotifyConfirmEvents

NotifyConfirmEvents implements amqpmiddleware.ProvidesNotifyConfirmEvents for logging.

func (LoggingMiddlewareChannel) NotifyConfirmOrOrphaned

NotifyConfirmOrOrphaned implements amqpmiddleware.ProvidesNotifyConfirmOrOrphaned for logging.

func (LoggingMiddlewareChannel) NotifyConfirmOrOrphanedEvents

NotifyConfirmOrOrphanedEvents implements amqpmiddleware.ProvidesNotifyConfirmOrOrphanedEvents for logging.

func (LoggingMiddlewareChannel) NotifyDial

func (middleware LoggingMiddlewareChannel) NotifyDial(
	next amqpmiddleware.HandlerNotifyDial,
) amqpmiddleware.HandlerNotifyDial

NotifyDial implements amqpmiddleware.ProvidesNotifyDial for logging.

func (LoggingMiddlewareChannel) NotifyDialEvents

func (middleware LoggingMiddlewareChannel) NotifyDialEvents(
	next amqpmiddleware.HandlerNotifyDialEvents,
) amqpmiddleware.HandlerNotifyDialEvents

NotifyDialEvents implements amqpmiddleware.ProvidesNotifyDialEvents for logging.

func (LoggingMiddlewareChannel) NotifyDisconnect

func (middleware LoggingMiddlewareChannel) NotifyDisconnect(
	next amqpmiddleware.HandlerNotifyDisconnect,
) amqpmiddleware.HandlerNotifyDisconnect

NotifyDisconnect implements amqpmiddleware.ProvidesNotifyDisconnect for logging.

func (LoggingMiddlewareChannel) NotifyDisconnectEvents

func (middleware LoggingMiddlewareChannel) NotifyDisconnectEvents(
	next amqpmiddleware.HandlerNotifyDisconnectEvents,
) amqpmiddleware.HandlerNotifyDisconnectEvents

NotifyDisconnectEvents implements amqpmiddleware.ProvidesNotifyDisconnectEvents for logging.

func (LoggingMiddlewareChannel) NotifyFlow

NotifyFlow implements amqpmiddleware.ProvidesNotifyFlow for logging.

func (LoggingMiddlewareChannel) NotifyFlowEvents

NotifyFlowEvents implements amqpmiddleware.ProvidesNotifyFlowEvents for logging.

func (LoggingMiddlewareChannel) NotifyPublish

NotifyPublish implements amqpmiddleware.ProvidesNotifyPublish for logging.

func (LoggingMiddlewareChannel) NotifyPublishEvents

NotifyPublishEvents implements amqpmiddleware.ProvidesNotifyPublishEvents for logging.

func (LoggingMiddlewareChannel) NotifyReturn

NotifyReturn implements amqpmiddleware.ProvidesNotifyReturn for logging.

func (LoggingMiddlewareChannel) NotifyReturnEvents

NotifyReturnEvents implements amqpmiddleware.ProvidesNotifyReturnEvents for logging.

func (LoggingMiddlewareChannel) Publish

Publish implements amqpmiddleware.ProvidesPublish for logging.

func (LoggingMiddlewareChannel) QoS

QoS implements amqpmiddleware.ProvidesQoS for logging.

func (LoggingMiddlewareChannel) QueueBind

QueueBind implements amqpmiddleware.ProvidesQueueBind for logging.

func (LoggingMiddlewareChannel) QueueDeclare

QueueDeclare implements amqpmiddleware.ProvidesQueueDeclare for logging.

func (LoggingMiddlewareChannel) QueueDeclarePassive

QueueDeclarePassive implements amqpmiddleware.ProvidesQueueDeclarePassive for logging.

func (LoggingMiddlewareChannel) QueueDelete

QueueDelete implements amqpmiddleware.ProvidesQueueDelete for logging.

func (LoggingMiddlewareChannel) QueueInspect

QueueInspect implements amqpmiddleware.ProvidesQueueInspect for logging.

func (LoggingMiddlewareChannel) QueuePurge

QueuePurge implements amqpmiddleware.ProvidesQueuePurge for logging.

func (LoggingMiddlewareChannel) QueueUnbind

QueueUnbind implements amqpmiddleware.ProvidesQueueUnbind for logging.

func (LoggingMiddlewareChannel) Reject

Reject implements amqpmiddleware.ProvidesReject for logging.

func (LoggingMiddlewareChannel) TypeID

func (middleware LoggingMiddlewareChannel) TypeID() amqpmiddleware.ProviderTypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns "DefaultLogging".

type LoggingMiddlewareConnection

type LoggingMiddlewareConnection struct {
	// contains filtered or unexported fields
}

LoggingMiddlewareConnection provides logging middleware for amqp.Connection.

func (LoggingMiddlewareConnection) Close

func (middleware LoggingMiddlewareConnection) Close(next amqpmiddleware.HandlerClose) amqpmiddleware.HandlerClose

Close implements amqpmiddleware.ProvidesClose for logging.

func (LoggingMiddlewareConnection) ConnectionReconnect

ConnectionReconnect implements amqpmiddleware.ProvidesConnectionReconnect for logging.

func (LoggingMiddlewareConnection) NotifyClose

func (middleware LoggingMiddlewareConnection) NotifyClose(
	next amqpmiddleware.HandlerNotifyClose,
) amqpmiddleware.HandlerNotifyClose

NotifyClose implements amqpmiddleware.ProvidesNotifyClose for logging.

func (LoggingMiddlewareConnection) NotifyCloseEvents

func (middleware LoggingMiddlewareConnection) NotifyCloseEvents(
	next amqpmiddleware.HandlerNotifyCloseEvents,
) amqpmiddleware.HandlerNotifyCloseEvents

NotifyCloseEvents implements amqpmiddleware.ProvidesNotifyCloseEvents for logging.

func (LoggingMiddlewareConnection) NotifyDial

func (middleware LoggingMiddlewareConnection) NotifyDial(
	next amqpmiddleware.HandlerNotifyDial,
) amqpmiddleware.HandlerNotifyDial

NotifyDial implements amqpmiddleware.ProvidesNotifyDial for logging.

func (LoggingMiddlewareConnection) NotifyDialEvents

func (middleware LoggingMiddlewareConnection) NotifyDialEvents(
	next amqpmiddleware.HandlerNotifyDialEvents,
) amqpmiddleware.HandlerNotifyDialEvents

NotifyDialEvents implements amqpmiddleware.ProvidesNotifyDialEvents for logging.

func (LoggingMiddlewareConnection) NotifyDisconnect

func (middleware LoggingMiddlewareConnection) NotifyDisconnect(
	next amqpmiddleware.HandlerNotifyDisconnect,
) amqpmiddleware.HandlerNotifyDisconnect

NotifyDisconnect implements amqpmiddleware.ProvidesNotifyDisconnect for logging.

func (LoggingMiddlewareConnection) NotifyDisconnectEvents

func (middleware LoggingMiddlewareConnection) NotifyDisconnectEvents(
	next amqpmiddleware.HandlerNotifyDisconnectEvents,
) amqpmiddleware.HandlerNotifyDisconnectEvents

NotifyDisconnectEvents implements amqpmiddleware.ProvidesNotifyDisconnectEvents for logging.

func (LoggingMiddlewareConnection) TypeID

func (middleware LoggingMiddlewareConnection) TypeID() amqpmiddleware.ProviderTypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns "DefaultLogging".

type PublishTagsMiddleware

type PublishTagsMiddleware struct {
	// contains filtered or unexported fields
}

PublishTagsMiddleware keeps track of client-facing and internal Publishing DeliveryTags and applies the correct offset so tags are continuous, even over re-connections.

func (*PublishTagsMiddleware) ChannelReconnect

ChannelReconnect is called during a channel reconnection events. We update the current offset based on the current publish count, and send orphan events to all amqp.Channel.NotifyPublish() listeners.

func (*PublishTagsMiddleware) Confirm

func (middleware *PublishTagsMiddleware) Confirm(
	next amqpmiddleware.HandlerConfirm,
) (handler amqpmiddleware.HandlerConfirm)

Confirm captures a channel being set to confirmation mode. If a channel is not in confirmation mode, then publish tags are not tracked.

func (*PublishTagsMiddleware) NotifyPublishEvents

NotifyPublishEvents is invoked when a channel passed to amqp.Channel.NotifyPublish is sent an event.

func (*PublishTagsMiddleware) Publish

func (middleware *PublishTagsMiddleware) Publish(
	next amqpmiddleware.HandlerPublish,
) (handler amqpmiddleware.HandlerPublish)

Publish is invoked on amqp.Channel.Publish(), and increments out publish count if our channel is in confirmation mode.

func (*PublishTagsMiddleware) PublishCount

func (middleware *PublishTagsMiddleware) PublishCount() uint64

PublishCount returns the number of messages published that this middleware has counted.

func (*PublishTagsMiddleware) TagOffset

func (middleware *PublishTagsMiddleware) TagOffset() uint64

TagOffset returns the current tag offset.

func (*PublishTagsMiddleware) TypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns a static type ID for retrieving the active middleware value during testing.

type QoSMiddleware

type QoSMiddleware struct {
	// contains filtered or unexported fields
}

QoSMiddleware saves most recent QoS settings and re-applies them on restart.

This method is currently racy if multiple goroutines call QoS with different settings.

func (*QoSMiddleware) ChannelReconnect

ChannelReconnect is called whenever the underlying channel is reconnected. This middleware re-applies any QoS calls to the channel.

func (*QoSMiddleware) IsSet

func (middleware *QoSMiddleware) IsSet() bool

IsSet returns whether the QoS has been set. For testing.

func (*QoSMiddleware) QoS

QoS is called in amqp.Channel.QoS(). Saves the QoS settings passed to the QoS function

func (*QoSMiddleware) QosArgs

func (middleware *QoSMiddleware) QosArgs() amqpmiddleware.ArgsQoS

QosArgs returns current args. For testing.

func (*QoSMiddleware) TypeID

func (middleware *QoSMiddleware) TypeID() amqpmiddleware.ProviderTypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns a static type ID for retrieving the active middleware value during testing.

type RouteDeclarationMiddleware

type RouteDeclarationMiddleware struct {
	// contains filtered or unexported fields
}

RouteDeclarationMiddleware implements handlers for re-declaring queues, exchanges, and bindings upon reconnectMiddleware.

func (*RouteDeclarationMiddleware) ChannelReconnect

ChannelReconnect is invoked on reconnection of the underlying amqp Channel, and makes sure our queue and exchange topology is re-configured to present a seamless experience to the caller.

func (*RouteDeclarationMiddleware) ExchangeBind

ExchangeBind captures amqp.Channel.ExchangeBind() saves passed arguments, so exchange bindings can be re-declared on channel reconnection.

func (*RouteDeclarationMiddleware) ExchangeDeclare

ExchangeDeclare captures amqp.Channel.ExchangeDeclare() saves passed arguments so exchanges can be re-declared on channel reconnection.

func (*RouteDeclarationMiddleware) ExchangeDelete

ExchangeDelete captures amqp.Channel.ExchangeDelete() calls and removes all relevant saved exchanges so they are not re-declared on a channel reconnect.

func (*RouteDeclarationMiddleware) ExchangeUnbind

ExchangeUnbind captures amqp.Channel.ExchangeUnbind() calls and removes all relevant saved bindings so they are not re-declared on a channel reconnect.

func (*RouteDeclarationMiddleware) QueueBind

QueueBind captures amqp.Channel.QueueBind() saves queue bind arguments, so they can be re-declared on channel reconnection.

func (*RouteDeclarationMiddleware) QueueDeclare

QueueDeclare captures amqp.Channel.QueueDeclare() calls and stores their arguments for re-declaring channels on disconnect.

func (*RouteDeclarationMiddleware) QueueDelete

QueueDelete captures amqp.Channel.QueueDelete() calls and removes all relevant saved queues and bindings so they are not re-declared on a channel reconnect.

func (*RouteDeclarationMiddleware) QueueUnbind

QueueUnbind captures amqp.Channel.QueueUnbind() calls and removes all relevant saved bindings so they are not re-declared on a channel reconnect.

func (*RouteDeclarationMiddleware) TypeID

TypeID implements amqpmiddleware.ProvidesMiddleware and returns a static type ID for retrieving the active middleware value during testing.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL