go/protocol/app.go (51 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. package protocol import ( "log/slog" "time" "github.com/Azure/iot-operations-sdks/go/internal/options" "github.com/Azure/iot-operations-sdks/go/protocol/hlc" ) type ( // Application represents shared application state. Application struct { hlc *hlc.Global log *slog.Logger } // ApplicationOption represents a single application option. ApplicationOption interface{ application(*ApplicationOptions) } // ApplicationOptions are the resolved application options. ApplicationOptions struct { MaxClockDrift time.Duration Logger *slog.Logger } // WithMaxClockDrift specifies how long HLCs are allowed to drift from the // wall clock before they are considered no longer valid. WithMaxClockDrift time.Duration ) // NewApplication creates a new shared application state. Only one of these // should be created per application. func NewApplication(opt ...ApplicationOption) (*Application, error) { var opts ApplicationOptions opts.Apply(opt) return &Application{ hlc: hlc.New(&hlc.HybridLogicalClockOptions{ MaxClockDrift: opts.MaxClockDrift, }), log: opts.Logger, }, nil } // GetHLC syncs the application HLC instance to the current time and returns it. func (a *Application) GetHLC() (hlc.HybridLogicalClock, error) { return a.hlc.Get() } // SetHLC syncs the application HLC instance to the given HLC. func (a *Application) SetHLC(val hlc.HybridLogicalClock) error { return a.hlc.Set(val) } // Apply resolves the provided list of options. func (o *ApplicationOptions) Apply( opts []ApplicationOption, rest ...ApplicationOption, ) { for opt := range options.Apply[ApplicationOption](opts, rest...) { opt.application(o) } } func (o *ApplicationOptions) application(opt *ApplicationOptions) { if o != nil { *opt = *o } } func (o WithMaxClockDrift) application(opt *ApplicationOptions) { opt.MaxClockDrift = time.Duration(o) }