Files
hereconnect/services/message-delivery-method-web-push/src/setupVapidDetails.ts
T
ti 2f5c5922e0
Deploy db-migrations / db-migrations (push) Failing after 44s
Deploy service message-delivery-method-web-push / service message-delivery-method-web-push (push) Successful in 47s
ci
2024-12-03 13:56:24 +02:00

72 lines
2.0 KiB
TypeScript

import webpush from "web-push";
import { publicSettingsDb, serverSettingsDb } from "./dbs";
import PouchDB from "./PouchDB";
export const setupVapidDetails = async () => {
const subject = process.env.VAPID_SUBJECT;
if (!subject) {
throw new Error("VAPID_SUBJECT env is empty!");
}
const changes = serverSettingsDb.changes({
since: "now",
live: true,
include_docs: true,
doc_ids: ["server_settings:message_delivery_method_web_push_vapid_keys"],
});
const vapidDetailsKeysDoc = await serverSettingsDb
.get("server_settings:message_delivery_method_web_push_vapid_keys")
.catch(async (error) => {
if (error.name !== "not_found") {
throw new Error(
`server_settings:message_delivery_method_web_push_vapid_keys not found: ${error}`,
);
}
const vapidKeys = webpush.generateVAPIDKeys();
const doc = {
_id: "server_settings:message_delivery_method_web_push_vapid_keys",
type: "server_settings",
name: "message_delivery_method_web_push_vapid_keys",
value: vapidKeys,
created_at: new Date().toISOString(),
} as const;
await Promise.all([
serverSettingsDb.put(doc),
publicSettingsDb.put({
_id: "public_settings:message_delivery_method_web_push_vapid_public_key",
type: "public_settings",
name: "message_delivery_method_web_push_vapid_public_key",
value: vapidKeys.publicKey,
created_at: new Date().toISOString(),
}),
]);
console.log("created new vapid keys");
return doc;
});
webpush.setVapidDetails(
subject,
vapidDetailsKeysDoc.value.publicKey,
vapidDetailsKeysDoc.value.privateKey,
);
if (process.env.GCM_API_KEY) {
webpush.setGCMAPIKey(process.env.GCM_API_KEY);
}
changes.on("change", (change) => {
const doc = change.doc;
if (!doc) {
return;
}
console.log("update vapid details");
webpush.setVapidDetails(subject, doc.value.publicKey, doc.value.privateKey);
return;
});
};