fix(api/webpush): update subscription handler

This commit is contained in:
Julien Oculi 2025-05-14 12:32:58 +02:00
parent 0214f587a5
commit 235cab22b7
2 changed files with 27 additions and 21 deletions

View file

@ -59,7 +59,8 @@
"dom",
"dom.asynciterable",
"dom.iterable",
"deno.ns"
"deno.ns",
"deno.unstable"
],
"jsx": "precompile",
"jsxImportSource": "preact",

View file

@ -1,27 +1,32 @@
import { Handlers } from '$fresh/server.ts'
import { define } from '../../../utils.ts'
import { respondApi } from ':src/utils.ts'
import { subscriptions } from ':src/webpush/mod.ts'
export const handler: Handlers = {
async POST(request: Request) {
const subscription = await request.json() as PushSubscriptionJSON
saveSubscription(subscription)
export const handler = define.handlers({
async POST(ctx) {
const subscription = await ctx.req.json() as PushSubscriptionJSON
try {
await saveSubscription(subscription)
return respondApi('success', 'ok')
} catch (error) {
console.error('[webpush/subscription]:', error)
return respondApi('error', String(error))
}
},
})
async function saveSubscription(subscription: PushSubscriptionJSON) {
if (subscription.keys === undefined) {
throw new Error('no valid key in webpush subscription')
}
function saveSubscription(subscription: PushSubscriptionJSON) {
const itemKey = 'webpush-subscription'
const subscriptions = JSON.parse(
localStorage.getItem(itemKey) ?? '[]',
) as PushSubscriptionJSON[]
const { ok } = await subscriptions.set(
['subscription', subscription.keys!.auth],
subscription,
)
// Prevent duplicate
const auth = subscription.keys?.auth
if (subscriptions.some((sub) => sub.keys?.auth === auth)) {
return
if (!ok) {
throw new Error('subscription saving failed')
}
// Store subscription
subscriptions.push(subscription)
localStorage.setItem(itemKey, JSON.stringify(subscriptions))
}