60 lines
2.1 KiB
TypeScript
60 lines
2.1 KiB
TypeScript
import { PushSubscription, RequestOptions, SendResult, sendNotification } from "web-push";
|
|
import { readFileSync } from "fs";
|
|
import Notification from "./schemas/Notification";
|
|
import { allNotif, groupNotif, roomNotif, userNotif } from "./pipelines/notif";
|
|
|
|
export class NotifcationHelper {
|
|
private options: RequestOptions
|
|
constructor () {
|
|
let keys = JSON.parse(readFileSync("./config/keys.json", 'utf-8'))
|
|
this.options = {
|
|
vapidDetails: {
|
|
subject: "CHANGE ME",
|
|
privateKey: keys.privateKey,
|
|
publicKey: keys.publicKey
|
|
}
|
|
}
|
|
}
|
|
|
|
private async send(message: string, subscriptions: PushSubscription[]) {
|
|
var count = 0;
|
|
var subslen = subscriptions.length
|
|
for (const v of subscriptions) {
|
|
var result
|
|
try {
|
|
result = await sendNotification(v, message, this.options)
|
|
count++
|
|
} catch (error) {
|
|
if (error.statusCode == 410) {
|
|
console.log("GONE")
|
|
await Notification.findOneAndDelete({endpoint: v.endpoint, keys: v.keys})
|
|
subslen--
|
|
}
|
|
else console.log(error)
|
|
}
|
|
}
|
|
return {sent: count, possible: subslen}
|
|
}
|
|
|
|
private rcpt(message: string) {
|
|
return {
|
|
user: async (uname: string) => {
|
|
return await this.send(message, await Notification.aggregate(userNotif(uname)))
|
|
},
|
|
room: async (room: string) => {
|
|
return await this.send(message, await Notification.aggregate(roomNotif(room)))
|
|
},
|
|
group: async (group: string) => {
|
|
return await this.send(message, [])
|
|
},
|
|
withRoom: async () => {
|
|
return await this.send(message, await Notification.aggregate(allNotif()))
|
|
}
|
|
}
|
|
}
|
|
|
|
simpleMessage(title: string, body: string) {
|
|
return this.rcpt(JSON.stringify({notification: {title: title, body: body}}))
|
|
}
|
|
|
|
} |