Skip to main content

Push Notification Worker

Send W3C compliant web push notifications to subscribed users.

Installation

import '@unchainedshop/plugins/worker/push-notification';

Peer Dependency

This worker requires the web-push package:

npm install web-push

Environment Variables

VariableDescription
PUSH_NOTIFICATION_PUBLIC_KEYVAPID public key for push service registration
PUSH_NOTIFICATION_PRIVATE_KEYVAPID private key for signing push messages

Generating VAPID Keys

npx web-push generate-vapid-keys

Usage

Send Push Notification

mutation SendPush {
createWork(
type: "PUSH"
input: {
subscription: {
endpoint: "https://fcm.googleapis.com/..."
expirationTime: null
keys: {
auth: "auth-key"
p256dh: "p256dh-key"
}
}
subject: "https://yourshop.com"
payload: "{\"title\": \"Order Shipped\", \"body\": \"Your order is on its way!\"}"
urgency: "normal"
}
) {
_id
status
}
}

Input Parameters

ParameterTypeRequiredDescription
subscriptionObjectYesUser's push subscription object
subjectStringYesURL or mailto identifying your service
payloadStringYesStringified JSON with title and body
urgencyStringNovery-low, low, normal, or high
topicStringNoIdentifier for notification coalescing (max 32 chars)

Subscription Object

{
"endpoint": "https://push-service-url...",
"expirationTime": null,
"keys": {
"auth": "authentication-secret",
"p256dh": "public-key"
}
}

GraphQL API

Get VAPID Public Key

The public key is exposed for client-side subscription:

query GetShopInfo {
shopInfo {
vapidPublicKey
}
}

Manage User Subscriptions

# Add subscription
mutation AddPushSubscription {
addPushSubscription(
subscription: { ... }
unsubscribeFromOtherUsers: true # Remove this subscription from other users
) {
_id
pushSubscriptions {
_id
endpoint
userAgent
}
}
}

# Remove subscription
mutation RemovePushSubscription {
removePushSubscription(p256dh: "subscription-p256dh-key") {
_id
}
}

Query User Subscriptions

query GetMySubscriptions {
me {
pushSubscriptions {
_id # p256dh value
endpoint
expirationTime
userAgent
}
}
}

Template Example

Send push notifications via the messaging system:

import { MessagingDirector } from '@unchainedshop/core';

MessagingDirector.registerTemplate('ORDER_SHIPPED', async ({ orderId }, context) => {
const { modules } = context;

const order = await modules.orders.findOrder({ orderId });
const user = await modules.users.findUserById(order.userId);

const pushNotifications = (user?.pushSubscriptions || []).map((subscription) => ({
type: 'PUSH',
input: {
subscription,
subject: 'https://yourshop.com',
payload: JSON.stringify({
title: 'Order Shipped!',
body: `Your order ${order.orderNumber} is on its way`,
}),
},
}));

return pushNotifications;
});

Adapter Details

PropertyValue
Keyshop.unchained.worker-plugin.push-notification
TypePUSH
Sourceworker/push-notification.ts

External Resources