@fedify/fedify 2.3.5-dev.1755 → 2.3.6

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 (65) hide show
  1. package/dist/{builder-De3ym5P9.mjs → builder-CW-9AJCO.mjs} +2 -2
  2. package/dist/{circuit-breaker-DLS_n1x5.mjs → circuit-breaker-D1fxthDI.mjs} +25 -5
  3. package/dist/{circuit-breaker-test-utils-BVnv3T76.mjs → circuit-breaker-test-utils-CAdwjgMi.mjs} +1 -1
  4. package/dist/compat/mod.d.cts +1 -1
  5. package/dist/compat/mod.d.ts +1 -1
  6. package/dist/compat/outgoing-jsonld.test.mjs +1 -1
  7. package/dist/compat/public-audience.test.mjs +11 -2
  8. package/dist/compat/transformers.test.mjs +1 -1
  9. package/dist/{context-Bjswu3eC.d.cts → context-BpmLyiPx.d.cts} +3 -2
  10. package/dist/{context-COxc_O-c.d.ts → context-BxVVO5Ro.d.ts} +3 -2
  11. package/dist/{deno-Bb3DoPyg.mjs → deno-KC-uf6Un.mjs} +1 -1
  12. package/dist/{docloader-B9iBabXZ.mjs → docloader-BHS1yt22.mjs} +13 -9
  13. package/dist/federation/builder.test.mjs +1 -1
  14. package/dist/federation/circuit-breaker.test.mjs +184 -21
  15. package/dist/federation/handler.test.mjs +3 -3
  16. package/dist/federation/idempotency.test.mjs +2 -2
  17. package/dist/federation/metrics.test.mjs +1 -1
  18. package/dist/federation/middleware.test.mjs +10 -9
  19. package/dist/federation/mod.cjs +1 -1
  20. package/dist/federation/mod.d.cts +2 -2
  21. package/dist/federation/mod.d.ts +2 -2
  22. package/dist/federation/mod.js +1 -1
  23. package/dist/federation/send.test.mjs +3 -3
  24. package/dist/federation/temporal.test.mjs +1 -1
  25. package/dist/federation/webfinger.test.mjs +1 -1
  26. package/dist/{http-DjON0zte.mjs → http-BcbYkefs.mjs} +9 -7
  27. package/dist/{http-DbMJX--j.cjs → http-DL5ZJBC4.cjs} +8 -6
  28. package/dist/{http-CNA76HH5.js → http-DzgaVy-x.js} +8 -6
  29. package/dist/{key-C2zsXBK1.mjs → key-Cbkqgt-G.mjs} +3 -3
  30. package/dist/{kv-cache-M9GujpTX.js → kv-cache-BWNRhap7.js} +12 -8
  31. package/dist/{kv-cache-CTOxE4cl.mjs → kv-cache-CT228f7w.mjs} +1 -1
  32. package/dist/{kv-cache-CZ9RI_NZ.cjs → kv-cache-Dw94l8rT.cjs} +12 -8
  33. package/dist/{ld-CB6S9oHd.mjs → ld-c-9mCB36.mjs} +3 -3
  34. package/dist/{metrics-DbryxSc6.mjs → metrics-D8s1eKfJ.mjs} +1 -1
  35. package/dist/{middleware-HRbD2E7D.mjs → middleware-3L9f9ZTw.mjs} +14 -14
  36. package/dist/{middleware-aw8NYL2-.cjs → middleware-B29rR42K.cjs} +28 -8
  37. package/dist/{middleware-BZdewTD9.mjs → middleware-Be2z0t5f.mjs} +1 -1
  38. package/dist/{middleware-iPQJA9In.js → middleware-D_cNQ7Yq.js} +28 -8
  39. package/dist/{mod-0bIqGrKQ.d.cts → mod-CjERT09F.d.cts} +1 -1
  40. package/dist/{mod-3H9Gym5G.d.ts → mod-Rpy4Uwkk.d.ts} +1 -1
  41. package/dist/mod.cjs +4 -4
  42. package/dist/mod.d.cts +2 -2
  43. package/dist/mod.d.ts +2 -2
  44. package/dist/mod.js +4 -4
  45. package/dist/nodeinfo/handler.test.mjs +1 -1
  46. package/dist/{outgoing-jsonld-L_DbOaFe.mjs → outgoing-jsonld-OFoubetZ.mjs} +1 -1
  47. package/dist/{owner-C5QCaiH6.mjs → owner-CjkdUXE3.mjs} +2 -2
  48. package/dist/{proof-Bzsr8i8m.js → proof-CrtfGSi7.js} +3 -2
  49. package/dist/{proof-yq1G2Z6x.cjs → proof-DGlDXtcc.cjs} +3 -2
  50. package/dist/{proof-CCC9itsd.mjs → proof-D_6qtBdQ.mjs} +5 -5
  51. package/dist/{public-audience-Cvbr2Gzt.mjs → public-audience-DZJAUUi8.mjs} +2 -1
  52. package/dist/{send-Zq0hXa8X.mjs → send-i63Det4Y.mjs} +3 -3
  53. package/dist/sig/http.test.mjs +65 -3
  54. package/dist/sig/key.test.mjs +46 -1
  55. package/dist/sig/ld.test.mjs +2 -2
  56. package/dist/sig/mod.cjs +2 -2
  57. package/dist/sig/mod.js +2 -2
  58. package/dist/sig/owner.test.mjs +1 -1
  59. package/dist/sig/proof.test.mjs +2 -2
  60. package/dist/{temporal-Rytw3yy2.mjs → temporal-CcVjTX30.mjs} +1 -1
  61. package/dist/utils/docloader.test.mjs +35 -2
  62. package/dist/utils/kv-cache.test.mjs +1 -1
  63. package/dist/utils/mod.cjs +1 -1
  64. package/dist/utils/mod.js +1 -1
  65. package/package.json +7 -7
@@ -10,17 +10,17 @@ import { t as assertThrows } from "../assert_throws-BOkhLGYc.mjs";
10
10
  import { t as assertNotEquals } from "../assert_not_equals-DkVK8oqV.mjs";
11
11
  import { t as assertStrictEquals } from "../assert_strict_equals-XEgZAlrj.mjs";
12
12
  import { t as assert } from "../assert-OguE97r2.mjs";
13
- import { g as recordInboxActivity } from "../metrics-DbryxSc6.mjs";
14
- import { l as verifyRequest, s as signRequest } from "../http-DjON0zte.mjs";
13
+ import { g as recordInboxActivity } from "../metrics-D8s1eKfJ.mjs";
14
+ import { l as verifyRequest, s as signRequest } from "../http-BcbYkefs.mjs";
15
15
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DGu1NFwu.mjs";
16
- import { t as getAuthenticatedDocumentLoader } from "../docloader-B9iBabXZ.mjs";
17
- import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-CB6S9oHd.mjs";
18
- import { t as doesActorOwnKey } from "../owner-C5QCaiH6.mjs";
19
- import { i as verifyObject, r as signObject } from "../proof-CCC9itsd.mjs";
16
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-BHS1yt22.mjs";
17
+ import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-c-9mCB36.mjs";
18
+ import { t as doesActorOwnKey } from "../owner-CjkdUXE3.mjs";
19
+ import { i as verifyObject, r as signObject } from "../proof-D_6qtBdQ.mjs";
20
20
  import { t as MemoryKvStore } from "../kv-rV3vodCc.mjs";
21
- import { g as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-HRbD2E7D.mjs";
22
- import { t as CircuitBreaker } from "../circuit-breaker-DLS_n1x5.mjs";
23
- import { t as markCircuitBreakerLegacySweepDone } from "../circuit-breaker-test-utils-BVnv3T76.mjs";
21
+ import { g as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-3L9f9ZTw.mjs";
22
+ import { t as CircuitBreaker } from "../circuit-breaker-D1fxthDI.mjs";
23
+ import { t as markCircuitBreakerLegacySweepDone } from "../circuit-breaker-test-utils-CAdwjgMi.mjs";
24
24
  import { configure, reset } from "@logtape/logtape";
25
25
  import { RouterError } from "@fedify/uri-template";
26
26
  import * as vocab from "@fedify/vocab";
@@ -4906,6 +4906,7 @@ test("FederationImpl.processQueuedTask() circuit breaker", async (t) => {
4906
4906
  const { federation, queued, kv } = setup({ failureThreshold: 1 }, { outboxRetryPolicy: () => Temporal.Duration.from({ seconds: 3 }) });
4907
4907
  kv.cas = () => Promise.resolve(false);
4908
4908
  await federation.processQueuedTask(void 0, createOutboxMessage("https://failure-bookkeeping.example/inbox"));
4909
+ await federation.circuitBreaker?.pendingSweep;
4909
4910
  assertEquals(queued.length, 1);
4910
4911
  const retry = queued[0].message;
4911
4912
  assertEquals(retry.attempt, 1);
@@ -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-aw8NYL2-.cjs");
5
+ const require_middleware = require("../middleware-B29rR42K.cjs");
6
6
  let _logtape_logtape = require("@logtape/logtape");
7
7
  let _fedify_uri_template = require("@fedify/uri-template");
8
8
  let es_toolkit = require("es-toolkit");
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as CustomCollectionCursor, A as Rfc6570Expression, At as parseCircuitBreakerKvState, B as createFederationBuilder, C as FederationStartQueueOptions, Ct as CircuitBreakerFailurePolicy, D as InboxListenerSetters, Dt as CircuitBreakerStateChange, E as InboxChallengePolicy, Et as CircuitBreakerState, F as CreateExponentialBackoffPolicyOptions, G as ActorDispatcher, H as respondWithObject, I as RetryContext, J as AuthorizePredicate, K as ActorHandleMapper, L as RetryPolicy, M as FederationOrigin, N as FederationQueueOptions, O as ObjectCallbackSetters, Ot as NormalizedCircuitBreakerOptions, P as createFederation, Q as CustomCollectionCounter, R as createExponentialBackoffPolicy, S as FederationOptions, St as CircuitBreakerCreateOptions, T as IdempotencyStrategy, Tt as CircuitBreakerOptions, U as respondWithObjectIfAcceptable, V as RespondWithObjectOptions, W as ActorAliasMapper, X as CollectionCursor, Y as CollectionCounter, Z as CollectionDispatcher, _ as Federatable, _t as buildCollectionSynchronizationHeader, a as GetSignedKeyOptions, at as ObjectDispatcher, b as FederationBuilder, bt as CircuitBreakerActivityDrop, c as ParseUriResult, ct as OutboxListenerErrorHandler, d as SendActivityOptions, dt as UnverifiedActivityHandler, et as CustomCollectionDispatcher, f as SendActivityOptionsForCollection, ft as UnverifiedActivityReason, g as CustomCollectionCallbackSetters, gt as PageItems, h as ConstructorWithTypeId, ht as SenderKeyPair, i as GetActorOptions, it as ObjectAuthorizePredicate, j as FederationKvPrefixes, k as OutboxListenerSetters, kt as normalizeCircuitBreakerOptions, l as RequestContext, lt as OutboxPermanentFailureHandler, m as CollectionCallbackSetters, mt as SendActivityError, n as Context, nt as InboxListener, o as InboxContext, ot as OutboxErrorHandler, p as ActorCallbackSetters, pt as WebFingerLinksDispatcher, q as ActorKeyPairsDispatcher, r as ForwardActivityOptions, rt as NodeInfoDispatcher, s as OutboxContext, st as OutboxListener, t as ActorKeyPair, tt as InboxErrorHandler, u as RouteActivityOptions, ut as SharedInboxKeyDispatcher, v as Federation, vt as digest, w as IdempotencyKeyCallback, wt as CircuitBreakerKvState, x as FederationFetchOptions, xt as CircuitBreakerBeforeSendDecision, y as FederationBenchmarkOptions, yt as CircuitBreaker, z as Message } from "../context-Bjswu3eC.cjs";
2
+ import { $ as CustomCollectionCursor, A as Rfc6570Expression, At as parseCircuitBreakerKvState, B as createFederationBuilder, C as FederationStartQueueOptions, Ct as CircuitBreakerFailurePolicy, D as InboxListenerSetters, Dt as CircuitBreakerStateChange, E as InboxChallengePolicy, Et as CircuitBreakerState, F as CreateExponentialBackoffPolicyOptions, G as ActorDispatcher, H as respondWithObject, I as RetryContext, J as AuthorizePredicate, K as ActorHandleMapper, L as RetryPolicy, M as FederationOrigin, N as FederationQueueOptions, O as ObjectCallbackSetters, Ot as NormalizedCircuitBreakerOptions, P as createFederation, Q as CustomCollectionCounter, R as createExponentialBackoffPolicy, S as FederationOptions, St as CircuitBreakerCreateOptions, T as IdempotencyStrategy, Tt as CircuitBreakerOptions, U as respondWithObjectIfAcceptable, V as RespondWithObjectOptions, W as ActorAliasMapper, X as CollectionCursor, Y as CollectionCounter, Z as CollectionDispatcher, _ as Federatable, _t as buildCollectionSynchronizationHeader, a as GetSignedKeyOptions, at as ObjectDispatcher, b as FederationBuilder, bt as CircuitBreakerActivityDrop, c as ParseUriResult, ct as OutboxListenerErrorHandler, d as SendActivityOptions, dt as UnverifiedActivityHandler, et as CustomCollectionDispatcher, f as SendActivityOptionsForCollection, ft as UnverifiedActivityReason, g as CustomCollectionCallbackSetters, gt as PageItems, h as ConstructorWithTypeId, ht as SenderKeyPair, i as GetActorOptions, it as ObjectAuthorizePredicate, j as FederationKvPrefixes, k as OutboxListenerSetters, kt as normalizeCircuitBreakerOptions, l as RequestContext, lt as OutboxPermanentFailureHandler, m as CollectionCallbackSetters, mt as SendActivityError, n as Context, nt as InboxListener, o as InboxContext, ot as OutboxErrorHandler, p as ActorCallbackSetters, pt as WebFingerLinksDispatcher, q as ActorKeyPairsDispatcher, r as ForwardActivityOptions, rt as NodeInfoDispatcher, s as OutboxContext, st as OutboxListener, t as ActorKeyPair, tt as InboxErrorHandler, u as RouteActivityOptions, ut as SharedInboxKeyDispatcher, v as Federation, vt as digest, w as IdempotencyKeyCallback, wt as CircuitBreakerKvState, x as FederationFetchOptions, xt as CircuitBreakerBeforeSendDecision, y as FederationBenchmarkOptions, yt as CircuitBreaker, z as Message } from "../context-BpmLyiPx.cjs";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-gJ8LYbxX.cjs";
4
4
  import { a as MessageQueueEnqueueOptions, i as MessageQueueDepth, n as InProcessMessageQueueOptions, o as MessageQueueListenOptions, r as MessageQueue, s as ParallelMessageQueue, t as InProcessMessageQueue } from "../mq-D8uSFzxe.cjs";
5
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-0bIqGrKQ.cjs";
5
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-CjERT09F.cjs";
6
6
  export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CircuitBreaker, CircuitBreakerActivityDrop, CircuitBreakerBeforeSendDecision, CircuitBreakerCreateOptions, CircuitBreakerFailurePolicy, CircuitBreakerKvState, CircuitBreakerOptions, CircuitBreakerState, CircuitBreakerStateChange, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBenchmarkOptions, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetActorOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, NormalizedCircuitBreakerOptions, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxContext, OutboxErrorHandler, OutboxListener, OutboxListenerErrorHandler, OutboxListenerSetters, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as CustomCollectionCursor, A as Rfc6570Expression, At as parseCircuitBreakerKvState, B as createFederationBuilder, C as FederationStartQueueOptions, Ct as CircuitBreakerFailurePolicy, D as InboxListenerSetters, Dt as CircuitBreakerStateChange, E as InboxChallengePolicy, Et as CircuitBreakerState, F as CreateExponentialBackoffPolicyOptions, G as ActorDispatcher, H as respondWithObject, I as RetryContext, J as AuthorizePredicate, K as ActorHandleMapper, L as RetryPolicy, M as FederationOrigin, N as FederationQueueOptions, O as ObjectCallbackSetters, Ot as NormalizedCircuitBreakerOptions, P as createFederation, Q as CustomCollectionCounter, R as createExponentialBackoffPolicy, S as FederationOptions, St as CircuitBreakerCreateOptions, T as IdempotencyStrategy, Tt as CircuitBreakerOptions, U as respondWithObjectIfAcceptable, V as RespondWithObjectOptions, W as ActorAliasMapper, X as CollectionCursor, Y as CollectionCounter, Z as CollectionDispatcher, _ as Federatable, _t as buildCollectionSynchronizationHeader, a as GetSignedKeyOptions, at as ObjectDispatcher, b as FederationBuilder, bt as CircuitBreakerActivityDrop, c as ParseUriResult, ct as OutboxListenerErrorHandler, d as SendActivityOptions, dt as UnverifiedActivityHandler, et as CustomCollectionDispatcher, f as SendActivityOptionsForCollection, ft as UnverifiedActivityReason, g as CustomCollectionCallbackSetters, gt as PageItems, h as ConstructorWithTypeId, ht as SenderKeyPair, i as GetActorOptions, it as ObjectAuthorizePredicate, j as FederationKvPrefixes, k as OutboxListenerSetters, kt as normalizeCircuitBreakerOptions, l as RequestContext, lt as OutboxPermanentFailureHandler, m as CollectionCallbackSetters, mt as SendActivityError, n as Context, nt as InboxListener, o as InboxContext, ot as OutboxErrorHandler, p as ActorCallbackSetters, pt as WebFingerLinksDispatcher, q as ActorKeyPairsDispatcher, r as ForwardActivityOptions, rt as NodeInfoDispatcher, s as OutboxContext, st as OutboxListener, t as ActorKeyPair, tt as InboxErrorHandler, u as RouteActivityOptions, ut as SharedInboxKeyDispatcher, v as Federation, vt as digest, w as IdempotencyKeyCallback, wt as CircuitBreakerKvState, x as FederationFetchOptions, xt as CircuitBreakerBeforeSendDecision, y as FederationBenchmarkOptions, yt as CircuitBreaker, z as Message } from "../context-COxc_O-c.js";
2
+ import { $ as CustomCollectionCursor, A as Rfc6570Expression, At as parseCircuitBreakerKvState, B as createFederationBuilder, C as FederationStartQueueOptions, Ct as CircuitBreakerFailurePolicy, D as InboxListenerSetters, Dt as CircuitBreakerStateChange, E as InboxChallengePolicy, Et as CircuitBreakerState, F as CreateExponentialBackoffPolicyOptions, G as ActorDispatcher, H as respondWithObject, I as RetryContext, J as AuthorizePredicate, K as ActorHandleMapper, L as RetryPolicy, M as FederationOrigin, N as FederationQueueOptions, O as ObjectCallbackSetters, Ot as NormalizedCircuitBreakerOptions, P as createFederation, Q as CustomCollectionCounter, R as createExponentialBackoffPolicy, S as FederationOptions, St as CircuitBreakerCreateOptions, T as IdempotencyStrategy, Tt as CircuitBreakerOptions, U as respondWithObjectIfAcceptable, V as RespondWithObjectOptions, W as ActorAliasMapper, X as CollectionCursor, Y as CollectionCounter, Z as CollectionDispatcher, _ as Federatable, _t as buildCollectionSynchronizationHeader, a as GetSignedKeyOptions, at as ObjectDispatcher, b as FederationBuilder, bt as CircuitBreakerActivityDrop, c as ParseUriResult, ct as OutboxListenerErrorHandler, d as SendActivityOptions, dt as UnverifiedActivityHandler, et as CustomCollectionDispatcher, f as SendActivityOptionsForCollection, ft as UnverifiedActivityReason, g as CustomCollectionCallbackSetters, gt as PageItems, h as ConstructorWithTypeId, ht as SenderKeyPair, i as GetActorOptions, it as ObjectAuthorizePredicate, j as FederationKvPrefixes, k as OutboxListenerSetters, kt as normalizeCircuitBreakerOptions, l as RequestContext, lt as OutboxPermanentFailureHandler, m as CollectionCallbackSetters, mt as SendActivityError, n as Context, nt as InboxListener, o as InboxContext, ot as OutboxErrorHandler, p as ActorCallbackSetters, pt as WebFingerLinksDispatcher, q as ActorKeyPairsDispatcher, r as ForwardActivityOptions, rt as NodeInfoDispatcher, s as OutboxContext, st as OutboxListener, t as ActorKeyPair, tt as InboxErrorHandler, u as RouteActivityOptions, ut as SharedInboxKeyDispatcher, v as Federation, vt as digest, w as IdempotencyKeyCallback, wt as CircuitBreakerKvState, x as FederationFetchOptions, xt as CircuitBreakerBeforeSendDecision, y as FederationBenchmarkOptions, yt as CircuitBreaker, z as Message } from "../context-BxVVO5Ro.js";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-D6hNiMTK.js";
4
4
  import { a as MessageQueueEnqueueOptions, i as MessageQueueDepth, n as InProcessMessageQueueOptions, o as MessageQueueListenOptions, r as MessageQueue, s as ParallelMessageQueue, t as InProcessMessageQueue } from "../mq-D-nlpY04.js";
5
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-3H9Gym5G.js";
5
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-Rpy4Uwkk.js";
6
6
  export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CircuitBreaker, CircuitBreakerActivityDrop, CircuitBreakerBeforeSendDecision, CircuitBreakerCreateOptions, CircuitBreakerFailurePolicy, CircuitBreakerKvState, CircuitBreakerOptions, CircuitBreakerState, CircuitBreakerStateChange, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBenchmarkOptions, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetActorOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, NormalizedCircuitBreakerOptions, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxContext, OutboxErrorHandler, OutboxListener, OutboxListenerErrorHandler, OutboxListenerSetters, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as SendActivityError, c as buildCollectionSynchronizationHeader, d as normalizeCircuitBreakerOptions, f as parseCircuitBreakerKvState, i as createExponentialBackoffPolicy, l as digest, o as respondWithObject, p as createFederationBuilder, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as CircuitBreaker } from "../middleware-iPQJA9In.js";
3
+ import { a as SendActivityError, c as buildCollectionSynchronizationHeader, d as normalizeCircuitBreakerOptions, f as parseCircuitBreakerKvState, i as createExponentialBackoffPolicy, l as digest, o as respondWithObject, p as createFederationBuilder, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as CircuitBreaker } from "../middleware-D_cNQ7Yq.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { Router as Router$1, RouterError as RouterError$1, assertPath, isPath } from "@fedify/uri-template";
6
6
  import { isEqual } from "es-toolkit";
@@ -8,10 +8,10 @@ import { n as assertGreaterOrEqual, r as assertFalse, t as assertRejects } from
8
8
  import { t as assertInstanceOf } from "../assert_instance_of-DBC5X09g.mjs";
9
9
  import { t as assertNotEquals } from "../assert_not_equals-DkVK8oqV.mjs";
10
10
  import { t as assert } from "../assert-OguE97r2.mjs";
11
- import { l as verifyRequest } from "../http-DjON0zte.mjs";
11
+ import { l as verifyRequest } from "../http-BcbYkefs.mjs";
12
12
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DGu1NFwu.mjs";
13
- import { t as doesActorOwnKey } from "../owner-C5QCaiH6.mjs";
14
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-Zq0hXa8X.mjs";
13
+ import { t as doesActorOwnKey } from "../owner-CjkdUXE3.mjs";
14
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-i63Det4Y.mjs";
15
15
  import { Activity, Application, Endpoints, Group, Person, Service } from "@fedify/vocab";
16
16
  import { createTestMeterProvider, createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
17
17
  import { FetchError } from "@fedify/vocab-runtime";
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import "../std__assert-BBjXFNOb.mjs";
5
5
  import { r as assertFalse } from "../assert_rejects-DN60FHPX.mjs";
6
6
  import { t as assert } from "../assert-OguE97r2.mjs";
7
- import { t as hasMalformedKnownTemporalLiteral } from "../temporal-Rytw3yy2.mjs";
7
+ import { t as hasMalformedKnownTemporalLiteral } from "../temporal-CcVjTX30.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 () => {
@@ -6,7 +6,7 @@ import { t as assertEquals } from "../assert_equals-C-ZRDbaf.mjs";
6
6
  import "../std__assert-BBjXFNOb.mjs";
7
7
  import { t as assertNotEquals } from "../assert_not_equals-DkVK8oqV.mjs";
8
8
  import { t as MemoryKvStore } from "../kv-rV3vodCc.mjs";
9
- import { o as createFederation, s as handleWebFinger } from "../middleware-HRbD2E7D.mjs";
9
+ import { o as createFederation, s as handleWebFinger } from "../middleware-3L9f9ZTw.mjs";
10
10
  import { Image, Link, Person, Tombstone } from "@fedify/vocab";
11
11
  import { createTestMeterProvider, test } from "@fedify/fixture";
12
12
  //#region src/federation/webfinger.test.ts
@@ -1,10 +1,10 @@
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-Bb3DoPyg.mjs";
5
- import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-DbryxSc6.mjs";
4
+ import { n as version, t as name } from "./deno-KC-uf6Un.mjs";
5
+ import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-D8s1eKfJ.mjs";
6
6
  import { i as validateAcceptSignature, n as fulfillAcceptSignature, r as parseAcceptSignature } from "./accept-CPkZzmGN.mjs";
7
- import { o as validateCryptoKey, r as fetchKeyDetailed } from "./key-C2zsXBK1.mjs";
7
+ import { o as validateCryptoKey, r as fetchKeyDetailed } from "./key-Cbkqgt-G.mjs";
8
8
  import { getLogger } from "@logtape/logtape";
9
9
  import { CryptographicKey } from "@fedify/vocab";
10
10
  import { SpanStatusCode, trace } from "@opentelemetry/api";
@@ -875,10 +875,12 @@ async function verifyRequestRfc9421(request, span, metricsContext, { documentLoa
875
875
  * @param request The original request.
876
876
  * @param location The redirect location.
877
877
  * @param body The request body as ArrayBuffer or null.
878
+ * @param validateRedirect The function to validate the redirect URL.
878
879
  * @returns A new Request object for the redirect.
879
880
  */
880
- function createRedirectRequest(request, location, body) {
881
+ async function createRedirectRequest(request, location, body, validateRedirect) {
881
882
  const url = new URL(location, request.url);
883
+ await validateRedirect?.(url.href);
882
884
  return new Request(url, {
883
885
  method: request.method,
884
886
  headers: request.headers,
@@ -976,7 +978,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
976
978
  let response = await fetchDoubleKnockRequest(request, signedRequest, signal);
977
979
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
978
980
  if (redirected >= maximumRedirection) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
979
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
981
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
980
982
  if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
981
983
  return doubleKnockInternal(redirectRequest, identity, {
982
984
  ...options,
@@ -1024,7 +1026,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
1024
1026
  redirect: "manual",
1025
1027
  signal
1026
1028
  });
1027
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
1029
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect), identity, {
1028
1030
  ...options,
1029
1031
  body
1030
1032
  });
@@ -1051,7 +1053,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
1051
1053
  response = await fetchDoubleKnockRequest(request, signedRequest, signal);
1052
1054
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
1053
1055
  if (redirected >= maximumRedirection) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
1054
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
1056
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
1055
1057
  if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
1056
1058
  return doubleKnockInternal(redirectRequest, identity, {
1057
1059
  ...options,
@@ -11,7 +11,7 @@ let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conve
11
11
  let byte_encodings_base64 = require("byte-encodings/base64");
12
12
  //#region deno.json
13
13
  var name = "@fedify/fedify";
14
- var version = "2.3.5-dev.1755+9b03b9cc";
14
+ var version = "2.3.6";
15
15
  //#endregion
16
16
  //#region src/sig/accept.ts
17
17
  /**
@@ -1196,7 +1196,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
1196
1196
  }
1197
1197
  }
1198
1198
  let key = null;
1199
- if (object instanceof cls) key = object;
1199
+ if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object;
1200
1200
  else if ((0, _fedify_vocab.isActor)(object)) {
1201
1201
  const keys = cls === _fedify_vocab.CryptographicKey ? object.getPublicKeys({
1202
1202
  documentLoader,
@@ -2199,10 +2199,12 @@ async function verifyRequestRfc9421(request, span, metricsContext, { documentLoa
2199
2199
  * @param request The original request.
2200
2200
  * @param location The redirect location.
2201
2201
  * @param body The request body as ArrayBuffer or null.
2202
+ * @param validateRedirect The function to validate the redirect URL.
2202
2203
  * @returns A new Request object for the redirect.
2203
2204
  */
2204
- function createRedirectRequest(request, location, body) {
2205
+ async function createRedirectRequest(request, location, body, validateRedirect) {
2205
2206
  const url = new URL(location, request.url);
2207
+ await validateRedirect?.(url.href);
2206
2208
  return new Request(url, {
2207
2209
  method: request.method,
2208
2210
  headers: request.headers,
@@ -2300,7 +2302,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2300
2302
  let response = await fetchDoubleKnockRequest(request, signedRequest, signal);
2301
2303
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
2302
2304
  if (redirected >= maximumRedirection) throw new _fedify_vocab_runtime.FetchError(request.url, `Too many redirections (${redirected + 1})`);
2303
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
2305
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
2304
2306
  if (visited.has(redirectRequest.url)) throw new _fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
2305
2307
  return doubleKnockInternal(redirectRequest, identity, {
2306
2308
  ...options,
@@ -2348,7 +2350,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2348
2350
  redirect: "manual",
2349
2351
  signal
2350
2352
  });
2351
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
2353
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect), identity, {
2352
2354
  ...options,
2353
2355
  body
2354
2356
  });
@@ -2375,7 +2377,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2375
2377
  response = await fetchDoubleKnockRequest(request, signedRequest, signal);
2376
2378
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
2377
2379
  if (redirected >= maximumRedirection) throw new _fedify_vocab_runtime.FetchError(request.url, `Too many redirections (${redirected + 1})`);
2378
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
2380
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
2379
2381
  if (visited.has(redirectRequest.url)) throw new _fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
2380
2382
  return doubleKnockInternal(redirectRequest, identity, {
2381
2383
  ...options,
@@ -10,7 +10,7 @@ import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL } fro
10
10
  import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
11
11
  //#region deno.json
12
12
  var name = "@fedify/fedify";
13
- var version = "2.3.5-dev.1755+9b03b9cc";
13
+ var version = "2.3.6";
14
14
  //#endregion
15
15
  //#region src/sig/accept.ts
16
16
  /**
@@ -1195,7 +1195,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
1195
1195
  }
1196
1196
  }
1197
1197
  let key = null;
1198
- if (object instanceof cls) key = object;
1198
+ if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object;
1199
1199
  else if (isActor(object)) {
1200
1200
  const keys = cls === CryptographicKey ? object.getPublicKeys({
1201
1201
  documentLoader,
@@ -2198,10 +2198,12 @@ async function verifyRequestRfc9421(request, span, metricsContext, { documentLoa
2198
2198
  * @param request The original request.
2199
2199
  * @param location The redirect location.
2200
2200
  * @param body The request body as ArrayBuffer or null.
2201
+ * @param validateRedirect The function to validate the redirect URL.
2201
2202
  * @returns A new Request object for the redirect.
2202
2203
  */
2203
- function createRedirectRequest(request, location, body) {
2204
+ async function createRedirectRequest(request, location, body, validateRedirect) {
2204
2205
  const url = new URL(location, request.url);
2206
+ await validateRedirect?.(url.href);
2205
2207
  return new Request(url, {
2206
2208
  method: request.method,
2207
2209
  headers: request.headers,
@@ -2299,7 +2301,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2299
2301
  let response = await fetchDoubleKnockRequest(request, signedRequest, signal);
2300
2302
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
2301
2303
  if (redirected >= maximumRedirection) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
2302
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
2304
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
2303
2305
  if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
2304
2306
  return doubleKnockInternal(redirectRequest, identity, {
2305
2307
  ...options,
@@ -2347,7 +2349,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2347
2349
  redirect: "manual",
2348
2350
  signal
2349
2351
  });
2350
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
2352
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect), identity, {
2351
2353
  ...options,
2352
2354
  body
2353
2355
  });
@@ -2374,7 +2376,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2374
2376
  response = await fetchDoubleKnockRequest(request, signedRequest, signal);
2375
2377
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
2376
2378
  if (redirected >= maximumRedirection) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
2377
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
2379
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
2378
2380
  if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
2379
2381
  return doubleKnockInternal(redirectRequest, identity, {
2380
2382
  ...options,
@@ -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-Bb3DoPyg.mjs";
5
- import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-DbryxSc6.mjs";
4
+ import { n as version, t as name } from "./deno-KC-uf6Un.mjs";
5
+ import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-D8s1eKfJ.mjs";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -243,7 +243,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
243
243
  }
244
244
  }
245
245
  let key = null;
246
- if (object instanceof cls) key = object;
246
+ if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object;
247
247
  else if (isActor(object)) {
248
248
  const keys = cls === CryptographicKey ? object.getPublicKeys({
249
249
  documentLoader,
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { C as recordDocumentCache, d as validateCryptoKey, t as doubleKnock } from "./http-CNA76HH5.js";
3
+ import { C as recordDocumentCache, d as validateCryptoKey, t as doubleKnock } from "./http-DzgaVy-x.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";
@@ -24,6 +24,17 @@ const logger$1 = getLogger([
24
24
  function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, maxRedirection, userAgent, specDeterminer, tracerProvider } = {}) {
25
25
  validateCryptoKey(identity.privateKey);
26
26
  async function load(url, options) {
27
+ await validateUrl(url);
28
+ return getRemoteDocument(url, await doubleKnock(createActivityPubRequest(url, { userAgent }), identity, {
29
+ maxRedirection,
30
+ specDeterminer,
31
+ log: curry(logRequest)(logger$1),
32
+ tracerProvider,
33
+ signal: options?.signal,
34
+ validateRedirect: validateUrl
35
+ }), load);
36
+ }
37
+ async function validateUrl(url) {
27
38
  if (!allowPrivateAddress) try {
28
39
  await validatePublicUrl(url);
29
40
  } catch (error) {
@@ -33,13 +44,6 @@ function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, maxRedi
33
44
  });
34
45
  throw error;
35
46
  }
36
- return getRemoteDocument(url, await doubleKnock(createActivityPubRequest(url, { userAgent }), identity, {
37
- maxRedirection,
38
- specDeterminer,
39
- log: curry(logRequest)(logger$1),
40
- tracerProvider,
41
- signal: options?.signal
42
- }), load);
43
47
  }
44
48
  return load;
45
49
  }
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { p as recordDocumentCache } from "./metrics-DbryxSc6.mjs";
4
+ import { p as recordDocumentCache } from "./metrics-D8s1eKfJ.mjs";
5
5
  import { getLogger } from "@logtape/logtape";
6
6
  import { preloadedContexts } from "@fedify/vocab-runtime";
7
7
  //#region src/utils/kv-cache.ts
@@ -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-DbMJX--j.cjs");
4
+ const require_http = require("./http-DL5ZJBC4.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");
@@ -25,6 +25,17 @@ const logger$1 = (0, _logtape_logtape.getLogger)([
25
25
  function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, maxRedirection, userAgent, specDeterminer, tracerProvider } = {}) {
26
26
  require_http.validateCryptoKey(identity.privateKey);
27
27
  async function load(url, options) {
28
+ await validateUrl(url);
29
+ return (0, _fedify_vocab_runtime.getRemoteDocument)(url, await require_http.doubleKnock((0, _fedify_vocab_runtime.createActivityPubRequest)(url, { userAgent }), identity, {
30
+ maxRedirection,
31
+ specDeterminer,
32
+ log: (0, es_toolkit.curry)(_fedify_vocab_runtime.logRequest)(logger$1),
33
+ tracerProvider,
34
+ signal: options?.signal,
35
+ validateRedirect: validateUrl
36
+ }), load);
37
+ }
38
+ async function validateUrl(url) {
28
39
  if (!allowPrivateAddress) try {
29
40
  await (0, _fedify_vocab_runtime.validatePublicUrl)(url);
30
41
  } catch (error) {
@@ -34,13 +45,6 @@ function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, maxRedi
34
45
  });
35
46
  throw error;
36
47
  }
37
- return (0, _fedify_vocab_runtime.getRemoteDocument)(url, await require_http.doubleKnock((0, _fedify_vocab_runtime.createActivityPubRequest)(url, { userAgent }), identity, {
38
- maxRedirection,
39
- specDeterminer,
40
- log: (0, es_toolkit.curry)(_fedify_vocab_runtime.logRequest)(logger$1),
41
- tracerProvider,
42
- signal: options?.signal
43
- }), load);
44
48
  }
45
49
  return load;
46
50
  }
@@ -1,9 +1,9 @@
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-Bb3DoPyg.mjs";
5
- import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-DbryxSc6.mjs";
6
- import { n as fetchKey, o as validateCryptoKey } from "./key-C2zsXBK1.mjs";
4
+ import { n as version, t as name } from "./deno-KC-uf6Un.mjs";
5
+ import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-D8s1eKfJ.mjs";
6
+ import { n as fetchKey, o as validateCryptoKey } from "./key-Cbkqgt-G.mjs";
7
7
  import { getLogger } from "@logtape/logtape";
8
8
  import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
9
9
  import { SpanStatusCode, trace } from "@opentelemetry/api";
@@ -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-Bb3DoPyg.mjs";
4
+ import { n as version, t as name } from "./deno-KC-uf6Un.mjs";
5
5
  import { metrics } from "@opentelemetry/api";
6
6
  import { FetchError } from "@fedify/vocab-runtime";
7
7
  //#region src/federation/metrics.ts
@@ -1,26 +1,26 @@
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-Bb3DoPyg.mjs";
5
- import { a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, n as getDurationMs, o as isAbortError, r as getFederationMetrics, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "./metrics-DbryxSc6.mjs";
4
+ import { n as version, t as name } from "./deno-KC-uf6Un.mjs";
5
+ import { a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, n as getDurationMs, o as isAbortError, r as getFederationMetrics, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "./metrics-D8s1eKfJ.mjs";
6
6
  import { t as formatAcceptSignature } from "./accept-CPkZzmGN.mjs";
7
- import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-C2zsXBK1.mjs";
8
- import { l as verifyRequest, o as parseRfc9421SignatureInput, u as verifyRequestDetailed } from "./http-DjON0zte.mjs";
9
- import { t as getAuthenticatedDocumentLoader } from "./docloader-B9iBabXZ.mjs";
10
- import { n as kvCache } from "./kv-cache-CTOxE4cl.mjs";
11
- import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-CB6S9oHd.mjs";
12
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-C5QCaiH6.mjs";
13
- import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-L_DbOaFe.mjs";
14
- import { i as verifyObject, n as hasProofLike, r as signObject } from "./proof-CCC9itsd.mjs";
7
+ import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-Cbkqgt-G.mjs";
8
+ import { l as verifyRequest, o as parseRfc9421SignatureInput, u as verifyRequestDetailed } from "./http-BcbYkefs.mjs";
9
+ import { t as getAuthenticatedDocumentLoader } from "./docloader-BHS1yt22.mjs";
10
+ import { n as kvCache } from "./kv-cache-CT228f7w.mjs";
11
+ import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-c-9mCB36.mjs";
12
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-CjkdUXE3.mjs";
13
+ import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-OFoubetZ.mjs";
14
+ import { i as verifyObject, n as hasProofLike, r as signObject } from "./proof-D_6qtBdQ.mjs";
15
15
  import { t as getNodeInfo } from "./client-D1KuWxjH.mjs";
16
16
  import { t as nodeInfoToJson } from "./types-J53Kw7so.mjs";
17
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-Zq0hXa8X.mjs";
18
- import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-De3ym5P9.mjs";
19
- import { t as CircuitBreaker } from "./circuit-breaker-DLS_n1x5.mjs";
17
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-i63Det4Y.mjs";
18
+ import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-CW-9AJCO.mjs";
19
+ import { t as CircuitBreaker } from "./circuit-breaker-D1fxthDI.mjs";
20
20
  import { t as buildCollectionSynchronizationHeader } from "./collection-Cc3DVAhE.mjs";
21
21
  import { t as KvKeyCache } from "./keycache-BeU0LCII.mjs";
22
22
  import { t as acceptsJsonLd } from "./negotiation-DDstyBvc.mjs";
23
- import { t as hasMalformedKnownTemporalLiteral } from "./temporal-Rytw3yy2.mjs";
23
+ import { t as hasMalformedKnownTemporalLiteral } from "./temporal-CcVjTX30.mjs";
24
24
  import { t as createExponentialBackoffPolicy } from "./retry-CXg_MBI-.mjs";
25
25
  import { getLogger, withContext } from "@logtape/logtape";
26
26
  import { RouterError } from "@fedify/uri-template";
@@ -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-DbMJX--j.cjs");
6
- const require_proof = require("./proof-yq1G2Z6x.cjs");
5
+ const require_http = require("./http-DL5ZJBC4.cjs");
6
+ const require_proof = require("./proof-DGlDXtcc.cjs");
7
7
  const require_types = require("./types-m8u9L86X.cjs");
8
- const require_kv_cache = require("./kv-cache-CZ9RI_NZ.cjs");
8
+ const require_kv_cache = require("./kv-cache-Dw94l8rT.cjs");
9
9
  let _logtape_logtape = require("@logtape/logtape");
10
10
  let _fedify_uri_template = require("@fedify/uri-template");
11
11
  let _fedify_vocab = require("@fedify/vocab");
@@ -683,10 +683,11 @@ function createFederationBuilder() {
683
683
  //#endregion
684
684
  //#region src/federation/circuit-breaker.ts
685
685
  const MAX_CUSTOM_FAILURE_HISTORY = 100;
686
- const LEGACY_SWEEP_MARKER = ["__fedify_meta", "circuit_breaker_state_ttl_sweep_v1"];
686
+ const LEGACY_SWEEP_MARKER = ["__fedify_meta", "circuit_breaker_state_ttl_sweep_v2"];
687
687
  const LEGACY_SWEEP_DELETING_MARKER = { __fedifyDeletingCircuitBreakerLegacyState: true };
688
688
  const CIRCUIT_BREAKER_STATE_VERSION = 1;
689
689
  const LEGACY_SWEEP_LOCK_TTL = Temporal.Duration.from({ minutes: 5 });
690
+ const LEGACY_SWEEP_RENEW_INTERVAL = Temporal.Duration.from({ minutes: 1 });
690
691
  const LEGACY_SWEEP_RETRY_WINDOW = Temporal.Duration.from({ hours: 168 });
691
692
  const LEGACY_SWEEP_WAIT_INTERVAL = 10;
692
693
  const LEGACY_SWEEP_CAS_ATTEMPTS = 3;
@@ -901,12 +902,20 @@ var CircuitBreaker = class {
901
902
  }
902
903
  async #sweepLegacyStatesImpl() {
903
904
  const markerKey = this.#legacySweepMarkerKey();
904
- const marker = await this.#acquireLegacySweep(markerKey);
905
- if (marker === "done") return;
905
+ const acquired = await this.#acquireLegacySweep(markerKey);
906
+ if (acquired === "done") return;
907
+ let marker = acquired;
908
+ let leaseRenewedAt = this.#now();
906
909
  try {
907
910
  for await (const { key, value } of this.#kv.list(this.#prefix)) {
908
911
  if (key.length !== this.#prefix.length + 1) continue;
909
912
  await this.#migrateLegacyState(key, value);
913
+ if (Temporal.Instant.compare(this.#now(), leaseRenewedAt.add(LEGACY_SWEEP_RENEW_INTERVAL)) >= 0) {
914
+ const renewed = await this.#renewLegacySweep(markerKey, marker);
915
+ if (renewed == null) return;
916
+ marker = renewed;
917
+ leaseRenewedAt = this.#now();
918
+ }
910
919
  }
911
920
  } catch (error) {
912
921
  await this.#deleteIfUnchanged(markerKey, marker);
@@ -915,6 +924,14 @@ var CircuitBreaker = class {
915
924
  const finishedMarker = this.#finishLegacySweepMarker(marker);
916
925
  if (await this.#kv.cas(markerKey, marker, finishedMarker)) this.#rememberLegacySweepMarker(finishedMarker);
917
926
  }
927
+ async #renewLegacySweep(markerKey, marker) {
928
+ const renewed = {
929
+ state: "sweeping",
930
+ started: this.#now().toString(),
931
+ retryUntil: getLegacySweepRetryUntil(marker) ?? this.#now().add(LEGACY_SWEEP_RETRY_WINDOW).toString()
932
+ };
933
+ if (await this.#kv.cas(markerKey, marker, renewed, { ttl: LEGACY_SWEEP_LOCK_TTL })) return renewed;
934
+ }
918
935
  #finishLegacySweepMarker(marker) {
919
936
  const retryUntil = getLegacySweepRetryUntil(marker);
920
937
  if (retryUntil != null && Temporal.Instant.compare(this.#now(), Temporal.Instant.from(retryUntil)) < 0) return {
@@ -924,7 +941,10 @@ var CircuitBreaker = class {
924
941
  return { state: "final" };
925
942
  }
926
943
  async #migrateLegacyState(key, value) {
927
- if (isCurrentCircuitBreakerState(value)) return;
944
+ if (isCurrentCircuitBreakerState(value)) {
945
+ await this.#kv.cas(key, value, value, this.#setOptions());
946
+ return;
947
+ }
928
948
  const state = parseCircuitBreakerKvState(value);
929
949
  if (state != null) {
930
950
  await this.#kv.cas(key, value, markCircuitBreakerState(state), this.#setOptions());
@@ -1061,7 +1081,7 @@ function normalizeCircuitBreakerOptions(options) {
1061
1081
  } else {
1062
1082
  failure = options.failure;
1063
1083
  pruneFailures = (timestamps) => timestamps.slice(-MAX_CUSTOM_FAILURE_HISTORY);
1064
- stateTtl = configuredStateTtl;
1084
+ stateTtl = configuredStateTtl ?? recoveryDelay.add(heldActivityTtl);
1065
1085
  }
1066
1086
  return {
1067
1087
  failure,
@@ -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-HRbD2E7D.mjs";
4
+ import { n as FederationImpl } from "./middleware-3L9f9ZTw.mjs";
5
5
  export { FederationImpl };