@rmdes/indiekit-endpoint-activitypub 1.0.24 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/federation-bridge.js +29 -1
- package/lib/federation-setup.js +3 -2
- package/package.json +1 -1
package/lib/federation-bridge.js
CHANGED
|
@@ -44,8 +44,9 @@ export function fromExpressRequest(req) {
|
|
|
44
44
|
*
|
|
45
45
|
* @param {import("express").Response} res - Express response
|
|
46
46
|
* @param {Response} response - Standard Response from federation.fetch()
|
|
47
|
+
* @param {Request} [request] - Original request (for targeted patching)
|
|
47
48
|
*/
|
|
48
|
-
async function sendFedifyResponse(res, response) {
|
|
49
|
+
async function sendFedifyResponse(res, response, request) {
|
|
49
50
|
res.status(response.status);
|
|
50
51
|
response.headers.forEach((value, key) => {
|
|
51
52
|
res.setHeader(key, value);
|
|
@@ -56,6 +57,33 @@ async function sendFedifyResponse(res, response) {
|
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
59
|
|
|
60
|
+
// WORKAROUND: Fedify serializes endpoints with "type": "as:Endpoints"
|
|
61
|
+
// which is not a real ActivityStreams type (fails browser.pub validation).
|
|
62
|
+
// For actor JSON responses, buffer the body and strip the invalid type.
|
|
63
|
+
// See: https://github.com/fedify-dev/fedify/issues/576
|
|
64
|
+
// TODO: Remove this workaround when Fedify fixes the upstream issue.
|
|
65
|
+
const contentType = response.headers.get("content-type") || "";
|
|
66
|
+
const isActorJson =
|
|
67
|
+
contentType.includes("activity+json") ||
|
|
68
|
+
contentType.includes("ld+json");
|
|
69
|
+
|
|
70
|
+
if (isActorJson) {
|
|
71
|
+
const body = await response.text();
|
|
72
|
+
try {
|
|
73
|
+
const json = JSON.parse(body);
|
|
74
|
+
if (json.endpoints?.type) {
|
|
75
|
+
delete json.endpoints.type;
|
|
76
|
+
}
|
|
77
|
+
const patched = JSON.stringify(json);
|
|
78
|
+
res.setHeader("content-length", Buffer.byteLength(patched));
|
|
79
|
+
res.end(patched);
|
|
80
|
+
} catch {
|
|
81
|
+
// Not valid JSON — send as-is
|
|
82
|
+
res.end(body);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
59
87
|
const reader = response.body.getReader();
|
|
60
88
|
await new Promise((resolve) => {
|
|
61
89
|
function read({ done, value }) {
|
package/lib/federation-setup.js
CHANGED
|
@@ -212,13 +212,14 @@ export function setupFederation(options) {
|
|
|
212
212
|
return null;
|
|
213
213
|
})
|
|
214
214
|
.mapAlias((_ctx, alias) => {
|
|
215
|
-
// Resolve profile URL and /@handle patterns via WebFinger
|
|
215
|
+
// Resolve profile URL and /@handle patterns via WebFinger.
|
|
216
|
+
// Must return { identifier } or { username }, not a bare string.
|
|
216
217
|
if (!publicationUrl) return null;
|
|
217
218
|
try {
|
|
218
219
|
const pub = new URL(publicationUrl);
|
|
219
220
|
if (alias.hostname !== pub.hostname) return null;
|
|
220
221
|
const path = alias.pathname.replace(/\/$/, "");
|
|
221
|
-
if (path === "" || path === `/@${handle}`) return handle;
|
|
222
|
+
if (path === "" || path === `/@${handle}`) return { identifier: handle };
|
|
222
223
|
} catch { /* ignore */ }
|
|
223
224
|
return null;
|
|
224
225
|
})
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rmdes/indiekit-endpoint-activitypub",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.26",
|
|
4
4
|
"description": "ActivityPub federation endpoint for Indiekit via Fedify. Adds full fediverse support: actor, inbox, outbox, followers, following, syndication, and Mastodon migration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"indiekit",
|