@types/web-push
Version:
TypeScript definitions for web-push
327 lines (306 loc) • 12.5 kB
TypeScript
/// <reference types="node" />
import https = require("https");
/**
* To send a push notification call this method with a subscription, optional payload and any options.
*
* Note: you don't need to define a payload, and this method will work without a GCM API Key and / or VAPID keys if the push service supports it.
*
* @param subscription The PushSubscription you wish to send the notification to.
* @param payload The payload you wish to send to the the user.
* @param options Options for the GCM API key and vapid keys can be passed in if they are unique for each notification you wish to send.
*
* @throws WebPushError if the upstream push endpoint returns a non-200 status code.
* @returns This method returns a Promise which resolves if the sending of the notification was successful, otherwise it rejects.
*
* @see SendResult
* @see WebPushError
* @see https://github.com/web-push-libs/web-push#sendnotificationpushsubscription-payload-options
*/
export function sendNotification(
subscription: PushSubscription,
payload?: string | Buffer | null,
options?: RequestOptions,
): Promise<SendResult>;
/**
* Generate VAPID keys.
*
* @returns Returns an object with publicKey and privateKey values which are URL Safe Base64 encoded strings.
*
* Note: You should create these keys once, store them and use them for all future messages you send.
*/
export function generateVAPIDKeys(): VapidKeys;
/**
* This method expects the GCM API key that is linked to the gcm_sender_id in your web app manifest.
* You can use a GCM API Key from the Google Developer Console or the Cloud Messaging tab under a Firebase Project.
*
* @param apiKey An API key, or null.
*/
export function setGCMAPIKey(apiKey: string | null): void;
/**
* Encrypts the payload according to the Message Encryption for Web Push standard.
*
* (sendNotification will automatically encrypt the payload for you, so if you use sendNotification() you don't need to worry about it).
*
* @param userPublicKey The public key of the receiver (from the browser).
* @param userAuth The auth secret of the receiver (from the browser).
* @param payload The message to attach to the notification.
* @param contentEncoding The type of content encoding to use (e.g. aesgcm or aes128gcm).
*
* @returns This method returns an object with the following fields:
* localPublicKey: The public key matched the private key used during encryption.
* salt: A string representing the salt used to encrypt the payload.
* cipherText: The encrypted payload as a Buffer.
*
* @see ContentEncoding
* @see https://github.com/web-push-libs/web-push#encryptuserpublickey-userauth-payload-contentencoding
*/
export function encrypt(
userPublicKey: string,
userAuth: string,
payload: string | Buffer,
contentEncoding: ContentEncoding,
): EncryptionResult;
/**
* This method takes the required VAPID parameters and returns the required
* header to be added to a Web Push Protocol Request.
* @param audience This must be the origin of the push service.
* @param subject This should be a 'https:' URL or a 'mailto:' email address.
* @param publicKey The VAPID public key.
* @param privateKey The VAPID private key.
* @param contentEncoding The contentEncoding type.
* @param [expiration] The expiration of the VAPID JWT.
* @returns Returns an Object with the Authorization and 'Crypto-Key' values to be used as headers.
*/
export function getVapidHeaders(
audience: string,
subject: string,
publicKey: string,
privateKey: string,
contentEncoding: "aes128gcm",
expiration?: number,
): {
Authorization: string;
};
export function getVapidHeaders(
audience: string,
subject: string,
publicKey: string,
privateKey: string,
contentEncoding: "aesgcm",
expiration?: number,
): {
Authorization: string;
"Crypto-Key": string;
};
export function getVapidHeaders(
audience: string,
subject: string,
publicKey: string,
privateKey: string,
contentEncoding: ContentEncoding,
expiration?: number,
): {
Authorization: string;
"Crypto-Key"?: string | undefined;
};
/**
* Note: When calling generateRequestDetails() the payload argument does not need to be defined, passing in null
* will return no body and exclude any unnecessary headers.
* Headers related to the GCM API Key and / or VAPID keys will be included if supplied and required.
*
* @param subscription must be an object containing the details for a push subscription.
* The expected format is the same output as JSON.stringify'ing a PushSubscription in the browser.
* @param payload The payload is optional, but if set, will be encrypted and a Buffer will be returned via the payload parameter.
* This argument must be either a string or a node Buffer.
* Note: In order to encrypt the payload, the pushSubscription must have a keys object with p256dh and auth values.
* @param options Optional argument, none of its parameters are required.
*
* @returns An object containing all the details needed to make a network request.
*
* @see PushSubscription
* @see RequestDetails
* @see https://github.com/web-push-libs/web-push#generaterequestdetailspushsubscription-payload-options
*/
export function generateRequestDetails(
subscription: PushSubscription,
payload?: null,
options?: RequestOptions,
): RequestDetails & { body: null };
export function generateRequestDetails(
subscription: PushSubscription,
payload?: string | Buffer,
options?: RequestOptions,
): RequestDetails & { body: Buffer };
export function generateRequestDetails(
subscription: PushSubscription,
payload?: string | Buffer,
options?: RequestOptions,
): RequestDetails;
/**
* Valid content encodings used by encrypt(), getVapidHeaders(), generateRequestDetails() and sendNotification().
*/
export type ContentEncoding = "aesgcm" | "aes128gcm";
/**
* Map of valid content encodings.
*/
export const supportedContentEncodings: {
readonly AES_GCM: "aesgcm" & ContentEncoding;
readonly AES_128_GCM: "aws128gcm" & ContentEncoding;
};
/**
* Valid urgency used by RequestOptions.
*/
export type Urgency = "very-low" | "low" | "normal" | "high";
/**
* Map of valid urgency values.
*/
export const supportedUrgency: {
readonly VERY_LOW: "very-low" & Urgency;
readonly LOW: "low" & Urgency;
readonly NORMAL: "normal" & Urgency;
readonly HIGH: "high" & Urgency;
};
/**
* Returned by encrypt() on success.
*/
export interface EncryptionResult {
localPublicKey: string;
salt: string;
cipherText: Buffer;
}
/**
* A private/public key pair for use with VAPID methods.
*/
export interface VapidKeys {
publicKey: string;
privateKey: string;
}
/**
* When making requests where you want to define VAPID details, call this method before sendNotification()
* or pass in the details and options to sendNotification.
*
* @param subject This must be either a 'https:' URL or a 'mailto:' address.
* For example: 'https://my-site.com/contact' or 'mailto: contact@my-site.com'
* @param publicKey The public VAPID key, a URL safe, base64 encoded string.
* @param privateKey The private VAPID key, a URL safe, base64 encoded string.
*/
export function setVapidDetails(subject: string, publicKey: string, privateKey: string): void;
/**
* Configuration for a Push Subscription. This can be obtained on the frontend by calling
* serviceWorkerRegistration.pushManager.subscribe().
* The expected format is the same output as JSON.stringify'ing a PushSubscription in the browser.
*/
export interface PushSubscription {
endpoint: string;
expirationTime?: null | number;
keys: {
p256dh: string;
auth: string;
};
}
export interface Headers {
[header: string]: string;
}
/**
* Options which can be passed to the https-proxy-agent constructor.
* These are the usual http.Agent constructor options, and some additional properties:
* headers - Object containing additional headers to send to the proxy server in the CONNECT request.
* @see https://www.npmjs.com/package/https-proxy-agent#user-content-api
*/
export type HttpsProxyAgentOptions = https.AgentOptions & { headers: Headers };
/**
* Options for configuring the outgoing request in generateRequestDetails() or sendNotification().
*/
export interface RequestOptions {
/**
* Can be a GCM API key to be used for this request and this request only. This overrides any API key set via setGCMAPIKey().
*/
gcmAPIKey?: string | undefined;
/**
* Should be an object with subject, publicKey and privateKey values defined. These values should follow the VAPID Spec.
* @see https://datatracker.ietf.org/doc/html/draft-thomson-webpush-vapid
*/
vapidDetails?:
| {
subject: string;
publicKey: string;
privateKey: string;
}
| undefined;
/**
* A value in milliseconds that specifies the request's socket timeout.
* On timeout, the request will be destroyed and the promise will be rejected with a meaningful error.
* It's a common misconception that a socket timeout is the timeout to receive the full response.
* So if you have a socket timeout of 1 second, and a response comprised of 3 TCP packets,
* where each response packet takes 0.9 seconds to arrive, for a total response time of 2.7 seconds,
* then there will be no timeout.
* Once a socket 'timeout' triggers the request will be aborted by the library (by default undefined).
*/
timeout?: number | undefined;
/**
* A value in seconds that describes how long a push message is retained by the push service (by default, four weeks).
*/
TTL?: number | undefined;
/**
* An object with all the extra headers you want to add to the request.
*/
headers?: Headers | undefined;
/**
* The type of push encoding to use (e.g. 'aesgcm', by default, or 'aes128gcm').
* @see supportedContentEncodings
*/
contentEncoding?: ContentEncoding | undefined;
/**
* To indicate to the push service whether to send the notification immediately
* or prioritize the recipient’s device power considerations for delivery.
* Provide one of the following values: very-low, low, normal, or high.
* To attempt to deliver the notification immediately, specify high.
* @see supportedUrgency
*/
urgency?: Urgency | undefined;
/**
* Optionally provide an identifier that the push service uses to coalesce notifications.
* Use a maximum of 32 characters from the URL or filename-safe Base64 characters sets.
*/
topic?: string | undefined;
/**
* The HttpsProxyAgent's constructor argument that may either be a string URI of the proxy server
* (eg. http://< hostname >:< port >) or an "options" object with more specific properties.
* @see https://github.com/TooTallNate/node-https-proxy-agent#new-httpsproxyagentobject-optionsb
*/
proxy?: string | HttpsProxyAgentOptions | undefined;
/**
* The HTTPS Agent instance which will be used in the https.request method. If the proxy options are defined, agent will be ignored!
*/
agent?: https.Agent | undefined;
}
/**
* An object containing all the details needed to make a network request.
* Buffer is null unless a payload was passed into generateRequestDetails().
*/
export interface RequestDetails {
method: "POST";
headers: Headers;
body: Buffer | null;
endpoint: string;
proxy?: string | undefined;
}
/**
* If calling sendNotification() was successful, this result contains the response from the push endpoint.
*/
export interface SendResult {
statusCode: number;
body: string;
headers: Headers;
}
/**
* Error thrown when sendNotification() receives a non-200 status code from the push endpoint.
*/
export class WebPushError extends Error {
readonly message: string;
readonly statusCode: number;
readonly headers: Headers;
readonly body: string;
readonly endpoint: string;
constructor(message: string, statusCode: number, headers: Headers, body: string, endpoint: string);
}