// many of these are also found in endorser-mobile utility.ts
import axios , { AxiosResponse } from "axios" ;
import { DEFAULT_PUSH_SERVER } from "@/constants/app" ;
import { db } from "@/db/index" ;
import { MASTER_SETTINGS_KEY } from "@/db/tables/settings" ;
// eslint-disable-next-line @typescript-eslint/no-var-requires
const Buffer = require ( "buffer/" ) . Buffer ;
export const isGlobalUri = ( uri : string ) = > {
return uri && uri . match ( new RegExp ( /^[A-Za-z][A-Za-z0-9+.-]+:/ ) ) ;
} ;
export const sendTestThroughPushServer = async (
subscription : PushSubscription ,
skipFilter : boolean ,
) : Promise < AxiosResponse > = > {
await db . open ( ) ;
const settings = await db . settings . get ( MASTER_SETTINGS_KEY ) ;
let pushUrl : string = DEFAULT_PUSH_SERVER as string ;
if ( settings ? . webPushServer ) {
pushUrl = settings . webPushServer ;
}
// This is a special value that tells the service worker to send a direct notification to the device, skipping filters.
// This is shared with the service worker and should be a constant. Look for the same name in additional-scripts.js
// Use something other than "Daily Update" https://gitea.anomalistdesign.com/trent_larson/py-push-server/src/commit/3c0e196c11bc98060ec5934e99e7dbd591b5da4d/app.py#L213
const DIRECT_PUSH_TITLE = "DIRECT_NOTIFICATION" ;
const auth = Buffer . from ( subscription . getKey ( "auth" ) ) ;
const authB64 = auth
. toString ( "base64" )
. replace ( /\+/g , "-" )
. replace ( /\//g , "_" )
. replace ( /=+$/ , "" ) ;
const p256dh = Buffer . from ( subscription . getKey ( "p256dh" ) ) ;
const p256dhB64 = p256dh
. toString ( "base64" )
. replace ( /\+/g , "-" )
. replace ( /\//g , "_" )
. replace ( /=+$/ , "" ) ;
const newPayload = {
endpoint : subscription.endpoint ,
keys : {
auth : authB64 ,
p256dh : p256dhB64 ,
} ,
message : ` Test, where you will see this message ${
skipFilter ? "un" : ""
} filtered . ` ,
title : skipFilter ? DIRECT_PUSH_TITLE : "Your Web Push" ,
} ;
console . log ( "Sending a test web push message:" , newPayload ) ;
const payloadStr = JSON . stringify ( newPayload ) ;
const response = await axios . post (
pushUrl + "/web-push/send-test" ,
payloadStr ,
{
headers : {
"Content-Type" : "application/json" ,
} ,
} ,
) ;
console . log ( "Got response from web push server:" , response ) ;
return response ;
} ;