@fedify/fedify 2.4.0-dev.1848 → 2.4.0-dev.1873

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 (64) hide show
  1. package/dist/{builder-8WyrrBSI.mjs → builder-7ZvZ5ilC.mjs} +2 -2
  2. package/dist/{circuit-breaker-BT7CiPbz.mjs → circuit-breaker-C5NqoLBJ.mjs} +25 -5
  3. package/dist/{circuit-breaker-test-utils-BYIHoliq.mjs → circuit-breaker-test-utils-DW6YC_Pe.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/transformers.test.mjs +1 -1
  7. package/dist/{context-B-dsBjZ9.d.cts → context-BOnn653X.d.cts} +3 -2
  8. package/dist/{context-DrLXudbA.d.ts → context-CmjP-cgJ.d.ts} +3 -2
  9. package/dist/{deno-CNYW2Ig8.mjs → deno-CxSfl_a4.mjs} +1 -1
  10. package/dist/{docloader-Dzbz3Js2.mjs → docloader-BA8lSYW0.mjs} +13 -9
  11. package/dist/federation/builder.test.mjs +1 -1
  12. package/dist/federation/circuit-breaker.test.mjs +184 -21
  13. package/dist/federation/handler.test.mjs +3 -3
  14. package/dist/federation/idempotency.test.mjs +2 -2
  15. package/dist/federation/metrics.test.mjs +1 -1
  16. package/dist/federation/middleware.test.mjs +10 -9
  17. package/dist/federation/mod.cjs +1 -1
  18. package/dist/federation/mod.d.cts +2 -2
  19. package/dist/federation/mod.d.ts +2 -2
  20. package/dist/federation/mod.js +1 -1
  21. package/dist/federation/send.test.mjs +3 -3
  22. package/dist/federation/tasks/enqueue.test.mjs +1 -1
  23. package/dist/federation/tasks/tasks.test.mjs +2 -2
  24. package/dist/federation/temporal.test.mjs +1 -1
  25. package/dist/federation/webfinger.test.mjs +1 -1
  26. package/dist/{federation-CChOD4m8.cjs → federation-EWi4e3XY.cjs} +28 -8
  27. package/dist/{http-CqXnYPxh.js → http-BQxL1lOO.js} +8 -6
  28. package/dist/{http-DpXPu64P.mjs → http-DlSUSFxF.mjs} +9 -7
  29. package/dist/{http-DcSh3Nkc.cjs → http-MQyitOvl.cjs} +8 -6
  30. package/dist/{key-hmby7gn5.mjs → key-6O7-nI4D.mjs} +3 -3
  31. package/dist/{kv-cache-BJ67yD69.cjs → kv-cache-AN6qSmg2.cjs} +12 -8
  32. package/dist/{kv-cache-AbW4Zb7B.js → kv-cache-BaLaRgP0.js} +12 -8
  33. package/dist/{kv-cache-Nl-t79NZ.mjs → kv-cache-DqiCo6_V.mjs} +1 -1
  34. package/dist/{ld-B8i_nYpF.mjs → ld-CwHaXyMi.mjs} +3 -3
  35. package/dist/{metrics-Pf5DoomU.mjs → metrics-DpjCXFvC.mjs} +1 -1
  36. package/dist/{middleware-Hgkr-t3e.js → middleware-Bcx74jmq.js} +28 -8
  37. package/dist/{middleware-DRGoAGNP.mjs → middleware-C8wXU20O.mjs} +13 -13
  38. package/dist/{middleware-kc0OTJOB.mjs → middleware-Cy6-svwn.mjs} +1 -1
  39. package/dist/{mod-D6O8C7eN.d.ts → mod-BYuZ0WXt.d.ts} +1 -1
  40. package/dist/{mod-D-abvu2C.d.cts → mod-kUSY5n3f.d.cts} +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/{owner-Bq-aDUI1.mjs → owner-CDshspna.mjs} +2 -2
  47. package/dist/{proof-BJ6kqGDQ.mjs → proof-C1uX5GYQ.mjs} +4 -4
  48. package/dist/{proof-Y3u5gsyU.cjs → proof-CwrJYody.cjs} +1 -1
  49. package/dist/{proof-CKKqEWUg.js → proof-D7aD6Hut.js} +1 -1
  50. package/dist/{send-DxAijVhs.mjs → send-BrW0OtvG.mjs} +3 -3
  51. package/dist/sig/http.test.mjs +65 -3
  52. package/dist/sig/key.test.mjs +46 -1
  53. package/dist/sig/ld.test.mjs +2 -2
  54. package/dist/sig/mod.cjs +2 -2
  55. package/dist/sig/mod.js +2 -2
  56. package/dist/sig/owner.test.mjs +1 -1
  57. package/dist/sig/proof.test.mjs +1 -1
  58. package/dist/{temporal-BB26MWBu.mjs → temporal-5ClDg1Qq.mjs} +1 -1
  59. package/dist/testing/mod.d.mts +3 -2
  60. package/dist/utils/docloader.test.mjs +35 -2
  61. package/dist/utils/kv-cache.test.mjs +1 -1
  62. package/dist/utils/mod.cjs +1 -1
  63. package/dist/utils/mod.js +1 -1
  64. package/package.json +6 -6
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as MessageQueueDepth, A as OutboxListenerSetters, At as ObjectAuthorizePredicate, B as TaskEnqueueOptions, Bt as SendActivityError, C as FederationStartQueueOptions, Ct as CustomCollectionCounter, D as InboxListenerSetters, Dt as InboxListener, E as InboxChallengePolicy, Et as InboxErrorHandler, F as createFederation, Ft as OutboxPermanentFailureHandler, G as RetryPolicy, H as TaskRegistry, Ht as PageItems, I as Message, It as SharedInboxKeyDispatcher, J as respondWithObject, K as createExponentialBackoffPolicy, L as createFederationBuilder, Lt as UnverifiedActivityHandler, M as FederationKvPrefixes, Mt as OutboxErrorHandler, N as FederationOrigin, Nt as OutboxListener, O as MediaUploaderSetters, Ot as MediaUploaderCallback, P as FederationQueueOptions, Pt as OutboxListenerErrorHandler, Q as MessageQueue, R as TaskDefinition, Rt as UnverifiedActivityReason, S as FederationOptions, St as CollectionDispatcher, T as IdempotencyStrategy, Tt as CustomCollectionDispatcher, U as CreateExponentialBackoffPolicyOptions, Ut as buildCollectionSynchronizationHeader, V as TaskHandler, Vt as SenderKeyPair, W as RetryContext, Wt as digest, X as InProcessMessageQueue, Y as respondWithObjectIfAcceptable, Z as InProcessMessageQueueOptions, _ as Federatable, _t as ActorHandleMapper, a as GetSignedKeyOptions, at as CircuitBreakerBeforeSendDecision, b as FederationBuilder, bt as CollectionCounter, c as ParseUriResult, ct as CircuitBreakerKvState, d as SendActivityOptions, dt as CircuitBreakerStateChange, et as MessageQueueEnqueueOptions, f as SendActivityOptionsForCollection, ft as NormalizedCircuitBreakerOptions, g as CustomCollectionCallbackSetters, gt as ActorDispatcher, h as ConstructorWithTypeId, ht as ActorAliasMapper, i as GetActorOptions, it as CircuitBreakerActivityDrop, j as Rfc6570Expression, jt as ObjectDispatcher, k as ObjectCallbackSetters, kt as NodeInfoDispatcher, l as RequestContext, lt as CircuitBreakerOptions, m as CollectionCallbackSetters, mt as parseCircuitBreakerKvState, n as Context, nt as ParallelMessageQueue, o as InboxContext, ot as CircuitBreakerCreateOptions, p as ActorCallbackSetters, pt as normalizeCircuitBreakerOptions, q as RespondWithObjectOptions, r as ForwardActivityOptions, rt as CircuitBreaker, s as OutboxContext, st as CircuitBreakerFailurePolicy, t as ActorKeyPair, tt as MessageQueueListenOptions, u as RouteActivityOptions, ut as CircuitBreakerState, v as Federation, vt as ActorKeyPairsDispatcher, w as IdempotencyKeyCallback, wt as CustomCollectionCursor, x as FederationFetchOptions, xt as CollectionCursor, y as FederationBenchmarkOptions, yt as AuthorizePredicate, z as TaskDefinitionOptions, zt as WebFingerLinksDispatcher } from "../context-B-dsBjZ9.cjs";
2
+ import { $ as MessageQueueDepth, A as OutboxListenerSetters, At as ObjectAuthorizePredicate, B as TaskEnqueueOptions, Bt as SendActivityError, C as FederationStartQueueOptions, Ct as CustomCollectionCounter, D as InboxListenerSetters, Dt as InboxListener, E as InboxChallengePolicy, Et as InboxErrorHandler, F as createFederation, Ft as OutboxPermanentFailureHandler, G as RetryPolicy, H as TaskRegistry, Ht as PageItems, I as Message, It as SharedInboxKeyDispatcher, J as respondWithObject, K as createExponentialBackoffPolicy, L as createFederationBuilder, Lt as UnverifiedActivityHandler, M as FederationKvPrefixes, Mt as OutboxErrorHandler, N as FederationOrigin, Nt as OutboxListener, O as MediaUploaderSetters, Ot as MediaUploaderCallback, P as FederationQueueOptions, Pt as OutboxListenerErrorHandler, Q as MessageQueue, R as TaskDefinition, Rt as UnverifiedActivityReason, S as FederationOptions, St as CollectionDispatcher, T as IdempotencyStrategy, Tt as CustomCollectionDispatcher, U as CreateExponentialBackoffPolicyOptions, Ut as buildCollectionSynchronizationHeader, V as TaskHandler, Vt as SenderKeyPair, W as RetryContext, Wt as digest, X as InProcessMessageQueue, Y as respondWithObjectIfAcceptable, Z as InProcessMessageQueueOptions, _ as Federatable, _t as ActorHandleMapper, a as GetSignedKeyOptions, at as CircuitBreakerBeforeSendDecision, b as FederationBuilder, bt as CollectionCounter, c as ParseUriResult, ct as CircuitBreakerKvState, d as SendActivityOptions, dt as CircuitBreakerStateChange, et as MessageQueueEnqueueOptions, f as SendActivityOptionsForCollection, ft as NormalizedCircuitBreakerOptions, g as CustomCollectionCallbackSetters, gt as ActorDispatcher, h as ConstructorWithTypeId, ht as ActorAliasMapper, i as GetActorOptions, it as CircuitBreakerActivityDrop, j as Rfc6570Expression, jt as ObjectDispatcher, k as ObjectCallbackSetters, kt as NodeInfoDispatcher, l as RequestContext, lt as CircuitBreakerOptions, m as CollectionCallbackSetters, mt as parseCircuitBreakerKvState, n as Context, nt as ParallelMessageQueue, o as InboxContext, ot as CircuitBreakerCreateOptions, p as ActorCallbackSetters, pt as normalizeCircuitBreakerOptions, q as RespondWithObjectOptions, r as ForwardActivityOptions, rt as CircuitBreaker, s as OutboxContext, st as CircuitBreakerFailurePolicy, t as ActorKeyPair, tt as MessageQueueListenOptions, u as RouteActivityOptions, ut as CircuitBreakerState, v as Federation, vt as ActorKeyPairsDispatcher, w as IdempotencyKeyCallback, wt as CustomCollectionCursor, x as FederationFetchOptions, xt as CollectionCursor, y as FederationBenchmarkOptions, yt as AuthorizePredicate, z as TaskDefinitionOptions, zt as WebFingerLinksDispatcher } from "../context-BOnn653X.cjs";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-BhNbN8Ed.cjs";
4
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-D-abvu2C.cjs";
4
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-kUSY5n3f.cjs";
5
5
  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, MediaUploaderCallback, MediaUploaderSetters, 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, TaskDefinition, TaskDefinitionOptions, TaskEnqueueOptions, TaskHandler, TaskRegistry, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as MessageQueueDepth, A as OutboxListenerSetters, At as ObjectAuthorizePredicate, B as TaskEnqueueOptions, Bt as SendActivityError, C as FederationStartQueueOptions, Ct as CustomCollectionCounter, D as InboxListenerSetters, Dt as InboxListener, E as InboxChallengePolicy, Et as InboxErrorHandler, F as createFederation, Ft as OutboxPermanentFailureHandler, G as RetryPolicy, H as TaskRegistry, Ht as PageItems, I as Message, It as SharedInboxKeyDispatcher, J as respondWithObject, K as createExponentialBackoffPolicy, L as createFederationBuilder, Lt as UnverifiedActivityHandler, M as FederationKvPrefixes, Mt as OutboxErrorHandler, N as FederationOrigin, Nt as OutboxListener, O as MediaUploaderSetters, Ot as MediaUploaderCallback, P as FederationQueueOptions, Pt as OutboxListenerErrorHandler, Q as MessageQueue, R as TaskDefinition, Rt as UnverifiedActivityReason, S as FederationOptions, St as CollectionDispatcher, T as IdempotencyStrategy, Tt as CustomCollectionDispatcher, U as CreateExponentialBackoffPolicyOptions, Ut as buildCollectionSynchronizationHeader, V as TaskHandler, Vt as SenderKeyPair, W as RetryContext, Wt as digest, X as InProcessMessageQueue, Y as respondWithObjectIfAcceptable, Z as InProcessMessageQueueOptions, _ as Federatable, _t as ActorHandleMapper, a as GetSignedKeyOptions, at as CircuitBreakerBeforeSendDecision, b as FederationBuilder, bt as CollectionCounter, c as ParseUriResult, ct as CircuitBreakerKvState, d as SendActivityOptions, dt as CircuitBreakerStateChange, et as MessageQueueEnqueueOptions, f as SendActivityOptionsForCollection, ft as NormalizedCircuitBreakerOptions, g as CustomCollectionCallbackSetters, gt as ActorDispatcher, h as ConstructorWithTypeId, ht as ActorAliasMapper, i as GetActorOptions, it as CircuitBreakerActivityDrop, j as Rfc6570Expression, jt as ObjectDispatcher, k as ObjectCallbackSetters, kt as NodeInfoDispatcher, l as RequestContext, lt as CircuitBreakerOptions, m as CollectionCallbackSetters, mt as parseCircuitBreakerKvState, n as Context, nt as ParallelMessageQueue, o as InboxContext, ot as CircuitBreakerCreateOptions, p as ActorCallbackSetters, pt as normalizeCircuitBreakerOptions, q as RespondWithObjectOptions, r as ForwardActivityOptions, rt as CircuitBreaker, s as OutboxContext, st as CircuitBreakerFailurePolicy, t as ActorKeyPair, tt as MessageQueueListenOptions, u as RouteActivityOptions, ut as CircuitBreakerState, v as Federation, vt as ActorKeyPairsDispatcher, w as IdempotencyKeyCallback, wt as CustomCollectionCursor, x as FederationFetchOptions, xt as CollectionCursor, y as FederationBenchmarkOptions, yt as AuthorizePredicate, z as TaskDefinitionOptions, zt as WebFingerLinksDispatcher } from "../context-DrLXudbA.js";
2
+ import { $ as MessageQueueDepth, A as OutboxListenerSetters, At as ObjectAuthorizePredicate, B as TaskEnqueueOptions, Bt as SendActivityError, C as FederationStartQueueOptions, Ct as CustomCollectionCounter, D as InboxListenerSetters, Dt as InboxListener, E as InboxChallengePolicy, Et as InboxErrorHandler, F as createFederation, Ft as OutboxPermanentFailureHandler, G as RetryPolicy, H as TaskRegistry, Ht as PageItems, I as Message, It as SharedInboxKeyDispatcher, J as respondWithObject, K as createExponentialBackoffPolicy, L as createFederationBuilder, Lt as UnverifiedActivityHandler, M as FederationKvPrefixes, Mt as OutboxErrorHandler, N as FederationOrigin, Nt as OutboxListener, O as MediaUploaderSetters, Ot as MediaUploaderCallback, P as FederationQueueOptions, Pt as OutboxListenerErrorHandler, Q as MessageQueue, R as TaskDefinition, Rt as UnverifiedActivityReason, S as FederationOptions, St as CollectionDispatcher, T as IdempotencyStrategy, Tt as CustomCollectionDispatcher, U as CreateExponentialBackoffPolicyOptions, Ut as buildCollectionSynchronizationHeader, V as TaskHandler, Vt as SenderKeyPair, W as RetryContext, Wt as digest, X as InProcessMessageQueue, Y as respondWithObjectIfAcceptable, Z as InProcessMessageQueueOptions, _ as Federatable, _t as ActorHandleMapper, a as GetSignedKeyOptions, at as CircuitBreakerBeforeSendDecision, b as FederationBuilder, bt as CollectionCounter, c as ParseUriResult, ct as CircuitBreakerKvState, d as SendActivityOptions, dt as CircuitBreakerStateChange, et as MessageQueueEnqueueOptions, f as SendActivityOptionsForCollection, ft as NormalizedCircuitBreakerOptions, g as CustomCollectionCallbackSetters, gt as ActorDispatcher, h as ConstructorWithTypeId, ht as ActorAliasMapper, i as GetActorOptions, it as CircuitBreakerActivityDrop, j as Rfc6570Expression, jt as ObjectDispatcher, k as ObjectCallbackSetters, kt as NodeInfoDispatcher, l as RequestContext, lt as CircuitBreakerOptions, m as CollectionCallbackSetters, mt as parseCircuitBreakerKvState, n as Context, nt as ParallelMessageQueue, o as InboxContext, ot as CircuitBreakerCreateOptions, p as ActorCallbackSetters, pt as normalizeCircuitBreakerOptions, q as RespondWithObjectOptions, r as ForwardActivityOptions, rt as CircuitBreaker, s as OutboxContext, st as CircuitBreakerFailurePolicy, t as ActorKeyPair, tt as MessageQueueListenOptions, u as RouteActivityOptions, ut as CircuitBreakerState, v as Federation, vt as ActorKeyPairsDispatcher, w as IdempotencyKeyCallback, wt as CustomCollectionCursor, x as FederationFetchOptions, xt as CollectionCursor, y as FederationBenchmarkOptions, yt as AuthorizePredicate, z as TaskDefinitionOptions, zt as WebFingerLinksDispatcher } from "../context-CmjP-cgJ.js";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-BhNbN8Ed.js";
4
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-D6O8C7eN.js";
4
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-BYuZ0WXt.js";
5
5
  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, MediaUploaderCallback, MediaUploaderSetters, 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, TaskDefinition, TaskDefinitionOptions, TaskEnqueueOptions, TaskHandler, TaskRegistry, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as respondWithObject, c as digest, d as parseCircuitBreakerKvState, f as createFederationBuilder, i as SendActivityError, l as CircuitBreaker, n as handleWebFinger, o as respondWithObjectIfAcceptable, r as createExponentialBackoffPolicy, s as buildCollectionSynchronizationHeader, t as createFederation, u as normalizeCircuitBreakerOptions } from "../middleware-Hgkr-t3e.js";
3
+ import { a as respondWithObject, c as digest, d as parseCircuitBreakerKvState, f as createFederationBuilder, i as SendActivityError, l as CircuitBreaker, n as handleWebFinger, o as respondWithObjectIfAcceptable, r as createExponentialBackoffPolicy, s as buildCollectionSynchronizationHeader, t as createFederation, u as normalizeCircuitBreakerOptions } from "../middleware-Bcx74jmq.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";
@@ -10,10 +10,10 @@ import { t as assertNotEquals } from "../assert_not_equals-BN7yDMWe.mjs";
10
10
  import "../std__assert-CxFT0MNt.mjs";
11
11
  import { t as assertRejects } from "../assert_rejects-wFbSPn1O.mjs";
12
12
  import { t as assert } from "../assert-CebeUf0C.mjs";
13
- import { l as verifyRequest } from "../http-DpXPu64P.mjs";
13
+ import { l as verifyRequest } from "../http-DlSUSFxF.mjs";
14
14
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
15
- import { t as doesActorOwnKey } from "../owner-Bq-aDUI1.mjs";
16
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-DxAijVhs.mjs";
15
+ import { t as doesActorOwnKey } from "../owner-CDshspna.mjs";
16
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-BrW0OtvG.mjs";
17
17
  import { Activity, Application, Endpoints, Group, Person, Service } from "@fedify/vocab";
18
18
  import { createTestMeterProvider, createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
19
19
  import { FetchError } from "@fedify/vocab-runtime";
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as MemoryKvStore } from "../../kv-DCHkaJ9-.mjs";
5
5
  import { a as numberSchema, i as makeSchema, n as baseOptions, o as stringSchema, t as MockQueue } from "../../testing-BX0Nicyq.mjs";
6
- import { o as createFederation } from "../../middleware-DRGoAGNP.mjs";
6
+ import { o as createFederation } from "../../middleware-C8wXU20O.mjs";
7
7
  import { n as ParallelMessageQueue } from "../../mq-Dm1Wmtm-.mjs";
8
8
  import { configure, reset } from "@logtape/logtape";
9
9
  import { delay } from "es-toolkit";
@@ -3,8 +3,8 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as MemoryKvStore } from "../../kv-DCHkaJ9-.mjs";
5
5
  import { a as numberSchema, i as makeSchema, n as baseOptions, o as stringSchema, t as MockQueue } from "../../testing-BX0Nicyq.mjs";
6
- import { o as createFederation } from "../../middleware-DRGoAGNP.mjs";
7
- import { r as createFederationBuilder } from "../../builder-8WyrrBSI.mjs";
6
+ import { o as createFederation } from "../../middleware-C8wXU20O.mjs";
7
+ import { r as createFederationBuilder } from "../../builder-7ZvZ5ilC.mjs";
8
8
  import { t as TaskCodec } from "../../codec-peqOdBaE.mjs";
9
9
  import { t as InProcessMessageQueue } from "../../mq-Dm1Wmtm-.mjs";
10
10
  import { W3CTraceContextPropagator } from "@opentelemetry/core";
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertFalse } from "../assert_false-3pLLLsO4.mjs";
5
5
  import "../std__assert-CxFT0MNt.mjs";
6
6
  import { t as assert } from "../assert-CebeUf0C.mjs";
7
- import { t as hasMalformedKnownTemporalLiteral } from "../temporal-BB26MWBu.mjs";
7
+ import { t as hasMalformedKnownTemporalLiteral } from "../temporal-5ClDg1Qq.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 MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
6
6
  import { t as assertEquals } from "../assert_equals-CBlRfA-_.mjs";
7
7
  import { t as assertNotEquals } from "../assert_not_equals-BN7yDMWe.mjs";
8
8
  import "../std__assert-CxFT0MNt.mjs";
9
- import { o as createFederation, s as handleWebFinger } from "../middleware-DRGoAGNP.mjs";
9
+ import { o as createFederation, s as handleWebFinger } from "../middleware-C8wXU20O.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
  const { URLPattern } = require("urlpattern-polyfill");
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-Dmm3t92W.cjs");
3
3
  const require_transformers = require("./transformers-BalCrSsr.cjs");
4
- const require_http = require("./http-DcSh3Nkc.cjs");
5
- const require_proof = require("./proof-Y3u5gsyU.cjs");
4
+ const require_http = require("./http-MQyitOvl.cjs");
5
+ const require_proof = require("./proof-CwrJYody.cjs");
6
6
  const require_types = require("./types-RXm5YxpC.cjs");
7
- const require_kv_cache = require("./kv-cache-BJ67yD69.cjs");
7
+ const require_kv_cache = require("./kv-cache-AN6qSmg2.cjs");
8
8
  let _logtape_logtape = require("@logtape/logtape");
9
9
  let _fedify_uri_template = require("@fedify/uri-template");
10
10
  let _fedify_vocab = require("@fedify/vocab");
@@ -725,10 +725,11 @@ function createFederationBuilder() {
725
725
  //#endregion
726
726
  //#region src/federation/circuit-breaker.ts
727
727
  const Temporal$9 = require_http.Temporal;
728
- const LEGACY_SWEEP_MARKER = ["__fedify_meta", "circuit_breaker_state_ttl_sweep_v1"];
728
+ const LEGACY_SWEEP_MARKER = ["__fedify_meta", "circuit_breaker_state_ttl_sweep_v2"];
729
729
  const LEGACY_SWEEP_DELETING_MARKER = { __fedifyDeletingCircuitBreakerLegacyState: true };
730
730
  const CIRCUIT_BREAKER_STATE_VERSION = 1;
731
731
  const LEGACY_SWEEP_LOCK_TTL = Temporal$9.Duration.from({ minutes: 5 });
732
+ const LEGACY_SWEEP_RENEW_INTERVAL = Temporal$9.Duration.from({ minutes: 1 });
732
733
  const LEGACY_SWEEP_RETRY_WINDOW = Temporal$9.Duration.from({ hours: 168 });
733
734
  const LEGACY_SWEEP_WAIT_INTERVAL = 10;
734
735
  const LEGACY_SWEEP_CAS_ATTEMPTS = 3;
@@ -943,12 +944,20 @@ var CircuitBreaker = class {
943
944
  }
944
945
  async #sweepLegacyStatesImpl() {
945
946
  const markerKey = this.#legacySweepMarkerKey();
946
- const marker = await this.#acquireLegacySweep(markerKey);
947
- if (marker === "done") return;
947
+ const acquired = await this.#acquireLegacySweep(markerKey);
948
+ if (acquired === "done") return;
949
+ let marker = acquired;
950
+ let leaseRenewedAt = this.#now();
948
951
  try {
949
952
  for await (const { key, value } of this.#kv.list(this.#prefix)) {
950
953
  if (key.length !== this.#prefix.length + 1) continue;
951
954
  await this.#migrateLegacyState(key, value);
955
+ if (Temporal$9.Instant.compare(this.#now(), leaseRenewedAt.add(LEGACY_SWEEP_RENEW_INTERVAL)) >= 0) {
956
+ const renewed = await this.#renewLegacySweep(markerKey, marker);
957
+ if (renewed == null) return;
958
+ marker = renewed;
959
+ leaseRenewedAt = this.#now();
960
+ }
952
961
  }
953
962
  } catch (error) {
954
963
  await this.#deleteIfUnchanged(markerKey, marker);
@@ -957,6 +966,14 @@ var CircuitBreaker = class {
957
966
  const finishedMarker = this.#finishLegacySweepMarker(marker);
958
967
  if (await this.#kv.cas(markerKey, marker, finishedMarker)) this.#rememberLegacySweepMarker(finishedMarker);
959
968
  }
969
+ async #renewLegacySweep(markerKey, marker) {
970
+ const renewed = {
971
+ state: "sweeping",
972
+ started: this.#now().toString(),
973
+ retryUntil: getLegacySweepRetryUntil(marker) ?? this.#now().add(LEGACY_SWEEP_RETRY_WINDOW).toString()
974
+ };
975
+ if (await this.#kv.cas(markerKey, marker, renewed, { ttl: LEGACY_SWEEP_LOCK_TTL })) return renewed;
976
+ }
960
977
  #finishLegacySweepMarker(marker) {
961
978
  const retryUntil = getLegacySweepRetryUntil(marker);
962
979
  if (retryUntil != null && Temporal$9.Instant.compare(this.#now(), Temporal$9.Instant.from(retryUntil)) < 0) return {
@@ -966,7 +983,10 @@ var CircuitBreaker = class {
966
983
  return { state: "final" };
967
984
  }
968
985
  async #migrateLegacyState(key, value) {
969
- if (isCurrentCircuitBreakerState(value)) return;
986
+ if (isCurrentCircuitBreakerState(value)) {
987
+ await this.#kv.cas(key, value, value, this.#setOptions());
988
+ return;
989
+ }
970
990
  const state = parseCircuitBreakerKvState(value);
971
991
  if (state != null) {
972
992
  await this.#kv.cas(key, value, markCircuitBreakerState(state), this.#setOptions());
@@ -1103,7 +1123,7 @@ function normalizeCircuitBreakerOptions(options) {
1103
1123
  } else {
1104
1124
  failure = options.failure;
1105
1125
  pruneFailures = (timestamps) => timestamps.slice(-100);
1106
- stateTtl = configuredStateTtl;
1126
+ stateTtl = configuredStateTtl ?? recoveryDelay.add(heldActivityTtl);
1107
1127
  }
1108
1128
  return {
1109
1129
  failure,
@@ -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.4.0-dev.1848+1443269f";
13
+ var version = "2.4.0-dev.1873+f79eae3d";
14
14
  //#endregion
15
15
  //#region src/sig/accept.ts
16
16
  /**
@@ -1258,7 +1258,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
1258
1258
  }
1259
1259
  }
1260
1260
  let key = null;
1261
- if (object instanceof cls) key = object;
1261
+ if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object;
1262
1262
  else if (isActor(object)) {
1263
1263
  const keys = cls === CryptographicKey ? object.getPublicKeys({
1264
1264
  documentLoader,
@@ -2266,10 +2266,12 @@ async function verifyRequestRfc9421(request, span, metricsContext, { documentLoa
2266
2266
  * @param request The original request.
2267
2267
  * @param location The redirect location.
2268
2268
  * @param body The request body as ArrayBuffer or null.
2269
+ * @param validateRedirect The function to validate the redirect URL.
2269
2270
  * @returns A new Request object for the redirect.
2270
2271
  */
2271
- function createRedirectRequest(request, location, body) {
2272
+ async function createRedirectRequest(request, location, body, validateRedirect) {
2272
2273
  const url = new URL(location, request.url);
2274
+ await validateRedirect?.(url.href);
2273
2275
  return new Request(url, {
2274
2276
  method: request.method,
2275
2277
  headers: request.headers,
@@ -2367,7 +2369,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2367
2369
  let response = await fetchDoubleKnockRequest(request, signedRequest, signal);
2368
2370
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
2369
2371
  if (redirected >= maximumRedirection) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
2370
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
2372
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
2371
2373
  if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
2372
2374
  return doubleKnockInternal(redirectRequest, identity, {
2373
2375
  ...options,
@@ -2415,7 +2417,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2415
2417
  redirect: "manual",
2416
2418
  signal
2417
2419
  });
2418
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
2420
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect), identity, {
2419
2421
  ...options,
2420
2422
  body
2421
2423
  });
@@ -2442,7 +2444,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
2442
2444
  response = await fetchDoubleKnockRequest(request, signedRequest, signal);
2443
2445
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
2444
2446
  if (redirected >= maximumRedirection) throw new FetchError(request.url, `Too many redirections (${redirected + 1})`);
2445
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
2447
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
2446
2448
  if (visited.has(redirectRequest.url)) throw new FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
2447
2449
  return doubleKnockInternal(redirectRequest, identity, {
2448
2450
  ...options,
@@ -1,10 +1,10 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CNYW2Ig8.mjs";
5
- import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-Pf5DoomU.mjs";
4
+ import { n as version, t as name } from "./deno-CxSfl_a4.mjs";
5
+ import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-DpjCXFvC.mjs";
6
6
  import { i as validateAcceptSignature, n as fulfillAcceptSignature, r as parseAcceptSignature } from "./accept-CPVqki78.mjs";
7
- import { o as validateCryptoKey, r as fetchKeyDetailed } from "./key-hmby7gn5.mjs";
7
+ import { o as validateCryptoKey, r as fetchKeyDetailed } from "./key-6O7-nI4D.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,
@@ -9,7 +9,7 @@ let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conve
9
9
  let byte_encodings_base64 = require("byte-encodings/base64");
10
10
  //#region deno.json
11
11
  var name = "@fedify/fedify";
12
- var version = "2.4.0-dev.1848+1443269f";
12
+ var version = "2.4.0-dev.1873+f79eae3d";
13
13
  //#endregion
14
14
  //#region ../../node_modules/.pnpm/temporal-polyfill@1.0.1/node_modules/temporal-polyfill/chunks/root.js
15
15
  const NativeTemporal = globalThis.Temporal;
@@ -4821,7 +4821,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
4821
4821
  }
4822
4822
  }
4823
4823
  let key = null;
4824
- if (object instanceof cls) key = object;
4824
+ if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object;
4825
4825
  else if ((0, _fedify_vocab.isActor)(object)) {
4826
4826
  const keys = cls === _fedify_vocab.CryptographicKey ? object.getPublicKeys({
4827
4827
  documentLoader,
@@ -5830,10 +5830,12 @@ async function verifyRequestRfc9421(request, span, metricsContext, { documentLoa
5830
5830
  * @param request The original request.
5831
5831
  * @param location The redirect location.
5832
5832
  * @param body The request body as ArrayBuffer or null.
5833
+ * @param validateRedirect The function to validate the redirect URL.
5833
5834
  * @returns A new Request object for the redirect.
5834
5835
  */
5835
- function createRedirectRequest(request, location, body) {
5836
+ async function createRedirectRequest(request, location, body, validateRedirect) {
5836
5837
  const url = new URL(location, request.url);
5838
+ await validateRedirect?.(url.href);
5837
5839
  return new Request(url, {
5838
5840
  method: request.method,
5839
5841
  headers: request.headers,
@@ -5931,7 +5933,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
5931
5933
  let response = await fetchDoubleKnockRequest(request, signedRequest, signal);
5932
5934
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
5933
5935
  if (redirected >= maximumRedirection) throw new _fedify_vocab_runtime.FetchError(request.url, `Too many redirections (${redirected + 1})`);
5934
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
5936
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
5935
5937
  if (visited.has(redirectRequest.url)) throw new _fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
5936
5938
  return doubleKnockInternal(redirectRequest, identity, {
5937
5939
  ...options,
@@ -5979,7 +5981,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
5979
5981
  redirect: "manual",
5980
5982
  signal
5981
5983
  });
5982
- if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(createRedirectRequest(request, response.headers.get("Location"), body), identity, {
5984
+ if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) return doubleKnock(await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect), identity, {
5983
5985
  ...options,
5984
5986
  body
5985
5987
  });
@@ -6006,7 +6008,7 @@ async function doubleKnockInternal(request, identity, options, redirected = 0, v
6006
6008
  response = await fetchDoubleKnockRequest(request, signedRequest, signal);
6007
6009
  if (response.status >= 300 && response.status < 400 && response.headers.has("Location")) {
6008
6010
  if (redirected >= maximumRedirection) throw new _fedify_vocab_runtime.FetchError(request.url, `Too many redirections (${redirected + 1})`);
6009
- const redirectRequest = createRedirectRequest(request, response.headers.get("Location"), body);
6011
+ const redirectRequest = await createRedirectRequest(request, response.headers.get("Location"), body, options.validateRedirect);
6010
6012
  if (visited.has(redirectRequest.url)) throw new _fedify_vocab_runtime.FetchError(request.url, `Redirect loop detected: ${redirectRequest.url}`);
6011
6013
  return doubleKnockInternal(redirectRequest, identity, {
6012
6014
  ...options,
@@ -1,8 +1,8 @@
1
1
  import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CNYW2Ig8.mjs";
5
- import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-Pf5DoomU.mjs";
4
+ import { n as version, t as name } from "./deno-CxSfl_a4.mjs";
5
+ import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-DpjCXFvC.mjs";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { CryptographicKey, Multikey, Object as Object$1, isActor } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -304,7 +304,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
304
304
  }
305
305
  }
306
306
  let key = null;
307
- if (object instanceof cls) key = object;
307
+ if (object instanceof cls && (object.id == null || object.id.href === keyId)) key = object;
308
308
  else if (isActor(object)) {
309
309
  const keys = cls === CryptographicKey ? object.getPublicKeys({
310
310
  documentLoader,
@@ -1,5 +1,5 @@
1
1
  const { URLPattern } = require("urlpattern-polyfill");
2
- const require_http = require("./http-DcSh3Nkc.cjs");
2
+ const require_http = require("./http-MQyitOvl.cjs");
3
3
  let _logtape_logtape = require("@logtape/logtape");
4
4
  let es_toolkit = require("es-toolkit");
5
5
  let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
@@ -23,6 +23,17 @@ const logger$1 = (0, _logtape_logtape.getLogger)([
23
23
  function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, maxRedirection, userAgent, specDeterminer, tracerProvider } = {}) {
24
24
  require_http.validateCryptoKey(identity.privateKey);
25
25
  async function load(url, options) {
26
+ await validateUrl(url);
27
+ return (0, _fedify_vocab_runtime.getRemoteDocument)(url, await require_http.doubleKnock((0, _fedify_vocab_runtime.createActivityPubRequest)(url, { userAgent }), identity, {
28
+ maxRedirection,
29
+ specDeterminer,
30
+ log: (0, es_toolkit.curry)(_fedify_vocab_runtime.logRequest)(logger$1),
31
+ tracerProvider,
32
+ signal: options?.signal,
33
+ validateRedirect: validateUrl
34
+ }), load);
35
+ }
36
+ async function validateUrl(url) {
26
37
  if (!allowPrivateAddress) try {
27
38
  await (0, _fedify_vocab_runtime.validatePublicUrl)(url);
28
39
  } catch (error) {
@@ -32,13 +43,6 @@ function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, maxRedi
32
43
  });
33
44
  throw error;
34
45
  }
35
- return (0, _fedify_vocab_runtime.getRemoteDocument)(url, await require_http.doubleKnock((0, _fedify_vocab_runtime.createActivityPubRequest)(url, { userAgent }), identity, {
36
- maxRedirection,
37
- specDeterminer,
38
- log: (0, es_toolkit.curry)(_fedify_vocab_runtime.logRequest)(logger$1),
39
- tracerProvider,
40
- signal: options?.signal
41
- }), load);
42
46
  }
43
47
  return load;
44
48
  }
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { C as recordDocumentCache, d as validateCryptoKey, t as doubleKnock } from "./http-CqXnYPxh.js";
3
+ import { C as recordDocumentCache, d as validateCryptoKey, t as doubleKnock } from "./http-BQxL1lOO.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 "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { p as recordDocumentCache } from "./metrics-Pf5DoomU.mjs";
4
+ import { p as recordDocumentCache } from "./metrics-DpjCXFvC.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,9 +1,9 @@
1
1
  import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CNYW2Ig8.mjs";
5
- import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-Pf5DoomU.mjs";
6
- import { n as fetchKey, o as validateCryptoKey } from "./key-hmby7gn5.mjs";
4
+ import { n as version, t as name } from "./deno-CxSfl_a4.mjs";
5
+ import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-DpjCXFvC.mjs";
6
+ import { n as fetchKey, o as validateCryptoKey } from "./key-6O7-nI4D.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 "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CNYW2Ig8.mjs";
4
+ import { n as version, t as name } from "./deno-CxSfl_a4.mjs";
5
5
  import { metrics } from "@opentelemetry/api";
6
6
  import { FetchError } from "@fedify/vocab-runtime";
7
7
  //#region src/federation/metrics.ts
@@ -2,10 +2,10 @@ import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  import { t as __exportAll } from "./rolldown-runtime-BC-Eo5Mj.js";
4
4
  import { r as getDefaultActivityTransformers } from "./transformers-DAtXl_Kc.js";
5
- import { A as formatAcceptSignature, D as recordOutboxEnqueue, E as recordOutboxActivity, F as version, O as recordWebFingerHandle, P as name, S as recordCollectionTotalItems, T as recordInboxActivity, a as verifyRequestDetailed, b as recordCollectionPageItems, d as validateCryptoKey, f as getDurationMs, g as isAbortError, h as instrumentDocumentLoader, i as verifyRequest, k as registerQueueDepthGauge, m as getRemoteHost, n as parseRfc9421SignatureInput, o as exportJwk, p as getFederationMetrics, t as doubleKnock, u as importJwk, v as recordCircuitBreakerStateChange, w as recordFanoutRecipients, x as recordCollectionRequest, y as recordCollectionDispatchDuration } from "./http-CqXnYPxh.js";
6
- import { S as verifyCompactJsonLd, T as wrapContextLoaderForJsonLd, _ as hasSignature, b as isInvalidUrlTypeError, c as doesActorOwnKey, d as assertSafeJsonLd, g as getNormalizationContextLoader, h as detachSignature, i as verifyObject, l as getKeyOwner, n as hasProofLike, p as compactJsonLd, r as signObject, s as normalizeOutgoingActivityJsonLd, u as InvalidContextReferenceError, v as hasSignatureLike, x as signJsonLd, y as isClearlyMalformedContextReference } from "./proof-CKKqEWUg.js";
5
+ import { A as formatAcceptSignature, D as recordOutboxEnqueue, E as recordOutboxActivity, F as version, O as recordWebFingerHandle, P as name, S as recordCollectionTotalItems, T as recordInboxActivity, a as verifyRequestDetailed, b as recordCollectionPageItems, d as validateCryptoKey, f as getDurationMs, g as isAbortError, h as instrumentDocumentLoader, i as verifyRequest, k as registerQueueDepthGauge, m as getRemoteHost, n as parseRfc9421SignatureInput, o as exportJwk, p as getFederationMetrics, t as doubleKnock, u as importJwk, v as recordCircuitBreakerStateChange, w as recordFanoutRecipients, x as recordCollectionRequest, y as recordCollectionDispatchDuration } from "./http-BQxL1lOO.js";
6
+ import { S as verifyCompactJsonLd, T as wrapContextLoaderForJsonLd, _ as hasSignature, b as isInvalidUrlTypeError, c as doesActorOwnKey, d as assertSafeJsonLd, g as getNormalizationContextLoader, h as detachSignature, i as verifyObject, l as getKeyOwner, n as hasProofLike, p as compactJsonLd, r as signObject, s as normalizeOutgoingActivityJsonLd, u as InvalidContextReferenceError, v as hasSignatureLike, x as signJsonLd, y as isClearlyMalformedContextReference } from "./proof-D7aD6Hut.js";
7
7
  import { n as getNodeInfo, t as nodeInfoToJson } from "./types-Dtyf8lVj.js";
8
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-AbW4Zb7B.js";
8
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-BaLaRgP0.js";
9
9
  import { getLogger, withContext } from "@logtape/logtape";
10
10
  import { Router, RouterError, assertPath } from "@fedify/uri-template";
11
11
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, Tombstone, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
@@ -724,10 +724,11 @@ function createFederationBuilder() {
724
724
  }
725
725
  //#endregion
726
726
  //#region src/federation/circuit-breaker.ts
727
- const LEGACY_SWEEP_MARKER = ["__fedify_meta", "circuit_breaker_state_ttl_sweep_v1"];
727
+ const LEGACY_SWEEP_MARKER = ["__fedify_meta", "circuit_breaker_state_ttl_sweep_v2"];
728
728
  const LEGACY_SWEEP_DELETING_MARKER = { __fedifyDeletingCircuitBreakerLegacyState: true };
729
729
  const CIRCUIT_BREAKER_STATE_VERSION = 1;
730
730
  const LEGACY_SWEEP_LOCK_TTL = Temporal.Duration.from({ minutes: 5 });
731
+ const LEGACY_SWEEP_RENEW_INTERVAL = Temporal.Duration.from({ minutes: 1 });
731
732
  const LEGACY_SWEEP_RETRY_WINDOW = Temporal.Duration.from({ hours: 168 });
732
733
  const LEGACY_SWEEP_WAIT_INTERVAL = 10;
733
734
  const LEGACY_SWEEP_CAS_ATTEMPTS = 3;
@@ -942,12 +943,20 @@ var CircuitBreaker = class {
942
943
  }
943
944
  async #sweepLegacyStatesImpl() {
944
945
  const markerKey = this.#legacySweepMarkerKey();
945
- const marker = await this.#acquireLegacySweep(markerKey);
946
- if (marker === "done") return;
946
+ const acquired = await this.#acquireLegacySweep(markerKey);
947
+ if (acquired === "done") return;
948
+ let marker = acquired;
949
+ let leaseRenewedAt = this.#now();
947
950
  try {
948
951
  for await (const { key, value } of this.#kv.list(this.#prefix)) {
949
952
  if (key.length !== this.#prefix.length + 1) continue;
950
953
  await this.#migrateLegacyState(key, value);
954
+ if (Temporal.Instant.compare(this.#now(), leaseRenewedAt.add(LEGACY_SWEEP_RENEW_INTERVAL)) >= 0) {
955
+ const renewed = await this.#renewLegacySweep(markerKey, marker);
956
+ if (renewed == null) return;
957
+ marker = renewed;
958
+ leaseRenewedAt = this.#now();
959
+ }
951
960
  }
952
961
  } catch (error) {
953
962
  await this.#deleteIfUnchanged(markerKey, marker);
@@ -956,6 +965,14 @@ var CircuitBreaker = class {
956
965
  const finishedMarker = this.#finishLegacySweepMarker(marker);
957
966
  if (await this.#kv.cas(markerKey, marker, finishedMarker)) this.#rememberLegacySweepMarker(finishedMarker);
958
967
  }
968
+ async #renewLegacySweep(markerKey, marker) {
969
+ const renewed = {
970
+ state: "sweeping",
971
+ started: this.#now().toString(),
972
+ retryUntil: getLegacySweepRetryUntil(marker) ?? this.#now().add(LEGACY_SWEEP_RETRY_WINDOW).toString()
973
+ };
974
+ if (await this.#kv.cas(markerKey, marker, renewed, { ttl: LEGACY_SWEEP_LOCK_TTL })) return renewed;
975
+ }
959
976
  #finishLegacySweepMarker(marker) {
960
977
  const retryUntil = getLegacySweepRetryUntil(marker);
961
978
  if (retryUntil != null && Temporal.Instant.compare(this.#now(), Temporal.Instant.from(retryUntil)) < 0) return {
@@ -965,7 +982,10 @@ var CircuitBreaker = class {
965
982
  return { state: "final" };
966
983
  }
967
984
  async #migrateLegacyState(key, value) {
968
- if (isCurrentCircuitBreakerState(value)) return;
985
+ if (isCurrentCircuitBreakerState(value)) {
986
+ await this.#kv.cas(key, value, value, this.#setOptions());
987
+ return;
988
+ }
969
989
  const state = parseCircuitBreakerKvState(value);
970
990
  if (state != null) {
971
991
  await this.#kv.cas(key, value, markCircuitBreakerState(state), this.#setOptions());
@@ -1102,7 +1122,7 @@ function normalizeCircuitBreakerOptions(options) {
1102
1122
  } else {
1103
1123
  failure = options.failure;
1104
1124
  pruneFailures = (timestamps) => timestamps.slice(-100);
1105
- stateTtl = configuredStateTtl;
1125
+ stateTtl = configuredStateTtl ?? recoveryDelay.add(heldActivityTtl);
1106
1126
  }
1107
1127
  return {
1108
1128
  failure,