relayenv

package
v8.8.0 Latest Latest
Warning

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

Go to latest
Published: Jun 25, 2024 License: Apache-2.0 Imports: 27 Imported by: 0

Documentation

Overview

Package relayenv contains the internal interface and implementation of EnvConfig, the object that manages Relay state for a specific configured LD environment.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetEnvironmentID

func GetEnvironmentID(env EnvContext) config.EnvironmentID

GetEnvironmentID is a helper for extracting the EnvironmentID, if any, from the set of credentials.

Types

type ConnectionMapper added in v8.8.0

type ConnectionMapper interface {
	AddConnectionMapping(scopedCredential sdkauth.ScopedCredential, envContext EnvContext)
	RemoveConnectionMapping(scopedCredential sdkauth.ScopedCredential)
}

type CredentialUpdate added in v8.8.0

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

CredentialUpdate specifies the primary credential of a given credential kind for an environment. For example, an environment may have a primary SDK key and a primary mobile key at the same time; each would be specified in individual CredentialUpdate objects.

func NewCredentialUpdate added in v8.8.0

func NewCredentialUpdate(primary credential.SDKCredential) *CredentialUpdate

NewCredentialUpdate creates a CredentialUpdate from a given primary credential. The default behavior of the environment is to immediately revoke the previous credential of this kind.

func (*CredentialUpdate) WithGracePeriod added in v8.8.0

func (c *CredentialUpdate) WithGracePeriod(deprecated config.SDKKey, expiry time.Time) *CredentialUpdate

WithGracePeriod modifies the default behavior from immediate revocation to a delayed revocation of the previous credential. During the grace period, the previous credential continues to function.

func (*CredentialUpdate) WithTime added in v8.8.0

func (c *CredentialUpdate) WithTime(t time.Time) *CredentialUpdate

WithTime overrides the update's current time for testing purposes. Because the environment's credential rotation algorithm compares the current time to the specific expiry of each credential, this can be used to trigger behavior in a more predictable way than relying on the actual time in the test.

type EnvContext

type EnvContext interface {
	io.Closer

	// GetIdentifiers returns information about the environment and project names and keys.
	GetIdentifiers() EnvIdentifiers

	// GetPayloadFilter returns the environment's filter key, which may be an empty string indicating
	// default/unfiltered.
	GetPayloadFilter() config.FilterKey

	// SetIdentifiers updates the environment and project names and keys.
	SetIdentifiers(EnvIdentifiers)

	// UpdateCredential updates the environment with a new credential, optionally deprecating a previous one
	// with a grace period.
	UpdateCredential(update *CredentialUpdate)

	// GetCredentials returns all currently enabled and non-deprecated credentials for the environment.
	GetCredentials() []credential.SDKCredential

	// GetDeprecatedCredentials returns all deprecated and not-yet-removed credentials for the environment.
	GetDeprecatedCredentials() []credential.SDKCredential

	// GetClient returns the SDK client instance for this environment. This is nil if initialization is not yet
	// complete. Rather than providing the full client object, we use the simpler sdks.LDClientContext which
	// includes only the operations Relay needs to do.
	GetClient() sdks.LDClientContext

	// GetStore returns the SDK data store instance for this environment. This is nil if initialization is not
	// yet complete.
	GetStore() subsystems.DataStore

	// GetEvaluator returns an instance of the evaluation engine for evaluating feature flags in this environment.
	// This is nil if initialization is not yet complete.
	GetEvaluator() ldeval.Evaluator

	// GetBigSegmentStore returns the big segment data store instance for this environment. If a big
	// segment store is not configured this returns nil.
	GetBigSegmentStore() bigsegments.BigSegmentStore

	// GetLoggers returns a Loggers instance that is specific to this environment. We configure each of these to
	// have its own prefix string and, optionally, its own log level.
	GetLoggers() ldlog.Loggers

	// GetStreamHandler returns the HTTP handler for the specified kind of stream requests and credential for this
	// environment. If there is none, it returns a handler for a 404 status (not nil).
	GetStreamHandler(streams.StreamProvider, credential.SDKCredential) http.Handler

	// GetEventDispatcher returns the object that proxies events for this environment.
	GetEventDispatcher() *events.EventDispatcher

	// GetJSClientContext returns the JSClientContext that is used for browser endpoints.
	GetJSClientContext() JSClientContext

	// GetMetricsContext returns the Context that should be used for OpenCensus operations related to this
	// environment.
	GetMetricsContext() context.Context

	// GetTTL returns the configured cache TTL for PHP SDK endpoints for this environment.
	GetTTL() time.Duration

	// SetTTL changes the configured cache TTL for PHP SDK endpoints for this environment.
	SetTTL(time.Duration)

	// GetInitError returns an error if initialization has failed, or nil otherwise.
	GetInitError() error

	// IsSecureMode returns true if client-side evaluation requests for this environment must have a valid
	// secure mode hash.
	IsSecureMode() bool

	// SetSecureMode changes the secure mode setting.
	SetSecureMode(bool)

	// GetCreationTime returns the time that this EnvContext was created.
	GetCreationTime() time.Time

	// GetDataStoreInfo returns information about the environment's data store.
	GetDataStoreInfo() sdks.DataStoreEnvironmentInfo

	// FlushMetricsEvents is used in testing to ensure that metrics events are delivered promptly.
	FlushMetricsEvents()
}

EnvContext is the interface for all Relay operations that are specific to one configured LD environment.

The EnvContext is normally associated with an LDClient instance from the Go SDK, and allows direct access to the DataStore that is used by the SDK client. However, these are created asynchronously since the client connection may take a while, so it is possible for the client and store references to be nil if initialization is not yet complete.

func NewEnvContext

func NewEnvContext(
	params EnvContextImplParams,
	readyCh chan<- EnvContext,

) (EnvContext, error)

NewEnvContext creates the internal implementation of EnvContext.

It immediately begins trying to initialize the SDK client for this environment. Since that might take a while, it is done on a separate goroutine. The EnvContext instance is returned immediately in an uninitialized state, and once the SDK client initialization has either succeeded or failed, the same EnvContext will be pushed to the channel readyCh.

NewEnvContext can also immediately return an error, with a nil EnvContext, if the configuration is invalid.

type EnvContextImplParams

type EnvContextImplParams struct {
	Identifiers                      EnvIdentifiers
	EnvConfig                        config.EnvConfig
	AllConfig                        config.Config
	ClientFactory                    sdks.ClientFactoryFunc
	DataStoreFactory                 subsystems.ComponentConfigurer[subsystems.DataStore]
	DataStoreInfo                    sdks.DataStoreEnvironmentInfo
	StreamProviders                  []streams.StreamProvider
	JSClientContext                  JSClientContext
	MetricsManager                   *metrics.Manager
	BigSegmentStoreFactory           bigsegments.BigSegmentStoreFactory
	BigSegmentSynchronizerFactory    bigsegments.BigSegmentSynchronizerFactory
	SDKBigSegmentsConfigFactory      subsystems.ComponentConfigurer[subsystems.BigSegmentsConfiguration] // set only in tests
	UserAgent                        string
	LogNameMode                      LogNameMode
	Loggers                          ldlog.Loggers
	ConnectionMapper                 ConnectionMapper
	ExpiredCredentialCleanupInterval time.Duration
}

EnvContextImplParams contains the constructor parameters for NewEnvContextImpl. These have their own type because there are a lot of them, and many are irrelevant in tests.

type EnvIdentifiers

type EnvIdentifiers struct {
	// EnvKey is the environment key (normally a lowercase string like "production").
	EnvKey string

	// EnvName is the environment name (normally a title-cased string like "Production").
	EnvName string

	// ProjKey is the project key (normally a lowercase string like "my-application").
	ProjKey string

	// ProjName is the project name (normally a title-cased string like "My Application").
	ProjName string

	// FilterKey is the environment's payload filter. Empty string indicates no filter.
	FilterKey config.FilterKey

	// ConfiguredName is a human-readable unique name for this environment, if the user specified one. When
	// using a local configuration, this is always set; in auto-configuration mode, it is always empty (but
	// EnvIdentifiers.GetDisplayName() will compute one).
	ConfiguredName string
}

EnvIdentifiers contains environment and project name and key properties.

When running in Relay Proxy Enterprise's auto-configuration mode, EnvKey, EnvName, ProjKey, and ProjName are copied from the LaunchDarkly dashboard settings. Otherwise, those are all blank and ConfiguredName is set in the local configuration.

func (EnvIdentifiers) GetDisplayName

func (ei EnvIdentifiers) GetDisplayName() string

GetDisplayName returns a human-readable unique name for this environment. If none was set in the configuration, it computes one in the format "ProjName EnvName".

type JSClientContext

type JSClientContext struct {
	// Origins is the configured list of allowed origins for CORS requests.
	Origins []string

	// Headers is the configured list of allowed headers for CORS requests.
	Headers []string

	// Proxy is a ReverseProxy that we create for requests that are to be directly proxied to a
	// LaunchDarkly endpoint. Despite its name, the Relay Proxy does not normally use direct
	// proxying, but in the case of the goals resource for JS clients it is the simplest way.
	Proxy *httputil.ReverseProxy
}

JSClientContext contains additional environment properties that are only relevant if this environment supports JavaScript clients (i.e. we know its environment ID).

func (JSClientContext) AllowedHeaders

func (c JSClientContext) AllowedHeaders() []string

AllowedHeaders implements the internal interface for getting additional CORS allowed headers.

func (JSClientContext) AllowedOrigins

func (c JSClientContext) AllowedOrigins() []string

AllowedOrigins implements the internal interface for getting CORS allowed origins.

type LogNameMode

type LogNameMode bool

LogNameMode is used in NewEnvContext to determine whether the environment's log messages should be tagged by SDK key or by environment ID.

const (
	// LogNameIsSDKKey means the log messages should be tagged with the last 4 characters of the SDK key.
	// This is the default behavior for the Relay Proxy.
	LogNameIsSDKKey LogNameMode = false

	// LogNameIsEnvID means the log messages should be tagged with the last 4 characters of the environment
	// ID. This is the default behavior for Relay Proxy Enterprise when running in auto-configuration mode,
	// where we always know the environment ID but the SDK key is subject to change.
	LogNameIsEnvID LogNameMode = true
)

Jump to

Keyboard shortcuts

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