@fedify/vocab-runtime 2.0.29-dev.2020 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/vocab-runtime",
3
- "version": "2.0.29-dev.2020+b789935e",
3
+ "version": "2.0.29-dev.2046+5211d803",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": "./src/mod.ts",
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.2020+b789935e";
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.error("Disallowed private URL: {url}", {
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.2020+b789935e";
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.error("Disallowed private URL: {url}", {
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,4 +1,4 @@
1
- import { t as FetchError } from "./request-CDO-jqNj.mjs";
1
+ import { t as FetchError } from "./request-3-6XVYbp.mjs";
2
2
  import { getLogger } from "@logtape/logtape";
3
3
  //#region src/body.ts
4
4
  /** Decoded JSON body limit: 16 MiB. @internal */
@@ -1,5 +1,5 @@
1
1
  require("./chunk-Do9eywBl.cjs");
2
- const require_request = require("./request-BGn7Xf1v.cjs");
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 */
@@ -1,5 +1,5 @@
1
1
  require("./chunk-Do9eywBl.cjs");
2
- const require_body = require("./body-DlOEQngJ.cjs");
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");
@@ -1,4 +1,4 @@
1
- import { r as readBoundedText, t as BodyTooLargeError } from "./body-BXnCq6ed.mjs";
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-BGn7Xf1v.cjs");
3
- const require_body = require("./body-DlOEQngJ.cjs");
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.error("Disallowed private URL: {url}", {
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-CDO-jqNj.mjs";
2
- import { n as MAX_BODY_SIZE, r as readBoundedText } from "./body-BXnCq6ed.mjs";
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.error("Disallowed private URL: {url}", {
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 {};
@@ -1,7 +1,7 @@
1
1
  import process from "node:process";
2
2
  //#region deno.json
3
3
  var name = "@fedify/vocab-runtime";
4
- var version = "2.0.29-dev.2020+b789935e";
4
+ var version = "2.0.29-dev.2046+5211d803";
5
5
  //#endregion
6
6
  //#region src/request.ts
7
7
  /**
@@ -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.2020+b789935e";
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-BGn7Xf1v.cjs");
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-CDO-jqNj.mjs";
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/vocab-runtime",
3
- "version": "2.0.29-dev.2020+b789935e",
3
+ "version": "2.0.29-dev.2046+5211d803",
4
4
  "homepage": "https://fedify.dev/",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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
- logger.error("Disallowed private URL: {url}", {
315
- url: currentUrl,
316
- error,
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
  }