@fedify/vocab-runtime 2.0.29-dev.2018 → 2.0.29-dev.2046
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/deno.json +1 -1
- package/dist/mod.cjs +6 -2
- package/dist/mod.js +6 -2
- package/dist/tests/{body-DNFbzsxI.mjs → body-CtVeJKAb.mjs} +1 -1
- package/dist/tests/{body-DPMAUTtz.cjs → body-GbL4FSd6.cjs} +1 -1
- package/dist/tests/body.test.cjs +1 -1
- package/dist/tests/body.test.mjs +1 -1
- package/dist/tests/docloader.test.cjs +67 -3
- package/dist/tests/docloader.test.mjs +67 -4
- package/dist/tests/{request-D5j8WVks.mjs → request-3-6XVYbp.mjs} +1 -1
- package/dist/tests/{request-dIRBY7QP.cjs → request-B8Dv92jS.cjs} +1 -1
- package/dist/tests/request.test.cjs +1 -1
- package/dist/tests/request.test.mjs +1 -1
- package/package.json +1 -1
- package/src/docloader.test.ts +65 -0
- package/src/docloader.ts +11 -4
package/deno.json
CHANGED
package/dist/mod.cjs
CHANGED
|
@@ -4435,7 +4435,7 @@ const preloadedContexts = {
|
|
|
4435
4435
|
//#endregion
|
|
4436
4436
|
//#region deno.json
|
|
4437
4437
|
var name = "@fedify/vocab-runtime";
|
|
4438
|
-
var version = "2.0.29-dev.
|
|
4438
|
+
var version = "2.0.29-dev.2046+5211d803";
|
|
4439
4439
|
//#endregion
|
|
4440
4440
|
//#region src/request.ts
|
|
4441
4441
|
/**
|
|
@@ -5096,7 +5096,11 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
5096
5096
|
if (!allowPrivateAddress) try {
|
|
5097
5097
|
await validatePublicUrl(currentUrl);
|
|
5098
5098
|
} catch (error) {
|
|
5099
|
-
if (error instanceof UrlError) logger.
|
|
5099
|
+
if (error instanceof UrlError) if (error.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
5100
|
+
url: currentUrl,
|
|
5101
|
+
error
|
|
5102
|
+
});
|
|
5103
|
+
else logger.error("Disallowed private URL: {url}", {
|
|
5100
5104
|
url: currentUrl,
|
|
5101
5105
|
error
|
|
5102
5106
|
});
|
package/dist/mod.js
CHANGED
|
@@ -4430,7 +4430,7 @@ const preloadedContexts = {
|
|
|
4430
4430
|
//#endregion
|
|
4431
4431
|
//#region deno.json
|
|
4432
4432
|
var name = "@fedify/vocab-runtime";
|
|
4433
|
-
var version = "2.0.29-dev.
|
|
4433
|
+
var version = "2.0.29-dev.2046+5211d803";
|
|
4434
4434
|
//#endregion
|
|
4435
4435
|
//#region src/request.ts
|
|
4436
4436
|
/**
|
|
@@ -5091,7 +5091,11 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
5091
5091
|
if (!allowPrivateAddress) try {
|
|
5092
5092
|
await validatePublicUrl(currentUrl);
|
|
5093
5093
|
} catch (error) {
|
|
5094
|
-
if (error instanceof UrlError) logger.
|
|
5094
|
+
if (error instanceof UrlError) if (error.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
5095
|
+
url: currentUrl,
|
|
5096
|
+
error
|
|
5097
|
+
});
|
|
5098
|
+
else logger.error("Disallowed private URL: {url}", {
|
|
5095
5099
|
url: currentUrl,
|
|
5096
5100
|
error
|
|
5097
5101
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
2
|
+
const require_request = require("./request-B8Dv92jS.cjs");
|
|
3
3
|
let _logtape_logtape = require("@logtape/logtape");
|
|
4
4
|
//#region src/body.ts
|
|
5
5
|
/** Decoded JSON body limit: 16 MiB. @internal */
|
package/dist/tests/body.test.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_body = require("./body-
|
|
2
|
+
const require_body = require("./body-GbL4FSd6.cjs");
|
|
3
3
|
let node_assert_strict = require("node:assert/strict");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
let node_zlib = require("node:zlib");
|
package/dist/tests/body.test.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as readBoundedText, t as BodyTooLargeError } from "./body-
|
|
1
|
+
import { r as readBoundedText, t as BodyTooLargeError } from "./body-CtVeJKAb.mjs";
|
|
2
2
|
import { deepStrictEqual, ok, rejects } from "node:assert/strict";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
import { gunzipSync, gzipSync } from "node:zlib";
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
3
|
-
const require_body = require("./body-
|
|
2
|
+
const require_request = require("./request-B8Dv92jS.cjs");
|
|
3
|
+
const require_body = require("./body-GbL4FSd6.cjs");
|
|
4
4
|
const require_link = require("./link-FguCydMA.cjs");
|
|
5
5
|
const require_url = require("./url-Qk1svKZU.cjs");
|
|
6
6
|
let node_test = require("node:test");
|
|
7
7
|
let node_zlib = require("node:zlib");
|
|
8
8
|
let _logtape_logtape = require("@logtape/logtape");
|
|
9
9
|
let node_assert = require("node:assert");
|
|
10
|
+
let node_dns_promises = require("node:dns/promises");
|
|
11
|
+
node_dns_promises = require_chunk.__toESM(node_dns_promises);
|
|
10
12
|
let node_http = require("node:http");
|
|
11
13
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
12
14
|
//#region ../../node_modules/.pnpm/glob-to-regexp@0.4.1/node_modules/glob-to-regexp/index.js
|
|
@@ -5758,7 +5760,11 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
5758
5760
|
if (!allowPrivateAddress) try {
|
|
5759
5761
|
await require_url.validatePublicUrl(currentUrl);
|
|
5760
5762
|
} catch (error) {
|
|
5761
|
-
if (error instanceof require_url.UrlError) logger.
|
|
5763
|
+
if (error instanceof require_url.UrlError) if (error.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
5764
|
+
url: currentUrl,
|
|
5765
|
+
error
|
|
5766
|
+
});
|
|
5767
|
+
else logger.error("Disallowed private URL: {url}", {
|
|
5762
5768
|
url: currentUrl,
|
|
5763
5769
|
error
|
|
5764
5770
|
});
|
|
@@ -6244,4 +6250,62 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
6244
6250
|
(0, node_assert.deepStrictEqual)(canceled, true);
|
|
6245
6251
|
(0, node_assert.deepStrictEqual)(pulls, 257);
|
|
6246
6252
|
});
|
|
6253
|
+
(0, node_test.test)("getDocumentLoader() logs DNS failures as such", async (t) => {
|
|
6254
|
+
if ("Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted") {
|
|
6255
|
+
t.skip("requires the net permission");
|
|
6256
|
+
return;
|
|
6257
|
+
}
|
|
6258
|
+
const loader = getDocumentLoader();
|
|
6259
|
+
for (const result of [
|
|
6260
|
+
"throws",
|
|
6261
|
+
"empty",
|
|
6262
|
+
"private"
|
|
6263
|
+
]) await t.test(result, async () => {
|
|
6264
|
+
const originalLookup = node_dns_promises.default.lookup;
|
|
6265
|
+
node_dns_promises.default.lookup = (() => result === "throws" ? Promise.reject(/* @__PURE__ */ new Error("Resolver unavailable")) : Promise.resolve(result === "empty" ? [] : [{
|
|
6266
|
+
address: "127.0.0.1",
|
|
6267
|
+
family: 4
|
|
6268
|
+
}]));
|
|
6269
|
+
const records = [];
|
|
6270
|
+
await (0, _logtape_logtape.configure)({
|
|
6271
|
+
sinks: { buffer: (record) => records.push(record) },
|
|
6272
|
+
loggers: [{
|
|
6273
|
+
category: "fedify",
|
|
6274
|
+
sinks: ["buffer"],
|
|
6275
|
+
lowestLevel: "debug"
|
|
6276
|
+
}, {
|
|
6277
|
+
category: ["logtape", "meta"],
|
|
6278
|
+
sinks: []
|
|
6279
|
+
}],
|
|
6280
|
+
reset: true
|
|
6281
|
+
});
|
|
6282
|
+
try {
|
|
6283
|
+
const url = "https://dns-failure.invalid/object";
|
|
6284
|
+
let error;
|
|
6285
|
+
await (0, node_assert.rejects)(() => loader(url), (e) => {
|
|
6286
|
+
error = e;
|
|
6287
|
+
return true;
|
|
6288
|
+
});
|
|
6289
|
+
(0, node_assert.ok)(error instanceof require_url.UrlError);
|
|
6290
|
+
(0, node_assert.deepStrictEqual)(error.reason, result === "private" ? "disallowed" : "dns");
|
|
6291
|
+
(0, node_assert.deepStrictEqual)(records.map((r) => [
|
|
6292
|
+
r.level,
|
|
6293
|
+
r.rawMessage,
|
|
6294
|
+
r.properties.url
|
|
6295
|
+
]), [result === "private" ? [
|
|
6296
|
+
"error",
|
|
6297
|
+
"Disallowed private URL: {url}",
|
|
6298
|
+
url
|
|
6299
|
+
] : [
|
|
6300
|
+
"debug",
|
|
6301
|
+
"DNS lookup failed for {url}",
|
|
6302
|
+
url
|
|
6303
|
+
]]);
|
|
6304
|
+
(0, node_assert.ok)(records[0].properties.error === error);
|
|
6305
|
+
} finally {
|
|
6306
|
+
await (0, _logtape_logtape.reset)();
|
|
6307
|
+
node_dns_promises.default.lookup = originalLookup;
|
|
6308
|
+
}
|
|
6309
|
+
});
|
|
6310
|
+
});
|
|
6247
6311
|
//#endregion
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { a as name, i as logRequest, n as createActivityPubRequest, o as version, t as FetchError } from "./request-
|
|
2
|
-
import { n as MAX_BODY_SIZE, r as readBoundedText } from "./body-
|
|
1
|
+
import { a as name, i as logRequest, n as createActivityPubRequest, o as version, t as FetchError } from "./request-3-6XVYbp.mjs";
|
|
2
|
+
import { n as MAX_BODY_SIZE, r as readBoundedText } from "./body-CtVeJKAb.mjs";
|
|
3
3
|
import { t as HttpHeaderLink } from "./link-NUUWCdnK.mjs";
|
|
4
4
|
import { o as validatePublicUrl, t as UrlError } from "./url-DzlMS01z.mjs";
|
|
5
5
|
import { test } from "node:test";
|
|
6
6
|
import { gzipSync } from "node:zlib";
|
|
7
|
-
import { getLogger } from "@logtape/logtape";
|
|
7
|
+
import { configure, getLogger, reset } from "@logtape/logtape";
|
|
8
8
|
import { deepStrictEqual, ok, rejects } from "node:assert";
|
|
9
|
+
import dns from "node:dns/promises";
|
|
9
10
|
import { createServer } from "node:http";
|
|
10
11
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
11
12
|
//#region \0rolldown/runtime.js
|
|
@@ -5777,7 +5778,11 @@ function getDocumentLoader({ allowPrivateAddress, skipPreloadedContexts, userAge
|
|
|
5777
5778
|
if (!allowPrivateAddress) try {
|
|
5778
5779
|
await validatePublicUrl(currentUrl);
|
|
5779
5780
|
} catch (error) {
|
|
5780
|
-
if (error instanceof UrlError) logger.
|
|
5781
|
+
if (error instanceof UrlError) if (error.reason === "dns") logger.debug("DNS lookup failed for {url}", {
|
|
5782
|
+
url: currentUrl,
|
|
5783
|
+
error
|
|
5784
|
+
});
|
|
5785
|
+
else logger.error("Disallowed private URL: {url}", {
|
|
5781
5786
|
url: currentUrl,
|
|
5782
5787
|
error
|
|
5783
5788
|
});
|
|
@@ -6263,5 +6268,63 @@ test("getRemoteDocument() bounds JSON by default", async () => {
|
|
|
6263
6268
|
deepStrictEqual(canceled, true);
|
|
6264
6269
|
deepStrictEqual(pulls, 257);
|
|
6265
6270
|
});
|
|
6271
|
+
test("getDocumentLoader() logs DNS failures as such", async (t) => {
|
|
6272
|
+
if ("Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted") {
|
|
6273
|
+
t.skip("requires the net permission");
|
|
6274
|
+
return;
|
|
6275
|
+
}
|
|
6276
|
+
const loader = getDocumentLoader();
|
|
6277
|
+
for (const result of [
|
|
6278
|
+
"throws",
|
|
6279
|
+
"empty",
|
|
6280
|
+
"private"
|
|
6281
|
+
]) await t.test(result, async () => {
|
|
6282
|
+
const originalLookup = dns.lookup;
|
|
6283
|
+
dns.lookup = (() => result === "throws" ? Promise.reject(/* @__PURE__ */ new Error("Resolver unavailable")) : Promise.resolve(result === "empty" ? [] : [{
|
|
6284
|
+
address: "127.0.0.1",
|
|
6285
|
+
family: 4
|
|
6286
|
+
}]));
|
|
6287
|
+
const records = [];
|
|
6288
|
+
await configure({
|
|
6289
|
+
sinks: { buffer: (record) => records.push(record) },
|
|
6290
|
+
loggers: [{
|
|
6291
|
+
category: "fedify",
|
|
6292
|
+
sinks: ["buffer"],
|
|
6293
|
+
lowestLevel: "debug"
|
|
6294
|
+
}, {
|
|
6295
|
+
category: ["logtape", "meta"],
|
|
6296
|
+
sinks: []
|
|
6297
|
+
}],
|
|
6298
|
+
reset: true
|
|
6299
|
+
});
|
|
6300
|
+
try {
|
|
6301
|
+
const url = "https://dns-failure.invalid/object";
|
|
6302
|
+
let error;
|
|
6303
|
+
await rejects(() => loader(url), (e) => {
|
|
6304
|
+
error = e;
|
|
6305
|
+
return true;
|
|
6306
|
+
});
|
|
6307
|
+
ok(error instanceof UrlError);
|
|
6308
|
+
deepStrictEqual(error.reason, result === "private" ? "disallowed" : "dns");
|
|
6309
|
+
deepStrictEqual(records.map((r) => [
|
|
6310
|
+
r.level,
|
|
6311
|
+
r.rawMessage,
|
|
6312
|
+
r.properties.url
|
|
6313
|
+
]), [result === "private" ? [
|
|
6314
|
+
"error",
|
|
6315
|
+
"Disallowed private URL: {url}",
|
|
6316
|
+
url
|
|
6317
|
+
] : [
|
|
6318
|
+
"debug",
|
|
6319
|
+
"DNS lookup failed for {url}",
|
|
6320
|
+
url
|
|
6321
|
+
]]);
|
|
6322
|
+
ok(records[0].properties.error === error);
|
|
6323
|
+
} finally {
|
|
6324
|
+
await reset();
|
|
6325
|
+
dns.lookup = originalLookup;
|
|
6326
|
+
}
|
|
6327
|
+
});
|
|
6328
|
+
});
|
|
6266
6329
|
//#endregion
|
|
6267
6330
|
export {};
|
|
@@ -3,7 +3,7 @@ let node_process = require("node:process");
|
|
|
3
3
|
node_process = require_chunk.__toESM(node_process);
|
|
4
4
|
//#region deno.json
|
|
5
5
|
var name = "@fedify/vocab-runtime";
|
|
6
|
-
var version = "2.0.29-dev.
|
|
6
|
+
var version = "2.0.29-dev.2046+5211d803";
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/request.ts
|
|
9
9
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_request = require("./request-
|
|
2
|
+
const require_request = require("./request-B8Dv92jS.cjs");
|
|
3
3
|
let node_test = require("node:test");
|
|
4
4
|
let node_process = require("node:process");
|
|
5
5
|
node_process = require_chunk.__toESM(node_process);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as version, r as getUserAgent } from "./request-
|
|
1
|
+
import { o as version, r as getUserAgent } from "./request-3-6XVYbp.mjs";
|
|
2
2
|
import { test } from "node:test";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { deepStrictEqual } from "node:assert";
|
package/package.json
CHANGED
package/src/docloader.test.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { configure, type LogRecord, reset } from "@logtape/logtape";
|
|
1
2
|
import fetchMock from "fetch-mock";
|
|
2
3
|
import { deepStrictEqual, ok, rejects } from "node:assert";
|
|
4
|
+
import dns from "node:dns/promises";
|
|
3
5
|
import { test } from "node:test";
|
|
4
6
|
import { createServer } from "node:http";
|
|
5
7
|
import { gzipSync } from "node:zlib";
|
|
@@ -622,3 +624,66 @@ test("getRemoteDocument() bounds JSON by default", async () => {
|
|
|
622
624
|
deepStrictEqual(canceled, true);
|
|
623
625
|
deepStrictEqual(pulls, 257);
|
|
624
626
|
});
|
|
627
|
+
|
|
628
|
+
test("getDocumentLoader() logs DNS failures as such", async (t) => {
|
|
629
|
+
// The validator skips DNS when Deno has no network permission. Checked
|
|
630
|
+
// here rather than with top-level await, which the CommonJS build rejects.
|
|
631
|
+
if (
|
|
632
|
+
"Deno" in globalThis &&
|
|
633
|
+
(await Deno.permissions.query({ name: "net" })).state !== "granted"
|
|
634
|
+
) {
|
|
635
|
+
t.skip("requires the net permission");
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
const loader = getDocumentLoader();
|
|
639
|
+
for (const result of ["throws", "empty", "private"] as const) {
|
|
640
|
+
await t.test(result, async () => {
|
|
641
|
+
// Stubbing works only because url.ts uses the default node:dns/promises
|
|
642
|
+
// import; see the FIXME there.
|
|
643
|
+
const originalLookup = dns.lookup;
|
|
644
|
+
dns.lookup = (() =>
|
|
645
|
+
result === "throws"
|
|
646
|
+
? Promise.reject(new Error("Resolver unavailable"))
|
|
647
|
+
: Promise.resolve(
|
|
648
|
+
result === "empty" ? [] : [{ address: "127.0.0.1", family: 4 }],
|
|
649
|
+
)) as typeof dns.lookup;
|
|
650
|
+
const records: LogRecord[] = [];
|
|
651
|
+
await configure({
|
|
652
|
+
sinks: {
|
|
653
|
+
buffer: (record) =>
|
|
654
|
+
records.push(record),
|
|
655
|
+
},
|
|
656
|
+
loggers: [
|
|
657
|
+
{ category: "fedify", sinks: ["buffer"], lowestLevel: "debug" },
|
|
658
|
+
{ category: ["logtape", "meta"], sinks: [] },
|
|
659
|
+
],
|
|
660
|
+
reset: true,
|
|
661
|
+
});
|
|
662
|
+
try {
|
|
663
|
+
const url = "https://dns-failure.invalid/object";
|
|
664
|
+
let error: unknown;
|
|
665
|
+
await rejects(() => loader(url), (e) => {
|
|
666
|
+
error = e;
|
|
667
|
+
return true;
|
|
668
|
+
});
|
|
669
|
+
ok(error instanceof UrlError);
|
|
670
|
+
deepStrictEqual(
|
|
671
|
+
error.reason,
|
|
672
|
+
result === "private" ? "disallowed" : "dns",
|
|
673
|
+
);
|
|
674
|
+
deepStrictEqual(
|
|
675
|
+
records.map((r) => [r.level, r.rawMessage, r.properties.url]),
|
|
676
|
+
[
|
|
677
|
+
result === "private"
|
|
678
|
+
? ["error", "Disallowed private URL: {url}", url]
|
|
679
|
+
: ["debug", "DNS lookup failed for {url}", url],
|
|
680
|
+
],
|
|
681
|
+
);
|
|
682
|
+
ok(records[0].properties.error === error);
|
|
683
|
+
} finally {
|
|
684
|
+
await reset();
|
|
685
|
+
dns.lookup = originalLookup;
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
});
|
package/src/docloader.ts
CHANGED
|
@@ -311,10 +311,17 @@ export function getDocumentLoader(
|
|
|
311
311
|
await validatePublicUrl(currentUrl);
|
|
312
312
|
} catch (error) {
|
|
313
313
|
if (error instanceof UrlError) {
|
|
314
|
-
|
|
315
|
-
url
|
|
316
|
-
|
|
317
|
-
|
|
314
|
+
if (error.reason === "dns") {
|
|
315
|
+
logger.debug("DNS lookup failed for {url}", {
|
|
316
|
+
url: currentUrl,
|
|
317
|
+
error,
|
|
318
|
+
});
|
|
319
|
+
} else {
|
|
320
|
+
logger.error("Disallowed private URL: {url}", {
|
|
321
|
+
url: currentUrl,
|
|
322
|
+
error,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
318
325
|
}
|
|
319
326
|
throw error;
|
|
320
327
|
}
|