Documentation
¶
Overview ¶
Package webpushkit — транспорт доставки Web Push: VAPID-аутентификация (RFC 8292) и aes128gcm-шифрование payload (RFC 8291 поверх RFC 8188), POST на endpoint push-сервиса (RFC 8030). Kit — только типы и отправка; хранение подписок и планирование — зона потребителя (notification-домен).
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrConfig — VAPID-конфиг невалиден (нет/битый приватный ключ, subject не // mailto:/https:, public не соответствует private). ErrConfig = errors.New("webpushkit: invalid config") // ErrSubscription — подписка синтаксически невалидна (битый p256dh/auth, // неверная длина). В отличие от ErrSubscriptionGone это ошибка входных данных, // а не сигнал «удали подписку». ErrSubscription = errors.New("webpushkit: invalid subscription") // ErrSubscriptionGone — push-сервис вернул 404/410: подписка больше не // действительна, потребитель должен удалить её из своего хранилища. ErrSubscriptionGone = errors.New("webpushkit: subscription gone") // ErrPayloadTooLarge — plaintext превышает потолок, при котором зашифрованное // тело укладывается в гарантированные push-сервисами 4096 байт (либо сам // push-сервис ответил 413). ErrPayloadTooLarge = errors.New("webpushkit: payload too large") // ErrPush — прочий не-2xx ответ push-сервиса; конкретный статус несёт *PushError. ErrPush = errors.New("webpushkit: push service error") )
var Module = fx.Module( "webpushkit", fx.Provide(newSender), )
Module provide'ит *Sender. Config не provide'ится (asymmetry note как в cachekit/oidckit) — caller добавляет `fx.Provide(webpushkit.NewConfig)`. *http.Client опционален: без него — http.DefaultClient; передашь свой (httpclient/otelhttp) — Sender возьмёт его.
Functions ¶
func GenerateVAPIDKeys ¶
GenerateVAPIDKeys генерирует VAPID-пару P-256/ES256: public — uncompressed point (65 байт), private — raw scalar (32 байта), оба base64url без паддинга. Пригодится инфре для первичной выдачи WEBPUSH_VAPID_*; public также кладётся в браузерный PushManager.subscribe как applicationServerKey.
Types ¶
type Config ¶
type Config struct {
VAPIDPublicKey string `envconfig:"WEBPUSH_VAPID_PUBLIC_KEY"`
VAPIDPrivateKey string `envconfig:"WEBPUSH_VAPID_PRIVATE_KEY"`
Subject string `envconfig:"WEBPUSH_SUBJECT"`
DefaultTTL time.Duration `envconfig:"WEBPUSH_DEFAULT_TTL" default:"24h"`
}
Config — параметры VAPID-идентичности отправителя. Ключи — raw ES256 (P-256) в base64url, как их отдаёт генератор VAPID-пары (см. GenerateVAPIDKeys); тот же public-ключ браузер передаёт в PushManager.subscribe как applicationServerKey.
Имена env финализируются при первом потребителе (нужен, notification-домен) — envconfig-теги здесь часть публичного API kit'а.
type PushError ¶
PushError — не-2xx ответ push-сервиса, не подпадающий под gone/too-large. Оборачивает ErrPush (errors.Is(err, ErrPush)); StatusCode/RetryAfter позволяют потребителю решить про backoff (например, 429 + Retry-After).
type SendOption ¶
type SendOption func(*sendOptions)
SendOption переопределяет параметры одной доставки.
func WithTTL ¶
func WithTTL(ttl time.Duration) SendOption
WithTTL задаёт TTL сообщения (сколько push-сервис держит его для оффлайн-клиента).
func WithTopic ¶
func WithTopic(topic string) SendOption
WithTopic задаёт Topic: новое сообщение с тем же топиком вытесняет прежнее недоставленное (полезно, чтобы не копить устаревшие уведомления).
func WithUrgency ¶
func WithUrgency(u Urgency) SendOption
WithUrgency задаёт приоритет доставки (заголовок Urgency).
type Sender ¶
type Sender struct {
// contains filtered or unexported fields
}
Sender отправляет Web Push сообщения от лица одной VAPID-идентичности. Потокобезопасен: не хранит состояния между вызовами Send.
func NewSender ¶
NewSender готовит отправителя из VAPID-конфига. client опционален: nil → http.DefaultClient (потребитель может передать httpclient/otelhttp-обёртку, чтобы получить транспортные RED-метрики). Невалидный конфиг → ErrConfig.
func (*Sender) Send ¶
func (s *Sender) Send(ctx context.Context, sub Subscription, payload []byte, opts ...SendOption) error
Send шифрует payload под ключи подписки и POST'ит его на endpoint. Возвращает: nil при 2xx; ErrSubscriptionGone при 404/410 (потребитель удаляет подписку); ErrPayloadTooLarge; *PushError (Is ErrPush) при прочих не-2xx.
type Subscription ¶
type Subscription struct {
Endpoint string // URL push-сервиса, куда POST'ится зашифрованное сообщение
P256dh string // публичный ключ user agent'а (uncompressed P-256, base64url)
Auth string // authentication secret подписки (16 байт, base64url)
}
Subscription — то, что отдаёт браузерный PushManager.subscribe (поля endpoint + keys.p256dh + keys.auth). Kit подписки не хранит — это зона потребителя (notification-домен); сюда они приходят как есть.