Make web push & imgproxy setup optional for local dev (#373)
* Make web push setup optional for local dev * Make imgproxy setup optional for local dev --------- Co-authored-by: ekzyis <ek@stacker.news>
This commit is contained in:
parent
7369bd819d
commit
49867f5dd5
|
@ -18,6 +18,14 @@ We're experimenting with providing an SN-like service on nostr in [Outer Space](
|
|||
|
||||
You should then be able to access the site at `localhost:3000` and any changes you make will hot reload. If you want to login locally or use lnd you'll need to modify `.env.sample` appropriately. More details [here](./docs/local-auth.md) and [here](./docs/local-lnd.md). If you have trouble please open an issue so I can help and update the README for everyone else.
|
||||
|
||||
# web push
|
||||
|
||||
To enable Web Push locally, you will need to set the `VAPID_*` env vars. `VAPID_MAILTO` needs to be a email address using the `mailto:` scheme. For `NEXT_PUBLIC_VAPID_KEY` and `VAPID_PRIVKEY`, you can run `npx web-push generate-vapid-keys`.
|
||||
|
||||
# imgproxy
|
||||
|
||||
To configure the image proxy, you will need to set the `IMGPROXY_` env vars. `NEXT_PUBLIC_IMGPROXY_URL` needs to point to the image proxy service. `IMGPROXY_KEY` and `IMGPROXY_SALT` can be set using `openssl rand -hex 64`.
|
||||
|
||||
# stack
|
||||
The site is written in javascript using Next.js, a React framework. The backend API is provided via graphql. The database is postgresql modelled with prisma. The job queue is also maintained in postgresql. We use lnd for our lightning node. A customized Bootstrap theme is used for styling.
|
||||
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
import { createHmac } from 'node:crypto'
|
||||
import { extractUrls } from '../../../lib/md'
|
||||
|
||||
const imgProxyEnabled = process.env.NODE_ENV === 'production' ||
|
||||
(process.env.NEXT_PUBLIC_IMGPROXY_URL && process.env.IMGPROXY_SALT && process.env.IMGPROXY_KEY)
|
||||
|
||||
if (!imgProxyEnabled) {
|
||||
console.warn('IMGPROXY_* env vars not set, imgproxy calls are no-ops now')
|
||||
}
|
||||
|
||||
const IMGPROXY_URL = process.env.NEXT_PUBLIC_IMGPROXY_URL
|
||||
const IMGPROXY_SALT = process.env.IMGPROXY_SALT
|
||||
const IMGPROXY_KEY = process.env.IMGPROXY_KEY
|
||||
|
@ -36,6 +43,8 @@ const isImageURL = async url => {
|
|||
}
|
||||
|
||||
export const proxyImages = async text => {
|
||||
if (!imgProxyEnabled) return text
|
||||
|
||||
const urls = extractUrls(text)
|
||||
for (const url of urls) {
|
||||
if (url.startsWith(IMGPROXY_URL)) continue
|
||||
|
|
|
@ -2,11 +2,18 @@ import webPush from 'web-push'
|
|||
import models from '../models'
|
||||
import { COMMENT_DEPTH_LIMIT } from '../../lib/constants'
|
||||
|
||||
webPush.setVapidDetails(
|
||||
process.env.VAPID_MAILTO,
|
||||
process.env.NEXT_PUBLIC_VAPID_PUBKEY,
|
||||
process.env.VAPID_PRIVKEY
|
||||
)
|
||||
const webPushEnabled = process.env.NODE_ENV === 'production' ||
|
||||
(process.env.VAPID_MAILTO && process.env.NEXT_PUBLIC_VAPID_PUBKEY && process.env.VAPID_PRIVKEY)
|
||||
|
||||
if (webPushEnabled) {
|
||||
webPush.setVapidDetails(
|
||||
process.env.VAPID_MAILTO,
|
||||
process.env.NEXT_PUBLIC_VAPID_PUBKEY,
|
||||
process.env.VAPID_PRIVKEY
|
||||
)
|
||||
} else {
|
||||
console.warn('VAPID_* env vars not set, skipping webPush setup')
|
||||
}
|
||||
|
||||
const createPayload = (notification) => {
|
||||
// https://web.dev/push-notifications-display-a-notification/#visual-options
|
||||
|
@ -41,12 +48,16 @@ const createItemUrl = async ({ id }) => {
|
|||
}
|
||||
|
||||
const sendNotification = (subscription, payload) => {
|
||||
if (!webPushEnabled) {
|
||||
console.warn('webPush not configured. skipping notification')
|
||||
return
|
||||
}
|
||||
const { id, endpoint, p256dh, auth } = subscription
|
||||
return webPush.sendNotification({ endpoint, keys: { p256dh, auth } }, payload)
|
||||
.catch((err) => {
|
||||
if (err.statusCode === 400) {
|
||||
console.log('[webPush] invalid request: ', err)
|
||||
} else if (err.statusCode === 403) {
|
||||
} else if ([401, 403].includes(err.statusCode)) {
|
||||
console.log('[webPush] auth error: ', err)
|
||||
} else if (err.statusCode === 404 || err.statusCode === 410) {
|
||||
console.log('[webPush] subscription has expired or is no longer valid: ', err)
|
||||
|
|
Loading…
Reference in New Issue