@fedify/fedify 0.15.0-dev.375 → 0.15.0-dev.377

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGES.md CHANGED
@@ -10,10 +10,21 @@ To be released.
10
10
 
11
11
  - Removed `expand` option of `Object.toJsonLd()` method, which was deprecated
12
12
  in version 0.14.0. Use `format: "expand"` option instead.
13
+
13
14
  - Added `Context.lookupObject()` method.
15
+
16
+ - Default document loaders now recognize ActivityStream objects in more ways:
17
+
18
+ - Loaders now recognize `alternate` ActivityStreams objects in the `Link`
19
+ header.
20
+ - Loaders now recognize `alternate` ActivityStreams objects in
21
+ the `<link>`/`<a>` HTML elements.
22
+
14
23
  - Added `allowPrivateAddress` option to `CreateFederationOptions` interface.
24
+
15
25
  - Renamed the short option `-c` for `--compact` of `fedify lookup` command to
16
26
  `-C` to avoid conflict with the short option `-c` for `--cache-dir`.
27
+
17
28
  - Added `-r`/`--raw` option to `fedify lookup` command to output the raw JSON
18
29
  object.
19
30
 
@@ -41,7 +41,7 @@ function logRequest(request) {
41
41
  headers: Object.fromEntries(request.headers.entries()),
42
42
  });
43
43
  }
44
- async function getRemoteDocument(url, response) {
44
+ async function getRemoteDocument(url, response, fetch) {
45
45
  const documentUrl = response.url === "" ? url : response.url;
46
46
  if (!response.ok) {
47
47
  logger.error("Failed to fetch document: {status} {url} {headers}", {
@@ -51,15 +51,61 @@ async function getRemoteDocument(url, response) {
51
51
  });
52
52
  throw new FetchError(documentUrl, `HTTP ${response.status}: ${documentUrl}`);
53
53
  }
54
+ const contentType = response.headers.get("Content-Type");
55
+ const jsonLd = contentType == null ||
56
+ contentType === "application/activity+json" ||
57
+ contentType === "application/ld+json" ||
58
+ contentType.startsWith("application/ld+json;");
54
59
  const linkHeader = response.headers.get("Link");
55
60
  let contextUrl = null;
56
61
  if (linkHeader != null) {
57
62
  const link = new HTTPHeaderLink(linkHeader);
58
- const entries = link.getByRel("http://www.w3.org/ns/json-ld#context");
59
- for (const [uri, params] of entries) {
60
- if ("type" in params && params.type === "application/ld+json") {
61
- contextUrl = uri;
62
- break;
63
+ if (jsonLd) {
64
+ const entries = link.getByRel("http://www.w3.org/ns/json-ld#context");
65
+ for (const [uri, params] of entries) {
66
+ if ("type" in params && params.type === "application/ld+json") {
67
+ contextUrl = uri;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ else {
73
+ const entries = link.getByRel("alternate");
74
+ for (const [uri, params] of entries) {
75
+ if ("type" in params &&
76
+ (params.type === "application/activity+json" ||
77
+ params.type === "application/ld+json" ||
78
+ params.type.startsWith("application/ld+json;"))) {
79
+ logger.debug("Found alternate document: {alternateUrl} from {url}", { alternateUrl: uri, url: documentUrl });
80
+ return await fetch(uri);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ if (!jsonLd &&
86
+ (contentType === "text/html" || contentType?.startsWith("text/html;") ||
87
+ contentType === "application/xhtml+xml" ||
88
+ contentType?.startsWith("application/xhtml+xml;"))) {
89
+ const p = /<(a|link)((\s+[a-z][a-z:_-]*=("[^"]*"|'[^']*'|[^\s>]+))+)\/?>/ig;
90
+ const p2 = /\s+([a-z][a-z:_-]*)=("([^"]*)"|'([^']*)'|([^\s>]+))/ig;
91
+ const html = await response.text();
92
+ let m;
93
+ const rawAttribs = [];
94
+ while ((m = p.exec(html)) !== null)
95
+ rawAttribs.push(m[2]);
96
+ for (const rawAttrs of rawAttribs) {
97
+ let m2;
98
+ const attribs = {};
99
+ while ((m2 = p2.exec(rawAttrs)) !== null) {
100
+ const key = m2[1].toLowerCase();
101
+ const value = m2[3] ?? m2[4] ?? m2[5] ?? "";
102
+ attribs[key] = value;
103
+ }
104
+ if (attribs.rel === "alternate" && "type" in attribs && (attribs.type === "application/activity+json" ||
105
+ attribs.type === "application/ld+json" ||
106
+ attribs.type.startsWith("application/ld+json;")) && "href" in attribs) {
107
+ logger.debug("Found alternate document: {alternateUrl} from {url}", { alternateUrl: attribs.href, url: documentUrl });
108
+ return await fetch(attribs.href);
63
109
  }
64
110
  }
65
111
  }
@@ -122,7 +168,7 @@ export async function fetchDocumentLoader(url, allowPrivateAddress = false) {
122
168
  response.headers.has("Location")) {
123
169
  return fetchDocumentLoader(response.headers.get("Location"));
124
170
  }
125
- return getRemoteDocument(url, response);
171
+ return getRemoteDocument(url, response, (url) => fetchDocumentLoader(url, allowPrivateAddress));
126
172
  }
127
173
  /**
128
174
  * Gets an authenticated {@link DocumentLoader} for the given identity.
@@ -164,7 +210,7 @@ export function getAuthenticatedDocumentLoader(identity, allowPrivateAddress = f
164
210
  response.headers.has("Location")) {
165
211
  return load(response.headers.get("Location"));
166
212
  }
167
- return getRemoteDocument(url, response);
213
+ return getRemoteDocument(url, response, load);
168
214
  }
169
215
  return load;
170
216
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "0.15.0-dev.375+e48f97c8",
3
+ "version": "0.15.0-dev.377+2711ed19",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -1 +1 @@
1
- {"version":3,"file":"docloader.d.ts","sourceRoot":"","sources":["../../src/runtime/docloader.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAQ1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEtE;;;;;;;;GAQG;AACH,MAAM,MAAM,kCAAkC,GAAG,CAC/C,QAAQ,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAA;CAAE,KACpD,cAAc,CAAC;AAEpB;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IAET;;;;;OAKG;gBACS,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAKhD;AAoED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,mBAAmB,GAAE,OAAe,GACnC,OAAO,CAAC,cAAc,CAAC,CAmCzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAA;CAAE,EACvD,mBAAmB,GAAE,OAAe,GACnC,cAAc,CAgChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,EAAE,cAAc,CAAC;IAEvB;;OAEG;IACH,EAAE,EAAE,OAAO,CAAC;IAEZ;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;IAEf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC1E;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,iBAAiB,GAC/C,cAAc,CA2ChB"}
1
+ {"version":3,"file":"docloader.d.ts","sourceRoot":"","sources":["../../src/runtime/docloader.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAQ1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEtE;;;;;;;;GAQG;AACH,MAAM,MAAM,kCAAkC,GAAG,CAC/C,QAAQ,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAA;CAAE,KACpD,cAAc,CAAC;AAEpB;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IAET;;;;;OAKG;gBACS,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAKhD;AA+HD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,mBAAmB,GAAE,OAAe,GACnC,OAAO,CAAC,cAAc,CAAC,CAuCzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAA;CAAE,EACvD,mBAAmB,GAAE,OAAe,GACnC,cAAc,CAgChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,EAAE,cAAc,CAAC;IAEvB;;OAEG;IACH,EAAE,EAAE,OAAO,CAAC;IAEZ;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;IAEf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC1E;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,iBAAiB,GAC/C,cAAc,CA2ChB"}