@fedify/fedify 2.0.28 → 2.0.29-dev.2018

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.
Files changed (47) hide show
  1. package/dist/{builder-DrLogDNE.mjs → builder-BuaUyZ_b.mjs} +3 -3
  2. package/dist/compat/transformers.test.mjs +1 -1
  3. package/dist/{deno-BwjczLpP.mjs → deno-Df5hkFDc.mjs} +1 -1
  4. package/dist/{docloader-BKABwzJs.mjs → docloader--fos8R46.mjs} +2 -2
  5. package/dist/federation/builder.test.mjs +1 -1
  6. package/dist/federation/handler.test.mjs +6 -6
  7. package/dist/federation/idempotency.test.mjs +2 -2
  8. package/dist/federation/inbox.test.mjs +1 -1
  9. package/dist/federation/middleware.test.mjs +109 -7
  10. package/dist/federation/mod.cjs +1 -1
  11. package/dist/federation/mod.js +1 -1
  12. package/dist/federation/send.test.mjs +67 -4
  13. package/dist/federation/temporal.test.mjs +1 -1
  14. package/dist/federation/webfinger.test.mjs +1 -1
  15. package/dist/{http-CWG2X7S-.mjs → http-B9hsKL5c.mjs} +2 -2
  16. package/dist/{http-Bl2-swIy.js → http-BlF50Pnk.js} +1 -1
  17. package/dist/{http-nKwQ0FzA.cjs → http-CZoWzbyo.cjs} +1 -1
  18. package/dist/{inbox-D39xUdAp.mjs → inbox-9rS0RF7h.mjs} +1 -1
  19. package/dist/{key-GYVCBSzo.mjs → key-Fdd87o5A.mjs} +1 -1
  20. package/dist/{kv-cache-COqju2MA.cjs → kv-cache-CPPsJBQ2.cjs} +1 -1
  21. package/dist/{kv-cache-Dwdnp4S8.js → kv-cache-DvPFEKZc.js} +1 -1
  22. package/dist/{ld-CsYiVIbF.mjs → ld-BiPcGm1a.mjs} +2 -2
  23. package/dist/{middleware-BDkg4n5s.js → middleware-CRAGY-eN.js} +13 -4
  24. package/dist/{middleware-B7rpKC37.mjs → middleware-DH1N7ObB.mjs} +1 -1
  25. package/dist/{middleware-D5I4RTqd.mjs → middleware-DThr9ixN.mjs} +11 -11
  26. package/dist/{middleware-DnPJ5AqT.cjs → middleware-Dj1nbg0k.cjs} +1 -1
  27. package/dist/{middleware-12JY8Jki.cjs → middleware-fcey9YBb.cjs} +13 -4
  28. package/dist/mod.cjs +4 -4
  29. package/dist/mod.js +4 -4
  30. package/dist/nodeinfo/handler.test.mjs +1 -1
  31. package/dist/{owner-xshWf7Pw.mjs → owner-CAqQdSYS.mjs} +2 -2
  32. package/dist/{proof-yKZAPs7k.mjs → proof-BIHmqC-i.mjs} +2 -2
  33. package/dist/{proof-DL58LftU.cjs → proof-g4fypb9-.cjs} +1 -1
  34. package/dist/{proof-D-B0IDLS.js → proof-tkdmUQSp.js} +1 -1
  35. package/dist/{send-BRIl5BFM.mjs → send-SOe_3aLg.mjs} +12 -3
  36. package/dist/sig/http.test.mjs +2 -2
  37. package/dist/sig/key.test.mjs +1 -1
  38. package/dist/sig/ld.test.mjs +2 -2
  39. package/dist/sig/mod.cjs +2 -2
  40. package/dist/sig/mod.js +2 -2
  41. package/dist/sig/owner.test.mjs +1 -1
  42. package/dist/sig/proof.test.mjs +1 -1
  43. package/dist/{temporal-BG59xtYa.mjs → temporal-Xw4eVeOf.mjs} +1 -1
  44. package/dist/utils/docloader.test.mjs +2 -2
  45. package/dist/utils/mod.cjs +1 -1
  46. package/dist/utils/mod.js +1 -1
  47. package/package.json +6 -6
@@ -2,8 +2,8 @@ import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError, t as Router } from "./router-CrMLXoOr.mjs";
5
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
6
- import { t as InboxListenerSet } from "./inbox-D39xUdAp.mjs";
5
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
6
+ import { t as InboxListenerSet } from "./inbox-9rS0RF7h.mjs";
7
7
  import { getTypeId } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
9
9
  import { getLogger } from "@logtape/logtape";
@@ -42,7 +42,7 @@ var FederationBuilderImpl = class {
42
42
  this.collectionTypeIds = {};
43
43
  }
44
44
  async build(options) {
45
- const { FederationImpl } = await import("./middleware-B7rpKC37.mjs");
45
+ const { FederationImpl } = await import("./middleware-DH1N7ObB.mjs");
46
46
  const f = new FederationImpl(options);
47
47
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
48
48
  f.router = this.router.clone();
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
6
6
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
7
- import { _ as autoIdAssigner, g as actorDehydrator, n as FederationImpl } from "../middleware-D5I4RTqd.mjs";
7
+ import { _ as autoIdAssigner, g as actorDehydrator, n as FederationImpl } from "../middleware-DThr9ixN.mjs";
8
8
  import { test } from "@fedify/fixture";
9
9
  import { Follow, Person } from "@fedify/vocab";
10
10
  //#region src/compat/transformers.test.ts
@@ -3,6 +3,6 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  //#region deno.json
5
5
  var name = "@fedify/fedify";
6
- var version = "2.0.28";
6
+ var version = "2.0.29-dev.2018+2e67253f";
7
7
  //#endregion
8
8
  export { version as n, name as t };
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { o as validateCryptoKey } from "./key-GYVCBSzo.mjs";
5
- import { n as doubleKnock } from "./http-CWG2X7S-.mjs";
4
+ import { o as validateCryptoKey } from "./key-Fdd87o5A.mjs";
5
+ import { n as doubleKnock } from "./http-B9hsKL5c.mjs";
6
6
  import { curry } from "es-toolkit";
7
7
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, validatePublicUrl } from "@fedify/vocab-runtime";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -5,7 +5,7 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { a as assertExists } from "../std__assert-Duiq_YC9.mjs";
6
6
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { n as createFederationBuilder } from "../builder-DrLogDNE.mjs";
8
+ import { n as createFederationBuilder } from "../builder-BuaUyZ_b.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  import { Activity, Note, Person } from "@fedify/vocab";
11
11
  //#region src/federation/builder.test.ts
@@ -6,14 +6,14 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-Duiq_YC9.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
- import { i as generateCryptoKeyPair } from "../key-GYVCBSzo.mjs";
10
- import { s as signRequest } from "../http-CWG2X7S-.mjs";
9
+ import { i as generateCryptoKeyPair } from "../key-Fdd87o5A.mjs";
10
+ import { s as signRequest } from "../http-B9hsKL5c.mjs";
11
11
  import { a as rsaPrivateKey3, c as rsaPublicKey3, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
12
- import { a as compactJsonLd, f as signJsonLd } from "../ld-CsYiVIbF.mjs";
13
- import { n as signObject } from "../proof-yKZAPs7k.mjs";
12
+ import { a as compactJsonLd, f as signJsonLd } from "../ld-BiPcGm1a.mjs";
13
+ import { n as signObject } from "../proof-BIHmqC-i.mjs";
14
14
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
15
- import { a as createFederation, c as handleCollection, d as handleObject, f as respondWithObject, l as handleCustomCollection, p as respondWithObjectIfAcceptable, s as handleActor, u as handleInbox } from "../middleware-D5I4RTqd.mjs";
16
- import { t as InboxListenerSet } from "../inbox-D39xUdAp.mjs";
15
+ import { a as createFederation, c as handleCollection, d as handleObject, f as respondWithObject, l as handleCustomCollection, p as respondWithObjectIfAcceptable, s as handleActor, u as handleInbox } from "../middleware-DThr9ixN.mjs";
16
+ import { t as InboxListenerSet } from "../inbox-9rS0RF7h.mjs";
17
17
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
18
18
  import { Create, CryptographicKey, Multikey, Note, Person } from "@fedify/vocab";
19
19
  //#region src/federation/handler.test.ts
@@ -4,9 +4,9 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import "../std__assert-Duiq_YC9.mjs";
6
6
  import { n as ed25519PrivateKey, r as ed25519PublicKey, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
7
- import { n as signObject } from "../proof-yKZAPs7k.mjs";
7
+ import { n as signObject } from "../proof-BIHmqC-i.mjs";
8
8
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
9
- import { a as createFederation } from "../middleware-D5I4RTqd.mjs";
9
+ import { a as createFederation } from "../middleware-DThr9ixN.mjs";
10
10
  import { mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, Follow, Person } from "@fedify/vocab";
12
12
  //#region src/federation/idempotency.test.ts
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
6
- import { t as InboxListenerSet } from "../inbox-D39xUdAp.mjs";
6
+ import { t as InboxListenerSet } from "../inbox-9rS0RF7h.mjs";
7
7
  import { test } from "@fedify/fixture";
8
8
  import { Activity, Create, Invite, Offer, Update } from "@fedify/vocab";
9
9
  //#region src/federation/inbox.test.ts
@@ -9,18 +9,19 @@ import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z
9
9
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
10
10
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
11
11
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
12
- import { l as verifyRequest, s as signRequest } from "../http-CWG2X7S-.mjs";
12
+ import { l as verifyRequest, s as signRequest } from "../http-B9hsKL5c.mjs";
13
13
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
14
- import { t as getAuthenticatedDocumentLoader } from "../docloader-BKABwzJs.mjs";
15
- import { a as compactJsonLd, f as signJsonLd, m as verifyJsonLd, s as detachSignature } from "../ld-CsYiVIbF.mjs";
16
- import { t as doesActorOwnKey } from "../owner-xshWf7Pw.mjs";
17
- import { n as signObject, r as verifyObject } from "../proof-yKZAPs7k.mjs";
14
+ import { t as getAuthenticatedDocumentLoader } from "../docloader--fos8R46.mjs";
15
+ import { a as compactJsonLd, f as signJsonLd, m as verifyJsonLd, s as detachSignature } from "../ld-BiPcGm1a.mjs";
16
+ import { t as doesActorOwnKey } from "../owner-CAqQdSYS.mjs";
17
+ import { n as signObject, r as verifyObject } from "../proof-BIHmqC-i.mjs";
18
18
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
19
- import { a as createFederation, i as KvSpecDeterminer, n as FederationImpl, r as InboxContextImpl, t as ContextImpl } from "../middleware-D5I4RTqd.mjs";
19
+ import { a as createFederation, i as KvSpecDeterminer, n as FederationImpl, r as InboxContextImpl, t as ContextImpl } from "../middleware-DThr9ixN.mjs";
20
20
  import { mockDocumentLoader, test } from "@fedify/fixture";
21
21
  import * as vocab from "@fedify/vocab";
22
22
  import { Create, Offer, Person, getTypeId, lookupObject } from "@fedify/vocab";
23
- import { UrlError, getDocumentLoader } from "@fedify/vocab-runtime";
23
+ import { FetchError, UrlError, getDocumentLoader } from "@fedify/vocab-runtime";
24
+ import dns from "node:dns/promises";
24
25
  //#region ../fixture/src/fixtures/example.com/create.json
25
26
  var id$2 = "https://example.com/create";
26
27
  var create_default = {
@@ -1226,6 +1227,7 @@ test("FederationImpl.processQueuedTask()", async (t) => {
1226
1227
  const kv = new MemoryKvStore();
1227
1228
  const queuedMessages = [];
1228
1229
  const federation = new FederationImpl({
1230
+ allowPrivateAddress: true,
1229
1231
  kv,
1230
1232
  queue: {
1231
1233
  nativeRetrial: true,
@@ -1288,6 +1290,7 @@ test("FederationImpl.processQueuedTask()", async (t) => {
1288
1290
  const kv = new MemoryKvStore();
1289
1291
  let queuedMessages = [];
1290
1292
  const federation = new FederationImpl({
1293
+ allowPrivateAddress: true,
1291
1294
  kv,
1292
1295
  queue: {
1293
1296
  enqueue(message, _options) {
@@ -2782,6 +2785,105 @@ test("FederationImpl.processQueuedTask()", async (t) => {
2782
2785
  assertEquals(queuedMessages, []);
2783
2786
  });
2784
2787
  });
2788
+ test({
2789
+ name: "FederationImpl.processQueuedTask() retries DNS failures",
2790
+ ignore: "Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted",
2791
+ async fn(t) {
2792
+ for (const redirected of [false, true]) await t.step(`redirected: ${redirected}`, async () => {
2793
+ const destination = "https://delivery.invalid/inbox";
2794
+ const publicInbox = "https://8.8.8.8/inbox";
2795
+ const queuedMessages = [];
2796
+ const delays = [];
2797
+ const errors = [];
2798
+ const activities = [];
2799
+ const attempts = [];
2800
+ const delay = Temporal.Duration.from({ seconds: 5 });
2801
+ const federation = new FederationImpl({
2802
+ kv: new MemoryKvStore(),
2803
+ queue: {
2804
+ enqueue(message, options) {
2805
+ queuedMessages.push(message);
2806
+ delays.push(options?.delay);
2807
+ return Promise.resolve();
2808
+ },
2809
+ listen() {
2810
+ return Promise.resolve();
2811
+ }
2812
+ },
2813
+ documentLoaderFactory: () => mockDocumentLoader,
2814
+ contextLoaderFactory: () => mockDocumentLoader,
2815
+ onOutboxError(error, activity) {
2816
+ errors.push(error);
2817
+ activities.push(activity);
2818
+ },
2819
+ outboxRetryPolicy(options) {
2820
+ attempts.push(options.attempts);
2821
+ return delay;
2822
+ }
2823
+ });
2824
+ const message = {
2825
+ type: "outbox",
2826
+ id: crypto.randomUUID(),
2827
+ baseUrl: "https://example.com",
2828
+ keys: [],
2829
+ activity: {
2830
+ "@context": "https://www.w3.org/ns/activitystreams",
2831
+ type: "Create",
2832
+ id: "https://example.com/activities/dns-failure",
2833
+ actor: "https://example.com/users/alice",
2834
+ object: {
2835
+ type: "Note",
2836
+ content: "test"
2837
+ }
2838
+ },
2839
+ activityType: "https://www.w3.org/ns/activitystreams#Create",
2840
+ inbox: redirected ? publicInbox : destination,
2841
+ sharedInbox: false,
2842
+ started: (/* @__PURE__ */ new Date()).toISOString(),
2843
+ attempt: 0,
2844
+ headers: {},
2845
+ traceContext: {}
2846
+ };
2847
+ const originalLookup = dns.lookup;
2848
+ const resolverError = /* @__PURE__ */ new Error("Resolver unavailable");
2849
+ const lookups = [];
2850
+ dns.lookup = ((hostname) => {
2851
+ lookups.push(hostname);
2852
+ return Promise.reject(resolverError);
2853
+ });
2854
+ try {
2855
+ esm_default.mockGlobal().catch(202);
2856
+ if (redirected) esm_default.route(publicInbox, {
2857
+ status: 307,
2858
+ headers: { Location: destination }
2859
+ });
2860
+ await federation.processQueuedTask(void 0, message);
2861
+ assertEquals(errors.length, 1);
2862
+ const error = errors[0];
2863
+ assertInstanceOf(error, FetchError);
2864
+ assertEquals(error.url.href, destination);
2865
+ assertInstanceOf(error.cause, UrlError);
2866
+ assertEquals(error.cause.reason, "dns");
2867
+ assertStrictEquals(error.cause.cause, resolverError);
2868
+ assertEquals(activities.length, 1);
2869
+ assertInstanceOf(activities[0], Create);
2870
+ assertEquals(activities[0].id?.href, "https://example.com/activities/dns-failure");
2871
+ assertEquals(attempts, [0]);
2872
+ assertEquals(queuedMessages, [{
2873
+ ...message,
2874
+ attempt: 1
2875
+ }]);
2876
+ assertEquals(delays, [delay]);
2877
+ assertEquals(lookups, ["delivery.invalid"]);
2878
+ assertEquals(esm_default.callHistory.calls(destination).length, 0);
2879
+ assertEquals(esm_default.callHistory.calls().length, redirected ? 1 : 0);
2880
+ } finally {
2881
+ dns.lookup = originalLookup;
2882
+ esm_default.hardReset();
2883
+ }
2884
+ });
2885
+ }
2886
+ });
2785
2887
  test("FederationImpl.processQueuedTask() permanent failure", async (t) => {
2786
2888
  esm_default.spyGlobal();
2787
2889
  esm_default.post("https://gone.example/inbox", {
@@ -2,7 +2,7 @@ const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("../chunk-DDcVe30Y.cjs");
5
- const require_middleware = require("../middleware-12JY8Jki.cjs");
5
+ const require_middleware = require("../middleware-fcey9YBb.cjs");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  //#region src/federation/kv.ts
8
8
  /**
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "../middleware-BDkg4n5s.js";
3
+ import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "../middleware-CRAGY-eN.js";
4
4
  import { isEqual } from "es-toolkit";
5
5
  //#region src/federation/kv.ts
6
6
  /**
@@ -7,13 +7,14 @@ import "../std__assert-Duiq_YC9.mjs";
7
7
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
10
- import { l as verifyRequest } from "../http-CWG2X7S-.mjs";
10
+ import { l as verifyRequest } from "../http-B9hsKL5c.mjs";
11
11
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
12
- import { t as doesActorOwnKey } from "../owner-xshWf7Pw.mjs";
13
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-BRIl5BFM.mjs";
12
+ import { t as doesActorOwnKey } from "../owner-CAqQdSYS.mjs";
13
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-SOe_3aLg.mjs";
14
14
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
15
15
  import { Activity, Application, Endpoints, Group, Person, Service } from "@fedify/vocab";
16
- import { UrlError } from "@fedify/vocab-runtime";
16
+ import { FetchError, UrlError } from "@fedify/vocab-runtime";
17
+ import dns from "node:dns/promises";
17
18
  //#region src/federation/send.test.ts
18
19
  test("extractInboxes()", () => {
19
20
  const recipients = [
@@ -547,5 +548,67 @@ for (const signed of [false, true]) {
547
548
  });
548
549
  });
549
550
  }
551
+ for (const signed of [false, true]) test({
552
+ name: `sendActivity() classifies DNS failures (signed: ${signed})`,
553
+ ignore: "Deno" in globalThis && (await Deno.permissions.query({ name: "net" })).state !== "granted",
554
+ async fn(t) {
555
+ const activity = {
556
+ type: "Create",
557
+ id: "https://example.com/activity"
558
+ };
559
+ const destination = "https://delivery.invalid/inbox";
560
+ const publicInbox = "https://8.8.8.8/inbox";
561
+ const keys = signed ? [{
562
+ privateKey: rsaPrivateKey2,
563
+ keyId: rsaPublicKey2.id
564
+ }] : [];
565
+ for (const result of [
566
+ "throws",
567
+ "empty",
568
+ "cname",
569
+ "private"
570
+ ]) for (const redirected of [false, true]) await t.step(`${result}, redirected: ${redirected}`, async () => {
571
+ const originalLookup = dns.lookup;
572
+ const resolverError = /* @__PURE__ */ new Error("Resolver unavailable");
573
+ const lookups = [];
574
+ dns.lookup = ((hostname, options) => {
575
+ lookups.push(hostname);
576
+ assertEquals(hostname, "delivery.invalid");
577
+ assertEquals(options, { all: true });
578
+ if (result === "throws") return Promise.reject(resolverError);
579
+ return Promise.resolve(result === "empty" ? [] : [{
580
+ address: result === "private" ? "127.0.0.1" : "alias.invalid.",
581
+ family: 4
582
+ }]);
583
+ });
584
+ try {
585
+ esm_default.mockGlobal().catch(202);
586
+ if (redirected) esm_default.route(publicInbox, {
587
+ status: 307,
588
+ headers: { Location: destination }
589
+ });
590
+ const send = () => sendActivity({
591
+ activity,
592
+ keys,
593
+ inbox: new URL(redirected ? publicInbox : destination)
594
+ });
595
+ if (result === "private") assertEquals((await assertRejects(send, UrlError)).reason, "disallowed");
596
+ else {
597
+ const error = await assertRejects(send, FetchError);
598
+ assertEquals(error.url.href, destination);
599
+ assertInstanceOf(error.cause, UrlError);
600
+ assertEquals(error.cause.reason, "dns");
601
+ assertEquals(error.cause.cause, result === "throws" ? resolverError : void 0);
602
+ }
603
+ assertEquals(lookups, ["delivery.invalid"]);
604
+ assertEquals(esm_default.callHistory.calls(destination).length, 0);
605
+ assertEquals(esm_default.callHistory.calls().length, redirected ? 1 : 0);
606
+ } finally {
607
+ dns.lookup = originalLookup;
608
+ esm_default.hardReset();
609
+ }
610
+ });
611
+ }
612
+ });
550
613
  //#endregion
551
614
  export {};
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import "../std__assert-Duiq_YC9.mjs";
5
5
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { t as assert } from "../assert-BhQd8QHP.mjs";
7
- import { t as hasMalformedKnownTemporalLiteral } from "../temporal-BG59xtYa.mjs";
7
+ import { t as hasMalformedKnownTemporalLiteral } from "../temporal-Xw4eVeOf.mjs";
8
8
  import { test } from "@fedify/fixture";
9
9
  //#region src/federation/temporal.test.ts
10
10
  test("hasMalformedKnownTemporalLiteral() detects expanded proof timestamps", async () => {
@@ -5,7 +5,7 @@ import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-Duiq_YC9.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { a as createFederation, o as handleWebFinger } from "../middleware-D5I4RTqd.mjs";
8
+ import { a as createFederation, o as handleWebFinger } from "../middleware-DThr9ixN.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  import { Image, Link, Person } from "@fedify/vocab";
11
11
  //#region src/federation/webfinger.test.ts
@@ -1,8 +1,8 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-GYVCBSzo.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-Fdd87o5A.mjs";
6
6
  import { CryptographicKey } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { FetchError } from "@fedify/vocab-runtime";
@@ -10,7 +10,7 @@ import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
10
10
  import { Item, decodeDict, encodeItem } from "structured-field-values";
11
11
  //#region deno.json
12
12
  var name = "@fedify/fedify";
13
- var version = "2.0.28";
13
+ var version = "2.0.29-dev.2018+2e67253f";
14
14
  //#endregion
15
15
  //#region src/sig/key.ts
16
16
  /**
@@ -11,7 +11,7 @@ let byte_encodings_base64 = require("byte-encodings/base64");
11
11
  let structured_field_values = require("structured-field-values");
12
12
  //#region deno.json
13
13
  var name = "@fedify/fedify";
14
- var version = "2.0.28";
14
+ var version = "2.0.29-dev.2018+2e67253f";
15
15
  //#endregion
16
16
  //#region src/sig/key.ts
17
17
  /**
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
5
  import { Activity, getTypeId } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
7
7
  import { getLogger } from "@logtape/logtape";
@@ -1,7 +1,7 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
5
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
7
7
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-nKwQ0FzA.cjs");
4
+ const require_http = require("./http-CZoWzbyo.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { l as validateCryptoKey, t as doubleKnock } from "./http-Bl2-swIy.js";
3
+ import { l as validateCryptoKey, t as doubleKnock } from "./http-BlF50Pnk.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { curry } from "es-toolkit";
6
6
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-GYVCBSzo.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-Fdd87o5A.mjs";
6
6
  import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -2,10 +2,10 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  import { t as __exportAll } from "./chunk-CRNNMoPX.js";
4
4
  import { r as getDefaultActivityTransformers } from "./transformers-BGMIq1cs.js";
5
- import { c as importJwk, d as name, f as version, i as exportJwk, l as validateCryptoKey, r as verifyRequest, t as doubleKnock } from "./http-Bl2-swIy.js";
5
+ import { c as importJwk, d as name, f as version, i as exportJwk, l as validateCryptoKey, r as verifyRequest, t as doubleKnock } from "./http-BlF50Pnk.js";
6
6
  import { a as MAX_BODY_SIZE, i as BodyTooLargeError, n as getNodeInfo, o as readBoundedText, t as nodeInfoToJson } from "./types-sXITXcWa.js";
7
- import { _ as signJsonLd, a as doesActorOwnKey, c as assertSafeJsonLd, f as detachSignature, g as isInvalidUrlTypeError, h as isClearlyMalformedContextReference, m as hasSignature, n as signObject, o as getKeyOwner, p as getNormalizationContextLoader, r as verifyObject, s as InvalidContextReferenceError, u as compactJsonLd, v as verifyCompactJsonLd, x as wrapContextLoaderForJsonLd } from "./proof-D-B0IDLS.js";
8
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-Dwdnp4S8.js";
7
+ import { _ as signJsonLd, a as doesActorOwnKey, c as assertSafeJsonLd, f as detachSignature, g as isInvalidUrlTypeError, h as isClearlyMalformedContextReference, m as hasSignature, n as signObject, o as getKeyOwner, p as getNormalizationContextLoader, r as verifyObject, s as InvalidContextReferenceError, u as compactJsonLd, v as verifyCompactJsonLd, x as wrapContextLoaderForJsonLd } from "./proof-tkdmUQSp.js";
8
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-DvPFEKZc.js";
9
9
  import { getLogger, withContext } from "@logtape/logtape";
10
10
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
11
11
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
@@ -13,7 +13,7 @@ import { cloneDeep } from "es-toolkit";
13
13
  import { Router } from "uri-template-router";
14
14
  import { parseTemplate } from "url-template";
15
15
  import { encodeHex } from "byte-encodings/hex";
16
- import { UrlError, getDocumentLoader, validatePublicUrl } from "@fedify/vocab-runtime";
16
+ import { FetchError, UrlError, getDocumentLoader, validatePublicUrl } from "@fedify/vocab-runtime";
17
17
  import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_HEADER, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_URL_FULL } from "@opentelemetry/semantic-conventions";
18
18
  import jsonld from "@fedify/vocab-runtime/jsonld";
19
19
  import { lookupWebFinger } from "@fedify/webfinger";
@@ -2275,6 +2275,15 @@ async function sendActivityInternal({ activity, activityId, keys, inbox, allowPr
2275
2275
  if (!allowPrivateAddress) try {
2276
2276
  await validatePublicUrl(url);
2277
2277
  } catch (error) {
2278
+ if (error instanceof UrlError && error.reason === "dns") {
2279
+ logger.error("DNS resolution failed for URL: {url}", {
2280
+ url,
2281
+ error
2282
+ });
2283
+ const failure = new FetchError(url, error.message);
2284
+ failure.cause = error;
2285
+ throw failure;
2286
+ }
2278
2287
  if (error instanceof UrlError) logger.error("Disallowed private URL: {url}", {
2279
2288
  url,
2280
2289
  error
@@ -1,5 +1,5 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as FederationImpl } from "./middleware-D5I4RTqd.mjs";
4
+ import { n as FederationImpl } from "./middleware-DThr9ixN.mjs";
5
5
  export { FederationImpl };
@@ -2,24 +2,24 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError } from "./router-CrMLXoOr.mjs";
5
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
6
- import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-GYVCBSzo.mjs";
7
- import { l as verifyRequest } from "./http-CWG2X7S-.mjs";
8
- import { t as getAuthenticatedDocumentLoader } from "./docloader-BKABwzJs.mjs";
5
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
6
+ import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-Fdd87o5A.mjs";
7
+ import { l as verifyRequest } from "./http-B9hsKL5c.mjs";
8
+ import { t as getAuthenticatedDocumentLoader } from "./docloader--fos8R46.mjs";
9
9
  import { n as kvCache } from "./kv-cache-BrjuJue8.mjs";
10
- import { a as compactJsonLd, c as getNormalizationContextLoader, d as isInvalidUrlTypeError, f as signJsonLd, g as wrapContextLoaderForJsonLd, l as hasSignature, p as verifyCompactJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as isClearlyMalformedContextReference } from "./ld-CsYiVIbF.mjs";
11
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-xshWf7Pw.mjs";
12
- import { n as signObject, r as verifyObject } from "./proof-yKZAPs7k.mjs";
10
+ import { a as compactJsonLd, c as getNormalizationContextLoader, d as isInvalidUrlTypeError, f as signJsonLd, g as wrapContextLoaderForJsonLd, l as hasSignature, p as verifyCompactJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as isClearlyMalformedContextReference } from "./ld-BiPcGm1a.mjs";
11
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-CAqQdSYS.mjs";
12
+ import { n as signObject, r as verifyObject } from "./proof-BIHmqC-i.mjs";
13
13
  import { d as readBoundedText, l as BodyTooLargeError, t as getNodeInfo, u as MAX_BODY_SIZE } from "./client-glFHmpn4.mjs";
14
14
  import { t as nodeInfoToJson } from "./types-MNlFfxjv.mjs";
15
- import { n as routeActivity } from "./inbox-D39xUdAp.mjs";
16
- import { t as FederationBuilderImpl } from "./builder-DrLogDNE.mjs";
15
+ import { n as routeActivity } from "./inbox-9rS0RF7h.mjs";
16
+ import { t as FederationBuilderImpl } from "./builder-BuaUyZ_b.mjs";
17
17
  import { t as buildCollectionSynchronizationHeader } from "./collection-DI6YzYpd.mjs";
18
18
  import { t as KvKeyCache } from "./keycache-D239uGT9.mjs";
19
19
  import { t as acceptsJsonLd } from "./negotiation-TWEs6Cl8.mjs";
20
- import { t as hasMalformedKnownTemporalLiteral } from "./temporal-BG59xtYa.mjs";
20
+ import { t as hasMalformedKnownTemporalLiteral } from "./temporal-Xw4eVeOf.mjs";
21
21
  import { t as createExponentialBackoffPolicy } from "./retry-Ddbq3AcK.mjs";
22
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-BRIl5BFM.mjs";
22
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-SOe_3aLg.mjs";
23
23
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
24
24
  import { lookupWebFinger } from "@fedify/webfinger";
25
25
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
@@ -1,4 +1,4 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
- const require_middleware = require("./middleware-12JY8Jki.cjs");
3
+ const require_middleware = require("./middleware-fcey9YBb.cjs");
4
4
  exports.FederationImpl = require_middleware.FederationImpl;
@@ -2,10 +2,10 @@ const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
4
  const require_transformers = require("./transformers-NeAONrAq.cjs");
5
- const require_http = require("./http-nKwQ0FzA.cjs");
5
+ const require_http = require("./http-CZoWzbyo.cjs");
6
6
  const require_types = require("./types-DWs-qZaY.cjs");
7
- const require_proof = require("./proof-DL58LftU.cjs");
8
- const require_kv_cache = require("./kv-cache-COqju2MA.cjs");
7
+ const require_proof = require("./proof-g4fypb9-.cjs");
8
+ const require_kv_cache = require("./kv-cache-CPPsJBQ2.cjs");
9
9
  let _logtape_logtape = require("@logtape/logtape");
10
10
  let _fedify_vocab = require("@fedify/vocab");
11
11
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -335,7 +335,7 @@ var FederationBuilderImpl = class {
335
335
  this.collectionTypeIds = {};
336
336
  }
337
337
  async build(options) {
338
- const { FederationImpl } = await Promise.resolve().then(() => require("./middleware-DnPJ5AqT.cjs"));
338
+ const { FederationImpl } = await Promise.resolve().then(() => require("./middleware-Dj1nbg0k.cjs"));
339
339
  const f = new FederationImpl(options);
340
340
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
341
341
  f.router = this.router.clone();
@@ -2276,6 +2276,15 @@ async function sendActivityInternal({ activity, activityId, keys, inbox, allowPr
2276
2276
  if (!allowPrivateAddress) try {
2277
2277
  await (0, _fedify_vocab_runtime.validatePublicUrl)(url);
2278
2278
  } catch (error) {
2279
+ if (error instanceof _fedify_vocab_runtime.UrlError && error.reason === "dns") {
2280
+ logger.error("DNS resolution failed for URL: {url}", {
2281
+ url,
2282
+ error
2283
+ });
2284
+ const failure = new _fedify_vocab_runtime.FetchError(url, error.message);
2285
+ failure.cause = error;
2286
+ throw failure;
2287
+ }
2279
2288
  if (error instanceof _fedify_vocab_runtime.UrlError) logger.error("Disallowed private URL: {url}", {
2280
2289
  url,
2281
2290
  error
package/dist/mod.cjs CHANGED
@@ -4,11 +4,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("./chunk-DDcVe30Y.cjs");
5
5
  const require_transformers = require("./transformers-NeAONrAq.cjs");
6
6
  require("./compat/mod.cjs");
7
- const require_http = require("./http-nKwQ0FzA.cjs");
8
- const require_middleware = require("./middleware-12JY8Jki.cjs");
7
+ const require_http = require("./http-CZoWzbyo.cjs");
8
+ const require_middleware = require("./middleware-fcey9YBb.cjs");
9
9
  const require_types = require("./types-DWs-qZaY.cjs");
10
- const require_proof = require("./proof-DL58LftU.cjs");
11
- const require_kv_cache = require("./kv-cache-COqju2MA.cjs");
10
+ const require_proof = require("./proof-g4fypb9-.cjs");
11
+ const require_kv_cache = require("./kv-cache-CPPsJBQ2.cjs");
12
12
  const require_federation_mod = require("./federation/mod.cjs");
13
13
  require("./nodeinfo/mod.cjs");
14
14
  require("./runtime/mod.cjs");
package/dist/mod.js CHANGED
@@ -3,11 +3,11 @@ import { URLPattern } from "urlpattern-polyfill";
3
3
  import "./chunk-CRNNMoPX.js";
4
4
  import { n as autoIdAssigner, r as getDefaultActivityTransformers, t as actorDehydrator } from "./transformers-BGMIq1cs.js";
5
5
  import "./compat/mod.js";
6
- import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "./http-Bl2-swIy.js";
7
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-BDkg4n5s.js";
6
+ import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "./http-BlF50Pnk.js";
7
+ import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-CRAGY-eN.js";
8
8
  import { n as getNodeInfo, r as parseNodeInfo, t as nodeInfoToJson } from "./types-sXITXcWa.js";
9
- import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-D-B0IDLS.js";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-Dwdnp4S8.js";
9
+ import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-tkdmUQSp.js";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-DvPFEKZc.js";
11
11
  import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } from "./federation/mod.js";
12
12
  import "./nodeinfo/mod.js";
13
13
  import "./runtime/mod.js";
@@ -5,7 +5,7 @@ import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-Duiq_YC9.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-D5I4RTqd.mjs";
8
+ import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-DThr9ixN.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  //#region src/nodeinfo/handler.test.ts
11
11
  test("handleNodeInfo()", async () => {
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
5
- import { n as fetchActorDocument, s as verifyKeyOwnership, t as exportJwk } from "./key-GYVCBSzo.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
+ import { n as fetchActorDocument, s as verifyKeyOwnership, t as exportJwk } from "./key-Fdd87o5A.mjs";
6
6
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
7
7
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,8 +1,8 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-GYVCBSzo.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-Fdd87o5A.mjs";
6
6
  import { Activity, DataIntegrityProof, Multikey, getTypeId } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-nKwQ0FzA.cjs");
4
+ const require_http = require("./http-CZoWzbyo.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let _fedify_vocab = require("@fedify/vocab");
7
7
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as fetchActorDocument, d as name, f as version, i as exportJwk, l as validateCryptoKey, o as fetchKey, u as verifyKeyOwnership } from "./http-Bl2-swIy.js";
3
+ import { a as fetchActorDocument, d as name, f as version, i as exportJwk, l as validateCryptoKey, o as fetchKey, u as verifyKeyOwnership } from "./http-BlF50Pnk.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { Activity, CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1, getTypeId, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -1,10 +1,10 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-BwjczLpP.mjs";
5
- import { n as doubleKnock } from "./http-CWG2X7S-.mjs";
4
+ import { n as version, t as name } from "./deno-Df5hkFDc.mjs";
5
+ import { n as doubleKnock } from "./http-B9hsKL5c.mjs";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
7
- import { UrlError, validatePublicUrl } from "@fedify/vocab-runtime";
7
+ import { FetchError, UrlError, validatePublicUrl } from "@fedify/vocab-runtime";
8
8
  import { getLogger } from "@logtape/logtape";
9
9
  //#region src/federation/send.ts
10
10
  /**
@@ -102,6 +102,15 @@ async function sendActivityInternal({ activity, activityId, keys, inbox, allowPr
102
102
  if (!allowPrivateAddress) try {
103
103
  await validatePublicUrl(url);
104
104
  } catch (error) {
105
+ if (error instanceof UrlError && error.reason === "dns") {
106
+ logger.error("DNS resolution failed for URL: {url}", {
107
+ url,
108
+ error
109
+ });
110
+ const failure = new FetchError(url, error.message);
111
+ failure.cause = error;
112
+ throw failure;
113
+ }
105
114
  if (error instanceof UrlError) logger.error("Disallowed private URL: {url}", {
106
115
  url,
107
116
  error
@@ -7,8 +7,8 @@ import { a as assertExists, t as assertStringIncludes } from "../std__assert-Dui
7
7
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
10
- import { t as exportJwk } from "../key-GYVCBSzo.mjs";
11
- import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase } from "../http-CWG2X7S-.mjs";
10
+ import { t as exportJwk } from "../key-Fdd87o5A.mjs";
11
+ import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase } from "../http-B9hsKL5c.mjs";
12
12
  import { i as rsaPrivateKey2, l as rsaPublicKey5, o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
13
13
  import { mockDocumentLoader, test } from "@fedify/fixture";
14
14
  import { FetchError, exportSpki } from "@fedify/vocab-runtime";
@@ -6,7 +6,7 @@ import "../std__assert-Duiq_YC9.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
9
- import { a as importJwk, i as generateCryptoKeyPair, o as validateCryptoKey, r as fetchKey, t as exportJwk } from "../key-GYVCBSzo.mjs";
9
+ import { a as importJwk, i as generateCryptoKeyPair, o as validateCryptoKey, r as fetchKey, t as exportJwk } from "../key-Fdd87o5A.mjs";
10
10
  import { c as rsaPublicKey3, i as rsaPrivateKey2, o as rsaPublicKey1, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { CryptographicKey, Multikey } from "@fedify/vocab";
@@ -5,9 +5,9 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
7
7
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
8
- import { i as generateCryptoKeyPair } from "../key-GYVCBSzo.mjs";
8
+ import { i as generateCryptoKeyPair } from "../key-Fdd87o5A.mjs";
9
9
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
10
- import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-CsYiVIbF.mjs";
10
+ import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-BiPcGm1a.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { CryptographicKey } from "@fedify/vocab";
13
13
  import { encodeBase64 } from "byte-encodings/base64";
package/dist/sig/mod.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_http = require("../http-nKwQ0FzA.cjs");
5
- const require_proof = require("../proof-DL58LftU.cjs");
4
+ const require_http = require("../http-CZoWzbyo.cjs");
5
+ const require_proof = require("../proof-g4fypb9-.cjs");
6
6
  exports.attachSignature = require_proof.attachSignature;
7
7
  exports.createProof = require_proof.createProof;
8
8
  exports.createSignature = require_proof.createSignature;
package/dist/sig/mod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "../http-Bl2-swIy.js";
4
- import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-D-B0IDLS.js";
3
+ import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "../http-BlF50Pnk.js";
4
+ import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-tkdmUQSp.js";
5
5
  export { attachSignature, createProof, createSignature, detachSignature, doesActorOwnKey, exportJwk, fetchKey, generateCryptoKeyPair, getKeyOwner, importJwk, signJsonLd, signObject, signRequest, verifyJsonLd, verifyObject, verifyProof, verifyRequest, verifySignature };
@@ -6,7 +6,7 @@ import "../std__assert-Duiq_YC9.mjs";
6
6
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
9
- import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-xshWf7Pw.mjs";
9
+ import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-CAqQdSYS.mjs";
10
10
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, CryptographicKey, lookupObject } from "@fedify/vocab";
12
12
  //#region src/sig/owner.test.ts
@@ -6,7 +6,7 @@ import "../std__assert-Duiq_YC9.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { n as assertInstanceOf } from "../assert-BhQd8QHP.mjs";
8
8
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
9
- import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-yKZAPs7k.mjs";
9
+ import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-BIHmqC-i.mjs";
10
10
  import { mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, DataIntegrityProof, Multikey, Note, Place } from "@fedify/vocab";
12
12
  import { decodeMultibase, importMultibaseKey } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { c as getNormalizationContextLoader } from "./ld-CsYiVIbF.mjs";
4
+ import { c as getNormalizationContextLoader } from "./ld-BiPcGm1a.mjs";
5
5
  import jsonld from "@fedify/vocab-runtime/jsonld";
6
6
  //#region src/federation/temporal.ts
7
7
  function isPlainObject(value) {
@@ -5,9 +5,9 @@ import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-Duiq_YC9.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
- import { l as verifyRequest } from "../http-CWG2X7S-.mjs";
8
+ import { l as verifyRequest } from "../http-B9hsKL5c.mjs";
9
9
  import { i as rsaPrivateKey2 } from "../keys-CCxRJhWa.mjs";
10
- import { t as getAuthenticatedDocumentLoader } from "../docloader-BKABwzJs.mjs";
10
+ import { t as getAuthenticatedDocumentLoader } from "../docloader--fos8R46.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { FetchError, UrlError } from "@fedify/vocab-runtime";
13
13
  //#region src/utils/docloader.test.ts
@@ -1,6 +1,6 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_kv_cache = require("../kv-cache-COqju2MA.cjs");
4
+ const require_kv_cache = require("../kv-cache-CPPsJBQ2.cjs");
5
5
  exports.getAuthenticatedDocumentLoader = require_kv_cache.getAuthenticatedDocumentLoader;
6
6
  exports.kvCache = require_kv_cache.kvCache;
package/dist/utils/mod.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-Dwdnp4S8.js";
3
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-DvPFEKZc.js";
4
4
  export { getAuthenticatedDocumentLoader, kvCache };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "2.0.28",
3
+ "version": "2.0.29-dev.2018+2e67253f",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -144,9 +144,9 @@
144
144
  "uri-template-router": "^1.0.0",
145
145
  "url-template": "^3.1.1",
146
146
  "urlpattern-polyfill": "^10.1.0",
147
- "@fedify/vocab": "2.0.28",
148
- "@fedify/webfinger": "2.0.28",
149
- "@fedify/vocab-runtime": "2.0.28"
147
+ "@fedify/webfinger": "2.0.29-dev.2018+2e67253f",
148
+ "@fedify/vocab": "2.0.29-dev.2018+2e67253f",
149
+ "@fedify/vocab-runtime": "2.0.29-dev.2018+2e67253f"
150
150
  },
151
151
  "devDependencies": {
152
152
  "@std/assert": "npm:@jsr/std__assert@^0.226.0",
@@ -158,8 +158,8 @@
158
158
  "tsx": "^4.19.4",
159
159
  "typescript": "^6.0.0",
160
160
  "wrangler": "^4.17.0",
161
- "@fedify/fixture": "2.0.0",
162
- "@fedify/vocab-tools": "^2.0.28"
161
+ "@fedify/vocab-tools": "^2.0.29-dev.2018+2e67253f",
162
+ "@fedify/fixture": "2.0.0"
163
163
  },
164
164
  "scripts": {
165
165
  "build:self": "tsdown",