77 lines
2.7 KiB
Go
77 lines
2.7 KiB
Go
package jwk
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/lestrrat-go/httprc/v3"
|
|
"github.com/lestrrat-go/option/v2"
|
|
)
|
|
|
|
type identTypedField struct{}
|
|
|
|
type typedFieldPair struct {
|
|
Name string
|
|
Value any
|
|
}
|
|
|
|
// WithTypedField allows a private field to be parsed into the object type of
|
|
// your choice. It works much like the RegisterCustomField, but the effect
|
|
// is only applicable to the jwt.Parse function call which receives this option.
|
|
//
|
|
// While this can be extremely useful, this option should be used with caution:
|
|
// There are many caveats that your entire team/user-base needs to be aware of,
|
|
// and therefore in general its use is discouraged. Only use it when you know
|
|
// what you are doing, and you document its use clearly for others.
|
|
//
|
|
// First and foremost, this is a "per-object" option. Meaning that given the same
|
|
// serialized format, it is possible to generate two objects whose internal
|
|
// representations may differ. That is, if you parse one _WITH_ the option,
|
|
// and the other _WITHOUT_, their internal representation may completely differ.
|
|
// This could potentially lead to problems.
|
|
//
|
|
// Second, specifying this option will slightly slow down the decoding process
|
|
// as it needs to consult multiple definitions sources (global and local), so
|
|
// be careful if you are decoding a large number of tokens, as the effects will stack up.
|
|
func WithTypedField(name string, object any) ParseOption {
|
|
return &parseOption{
|
|
option.New(identTypedField{},
|
|
typedFieldPair{Name: name, Value: object},
|
|
),
|
|
}
|
|
}
|
|
|
|
type registerResourceOption struct {
|
|
option.Interface
|
|
}
|
|
|
|
func (registerResourceOption) registerOption() {}
|
|
func (registerResourceOption) resourceOption() {}
|
|
|
|
type identNewResourceOption struct{}
|
|
|
|
// WithHttprcResourceOption can be used to pass arbitrary `httprc.NewResourceOption`
|
|
// to `(httprc.Client).Add` by way of `(jwk.Cache).Register`.
|
|
func WithHttprcResourceOption(o httprc.NewResourceOption) RegisterOption {
|
|
return ®isterResourceOption{
|
|
option.New(identNewResourceOption{}, o),
|
|
}
|
|
}
|
|
|
|
// WithConstantInterval can be used to pass `httprc.WithConstantInterval` option to
|
|
// `(httprc.Client).Add` by way of `(jwk.Cache).Register`.
|
|
func WithConstantInterval(d time.Duration) RegisterOption {
|
|
return WithHttprcResourceOption(httprc.WithConstantInterval(d))
|
|
}
|
|
|
|
// WithMinInterval can be used to pass `httprc.WithMinInterval` option to
|
|
// `(httprc.Client).Add` by way of `(jwk.Cache).Register`.
|
|
func WithMinInterval(d time.Duration) RegisterOption {
|
|
return WithHttprcResourceOption(httprc.WithMinInterval(d))
|
|
}
|
|
|
|
// WithMaxInterval can be used to pass `httprc.WithMaxInterval` option to
|
|
// `(httprc.Client).Add` by way of `(jwk.Cache).Register`.
|
|
func WithMaxInterval(d time.Duration) RegisterOption {
|
|
return WithHttprcResourceOption(httprc.WithMaxInterval(d))
|
|
}
|