go/mqtt/session_client_options.go (99 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package mqtt
import (
"log/slog"
"maps"
"time"
"github.com/Azure/iot-operations-sdks/go/internal/options"
"github.com/Azure/iot-operations-sdks/go/mqtt/auth"
"github.com/Azure/iot-operations-sdks/go/mqtt/retry"
)
type (
// SessionClientOption represents a single option for the session client.
SessionClientOption interface{ sessionClient(*SessionClientOptions) }
// SessionClientOptions are the resolved options for the session client.
SessionClientOptions struct {
CleanStart bool
KeepAlive uint16
SessionExpiry uint32
ReceiveMaximum uint16
ConnectUserProperties map[string]string
DisableAIOBrokerFeatures bool
ConnectionRetry retry.Policy
ConnectionTimeout time.Duration
Username UsernameProvider
Password PasswordProvider
Auth auth.Provider
Logger *slog.Logger
}
// WithConnectionTimeout sets the connection timeout for a single connection
// attempt. If a timeout is desired for the entire connection process, it
// should be specified via the connection retry policy.
WithConnectionTimeout time.Duration
// WithCleanStart sets whether the initial connection will be made without
// retaining any existing session state. This is by definition set to false
// for any reconnections.
WithCleanStart bool
// WithKeepAlive sets the keep-alive interval (in seconds).
WithKeepAlive uint16
// WithSessionExpiry sets the session expiry interval (in seconds).
WithSessionExpiry uint32
// WithReceiveMaximum sets the client-side receive maximum.
WithReceiveMaximum uint16
// WithConnectUserProperties sets the user properties for the CONNECT
// packet.
WithConnectUserProperties map[string]string
// WithDisableAIOBrokerFeatures disables behavior specific to the AIO
// Broker. Only use this option if you are using another broker and
// encounter failures.
WithDisableAIOBrokerFeatures bool
// WithUsername sets the UsernameProvider that the session client uses to
// get the username for each connection.
WithUsername UsernameProvider
// WithPassword sets the PasswordProvider that the session client uses to
// get the password for each connection.
WithPassword PasswordProvider
withConnectionRetry struct{ retry.Policy }
withAuth struct{ auth.Provider }
withLogger struct{ *slog.Logger }
)
// Apply resolves the provided list of options.
func (o *SessionClientOptions) Apply(
opts []SessionClientOption,
rest ...SessionClientOption,
) {
for opt := range options.Apply[SessionClientOption](opts, rest...) {
opt.sessionClient(o)
}
}
func (o *SessionClientOptions) sessionClient(opt *SessionClientOptions) {
if o != nil {
*opt = *o
}
}
func (o WithConnectionTimeout) sessionClient(opt *SessionClientOptions) {
opt.ConnectionTimeout = time.Duration(o)
}
func (o WithCleanStart) sessionClient(opt *SessionClientOptions) {
opt.CleanStart = bool(o)
}
func (o WithKeepAlive) sessionClient(opt *SessionClientOptions) {
opt.KeepAlive = uint16(o)
}
func (o WithSessionExpiry) sessionClient(opt *SessionClientOptions) {
opt.SessionExpiry = uint32(o)
}
func (o WithReceiveMaximum) sessionClient(opt *SessionClientOptions) {
opt.ReceiveMaximum = uint16(o)
}
func (o WithConnectUserProperties) sessionClient(opt *SessionClientOptions) {
if opt.ConnectUserProperties == nil {
opt.ConnectUserProperties = make(map[string]string, len(o))
}
maps.Copy(opt.ConnectUserProperties, o)
}
func (o WithDisableAIOBrokerFeatures) sessionClient(opt *SessionClientOptions) {
opt.DisableAIOBrokerFeatures = bool(o)
}
func (o WithUsername) sessionClient(opt *SessionClientOptions) {
opt.Username = UsernameProvider(o)
}
func (o WithPassword) sessionClient(opt *SessionClientOptions) {
opt.Password = PasswordProvider(o)
}
// WithConnectionRetry sets the connection retry policy for the session client.
func WithConnectionRetry(policy retry.Policy) SessionClientOption {
return withConnectionRetry{policy}
}
func (o withConnectionRetry) sessionClient(opt *SessionClientOptions) {
opt.ConnectionRetry = o.Policy
}
// WithAuth sets the enhanced authentication provider for the session client.
func WithAuth(provider auth.Provider) SessionClientOption {
return withAuth{provider}
}
func (o withAuth) sessionClient(opt *SessionClientOptions) {
opt.Auth = o.Provider
}
// WithLogger sets the logger for the session client.
func WithLogger(log *slog.Logger) SessionClientOption {
return withLogger{log}
}
func (o withLogger) sessionClient(opt *SessionClientOptions) {
opt.Logger = o.Logger
}