ci
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

This commit is contained in:
2024-12-03 13:56:24 +02:00
parent 920d7f089f
commit 2f5c5922e0
7 changed files with 73 additions and 290 deletions
@@ -1,78 +1,71 @@
import webpush from "web-push";
import { serverSettingsDb } from "./dbs";
import { ServerSettingsDocument } from "@hereconnect/types";
function isType<N extends ServerSettingsDocument["name"]>(
doc: ServerSettingsDocument | null | undefined,
name: N,
): doc is ServerSettingsDocument & { name: N } {
return !!(doc && doc.name === name);
}
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",
"public_settings:message_delivery_method_web_push_gcm_api_key",
],
doc_ids: ["server_settings:message_delivery_method_web_push_vapid_keys"],
});
const {
rows: [vapidDetailsRow, gcmApiRow],
} = await serverSettingsDb.allDocs({
keys: [
"server_settings:message_delivery_method_web_push_vapid",
"public_settings:message_delivery_method_web_push_gcm_api_key",
],
include_docs: true,
});
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}`,
);
}
if (
!("doc" in vapidDetailsRow) ||
!isType(vapidDetailsRow.doc, "message_delivery_method_web_push_vapid")
) {
throw new Error(
`VAPID details ${"error" in vapidDetailsRow ? vapidDetailsRow.error : "not exists"}`,
);
}
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;
if (
"doc" in gcmApiRow &&
isType(gcmApiRow.doc, "message_delivery_method_web_push_gcm_api_key")
) {
webpush.setGCMAPIKey(gcmApiRow.doc.value);
}
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(
vapidDetailsRow.doc.value.subject,
vapidDetailsRow.doc.value.keys.publicKey,
vapidDetailsRow.doc.value.keys.privateKey,
subject,
vapidDetailsKeysDoc.value.publicKey,
vapidDetailsKeysDoc.value.privateKey,
);
if (process.env.GCM_API_KEY) {
webpush.setGCMAPIKey(process.env.GCM_API_KEY);
}
changes.on("change", (change) => {
if (!change.doc) {
const doc = change.doc;
if (!doc) {
return;
}
if (isType(change.doc, "message_delivery_method_web_push_vapid")) {
console.log("update vapid details");
webpush.setVapidDetails(
change.doc.value.subject,
change.doc.value.keys.publicKey,
change.doc.value.keys.privateKey,
);
return;
}
if (
"doc" in change &&
isType(change.doc, "message_delivery_method_web_push_gcm_api_key")
) {
console.log("update gcm api key");
webpush.setGCMAPIKey(change.doc.value);
}
console.log("update vapid details");
webpush.setVapidDetails(subject, doc.value.publicKey, doc.value.privateKey);
return;
});
};