func NewRegistryEndDeviceFetcher(c *component.Component) EndDeviceFetcher {
	return &endDeviceFetcher{c}
}
NewRegistryEndDeviceFetcher returns a new endDeviceFetcher.
package applicationserver
import (
	"context"
	"fmt"
	"strings"
	"sync"
	"time"
	"github.com/bluele/gcache"
	pbtypes "github.com/gogo/protobuf/types"
	"go.thethings.network/lorawan-stack/v3/pkg/component"
	"go.thethings.network/lorawan-stack/v3/pkg/errors"
	"go.thethings.network/lorawan-stack/v3/pkg/log"
	"go.thethings.network/lorawan-stack/v3/pkg/ttnpb"
	"go.thethings.network/lorawan-stack/v3/pkg/unique"
	"golang.org/x/sync/singleflight"
)
type EndDeviceFetcher interface {
	Get(ctx context.Context, ids ttnpb.EndDeviceIdentifiers, fieldMaskPaths ...string) (*ttnpb.EndDevice, error)
}
type NoopEndDeviceFetcher struct{}
func (f *NoopEndDeviceFetcher) Get(ctx context.Context, ids ttnpb.EndDeviceIdentifiers, fieldMaskPaths ...string) (*ttnpb.EndDevice, error) {
	return nil, errDeviceNotFound.WithAttributes("device_uid", unique.ID(ctx, ids))
}
type endDeviceFetcher struct {
	c *component.Component
}