73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package irontelemetry
|
|
|
|
import (
|
|
"errors"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// ParseDSN parses a DSN string into its components
|
|
// Format: https://pk_live_xxx@irontelemetry.com
|
|
func ParseDSN(dsn string) (*ParsedDSN, error) {
|
|
parsed, err := url.Parse(dsn)
|
|
if err != nil {
|
|
return nil, errors.New("invalid DSN format: " + dsn)
|
|
}
|
|
|
|
publicKey := parsed.User.Username()
|
|
if publicKey == "" || !strings.HasPrefix(publicKey, "pk_") {
|
|
return nil, errors.New("DSN must contain a valid public key starting with pk_")
|
|
}
|
|
|
|
return &ParsedDSN{
|
|
PublicKey: publicKey,
|
|
Host: parsed.Host,
|
|
Protocol: parsed.Scheme,
|
|
APIBaseURL: parsed.Scheme + "://" + parsed.Host,
|
|
}, nil
|
|
}
|
|
|
|
// GenerateEventID generates a unique event ID
|
|
func GenerateEventID() string {
|
|
return uuid.New().String()
|
|
}
|
|
|
|
// ResolveOptions validates and fills in defaults for options
|
|
func ResolveOptions(opts Options) (Options, *ParsedDSN, error) {
|
|
parsedDSN, err := ParseDSN(opts.DSN)
|
|
if err != nil {
|
|
return opts, nil, err
|
|
}
|
|
|
|
defaults := DefaultOptions()
|
|
|
|
if opts.Environment == "" {
|
|
opts.Environment = defaults.Environment
|
|
}
|
|
if opts.AppVersion == "" {
|
|
opts.AppVersion = defaults.AppVersion
|
|
}
|
|
if opts.SampleRate == 0 {
|
|
opts.SampleRate = defaults.SampleRate
|
|
}
|
|
if opts.SampleRate < 0 {
|
|
opts.SampleRate = 0
|
|
}
|
|
if opts.SampleRate > 1 {
|
|
opts.SampleRate = 1
|
|
}
|
|
if opts.MaxBreadcrumbs == 0 {
|
|
opts.MaxBreadcrumbs = defaults.MaxBreadcrumbs
|
|
}
|
|
if opts.MaxOfflineQueueSize == 0 {
|
|
opts.MaxOfflineQueueSize = defaults.MaxOfflineQueueSize
|
|
}
|
|
if opts.APIBaseURL == "" {
|
|
opts.APIBaseURL = parsedDSN.APIBaseURL
|
|
}
|
|
|
|
return opts, parsedDSN, nil
|
|
}
|