SYMBOL INDEX (176 symbols across 30 files) FILE: cmd/shove/main.go function newLogger (line 58) | func newLogger() *slog.Logger { function newServiceLogger (line 69) | func newServiceLogger(service string) *slog.Logger { function main (line 76) | func main() { FILE: internal/queue/memory/message.go type memoryQueuedMessage (line 3) | type memoryQueuedMessage struct method Message (line 9) | func (qm *memoryQueuedMessage) Message() []byte { FILE: internal/queue/memory/queue.go type MemoryQueueFactory (line 11) | type MemoryQueueFactory struct method NewQueue (line 96) | func (mqf MemoryQueueFactory) NewQueue(id string) (q queue.Queue, err ... type memoryQueue (line 13) | type memoryQueue struct method Queue (line 20) | func (mq *memoryQueue) Queue(msg []byte) (err error) { method Shutdown (line 42) | func (mq *memoryQueue) Shutdown() (err error) { method Remove (line 50) | func (mq *memoryQueue) Remove(qm queue.QueuedMessage) (err error) { method Requeue (line 58) | func (mq *memoryQueue) Requeue(qm queue.QueuedMessage) (err error) { method getNextMessage (line 67) | func (mq *memoryQueue) getNextMessage() *memoryQueuedMessage { method Get (line 78) | func (mq *memoryQueue) Get(ctx context.Context) (queue.QueuedMessage, ... FILE: internal/queue/queue.go type Queue (line 8) | type Queue interface type QueuedMessage (line 17) | type QueuedMessage interface type QueueFactory (line 22) | type QueueFactory interface FILE: internal/queue/redis/queue.go type redisQueueFactory (line 12) | type redisQueueFactory struct method NewQueue (line 55) | func (rqf *redisQueueFactory) NewQueue(id string) (q queue.Queue, err ... type redisQueue (line 16) | type redisQueue struct method Queue (line 34) | func (rq redisQueue) Queue(msg []byte) (err error) { method Get (line 38) | func (rq redisQueue) Get(ctx context.Context) (qm queue.QueuedMessage,... method Remove (line 43) | func (rq redisQueue) Remove(qm queue.QueuedMessage) (err error) { method Requeue (line 47) | func (rq redisQueue) Requeue(qm queue.QueuedMessage) (err error) { method Shutdown (line 51) | func (rq redisQueue) Shutdown() (err error) { function NewQueueFactory (line 21) | func NewQueueFactory(url string) queue.QueueFactory { function ListName (line 66) | func ListName(serviceID string) string { FILE: internal/server/feedback.go type tokenFeedback (line 9) | type tokenFeedback struct method handleFeedback (line 16) | func (s *Server) handleFeedback(w http.ResponseWriter, r *http.Request) { method TokenInvalid (line 37) | func (s *Server) TokenInvalid(serviceID, token string) { method ReplaceToken (line 45) | func (s *Server) ReplaceToken(serviceID, token, replacement string) { FILE: internal/server/metrics.go method CountPush (line 26) | func (s *Server) CountPush(serviceID string, success bool, duration time... FILE: internal/server/push.go method handlePush (line 10) | func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) { FILE: internal/server/server.go type Server (line 14) | type Server struct method Serve (line 44) | func (s *Server) Serve() (err error) { method Shutdown (line 54) | func (s *Server) Shutdown(ctx context.Context) (err error) { method AddService (line 72) | func (s *Server) AddService(pp services.PushService, workers int, squa... function NewServer (line 24) | func NewServer(addr string, qf queue.QueueFactory) (s *Server) { FILE: internal/server/worker.go type worker (line 10) | type worker struct method push (line 28) | func (w *worker) push(msg []byte) (err error) { method serve (line 36) | func (w *worker) serve(workers int, squash services.SquashConfig, fc s... method shutdown (line 45) | func (w *worker) shutdown() (err error) { function newWorker (line 18) | func newWorker(pp services.PushService, queue queue.Queue) (w *worker, e... FILE: internal/services/apns/apns.go type APNS (line 13) | type APNS struct method Logger (line 33) | func (apns *APNS) Logger() *slog.Logger { method NewClient (line 37) | func (apns *APNS) NewClient() (pclient services.PumpClient, err error) { method ID (line 49) | func (apns *APNS) ID() string { method String (line 58) | func (apns *APNS) String() string { method SquashAndPushMessage (line 65) | func (apns *APNS) SquashAndPushMessage(client services.PumpClient, sms... method PushMessage (line 69) | func (apns *APNS) PushMessage(pclient services.PumpClient, smsg servic... function NewAPNS (line 20) | func NewAPNS(pemFile string, production bool, log *slog.Logger) (apns *A... FILE: internal/services/apns/message.go type apnsMessage (line 11) | type apnsMessage struct type apnsNotification (line 17) | type apnsNotification struct method GetSquashKey (line 21) | func (notif apnsNotification) GetSquashKey() string { method ConvertMessage (line 25) | func (apns *APNS) ConvertMessage(data []byte) (smsg services.ServiceMess... method Validate (line 75) | func (apns *APNS) Validate(data []byte) (err error) { FILE: internal/services/email/encode.go function encodeSMTPAddress (line 17) | func encodeSMTPAddress(s string) (string, error) { function encodeSMTPAddresses (line 25) | func encodeSMTPAddresses(from string, to []string) (encFrom string, encT... function encodeAddress (line 41) | func encodeAddress(s string) (string, error) { function encodeRFC2047 (line 49) | func encodeRFC2047(s string) string { function encodeEmail (line 53) | func encodeEmail(em email) ([]byte, error) { function encodeEmailDigest (line 71) | func encodeEmailDigest(emails []email) ([]byte, error) { function encodeHeaders (line 121) | func encodeHeaders(out *bytes.Buffer, headers map[string]string) error { function nestedMultipart (line 142) | func nestedMultipart(enclosingWriter *multipart.Writer, contentType stri... function randomBoundary (line 158) | func randomBoundary() (string, error) { FILE: internal/services/email/encode_test.go function TestEncodeEmailDigest (line 15) | func TestEncodeEmailDigest(t *testing.T) { function TestEncodeEmail (line 54) | func TestEncodeEmail(t *testing.T) { function TestEncodeSMTPAddresses (line 77) | func TestEncodeSMTPAddresses(t *testing.T) { function TestEncodeSMTPAddressesErrors (line 93) | func TestEncodeSMTPAddressesErrors(t *testing.T) { FILE: internal/services/email/message.go type attachment (line 9) | type attachment struct type email (line 14) | type email struct method GetSquashKey (line 26) | func (em email) GetSquashKey() string { method ConvertMessage (line 30) | func (es *EmailService) ConvertMessage(data []byte) (services.ServiceMes... method Validate (line 50) | func (es *EmailService) Validate(data []byte) error { FILE: internal/services/email/send.go method send (line 12) | func (ec EmailConfig) send(from string, to []string, body []byte, fc ser... method sendMailTLS (line 41) | func (ec EmailConfig) sendMailTLS(addr string, auth smtp.Auth, from stri... FILE: internal/services/email/service.go constant serviceID (line 9) | serviceID = "email" type EmailConfig (line 11) | type EmailConfig struct type EmailService (line 22) | type EmailService struct method Logger (line 33) | func (es *EmailService) Logger() *slog.Logger { method ID (line 37) | func (es *EmailService) ID() string { method String (line 41) | func (es *EmailService) String() string { method NewClient (line 45) | func (es *EmailService) NewClient() (services.PumpClient, error) { method SquashAndPushMessage (line 49) | func (es *EmailService) SquashAndPushMessage(client services.PumpClien... method PushMessage (line 61) | func (es *EmailService) PushMessage(pclient services.PumpClient, smsg ... method push (line 70) | func (es *EmailService) push(from string, to []string, body []byte, fc... function NewEmailService (line 26) | func NewEmailService(config EmailConfig) (es *EmailService, err error) { FILE: internal/services/fcm/fcm.go type FCM (line 15) | type FCM struct method Logger (line 29) | func (fcm *FCM) Logger() *slog.Logger { method ID (line 34) | func (fcm *FCM) ID() string { method String (line 39) | func (fcm *FCM) String() string { method NewClient (line 43) | func (fcm *FCM) NewClient() (services.PumpClient, error) { method SquashAndPushMessage (line 57) | func (fcm *FCM) SquashAndPushMessage(services.PumpClient, []services.S... method PushMessage (line 61) | func (fcm *FCM) PushMessage(pclient services.PumpClient, smsg services... function NewFCM (line 21) | func NewFCM(credentialsFile string, log *slog.Logger) (fcm *FCM, err err... FILE: internal/services/fcm/message.go type fcmMessage (line 10) | type fcmMessage struct method GetSquashKey (line 14) | func (fcmMessage) GetSquashKey() string { method ConvertMessage (line 18) | func (fcm *FCM) ConvertMessage(data []byte) (smsg services.ServiceMessag... method Validate (line 33) | func (fcm *FCM) Validate(data []byte) error { FILE: internal/services/pump.go type Pump (line 13) | type Pump struct method push (line 58) | func (p *Pump) push(q queue.Queue, qm queue.QueuedMessage, client Pump... method serveClient (line 69) | func (p *Pump) serveClient(ctx context.Context, q queue.Queue, client ... method backoff (line 116) | func (p *Pump) backoff(ctx context.Context, failureCount int) { method Serve (line 124) | func (p *Pump) Serve(ctx context.Context, q queue.Queue, fc FeedbackCo... type ServiceMessage (line 20) | type ServiceMessage interface type PushStatus (line 24) | type PushStatus constant PushStatusSuccess (line 28) | PushStatusSuccess PushStatus = iota constant PushStatusTempFail (line 30) | PushStatusTempFail constant PushStatusHardFail (line 32) | PushStatusHardFail type PumpClient (line 35) | type PumpClient interface type PumpAdapter (line 38) | type PumpAdapter interface function NewPump (line 47) | func NewPump(workers int, squash SquashConfig, adapter PumpAdapter) (p *... function removeFromQueue (line 110) | func removeFromQueue(q queue.Queue, qm queue.QueuedMessage, log *slog.Lo... FILE: internal/services/services.go type FeedbackCollector (line 9) | type FeedbackCollector interface type PushService (line 16) | type PushService interface FILE: internal/services/squasher.go type batch (line 10) | type batch struct type SquashConfig (line 19) | type SquashConfig struct type squasher (line 24) | type squasher struct method flushAndGetRate (line 44) | func (d *squasher) flushAndGetRate(key string) (sendCount int, sentAt ... method recordPush (line 65) | func (d *squasher) recordPush(key string) { method prepareToPush (line 71) | func (d *squasher) prepareToPush(q queue.Queue, qm queue.QueuedMessage... method getNextBatch (line 101) | func (d *squasher) getNextBatch() (b batch, stopped bool) { method requestShutdown (line 137) | func (d *squasher) requestShutdown() { method shutdown (line 144) | func (d *squasher) shutdown() { method serve (line 151) | func (d *squasher) serve(fc FeedbackCollector) { method sendBatch (line 163) | func (d *squasher) sendBatch(b batch, fc FeedbackCollector) { function newSquasher (line 34) | func newSquasher(config SquashConfig, adapter PumpAdapter) (d *squasher) { FILE: internal/services/telegram/message.go type telegramMessage (line 12) | type telegramMessage struct method GetSquashKey (line 27) | func (msg telegramMessage) GetSquashKey() string { type telegramPayload (line 20) | type telegramPayload struct method ConvertMessage (line 32) | func (tg *TelegramService) ConvertMessage(data []byte) (services.Service... method Validate (line 51) | func (tg *TelegramService) Validate(data []byte) error { function concatText (line 56) | func concatText(builder *strings.Builder, text string) { function trimString (line 72) | func trimString(input string, maxLength int) string { function squashMessages (line 83) | func squashMessages(msgs []telegramMessage) (dmsg telegramMessage, err e... FILE: internal/services/telegram/telegram.go type TelegramService (line 16) | type TelegramService struct method Logger (line 30) | func (tg *TelegramService) Logger() *slog.Logger { method ID (line 35) | func (tg *TelegramService) ID() string { method String (line 41) | func (tg *TelegramService) String() string { method NewClient (line 45) | func (tg *TelegramService) NewClient() (services.PumpClient, error) { method SquashAndPushMessage (line 52) | func (tg *TelegramService) SquashAndPushMessage(pclient services.PumpC... method PushMessage (line 66) | func (tg *TelegramService) PushMessage(pclient services.PumpClient, sm... method pushMessage (line 72) | func (tg *TelegramService) pushMessage(client *http.Client, method str... function NewTelegramService (line 22) | func NewTelegramService(botToken string, log *slog.Logger) (tg *Telegram... FILE: internal/services/webhook/message.go type webhookMessage (line 11) | type webhookMessage struct method GetSquashKey (line 20) | func (webhookMessage) GetSquashKey() string { method ConvertMessage (line 24) | func (wh *Webhook) ConvertMessage(data []byte) (smsg services.ServiceMes... method Validate (line 49) | func (wh *Webhook) Validate(data []byte) error { FILE: internal/services/webhook/webhook.go type Webhook (line 13) | type Webhook struct method Logger (line 24) | func (fcm *Webhook) Logger() *slog.Logger { method ID (line 29) | func (fcm *Webhook) ID() string { method String (line 34) | func (fcm *Webhook) String() string { method NewClient (line 38) | func (fcm *Webhook) NewClient() (services.PumpClient, error) { method SquashAndPushMessage (line 49) | func (wh *Webhook) SquashAndPushMessage(services.PumpClient, []service... method PushMessage (line 53) | func (wh *Webhook) PushMessage(pclient services.PumpClient, smsg servi... function NewWebhook (line 17) | func NewWebhook(log *slog.Logger) (fcm *Webhook, err error) { FILE: internal/services/webpush/message.go type webPushMessage (line 9) | type webPushMessage struct method GetSquashKey (line 23) | func (msg webPushMessage) GetSquashKey() string { method ConvertMessage (line 27) | func (wp *WebPush) ConvertMessage(data []byte) (services.ServiceMessage,... method Validate (line 53) | func (wp *WebPush) Validate(data []byte) error { FILE: internal/services/webpush/message_test.go constant subscription (line 10) | subscription = `{ function TestConvert (line 18) | func TestConvert(t *testing.T) { function TestConvertWithToken (line 46) | func TestConvertWithToken(t *testing.T) { FILE: internal/services/webpush/webpush.go type WebPush (line 13) | type WebPush struct method Logger (line 29) | func (wp *WebPush) Logger() *slog.Logger { method NewClient (line 33) | func (wp *WebPush) NewClient() (services.PumpClient, error) { method ID (line 45) | func (wp *WebPush) ID() string { method String (line 50) | func (wp *WebPush) String() string { method SquashAndPushMessage (line 54) | func (wp *WebPush) SquashAndPushMessage(client services.PumpClient, sm... method PushMessage (line 58) | func (wp *WebPush) PushMessage(pclient services.PumpClient, smsg servi... method remove (line 111) | func (wp *WebPush) remove(q queue.Queue, qm queue.QueuedMessage) { function NewWebPush (line 20) | func NewWebPush(vapidPub, vapidPvt string, log *slog.Logger) (wp *WebPus... FILE: pkg/shove/client.go type Client (line 10) | type Client interface type redisClient (line 14) | type redisClient struct method PushRaw (line 33) | func (rc *redisClient) PushRaw(id string, data []byte) (err error) { function NewRedisClient (line 19) | func NewRedisClient(redisURL string) Client {