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

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/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.376+14a349ff",
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"}