@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 +11 -0
- package/esm/runtime/docloader.js +54 -8
- package/package.json +1 -1
- package/types/runtime/docloader.d.ts.map +1 -1
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
|
|
package/esm/runtime/docloader.js
CHANGED
@@ -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
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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 +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;
|
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"}
|