Add webmentions proxy endpoint integration

This commit is contained in:
svemagie
2026-03-09 14:10:59 +01:00
parent f44211799c
commit fed5657957
5 changed files with 50 additions and 0 deletions
+7
View File
@@ -20,6 +20,13 @@ WEBMENTION_SENDER_TIMEOUT=10000
# User-Agent used for target endpoint discovery and sends # User-Agent used for target endpoint discovery and sends
WEBMENTION_SENDER_USER_AGENT= WEBMENTION_SENDER_USER_AGENT=
# Optional webmentions proxy endpoint settings
# Default mount path in indiekit.config.mjs is /webmentions-api
WEBMENTIONS_PROXY_MOUNT_PATH=/webmentions-api
# Cache TTL in seconds for proxied webmention.io API responses
WEBMENTIONS_PROXY_CACHE_TTL=60
# Syndication endpoint mount path # Syndication endpoint mount path
# Default in indiekit.config.mjs is /syndicate # Default in indiekit.config.mjs is /syndicate
SYNDICATE_MOUNT_PATH=/syndicate SYNDICATE_MOUNT_PATH=/syndicate
+10
View File
@@ -18,6 +18,7 @@
- Posts management: `/posts` - Posts management: `/posts`
- Files: `/files` - Files: `/files`
- Webmentions moderation + API: `/webmentions` - Webmentions moderation + API: `/webmentions`
- Webmentions proxy API: `/webmentions-api`
- Webmention sender + API: `/webmention-sender` - Webmention sender + API: `/webmention-sender`
- Homepage builder UI + API: `/homepage` - Homepage builder UI + API: `/homepage`
- Conversations + API: `/conversations` - Conversations + API: `/conversations`
@@ -102,6 +103,15 @@
- `WEBMENTION_SENDER_USER_AGENT` (default `${SITE_NAME} Webmention Sender`) - `WEBMENTION_SENDER_USER_AGENT` (default `${SITE_NAME} Webmention Sender`)
- `POST /webmention-sender` requires authentication (`update` scope) and sends pending webmentions for unpublished targets. - `POST /webmention-sender` requires authentication (`update` scope) and sends pending webmentions for unpublished targets.
## Webmentions proxy
- Webmentions proxy endpoint is enabled via `@rmdes/indiekit-endpoint-webmentions-proxy` and mounted at `/webmentions-api` by default.
- Optional environment variables:
- `WEBMENTIONS_PROXY_MOUNT_PATH` (default `/webmentions-api`)
- `WEBMENTIONS_PROXY_CACHE_TTL` (default `60`, cache TTL in seconds)
- Uses existing `WEBMENTION_IO_TOKEN` and `WEBMENTION_IO_DOMAIN` configuration for upstream webmention.io requests.
- Public JSON API route: `GET /webmentions-api/api/mentions` (supports `page`, `per-page`, `target`, `wm-property` query parameters).
## ActivityPub ## ActivityPub
- ActivityPub federation is enabled via `@rmdes/indiekit-endpoint-activitypub`. - ActivityPub federation is enabled via `@rmdes/indiekit-endpoint-activitypub`.
+16
View File
@@ -78,6 +78,15 @@ const webmentionSenderTimeout = Number.isFinite(webmentionSenderTimeoutRaw)
: 10000; : 10000;
const webmentionSenderUserAgent = const webmentionSenderUserAgent =
process.env.WEBMENTION_SENDER_USER_AGENT || `${siteName} Webmention Sender`; process.env.WEBMENTION_SENDER_USER_AGENT || `${siteName} Webmention Sender`;
const webmentionsProxyMountPath =
process.env.WEBMENTIONS_PROXY_MOUNT_PATH || "/webmentions-api";
const webmentionsProxyCacheTtlRaw = Number.parseInt(
process.env.WEBMENTIONS_PROXY_CACHE_TTL || "60",
10,
);
const webmentionsProxyCacheTtl = Number.isFinite(webmentionsProxyCacheTtlRaw)
? webmentionsProxyCacheTtlRaw
: 60;
const authorName = process.env.AUTHOR_NAME || ""; const authorName = process.env.AUTHOR_NAME || "";
const authorBio = process.env.AUTHOR_BIO || ""; const authorBio = process.env.AUTHOR_BIO || "";
const authorAvatar = (() => { const authorAvatar = (() => {
@@ -208,6 +217,7 @@ export default {
"@rmdes/indiekit-preset-eleventy", "@rmdes/indiekit-preset-eleventy",
"@rmdes/indiekit-endpoint-github", "@rmdes/indiekit-endpoint-github",
"@rmdes/indiekit-endpoint-webmention-io", "@rmdes/indiekit-endpoint-webmention-io",
"@rmdes/indiekit-endpoint-webmentions-proxy",
"@rmdes/indiekit-endpoint-webmention-sender", "@rmdes/indiekit-endpoint-webmention-sender",
"@rmdes/indiekit-endpoint-homepage", "@rmdes/indiekit-endpoint-homepage",
"@rmdes/indiekit-endpoint-conversations", "@rmdes/indiekit-endpoint-conversations",
@@ -248,6 +258,12 @@ export default {
token: process.env.WEBMENTION_IO_TOKEN, token: process.env.WEBMENTION_IO_TOKEN,
domain: webmentionDomain, domain: webmentionDomain,
}, },
"@rmdes/indiekit-endpoint-webmentions-proxy": {
mountPath: webmentionsProxyMountPath,
token: process.env.WEBMENTION_IO_TOKEN,
domain: webmentionDomain,
cacheTtl: webmentionsProxyCacheTtl,
},
"@rmdes/indiekit-endpoint-webmention-sender": { "@rmdes/indiekit-endpoint-webmention-sender": {
mountPath: webmentionSenderMountPath, mountPath: webmentionSenderMountPath,
timeout: webmentionSenderTimeout, timeout: webmentionSenderTimeout,
+16
View File
@@ -23,6 +23,7 @@
"@rmdes/indiekit-endpoint-posts": "^1.0.0-beta.25", "@rmdes/indiekit-endpoint-posts": "^1.0.0-beta.25",
"@rmdes/indiekit-endpoint-webmention-io": "^1.0.7", "@rmdes/indiekit-endpoint-webmention-io": "^1.0.7",
"@rmdes/indiekit-endpoint-webmention-sender": "^1.0.6", "@rmdes/indiekit-endpoint-webmention-sender": "^1.0.6",
"@rmdes/indiekit-endpoint-webmentions-proxy": "^1.0.3",
"@rmdes/indiekit-post-type-page": "^1.0.4", "@rmdes/indiekit-post-type-page": "^1.0.4",
"@rmdes/indiekit-preset-eleventy": "^1.0.0-beta.33", "@rmdes/indiekit-preset-eleventy": "^1.0.0-beta.33",
"@rmdes/indiekit-syndicator-bluesky": "^1.0.19", "@rmdes/indiekit-syndicator-bluesky": "^1.0.19",
@@ -2518,6 +2519,21 @@
"url": "https://opencollective.com/node-fetch" "url": "https://opencollective.com/node-fetch"
} }
}, },
"node_modules/@rmdes/indiekit-endpoint-webmentions-proxy": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rmdes/indiekit-endpoint-webmentions-proxy/-/indiekit-endpoint-webmentions-proxy-1.0.3.tgz",
"integrity": "sha512-lVaE/zy0HvDgyC4Lp9vOp7AaYFHAZdfXDuLBmrTD+j5TWi9U3/dzjKe0xRs9h7wo9jIyk+M7zAnWhLtaoY90OA==",
"license": "MIT",
"dependencies": {
"express": "^5.0.0"
},
"engines": {
"node": ">=20"
},
"peerDependencies": {
"@indiekit/indiekit": ">=1.0.0-beta.25"
}
},
"node_modules/@rmdes/indiekit-post-type-page": { "node_modules/@rmdes/indiekit-post-type-page": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/@rmdes/indiekit-post-type-page/-/indiekit-post-type-page-1.0.4.tgz", "resolved": "https://registry.npmjs.org/@rmdes/indiekit-post-type-page/-/indiekit-post-type-page-1.0.4.tgz",
+1
View File
@@ -35,6 +35,7 @@
"@rmdes/indiekit-endpoint-posts": "^1.0.0-beta.25", "@rmdes/indiekit-endpoint-posts": "^1.0.0-beta.25",
"@rmdes/indiekit-endpoint-webmention-io": "^1.0.7", "@rmdes/indiekit-endpoint-webmention-io": "^1.0.7",
"@rmdes/indiekit-endpoint-webmention-sender": "^1.0.6", "@rmdes/indiekit-endpoint-webmention-sender": "^1.0.6",
"@rmdes/indiekit-endpoint-webmentions-proxy": "^1.0.3",
"@rmdes/indiekit-post-type-page": "^1.0.4", "@rmdes/indiekit-post-type-page": "^1.0.4",
"@rmdes/indiekit-preset-eleventy": "^1.0.0-beta.33", "@rmdes/indiekit-preset-eleventy": "^1.0.0-beta.33",
"@rmdes/indiekit-syndicator-bluesky": "^1.0.19", "@rmdes/indiekit-syndicator-bluesky": "^1.0.19",