package jwtx import ( "context" "time" ) // Storer is the interface that storage the token. type Storer interface { Set(ctx context.Context, tokenStr string, expiration time.Duration) error Delete(ctx context.Context, tokenStr string) error Check(ctx context.Context, tokenStr string) (bool, error) Close(ctx context.Context) error } type storeOptions struct { CacheNS string // default "jwt" } type StoreOption func(*storeOptions) func WithCacheNS(ns string) StoreOption { return func(o *storeOptions) { o.CacheNS = ns } } type Cacher interface { Set(ctx context.Context, ns, key, value string, expiration ...time.Duration) error Get(ctx context.Context, ns, key string) (string, bool, error) Exists(ctx context.Context, ns, key string) (bool, error) Delete(ctx context.Context, ns, key string) error Close(ctx context.Context) error } func NewStoreWithCache(cache Cacher, opts ...StoreOption) Storer { s := &storeImpl{ c: cache, opts: &storeOptions{ CacheNS: "jwt", }, } for _, opt := range opts { opt(s.opts) } return s } type storeImpl struct { opts *storeOptions c Cacher } func (s *storeImpl) Set(ctx context.Context, tokenStr string, expiration time.Duration) error { return s.c.Set(ctx, s.opts.CacheNS, tokenStr, "", expiration) } func (s *storeImpl) Delete(ctx context.Context, tokenStr string) error { return s.c.Delete(ctx, s.opts.CacheNS, tokenStr) } func (s *storeImpl) Check(ctx context.Context, tokenStr string) (bool, error) { return s.c.Exists(ctx, s.opts.CacheNS, tokenStr) } func (s *storeImpl) Close(ctx context.Context) error { return s.c.Close(ctx) }